From 042ee75d1bc956979376deecb099265a9dc7717b Mon Sep 17 00:00:00 2001 From: Sam Knutson Date: Wed, 23 Oct 2024 09:07:37 -0400 Subject: [PATCH 0001/1000] docs: fix spelling of "set up" (#58362) Fix spelling of the word "set up" in docs. "Setup" (one word) is a noun whereas "set up" (two words) is a verb. Fixes #58361 PR Close #58362 --- adev/README.md | 2 +- .../best-practices/runtime-performance/zone-pollution.md | 2 +- adev/src/content/guide/templates/two-way-binding.md | 2 +- adev/src/content/introduction/installation.md | 2 +- adev/src/content/reference/errors/NG0403.md | 2 +- adev/src/content/tools/cli/end-to-end.md | 2 +- .../tutorials/learn-angular/steps/12-enable-routing/README.md | 4 ++-- .../content/tutorials/learn-angular/steps/15-forms/README.md | 2 +- .../learn-angular/steps/16-form-control-values/README.md | 2 +- .../tutorials/learn-angular/steps/17-reactive-forms/README.md | 2 +- devtools/docs/release.md | 2 +- packages/misc/angular-in-memory-web-api/README.md | 4 ++-- 12 files changed, 14 insertions(+), 14 deletions(-) diff --git a/adev/README.md b/adev/README.md index 08ab121e9fee..6335c24805c3 100644 --- a/adev/README.md +++ b/adev/README.md @@ -6,7 +6,7 @@ The content is written primarily in Markdown format located in `src/content`. Fo ## Local Development -For local development, [yarn](https://yarnpkg.com/) is the preferred package manager. You can setup a local environment with the following commands +For local development, [yarn](https://yarnpkg.com/) is the preferred package manager. You can set up a local environment with the following commands : ```bash diff --git a/adev/src/content/best-practices/runtime-performance/zone-pollution.md b/adev/src/content/best-practices/runtime-performance/zone-pollution.md index 8c0adf32a844..bf8ceb13d32e 100644 --- a/adev/src/content/best-practices/runtime-performance/zone-pollution.md +++ b/adev/src/content/best-practices/runtime-performance/zone-pollution.md @@ -35,7 +35,7 @@ class AppComponent implements OnInit { The preceding snippet instructs Angular to call `setInterval` outside the Angular Zone and skip running change detection after `pollForUpdates` runs. -Third-party libraries commonly trigger unnecessary change detection cycles when their APIs are invoked within the Angular zone. This phenomenon particularly affects libraries that setup event listeners or initiate other tasks (such as timers, XHR requests, etc.). Avoid these extra cycles by calling library APIs outside the Angular zone: +Third-party libraries commonly trigger unnecessary change detection cycles when their APIs are invoked within the Angular zone. This phenomenon particularly affects libraries that set up event listeners or initiate other tasks (such as timers, XHR requests, etc.). Avoid these extra cycles by calling library APIs outside the Angular zone: import { Component, NgZone, OnInit } from '@angular/core'; diff --git a/adev/src/content/guide/templates/two-way-binding.md b/adev/src/content/guide/templates/two-way-binding.md index 610b0911755e..c3380685614e 100644 --- a/adev/src/content/guide/templates/two-way-binding.md +++ b/adev/src/content/guide/templates/two-way-binding.md @@ -36,7 +36,7 @@ To use two-way binding with native form controls, you need to: 1. Use the `ngModel` directive with the two-way binding syntax (e.g., `[(ngModel)]`) 1. Assign it the state that you want it to update (e.g., `firstName`) -Once that is setup, Angular will ensure that any updates in the text input will reflect correctly inside of the component state! +Once that is set up, Angular will ensure that any updates in the text input will reflect correctly inside of the component state! Learn more about [`NgModel`](guide/directives#displaying-and-updating-properties-with-ngmodel) in the official docs. diff --git a/adev/src/content/introduction/installation.md b/adev/src/content/introduction/installation.md index a785c7409f93..fa41e5866f9e 100644 --- a/adev/src/content/introduction/installation.md +++ b/adev/src/content/introduction/installation.md @@ -13,7 +13,7 @@ If you just want to play around with Angular in your browser without setting up -## Setup a new project locally +## Set up a new project locally If you're starting a new project, you'll most likely want to create a local project so that you can use tooling such as Git. diff --git a/adev/src/content/reference/errors/NG0403.md b/adev/src/content/reference/errors/NG0403.md index fd54ce65b4c6..a78c1d99ceae 100644 --- a/adev/src/content/reference/errors/NG0403.md +++ b/adev/src/content/reference/errors/NG0403.md @@ -35,7 +35,7 @@ platformBrowser().bootstrapModule(AppModule); ## Debugging the error -Please make sure that the NgModule that is used for bootstrapping is setup correctly: +Please make sure that the NgModule that is used for bootstrapping is set up correctly: - either the `bootstrap` property exists (and contains a non-empty array) in the `@NgModule` annotation - or the `ngDoBootstrap` method exists on the NgModule class diff --git a/adev/src/content/tools/cli/end-to-end.md b/adev/src/content/tools/cli/end-to-end.md index 00d2350885fa..b5a7f84caa71 100644 --- a/adev/src/content/tools/cli/end-to-end.md +++ b/adev/src/content/tools/cli/end-to-end.md @@ -2,7 +2,7 @@ End-to-end or (E2E) testing is a form of testing used to assert your entire application works as expected from start to finish or _"end-to-end"_. E2E testing differs from unit testing in that it is completely decoupled from the underlying implementation details of your code. It is typically used to validate an application in a way that mimics the way a user would interact with it. This page serves as a guide to getting started with end-to-end testing in Angular using the Angular CLI. -## Setup E2E Testing +## Set Up E2E Testing The Angular CLI downloads and installs everything you need to run end-to-end tests for your Angular application. diff --git a/adev/src/content/tutorials/learn-angular/steps/12-enable-routing/README.md b/adev/src/content/tutorials/learn-angular/steps/12-enable-routing/README.md index 927bb72dad0d..4464975e2a15 100644 --- a/adev/src/content/tutorials/learn-angular/steps/12-enable-routing/README.md +++ b/adev/src/content/tutorials/learn-angular/steps/12-enable-routing/README.md @@ -2,7 +2,7 @@ For most apps, there comes a point where the app requires more than a single page. When that time inevitably comes, routing becomes a big part of the performance story for users. -In this activity, you'll learn how to setup and configure your app to use Angular Router. +In this activity, you'll learn how to set up and configure your app to use Angular Router.
@@ -71,6 +71,6 @@ export class AppComponent {} -Your app is now setup to use Angular Router. Nice work! 🙌 +Your app is now set up to use Angular Router. Nice work! 🙌 Keep the momentum going to learn the next step of defining the routes for our app. diff --git a/adev/src/content/tutorials/learn-angular/steps/15-forms/README.md b/adev/src/content/tutorials/learn-angular/steps/15-forms/README.md index 08dbb5bc9614..47483325a5be 100644 --- a/adev/src/content/tutorials/learn-angular/steps/15-forms/README.md +++ b/adev/src/content/tutorials/learn-angular/steps/15-forms/README.md @@ -4,7 +4,7 @@ Forms are a big part of many apps because they enable your app to accept user in In Angular, there are two types of forms: template-driven and reactive. You'll learn about both over the next few activities. -In this activity, you'll learn how to setup a form using a template-driven approach. +In this activity, you'll learn how to set up a form using a template-driven approach.
diff --git a/adev/src/content/tutorials/learn-angular/steps/16-form-control-values/README.md b/adev/src/content/tutorials/learn-angular/steps/16-form-control-values/README.md index 1e6a8f8671ef..f1e673d37576 100644 --- a/adev/src/content/tutorials/learn-angular/steps/16-form-control-values/README.md +++ b/adev/src/content/tutorials/learn-angular/steps/16-form-control-values/README.md @@ -1,6 +1,6 @@ # Getting form control value -Now that your forms are setup with Angular, the next step is to access the values from the form controls. +Now that your forms are set up with Angular, the next step is to access the values from the form controls. In this activity, you'll learn how to get the value from your form input. diff --git a/adev/src/content/tutorials/learn-angular/steps/17-reactive-forms/README.md b/adev/src/content/tutorials/learn-angular/steps/17-reactive-forms/README.md index c257767e06e5..bfc4b213c6e6 100644 --- a/adev/src/content/tutorials/learn-angular/steps/17-reactive-forms/README.md +++ b/adev/src/content/tutorials/learn-angular/steps/17-reactive-forms/README.md @@ -2,7 +2,7 @@ When you want to manage your forms programmatically instead of relying purely on the template, reactive forms are the answer. -In this activity, you'll learn how to setup reactive forms. +In this activity, you'll learn how to set up reactive forms.
diff --git a/devtools/docs/release.md b/devtools/docs/release.md index 33dd8548c5f2..14d41346ac2a 100644 --- a/devtools/docs/release.md +++ b/devtools/docs/release.md @@ -65,7 +65,7 @@ Then upload it: 1. Go to the Firefox Addons [page](https://addons.mozilla.org/developers/addons) 1. Find the email and password [on Valentine](http://valentine/#/show/1651707871496288) -1. Setup Google Authenticator with the 2FA QR code. +1. Set up Google Authenticator with the 2FA QR code. * You can find the QR code [on Valentine as well](http://valentine/#/show/1651792043556329) The Firefox publishing process is slightly more involved than Chrome. In particular, they diff --git a/packages/misc/angular-in-memory-web-api/README.md b/packages/misc/angular-in-memory-web-api/README.md index edfe65358595..67b22614514f 100644 --- a/packages/misc/angular-in-memory-web-api/README.md +++ b/packages/misc/angular-in-memory-web-api/README.md @@ -140,7 +140,7 @@ export class AppModule { ... } * Always import the `HttpClientInMemoryWebApiModule` _after_ the `HttpClientModule` to ensure that the in-memory backend provider supersedes the Angular version. -* You can setup the in-memory web api within a lazy loaded feature module by calling the `.forFeature` method as you would `.forRoot`. +* You can set up the in-memory web api within a lazy loaded feature module by calling the `.forFeature` method as you would `.forRoot`. * In production, you want HTTP requests to go to the real server and probably have no need for the _in-memory_ provider. CLI-based apps can exclude the provider in production builds like this: @@ -155,7 +155,7 @@ CLI-based apps can exclude the provider in production builds like this: # Examples The [tests](https://github.com/angular/angular/blob/main/packages/misc/angular-in-memory-web-api/test) -are a good place to learn how to setup and use this in-memory web api library. +are a good place to learn how to set up and use this in-memory web api library. See also the example source code in the official Angular.dev documentation such as the [HttpClient](https://angular.dev/guide/http) guide and the From 5a6daa6cd35d0b60ae6ead4c72637c84bfe22294 Mon Sep 17 00:00:00 2001 From: BreadInvasion Date: Mon, 3 Feb 2025 10:53:28 -0600 Subject: [PATCH 0002/1000] docs: use `inject()` in dependency injection guide (#59079) PR Close #59079 --- .../guide/di/creating-injectable-service.md | 35 +++++++++++++------ 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/adev/src/content/guide/di/creating-injectable-service.md b/adev/src/content/guide/di/creating-injectable-service.md index eaea5fc21fbc..2bddb4201d61 100644 --- a/adev/src/content/guide/di/creating-injectable-service.md +++ b/adev/src/content/guide/di/creating-injectable-service.md @@ -33,14 +33,15 @@ Services can depend on other services. For example, here's a `HeroService` that depends on the `Logger` service, and also uses `BackendService` to get heroes. That service in turn might depend on the `HttpClient` service to fetch heroes asynchronously from a server: - + +import { inject } from "@angular/core"; + export class HeroService { private heroes: Hero[] = []; - constructor( - private backend: BackendService, - private logger: Logger) {} + private backend = inject(BackendService); + private logger = inject(Logger); async getHeroes() { // Fetch @@ -100,16 +101,28 @@ For clarity and maintainability, it is recommended that you define components an ## Injecting services -To inject a service as a dependency into a component, you can use the component's `constructor()` and supply a constructor argument with the dependency type. +To inject a service as a dependency into a component, you can declare a class field representing the dependency and use Angular's `inject` function to initialize it. -The following example specifies the `HeroService` in the `HeroListComponent` constructor. +The following example specifies the `HeroService` in the `HeroListComponent`. The type of `heroService` is `HeroService`. Angular recognizes the `HeroService` type as a dependency, since that class was previously annotated with the `@Injectable` decorator: - - constructor(heroService: HeroService) + + import { inject } from "@angular/core"; + + export class HeroListComponent { + private heroService = inject(HeroService); + } + + +It is also possible to inject a service into a component using the component's constructor: + + + constructor(private heroService: HeroService) +The `inject` method can be used in both classes and functions, while the constructor method can naturally only be used in a class constructor. However, in either case a dependency may only be injected in a valid [injection context](guide/di/dependency-injection-context), usually in the construction or initialization of a component. + ## Injecting services in other services When a service depends on another service, follow the same pattern as injecting into a component. @@ -117,7 +130,7 @@ In the following example, `HeroService` depends on a `Logger` service to report -import { Injectable } from '@angular/core'; +import { inject, Injectable } from '@angular/core'; import { HEROES } from './mock-heroes'; import { Logger } from '../logger.service'; @@ -125,7 +138,7 @@ import { Logger } from '../logger.service'; providedIn: 'root', }) export class HeroService { - constructor(private logger: Logger) {} + private logger = inject(Logger); getHeroes() { this.logger.log('Getting heroes.'); From 30ff7e3f1af428052a50268916103a95da1103bf Mon Sep 17 00:00:00 2001 From: arturovt Date: Wed, 1 Jan 2025 15:32:20 +0200 Subject: [PATCH 0003/1000] refactor(docs-infra): extract `NodeRuntimeSandbox` lazy-loading into separate function (#59344) In this commit, we extract `NodeRuntimeSandbox` lazy-loading into a separate function (because it's duplicated). PR Close #59344 --- adev/src/app/editor/download-manager.service.ts | 7 +++---- adev/src/app/editor/idx-launcher.service.ts | 7 +++---- adev/src/app/editor/index.ts | 3 +-- .../app/editor/inject-node-runtime-sandbox.ts | 17 +++++++++++++++++ .../src/app/editor/preview/preview.component.ts | 9 +-------- .../src/app/editor/stackblitz-opener.service.ts | 7 +++---- .../home/components/home-editor.component.ts | 11 ++++++----- .../playground/playground.component.spec.ts | 3 ++- .../features/playground/playground.component.ts | 7 +++---- .../tutorial/tutorial.component.spec.ts | 8 ++------ .../app/features/tutorial/tutorial.component.ts | 14 ++++---------- 11 files changed, 45 insertions(+), 48 deletions(-) create mode 100644 adev/src/app/editor/inject-node-runtime-sandbox.ts diff --git a/adev/src/app/editor/download-manager.service.ts b/adev/src/app/editor/download-manager.service.ts index 7bebe2c2d992..32fdc0c3bcd7 100644 --- a/adev/src/app/editor/download-manager.service.ts +++ b/adev/src/app/editor/download-manager.service.ts @@ -9,7 +9,8 @@ import {DOCUMENT, isPlatformBrowser} from '@angular/common'; import {EnvironmentInjector, Injectable, PLATFORM_ID, inject} from '@angular/core'; import {generateZip} from '@angular/docs'; -import {injectAsync} from '../core/services/inject-async'; + +import {injectNodeRuntimeSandbox} from './inject-node-runtime-sandbox'; @Injectable({ providedIn: 'root', @@ -23,9 +24,7 @@ export class DownloadManager { * Generate ZIP with the current state of the solution in the EmbeddedEditor */ async downloadCurrentStateOfTheSolution(name: string) { - const nodeRuntimeSandbox = await injectAsync(this.environmentInjector, () => - import('./node-runtime-sandbox.service').then((c) => c.NodeRuntimeSandbox), - ); + const nodeRuntimeSandbox = await injectNodeRuntimeSandbox(this.environmentInjector); const files = await nodeRuntimeSandbox.getSolutionFiles(); const content = await generateZip(files); diff --git a/adev/src/app/editor/idx-launcher.service.ts b/adev/src/app/editor/idx-launcher.service.ts index 26a1c8088469..2c78a460b987 100644 --- a/adev/src/app/editor/idx-launcher.service.ts +++ b/adev/src/app/editor/idx-launcher.service.ts @@ -7,9 +7,10 @@ */ import {EnvironmentInjector, Injectable, inject} from '@angular/core'; -import {injectAsync} from '../core/services/inject-async'; import * as IDX from 'open-in-idx'; +import {injectNodeRuntimeSandbox} from './inject-node-runtime-sandbox'; + @Injectable({ providedIn: 'root', }) @@ -17,9 +18,7 @@ export class IDXLauncher { private readonly environmentInjector = inject(EnvironmentInjector); async openCurrentSolutionInIDX(): Promise { - const nodeRuntimeSandbox = await injectAsync(this.environmentInjector, () => - import('./node-runtime-sandbox.service').then((c) => c.NodeRuntimeSandbox), - ); + const nodeRuntimeSandbox = await injectNodeRuntimeSandbox(this.environmentInjector); const runtimeFiles = await nodeRuntimeSandbox.getSolutionFiles(); const workspaceFiles: Record = {}; diff --git a/adev/src/app/editor/index.ts b/adev/src/app/editor/index.ts index 45fc90986a84..9b82493ae77e 100644 --- a/adev/src/app/editor/index.ts +++ b/adev/src/app/editor/index.ts @@ -9,8 +9,7 @@ export {EmbeddedTutorialManager} from './embedded-tutorial-manager.service'; export {LoadingStep} from './enums/loading-steps'; export {NodeRuntimeState} from './node-runtime-state.service'; - -export {NodeRuntimeSandbox} from './node-runtime-sandbox.service'; +export {injectNodeRuntimeSandbox} from './inject-node-runtime-sandbox'; export {EmbeddedEditor, EMBEDDED_EDITOR_SELECTOR} from './embedded-editor.component'; diff --git a/adev/src/app/editor/inject-node-runtime-sandbox.ts b/adev/src/app/editor/inject-node-runtime-sandbox.ts new file mode 100644 index 000000000000..aafdcf4dd7d9 --- /dev/null +++ b/adev/src/app/editor/inject-node-runtime-sandbox.ts @@ -0,0 +1,17 @@ +/*! + * @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.dev/license + */ + +import {EnvironmentInjector} from '@angular/core'; + +import {injectAsync} from '../core/services/inject-async'; + +export function injectNodeRuntimeSandbox(injector: EnvironmentInjector) { + return injectAsync(injector, () => + import('./node-runtime-sandbox.service').then((c) => c.NodeRuntimeSandbox), + ); +} diff --git a/adev/src/app/editor/preview/preview.component.ts b/adev/src/app/editor/preview/preview.component.ts index f968a47d5e75..2e7712cd8b69 100644 --- a/adev/src/app/editor/preview/preview.component.ts +++ b/adev/src/app/editor/preview/preview.component.ts @@ -6,13 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -import { - ChangeDetectionStrategy, - ChangeDetectorRef, - Component, - inject, - computed, -} from '@angular/core'; +import {ChangeDetectionStrategy, Component, inject, computed} from '@angular/core'; import {DomSanitizer} from '@angular/platform-browser'; import {toSignal} from '@angular/core/rxjs-interop'; @@ -30,7 +24,6 @@ import {PreviewError} from './preview-error.component'; imports: [PreviewError], }) export class Preview { - private readonly changeDetectorRef = inject(ChangeDetectorRef); private readonly domSanitizer = inject(DomSanitizer); private readonly nodeRuntimeSandbox = inject(NodeRuntimeSandbox); private readonly nodeRuntimeState = inject(NodeRuntimeState); diff --git a/adev/src/app/editor/stackblitz-opener.service.ts b/adev/src/app/editor/stackblitz-opener.service.ts index d26e1f23ef2e..4fb481160c26 100644 --- a/adev/src/app/editor/stackblitz-opener.service.ts +++ b/adev/src/app/editor/stackblitz-opener.service.ts @@ -8,7 +8,8 @@ import {EnvironmentInjector, Injectable, inject} from '@angular/core'; import sdk, {Project, ProjectFiles} from '@stackblitz/sdk'; -import {injectAsync} from '../core/services/inject-async'; + +import {injectNodeRuntimeSandbox} from './inject-node-runtime-sandbox'; @Injectable({ providedIn: 'root', @@ -22,9 +23,7 @@ export class StackBlitzOpener { async openCurrentSolutionInStackBlitz( projectMetadata: Pick, ): Promise { - const nodeRuntimeSandbox = await injectAsync(this.environmentInjector, () => - import('./node-runtime-sandbox.service').then((c) => c.NodeRuntimeSandbox), - ); + const nodeRuntimeSandbox = await injectNodeRuntimeSandbox(this.environmentInjector); const runtimeFiles = await nodeRuntimeSandbox.getSolutionFiles(); diff --git a/adev/src/app/features/home/components/home-editor.component.ts b/adev/src/app/features/home/components/home-editor.component.ts index 4846f32a9a3f..b65a9adde849 100644 --- a/adev/src/app/features/home/components/home-editor.component.ts +++ b/adev/src/app/features/home/components/home-editor.component.ts @@ -19,8 +19,11 @@ import { import {takeUntilDestroyed} from '@angular/core/rxjs-interop'; import {forkJoin, switchMap} from 'rxjs'; -import {injectAsync} from '../../../core/services/inject-async'; -import {EmbeddedEditor, injectEmbeddedTutorialManager} from '../../../editor'; +import { + EmbeddedEditor, + injectEmbeddedTutorialManager, + injectNodeRuntimeSandbox, +} from '../../../editor'; @Component({ selector: 'adev-code-editor', @@ -46,9 +49,7 @@ export class CodeEditorComponent implements OnInit { // and completed, which can lead to a memory leak if the user navigates away from // this component to another page. forkJoin([ - injectAsync(this.environmentInjector, () => - import('../../../editor/index').then((c) => c.NodeRuntimeSandbox), - ), + injectNodeRuntimeSandbox(this.environmentInjector), injectEmbeddedTutorialManager(this.environmentInjector), ]) .pipe( diff --git a/adev/src/app/features/playground/playground.component.spec.ts b/adev/src/app/features/playground/playground.component.spec.ts index d94a1c37c1fa..ea9cdad7aa55 100644 --- a/adev/src/app/features/playground/playground.component.spec.ts +++ b/adev/src/app/features/playground/playground.component.spec.ts @@ -9,7 +9,8 @@ import {ComponentFixture, TestBed} from '@angular/core/testing'; import {WINDOW} from '@angular/docs'; -import {NodeRuntimeSandbox, EmbeddedTutorialManager} from '../../editor'; +import {EmbeddedTutorialManager} from '../../editor'; +import {NodeRuntimeSandbox} from '../../editor/node-runtime-sandbox.service'; import TutorialPlayground from './playground.component'; diff --git a/adev/src/app/features/playground/playground.component.ts b/adev/src/app/features/playground/playground.component.ts index 0f16e388755e..00cf9ae474d1 100644 --- a/adev/src/app/features/playground/playground.component.ts +++ b/adev/src/app/features/playground/playground.component.ts @@ -24,7 +24,8 @@ import {IconComponent, PlaygroundTemplate} from '@angular/docs'; import {forkJoin, switchMap, tap} from 'rxjs'; import {injectAsync} from '../../core/services/inject-async'; -import type {EmbeddedTutorialManager, NodeRuntimeSandbox} from '../../editor/index'; +import {injectNodeRuntimeSandbox} from '../../editor/index'; +import type {NodeRuntimeSandbox} from '../../editor/node-runtime-sandbox.service'; import PLAYGROUND_ROUTE_DATA_JSON from '../../../../src/assets/tutorials/playground/routes.json'; @@ -62,9 +63,7 @@ export default class PlaygroundComponent implements AfterViewInit { // and completed, which can lead to a memory leak if the user navigates away from // the playground component to another page. forkJoin({ - nodeRuntimeSandbox: injectAsync(this.environmentInjector, () => - import('../../editor/index').then((c) => c.NodeRuntimeSandbox), - ), + nodeRuntimeSandbox: injectNodeRuntimeSandbox(this.environmentInjector), embeddedEditorComponent: import('../../editor/index').then((c) => c.EmbeddedEditor), }) .pipe( diff --git a/adev/src/app/features/tutorial/tutorial.component.spec.ts b/adev/src/app/features/tutorial/tutorial.component.spec.ts index d0af41c957f3..249fb219fe95 100644 --- a/adev/src/app/features/tutorial/tutorial.component.spec.ts +++ b/adev/src/app/features/tutorial/tutorial.component.spec.ts @@ -14,12 +14,8 @@ import {provideNoopAnimations} from '@angular/platform-browser/animations'; import {provideRouter} from '@angular/router'; import {of} from 'rxjs'; -import { - EMBEDDED_EDITOR_SELECTOR, - EmbeddedEditor, - EmbeddedTutorialManager, - NodeRuntimeSandbox, -} from '../../editor'; +import {EMBEDDED_EDITOR_SELECTOR, EmbeddedEditor, EmbeddedTutorialManager} from '../../editor'; +import {NodeRuntimeSandbox} from '../../editor/node-runtime-sandbox.service'; import {mockAsyncProvider} from '../../core/services/inject-async'; import Tutorial from './tutorial.component'; diff --git a/adev/src/app/features/tutorial/tutorial.component.ts b/adev/src/app/features/tutorial/tutorial.component.ts index c6a63f4f7bd0..cdb3e6f17dbb 100644 --- a/adev/src/app/features/tutorial/tutorial.component.ts +++ b/adev/src/app/features/tutorial/tutorial.component.ts @@ -40,12 +40,12 @@ import {from} from 'rxjs'; import {filter} from 'rxjs/operators'; import {PagePrefix} from '../../core/enums/pages'; -import {injectAsync} from '../../core/services/inject-async'; import { EmbeddedTutorialManager, LoadingStep, NodeRuntimeState, EmbeddedEditor, + injectNodeRuntimeSandbox, } from '../../editor/index'; import {SplitResizerHandler} from './split-resizer-handler.service'; @@ -151,9 +151,7 @@ export default class Tutorial { this.embeddedTutorialManager.revealAnswer(); - const nodeRuntimeSandbox = await injectAsync(this.environmentInjector, () => - import('../../editor/index').then((s) => s.NodeRuntimeSandbox), - ); + const nodeRuntimeSandbox = await injectNodeRuntimeSandbox(this.environmentInjector); await Promise.all( Object.entries(this.embeddedTutorialManager.answerFiles()).map(([path, contents]) => @@ -169,9 +167,7 @@ export default class Tutorial { this.embeddedTutorialManager.resetRevealAnswer(); - const nodeRuntimeSandbox = await injectAsync(this.environmentInjector, () => - import('../../editor/index').then((s) => s.NodeRuntimeSandbox), - ); + const nodeRuntimeSandbox = await injectNodeRuntimeSandbox(this.environmentInjector); await Promise.all( Object.entries(this.embeddedTutorialManager.tutorialFiles()).map(([path, contents]) => @@ -258,9 +254,7 @@ export default class Tutorial { } private async loadEmbeddedEditor() { - const nodeRuntimeSandbox = await injectAsync(this.environmentInjector, () => - import('../../editor/index').then((s) => s.NodeRuntimeSandbox), - ); + const nodeRuntimeSandbox = await injectNodeRuntimeSandbox(this.environmentInjector); this.canRevealAnswer = computed(() => this.nodeRuntimeState.loadingStep() > LoadingStep.BOOT); From f8eae13ddeaac4a64fd035d6c2bed8def121cd80 Mon Sep 17 00:00:00 2001 From: arturovt Date: Mon, 27 Jan 2025 14:07:02 +0200 Subject: [PATCH 0004/1000] refactor(docs-infra): allow home animation to be cleaned up properly (#59732) In this commit, we wrap `initCanvas` in an observable to prevent executing any code, such as `getViews()`, if the view is destroyed before the canvas becomes ready. PR Close #59732 --- .../home/services/home-animation.service.ts | 46 +++++++++++-------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/adev/src/app/features/home/services/home-animation.service.ts b/adev/src/app/features/home/services/home-animation.service.ts index bef70be9233f..bc0c96e8fbdc 100644 --- a/adev/src/app/features/home/services/home-animation.service.ts +++ b/adev/src/app/features/home/services/home-animation.service.ts @@ -12,7 +12,7 @@ import {takeUntilDestroyed} from '@angular/core/rxjs-interop'; import {RESIZE_EVENT_DELAY, WEBGL_LOADED_DELAY, WINDOW} from '@angular/docs'; import {gsap} from 'gsap'; import {ScrollTrigger} from 'gsap/ScrollTrigger'; -import {fromEvent} from 'rxjs'; +import {from, fromEvent} from 'rxjs'; import {debounceTime} from 'rxjs/operators'; import {ThemeManager} from '../../../core/services/theme-manager.service'; import {Canvas} from '../components/canvas'; @@ -80,7 +80,7 @@ export class HomeAnimation { /** * Initialize CSS styles, GSAP, the WebGL canvas and animations. */ - async init(element: HTMLDivElement): Promise { + init(element: HTMLDivElement): void { this.element = element; // CSS styles needed for the animation @@ -93,32 +93,40 @@ export class HomeAnimation { ignoreMobileResize: true, }); - await this.initCanvas(); - this.getViews(); + // Wrap `initCanvas` in an observable to prevent executing any code, + // such as `getViews()`, if the view is destroyed before the canvas becomes ready. + from(this.initCanvas()) + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe(() => { + this.getViews(); + + // Call theme and resize handlers once before setting the animations + this.onTheme(); + this.onResize(); + this.setAnimations(); - // Call theme and resize handlers once before setting the animations - this.onTheme(); - this.onResize(); - this.setAnimations(); + // Call update handler once before starting the animation + this.onUpdate(0, 0, 0, 0); + this.enable(); - // Call update handler once before starting the animation - this.onUpdate(0, 0, 0, 0); - this.enable(); + // Workaround for the flash of white before the programs are ready + const timeoutId = setTimeout(() => { + // Show the canvas + this.element.classList.add(LOADED_CLASS_NAME); + }, WEBGL_LOADED_DELAY); - // Workaround for the flash of white before the programs are ready - setTimeout(() => { - // Show the canvas - this.element.classList.add(LOADED_CLASS_NAME); - }, WEBGL_LOADED_DELAY); + // If the view is destroyed before the timer fires, we clean up the handle. + // This will be a no-op if the timer has already fired. + this.destroyRef.onDestroy(() => clearTimeout(timeoutId)); + }); } /** * Initialize the canvas controller. */ - private async initCanvas(): Promise { + private initCanvas(): Promise { this.canvas = new Canvas(this.document.querySelector(CANVAS)!, this.document, this.window); - - await this.canvas.ready(); + return this.canvas.ready(); } /** From 5762cdd7fd249231b10a61ac4e0ce6345cdd51f7 Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Wed, 29 Jan 2025 16:25:36 +0000 Subject: [PATCH 0005/1000] docs: replace `provideServerRoutesConfig` with `provideServerRouting` (#59777) The `provideServerRoutesConfig` is replaced with `provideServerRouting` PR Close #59777 --- adev/src/app/app.config.server.ts | 4 ++-- adev/src/content/guide/hybrid-rendering.md | 13 ++++++++----- package.json | 2 +- yarn.lock | 8 ++++---- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/adev/src/app/app.config.server.ts b/adev/src/app/app.config.server.ts index ae2b06d7ad25..7ea5cd3c8b75 100644 --- a/adev/src/app/app.config.server.ts +++ b/adev/src/app/app.config.server.ts @@ -8,13 +8,13 @@ import {mergeApplicationConfig, ApplicationConfig} from '@angular/core'; import {provideServerRendering} from '@angular/platform-server'; -import {provideServerRoutesConfig, RenderMode} from '@angular/ssr'; +import {provideServerRouting, RenderMode} from '@angular/ssr'; import {appConfig} from './app.config'; const serverConfig: ApplicationConfig = { providers: [ provideServerRendering(), - provideServerRoutesConfig([{path: '**', renderMode: RenderMode.Prerender}]), + provideServerRouting([{path: '**', renderMode: RenderMode.Prerender}]), ], }; diff --git a/adev/src/content/guide/hybrid-rendering.md b/adev/src/content/guide/hybrid-rendering.md index 38ce6643ae53..8db63ebf99c9 100644 --- a/adev/src/content/guide/hybrid-rendering.md +++ b/adev/src/content/guide/hybrid-rendering.md @@ -65,28 +65,31 @@ export const serverRoutes: ServerRoute[] = [ ]; ``` -You can add this config to your application using the [`provideServerRoutesConfig`](api/ssr/provideServerRoutesConfig 'API reference') function. +You can add this config to your application using the [`provideServerRouting`](api/ssr/provideServerRouting 'API reference') function. ```typescript -import { provideServerRoutesConfig } from '@angular/ssr'; +import { provideServerRouting } from '@angular/ssr'; import { serverRoutes } from './app.routes.server'; // app.config.server.ts const serverConfig: ApplicationConfig = { providers: [ provideServerRendering(), - provideServerRoutesConfig(serverRoutes), + provideServerRouting(serverRoutes), // ... other providers ... ] }; ``` -When using the [App shell pattern](ecosystem/service-workers/app-shell), you must specify the route to be used as the app shell for client-side rendered routes. To do this, provide an options object with the `appShellRoute` property to [`provideServerRoutesConfig`](api/ssr/provideServerRoutesConfig 'API reference'): +When using the [App shell pattern](ecosystem/service-workers/app-shell), you must specify the route to be used as the app shell for client-side rendered routes. To do this, provide an options object with the `appShellRoute` property to [`provideServerRouting`](api/ssr/provideServerRouting 'API reference'): ```typescript +import { provideServerRouting, withAppShell } from '@angular/ssr'; +import { AppShellComponent } from './app-shell/app-shell.component'; + const serverConfig: ApplicationConfig = { providers: [ - provideServerRoutesConfig(serverRoutes, { appShellRoute: 'shell' }), + provideServerRouting(serverRoutes, withAppShell(AppShellComponent)), // ... other providers ... ] }; diff --git a/package.json b/package.json index 904026e5add8..278b86048e37 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "@angular/cdk": "19.2.0-next.1", "@angular/cli": "19.2.0-next.0", "@angular/material": "19.2.0-next.1", - "@angular/ssr": "19.2.0-next.0", + "@angular/ssr": "19.2.0-next.1", "@babel/cli": "7.26.4", "@babel/core": "7.26.0", "@babel/generator": "7.26.5", diff --git a/yarn.lock b/yarn.lock index 22c589779c83..6040ebcbd80b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -497,10 +497,10 @@ which "^5.0.0" yaml "2.7.0" -"@angular/ssr@19.2.0-next.0": - version "19.2.0-next.0" - resolved "https://registry.yarnpkg.com/@angular/ssr/-/ssr-19.2.0-next.0.tgz#a914cf4d1c23b2b7be933d292fb8fa25536be08c" - integrity sha512-SwQrpyzPBddWGzqwa4rVHXObacoIKFrMLNIj13eFi6+eoRgDUdfigH51E27vydulDcNygrj1pZRLVHNRRpmacA== +"@angular/ssr@19.2.0-next.1": + version "19.2.0-next.1" + resolved "https://registry.yarnpkg.com/@angular/ssr/-/ssr-19.2.0-next.1.tgz#69434df6c0aa2e38b8135d06532e15424e21335b" + integrity sha512-AdsiSxOXbq6Lk3zbe+0919RXEnNfol0PWcOhGMgr1y0u/YV6akEplLAVFWyrNxVcXl8Dk0BNXgnx1Stjlk9NUw== dependencies: tslib "^2.3.0" From e725c4774c19de41db7d4a6290599ab163e12b2d Mon Sep 17 00:00:00 2001 From: Gerard Esteve Date: Wed, 29 Jan 2025 17:02:57 +0100 Subject: [PATCH 0006/1000] docs: add clarification for sourceLocale location in angular.json (#59783) PR Close #59783 --- adev/src/content/guide/i18n/locale-id.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/adev/src/content/guide/i18n/locale-id.md b/adev/src/content/guide/i18n/locale-id.md index e298075a1682..949dd974596a 100644 --- a/adev/src/content/guide/i18n/locale-id.md +++ b/adev/src/content/guide/i18n/locale-id.md @@ -47,7 +47,18 @@ By default, Angular uses `en-US` as the source locale of your project. To change the source locale of your project for the build, complete the following actions. 1. Open the [`angular.json`][GuideWorkspaceConfig] workspace build configuration file. -1. Change the source locale in the `sourceLocale` field. +2. Add or modify the `sourceLocale` field inside the `i18n` section: +```json +{ + "projects": { + "your-project": { + "i18n": { + "sourceLocale": "ca" // Use your desired locale code + } + } + } +} +``` ## What's next From f9ff989b596088f40837e0952f25206e7297c6ce Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Wed, 29 Jan 2025 19:13:52 +0000 Subject: [PATCH 0007/1000] build: update github/codeql-action action to v3.28.8 (#59786) See associated pull request for more information. PR Close #59786 --- .github/workflows/scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index b10883a23d93..10ac4a8aba1d 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -47,6 +47,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: 'Upload to code-scanning' - uses: github/codeql-action/upload-sarif@17a820bf2e43b47be2c72b39cc905417bc1ab6d0 # v3.28.6 + uses: github/codeql-action/upload-sarif@dd746615b3b9d728a6a37ca2045b68ca76d4841a # v3.28.8 with: sarif_file: results.sarif From ad88304233a0ec35a604607c973f2532891f5de8 Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Wed, 29 Jan 2025 14:55:44 -0800 Subject: [PATCH 0008/1000] refactor(core): move callAndReportToErrorHandler to bootstrap file (#59793) This function is only used in the bootstrap file and does not need to be in application_ref PR Close #59793 --- .../core/src/application/application_ref.ts | 24 ----------------- .../src/application/create_application.ts | 2 +- packages/core/src/platform/bootstrap.ts | 26 ++++++++++++++++++- packages/core/src/platform/platform_ref.ts | 6 +---- 4 files changed, 27 insertions(+), 31 deletions(-) diff --git a/packages/core/src/application/application_ref.ts b/packages/core/src/application/application_ref.ts index c590a4b7eb5d..23590d23fac1 100644 --- a/packages/core/src/application/application_ref.ts +++ b/packages/core/src/application/application_ref.ts @@ -41,7 +41,6 @@ import {publishDefaultGlobalUtils as _publishDefaultGlobalUtils} from '../render import {requiresRefreshOrTraversal} from '../render3/util/view_utils'; import {ViewRef as InternalViewRef} from '../render3/view_ref'; import {TESTABILITY} from '../testability/testability'; -import {isPromise} from '../util/lang'; import {NgZone} from '../zone/ng_zone'; import {ApplicationInitStatus} from './application_init'; @@ -178,29 +177,6 @@ export interface BootstrapOptions { /** Maximum number of times ApplicationRef will refresh all attached views in a single tick. */ const MAXIMUM_REFRESH_RERUNS = 10; -export function _callAndReportToErrorHandler( - errorHandler: ErrorHandler, - ngZone: NgZone, - callback: () => any, -): any { - try { - const result = callback(); - if (isPromise(result)) { - return result.catch((e: any) => { - ngZone.runOutsideAngular(() => errorHandler.handleError(e)); - // rethrow as the exception handler might not do it - throw e; - }); - } - - return result; - } catch (e) { - ngZone.runOutsideAngular(() => errorHandler.handleError(e)); - // rethrow as the exception handler might not do it - throw e; - } -} - export function optionsReducer(dst: T, objs: T | T[]): T { if (Array.isArray(objs)) { return objs.reduce(optionsReducer, dst); diff --git a/packages/core/src/application/create_application.ts b/packages/core/src/application/create_application.ts index 0656d8bad741..1b06ea8c819d 100644 --- a/packages/core/src/application/create_application.ts +++ b/packages/core/src/application/create_application.ts @@ -14,7 +14,7 @@ import {createOrReusePlatformInjector} from '../platform/platform'; import {assertStandaloneComponentType} from '../render3/errors'; import {EnvironmentNgModuleRefAdapter} from '../render3/ng_module_ref'; -import {_callAndReportToErrorHandler, ApplicationRef} from './application_ref'; +import {ApplicationRef} from './application_ref'; import {ChangeDetectionScheduler} from '../change_detection/scheduling/zoneless_scheduling'; import {ChangeDetectionSchedulerImpl} from '../change_detection/scheduling/zoneless_scheduling_impl'; import {bootstrap} from '../platform/bootstrap'; diff --git a/packages/core/src/platform/bootstrap.ts b/packages/core/src/platform/bootstrap.ts index 3fdce7155df1..017bc3f4e0af 100644 --- a/packages/core/src/platform/bootstrap.ts +++ b/packages/core/src/platform/bootstrap.ts @@ -20,11 +20,12 @@ import {setLocaleId} from '../render3/i18n/i18n_locale_id'; import {NgZone} from '../zone/ng_zone'; import {ApplicationInitStatus} from '../application/application_init'; -import {_callAndReportToErrorHandler, ApplicationRef, remove} from '../application/application_ref'; +import {ApplicationRef, remove} from '../application/application_ref'; import {PROVIDED_ZONELESS} from '../change_detection/scheduling/zoneless_scheduling'; import {InjectionToken, Injector} from '../di'; import {InternalNgModuleRef, NgModuleRef} from '../linker/ng_module_factory'; import {stringify} from '../util/stringify'; +import {isPromise} from '../util/lang'; /** * InjectionToken to control root component bootstrap behavior. @@ -200,3 +201,26 @@ function moduleDoBootstrap( } allPlatformModules.push(moduleRef); } + +function _callAndReportToErrorHandler( + errorHandler: ErrorHandler, + ngZone: NgZone, + callback: () => any, +): any { + try { + const result = callback(); + if (isPromise(result)) { + return result.catch((e: any) => { + ngZone.runOutsideAngular(() => errorHandler.handleError(e)); + // rethrow as the exception handler might not do it + throw e; + }); + } + + return result; + } catch (e) { + ngZone.runOutsideAngular(() => errorHandler.handleError(e)); + // rethrow as the exception handler might not do it + throw e; + } +} diff --git a/packages/core/src/platform/platform_ref.ts b/packages/core/src/platform/platform_ref.ts index 9ac30bacc750..86b6d7787fff 100644 --- a/packages/core/src/platform/platform_ref.ts +++ b/packages/core/src/platform/platform_ref.ts @@ -7,11 +7,7 @@ */ import {compileNgModuleFactory} from '../application/application_ngmodule_factory_compiler'; -import { - _callAndReportToErrorHandler, - BootstrapOptions, - optionsReducer, -} from '../application/application_ref'; +import {BootstrapOptions, optionsReducer} from '../application/application_ref'; import { getNgZoneOptions, internalProvideZoneChangeDetection, From 4684e67fd0225ff8df984cb85485748343780b7b Mon Sep 17 00:00:00 2001 From: Luan Gong Date: Fri, 31 Jan 2025 02:28:44 +0800 Subject: [PATCH 0009/1000] docs: Fix wording for Angular CLI end-to-end testing (#59808) PR Close #59808 --- adev/src/content/tools/cli/end-to-end.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adev/src/content/tools/cli/end-to-end.md b/adev/src/content/tools/cli/end-to-end.md index b5a7f84caa71..c1f888b49788 100644 --- a/adev/src/content/tools/cli/end-to-end.md +++ b/adev/src/content/tools/cli/end-to-end.md @@ -36,7 +36,7 @@ Puppeteer -If you don't find the test runner you would like you use from the list above, you can add manually add a package using `ng add`. +If you don't find the test runner you would like to use from the list above, you can manually add a package using `ng add`. ## Running E2E Tests From 2d53bacec31a0a794446dcc98d905cbb7bada488 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Wed, 29 Jan 2025 18:10:58 +0100 Subject: [PATCH 0010/1000] refactor(core): reuse existing logic in ComponentRef impl (#59806) This change removes some code and logic duplication by re-using the existing functionality. It also pulls some code into separate methods for clarity. PR Close #59806 --- packages/core/src/render3/component_ref.ts | 209 +++++++++--------- .../bundle.golden_symbols.json | 1 + .../animations/bundle.golden_symbols.json | 1 + .../cyclic_import/bundle.golden_symbols.json | 1 + .../bundling/defer/bundle.golden_symbols.json | 1 + .../forms_reactive/bundle.golden_symbols.json | 1 + .../bundle.golden_symbols.json | 1 + .../hello_world/bundle.golden_symbols.json | 1 + .../hydration/bundle.golden_symbols.json | 1 + .../router/bundle.golden_symbols.json | 1 + .../bundle.golden_symbols.json | 1 + .../bundling/todo/bundle.golden_symbols.json | 1 + 12 files changed, 117 insertions(+), 103 deletions(-) diff --git a/packages/core/src/render3/component_ref.ts b/packages/core/src/render3/component_ref.ts index 60c61db94046..6b32847999be 100644 --- a/packages/core/src/render3/component_ref.ts +++ b/packages/core/src/render3/component_ref.ts @@ -16,8 +16,6 @@ import { import {Injector} from '../di/injector'; import {EnvironmentInjector} from '../di/r3_injector'; import {RuntimeError, RuntimeErrorCode} from '../errors'; -import {DehydratedView} from '../hydration/interfaces'; -import {retrieveHydrationInfo} from '../hydration/utils'; import {Type} from '../interface/type'; import { ComponentFactory as AbstractComponentFactory, @@ -28,7 +26,6 @@ import {createElementRef, ElementRef} from '../linker/element_ref'; import {NgModuleRef} from '../linker/ng_module_factory'; import {RendererFactory2} from '../render/api'; import {Sanitizer} from '../sanitization/sanitizer'; -import {assertDefined} from '../util/assert'; import {assertComponentType} from './assert'; import {attachPatchData} from './context_discovery'; @@ -43,6 +40,7 @@ import { createDirectivesInstances, createLView, createTView, + getInitialLViewFlagsFromDef, initializeDirectives, locateHostElement, resolveHostDirectives, @@ -58,7 +56,7 @@ import { TNode, TNodeType, } from './interfaces/node'; -import {RNode} from './interfaces/renderer_dom'; +import {RElement, RNode} from './interfaces/renderer_dom'; import { CONTEXT, HEADER_OFFSET, @@ -70,9 +68,11 @@ import { } from './interfaces/view'; import {MATH_ML_NAMESPACE, SVG_NAMESPACE} from './namespaces'; +import {retrieveHydrationInfo} from '../hydration/utils'; import {ChainedInjector} from './chained_injector'; import {createElementNode, setupStaticAttributes} from './dom_node_manipulation'; import {unregisterLView} from './interfaces/lview_tracking'; +import {Renderer} from './interfaces/renderer'; import { extractAttrsAndClassesFromSelector, stringifyCSSSelectorList, @@ -80,7 +80,7 @@ import { import {profiler} from './profiler'; import {ProfilerEvent} from './profiler_types'; import {executeContentQueries} from './queries/query_execution'; -import {enterView, getCurrentTNode, getLView, leaveView} from './state'; +import {enterView, leaveView} from './state'; import {computeStaticStyling} from './styling/static_styling'; import {getOrCreateTNode} from './tnode_manipulation'; import {mergeHostAttrs} from './util/attrs_utils'; @@ -150,9 +150,74 @@ function toRefArray< return array; } -function getNamespace(elementName: string): string | null { - const name = elementName.toLowerCase(); - return name === 'svg' ? SVG_NAMESPACE : name === 'math' ? MATH_ML_NAMESPACE : null; +function verifyNotAnOrphanComponent(componentDef: ComponentDef) { + // TODO(pk): create assert that verifies ngDevMode + if ( + (typeof ngJitMode === 'undefined' || ngJitMode) && + componentDef.debugInfo?.forbidOrphanRendering + ) { + if (depsTracker.isOrphanComponent(componentDef.type)) { + throw new RuntimeError( + RuntimeErrorCode.RUNTIME_DEPS_ORPHAN_COMPONENT, + `Orphan component found! Trying to render the component ${debugStringifyTypeForError( + componentDef.type, + )} without first loading the NgModule that declares it. It is recommended to make this component standalone in order to avoid this error. If this is not possible now, import the component's NgModule in the appropriate NgModule, or the standalone component in which you are trying to render this component. If this is a lazy import, load the NgModule lazily as well and use its module injector.`, + ); + } + } +} + +function createRootViewInjector( + componentDef: ComponentDef, + environmentInjector: EnvironmentInjector | NgModuleRef | undefined, + injector: Injector, +): Injector { + let realEnvironmentInjector = + environmentInjector instanceof EnvironmentInjector + ? environmentInjector + : environmentInjector?.injector; + + if (realEnvironmentInjector && componentDef.getStandaloneInjector !== null) { + realEnvironmentInjector = + componentDef.getStandaloneInjector(realEnvironmentInjector) || realEnvironmentInjector; + } + + const rootViewInjector = realEnvironmentInjector + ? new ChainedInjector(injector, realEnvironmentInjector) + : injector; + return rootViewInjector; +} + +function createRootLViewEnvironment(rootLViewInjector: Injector): LViewEnvironment { + const rendererFactory = rootLViewInjector.get(RendererFactory2, null); + if (rendererFactory === null) { + throw new RuntimeError( + RuntimeErrorCode.RENDERER_NOT_FOUND, + ngDevMode && + 'Angular was not able to inject a renderer (RendererFactory2). ' + + 'Likely this is due to a broken DI hierarchy. ' + + 'Make sure that any injector used to create this component has a correct parent.', + ); + } + + const sanitizer = rootLViewInjector.get(Sanitizer, null); + const changeDetectionScheduler = rootLViewInjector.get(ChangeDetectionScheduler, null); + + return { + rendererFactory, + sanitizer, + changeDetectionScheduler, + }; +} + +function createHostElement(componentDef: ComponentDef, render: Renderer): RElement { + // Determine a tag name used for creating host elements when this component is created + // dynamically. Default to 'div' if this component did not specify any tag name in its + // selector. + const tagName = ((componentDef.selectors[0][0] as string) || 'div').toLowerCase(); + const namespace = + tagName === 'svg' ? SVG_NAMESPACE : tagName === 'math' ? MATH_ML_NAMESPACE : null; + return createElementNode(render, tagName, namespace); } /** @@ -214,84 +279,8 @@ export class ComponentFactory extends AbstractComponentFactory { const prevConsumer = setActiveConsumer(null); try { - // Check if the component is orphan - if ( - ngDevMode && - (typeof ngJitMode === 'undefined' || ngJitMode) && - this.componentDef.debugInfo?.forbidOrphanRendering - ) { - if (depsTracker.isOrphanComponent(this.componentType)) { - throw new RuntimeError( - RuntimeErrorCode.RUNTIME_DEPS_ORPHAN_COMPONENT, - `Orphan component found! Trying to render the component ${debugStringifyTypeForError( - this.componentType, - )} without first loading the NgModule that declares it. It is recommended to make this component standalone in order to avoid this error. If this is not possible now, import the component's NgModule in the appropriate NgModule, or the standalone component in which you are trying to render this component. If this is a lazy import, load the NgModule lazily as well and use its module injector.`, - ); - } - } - - environmentInjector = environmentInjector || this.ngModule; - - let realEnvironmentInjector = - environmentInjector instanceof EnvironmentInjector - ? environmentInjector - : environmentInjector?.injector; - - if (realEnvironmentInjector && this.componentDef.getStandaloneInjector !== null) { - realEnvironmentInjector = - this.componentDef.getStandaloneInjector(realEnvironmentInjector) || - realEnvironmentInjector; - } - - const rootViewInjector = realEnvironmentInjector - ? new ChainedInjector(injector, realEnvironmentInjector) - : injector; - - const rendererFactory = rootViewInjector.get(RendererFactory2, null); - if (rendererFactory === null) { - throw new RuntimeError( - RuntimeErrorCode.RENDERER_NOT_FOUND, - ngDevMode && - 'Angular was not able to inject a renderer (RendererFactory2). ' + - 'Likely this is due to a broken DI hierarchy. ' + - 'Make sure that any injector used to create this component has a correct parent.', - ); - } - const sanitizer = rootViewInjector.get(Sanitizer, null); - - const changeDetectionScheduler = rootViewInjector.get(ChangeDetectionScheduler, null); - - const environment: LViewEnvironment = { - rendererFactory, - sanitizer, - changeDetectionScheduler, - }; - - const hostRenderer = rendererFactory.createRenderer(null, this.componentDef); - // Determine a tag name used for creating host elements when this component is created - // dynamically. Default to 'div' if this component did not specify any tag name in its - // selector. - const elementName = (this.componentDef.selectors[0][0] as string) || 'div'; - const hostRNode = rootSelectorOrNode - ? locateHostElement( - hostRenderer, - rootSelectorOrNode, - this.componentDef.encapsulation, - rootViewInjector, - ) - : createElementNode(hostRenderer, elementName, getNamespace(elementName)); - - let rootFlags = LViewFlags.IsRoot; - if (this.componentDef.signals) { - rootFlags |= LViewFlags.SignalView; - } else if (!this.componentDef.onPush) { - rootFlags |= LViewFlags.CheckAlways; - } - - let hydrationInfo: DehydratedView | null = null; - if (hostRNode !== null) { - hydrationInfo = retrieveHydrationInfo(hostRNode, rootViewInjector, true /* isRootView */); - } + const cmpDef = this.componentDef; + ngDevMode && verifyNotAnOrphanComponent(cmpDef); // Create the root view. Uses empty TView and ContentTemplate. const rootTView = createTView( @@ -307,21 +296,39 @@ export class ComponentFactory extends AbstractComponentFactory { null, null, ); + + const rootViewInjector = createRootViewInjector( + cmpDef, + environmentInjector || this.ngModule, + injector, + ); + + const environment = createRootLViewEnvironment(rootViewInjector); + const hostRenderer = environment.rendererFactory.createRenderer(null, cmpDef); + const hostElement = rootSelectorOrNode + ? locateHostElement( + hostRenderer, + rootSelectorOrNode, + cmpDef.encapsulation, + rootViewInjector, + ) + : createHostElement(cmpDef, hostRenderer); + const rootLView = createLView( null, rootTView, null, - rootFlags, + LViewFlags.IsRoot | getInitialLViewFlagsFromDef(cmpDef), null, null, environment, hostRenderer, rootViewInjector, null, - hydrationInfo, + retrieveHydrationInfo(hostElement, rootViewInjector, true /* isRootView */), ); - rootLView[HEADER_OFFSET] = hostRNode; + rootLView[HEADER_OFFSET] = hostElement; // rootView is the parent when bootstrapping // TODO(misko): it looks like we are entering view here but we don't really need to as @@ -337,9 +344,9 @@ export class ComponentFactory extends AbstractComponentFactory { const tAttributes = rootSelectorOrNode ? ['ng-version', '0.0.0-PLACEHOLDER'] : // Extract attributes and classes from the first selector only to match VE behavior. - extractAttrsAndClassesFromSelector(this.componentDef.selectors[0]); + extractAttrsAndClassesFromSelector(cmpDef.selectors[0]); - // TODO: this logic is shared with the element instruction first create pass + // TODO: this logic is shared with the element instruction first create pass - minus directive matching const hostTNode = getOrCreateTNode( rootTView, HEADER_OFFSET, @@ -349,13 +356,9 @@ export class ComponentFactory extends AbstractComponentFactory { ); const [directiveDefs, hostDirectiveDefs] = resolveHostDirectives(rootTView, hostTNode, [ - this.componentDef, + cmpDef, ]); initializeDirectives(rootTView, rootLView, hostTNode, directiveDefs, {}, hostDirectiveDefs); - - for (const def of directiveDefs) { - hostTNode.mergedAttrs = mergeHostAttrs(hostTNode.mergedAttrs, def.hostAttrs); - } hostTNode.mergedAttrs = mergeHostAttrs(hostTNode.mergedAttrs, tAttributes); computeStaticStyling(hostTNode, hostTNode.mergedAttrs, true); @@ -363,13 +366,9 @@ export class ComponentFactory extends AbstractComponentFactory { // TODO(crisbeto): in practice `hostRNode` should always be defined, but there are some // tests where the renderer is mocked out and `undefined` is returned. We should update the // tests so that this check can be removed. - if (hostRNode) { - setupStaticAttributes(hostRenderer, hostRNode, hostTNode); - attachPatchData(hostRNode, rootLView); - } - - if (projectableNodes !== undefined) { - projectNodes(hostTNode, this.ngContentSelectors, projectableNodes); + if (hostElement) { + setupStaticAttributes(hostRenderer, hostElement, hostTNode); + attachPatchData(hostElement, rootLView); } // TODO(pk): this logic is similar to the instruction code where a node can have directives @@ -379,6 +378,10 @@ export class ComponentFactory extends AbstractComponentFactory { // TODO(pk): code / logic duplication with the elementEnd and similar instructions registerPostOrderHooks(rootTView, hostTNode); + if (projectableNodes !== undefined) { + projectNodes(hostTNode, this.ngContentSelectors, projectableNodes); + } + componentView = getComponentLViewByIndex(hostTNode.index, rootLView); // TODO(pk): why do we need this logic? diff --git a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json index df48d2dff857..474a638b2d96 100644 --- a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json @@ -306,6 +306,7 @@ "getDirectiveDef", "getFactoryDef", "getFirstLContainer", + "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", diff --git a/packages/core/test/bundling/animations/bundle.golden_symbols.json b/packages/core/test/bundling/animations/bundle.golden_symbols.json index 62af134a8e0b..5415c8c5a06e 100644 --- a/packages/core/test/bundling/animations/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations/bundle.golden_symbols.json @@ -327,6 +327,7 @@ "getDirectiveDef", "getFactoryDef", "getFirstLContainer", + "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", diff --git a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json index c139251f2b08..14df7c693038 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -255,6 +255,7 @@ "getDirectiveDef", "getFactoryDef", "getFirstLContainer", + "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", diff --git a/packages/core/test/bundling/defer/bundle.golden_symbols.json b/packages/core/test/bundling/defer/bundle.golden_symbols.json index a66108aa3d83..d74d3c5306ce 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -309,6 +309,7 @@ "getFactoryDef", "getFirstLContainer", "getFirstNativeNode", + "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", diff --git a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json index 219fd3384361..71a74ec5ee9a 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -372,6 +372,7 @@ "getFactoryOf", "getFirstLContainer", "getFirstNativeNode", + "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", diff --git a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json index 02d8aacd38d6..871a10adddbc 100644 --- a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json @@ -358,6 +358,7 @@ "getFactoryOf", "getFirstLContainer", "getFirstNativeNode", + "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", diff --git a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json index a2987b942c99..816594303233 100644 --- a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json @@ -198,6 +198,7 @@ "getDeclarationTNode", "getFactoryDef", "getFirstLContainer", + "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", diff --git a/packages/core/test/bundling/hydration/bundle.golden_symbols.json b/packages/core/test/bundling/hydration/bundle.golden_symbols.json index 190a8726d8c0..e6f35276b21e 100644 --- a/packages/core/test/bundling/hydration/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hydration/bundle.golden_symbols.json @@ -263,6 +263,7 @@ "getFactoryDef", "getFilteredHeaders", "getFirstLContainer", + "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", diff --git a/packages/core/test/bundling/router/bundle.golden_symbols.json b/packages/core/test/bundling/router/bundle.golden_symbols.json index 3ab9944b6c49..3aeaba62c128 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -443,6 +443,7 @@ "getFirstNativeNode", "getIdxOfMatchingSelector", "getInherited", + "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", diff --git a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json index 8f50f8369032..b28bd07051ec 100644 --- a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json +++ b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json @@ -228,6 +228,7 @@ "getDirectiveDef", "getFactoryDef", "getFirstLContainer", + "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index c3a1ab10f27a..4013f9f27d68 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -301,6 +301,7 @@ "getFactoryDef", "getFirstLContainer", "getFirstNativeNode", + "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", From a88b00c9e3ff4da5acd6ade4aaba946a0d92933e Mon Sep 17 00:00:00 2001 From: arturovt Date: Thu, 30 Jan 2025 23:53:56 +0200 Subject: [PATCH 0011/1000] refactor(platform-browser): remove redundant `DomEventsPlugin` dependencies (#59811) The `DomEventsPlugin` only injects the `DOCUMENT`; the platform ID and `NgZone` are redundant. PR Close #59811 --- packages/platform-browser/src/browser.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/platform-browser/src/browser.ts b/packages/platform-browser/src/browser.ts index 6b924de7261b..7e663ecb6bc5 100644 --- a/packages/platform-browser/src/browser.ts +++ b/packages/platform-browser/src/browser.ts @@ -233,7 +233,7 @@ const BROWSER_MODULE_PROVIDERS: Provider[] = [ provide: EVENT_MANAGER_PLUGINS, useClass: DomEventsPlugin, multi: true, - deps: [DOCUMENT, NgZone, PLATFORM_ID], + deps: [DOCUMENT], }, {provide: EVENT_MANAGER_PLUGINS, useClass: KeyEventsPlugin, multi: true, deps: [DOCUMENT]}, DomRendererFactory2, From 03bcd30e3487443983d450a5dfea2d68d551bbd3 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Thu, 30 Jan 2025 18:10:29 +0100 Subject: [PATCH 0012/1000] fix(compiler-cli): handle enum members without initializers in partial evaluator (#59815) Fixes that the partial evaluator was interpreting initializer-less enum members as undefined. In this case the value is the same as the index. PR Close #59815 --- .../src/ngtsc/partial_evaluator/src/interpreter.ts | 4 ++-- .../src/ngtsc/partial_evaluator/test/evaluator_spec.ts | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/compiler-cli/src/ngtsc/partial_evaluator/src/interpreter.ts b/packages/compiler-cli/src/ngtsc/partial_evaluator/src/interpreter.ts index 1374eda6e863..b80fb05d4362 100644 --- a/packages/compiler-cli/src/ngtsc/partial_evaluator/src/interpreter.ts +++ b/packages/compiler-cli/src/ngtsc/partial_evaluator/src/interpreter.ts @@ -314,10 +314,10 @@ export class StaticInterpreter { private visitEnumDeclaration(node: ts.EnumDeclaration, context: Context): ResolvedValue { const enumRef = this.getReference(node, context); const map = new Map(); - node.members.forEach((member) => { + node.members.forEach((member, index) => { const name = this.stringNameFromPropertyName(member.name, context); if (name !== undefined) { - const resolved = member.initializer && this.visit(member.initializer, context); + const resolved = member.initializer ? this.visit(member.initializer, context) : index; map.set(name, new EnumValue(enumRef, name, resolved)); } }); diff --git a/packages/compiler-cli/src/ngtsc/partial_evaluator/test/evaluator_spec.ts b/packages/compiler-cli/src/ngtsc/partial_evaluator/test/evaluator_spec.ts index 9c5ecea834d8..53627de2d354 100644 --- a/packages/compiler-cli/src/ngtsc/partial_evaluator/test/evaluator_spec.ts +++ b/packages/compiler-cli/src/ngtsc/partial_evaluator/test/evaluator_spec.ts @@ -638,6 +638,7 @@ runInEachFileSystem(() => { } expect((result.enumRef.node as ts.EnumDeclaration).name.text).toBe('Foo'); expect(result.name).toBe('B'); + expect(result.resolved).toBe(1); }); it('variable declaration resolution works', () => { From bae94b82fda1669a6aafad975a3a0eb6f2743039 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Thu, 30 Jan 2025 18:38:05 +0100 Subject: [PATCH 0013/1000] fix(compiler-cli): handle const enums used inside HMR data (#59815) When we generate an HMR replacement function, we determine which locals from the file are used and we pass them by reference. This works fine in most cases, but breaks down for const enums which don't have a runtime representation. These changes work around the issue by passing in all the values as an object literal. Fixes #59800. PR Close #59815 --- .../annotations/component/src/handler.ts | 4 + .../compiler-cli/src/ngtsc/hmr/BUILD.bazel | 1 + .../src/ngtsc/hmr/src/extract_dependencies.ts | 100 ++++++++++++++++-- .../src/ngtsc/hmr/src/metadata.ts | 4 + packages/compiler-cli/test/ngtsc/hmr_spec.ts | 87 +++++++++++++++ .../compiler/src/render3/r3_hmr_compiler.ts | 20 ++-- 6 files changed, 201 insertions(+), 15 deletions(-) diff --git a/packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts b/packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts index 61c1460278cc..d207b5288f7b 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts @@ -1659,6 +1659,7 @@ export class ComponentDecoratorHandler ? extractHmrMetatadata( node, this.reflector, + this.evaluator, this.compilerHost, this.rootDirs, def, @@ -1725,6 +1726,7 @@ export class ComponentDecoratorHandler ? extractHmrMetatadata( node, this.reflector, + this.evaluator, this.compilerHost, this.rootDirs, def, @@ -1787,6 +1789,7 @@ export class ComponentDecoratorHandler ? extractHmrMetatadata( node, this.reflector, + this.evaluator, this.compilerHost, this.rootDirs, def, @@ -1843,6 +1846,7 @@ export class ComponentDecoratorHandler ? extractHmrMetatadata( node, this.reflector, + this.evaluator, this.compilerHost, this.rootDirs, def, diff --git a/packages/compiler-cli/src/ngtsc/hmr/BUILD.bazel b/packages/compiler-cli/src/ngtsc/hmr/BUILD.bazel index 5e2781478862..4eedd865328a 100644 --- a/packages/compiler-cli/src/ngtsc/hmr/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/hmr/BUILD.bazel @@ -9,6 +9,7 @@ ts_library( ]), deps = [ "//packages/compiler", + "//packages/compiler-cli/src/ngtsc/partial_evaluator", "//packages/compiler-cli/src/ngtsc/reflection", "//packages/compiler-cli/src/ngtsc/transform", "//packages/compiler-cli/src/ngtsc/translator", diff --git a/packages/compiler-cli/src/ngtsc/hmr/src/extract_dependencies.ts b/packages/compiler-cli/src/ngtsc/hmr/src/extract_dependencies.ts index 8f949cd3e0f9..8766ce246ecd 100644 --- a/packages/compiler-cli/src/ngtsc/hmr/src/extract_dependencies.ts +++ b/packages/compiler-cli/src/ngtsc/hmr/src/extract_dependencies.ts @@ -13,9 +13,10 @@ import { R3HmrNamespaceDependency, outputAst as o, } from '@angular/compiler'; -import {DeclarationNode} from '../../reflection'; +import {DeclarationNode, ReflectionHost} from '../../reflection'; import {CompileResult} from '../../transform'; import ts from 'typescript'; +import {EnumValue, PartialEvaluator} from '../../partial_evaluator'; /** * Determines the file-level dependencies that the HMR initializer needs to capture and pass along. @@ -33,7 +34,12 @@ export function extractHmrDependencies( deferBlockMetadata: R3ComponentDeferMetadata, classMetadata: o.Statement | null, debugInfo: o.Statement | null, -): {local: string[]; external: R3HmrNamespaceDependency[]} { + reflection: ReflectionHost, + evaluator: PartialEvaluator, +): { + local: {name: string; runtimeRepresentation: o.Expression}[]; + external: R3HmrNamespaceDependency[]; +} { const name = ts.isClassDeclaration(node) && node.name ? node.name.text : null; const visitor = new PotentialTopLevelReadsVisitor(); const sourceFile = node.getSourceFile(); @@ -57,9 +63,23 @@ export function extractHmrDependencies( // variables inside of functions. Note that we filter out the class name since it is always // defined and it saves us having to repeat this logic wherever the locals are consumed. const availableTopLevel = getTopLevelDeclarationNames(sourceFile); + const local: {name: string; runtimeRepresentation: o.Expression}[] = []; + const seenLocals = new Set(); + + for (const readNode of visitor.allReads) { + const readName = readNode instanceof o.ReadVarExpr ? readNode.name : readNode.text; + + if (readName !== name && !seenLocals.has(readName) && availableTopLevel.has(readName)) { + local.push({ + name: readName, + runtimeRepresentation: getRuntimeRepresentation(readNode, reflection, evaluator), + }); + seenLocals.add(readName); + } + } return { - local: Array.from(visitor.allReads).filter((r) => r !== name && availableTopLevel.has(r)), + local, external: Array.from(visitor.namespaceReads, (name, index) => ({ moduleName: name, assignedName: `ɵhmr${index}`, @@ -67,6 +87,49 @@ export function extractHmrDependencies( }; } +/** + * Gets a node that can be used to represent an identifier in the HMR replacement code at runtime. + */ +function getRuntimeRepresentation( + node: o.ReadVarExpr | ts.Identifier, + reflection: ReflectionHost, + evaluator: PartialEvaluator, +): o.Expression { + if (node instanceof o.ReadVarExpr) { + return o.variable(node.name); + } + + // Const enums can't be passed by reference, because their values are inlined. + // Pass in an object literal with all of the values instead. + if (isConstEnumReference(node, reflection)) { + const evaluated = evaluator.evaluate(node); + + if (evaluated instanceof Map) { + const members: {key: string; quoted: boolean; value: o.Expression}[] = []; + + for (const [name, value] of evaluated.entries()) { + if ( + value instanceof EnumValue && + (value.resolved == null || + typeof value.resolved === 'string' || + typeof value.resolved === 'boolean' || + typeof value.resolved === 'number') + ) { + members.push({ + key: name, + quoted: false, + value: o.literal(value.resolved), + }); + } + } + + return o.literalMap(members); + } + } + + return o.variable(node.text); +} + /** * Gets the names of all top-level declarations within the file (imports, declared classes etc). * @param sourceFile File in which to search for locals. @@ -81,8 +144,7 @@ function getTopLevelDeclarationNames(sourceFile: ts.SourceFile): Set { if ( ts.isClassDeclaration(node) || ts.isFunctionDeclaration(node) || - (ts.isEnumDeclaration(node) && - !node.modifiers?.some((m) => m.kind === ts.SyntaxKind.ConstKeyword)) + ts.isEnumDeclaration(node) ) { if (node.name) { results.add(node.name.text); @@ -157,7 +219,7 @@ function trackBindingName(node: ts.BindingName, results: Set): void { * inside functions. */ class PotentialTopLevelReadsVisitor extends o.RecursiveAstVisitor { - readonly allReads = new Set(); + readonly allReads = new Set(); readonly namespaceReads = new Set(); override visitExternalExpr(ast: o.ExternalExpr, context: any) { @@ -168,7 +230,7 @@ class PotentialTopLevelReadsVisitor extends o.RecursiveAstVisitor { } override visitReadVarExpr(ast: o.ReadVarExpr, context: any) { - this.allReads.add(ast.name); + this.allReads.add(ast); super.visitReadVarExpr(ast, context); } @@ -186,7 +248,7 @@ class PotentialTopLevelReadsVisitor extends o.RecursiveAstVisitor { */ private addAllTopLevelIdentifiers = (node: ts.Node) => { if (ts.isIdentifier(node) && this.isTopLevelIdentifierReference(node)) { - this.allReads.add(node.text); + this.allReads.add(node); } else { ts.forEachChild(node, this.addAllTopLevelIdentifiers); } @@ -326,3 +388,25 @@ class PotentialTopLevelReadsVisitor extends o.RecursiveAstVisitor { return !!value && typeof value.kind === 'number'; } } + +/** Checks whether a node is a reference to a const enum. */ +function isConstEnumReference(node: ts.Identifier, reflection: ReflectionHost): boolean { + const parent = node.parent; + + // Only check identifiers that are in the form of `Foo.bar` where `Foo` is the node being checked. + if ( + !parent || + !ts.isPropertyAccessExpression(parent) || + parent.expression !== node || + !ts.isIdentifier(parent.name) + ) { + return false; + } + + const declaration = reflection.getDeclarationOfIdentifier(node); + return ( + declaration !== null && + ts.isEnumDeclaration(declaration.node) && + !!declaration.node.modifiers?.some((m) => m.kind === ts.SyntaxKind.ConstKeyword) + ); +} diff --git a/packages/compiler-cli/src/ngtsc/hmr/src/metadata.ts b/packages/compiler-cli/src/ngtsc/hmr/src/metadata.ts index 4c7f4d73feae..dea6514e3faf 100644 --- a/packages/compiler-cli/src/ngtsc/hmr/src/metadata.ts +++ b/packages/compiler-cli/src/ngtsc/hmr/src/metadata.ts @@ -17,6 +17,7 @@ import {getProjectRelativePath} from '../../util/src/path'; import {CompileResult} from '../../transform'; import {extractHmrDependencies} from './extract_dependencies'; import ts from 'typescript'; +import {PartialEvaluator} from '../../partial_evaluator'; /** * Extracts the HMR metadata for a class declaration. @@ -33,6 +34,7 @@ import ts from 'typescript'; export function extractHmrMetatadata( clazz: DeclarationNode, reflection: ReflectionHost, + evaluator: PartialEvaluator, compilerHost: Pick, rootDirs: readonly string[], definition: R3CompiledExpression, @@ -57,6 +59,8 @@ export function extractHmrMetatadata( deferBlockMetadata, classMetadata, debugInfo, + reflection, + evaluator, ); const meta: R3HmrMetadata = { type: new o.WrappedNodeExpr(clazz.name), diff --git a/packages/compiler-cli/test/ngtsc/hmr_spec.ts b/packages/compiler-cli/test/ngtsc/hmr_spec.ts index 3cabd09b0c9b..4da69740c23f 100644 --- a/packages/compiler-cli/test/ngtsc/hmr_spec.ts +++ b/packages/compiler-cli/test/ngtsc/hmr_spec.ts @@ -800,5 +800,92 @@ runInEachFileSystem(() => { expect(jsContents).toContain('ɵɵreplaceMetadata(Cmp, m.default, [i0, i1], []));'); expect(hmrContents).toContain('function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces) {'); }); + + it('should pass const enums defined in the same file as an object literal', () => { + enableHmr(); + env.write( + 'test.ts', + ` + import {Component, InjectionToken} from '@angular/core'; + + const token = new InjectionToken('TEST'); + + const numberThree = 3; + + export const enum Foo { + one, + two = '2', + three = numberThree + } + + @Component({ + template: '', + providers: [{ + provide: token, + useValue: Foo.three + }] + }) + export class Cmp {} + `, + ); + + env.driveMain(); + + const jsContents = env.getContents('test.js'); + const hmrContents = env.driveHmr('test.ts', 'Cmp'); + expect(jsContents).toContain( + 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [token, { one: 0, two: "2", three: 3 }, Component]));', + ); + expect(hmrContents).toContain( + 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, token, Foo, Component) {', + ); + }); + + it('should pass const enum defined in other file as an object literal', () => { + enableHmr(); + + env.write( + 'deps.ts', + ` + const numberThree = 3; + + export const enum Foo { + one, + two = '2', + three = numberThree + } + `, + ); + + env.write( + 'test.ts', + ` + import {Component, InjectionToken} from '@angular/core'; + import {Foo} from './deps'; + + const token = new InjectionToken('TEST'); + + @Component({ + template: '', + providers: [{ + provide: token, + useValue: Foo.three + }] + }) + export class Cmp {} + `, + ); + + env.driveMain(); + + const jsContents = env.getContents('test.js'); + const hmrContents = env.driveHmr('test.ts', 'Cmp'); + expect(jsContents).toContain( + 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [token, { one: 0, two: "2", three: 3 }, Component]));', + ); + expect(hmrContents).toContain( + 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, token, Foo, Component) {', + ); + }); }); }); diff --git a/packages/compiler/src/render3/r3_hmr_compiler.ts b/packages/compiler/src/render3/r3_hmr_compiler.ts index 9ced9bec414a..1f6e7e2279e5 100644 --- a/packages/compiler/src/render3/r3_hmr_compiler.ts +++ b/packages/compiler/src/render3/r3_hmr_compiler.ts @@ -31,9 +31,9 @@ export interface R3HmrMetadata { /** * HMR update functions cannot contain imports so any locals the generated code depends on * (e.g. references to imports within the same file or imported symbols) have to be passed in - * as function parameters. This array contains the names of those local symbols. + * as function parameters. This array contains the names and runtime representation of the locals. */ - localDependencies: string[]; + localDependencies: {name: string; runtimeRepresentation: o.Expression}[]; } /** HMR dependency on a namespace import. */ @@ -59,7 +59,6 @@ export function compileHmrInitializer(meta: R3HmrMetadata): o.Expression { const dataName = 'd'; const timestampName = 't'; const importCallbackName = `${meta.className}_HmrLoad`; - const locals = meta.localDependencies.map((localName) => o.variable(localName)); const namespaces = meta.namespaceDependencies.map((dep) => { return new o.ExternalExpr({moduleName: dep.moduleName, name: null}); }); @@ -70,7 +69,12 @@ export function compileHmrInitializer(meta: R3HmrMetadata): o.Expression { // ɵɵreplaceMetadata(Comp, m.default, [...namespaces], [...locals]); const replaceCall = o .importExpr(R3.replaceMetadata) - .callFn([meta.type, defaultRead, o.literalArr(namespaces), o.literalArr(locals)]); + .callFn([ + meta.type, + defaultRead, + o.literalArr(namespaces), + o.literalArr(meta.localDependencies.map((l) => l.runtimeRepresentation)), + ]); // (m) => m.default && ɵɵreplaceMetadata(...) const replaceCallback = o.arrowFn([new o.FnParam(moduleName)], defaultRead.and(replaceCall)); @@ -159,11 +163,13 @@ export function compileHmrUpdateCallback( meta: R3HmrMetadata, ): o.DeclareFunctionStmt { const namespaces = 'ɵɵnamespaces'; - const params = [meta.className, namespaces, ...meta.localDependencies].map( - (name) => new o.FnParam(name, o.DYNAMIC_TYPE), - ); + const params = [meta.className, namespaces].map((name) => new o.FnParam(name, o.DYNAMIC_TYPE)); const body: o.Statement[] = []; + for (const local of meta.localDependencies) { + params.push(new o.FnParam(local.name)); + } + // Declare variables that read out the individual namespaces. for (let i = 0; i < meta.namespaceDependencies.length; i++) { body.push( From a97136052f9cfdb696a3b335ed7a1b9fb994d408 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Fri, 31 Jan 2025 00:48:45 -0800 Subject: [PATCH 0014/1000] fix(compiler-cli): gracefully fall back if const enum cannot be passed through (#59815) Adds some logic so that if we can't produce a runtime representation of an enum, the dev server can fall back to refreshing the page. PR Close #59815 --- .../src/ngtsc/hmr/src/extract_dependencies.ts | 20 +++++++++++++------ .../src/ngtsc/hmr/src/metadata.ts | 5 +++++ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/packages/compiler-cli/src/ngtsc/hmr/src/extract_dependencies.ts b/packages/compiler-cli/src/ngtsc/hmr/src/extract_dependencies.ts index 8766ce246ecd..9b17865598aa 100644 --- a/packages/compiler-cli/src/ngtsc/hmr/src/extract_dependencies.ts +++ b/packages/compiler-cli/src/ngtsc/hmr/src/extract_dependencies.ts @@ -39,7 +39,7 @@ export function extractHmrDependencies( ): { local: {name: string; runtimeRepresentation: o.Expression}[]; external: R3HmrNamespaceDependency[]; -} { +} | null { const name = ts.isClassDeclaration(node) && node.name ? node.name.text : null; const visitor = new PotentialTopLevelReadsVisitor(); const sourceFile = node.getSourceFile(); @@ -70,10 +70,13 @@ export function extractHmrDependencies( const readName = readNode instanceof o.ReadVarExpr ? readNode.name : readNode.text; if (readName !== name && !seenLocals.has(readName) && availableTopLevel.has(readName)) { - local.push({ - name: readName, - runtimeRepresentation: getRuntimeRepresentation(readNode, reflection, evaluator), - }); + const runtimeRepresentation = getRuntimeRepresentation(readNode, reflection, evaluator); + + if (runtimeRepresentation === null) { + return null; + } + + local.push({name: readName, runtimeRepresentation}); seenLocals.add(readName); } } @@ -94,7 +97,7 @@ function getRuntimeRepresentation( node: o.ReadVarExpr | ts.Identifier, reflection: ReflectionHost, evaluator: PartialEvaluator, -): o.Expression { +): o.Expression | null { if (node instanceof o.ReadVarExpr) { return o.variable(node.name); } @@ -120,6 +123,11 @@ function getRuntimeRepresentation( quoted: false, value: o.literal(value.resolved), }); + } else { + // TS is pretty restrictive about what values can be in a const enum so our evaluator + // should be able to handle them, however if we happen to hit such a case, we return null + // so the HMR update can be invalidated. + return null; } } diff --git a/packages/compiler-cli/src/ngtsc/hmr/src/metadata.ts b/packages/compiler-cli/src/ngtsc/hmr/src/metadata.ts index dea6514e3faf..fde5817b9269 100644 --- a/packages/compiler-cli/src/ngtsc/hmr/src/metadata.ts +++ b/packages/compiler-cli/src/ngtsc/hmr/src/metadata.ts @@ -62,6 +62,11 @@ export function extractHmrMetatadata( reflection, evaluator, ); + + if (dependencies === null) { + return null; + } + const meta: R3HmrMetadata = { type: new o.WrappedNodeExpr(clazz.name), className: clazz.name.text, From 3769935df785809860b695bf0b5162589a0ae35d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ole=20Martin=20S=C3=B8rli?= <154443885+olemartinsorli@users.noreply.github.com> Date: Fri, 31 Jan 2025 10:45:29 +0100 Subject: [PATCH 0015/1000] docs(migrations): fix misspelled link text in overview.md (#59816) I assume that the link text should read "Try it now" instead of "Try it not". The latter is funnier, but also implies that this migration is not a recommended one. PR Close #59816 --- adev/src/content/reference/migrations/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adev/src/content/reference/migrations/overview.md b/adev/src/content/reference/migrations/overview.md index 132beae45318..1804aa60f795 100644 --- a/adev/src/content/reference/migrations/overview.md +++ b/adev/src/content/reference/migrations/overview.md @@ -24,7 +24,7 @@ Learn about how you can migrate your existing angular project to the latest feat Convert existing decorator query fields to the improved signal queries API. The API is now production ready. - + Clean up unused imports in your project. From 5e9e9bde0d5c00b8ee73e4cdd02f111c040a973e Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Sat, 1 Feb 2025 10:11:11 +0000 Subject: [PATCH 0016/1000] build: update dependency angular-split to v19 (#59827) See associated pull request for more information. PR Close #59827 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 278b86048e37..26fa7244f8e6 100644 --- a/package.json +++ b/package.json @@ -193,7 +193,7 @@ "@webcontainer/api": "^1.3.0-internal.2", "@yarnpkg/lockfile": "^1.1.0", "adm-zip": "^0.5.10", - "angular-split": "^18.0.0", + "angular-split": "^19.0.0", "check-side-effects": "0.0.23", "cldr": "7.6.0", "cldrjs": "0.5.5", diff --git a/yarn.lock b/yarn.lock index 6040ebcbd80b..ed5327fa61f5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5122,10 +5122,10 @@ algoliasearch@^5.0.0: resolved "https://registry.yarnpkg.com/angular-mocks/-/angular-mocks-1.8.3.tgz#c0dd05e5c3fc014e07af6289b23f0e817d7a4724" integrity sha512-vqsT6zwu80cZ8RY7qRQBZuy6Fq5X7/N5hkV9LzNT0c8b546rw4ErGK6muW1u2JnDKYa7+jJuaGM702bWir4HGw== -angular-split@^18.0.0: - version "18.0.0" - resolved "https://registry.yarnpkg.com/angular-split/-/angular-split-18.0.0.tgz#0c79db52df4a7662fd685d09a972fb17d77b0663" - integrity sha512-vreR7dhwg6ubC3ZZn0vJG9Fb+8Xacf77FRQ/3IdChzsRFya1LxJh/Wk7uBk8q9Xi0pOKBKruZ3OWGjhqvHmETg== +angular-split@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/angular-split/-/angular-split-19.0.0.tgz#7ff3db6f0fb8da106c01201e153eed12e3029c7d" + integrity sha512-vQqXWLcCimFmInu2lpGKIfS9FtYBgKmoWenPjeYkHSRdWmb7HLGlQoNPj1oALrwdhIWFPdySgp0BIXDe2IAepQ== dependencies: tslib "^2.0.0" From 146ab9a76e6b4d8db7d08d34e2571ba5207f8756 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Sat, 1 Feb 2025 04:12:16 -0800 Subject: [PATCH 0017/1000] feat(core): support TypeScript 5.8 (#59830) Updates the repo to support TypeScript 5.8 which is currently in beta. PR Close #59830 --- integration/typings_test_ts58/BUILD.bazel | 9 + integration/typings_test_ts58/include-all.ts | 67 ++ integration/typings_test_ts58/package.json | 29 + integration/typings_test_ts58/tsconfig.json | 26 + integration/typings_test_ts58/yarn.lock | 704 ++++++++++++++++++ package.json | 2 +- packages/bazel/package.json | 2 +- packages/compiler-cli/package.json | 2 +- .../compiler-cli/src/ngtsc/core/src/host.ts | 2 +- .../src/ts_create_program_driver.ts | 2 +- .../compiler-cli/src/typescript_support.ts | 2 +- .../test/acceptance/renderer_factory_spec.ts | 2 +- .../instructions/mock_renderer_factory.ts | 2 +- yarn.lock | 5 + 14 files changed, 848 insertions(+), 8 deletions(-) create mode 100644 integration/typings_test_ts58/BUILD.bazel create mode 100644 integration/typings_test_ts58/include-all.ts create mode 100644 integration/typings_test_ts58/package.json create mode 100644 integration/typings_test_ts58/tsconfig.json create mode 100644 integration/typings_test_ts58/yarn.lock diff --git a/integration/typings_test_ts58/BUILD.bazel b/integration/typings_test_ts58/BUILD.bazel new file mode 100644 index 000000000000..8c3ee7710f11 --- /dev/null +++ b/integration/typings_test_ts58/BUILD.bazel @@ -0,0 +1,9 @@ +load("//integration:index.bzl", "ng_integration_test") + +ng_integration_test( + name = "test", + # Special case for `typings_test_ts58` test as we want to pin + # `typescript` at version 5.8.x for that test and not link to the + # root @npm//typescript package. + pinned_npm_packages = ["typescript"], +) diff --git a/integration/typings_test_ts58/include-all.ts b/integration/typings_test_ts58/include-all.ts new file mode 100644 index 000000000000..fd94c30afbf5 --- /dev/null +++ b/integration/typings_test_ts58/include-all.ts @@ -0,0 +1,67 @@ +/** + * @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.dev/license + */ + +import * as animations from '@angular/animations'; +import * as animationsBrowser from '@angular/animations/browser'; +import * as animationsBrowserTesting from '@angular/animations/browser/testing'; +import * as common from '@angular/common'; +import * as commonHttp from '@angular/common/http'; +import * as commonTesting from '@angular/common/testing'; +import * as commonHttpTesting from '@angular/common/http/testing'; +import * as compiler from '@angular/compiler'; +import * as core from '@angular/core'; +import * as coreTesting from '@angular/core/testing'; +import * as elements from '@angular/elements'; +import * as forms from '@angular/forms'; +import * as localize from '@angular/localize'; +import * as platformBrowser from '@angular/platform-browser'; +import * as platformBrowserDynamic from '@angular/platform-browser-dynamic'; +import * as platformBrowserDynamicTesting from '@angular/platform-browser-dynamic/testing'; +import * as platformBrowserAnimations from '@angular/platform-browser/animations'; +import * as platformBrowserTesting from '@angular/platform-browser/testing'; +import * as platformServer from '@angular/platform-server'; +import * as platformServerInit from '@angular/platform-server/init'; +import * as platformServerTesting from '@angular/platform-server/testing'; +import * as router from '@angular/router'; +import * as routerTesting from '@angular/router/testing'; +import * as routerUpgrade from '@angular/router/upgrade'; +import * as serviceWorker from '@angular/service-worker'; +import * as upgrade from '@angular/upgrade'; +import * as upgradeStatic from '@angular/upgrade/static'; +import * as upgradeTesting from '@angular/upgrade/static/testing'; + +export default { + animations, + animationsBrowser, + animationsBrowserTesting, + common, + commonTesting, + commonHttp, + commonHttpTesting, + compiler, + core, + coreTesting, + elements, + forms, + localize, + platformBrowser, + platformBrowserTesting, + platformBrowserDynamic, + platformBrowserDynamicTesting, + platformBrowserAnimations, + platformServer, + platformServerInit, + platformServerTesting, + router, + routerTesting, + routerUpgrade, + serviceWorker, + upgrade, + upgradeStatic, + upgradeTesting, +}; diff --git a/integration/typings_test_ts58/package.json b/integration/typings_test_ts58/package.json new file mode 100644 index 000000000000..d5584625fad6 --- /dev/null +++ b/integration/typings_test_ts58/package.json @@ -0,0 +1,29 @@ +{ + "name": "angular-integration", + "description": "Assert that users with TypeScript 5.8 can type-check an Angular application", + "version": "0.0.0", + "license": "MIT", + "dependencies": { + "@angular/animations": "file:../../dist/packages-dist/animations", + "@angular/common": "file:../../dist/packages-dist/common", + "@angular/compiler": "file:../../dist/packages-dist/compiler", + "@angular/compiler-cli": "file:../../dist/packages-dist/compiler-cli", + "@angular/core": "file:../../dist/packages-dist/core", + "@angular/elements": "file:../../dist/packages-dist/elements", + "@angular/forms": "file:../../dist/packages-dist/forms", + "@angular/localize": "file:../../dist/packages-dist/localize", + "@angular/platform-browser": "file:../../dist/packages-dist/platform-browser", + "@angular/platform-browser-dynamic": "file:../../dist/packages-dist/platform-browser-dynamic", + "@angular/platform-server": "file:../../dist/packages-dist/platform-server", + "@angular/router": "file:../../dist/packages-dist/router", + "@angular/service-worker": "file:../../dist/packages-dist/service-worker", + "@angular/upgrade": "file:../../dist/packages-dist/upgrade", + "@types/jasmine": "file:../../node_modules/@types/jasmine", + "rxjs": "file:../../node_modules/rxjs", + "typescript": "5.8.0-beta", + "zone.js": "0.14.10" + }, + "scripts": { + "test": "tsc" + } +} diff --git a/integration/typings_test_ts58/tsconfig.json b/integration/typings_test_ts58/tsconfig.json new file mode 100644 index 000000000000..9305a8c949c0 --- /dev/null +++ b/integration/typings_test_ts58/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "experimentalDecorators": true, + "module": "commonjs", + "moduleResolution": "node", + "outDir": "./dist/out-tsc", + "rootDir": ".", + "target": "ES2020", + "lib": [ + "es5", + "dom", + "es2015.collection", + "es2015.iterable", + "es2015.promise" + ], + "types": [], + }, + "files": [ + "include-all.ts", + "node_modules/@types/jasmine/index.d.ts" + ] +} diff --git a/integration/typings_test_ts58/yarn.lock b/integration/typings_test_ts58/yarn.lock new file mode 100644 index 000000000000..93ce6ff42df5 --- /dev/null +++ b/integration/typings_test_ts58/yarn.lock @@ -0,0 +1,704 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@angular/animations@file:../../dist/packages-dist/animations": + version "19.2.0-next.0" + dependencies: + tslib "^2.3.0" + +"@angular/common@file:../../dist/packages-dist/common": + version "19.2.0-next.0" + dependencies: + tslib "^2.3.0" + +"@angular/compiler-cli@file:../../dist/packages-dist/compiler-cli": + version "19.2.0-next.0" + dependencies: + "@babel/core" "7.26.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + chokidar "^4.0.0" + convert-source-map "^1.5.1" + reflect-metadata "^0.2.0" + semver "^7.0.0" + tslib "^2.3.0" + yargs "^17.2.1" + +"@angular/compiler@file:../../dist/packages-dist/compiler": + version "19.2.0-next.0" + dependencies: + tslib "^2.3.0" + +"@angular/core@file:../../dist/packages-dist/core": + version "19.2.0-next.0" + dependencies: + tslib "^2.3.0" + +"@angular/elements@file:../../dist/packages-dist/elements": + version "19.2.0-next.0" + dependencies: + tslib "^2.3.0" + +"@angular/forms@file:../../dist/packages-dist/forms": + version "19.2.0-next.0" + dependencies: + tslib "^2.3.0" + +"@angular/localize@file:../../dist/packages-dist/localize": + version "19.2.0-next.0" + dependencies: + "@babel/core" "7.26.0" + "@types/babel__core" "7.20.5" + fast-glob "3.3.3" + yargs "^17.2.1" + +"@angular/platform-browser-dynamic@file:../../dist/packages-dist/platform-browser-dynamic": + version "19.2.0-next.0" + dependencies: + tslib "^2.3.0" + +"@angular/platform-browser@file:../../dist/packages-dist/platform-browser": + version "19.2.0-next.0" + dependencies: + tslib "^2.3.0" + +"@angular/platform-server@file:../../dist/packages-dist/platform-server": + version "19.2.0-next.0" + dependencies: + tslib "^2.3.0" + xhr2 "^0.2.0" + +"@angular/router@file:../../dist/packages-dist/router": + version "19.2.0-next.0" + dependencies: + tslib "^2.3.0" + +"@angular/service-worker@file:../../dist/packages-dist/service-worker": + version "19.2.0-next.0" + dependencies: + tslib "^2.3.0" + +"@angular/upgrade@file:../../dist/packages-dist/upgrade": + version "19.2.0-next.0" + dependencies: + tslib "^2.3.0" + +"@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" + integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== + dependencies: + "@babel/helper-validator-identifier" "^7.25.9" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/compat-data@^7.25.9": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.2.tgz#278b6b13664557de95b8f35b90d96785850bb56e" + integrity sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg== + +"@babel/core@7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" + integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.26.0" + "@babel/generator" "^7.26.0" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helpers" "^7.26.0" + "@babel/parser" "^7.26.0" + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.26.0" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.25.9", "@babel/generator@^7.26.0": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.2.tgz#87b75813bec87916210e5e01939a4c823d6bb74f" + integrity sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw== + dependencies: + "@babel/parser" "^7.26.2" + "@babel/types" "^7.26.0" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + +"@babel/helper-compilation-targets@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875" + integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ== + dependencies: + "@babel/compat-data" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-module-imports@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" + integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-module-transforms@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" + integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/helper-string-parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== + +"@babel/helper-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== + +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== + +"@babel/helper-validator-option@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" + integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== + +"@babel/helpers@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4" + integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw== + dependencies: + "@babel/template" "^7.25.9" + "@babel/types" "^7.26.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.20.7": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f" + integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q== + dependencies: + "@babel/types" "^7.25.6" + +"@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.2": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.2.tgz#fd7b6f487cfea09889557ef5d4eeb9ff9a5abd11" + integrity sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ== + dependencies: + "@babel/types" "^7.26.0" + +"@babel/template@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" + integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/traverse@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84" + integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/generator" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/template" "^7.25.9" + "@babel/types" "^7.25.9" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6" + integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw== + dependencies: + "@babel/helper-string-parser" "^7.24.8" + "@babel/helper-validator-identifier" "^7.24.7" + to-fast-properties "^2.0.0" + +"@babel/types@^7.25.9", "@babel/types@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff" + integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA== + dependencies: + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@types/babel__core@7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.8" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*": + version "7.20.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== + dependencies: + "@babel/types" "^7.20.7" + +"@types/jasmine@file:../../node_modules/@types/jasmine": + version "5.1.5" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browserslist@^4.24.0: + version "4.24.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.2.tgz#f5845bc91069dbd55ee89faf9822e1d885d16580" + integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg== + dependencies: + caniuse-lite "^1.0.30001669" + electron-to-chromium "^1.5.41" + node-releases "^2.0.18" + update-browserslist-db "^1.1.1" + +caniuse-lite@^1.0.30001669: + version "1.0.30001684" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001684.tgz#0eca437bab7d5f03452ff0ef9de8299be6b08e16" + integrity sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ== + +chokidar@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.1.tgz#4a6dff66798fb0f72a94f616abbd7e1a19f31d41" + integrity sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA== + dependencies: + readdirp "^4.0.1" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +convert-source-map@^1.5.1: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +debug@^4.1.0, debug@^4.3.1: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + +electron-to-chromium@^1.5.41: + version "1.5.64" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.64.tgz#ac8c4c89075d35a1514b620f47dfe48a71ec3697" + integrity sha512-IXEuxU+5ClW2IGEYFC2T7szbyVgehupCWQe5GNh+H065CD6U6IFN0s4KeAMFGNmQolRU4IV7zGBWSYMmZ8uuqQ== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +fast-glob@3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== + 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" + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +jsesc@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== + +picocolors@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" + integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== + +picocolors@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +readdirp@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.2.tgz#388fccb8b75665da3abffe2d8f8ed59fe74c230a" + integrity sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA== + +reflect-metadata@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz#400c845b6cba87a21f2c65c4aeb158f4fa4d9c5b" + integrity sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +"rxjs@file:../../node_modules/rxjs": + version "7.8.1" + dependencies: + tslib "^2.1.0" + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.0.0: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + 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" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tslib@^2.1.0, tslib@^2.3.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== + +typescript@5.8.0-beta: + version "5.8.0-beta" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.0-beta.tgz#ba16fac5715be6540d01f0a9778f5eab7ae2ec61" + integrity sha512-7VGUiBOGi+BYhiuy3iITIgu6m2wVW2Vb4CW+OJsW6OJS/TgvezKbAN3WBfiSErE8QOLdce0ilm6VANMkzNWW1A== + +update-browserslist-db@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" + integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +xhr2@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.2.1.tgz#4e73adc4f9cfec9cbd2157f73efdce3a5f108a93" + integrity sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.2.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +zone.js@0.14.10: + version "0.14.10" + resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.14.10.tgz#23b8b29687c6bffece996e5ee5b854050e7775c8" + integrity sha512-YGAhaO7J5ywOXW6InXNlLmfU194F8lVgu7bRntUF3TiG8Y3nBK0x1UJJuHUP/e8IyihkjCYqhCScpSwnlaSRkQ== diff --git a/package.json b/package.json index 26fa7244f8e6..aec3b444972f 100644 --- a/package.json +++ b/package.json @@ -148,7 +148,7 @@ "tslib": "^2.3.0", "tslint": "6.1.3", "tsx": "^4.7.2", - "typescript": "5.7.3", + "typescript": "5.8.0-beta", "webtreemap": "^2.0.1", "ws": "^8.15.0", "xhr2": "0.2.1", diff --git a/packages/bazel/package.json b/packages/bazel/package.json index 478a44e83cfa..6c9897676cd0 100644 --- a/packages/bazel/package.json +++ b/packages/bazel/package.json @@ -35,7 +35,7 @@ "rollup": "^2.56.3", "rollup-plugin-sourcemaps": "^0.6.3", "terser": "^5.9.0", - "typescript": ">=5.5 <5.8" + "typescript": ">=5.5 <5.9" }, "peerDependenciesMeta": { "terser": { diff --git a/packages/compiler-cli/package.json b/packages/compiler-cli/package.json index 427ed896a2a2..ca4bcbca50b1 100644 --- a/packages/compiler-cli/package.json +++ b/packages/compiler-cli/package.json @@ -54,7 +54,7 @@ }, "peerDependencies": { "@angular/compiler": "0.0.0-PLACEHOLDER", - "typescript": ">=5.5 <5.8" + "typescript": ">=5.5 <5.9" }, "repository": { "type": "git", diff --git a/packages/compiler-cli/src/ngtsc/core/src/host.ts b/packages/compiler-cli/src/ngtsc/core/src/host.ts index 6b3f8f67cd45..2f4feb1cd280 100644 --- a/packages/compiler-cli/src/ngtsc/core/src/host.ts +++ b/packages/compiler-cli/src/ngtsc/core/src/host.ts @@ -121,7 +121,7 @@ export class DelegatingCompilerHost ): ExtendedTsCompilerHost[M] { return this.delegate[name] !== undefined ? (this.delegate[name] as any).bind(this.delegate) - : undefined; + : undefined!; } } diff --git a/packages/compiler-cli/src/ngtsc/program_driver/src/ts_create_program_driver.ts b/packages/compiler-cli/src/ngtsc/program_driver/src/ts_create_program_driver.ts index f67d5c9d8e70..319c7d6a4580 100644 --- a/packages/compiler-cli/src/ngtsc/program_driver/src/ts_create_program_driver.ts +++ b/packages/compiler-cli/src/ngtsc/program_driver/src/ts_create_program_driver.ts @@ -100,7 +100,7 @@ export class DelegatingCompilerHost private delegateMethod(name: M): ts.CompilerHost[M] { return this.delegate[name] !== undefined ? (this.delegate[name] as any).bind(this.delegate) - : undefined; + : undefined!; } } diff --git a/packages/compiler-cli/src/typescript_support.ts b/packages/compiler-cli/src/typescript_support.ts index 15b67b259635..f4dda0929734 100644 --- a/packages/compiler-cli/src/typescript_support.ts +++ b/packages/compiler-cli/src/typescript_support.ts @@ -26,7 +26,7 @@ const MIN_TS_VERSION = '5.5.0'; * Note: this check is disabled in g3, search for * `angularCompilerOptions.disableTypeScriptVersionCheck` config param value in g3. */ -const MAX_TS_VERSION = '5.8.0'; +const MAX_TS_VERSION = '5.9.0'; /** * The currently used version of TypeScript, which can be adjusted for testing purposes using diff --git a/packages/core/test/acceptance/renderer_factory_spec.ts b/packages/core/test/acceptance/renderer_factory_spec.ts index 9aa64e365ccb..b907a6a63747 100644 --- a/packages/core/test/acceptance/renderer_factory_spec.ts +++ b/packages/core/test/acceptance/renderer_factory_spec.ts @@ -574,7 +574,7 @@ class MockRenderer implements Renderer2 { } selectRootElement(selectorOrNode: string | any): RElement { return typeof selectorOrNode === 'string' - ? document.querySelector(selectorOrNode) + ? document.querySelector(selectorOrNode)! : selectorOrNode; } parentNode(node: Node): Element | null { diff --git a/packages/core/test/render3/instructions/mock_renderer_factory.ts b/packages/core/test/render3/instructions/mock_renderer_factory.ts index baa8eda4f428..7a3b6c74cf22 100644 --- a/packages/core/test/render3/instructions/mock_renderer_factory.ts +++ b/packages/core/test/render3/instructions/mock_renderer_factory.ts @@ -46,7 +46,7 @@ class MockRenderer implements Renderer { } selectRootElement(selectorOrNode: string | any): RElement { return typeof selectorOrNode === 'string' - ? document.querySelector(selectorOrNode) + ? document.querySelector(selectorOrNode)! : selectorOrNode; } parentNode(node: Node): RElement | null { diff --git a/yarn.lock b/yarn.lock index ed5327fa61f5..c86db7afd00f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17024,6 +17024,11 @@ typescript@5.7.3, typescript@^5.4.4, typescript@^5.4.5, typescript@^5.5.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.3.tgz#919b44a7dbb8583a9b856d162be24a54bf80073e" integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw== +typescript@5.8.0-beta: + version "5.8.0-beta" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.0-beta.tgz#ba16fac5715be6540d01f0a9778f5eab7ae2ec61" + integrity sha512-7VGUiBOGi+BYhiuy3iITIgu6m2wVW2Vb4CW+OJsW6OJS/TgvezKbAN3WBfiSErE8QOLdce0ilm6VANMkzNWW1A== + typescript@~4.9.0: version "4.9.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" From e3dcf523ea0d36139c650950d407b0b8e96f9184 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Thu, 30 Jan 2025 15:58:11 -0800 Subject: [PATCH 0018/1000] refactor(core): move directive matching logic to a separate file (#59843) Move directive matching logic to a separate file. PR Close #59843 --- packages/core/src/render3/component_ref.ts | 3 +- packages/core/src/render3/i18n/i18n_parse.ts | 3 +- .../core/src/render3/instructions/element.ts | 18 +- .../render3/instructions/element_container.ts | 12 +- .../core/src/render3/instructions/shared.ts | 668 +----------------- .../core/src/render3/instructions/template.ts | 19 +- .../core/src/render3/view/construction.ts | 47 ++ packages/core/src/render3/view/directives.ts | 660 +++++++++++++++++ .../bundle.golden_symbols.json | 1 + .../animations/bundle.golden_symbols.json | 1 + .../cyclic_import/bundle.golden_symbols.json | 1 + .../bundling/defer/bundle.golden_symbols.json | 3 + .../forms_reactive/bundle.golden_symbols.json | 1 + .../bundle.golden_symbols.json | 1 + .../router/bundle.golden_symbols.json | 1 + .../bundling/todo/bundle.golden_symbols.json | 1 + 16 files changed, 768 insertions(+), 672 deletions(-) create mode 100644 packages/core/src/render3/view/construction.ts create mode 100644 packages/core/src/render3/view/directives.ts diff --git a/packages/core/src/render3/component_ref.ts b/packages/core/src/render3/component_ref.ts index 6b32847999be..e4403315489c 100644 --- a/packages/core/src/render3/component_ref.ts +++ b/packages/core/src/render3/component_ref.ts @@ -41,9 +41,7 @@ import { createLView, createTView, getInitialLViewFlagsFromDef, - initializeDirectives, locateHostElement, - resolveHostDirectives, setInputsForProperty, } from './instructions/shared'; import {ComponentDef, DirectiveDef} from './interfaces/definition'; @@ -86,6 +84,7 @@ import {getOrCreateTNode} from './tnode_manipulation'; import {mergeHostAttrs} from './util/attrs_utils'; import {debugStringifyTypeForError, stringifyForError} from './util/stringify_utils'; import {getComponentLViewByIndex, getTNode} from './util/view_utils'; +import {initializeDirectives, resolveHostDirectives} from './view/directives'; import {ViewRef} from './view_ref'; export class ComponentFactoryResolver extends AbstractComponentFactoryResolver { diff --git a/packages/core/src/render3/i18n/i18n_parse.ts b/packages/core/src/render3/i18n/i18n_parse.ts index ca5343361808..6361cdfe213d 100644 --- a/packages/core/src/render3/i18n/i18n_parse.ts +++ b/packages/core/src/render3/i18n/i18n_parse.ts @@ -26,7 +26,7 @@ import { } from '../../util/assert'; import {CharCode} from '../../util/char_code'; import {loadIcuContainerVisitor} from '../instructions/i18n_icu_container_visitor'; -import {allocExpando} from '../instructions/shared'; + import {getDocument} from '../interfaces/document'; import { ELEMENT_MARKER, @@ -69,6 +69,7 @@ import { setTNodeInsertBeforeIndex, } from './i18n_util'; import {createTNodeAtIndex} from '../tnode_manipulation'; +import {allocExpando} from '../view/construction'; const BINDING_REGEXP = /�(\d+):?\d*�/gi; const ICU_REGEXP = /({\s*�\d+:?\d*�\s*,\s*\S{6}\s*,[\s\S]*})/gi; diff --git a/packages/core/src/render3/instructions/element.ts b/packages/core/src/render3/instructions/element.ts index 62d4ff553da0..de52675d3b5d 100644 --- a/packages/core/src/render3/instructions/element.ts +++ b/packages/core/src/render3/instructions/element.ts @@ -52,6 +52,7 @@ import { decreaseElementDepthCount, enterSkipHydrationBlock, getBindingIndex, + getBindingsEnabled, getCurrentTNode, getElementDepthCount, getLView, @@ -68,16 +69,18 @@ import { wasLastNodeCreated, } from '../state'; import {computeStaticStyling} from '../styling/static_styling'; +import {mergeHostAttrs} from '../util/attrs_utils'; import {getConstant} from '../util/view_utils'; import {validateElementIsKnown} from './element_validation'; import {setDirectiveInputsWhichShadowsStyling} from './property'; import { createDirectivesInstancesInInstruction, - resolveDirectives, + findDirectiveDefMatches, saveResolvedLocalsInData, } from './shared'; import {getOrCreateTNode} from '../tnode_manipulation'; +import {resolveDirectives} from '../view/directives'; function elementStartFirstCreatePass( index: number, @@ -94,7 +97,18 @@ function elementStartFirstCreatePass( const attrs = getConstant(tViewConsts, attrsIndex); const tNode = getOrCreateTNode(tView, index, TNodeType.Element, name, attrs); - resolveDirectives(tView, lView, tNode, getConstant(tViewConsts, localRefsIndex)); + if (getBindingsEnabled()) { + resolveDirectives( + tView, + lView, + tNode, + getConstant(tViewConsts, localRefsIndex), + findDirectiveDefMatches, + ); + } + + // Merge the template attrs last so that they have the highest priority. + tNode.mergedAttrs = mergeHostAttrs(tNode.mergedAttrs, tNode.attrs); if (tNode.attrs !== null) { computeStaticStyling(tNode, tNode.attrs, false); diff --git a/packages/core/src/render3/instructions/element_container.ts b/packages/core/src/render3/instructions/element_container.ts index e1791e37b0bb..443df005e6b5 100644 --- a/packages/core/src/render3/instructions/element_container.ts +++ b/packages/core/src/render3/instructions/element_container.ts @@ -28,6 +28,7 @@ import {appendChild} from '../node_manipulation'; import {createCommentNode} from '../dom_node_manipulation'; import { getBindingIndex, + getBindingsEnabled, getCurrentTNode, getLView, getTView, @@ -39,14 +40,16 @@ import { wasLastNodeCreated, } from '../state'; import {computeStaticStyling} from '../styling/static_styling'; +import {mergeHostAttrs} from '../util/attrs_utils'; import {getConstant} from '../util/view_utils'; import { createDirectivesInstancesInInstruction, - resolveDirectives, + findDirectiveDefMatches, saveResolvedLocalsInData, } from './shared'; import {getOrCreateTNode} from '../tnode_manipulation'; +import {resolveDirectives} from '../view/directives'; function elementContainerStartFirstCreatePass( index: number, @@ -68,7 +71,12 @@ function elementContainerStartFirstCreatePass( } const localRefs = getConstant(tViewConsts, localRefsIndex); - resolveDirectives(tView, lView, tNode, localRefs); + if (getBindingsEnabled()) { + resolveDirectives(tView, lView, tNode, localRefs, findDirectiveDefMatches); + } + + // Merge the template attrs last so that they have the highest priority. + tNode.mergedAttrs = mergeHostAttrs(tNode.mergedAttrs, tNode.attrs); if (tView.queries !== null) { tView.queries.elementStart(tView, tNode); diff --git a/packages/core/src/render3/instructions/shared.ts b/packages/core/src/render3/instructions/shared.ts index 10f7b647bd21..fad9b141c122 100644 --- a/packages/core/src/render3/instructions/shared.ts +++ b/packages/core/src/render3/instructions/shared.ts @@ -8,57 +8,34 @@ import {Injector} from '../../di/injector'; import {ErrorHandler} from '../../error_handler'; -import {RuntimeError, RuntimeErrorCode} from '../../errors'; import {DehydratedView} from '../../hydration/interfaces'; import {hasSkipHydrationAttrOnRElement} from '../../hydration/skip_hydration'; import {PRESERVE_HOST_CONTENT, PRESERVE_HOST_CONTENT_DEFAULT} from '../../hydration/tokens'; import {processTextNodeMarkersBeforeHydration} from '../../hydration/utils'; -import {DoCheck, OnChanges, OnInit} from '../../interface/lifecycle_hooks'; -import {Writable} from '../../interface/type'; import {SchemaMetadata} from '../../metadata/schema'; import {ViewEncapsulation} from '../../metadata/view'; import { validateAgainstEventAttributes, validateAgainstEventProperties, } from '../../sanitization/sanitization'; -import { - assertDefined, - assertEqual, - assertGreaterThan, - assertGreaterThanOrEqual, - assertIndexInRange, - assertNotEqual, - assertNotSame, - assertSame, -} from '../../util/assert'; +import {assertDefined, assertEqual, assertIndexInRange, assertNotSame} from '../../util/assert'; import {escapeCommentText} from '../../util/dom'; import {normalizeDebugBindingName, normalizeDebugBindingValue} from '../../util/ng_reflect'; import {stringify} from '../../util/stringify'; -import { - assertFirstCreatePass, - assertFirstUpdatePass, - assertLView, - assertNoDuplicateDirectives, - assertTNodeForLView, -} from '../assert'; +import {assertFirstCreatePass, assertLView, assertTNodeForLView} from '../assert'; import {attachPatchData} from '../context_discovery'; -import {getFactoryDef} from '../definition_factory'; -import {diPublicInInjector, getNodeInjectable, getOrCreateNodeInjectorForNode} from '../di'; +import {getNodeInjectable, getOrCreateNodeInjectorForNode} from '../di'; import {throwMultipleComponentError} from '../errors'; -import {AttributeMarker} from '../interfaces/attribute_marker'; import {CONTAINER_HEADER_OFFSET, LContainer} from '../interfaces/container'; import { ComponentDef, ComponentTemplate, DirectiveDef, DirectiveDefListOrFactory, - HostDirectiveBindingMap, - HostDirectiveDefs, PipeDefListOrFactory, RenderFlags, ViewQueriesFunction, } from '../interfaces/definition'; -import {NodeInjectorFactory} from '../interfaces/injector'; import {InputFlags} from '../interfaces/input_flags'; import {getUniqueLViewId} from '../interfaces/lview_tracking'; import { @@ -66,8 +43,6 @@ import { InitialInputs, LocalRefExtractor, NodeInputBindings, - NodeOutputBindings, - TAttributes, TConstantsOrFactory, TContainerNode, TDirectiveHostNode, @@ -92,7 +67,6 @@ import { FLAGS, HEADER_OFFSET, HOST, - HostBindingOpCodes, HYDRATION, ID, INJECTOR, @@ -109,7 +83,7 @@ import { TViewType, } from '../interfaces/view'; import {assertTNodeType} from '../node_assert'; -import {isInlineTemplate, isNodeMatchingSelectorList} from '../node_selector_matcher'; +import {isNodeMatchingSelectorList} from '../node_selector_matcher'; import {profiler} from '../profiler'; import {ProfilerEvent} from '../profiler_types'; import { @@ -121,7 +95,6 @@ import { setSelectedIndex, } from '../state'; import {NO_CHANGE} from '../tokens'; -import {mergeHostAttrs} from '../util/attrs_utils'; import {INTERPOLATION_DELIMITER} from '../util/misc_utils'; import {renderStringify} from '../util/stringify_utils'; import { @@ -133,7 +106,6 @@ import { import {clearElementContents} from '../dom_node_manipulation'; import {selectIndexInternal} from './advance'; -import {ɵɵdirectiveInject} from './di'; import {handleUnknownPropertyError, isPropertyValid, matchingSchemas} from './element_validation'; import {writeToDirectiveInput} from './write_to_directive_input'; @@ -190,43 +162,6 @@ export function createLView( return lView as LView; } -/** - * When elements are created dynamically after a view blueprint is created (e.g. through - * i18nApply()), we need to adjust the blueprint for future - * template passes. - * - * @param tView `TView` associated with `LView` - * @param lView The `LView` containing the blueprint to adjust - * @param numSlotsToAlloc The number of slots to alloc in the LView, should be >0 - * @param initialValue Initial value to store in blueprint - */ -export function allocExpando( - tView: TView, - lView: LView, - numSlotsToAlloc: number, - initialValue: any, -): number { - if (numSlotsToAlloc === 0) return -1; - if (ngDevMode) { - assertFirstCreatePass(tView); - assertSame(tView, lView[TVIEW], '`LView` must be associated with `TView`!'); - assertEqual(tView.data.length, lView.length, 'Expecting LView to be same size as TView'); - assertEqual( - tView.data.length, - tView.blueprint.length, - 'Expecting Blueprint to be same size as TView', - ); - assertFirstUpdatePass(tView); - } - const allocIdx = lView.length; - for (let i = 0; i < numSlotsToAlloc; i++) { - lView.push(initialValue); - tView.blueprint.push(initialValue); - tView.data.push(null); - } - return allocIdx; -} - export function executeTemplate( tView: TView, lView: LView, @@ -502,211 +437,6 @@ export function enableApplyRootElementTransformImpl() { _applyRootElementTransformImpl = applyRootElementTransformImpl; } -/** Mode for capturing node bindings. */ -const enum CaptureNodeBindingMode { - Inputs, - Outputs, -} - -/** - * Captures node input bindings for the given directive based on the inputs metadata. - * This will be called multiple times to combine inputs from various directives on a node. - * - * The host binding alias map is used to alias and filter out properties for host directives. - * If the mapping is provided, it'll act as an allowlist, as well as a mapping of what public - * name inputs/outputs should be exposed under. - */ -function captureNodeBindings( - mode: CaptureNodeBindingMode.Inputs, - inputs: DirectiveDef['inputs'], - directiveIndex: number, - bindingsResult: NodeInputBindings | null, - hostDirectiveAliasMap: HostDirectiveBindingMap | null, -): NodeInputBindings | null; -/** - * Captures node output bindings for the given directive based on the output metadata. - * This will be called multiple times to combine inputs from various directives on a node. - * - * The host binding alias map is used to alias and filter out properties for host directives. - * If the mapping is provided, it'll act as an allowlist, as well as a mapping of what public - * name inputs/outputs should be exposed under. - */ -function captureNodeBindings( - mode: CaptureNodeBindingMode.Outputs, - outputs: DirectiveDef['outputs'], - directiveIndex: number, - bindingsResult: NodeOutputBindings | null, - hostDirectiveAliasMap: HostDirectiveBindingMap | null, -): NodeOutputBindings | null; - -function captureNodeBindings( - mode: CaptureNodeBindingMode, - aliasMap: DirectiveDef['inputs'] | DirectiveDef['outputs'], - directiveIndex: number, - bindingsResult: NodeInputBindings | NodeOutputBindings | null, - hostDirectiveAliasMap: HostDirectiveBindingMap | null, -): NodeInputBindings | NodeOutputBindings | null { - for (let publicName in aliasMap) { - if (!aliasMap.hasOwnProperty(publicName)) { - continue; - } - - const value = aliasMap[publicName]; - if (value === undefined) { - continue; - } - - bindingsResult ??= {}; - - let internalName: string; - let inputFlags = InputFlags.None; - - // For inputs, the value might be an array capturing additional - // input flags. - if (Array.isArray(value)) { - internalName = value[0]; - inputFlags = value[1]; - } else { - internalName = value; - } - - // If there are no host directive mappings, we want to remap using the alias map from the - // definition itself. If there is an alias map, it has two functions: - // 1. It serves as an allowlist of bindings that are exposed by the host directives. Only the - // ones inside the host directive map will be exposed on the host. - // 2. The public name of the property is aliased using the host directive alias map, rather - // than the alias map from the definition. - let finalPublicName: string = publicName; - if (hostDirectiveAliasMap !== null) { - // If there is no mapping, it's not part of the allowlist and this input/output - // is not captured and should be ignored. - if (!hostDirectiveAliasMap.hasOwnProperty(publicName)) { - continue; - } - finalPublicName = hostDirectiveAliasMap[publicName]; - } - - if (mode === CaptureNodeBindingMode.Inputs) { - addPropertyBinding( - bindingsResult as NodeInputBindings, - directiveIndex, - finalPublicName, - internalName, - inputFlags, - ); - } else { - addPropertyBinding( - bindingsResult as NodeOutputBindings, - directiveIndex, - finalPublicName, - internalName, - ); - } - } - return bindingsResult; -} - -function addPropertyBinding( - bindings: NodeInputBindings, - directiveIndex: number, - publicName: string, - internalName: string, - inputFlags: InputFlags, -): void; -function addPropertyBinding( - bindings: NodeOutputBindings, - directiveIndex: number, - publicName: string, - internalName: string, -): void; - -function addPropertyBinding( - bindings: NodeInputBindings | NodeOutputBindings, - directiveIndex: number, - publicName: string, - internalName: string, - inputFlags?: InputFlags, -) { - let values: (typeof bindings)[typeof publicName]; - - if (bindings.hasOwnProperty(publicName)) { - (values = bindings[publicName]).push(directiveIndex, internalName); - } else { - values = bindings[publicName] = [directiveIndex, internalName]; - } - - if (inputFlags !== undefined) { - (values as NodeInputBindings[typeof publicName]).push(inputFlags); - } -} - -/** - * Initializes data structures required to work with directive inputs and outputs. - * Initialization is done for all directives matched on a given TNode. - */ -function initializeInputAndOutputAliases( - tView: TView, - tNode: TNode, - hostDirectiveDefinitionMap: HostDirectiveDefs | null, -): void { - ngDevMode && assertFirstCreatePass(tView); - - const start = tNode.directiveStart; - const end = tNode.directiveEnd; - const tViewData = tView.data; - - const tNodeAttrs = tNode.attrs; - const inputsFromAttrs: InitialInputData = []; - let inputsStore: NodeInputBindings | null = null; - let outputsStore: NodeOutputBindings | null = null; - - for (let directiveIndex = start; directiveIndex < end; directiveIndex++) { - const directiveDef = tViewData[directiveIndex] as DirectiveDef; - const aliasData = hostDirectiveDefinitionMap - ? hostDirectiveDefinitionMap.get(directiveDef) - : null; - const aliasedInputs = aliasData ? aliasData.inputs : null; - const aliasedOutputs = aliasData ? aliasData.outputs : null; - - inputsStore = captureNodeBindings( - CaptureNodeBindingMode.Inputs, - directiveDef.inputs, - directiveIndex, - inputsStore, - aliasedInputs, - ); - outputsStore = captureNodeBindings( - CaptureNodeBindingMode.Outputs, - directiveDef.outputs, - directiveIndex, - outputsStore, - aliasedOutputs, - ); - // Do not use unbound attributes as inputs to structural directives, since structural - // directive inputs can only be set using microsyntax (e.g. `
`). - // TODO(FW-1930): microsyntax expressions may also contain unbound/static attributes, which - // should be set for inline templates. - const initialInputs = - inputsStore !== null && tNodeAttrs !== null && !isInlineTemplate(tNode) - ? generateInitialInputs(inputsStore, directiveIndex, tNodeAttrs) - : null; - inputsFromAttrs.push(initialInputs); - } - - if (inputsStore !== null) { - if (inputsStore.hasOwnProperty('class')) { - tNode.flags |= TNodeFlags.hasClassInput; - } - if (inputsStore.hasOwnProperty('style')) { - tNode.flags |= TNodeFlags.hasStyleInput; - } - } - - tNode.initialInputs = inputsFromAttrs; - tNode.inputs = inputsStore; - tNode.outputs = outputsStore; -} - /** * Mapping between attributes names that don't correspond to their element property names. * @@ -826,169 +556,6 @@ export function setNgReflectProperties( } } -/** - * Resolve the matched directives on a node. - */ -export function resolveDirectives( - tView: TView, - lView: LView, - tNode: TElementNode | TContainerNode | TElementContainerNode, - localRefs: string[] | null, -): void { - // Please make sure to have explicit type for `exportsMap`. Inferred type triggers bug in - // tsickle. - ngDevMode && assertFirstCreatePass(tView); - - if (getBindingsEnabled()) { - const exportsMap: {[key: string]: number} | null = localRefs === null ? null : {'': -1}; - const matchedDirectiveDefs = findDirectiveDefMatches(tView, tNode); - - if (matchedDirectiveDefs !== null) { - const [directiveDefs, hostDirectiveDefs] = resolveHostDirectives( - tView, - tNode, - matchedDirectiveDefs, - ); - initializeDirectives(tView, lView, tNode, directiveDefs, exportsMap, hostDirectiveDefs); - } - if (exportsMap) cacheMatchingLocalNames(tNode, localRefs, exportsMap); - } - - // Merge the template attrs last so that they have the highest priority. - tNode.mergedAttrs = mergeHostAttrs(tNode.mergedAttrs, tNode.attrs); -} - -/** Initializes the data structures necessary for a list of directives to be instantiated. */ -export function initializeDirectives( - tView: TView, - lView: LView, - tNode: TElementNode | TContainerNode | TElementContainerNode, - directives: DirectiveDef[], - exportsMap: {[key: string]: number} | null, - hostDirectiveDefs: HostDirectiveDefs | null, -) { - ngDevMode && assertFirstCreatePass(tView); - - // Publishes the directive types to DI so they can be injected. Needs to - // happen in a separate pass before the TNode flags have been initialized. - for (let i = 0; i < directives.length; i++) { - diPublicInInjector(getOrCreateNodeInjectorForNode(tNode, lView), tView, directives[i].type); - } - - initTNodeFlags(tNode, tView.data.length, directives.length); - - // When the same token is provided by several directives on the same node, some rules apply in - // the viewEngine: - // - viewProviders have priority over providers - // - the last directive in NgModule.declarations has priority over the previous one - // So to match these rules, the order in which providers are added in the arrays is very - // important. - for (let i = 0; i < directives.length; i++) { - const def = directives[i]; - if (def.providersResolver) def.providersResolver(def); - } - let preOrderHooksFound = false; - let preOrderCheckHooksFound = false; - let directiveIdx = allocExpando(tView, lView, directives.length, null); - ngDevMode && - assertSame( - directiveIdx, - tNode.directiveStart, - 'TNode.directiveStart should point to just allocated space', - ); - - for (let i = 0; i < directives.length; i++) { - const def = directives[i]; - // Merge the attrs in the order of matches. This assumes that the first directive is the - // component itself, so that the component has the least priority. - tNode.mergedAttrs = mergeHostAttrs(tNode.mergedAttrs, def.hostAttrs); - - configureViewWithDirective(tView, tNode, lView, directiveIdx, def); - saveNameToExportMap(directiveIdx, def, exportsMap); - - if (def.contentQueries !== null) tNode.flags |= TNodeFlags.hasContentQuery; - if (def.hostBindings !== null || def.hostAttrs !== null || def.hostVars !== 0) - tNode.flags |= TNodeFlags.hasHostBindings; - - const lifeCycleHooks: Partial = def.type.prototype; - // Only push a node index into the preOrderHooks array if this is the first - // pre-order hook found on this node. - if ( - !preOrderHooksFound && - (lifeCycleHooks.ngOnChanges || lifeCycleHooks.ngOnInit || lifeCycleHooks.ngDoCheck) - ) { - // We will push the actual hook function into this array later during dir instantiation. - // We cannot do it now because we must ensure hooks are registered in the same - // order that directives are created (i.e. injection order). - (tView.preOrderHooks ??= []).push(tNode.index); - preOrderHooksFound = true; - } - - if (!preOrderCheckHooksFound && (lifeCycleHooks.ngOnChanges || lifeCycleHooks.ngDoCheck)) { - (tView.preOrderCheckHooks ??= []).push(tNode.index); - preOrderCheckHooksFound = true; - } - - directiveIdx++; - } - - initializeInputAndOutputAliases(tView, tNode, hostDirectiveDefs); -} - -/** - * Add `hostBindings` to the `TView.hostBindingOpCodes`. - * - * @param tView `TView` to which the `hostBindings` should be added. - * @param tNode `TNode` the element which contains the directive - * @param directiveIdx Directive index in view. - * @param directiveVarsIdx Where will the directive's vars be stored - * @param def `ComponentDef`/`DirectiveDef`, which contains the `hostVars`/`hostBindings` to add. - */ -export function registerHostBindingOpCodes( - tView: TView, - tNode: TNode, - directiveIdx: number, - directiveVarsIdx: number, - def: ComponentDef | DirectiveDef, -): void { - ngDevMode && assertFirstCreatePass(tView); - - const hostBindings = def.hostBindings; - if (hostBindings) { - let hostBindingOpCodes = tView.hostBindingOpCodes; - if (hostBindingOpCodes === null) { - hostBindingOpCodes = tView.hostBindingOpCodes = [] as any as HostBindingOpCodes; - } - const elementIndx = ~tNode.index; - if (lastSelectedElementIdx(hostBindingOpCodes) != elementIndx) { - // Conditionally add select element so that we are more efficient in execution. - // NOTE: this is strictly not necessary and it trades code size for runtime perf. - // (We could just always add it.) - hostBindingOpCodes.push(elementIndx); - } - hostBindingOpCodes.push(directiveIdx, directiveVarsIdx, hostBindings); - } -} - -/** - * Returns the last selected element index in the `HostBindingOpCodes` - * - * For perf reasons we don't need to update the selected element index in `HostBindingOpCodes` only - * if it changes. This method returns the last index (or '0' if not found.) - * - * Selected element index are only the ones which are negative. - */ -function lastSelectedElementIdx(hostBindingOpCodes: HostBindingOpCodes): number { - let i = hostBindingOpCodes.length; - while (i > 0) { - const value = hostBindingOpCodes[--i]; - if (typeof value === 'number' && value < 0) { - return value; - } - } - return 0; -} - /** * Instantiate all the directives that were previously resolved on the current node. */ @@ -1065,7 +632,7 @@ export function invokeHostBindingsInCreationMode(def: DirectiveDef, directi * Matches the current node against all available selectors. * If a component is matched (at most one), it is returned in first position in the array. */ -function findDirectiveDefMatches( +export function findDirectiveDefMatches( tView: TView, tNode: TElementNode | TContainerNode | TElementContainerNode, ): DirectiveDef[] | null { @@ -1105,168 +672,6 @@ function findDirectiveDefMatches( return matches; } -export function resolveHostDirectives( - tView: TView, - tNode: TNode, - matches: DirectiveDef[], -): [matches: DirectiveDef[], hostDirectiveDefs: HostDirectiveDefs | null] { - const allDirectiveDefs: DirectiveDef[] = []; - let hostDirectiveDefs: HostDirectiveDefs | null = null; - - for (const def of matches) { - if (def.findHostDirectiveDefs !== null) { - // TODO(pk): probably could return matches instead of taking in an array to fill in? - hostDirectiveDefs ??= new Map(); - // Components are inserted at the front of the matches array so that their lifecycle - // hooks run before any directive lifecycle hooks. This appears to be for ViewEngine - // compatibility. This logic doesn't make sense with host directives, because it - // would allow the host directives to undo any overrides the host may have made. - // To handle this case, the host directives of components are inserted at the beginning - // of the array, followed by the component. As such, the insertion order is as follows: - // 1. Host directives belonging to the selector-matched component. - // 2. Selector-matched component. - // 3. Host directives belonging to selector-matched directives. - // 4. Selector-matched directives. - def.findHostDirectiveDefs(def, allDirectiveDefs, hostDirectiveDefs); - } - - if (isComponentDef(def)) { - allDirectiveDefs.push(def); - markAsComponentHost(tView, tNode, allDirectiveDefs.length - 1); - } - } - - if (isComponentHost(tNode)) { - allDirectiveDefs.push(...matches.slice(1)); - } else { - allDirectiveDefs.push(...matches); - } - - if (ngDevMode) { - assertNoDuplicateDirectives(allDirectiveDefs); - } - - return [allDirectiveDefs, hostDirectiveDefs]; -} - -/** - * Marks a given TNode as a component's host. This consists of: - * - setting the component offset on the TNode. - * - storing index of component's host element so it will be queued for view refresh during CD. - */ -export function markAsComponentHost(tView: TView, hostTNode: TNode, componentOffset: number): void { - ngDevMode && assertFirstCreatePass(tView); - ngDevMode && assertGreaterThan(componentOffset, -1, 'componentOffset must be great than -1'); - hostTNode.componentOffset = componentOffset; - (tView.components ??= []).push(hostTNode.index); -} - -/** Caches local names and their matching directive indices for query and template lookups. */ -function cacheMatchingLocalNames( - tNode: TNode, - localRefs: string[] | null, - exportsMap: {[key: string]: number}, -): void { - if (localRefs) { - const localNames: (string | number)[] = (tNode.localNames = []); - - // Local names must be stored in tNode in the same order that localRefs are defined - // in the template to ensure the data is loaded in the same slots as their refs - // in the template (for template queries). - for (let i = 0; i < localRefs.length; i += 2) { - const index = exportsMap[localRefs[i + 1]]; - if (index == null) - throw new RuntimeError( - RuntimeErrorCode.EXPORT_NOT_FOUND, - ngDevMode && `Export of name '${localRefs[i + 1]}' not found!`, - ); - localNames.push(localRefs[i], index); - } - } -} - -/** - * Builds up an export map as directives are created, so local refs can be quickly mapped - * to their directive instances. - */ -function saveNameToExportMap( - directiveIdx: number, - def: DirectiveDef | ComponentDef, - exportsMap: {[key: string]: number} | null, -) { - if (exportsMap) { - if (def.exportAs) { - for (let i = 0; i < def.exportAs.length; i++) { - exportsMap[def.exportAs[i]] = directiveIdx; - } - } - if (isComponentDef(def)) exportsMap[''] = directiveIdx; - } -} - -/** - * Initializes the flags on the current node, setting all indices to the initial index, - * the directive count to 0, and adding the isComponent flag. - * @param index the initial index - */ -function initTNodeFlags(tNode: TNode, index: number, numberOfDirectives: number) { - ngDevMode && - assertNotEqual( - numberOfDirectives, - tNode.directiveEnd - tNode.directiveStart, - 'Reached the max number of directives', - ); - tNode.flags |= TNodeFlags.isDirectiveHost; - // When the first directive is created on a node, save the index - tNode.directiveStart = index; - tNode.directiveEnd = index + numberOfDirectives; - tNode.providerIndexes = index; -} - -/** - * Setup directive for instantiation. - * - * We need to create a `NodeInjectorFactory` which is then inserted in both the `Blueprint` as well - * as `LView`. `TView` gets the `DirectiveDef`. - * - * @param tView `TView` - * @param tNode `TNode` - * @param lView `LView` - * @param directiveIndex Index where the directive will be stored in the Expando. - * @param def `DirectiveDef` - */ -export function configureViewWithDirective( - tView: TView, - tNode: TNode, - lView: LView, - directiveIndex: number, - def: DirectiveDef, -): void { - ngDevMode && - assertGreaterThanOrEqual(directiveIndex, HEADER_OFFSET, 'Must be in Expando section'); - tView.data[directiveIndex] = def; - const directiveFactory = - def.factory || ((def as Writable>).factory = getFactoryDef(def.type, true)); - // Even though `directiveFactory` will already be using `ɵɵdirectiveInject` in its generated code, - // we also want to support `inject()` directly from the directive constructor context so we set - // `ɵɵdirectiveInject` as the inject implementation here too. - const nodeInjectorFactory = new NodeInjectorFactory( - directiveFactory, - isComponentDef(def), - ɵɵdirectiveInject, - ); - tView.blueprint[directiveIndex] = nodeInjectorFactory; - lView[directiveIndex] = nodeInjectorFactory; - - registerHostBindingOpCodes( - tView, - tNode, - directiveIndex, - allocExpando(tView, lView, def.hostVars, NO_CHANGE), - def, - ); -} - /** * Gets the initial set of LView flags based on the component definition that the LView represents. * @param def Component definition from which to determine the flags. @@ -1392,69 +797,6 @@ function setInputsFromAttrs( } } -/** - * Generates initialInputData for a node and stores it in the template's static storage - * so subsequent template invocations don't have to recalculate it. - * - * initialInputData is an array containing values that need to be set as input properties - * for directives on this node, but only once on creation. We need this array to support - * the case where you set an @Input property of a directive using attribute-like syntax. - * e.g. if you have a `name` @Input, you can set it once like this: - * - * - * - * @param inputs Input alias map that was generated from the directive def inputs. - * @param directiveIndex Index of the directive that is currently being processed. - * @param attrs Static attrs on this node. - */ -function generateInitialInputs( - inputs: NodeInputBindings, - directiveIndex: number, - attrs: TAttributes, -): InitialInputs | null { - let inputsToStore: InitialInputs | null = null; - let i = 0; - while (i < attrs.length) { - const attrName = attrs[i]; - if (attrName === AttributeMarker.NamespaceURI) { - // We do not allow inputs on namespaced attributes. - i += 4; - continue; - } else if (attrName === AttributeMarker.ProjectAs) { - // Skip over the `ngProjectAs` value. - i += 2; - continue; - } - - // If we hit any other attribute markers, we're done anyway. None of those are valid inputs. - if (typeof attrName === 'number') break; - - if (inputs.hasOwnProperty(attrName as string)) { - if (inputsToStore === null) inputsToStore = []; - - // Find the input's public name from the input store. Note that we can be found easier - // through the directive def, but we want to do it using the inputs store so that it can - // account for host directive aliases. - const inputConfig = inputs[attrName as string]; - for (let j = 0; j < inputConfig.length; j += 3) { - if (inputConfig[j] === directiveIndex) { - inputsToStore.push( - attrName as string, - inputConfig[j + 1] as string, - inputConfig[j + 2] as InputFlags, - attrs[i + 1] as string, - ); - // A directive can't have multiple inputs with the same name so we can break here. - break; - } - } - } - - i += 2; - } - return inputsToStore; -} - ////////////////////////// //// ViewContainer & View ////////////////////////// diff --git a/packages/core/src/render3/instructions/template.ts b/packages/core/src/render3/instructions/template.ts index d012ade569c6..eb942c0520c1 100644 --- a/packages/core/src/render3/instructions/template.ts +++ b/packages/core/src/render3/instructions/template.ts @@ -27,6 +27,7 @@ import {isDirectiveHost} from '../interfaces/type_checks'; import {HEADER_OFFSET, HYDRATION, LView, RENDERER, TView, TViewType} from '../interfaces/view'; import {appendChild} from '../node_manipulation'; import { + getBindingsEnabled, getLView, getTView, isInSkipHydrationBlock, @@ -35,14 +36,16 @@ import { wasLastNodeCreated, } from '../state'; import {getOrCreateTNode} from '../tnode_manipulation'; +import {mergeHostAttrs} from '../util/attrs_utils'; import {getConstant} from '../util/view_utils'; +import {resolveDirectives} from '../view/directives'; import { addToEndOfViewTree, createDirectivesInstancesInInstruction, createLContainer, createTView, - resolveDirectives, + findDirectiveDefMatches, saveResolvedLocalsInData, } from './shared'; @@ -64,7 +67,19 @@ function templateFirstCreatePass( // TODO(pk): refactor getOrCreateTNode to have the "create" only version const tNode = getOrCreateTNode(tView, index, TNodeType.Container, tagName || null, attrs || null); - resolveDirectives(tView, lView, tNode, getConstant(tViewConsts, localRefsIndex)); + if (getBindingsEnabled()) { + resolveDirectives( + tView, + lView, + tNode, + getConstant(tViewConsts, localRefsIndex), + findDirectiveDefMatches, + ); + } + + // Merge the template attrs last so that they have the highest priority. + tNode.mergedAttrs = mergeHostAttrs(tNode.mergedAttrs, tNode.attrs); + registerPostOrderHooks(tView, tNode); const embeddedTView = (tNode.tView = createTView( diff --git a/packages/core/src/render3/view/construction.ts b/packages/core/src/render3/view/construction.ts new file mode 100644 index 000000000000..5464e0f0bf6c --- /dev/null +++ b/packages/core/src/render3/view/construction.ts @@ -0,0 +1,47 @@ +/** + * @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.dev/license + */ + +import {type TView, type LView, TVIEW} from '../interfaces/view'; +import {assertFirstCreatePass, assertFirstUpdatePass} from '../assert'; +import {assertSame, assertEqual} from '../../util/assert'; + +/** + * When elements are created dynamically after a view blueprint is created (e.g. through + * i18nApply()), we need to adjust the blueprint for future template passes. + * + * @param tView `TView` associated with `LView` + * @param lView The `LView` containing the blueprint to adjust + * @param numSlotsToAlloc The number of slots to alloc in the LView, should be >0 + * @param initialValue Initial value to store in blueprint + */ +export function allocExpando( + tView: TView, + lView: LView, + numSlotsToAlloc: number, + initialValue: any, +): number { + if (numSlotsToAlloc === 0) return -1; + if (ngDevMode) { + assertFirstCreatePass(tView); + assertSame(tView, lView[TVIEW], '`LView` must be associated with `TView`!'); + assertEqual(tView.data.length, lView.length, 'Expecting LView to be same size as TView'); + assertEqual( + tView.data.length, + tView.blueprint.length, + 'Expecting Blueprint to be same size as TView', + ); + assertFirstUpdatePass(tView); + } + const allocIdx = lView.length; + for (let i = 0; i < numSlotsToAlloc; i++) { + lView.push(initialValue); + tView.blueprint.push(initialValue); + tView.data.push(null); + } + return allocIdx; +} diff --git a/packages/core/src/render3/view/directives.ts b/packages/core/src/render3/view/directives.ts new file mode 100644 index 000000000000..f0878281e866 --- /dev/null +++ b/packages/core/src/render3/view/directives.ts @@ -0,0 +1,660 @@ +/** + * @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.dev/license + */ + +import {RuntimeError, RuntimeErrorCode} from '../../errors'; +import {Writable} from '../../interface/type'; +import {DoCheck, OnChanges, OnInit} from '../../interface/lifecycle_hooks'; +import { + assertGreaterThan, + assertGreaterThanOrEqual, + assertNotEqual, + assertSame, +} from '../../util/assert'; +import {assertFirstCreatePass} from '../assert'; +import {getFactoryDef} from '../definition_factory'; +import {diPublicInInjector, getOrCreateNodeInjectorForNode} from '../di'; +import {ɵɵdirectiveInject} from '../instructions/di'; +import {AttributeMarker} from '../interfaces/attribute_marker'; +import type { + ComponentDef, + DirectiveDef, + HostDirectiveBindingMap, + HostDirectiveDefs, +} from '../interfaces/definition'; +import {NodeInjectorFactory} from '../interfaces/injector'; +import {InputFlags} from '../interfaces/input_flags'; +import { + InitialInputData, + InitialInputs, + NodeInputBindings, + NodeOutputBindings, + TAttributes, + TNodeFlags, + type TContainerNode, + type TElementContainerNode, + type TElementNode, + type TNode, +} from '../interfaces/node'; +import {isComponentDef, isComponentHost} from '../interfaces/type_checks'; +import {HEADER_OFFSET, HostBindingOpCodes, type LView, type TView} from '../interfaces/view'; +import {isInlineTemplate} from '../node_selector_matcher'; +import {NO_CHANGE} from '../tokens'; +import {mergeHostAttrs} from '../util/attrs_utils'; +import {allocExpando} from './construction'; + +/** + * Resolve the matched directives on a node. + */ +export function resolveDirectives( + tView: TView, + lView: LView, + tNode: TElementNode | TContainerNode | TElementContainerNode, + localRefs: string[] | null, + directiveMatcher: ( + tView: TView, + tNode: TElementNode | TContainerNode | TElementContainerNode, + ) => DirectiveDef[] | null, +): void { + // Please make sure to have explicit type for `exportsMap`. Inferred type triggers bug in + // tsickle. + ngDevMode && assertFirstCreatePass(tView); + + const exportsMap: {[key: string]: number} | null = localRefs === null ? null : {'': -1}; + const matchedDirectiveDefs = directiveMatcher(tView, tNode); + + if (matchedDirectiveDefs !== null) { + const [directiveDefs, hostDirectiveDefs] = resolveHostDirectives( + tView, + tNode, + matchedDirectiveDefs, + ); + initializeDirectives(tView, lView, tNode, directiveDefs, exportsMap, hostDirectiveDefs); + } + if (exportsMap) cacheMatchingLocalNames(tNode, localRefs, exportsMap); +} + +/** Caches local names and their matching directive indices for query and template lookups. */ +function cacheMatchingLocalNames( + tNode: TNode, + localRefs: string[] | null, + exportsMap: {[key: string]: number}, +): void { + if (localRefs) { + const localNames: (string | number)[] = (tNode.localNames = []); + + // Local names must be stored in tNode in the same order that localRefs are defined + // in the template to ensure the data is loaded in the same slots as their refs + // in the template (for template queries). + for (let i = 0; i < localRefs.length; i += 2) { + const index = exportsMap[localRefs[i + 1]]; + if (index == null) + throw new RuntimeError( + RuntimeErrorCode.EXPORT_NOT_FOUND, + ngDevMode && `Export of name '${localRefs[i + 1]}' not found!`, + ); + localNames.push(localRefs[i], index); + } + } +} + +export function resolveHostDirectives( + tView: TView, + tNode: TNode, + matches: DirectiveDef[], +): [matches: DirectiveDef[], hostDirectiveDefs: HostDirectiveDefs | null] { + const allDirectiveDefs: DirectiveDef[] = []; + let hostDirectiveDefs: HostDirectiveDefs | null = null; + + for (const def of matches) { + if (def.findHostDirectiveDefs !== null) { + // TODO(pk): probably could return matches instead of taking in an array to fill in? + hostDirectiveDefs ??= new Map(); + // Components are inserted at the front of the matches array so that their lifecycle + // hooks run before any directive lifecycle hooks. This appears to be for ViewEngine + // compatibility. This logic doesn't make sense with host directives, because it + // would allow the host directives to undo any overrides the host may have made. + // To handle this case, the host directives of components are inserted at the beginning + // of the array, followed by the component. As such, the insertion order is as follows: + // 1. Host directives belonging to the selector-matched component. + // 2. Selector-matched component. + // 3. Host directives belonging to selector-matched directives. + // 4. Selector-matched directives. + def.findHostDirectiveDefs(def, allDirectiveDefs, hostDirectiveDefs); + } + + if (isComponentDef(def)) { + allDirectiveDefs.push(def); + markAsComponentHost(tView, tNode, allDirectiveDefs.length - 1); + } + } + + if (isComponentHost(tNode)) { + allDirectiveDefs.push(...matches.slice(1)); + } else { + allDirectiveDefs.push(...matches); + } + + if (ngDevMode) { + assertNoDuplicateDirectives(allDirectiveDefs); + } + + return [allDirectiveDefs, hostDirectiveDefs]; +} + +/** + * Marks a given TNode as a component's host. This consists of: + * - setting the component offset on the TNode. + * - storing index of component's host element so it will be queued for view refresh during CD. + */ +function markAsComponentHost(tView: TView, hostTNode: TNode, componentOffset: number): void { + ngDevMode && assertFirstCreatePass(tView); + ngDevMode && assertGreaterThan(componentOffset, -1, 'componentOffset must be great than -1'); + hostTNode.componentOffset = componentOffset; + (tView.components ??= []).push(hostTNode.index); +} + +/** Initializes the data structures necessary for a list of directives to be instantiated. */ +export function initializeDirectives( + tView: TView, + lView: LView, + tNode: TElementNode | TContainerNode | TElementContainerNode, + directives: DirectiveDef[], + exportsMap: {[key: string]: number} | null, + hostDirectiveDefs: HostDirectiveDefs | null, +) { + ngDevMode && assertFirstCreatePass(tView); + + // Publishes the directive types to DI so they can be injected. Needs to + // happen in a separate pass before the TNode flags have been initialized. + for (let i = 0; i < directives.length; i++) { + diPublicInInjector(getOrCreateNodeInjectorForNode(tNode, lView), tView, directives[i].type); + } + + initTNodeFlags(tNode, tView.data.length, directives.length); + + // When the same token is provided by several directives on the same node, some rules apply in + // the viewEngine: + // - viewProviders have priority over providers + // - the last directive in NgModule.declarations has priority over the previous one + // So to match these rules, the order in which providers are added in the arrays is very + // important. + for (let i = 0; i < directives.length; i++) { + const def = directives[i]; + if (def.providersResolver) def.providersResolver(def); + } + let preOrderHooksFound = false; + let preOrderCheckHooksFound = false; + let directiveIdx = allocExpando(tView, lView, directives.length, null); + ngDevMode && + assertSame( + directiveIdx, + tNode.directiveStart, + 'TNode.directiveStart should point to just allocated space', + ); + + for (let i = 0; i < directives.length; i++) { + const def = directives[i]; + // Merge the attrs in the order of matches. This assumes that the first directive is the + // component itself, so that the component has the least priority. + tNode.mergedAttrs = mergeHostAttrs(tNode.mergedAttrs, def.hostAttrs); + + configureViewWithDirective(tView, tNode, lView, directiveIdx, def); + saveNameToExportMap(directiveIdx, def, exportsMap); + + if (def.contentQueries !== null) tNode.flags |= TNodeFlags.hasContentQuery; + if (def.hostBindings !== null || def.hostAttrs !== null || def.hostVars !== 0) + tNode.flags |= TNodeFlags.hasHostBindings; + + const lifeCycleHooks: Partial = def.type.prototype; + // Only push a node index into the preOrderHooks array if this is the first + // pre-order hook found on this node. + if ( + !preOrderHooksFound && + (lifeCycleHooks.ngOnChanges || lifeCycleHooks.ngOnInit || lifeCycleHooks.ngDoCheck) + ) { + // We will push the actual hook function into this array later during dir instantiation. + // We cannot do it now because we must ensure hooks are registered in the same + // order that directives are created (i.e. injection order). + (tView.preOrderHooks ??= []).push(tNode.index); + preOrderHooksFound = true; + } + + if (!preOrderCheckHooksFound && (lifeCycleHooks.ngOnChanges || lifeCycleHooks.ngDoCheck)) { + (tView.preOrderCheckHooks ??= []).push(tNode.index); + preOrderCheckHooksFound = true; + } + + directiveIdx++; + } + + initializeInputAndOutputAliases(tView, tNode, hostDirectiveDefs); +} + +/** + * Initializes data structures required to work with directive inputs and outputs. + * Initialization is done for all directives matched on a given TNode. + */ +function initializeInputAndOutputAliases( + tView: TView, + tNode: TNode, + hostDirectiveDefinitionMap: HostDirectiveDefs | null, +): void { + ngDevMode && assertFirstCreatePass(tView); + + const start = tNode.directiveStart; + const end = tNode.directiveEnd; + const tViewData = tView.data; + + const tNodeAttrs = tNode.attrs; + const inputsFromAttrs: InitialInputData = []; + let inputsStore: NodeInputBindings | null = null; + let outputsStore: NodeOutputBindings | null = null; + + for (let directiveIndex = start; directiveIndex < end; directiveIndex++) { + const directiveDef = tViewData[directiveIndex] as DirectiveDef; + const aliasData = hostDirectiveDefinitionMap + ? hostDirectiveDefinitionMap.get(directiveDef) + : null; + const aliasedInputs = aliasData ? aliasData.inputs : null; + const aliasedOutputs = aliasData ? aliasData.outputs : null; + + inputsStore = captureNodeBindings( + CaptureNodeBindingMode.Inputs, + directiveDef.inputs, + directiveIndex, + inputsStore, + aliasedInputs, + ); + outputsStore = captureNodeBindings( + CaptureNodeBindingMode.Outputs, + directiveDef.outputs, + directiveIndex, + outputsStore, + aliasedOutputs, + ); + // Do not use unbound attributes as inputs to structural directives, since structural + // directive inputs can only be set using microsyntax (e.g. `
`). + // TODO(FW-1930): microsyntax expressions may also contain unbound/static attributes, which + // should be set for inline templates. + const initialInputs = + inputsStore !== null && tNodeAttrs !== null && !isInlineTemplate(tNode) + ? generateInitialInputs(inputsStore, directiveIndex, tNodeAttrs) + : null; + inputsFromAttrs.push(initialInputs); + } + + if (inputsStore !== null) { + if (inputsStore.hasOwnProperty('class')) { + tNode.flags |= TNodeFlags.hasClassInput; + } + if (inputsStore.hasOwnProperty('style')) { + tNode.flags |= TNodeFlags.hasStyleInput; + } + } + + tNode.initialInputs = inputsFromAttrs; + tNode.inputs = inputsStore; + tNode.outputs = outputsStore; +} + +/** Mode for capturing node bindings. */ +const enum CaptureNodeBindingMode { + Inputs, + Outputs, +} + +/** + * Captures node input bindings for the given directive based on the inputs metadata. + * This will be called multiple times to combine inputs from various directives on a node. + * + * The host binding alias map is used to alias and filter out properties for host directives. + * If the mapping is provided, it'll act as an allowlist, as well as a mapping of what public + * name inputs/outputs should be exposed under. + */ +function captureNodeBindings( + mode: CaptureNodeBindingMode.Inputs, + inputs: DirectiveDef['inputs'], + directiveIndex: number, + bindingsResult: NodeInputBindings | null, + hostDirectiveAliasMap: HostDirectiveBindingMap | null, +): NodeInputBindings | null; +/** + * Captures node output bindings for the given directive based on the output metadata. + * This will be called multiple times to combine inputs from various directives on a node. + * + * The host binding alias map is used to alias and filter out properties for host directives. + * If the mapping is provided, it'll act as an allowlist, as well as a mapping of what public + * name inputs/outputs should be exposed under. + */ +function captureNodeBindings( + mode: CaptureNodeBindingMode.Outputs, + outputs: DirectiveDef['outputs'], + directiveIndex: number, + bindingsResult: NodeOutputBindings | null, + hostDirectiveAliasMap: HostDirectiveBindingMap | null, +): NodeOutputBindings | null; + +function captureNodeBindings( + mode: CaptureNodeBindingMode, + aliasMap: DirectiveDef['inputs'] | DirectiveDef['outputs'], + directiveIndex: number, + bindingsResult: NodeInputBindings | NodeOutputBindings | null, + hostDirectiveAliasMap: HostDirectiveBindingMap | null, +): NodeInputBindings | NodeOutputBindings | null { + for (let publicName in aliasMap) { + if (!aliasMap.hasOwnProperty(publicName)) { + continue; + } + + const value = aliasMap[publicName]; + if (value === undefined) { + continue; + } + + bindingsResult ??= {}; + + let internalName: string; + let inputFlags = InputFlags.None; + + // For inputs, the value might be an array capturing additional + // input flags. + if (Array.isArray(value)) { + internalName = value[0]; + inputFlags = value[1]; + } else { + internalName = value; + } + + // If there are no host directive mappings, we want to remap using the alias map from the + // definition itself. If there is an alias map, it has two functions: + // 1. It serves as an allowlist of bindings that are exposed by the host directives. Only the + // ones inside the host directive map will be exposed on the host. + // 2. The public name of the property is aliased using the host directive alias map, rather + // than the alias map from the definition. + let finalPublicName: string = publicName; + if (hostDirectiveAliasMap !== null) { + // If there is no mapping, it's not part of the allowlist and this input/output + // is not captured and should be ignored. + if (!hostDirectiveAliasMap.hasOwnProperty(publicName)) { + continue; + } + finalPublicName = hostDirectiveAliasMap[publicName]; + } + + if (mode === CaptureNodeBindingMode.Inputs) { + addPropertyBinding( + bindingsResult as NodeInputBindings, + directiveIndex, + finalPublicName, + internalName, + inputFlags, + ); + } else { + addPropertyBinding( + bindingsResult as NodeOutputBindings, + directiveIndex, + finalPublicName, + internalName, + ); + } + } + return bindingsResult; +} + +function addPropertyBinding( + bindings: NodeInputBindings, + directiveIndex: number, + publicName: string, + internalName: string, + inputFlags: InputFlags, +): void; +function addPropertyBinding( + bindings: NodeOutputBindings, + directiveIndex: number, + publicName: string, + internalName: string, +): void; + +function addPropertyBinding( + bindings: NodeInputBindings | NodeOutputBindings, + directiveIndex: number, + publicName: string, + internalName: string, + inputFlags?: InputFlags, +) { + let values: (typeof bindings)[typeof publicName]; + + if (bindings.hasOwnProperty(publicName)) { + (values = bindings[publicName]).push(directiveIndex, internalName); + } else { + values = bindings[publicName] = [directiveIndex, internalName]; + } + + if (inputFlags !== undefined) { + (values as NodeInputBindings[typeof publicName]).push(inputFlags); + } +} + +/** + * Generates initialInputData for a node and stores it in the template's static storage + * so subsequent template invocations don't have to recalculate it. + * + * initialInputData is an array containing values that need to be set as input properties + * for directives on this node, but only once on creation. We need this array to support + * the case where you set an @Input property of a directive using attribute-like syntax. + * e.g. if you have a `name` @Input, you can set it once like this: + * + * + * + * @param inputs Input alias map that was generated from the directive def inputs. + * @param directiveIndex Index of the directive that is currently being processed. + * @param attrs Static attrs on this node. + */ +function generateInitialInputs( + inputs: NodeInputBindings, + directiveIndex: number, + attrs: TAttributes, +): InitialInputs | null { + let inputsToStore: InitialInputs | null = null; + let i = 0; + while (i < attrs.length) { + const attrName = attrs[i]; + if (attrName === AttributeMarker.NamespaceURI) { + // We do not allow inputs on namespaced attributes. + i += 4; + continue; + } else if (attrName === AttributeMarker.ProjectAs) { + // Skip over the `ngProjectAs` value. + i += 2; + continue; + } + + // If we hit any other attribute markers, we're done anyway. None of those are valid inputs. + if (typeof attrName === 'number') break; + + if (inputs.hasOwnProperty(attrName as string)) { + if (inputsToStore === null) inputsToStore = []; + + // Find the input's public name from the input store. Note that we can be found easier + // through the directive def, but we want to do it using the inputs store so that it can + // account for host directive aliases. + const inputConfig = inputs[attrName as string]; + for (let j = 0; j < inputConfig.length; j += 3) { + if (inputConfig[j] === directiveIndex) { + inputsToStore.push( + attrName as string, + inputConfig[j + 1] as string, + inputConfig[j + 2] as InputFlags, + attrs[i + 1] as string, + ); + // A directive can't have multiple inputs with the same name so we can break here. + break; + } + } + } + + i += 2; + } + return inputsToStore; +} + +/** + * Setup directive for instantiation. + * + * We need to create a `NodeInjectorFactory` which is then inserted in both the `Blueprint` as well + * as `LView`. `TView` gets the `DirectiveDef`. + * + * @param tView `TView` + * @param tNode `TNode` + * @param lView `LView` + * @param directiveIndex Index where the directive will be stored in the Expando. + * @param def `DirectiveDef` + */ +function configureViewWithDirective( + tView: TView, + tNode: TNode, + lView: LView, + directiveIndex: number, + def: DirectiveDef, +): void { + ngDevMode && + assertGreaterThanOrEqual(directiveIndex, HEADER_OFFSET, 'Must be in Expando section'); + tView.data[directiveIndex] = def; + const directiveFactory = + def.factory || ((def as Writable>).factory = getFactoryDef(def.type, true)); + // Even though `directiveFactory` will already be using `ɵɵdirectiveInject` in its generated code, + // we also want to support `inject()` directly from the directive constructor context so we set + // `ɵɵdirectiveInject` as the inject implementation here too. + const nodeInjectorFactory = new NodeInjectorFactory( + directiveFactory, + isComponentDef(def), + ɵɵdirectiveInject, + ); + tView.blueprint[directiveIndex] = nodeInjectorFactory; + lView[directiveIndex] = nodeInjectorFactory; + + registerHostBindingOpCodes( + tView, + tNode, + directiveIndex, + allocExpando(tView, lView, def.hostVars, NO_CHANGE), + def, + ); +} + +/** + * Add `hostBindings` to the `TView.hostBindingOpCodes`. + * + * @param tView `TView` to which the `hostBindings` should be added. + * @param tNode `TNode` the element which contains the directive + * @param directiveIdx Directive index in view. + * @param directiveVarsIdx Where will the directive's vars be stored + * @param def `ComponentDef`/`DirectiveDef`, which contains the `hostVars`/`hostBindings` to add. + */ +export function registerHostBindingOpCodes( + tView: TView, + tNode: TNode, + directiveIdx: number, + directiveVarsIdx: number, + def: ComponentDef | DirectiveDef, +): void { + ngDevMode && assertFirstCreatePass(tView); + + const hostBindings = def.hostBindings; + if (hostBindings) { + let hostBindingOpCodes = tView.hostBindingOpCodes; + if (hostBindingOpCodes === null) { + hostBindingOpCodes = tView.hostBindingOpCodes = [] as any as HostBindingOpCodes; + } + const elementIndx = ~tNode.index; + if (lastSelectedElementIdx(hostBindingOpCodes) != elementIndx) { + // Conditionally add select element so that we are more efficient in execution. + // NOTE: this is strictly not necessary and it trades code size for runtime perf. + // (We could just always add it.) + hostBindingOpCodes.push(elementIndx); + } + hostBindingOpCodes.push(directiveIdx, directiveVarsIdx, hostBindings); + } +} + +/** + * Returns the last selected element index in the `HostBindingOpCodes` + * + * For perf reasons we don't need to update the selected element index in `HostBindingOpCodes` only + * if it changes. This method returns the last index (or '0' if not found.) + * + * Selected element index are only the ones which are negative. + */ +function lastSelectedElementIdx(hostBindingOpCodes: HostBindingOpCodes): number { + let i = hostBindingOpCodes.length; + while (i > 0) { + const value = hostBindingOpCodes[--i]; + if (typeof value === 'number' && value < 0) { + return value; + } + } + return 0; +} + +/** + * Builds up an export map as directives are created, so local refs can be quickly mapped + * to their directive instances. + */ +function saveNameToExportMap( + directiveIdx: number, + def: DirectiveDef | ComponentDef, + exportsMap: {[key: string]: number} | null, +) { + if (exportsMap) { + if (def.exportAs) { + for (let i = 0; i < def.exportAs.length; i++) { + exportsMap[def.exportAs[i]] = directiveIdx; + } + } + if (isComponentDef(def)) exportsMap[''] = directiveIdx; + } +} + +/** + * Initializes the flags on the current node, setting all indices to the initial index, + * the directive count to 0, and adding the isComponent flag. + * @param index the initial index + */ +function initTNodeFlags(tNode: TNode, index: number, numberOfDirectives: number) { + ngDevMode && + assertNotEqual( + numberOfDirectives, + tNode.directiveEnd - tNode.directiveStart, + 'Reached the max number of directives', + ); + tNode.flags |= TNodeFlags.isDirectiveHost; + // When the first directive is created on a node, save the index + tNode.directiveStart = index; + tNode.directiveEnd = index + numberOfDirectives; + tNode.providerIndexes = index; +} + +export function assertNoDuplicateDirectives(directives: DirectiveDef[]): void { + // The array needs at least two elements in order to have duplicates. + if (directives.length < 2) { + return; + } + + const seenDirectives = new Set>(); + + for (const current of directives) { + if (seenDirectives.has(current)) { + throw new RuntimeError( + RuntimeErrorCode.DUPLICATE_DIRECTIVE, + `Directive ${current.type.name} matches multiple times on the same element. ` + + `Directives can only match an element once.`, + ); + } + seenDirectives.add(current); + } +} diff --git a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json index 474a638b2d96..fdc46f3944c0 100644 --- a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json @@ -290,6 +290,7 @@ "extractStyleParams", "filterNonAnimatableStyles", "findAttrIndexInNode", + "findDirectiveDefMatches", "forEachSingleProvider", "forwardRef", "freeConsumers", diff --git a/packages/core/test/bundling/animations/bundle.golden_symbols.json b/packages/core/test/bundling/animations/bundle.golden_symbols.json index 5415c8c5a06e..d13d60a8192a 100644 --- a/packages/core/test/bundling/animations/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations/bundle.golden_symbols.json @@ -311,6 +311,7 @@ "extractStyleParams", "filterNonAnimatableStyles", "findAttrIndexInNode", + "findDirectiveDefMatches", "forEachSingleProvider", "forwardRef", "freeConsumers", diff --git a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json index 14df7c693038..48e8b069d0b6 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -239,6 +239,7 @@ "extractDefListOrFactory", "extractDirectiveDef", "findAttrIndexInNode", + "findDirectiveDefMatches", "forEachSingleProvider", "forwardRef", "freeConsumers", diff --git a/packages/core/test/bundling/defer/bundle.golden_symbols.json b/packages/core/test/bundling/defer/bundle.golden_symbols.json index d74d3c5306ce..31855b8e578f 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -289,6 +289,7 @@ "extractDefListOrFactory", "extractDirectiveDef", "findAttrIndexInNode", + "findDirectiveDefMatches", "forEachSingleProvider", "forwardRef", "freeConsumers", @@ -427,6 +428,7 @@ "init_config", "init_console", "init_constants", + "init_construction", "init_container", "init_context", "init_context_discovery", @@ -463,6 +465,7 @@ "init_di_setup", "init_directive", "init_directives", + "init_directives2", "init_discovery", "init_discovery_utils", "init_dispatcher", diff --git a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json index 71a74ec5ee9a..92ba38bfc4dd 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -345,6 +345,7 @@ "extractDirectiveDef", "fillProperties", "findAttrIndexInNode", + "findDirectiveDefMatches", "findStylingValue", "forEachSingleProvider", "forkJoin", diff --git a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json index 871a10adddbc..cb1ff8f94327 100644 --- a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json @@ -334,6 +334,7 @@ "extractDirectiveDef", "fillProperties", "findAttrIndexInNode", + "findDirectiveDefMatches", "findStylingValue", "forEachSingleProvider", "forkJoin", diff --git a/packages/core/test/bundling/router/bundle.golden_symbols.json b/packages/core/test/bundling/router/bundle.golden_symbols.json index 3aeaba62c128..5eb4c42f4b78 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -409,6 +409,7 @@ "filter", "finalize", "findAttrIndexInNode", + "findDirectiveDefMatches", "findNode", "findPath", "first", diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index 4013f9f27d68..f1365a8d695e 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -282,6 +282,7 @@ "extractDefListOrFactory", "extractDirectiveDef", "findAttrIndexInNode", + "findDirectiveDefMatches", "findStylingValue", "forEachSingleProvider", "forwardRef", From 5e0dcf1f5361fdf502b692f3a98a4b5215032191 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Thu, 30 Jan 2025 16:24:52 -0800 Subject: [PATCH 0019/1000] refactor(core): reuse element first create pass in ComponentRef (#59843) Reuse element first create pass in ComponentRef. PR Close #59843 --- packages/core/src/render3/component_ref.ts | 37 +++------ .../core/src/render3/instructions/element.ts | 83 +++++-------------- packages/core/src/render3/view/directives.ts | 10 ++- packages/core/src/render3/view/elements.ts | 61 ++++++++++++++ .../bundle.golden_symbols.json | 4 +- .../animations/bundle.golden_symbols.json | 4 +- .../cyclic_import/bundle.golden_symbols.json | 3 +- .../bundling/defer/bundle.golden_symbols.json | 4 +- .../forms_reactive/bundle.golden_symbols.json | 3 +- .../bundle.golden_symbols.json | 3 +- .../hello_world/bundle.golden_symbols.json | 2 + .../hydration/bundle.golden_symbols.json | 2 + .../router/bundle.golden_symbols.json | 3 +- .../bundle.golden_symbols.json | 2 + .../bundling/todo/bundle.golden_symbols.json | 3 +- 15 files changed, 113 insertions(+), 111 deletions(-) create mode 100644 packages/core/src/render3/view/elements.ts diff --git a/packages/core/src/render3/component_ref.ts b/packages/core/src/render3/component_ref.ts index e4403315489c..56c6c03223d2 100644 --- a/packages/core/src/render3/component_ref.ts +++ b/packages/core/src/render3/component_ref.ts @@ -52,7 +52,6 @@ import { TElementContainerNode, TElementNode, TNode, - TNodeType, } from './interfaces/node'; import {RElement, RNode} from './interfaces/renderer_dom'; import { @@ -79,12 +78,9 @@ import {profiler} from './profiler'; import {ProfilerEvent} from './profiler_types'; import {executeContentQueries} from './queries/query_execution'; import {enterView, leaveView} from './state'; -import {computeStaticStyling} from './styling/static_styling'; -import {getOrCreateTNode} from './tnode_manipulation'; -import {mergeHostAttrs} from './util/attrs_utils'; import {debugStringifyTypeForError, stringifyForError} from './util/stringify_utils'; import {getComponentLViewByIndex, getTNode} from './util/view_utils'; -import {initializeDirectives, resolveHostDirectives} from './view/directives'; +import {elementStartFirstCreatePass} from './view/elements'; import {ViewRef} from './view_ref'; export class ComponentFactoryResolver extends AbstractComponentFactoryResolver { @@ -281,6 +277,10 @@ export class ComponentFactory extends AbstractComponentFactory { const cmpDef = this.componentDef; ngDevMode && verifyNotAnOrphanComponent(cmpDef); + const tAttributes = rootSelectorOrNode + ? ['ng-version', '0.0.0-PLACEHOLDER'] + : // Extract attributes and classes from the first selector only to match VE behavior. + extractAttrsAndClassesFromSelector(this.componentDef.selectors[0]); // Create the root view. Uses empty TView and ContentTemplate. const rootTView = createTView( TViewType.Root, @@ -292,7 +292,7 @@ export class ComponentFactory extends AbstractComponentFactory { null, null, null, - null, + [tAttributes], null, ); @@ -339,29 +339,16 @@ export class ComponentFactory extends AbstractComponentFactory { let componentView: LView | null = null; try { - // If host dom element is created (instead of being provided as part of the dynamic component creation), also apply attributes and classes extracted from component selector. - const tAttributes = rootSelectorOrNode - ? ['ng-version', '0.0.0-PLACEHOLDER'] - : // Extract attributes and classes from the first selector only to match VE behavior. - extractAttrsAndClassesFromSelector(cmpDef.selectors[0]); - - // TODO: this logic is shared with the element instruction first create pass - minus directive matching - const hostTNode = getOrCreateTNode( - rootTView, + const hostTNode = elementStartFirstCreatePass( HEADER_OFFSET, - TNodeType.Element, + rootTView, + rootLView, '#host', - tAttributes, + () => [this.componentDef], + true, + 0, ); - const [directiveDefs, hostDirectiveDefs] = resolveHostDirectives(rootTView, hostTNode, [ - cmpDef, - ]); - initializeDirectives(rootTView, rootLView, hostTNode, directiveDefs, {}, hostDirectiveDefs); - hostTNode.mergedAttrs = mergeHostAttrs(hostTNode.mergedAttrs, tAttributes); - - computeStaticStyling(hostTNode, hostTNode.mergedAttrs, true); - // TODO(crisbeto): in practice `hostRNode` should always be defined, but there are some // tests where the renderer is mocked out and `undefined` is returned. We should update the // tests so that this check can be removed. diff --git a/packages/core/src/render3/instructions/element.ts b/packages/core/src/render3/instructions/element.ts index de52675d3b5d..e5bc59c73a5e 100644 --- a/packages/core/src/render3/instructions/element.ts +++ b/packages/core/src/render3/instructions/element.ts @@ -25,29 +25,22 @@ import { } from '../../hydration/utils'; import {isDetachedByI18n} from '../../i18n/utils'; import {assertDefined, assertEqual, assertIndexInRange} from '../../util/assert'; -import {assertFirstCreatePass, assertHasParent} from '../assert'; +import {assertHasParent} from '../assert'; import {attachPatchData} from '../context_discovery'; -import {registerPostOrderHooks} from '../hooks'; import { - hasClassInput, - hasStyleInput, - TAttributes, - TElementNode, - TNode, - TNodeType, -} from '../interfaces/node'; + clearElementContents, + createElementNode, + setupStaticAttributes, +} from '../dom_node_manipulation'; +import {registerPostOrderHooks} from '../hooks'; +import {hasClassInput, hasStyleInput, TElementNode, TNode, TNodeType} from '../interfaces/node'; import {Renderer} from '../interfaces/renderer'; import {RElement} from '../interfaces/renderer_dom'; import {isComponentHost, isContentQueryHost, isDirectiveHost} from '../interfaces/type_checks'; import {HEADER_OFFSET, HYDRATION, LView, RENDERER, TView} from '../interfaces/view'; import {assertTNodeType} from '../node_assert'; -import {executeContentQueries} from '../queries/query_execution'; import {appendChild} from '../node_manipulation'; -import { - clearElementContents, - createElementNode, - setupStaticAttributes, -} from '../dom_node_manipulation'; +import {executeContentQueries} from '../queries/query_execution'; import { decreaseElementDepthCount, enterSkipHydrationBlock, @@ -68,9 +61,7 @@ import { setCurrentTNodeAsNotParent, wasLastNodeCreated, } from '../state'; -import {computeStaticStyling} from '../styling/static_styling'; -import {mergeHostAttrs} from '../util/attrs_utils'; -import {getConstant} from '../util/view_utils'; +import {elementStartFirstCreatePass} from '../view/elements'; import {validateElementIsKnown} from './element_validation'; import {setDirectiveInputsWhichShadowsStyling} from './property'; @@ -79,51 +70,6 @@ import { findDirectiveDefMatches, saveResolvedLocalsInData, } from './shared'; -import {getOrCreateTNode} from '../tnode_manipulation'; -import {resolveDirectives} from '../view/directives'; - -function elementStartFirstCreatePass( - index: number, - tView: TView, - lView: LView, - name: string, - attrsIndex?: number | null, - localRefsIndex?: number, -): TElementNode { - ngDevMode && assertFirstCreatePass(tView); - ngDevMode && ngDevMode.firstCreatePass++; - - const tViewConsts = tView.consts; - const attrs = getConstant(tViewConsts, attrsIndex); - const tNode = getOrCreateTNode(tView, index, TNodeType.Element, name, attrs); - - if (getBindingsEnabled()) { - resolveDirectives( - tView, - lView, - tNode, - getConstant(tViewConsts, localRefsIndex), - findDirectiveDefMatches, - ); - } - - // Merge the template attrs last so that they have the highest priority. - tNode.mergedAttrs = mergeHostAttrs(tNode.mergedAttrs, tNode.attrs); - - if (tNode.attrs !== null) { - computeStaticStyling(tNode, tNode.attrs, false); - } - - if (tNode.mergedAttrs !== null) { - computeStaticStyling(tNode, tNode.mergedAttrs, true); - } - - if (tView.queries !== null) { - tView.queries.elementStart(tView, tNode); - } - - return tNode; -} /** * Create DOM element. The instruction must later be followed by `elementEnd()` call. @@ -160,7 +106,16 @@ export function ɵɵelementStart( const renderer = lView[RENDERER]; const tNode = tView.firstCreatePass - ? elementStartFirstCreatePass(adjustedIndex, tView, lView, name, attrsIndex, localRefsIndex) + ? elementStartFirstCreatePass( + adjustedIndex, + tView, + lView, + name, + findDirectiveDefMatches, + getBindingsEnabled(), + attrsIndex, + localRefsIndex, + ) : (tView.data[adjustedIndex] as TElementNode); const native = _locateOrCreateElementNode(tView, lView, tNode, renderer, name, index); diff --git a/packages/core/src/render3/view/directives.ts b/packages/core/src/render3/view/directives.ts index f0878281e866..1a13d2d47655 100644 --- a/packages/core/src/render3/view/directives.ts +++ b/packages/core/src/render3/view/directives.ts @@ -47,6 +47,11 @@ import {NO_CHANGE} from '../tokens'; import {mergeHostAttrs} from '../util/attrs_utils'; import {allocExpando} from './construction'; +export type DirectiveMatcherStrategy = ( + tView: TView, + tNode: TElementNode | TContainerNode | TElementContainerNode, +) => DirectiveDef[] | null; + /** * Resolve the matched directives on a node. */ @@ -55,10 +60,7 @@ export function resolveDirectives( lView: LView, tNode: TElementNode | TContainerNode | TElementContainerNode, localRefs: string[] | null, - directiveMatcher: ( - tView: TView, - tNode: TElementNode | TContainerNode | TElementContainerNode, - ) => DirectiveDef[] | null, + directiveMatcher: DirectiveMatcherStrategy, ): void { // Please make sure to have explicit type for `exportsMap`. Inferred type triggers bug in // tsickle. diff --git a/packages/core/src/render3/view/elements.ts b/packages/core/src/render3/view/elements.ts new file mode 100644 index 000000000000..bd2b98ecb60c --- /dev/null +++ b/packages/core/src/render3/view/elements.ts @@ -0,0 +1,61 @@ +/** + * @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.dev/license + */ + +import {assertFirstCreatePass} from '../assert'; +import {TAttributes, TNodeType, type TElementNode} from '../interfaces/node'; +import type {LView, TView} from '../interfaces/view'; +import {computeStaticStyling} from '../styling/static_styling'; +import {getOrCreateTNode} from '../tnode_manipulation'; +import {mergeHostAttrs} from '../util/attrs_utils'; +import {getConstant} from '../util/view_utils'; +import {resolveDirectives, type DirectiveMatcherStrategy} from './directives'; + +export function elementStartFirstCreatePass( + index: number, + tView: TView, + lView: LView, + name: string, + directiveMatcher: DirectiveMatcherStrategy, + bindingsEnabled: boolean, + attrsIndex?: number | null, + localRefsIndex?: number, +): TElementNode { + ngDevMode && assertFirstCreatePass(tView); + ngDevMode && ngDevMode.firstCreatePass++; + + const tViewConsts = tView.consts; + const attrs = getConstant(tViewConsts, attrsIndex); + const tNode = getOrCreateTNode(tView, index, TNodeType.Element, name, attrs); + + if (bindingsEnabled) { + resolveDirectives( + tView, + lView, + tNode, + getConstant(tViewConsts, localRefsIndex), + directiveMatcher, + ); + } + + // Merge the template attrs last so that they have the highest priority. + tNode.mergedAttrs = mergeHostAttrs(tNode.mergedAttrs, tNode.attrs); + + if (tNode.attrs !== null) { + computeStaticStyling(tNode, tNode.attrs, false); + } + + if (tNode.mergedAttrs !== null) { + computeStaticStyling(tNode, tNode.mergedAttrs, true); + } + + if (tView.queries !== null) { + tView.queries.elementStart(tView, tNode); + } + + return tNode; +} diff --git a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json index fdc46f3944c0..c4dc4dbf2e8e 100644 --- a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json @@ -275,6 +275,7 @@ "detectChangesInternal", "diPublicInInjector", "documentElement", + "elementStartFirstCreatePass", "enterDI", "enterView", "eraseStyles", @@ -321,7 +322,6 @@ "getNullInjector", "getOrCreateInjectable", "getOrCreateNodeInjectorForNode", - "getOrCreateTNode", "getOrSetDefaultValue", "getOwnDefinition", "getParentElement", @@ -344,7 +344,6 @@ "importProvidersFrom", "includeViewProviders", "incrementInitPhaseFlags", - "initializeDirectives", "inject", "injectArgs", "injectDestroyRef", @@ -444,7 +443,6 @@ "requiresRefreshOrTraversal", "resetPreOrderHookFlags", "resolveForwardRef", - "resolveHostDirectives", "resolveTiming", "resolveTimingValue", "roundOffset", diff --git a/packages/core/test/bundling/animations/bundle.golden_symbols.json b/packages/core/test/bundling/animations/bundle.golden_symbols.json index d13d60a8192a..3806cb7d9408 100644 --- a/packages/core/test/bundling/animations/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations/bundle.golden_symbols.json @@ -296,6 +296,7 @@ "detectChangesInternal", "diPublicInInjector", "documentElement", + "elementStartFirstCreatePass", "enterDI", "enterView", "eraseStyles", @@ -343,7 +344,6 @@ "getNullInjector", "getOrCreateInjectable", "getOrCreateNodeInjectorForNode", - "getOrCreateTNode", "getOrSetDefaultValue", "getOwnDefinition", "getParentElement", @@ -367,7 +367,6 @@ "importProvidersFrom", "includeViewProviders", "incrementInitPhaseFlags", - "initializeDirectives", "inject", "injectArgs", "injectDestroyRef", @@ -470,7 +469,6 @@ "requiresRefreshOrTraversal", "resetPreOrderHookFlags", "resolveForwardRef", - "resolveHostDirectives", "resolveTiming", "resolveTimingValue", "roundOffset", diff --git a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json index 48e8b069d0b6..39918ff060cf 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -227,6 +227,7 @@ "detectChangesInViewIfRequired", "detectChangesInternal", "diPublicInInjector", + "elementStartFirstCreatePass", "enterDI", "enterView", "errorContext", @@ -292,7 +293,6 @@ "importProvidersFrom", "includeViewProviders", "incrementInitPhaseFlags", - "initializeDirectives", "inject", "injectArgs", "injectDestroyRef", @@ -380,7 +380,6 @@ "requiresRefreshOrTraversal", "resetPreOrderHookFlags", "resolveForwardRef", - "resolveHostDirectives", "runEffectsInView", "runInInjectionContext", "saveNameToExportMap", diff --git a/packages/core/test/bundling/defer/bundle.golden_symbols.json b/packages/core/test/bundling/defer/bundle.golden_symbols.json index 31855b8e578f..b146f5648673 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -276,6 +276,7 @@ "detectChangesInViewIfRequired", "detectChangesInternal", "diPublicInInjector", + "elementStartFirstCreatePass", "enterDI", "enterView", "epoch", @@ -479,6 +480,7 @@ "init_element_container", "init_element_ref", "init_element_validation", + "init_elements", "init_empty", "init_environment", "init_environment2", @@ -745,7 +747,6 @@ "init_zone", "init_zoneless_scheduling", "init_zoneless_scheduling_impl", - "initializeDirectives", "inject", "injectArgs", "injectDestroyRef", @@ -840,7 +841,6 @@ "resetPreOrderHookFlags", "resolveDirectives", "resolveForwardRef", - "resolveHostDirectives", "retrieveHydrationInfo", "runEffectsInView", "runInInjectionContext", diff --git a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json index 92ba38bfc4dd..0aa52f0602ba 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -329,6 +329,7 @@ "detectChangesInViewIfRequired", "detectChangesInternal", "diPublicInInjector", + "elementStartFirstCreatePass", "enterDI", "enterView", "epoch", @@ -429,7 +430,6 @@ "inheritHostBindings", "inheritViewQuery", "initFeatures", - "initializeDirectives", "inject", "injectArgs", "injectDestroyRef", @@ -570,7 +570,6 @@ "resetPreOrderHookFlags", "resolveDirectives", "resolveForwardRef", - "resolveHostDirectives", "resolveProvider", "runEffectsInView", "runInInjectionContext", diff --git a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json index cb1ff8f94327..d9e28c7a3dcd 100644 --- a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json @@ -318,6 +318,7 @@ "detectChangesInternal", "diPublicInInjector", "elementPropertyInternal", + "elementStartFirstCreatePass", "enterDI", "enterView", "epoch", @@ -415,7 +416,6 @@ "inheritHostBindings", "inheritViewQuery", "initFeatures", - "initializeDirectives", "inject", "injectArgs", "injectChangeDetectorRef", @@ -561,7 +561,6 @@ "resetPreOrderHookFlags", "resolveDirectives", "resolveForwardRef", - "resolveHostDirectives", "resolveProvider", "resolvedPromise", "resolvedPromise2", diff --git a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json index 816594303233..27dc0c636a35 100644 --- a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json @@ -147,6 +147,7 @@ "cleanUpView", "collectNativeNodes", "collectNativeNodesInLContainer", + "computeStaticStyling", "concatStringsWithSpace", "config", "configureViewWithDirective", @@ -193,6 +194,7 @@ "getClosureSafeProperty", "getComponentDef", "getComponentLViewByIndex", + "getConstant", "getCurrentTNode", "getCurrentTNodePlaceholderOk", "getDeclarationTNode", diff --git a/packages/core/test/bundling/hydration/bundle.golden_symbols.json b/packages/core/test/bundling/hydration/bundle.golden_symbols.json index e6f35276b21e..136c5d0a6bd4 100644 --- a/packages/core/test/bundling/hydration/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hydration/bundle.golden_symbols.json @@ -200,6 +200,7 @@ "clearElementContents", "collectNativeNodes", "collectNativeNodesInLContainer", + "computeStaticStyling", "concatStringsWithSpace", "config", "configureViewWithDirective", @@ -254,6 +255,7 @@ "getClosureSafeProperty", "getComponentDef", "getComponentLViewByIndex", + "getConstant", "getCurrentTNode", "getCurrentTNodePlaceholderOk", "getDOM", diff --git a/packages/core/test/bundling/router/bundle.golden_symbols.json b/packages/core/test/bundling/router/bundle.golden_symbols.json index 5eb4c42f4b78..59bc311d4f7c 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -384,6 +384,7 @@ "detectChangesInViewIfRequired", "detectChangesInternal", "diPublicInInjector", + "elementStartFirstCreatePass", "emptyPathMatch", "encodeUriQuery", "encodeUriSegment", @@ -501,7 +502,6 @@ "includeViewProviders", "incrementInitPhaseFlags", "initFeatures", - "initializeDirectives", "inject", "injectArgs", "injectChangeDetectorRef", @@ -650,7 +650,6 @@ "requiresRefreshOrTraversal", "resetPreOrderHookFlags", "resolveForwardRef", - "resolveHostDirectives", "rootRoute", "routes", "runEffectsInView", diff --git a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json index b28bd07051ec..18c5c91ca5c3 100644 --- a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json +++ b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json @@ -173,6 +173,7 @@ "cleanUpView", "collectNativeNodes", "collectNativeNodesInLContainer", + "computeStaticStyling", "concatStringsWithSpace", "config", "configureViewWithDirective", @@ -221,6 +222,7 @@ "getClosureSafeProperty", "getComponentDef", "getComponentLViewByIndex", + "getConstant", "getCurrentTNode", "getCurrentTNodePlaceholderOk", "getDOM", diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index f1365a8d695e..2a39b5f22be8 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -269,6 +269,7 @@ "detectChangesInViewIfRequired", "detectChangesInternal", "diPublicInInjector", + "elementStartFirstCreatePass", "enterDI", "enterView", "errorContext", @@ -351,7 +352,6 @@ "includeViewProviders", "incrementInitPhaseFlags", "initFeatures", - "initializeDirectives", "inject", "injectArgs", "injectDestroyRef", @@ -453,7 +453,6 @@ "resetPreOrderHookFlags", "resolveDirectives", "resolveForwardRef", - "resolveHostDirectives", "runEffectsInView", "runInInjectionContext", "saveNameToExportMap", From d8fca6d3df9c35e26350d3350258abbe1722e84d Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Thu, 30 Jan 2025 16:44:09 -0800 Subject: [PATCH 0020/1000] refactor(core): reuse element end first creation pass (#59843) Reuse element end first creation pass in ComponentRef impl. PR Close #59843 --- packages/core/src/render3/component_ref.ts | 7 ++++--- packages/core/src/render3/instructions/element.ts | 7 ++----- packages/core/src/render3/view/elements.ts | 12 +++++++++++- .../animations-standalone/bundle.golden_symbols.json | 2 +- .../bundling/animations/bundle.golden_symbols.json | 2 +- .../cyclic_import/bundle.golden_symbols.json | 2 +- .../test/bundling/defer/bundle.golden_symbols.json | 1 + .../forms_reactive/bundle.golden_symbols.json | 1 + .../forms_template_driven/bundle.golden_symbols.json | 1 + .../bundling/hello_world/bundle.golden_symbols.json | 1 + .../bundling/hydration/bundle.golden_symbols.json | 1 + .../test/bundling/router/bundle.golden_symbols.json | 2 +- .../standalone_bootstrap/bundle.golden_symbols.json | 1 + .../test/bundling/todo/bundle.golden_symbols.json | 1 + 14 files changed, 28 insertions(+), 13 deletions(-) diff --git a/packages/core/src/render3/component_ref.ts b/packages/core/src/render3/component_ref.ts index 56c6c03223d2..188c2deaea97 100644 --- a/packages/core/src/render3/component_ref.ts +++ b/packages/core/src/render3/component_ref.ts @@ -80,7 +80,7 @@ import {executeContentQueries} from './queries/query_execution'; import {enterView, leaveView} from './state'; import {debugStringifyTypeForError, stringifyForError} from './util/stringify_utils'; import {getComponentLViewByIndex, getTNode} from './util/view_utils'; -import {elementStartFirstCreatePass} from './view/elements'; +import {elementEndFirstCreatePass, elementStartFirstCreatePass} from './view/elements'; import {ViewRef} from './view_ref'; export class ComponentFactoryResolver extends AbstractComponentFactoryResolver { @@ -349,6 +349,8 @@ export class ComponentFactory extends AbstractComponentFactory { 0, ); + // ---- element instruction + // TODO(crisbeto): in practice `hostRNode` should always be defined, but there are some // tests where the renderer is mocked out and `undefined` is returned. We should update the // tests so that this check can be removed. @@ -361,8 +363,7 @@ export class ComponentFactory extends AbstractComponentFactory { createDirectivesInstances(rootTView, rootLView, hostTNode); executeContentQueries(rootTView, hostTNode, rootLView); - // TODO(pk): code / logic duplication with the elementEnd and similar instructions - registerPostOrderHooks(rootTView, hostTNode); + elementEndFirstCreatePass(rootTView, hostTNode); if (projectableNodes !== undefined) { projectNodes(hostTNode, this.ngContentSelectors, projectableNodes); diff --git a/packages/core/src/render3/instructions/element.ts b/packages/core/src/render3/instructions/element.ts index e5bc59c73a5e..caf36b54ebe7 100644 --- a/packages/core/src/render3/instructions/element.ts +++ b/packages/core/src/render3/instructions/element.ts @@ -61,7 +61,7 @@ import { setCurrentTNodeAsNotParent, wasLastNodeCreated, } from '../state'; -import {elementStartFirstCreatePass} from '../view/elements'; +import {elementEndFirstCreatePass, elementStartFirstCreatePass} from '../view/elements'; import {validateElementIsKnown} from './element_validation'; import {setDirectiveInputsWhichShadowsStyling} from './property'; @@ -182,10 +182,7 @@ export function ɵɵelementEnd(): typeof ɵɵelementEnd { const tView = getTView(); if (tView.firstCreatePass) { - registerPostOrderHooks(tView, currentTNode); - if (isContentQueryHost(currentTNode)) { - tView.queries!.elementEnd(currentTNode); - } + elementEndFirstCreatePass(tView, tNode); } if (tNode.classesWithoutHost != null && hasClassInput(tNode)) { diff --git a/packages/core/src/render3/view/elements.ts b/packages/core/src/render3/view/elements.ts index bd2b98ecb60c..a0f7615a1c6a 100644 --- a/packages/core/src/render3/view/elements.ts +++ b/packages/core/src/render3/view/elements.ts @@ -7,7 +7,9 @@ */ import {assertFirstCreatePass} from '../assert'; -import {TAttributes, TNodeType, type TElementNode} from '../interfaces/node'; +import {registerPostOrderHooks} from '../hooks'; +import {TAttributes, TNode, TNodeType, type TElementNode} from '../interfaces/node'; +import {isContentQueryHost} from '../interfaces/type_checks'; import type {LView, TView} from '../interfaces/view'; import {computeStaticStyling} from '../styling/static_styling'; import {getOrCreateTNode} from '../tnode_manipulation'; @@ -59,3 +61,11 @@ export function elementStartFirstCreatePass( return tNode; } + +export function elementEndFirstCreatePass(tView: TView, tNode: TNode) { + ngDevMode && assertFirstCreatePass(tView); + registerPostOrderHooks(tView, tNode); + if (isContentQueryHost(tNode)) { + tView.queries!.elementEnd(tNode); + } +} diff --git a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json index c4dc4dbf2e8e..d29d857d7ea6 100644 --- a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json @@ -275,6 +275,7 @@ "detectChangesInternal", "diPublicInInjector", "documentElement", + "elementEndFirstCreatePass", "elementStartFirstCreatePass", "enterDI", "enterView", @@ -430,7 +431,6 @@ "producerUpdateValueVersion", "refreshContentQueries", "refreshView", - "registerPostOrderHooks", "rememberChangeHistoryAndInvokeOnChangesHook", "remove", "removeClass", diff --git a/packages/core/test/bundling/animations/bundle.golden_symbols.json b/packages/core/test/bundling/animations/bundle.golden_symbols.json index 3806cb7d9408..570313bb93c0 100644 --- a/packages/core/test/bundling/animations/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations/bundle.golden_symbols.json @@ -296,6 +296,7 @@ "detectChangesInternal", "diPublicInInjector", "documentElement", + "elementEndFirstCreatePass", "elementStartFirstCreatePass", "enterDI", "enterView", @@ -456,7 +457,6 @@ "producerUpdateValueVersion", "refreshContentQueries", "refreshView", - "registerPostOrderHooks", "rememberChangeHistoryAndInvokeOnChangesHook", "remove", "removeClass", diff --git a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json index 39918ff060cf..2a30f21da706 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -227,6 +227,7 @@ "detectChangesInViewIfRequired", "detectChangesInternal", "diPublicInInjector", + "elementEndFirstCreatePass", "elementStartFirstCreatePass", "enterDI", "enterView", @@ -370,7 +371,6 @@ "producerUpdateValueVersion", "refreshContentQueries", "refreshView", - "registerPostOrderHooks", "rememberChangeHistoryAndInvokeOnChangesHook", "remove", "removeElements", diff --git a/packages/core/test/bundling/defer/bundle.golden_symbols.json b/packages/core/test/bundling/defer/bundle.golden_symbols.json index b146f5648673..f5240ad007fe 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -276,6 +276,7 @@ "detectChangesInViewIfRequired", "detectChangesInternal", "diPublicInInjector", + "elementEndFirstCreatePass", "elementStartFirstCreatePass", "enterDI", "enterView", diff --git a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json index 0aa52f0602ba..2f03619513f1 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -329,6 +329,7 @@ "detectChangesInViewIfRequired", "detectChangesInternal", "diPublicInInjector", + "elementEndFirstCreatePass", "elementStartFirstCreatePass", "enterDI", "enterView", diff --git a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json index d9e28c7a3dcd..0fbdd4496313 100644 --- a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json @@ -317,6 +317,7 @@ "detectChangesInViewIfRequired", "detectChangesInternal", "diPublicInInjector", + "elementEndFirstCreatePass", "elementPropertyInternal", "elementStartFirstCreatePass", "enterDI", diff --git a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json index 27dc0c636a35..572591d83584 100644 --- a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json @@ -249,6 +249,7 @@ "isApplicationBootstrapConfig", "isComponentDef", "isComponentHost", + "isContentQueryHost", "isDestroyed", "isDetachedByI18n", "isEnvironmentProviders", diff --git a/packages/core/test/bundling/hydration/bundle.golden_symbols.json b/packages/core/test/bundling/hydration/bundle.golden_symbols.json index 136c5d0a6bd4..dff15f8056b1 100644 --- a/packages/core/test/bundling/hydration/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hydration/bundle.golden_symbols.json @@ -325,6 +325,7 @@ "isAsyncIterable", "isComponentDef", "isComponentHost", + "isContentQueryHost", "isDestroyed", "isDetachedByI18n", "isDisconnectedNode", diff --git a/packages/core/test/bundling/router/bundle.golden_symbols.json b/packages/core/test/bundling/router/bundle.golden_symbols.json index 59bc311d4f7c..18986f825092 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -384,6 +384,7 @@ "detectChangesInViewIfRequired", "detectChangesInternal", "diPublicInInjector", + "elementEndFirstCreatePass", "elementStartFirstCreatePass", "emptyPathMatch", "encodeUriQuery", @@ -637,7 +638,6 @@ "refCount", "refreshContentQueries", "refreshView", - "registerPostOrderHooks", "rememberChangeHistoryAndInvokeOnChangesHook", "remove", "removeElements", diff --git a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json index 18c5c91ca5c3..03b423665752 100644 --- a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json +++ b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json @@ -278,6 +278,7 @@ "isApplicationBootstrapConfig", "isComponentDef", "isComponentHost", + "isContentQueryHost", "isDestroyed", "isDetachedByI18n", "isEnvironmentProviders", diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index 2a39b5f22be8..653c95a7e1d8 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -269,6 +269,7 @@ "detectChangesInViewIfRequired", "detectChangesInternal", "diPublicInInjector", + "elementEndFirstCreatePass", "elementStartFirstCreatePass", "enterDI", "enterView", From 41b1a7c5820bf2bf96824994257fb8062b5807e6 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Tue, 4 Feb 2025 11:48:46 -0800 Subject: [PATCH 0021/1000] refactor(core): minor code cleanups (#59843) Some minor code cleanups after code changes in previous commits. PR Close #59843 --- .../core/src/render3/view/construction.ts | 2 +- packages/core/src/render3/view/directives.ts | 38 +++++++++---------- 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/packages/core/src/render3/view/construction.ts b/packages/core/src/render3/view/construction.ts index 5464e0f0bf6c..c865a5ea8513 100644 --- a/packages/core/src/render3/view/construction.ts +++ b/packages/core/src/render3/view/construction.ts @@ -23,7 +23,7 @@ export function allocExpando( tView: TView, lView: LView, numSlotsToAlloc: number, - initialValue: any, + initialValue: unknown, ): number { if (numSlotsToAlloc === 0) return -1; if (ngDevMode) { diff --git a/packages/core/src/render3/view/directives.ts b/packages/core/src/render3/view/directives.ts index 1a13d2d47655..440300a1b493 100644 --- a/packages/core/src/render3/view/directives.ts +++ b/packages/core/src/render3/view/directives.ts @@ -66,7 +66,7 @@ export function resolveDirectives( // tsickle. ngDevMode && assertFirstCreatePass(tView); - const exportsMap: {[key: string]: number} | null = localRefs === null ? null : {'': -1}; + const exportsMap: Record | null = localRefs === null ? null : {'': -1}; const matchedDirectiveDefs = directiveMatcher(tView, tNode); if (matchedDirectiveDefs !== null) { @@ -77,30 +77,30 @@ export function resolveDirectives( ); initializeDirectives(tView, lView, tNode, directiveDefs, exportsMap, hostDirectiveDefs); } - if (exportsMap) cacheMatchingLocalNames(tNode, localRefs, exportsMap); + if (exportsMap !== null && localRefs !== null) { + cacheMatchingLocalNames(tNode, localRefs, exportsMap); + } } /** Caches local names and their matching directive indices for query and template lookups. */ function cacheMatchingLocalNames( tNode: TNode, - localRefs: string[] | null, + localRefs: string[], exportsMap: {[key: string]: number}, ): void { - if (localRefs) { - const localNames: (string | number)[] = (tNode.localNames = []); - - // Local names must be stored in tNode in the same order that localRefs are defined - // in the template to ensure the data is loaded in the same slots as their refs - // in the template (for template queries). - for (let i = 0; i < localRefs.length; i += 2) { - const index = exportsMap[localRefs[i + 1]]; - if (index == null) - throw new RuntimeError( - RuntimeErrorCode.EXPORT_NOT_FOUND, - ngDevMode && `Export of name '${localRefs[i + 1]}' not found!`, - ); - localNames.push(localRefs[i], index); - } + const localNames: (string | number)[] = (tNode.localNames = []); + + // Local names must be stored in tNode in the same order that localRefs are defined + // in the template to ensure the data is loaded in the same slots as their refs + // in the template (for template queries). + for (let i = 0; i < localRefs.length; i += 2) { + const index = exportsMap[localRefs[i + 1]]; + if (index == null) + throw new RuntimeError( + RuntimeErrorCode.EXPORT_NOT_FOUND, + ngDevMode && `Export of name '${localRefs[i + 1]}' not found!`, + ); + localNames.push(localRefs[i], index); } } @@ -281,8 +281,6 @@ function initializeInputAndOutputAliases( ); // Do not use unbound attributes as inputs to structural directives, since structural // directive inputs can only be set using microsyntax (e.g. `
`). - // TODO(FW-1930): microsyntax expressions may also contain unbound/static attributes, which - // should be set for inline templates. const initialInputs = inputsStore !== null && tNodeAttrs !== null && !isInlineTemplate(tNode) ? generateInitialInputs(inputsStore, directiveIndex, tNodeAttrs) From fa0c3e3210885a36e5c9e9eb76e821032f5cd215 Mon Sep 17 00:00:00 2001 From: Jeremias Peier Date: Thu, 28 Apr 2022 09:44:08 +0200 Subject: [PATCH 0022/1000] feat(forms): support type set in form validators (#45793) Previously, using `Validators.required`, `Validators.minLength` and `Validators.maxLength` validators don't work with sets because a set has the `size` property instead of the `length` property. This change enables the validators to be working with sets. PR Close #45793 --- .../forms_reactive/bundle.golden_symbols.json | 2 +- packages/forms/src/validators.ts | 80 ++++++++++++------- packages/forms/test/validators_spec.ts | 50 ++++++++++++ 3 files changed, 100 insertions(+), 32 deletions(-) diff --git a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json index 2f03619513f1..0e3f42dc2c07 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -418,7 +418,6 @@ "hasInSkipHydrationBlockFlag", "hasParentInjector", "hasTagAndTypeMatch", - "hasValidLength", "hasValidator", "icuContainerIterate", "identity", @@ -496,6 +495,7 @@ "leaveDI", "leaveView", "leaveViewLight", + "lengthOrSize", "lookupTokenUsingModuleInjector", "lookupTokenUsingNodeInjector", "makeParamDecorator", diff --git a/packages/forms/src/validators.ts b/packages/forms/src/validators.ts index 02972fb71d8f..18dc22a86176 100644 --- a/packages/forms/src/validators.ts +++ b/packages/forms/src/validators.ts @@ -25,20 +25,27 @@ import type { import {RuntimeErrorCode} from './errors'; import type {AbstractControl} from './model/abstract_model'; -function isEmptyInputValue(value: any): boolean { - /** - * Check if the object is a string or array before evaluating the length attribute. - * This avoids falsely rejecting objects that contain a custom length attribute. - * For example, the object {id: 1, length: 0, width: 0} should not be returned as empty. - */ - return ( - value == null || ((typeof value === 'string' || Array.isArray(value)) && value.length === 0) - ); +function isEmptyInputValue(value: unknown): boolean { + return value == null || lengthOrSize(value) === 0; } -function hasValidLength(value: any): boolean { +/** + * Extract the length property in case it's an array or a string. + * Extract the size property in case it's a set. + * Return null else. + * @param value Either an array, set or undefined. + */ +function lengthOrSize(value: unknown): number | null { // non-strict comparison is intentional, to check for both `null` and `undefined` values - return value != null && typeof value.length === 'number'; + if (value == null) { + return null; + } else if (Array.isArray(value) || typeof value === 'string') { + return value.length; + } else if (value instanceof Set) { + return value.size; + } + + return null; } /** @@ -290,13 +297,14 @@ export class Validators { /** * @description - * Validator that requires the length of the control's value to be greater than or equal - * to the provided minimum length. This validator is also provided by default if you use the + * Validator that requires the number of items in the control's value to be greater than or equal + * to the provided minimum length. This validator is also provided by default if you use * the HTML5 `minlength` attribute. Note that the `minLength` validator is intended to be used - * only for types that have a numeric `length` property, such as strings or arrays. The - * `minLength` validator logic is also not invoked for values when their `length` property is 0 - * (for example in case of an empty string or an empty array), to support optional controls. You - * can use the standard `required` validator if empty values should not be considered valid. + * only for types that have a numeric `length` or `size` property, such as strings, arrays or + * sets. The `minLength` validator logic is also not invoked for values when their `length` or + * `size` property is 0 (for example in case of an empty string or an empty array), to support + * optional controls. You can use the standard `required` validator if empty values should not be + * considered valid. * * @usageNotes * @@ -324,10 +332,11 @@ export class Validators { /** * @description - * Validator that requires the length of the control's value to be less than or equal - * to the provided maximum length. This validator is also provided by default if you use the + * Validator that requires the number of items in the control's value to be less than or equal + * to the provided maximum length. This validator is also provided by default if you use * the HTML5 `maxlength` attribute. Note that the `maxLength` validator is intended to be used - * only for types that have a numeric `length` property, such as strings or arrays. + * only for types that have a numeric `length` or `size` property, such as strings, arrays or + * sets. * * @usageNotes * @@ -456,7 +465,7 @@ export class Validators { */ export function minValidator(min: number): ValidatorFn { return (control: AbstractControl): ValidationErrors | null => { - if (isEmptyInputValue(control.value) || isEmptyInputValue(min)) { + if (control.value == null || min == null) { return null; // don't validate empty values to allow optional controls } const value = parseFloat(control.value); @@ -472,7 +481,7 @@ export function minValidator(min: number): ValidatorFn { */ export function maxValidator(max: number): ValidatorFn { return (control: AbstractControl): ValidationErrors | null => { - if (isEmptyInputValue(control.value) || isEmptyInputValue(max)) { + if (control.value == null || max == null) { return null; // don't validate empty values to allow optional controls } const value = parseFloat(control.value); @@ -511,32 +520,41 @@ export function emailValidator(control: AbstractControl): ValidationErrors | nul } /** - * Validator that requires the length of the control's value to be greater than or equal + * Validator that requires the number of items in the control's value to be greater than or equal * to the provided minimum length. See `Validators.minLength` for additional information. + * + * The minLengthValidator respects every length property in an object, regardless of whether it's an array. + * For example, the object {id: 1, length: 0, width: 0} should be validated. */ export function minLengthValidator(minLength: number): ValidatorFn { return (control: AbstractControl): ValidationErrors | null => { - if (isEmptyInputValue(control.value) || !hasValidLength(control.value)) { + const length = control.value?.length ?? lengthOrSize(control.value); + if (length === null || length === 0) { // don't validate empty values to allow optional controls - // don't validate values without `length` property + // don't validate values without `length` or `size` property return null; } - return control.value.length < minLength - ? {'minlength': {'requiredLength': minLength, 'actualLength': control.value.length}} + return length < minLength + ? {'minlength': {'requiredLength': minLength, 'actualLength': length}} : null; }; } /** - * Validator that requires the length of the control's value to be less than or equal + * Validator that requires the number of items in the control's value to be less than or equal * to the provided maximum length. See `Validators.maxLength` for additional information. + * + * The maxLengthValidator respects every length property in an object, regardless of whether it's an array. + * For example, the object {id: 1, length: 0, width: 0} should be validated. */ export function maxLengthValidator(maxLength: number): ValidatorFn { return (control: AbstractControl): ValidationErrors | null => { - return hasValidLength(control.value) && control.value.length > maxLength - ? {'maxlength': {'requiredLength': maxLength, 'actualLength': control.value.length}} - : null; + const length = control.value?.length ?? lengthOrSize(control.value); + if (length !== null && length > maxLength) { + return {'maxlength': {'requiredLength': maxLength, 'actualLength': length}}; + } + return null; }; } diff --git a/packages/forms/test/validators_spec.ts b/packages/forms/test/validators_spec.ts index 0a6519c7e95f..572378dddd49 100644 --- a/packages/forms/test/validators_spec.ts +++ b/packages/forms/test/validators_spec.ts @@ -209,6 +209,18 @@ import {normalizeValidators} from '../src/validators'; it('should not error on an object containing a length attribute that is zero', () => { expect(Validators.required(new FormControl({id: 1, length: 0, width: 0}))).toBeNull(); }); + + it('should error on an empty set', () => { + expect(Validators.required(new FormControl(new Set()))).toEqual({'required': true}); + }); + + it('should not error on a non-empty set', () => { + expect(Validators.required(new FormControl(new Set([1, 2])))).toBeNull(); + }); + + it('should not error on an object containing a size attribute that is zero', () => { + expect(Validators.required(new FormControl({id: 1, size: 0, width: 0}))).toBeNull(); + }); }); describe('requiredTrue', () => { @@ -246,6 +258,10 @@ import {normalizeValidators} from '../src/validators'; expect(Validators.minLength(2)(new FormControl(undefined))).toBeNull(); }); + it('should not error on empty array', () => { + expect(Validators.minLength(2)(new FormControl([]))).toBeNull(); + }); + it('should not error on valid strings', () => { expect(Validators.minLength(2)(new FormControl('aa'))).toBeNull(); }); @@ -287,6 +303,24 @@ import {normalizeValidators} from '../src/validators'; expect(Validators.minLength(1)(new FormControl(true))).toBeNull(); expect(Validators.minLength(1)(new FormControl(false))).toBeNull(); }); + + it('should trigger validation for an object that contains numeric size property', () => { + const value = new Set([1, 2, 3, 4, 5]); + expect(Validators.minLength(1)(new FormControl(value))).toBeNull(); + expect(Validators.minLength(10)(new FormControl(value))).toEqual({ + 'minlength': {'requiredLength': 10, 'actualLength': 5}, + }); + }); + + it('should not error on empty set', () => { + const value = new Set(); + expect(Validators.minLength(1)(new FormControl(value))).toBeNull(); + }); + + it('should return null when passing a boolean', () => { + expect(Validators.minLength(1)(new FormControl(true))).toBeNull(); + expect(Validators.minLength(1)(new FormControl(false))).toBeNull(); + }); }); describe('maxLength', () => { @@ -339,6 +373,22 @@ import {normalizeValidators} from '../src/validators'; }); }); + it('should trigger validation for an object that contains numeric length property', () => { + const value = {length: 5, someValue: [1, 2, 3, 4, 5]}; + expect(Validators.maxLength(10)(new FormControl(value))).toBeNull(); + expect(Validators.maxLength(1)(new FormControl(value))).toEqual({ + 'maxlength': {'requiredLength': 1, 'actualLength': 5}, + }); + }); + + it('should trigger validation for an object that contains numeric size property', () => { + const value = new Set([1, 2, 3, 4, 5]); + expect(Validators.maxLength(10)(new FormControl(value))).toBeNull(); + expect(Validators.maxLength(1)(new FormControl(value))).toEqual({ + 'maxlength': {'requiredLength': 1, 'actualLength': 5}, + }); + }); + it('should return null when passing a boolean', () => { expect(Validators.maxLength(1)(new FormControl(true))).toBeNull(); expect(Validators.maxLength(1)(new FormControl(false))).toBeNull(); From 5191a41a18dda9720b5fd2b20f6bc0569d8a5b32 Mon Sep 17 00:00:00 2001 From: hyperlife1119 Date: Fri, 11 Oct 2024 11:34:58 +0800 Subject: [PATCH 0023/1000] =?UTF-8?q?docs(service-worker):=20corrected=20d?= =?UTF-8?q?efault=20values=20=E2=80=8B=E2=80=8Bfor=20navigation=20URLs=20(?= =?UTF-8?q?#58156)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The default value described in the documentation is inconsistent with the actual default value. PR Close #58156 --- adev/src/content/ecosystem/service-workers/config.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/adev/src/content/ecosystem/service-workers/config.md b/adev/src/content/ecosystem/service-workers/config.md index a4d16eea2985..1cdf056d346c 100644 --- a/adev/src/content/ecosystem/service-workers/config.md +++ b/adev/src/content/ecosystem/service-workers/config.md @@ -318,7 +318,7 @@ If not specified, the default value depends on the data group's configured strat | Groups with the `performance` strategy | The default value is `false` and the service worker doesn't cache opaque responses. These groups would continue to return a cached response until `maxAge` expires, even if the error was due to a temporary network or server issue. Therefore, it would be problematic for the service worker to cache an error response. | - + In case you are not familiar, an [opaque response](https://fetch.spec.whatwg.org#concept-filtered-response-opaque) is a special type of response returned when requesting a resource that is on a different origin which doesn't return CORS headers. One of the characteristics of an opaque response is that the service worker is not allowed to read its status, meaning it can't check if the request was successful or not. See [Introduction to `fetch()`](https://developers.google.com/web/updates/2015/03/introduction-to-fetch#response_types) for more details. @@ -366,9 +366,9 @@ If the field is omitted, it defaults to: [ '/**', // Include all URLs. - '!/**/*.*', // Exclude URLs to files. - '!/**/****', // Exclude URLs containing `**` in the last segment. - '!/**/****/**', // Exclude URLs containing `**` in any other segment. + '!/**/*.*', // Exclude URLs to files (containing a file extension in the last segment). + '!/**/*__*', // Exclude URLs containing `__` in the last segment. + '!/**/*__*/**', // Exclude URLs containing `__` in any other segment. ] From a299e02e9141cdc4d74185deb58308fa010bb36e Mon Sep 17 00:00:00 2001 From: Miles Malerba Date: Wed, 29 Jan 2025 23:03:46 +0000 Subject: [PATCH 0024/1000] fix(core): preserve tracing snapshot until tick finishes (#59796) This change waits until the end of `tick` to clear the tracing snapshot. This ensures that if we notify the scheduler during `tick` the correct tracing snapshot is used. PR Close #59796 --- .../core/src/application/application_ref.ts | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/packages/core/src/application/application_ref.ts b/packages/core/src/application/application_ref.ts index 23590d23fac1..4f610e7b937a 100644 --- a/packages/core/src/application/application_ref.ts +++ b/packages/core/src/application/application_ref.ts @@ -43,11 +43,11 @@ import {ViewRef as InternalViewRef} from '../render3/view_ref'; import {TESTABILITY} from '../testability/testability'; import {NgZone} from '../zone/ng_zone'; +import {profiler} from '../render3/profiler'; +import {ProfilerEvent} from '../render3/profiler_types'; +import {EffectScheduler} from '../render3/reactivity/root_effect_scheduler'; import {ApplicationInitStatus} from './application_init'; import {TracingAction, TracingService, TracingSnapshot} from './tracing'; -import {EffectScheduler} from '../render3/reactivity/root_effect_scheduler'; -import {ProfilerEvent} from '../render3/profiler_types'; -import {profiler} from '../render3/profiler'; /** * A DI token that provides a set of callbacks to @@ -580,21 +580,20 @@ export class ApplicationRef { } /** @internal */ - _tick = (): void => { + _tick(): void { profiler(ProfilerEvent.ChangeDetectionStart); if (this.tracingSnapshot !== null) { - const snapshot = this.tracingSnapshot; - this.tracingSnapshot = null; - - // Ensure we always run `_tick()` in the context of the most recent snapshot, + // Ensure we always run `tickImpl()` in the context of the most recent snapshot, // if one exists. Snapshots may be reference counted by the implementation so // we want to ensure that if we request a snapshot that we use it. - snapshot.run(TracingAction.CHANGE_DETECTION, this._tick); - snapshot.dispose(); - return; + this.tracingSnapshot.run(TracingAction.CHANGE_DETECTION, this.tickImpl); + } else { + this.tickImpl(); } + } + private tickImpl = (): void => { (typeof ngDevMode === 'undefined' || ngDevMode) && warnIfDestroyed(this._destroyed); if (this._runningTick) { throw new RuntimeError( @@ -617,6 +616,8 @@ export class ApplicationRef { this.internalErrorHandler(e); } finally { this._runningTick = false; + this.tracingSnapshot?.dispose(); + this.tracingSnapshot = null; setActiveConsumer(prevConsumer); this.afterTick.next(); From a592fbc8cd77be488aa9c4d5b66d6e84397b7340 Mon Sep 17 00:00:00 2001 From: muhammadali1658 Date: Tue, 4 Feb 2025 10:29:13 +0000 Subject: [PATCH 0025/1000] docs: fix broken link of FID (#59848) PR Close #59848 --- adev/src/content/guide/incremental-hydration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adev/src/content/guide/incremental-hydration.md b/adev/src/content/guide/incremental-hydration.md index 6ba5a5534449..a11a7e638e25 100644 --- a/adev/src/content/guide/incremental-hydration.md +++ b/adev/src/content/guide/incremental-hydration.md @@ -6,7 +6,7 @@ Tip: Incremental hydration is currently in [developer preview](/reference/releas ## Why use incremental hydration? -Incremental hydration is a performance improvement that builds on top of full application hydration. It can produce smaller initial bundles while still providing an end-user experience that is comparable to a full application hydration experience. Smaller bundles improve initial load times, reducing [First Input Delay (FID)](<(https://web.dev/fid)>) and [Cumulative Layout Shift (CLS)](https://web.dev/cls). +Incremental hydration is a performance improvement that builds on top of full application hydration. It can produce smaller initial bundles while still providing an end-user experience that is comparable to a full application hydration experience. Smaller bundles improve initial load times, reducing [First Input Delay (FID)](https://web.dev/fid) and [Cumulative Layout Shift (CLS)](https://web.dev/cls). Incremental hydration also lets you use deferrable views (`@defer`) for content that may not have been deferrable before. Specifically, you can now use deferrable views for content that is above the fold. Prior to incremental hydration, putting a `@defer` block above the fold would result in placeholder content rendering and then being replaced by the `@defer` block's main template content. This would result in a layout shift. Incremental hydration means the main template of the `@defer` block will render with no layout shift on hydration. From 4d2684d9a316606b058485a5ee97b6fdb3eac001 Mon Sep 17 00:00:00 2001 From: Jeevan Mahesha Date: Wed, 27 Nov 2024 21:47:02 +0530 Subject: [PATCH 0026/1000] docs: Add v18 Angular version link to versions configuration (#58933) PR Close #58933 --- adev/src/app/core/constants/versions.ts | 4 ++++ adev/src/app/core/services/version-manager.service.spec.ts | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/adev/src/app/core/constants/versions.ts b/adev/src/app/core/constants/versions.ts index fcb60cbd7702..1c62311727d2 100644 --- a/adev/src/app/core/constants/versions.ts +++ b/adev/src/app/core/constants/versions.ts @@ -9,6 +9,10 @@ export const VERSIONS_CONFIG = { aDevVersionsLinkPattern: 'https://{{prefix}}{{version}}angular.dev', aioVersions: [ + { + version: 'v18', + url: 'https://v18.angular.dev/overview', + }, { version: 'v17', url: 'https://v17.angular.io/docs', diff --git a/adev/src/app/core/services/version-manager.service.spec.ts b/adev/src/app/core/services/version-manager.service.spec.ts index 5c609243ffac..73b31a5c3195 100644 --- a/adev/src/app/core/services/version-manager.service.spec.ts +++ b/adev/src/app/core/services/version-manager.service.spec.ts @@ -39,8 +39,8 @@ describe('VersionManager', () => { }); it('should contain correct number of Angular Docs versions', () => { - // Note: From v2 to v17 (inclusive), there were no v3 - const expectedAioDocsVersionsCount = 15; + // Note: From v2 to v18 (inclusive), there were no v3 + const expectedAioDocsVersionsCount = 16; // Last stable version and next const expectedRecentDocsVersionCount = 2; From 8ee91bceed3f5b47c6f18ce189a4c5287ade5887 Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Wed, 5 Feb 2025 11:42:26 -0800 Subject: [PATCH 0027/1000] build: remove self from unavailable list (#59858) remove self from unavailable list PR Close #59858 --- .pullapprove.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pullapprove.yml b/.pullapprove.yml index 8c2a456aa41c..13b9da5773e2 100644 --- a/.pullapprove.yml +++ b/.pullapprove.yml @@ -56,8 +56,8 @@ version: 3 -availability: - users_unavailable: ['atscott'] +# availability: +# users_unavailable: ['atscott'] # Meta field that goes unused by PullApprove to allow for defining aliases to be # used throughout the config. From b592b1b0516786c52c7d0638c4e7545b0de8a545 Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Tue, 4 Feb 2025 09:32:09 -0800 Subject: [PATCH 0028/1000] fix(core): fix race condition in resource() (#59851) The refactoring of `resource()` to use `linkedSignal()` introduced the potential for a race condition where resources would get stuck and not update in response to a request change. This occurred under a specific condition: 1. The request changes while the resource is still in loading state 2. The resource resolves the previous load before its `effect()` reacts to the request change. In practice, the window for this race is small, because the request change in (1) will schedule the effect in (2) immediately. However, it's easier to trigger this sequencing in tests, especially when one resource depends on the output of another. To fix the race condition, the resource impl is refactored to track the request in its state, and ignore resolved values or streams for stale requests. This refactoring actually makes the resource code simpler and easier to follow as well. Fixes #59842 PR Close #59851 --- goldens/public-api/core/index.api.md | 9 +- packages/core/rxjs-interop/src/rx_resource.ts | 1 + packages/core/src/resource/api.ts | 17 +- packages/core/src/resource/resource.ts | 169 +++++++++--------- packages/core/test/resource/resource_spec.ts | 44 +++++ 5 files changed, 157 insertions(+), 83 deletions(-) diff --git a/goldens/public-api/core/index.api.md b/goldens/public-api/core/index.api.md index 28197e6d9f02..4e8fde3b2ea0 100644 --- a/goldens/public-api/core/index.api.md +++ b/goldens/public-api/core/index.api.md @@ -1447,6 +1447,7 @@ export type Predicate = (value: T) => boolean; // @public export interface PromiseResourceOptions extends BaseResourceOptions { loader: ResourceLoader; + stream?: never; } // @public @@ -1649,11 +1650,14 @@ export enum ResourceStatus { } // @public -export type ResourceStreamingLoader = (param: ResourceLoaderParams) => PromiseLike = (param: ResourceLoaderParams) => PromiseLike>>; + +// @public (undocumented) +export type ResourceStreamItem = { value: T; } | { error: unknown; -}>>; +}; // @public export const RESPONSE_INIT: InjectionToken; @@ -1771,6 +1775,7 @@ export type StaticProvider = ValueProvider | ExistingProvider | StaticClassProvi // @public export interface StreamingResourceOptions extends BaseResourceOptions { + loader?: never; stream: ResourceStreamingLoader; } diff --git a/packages/core/rxjs-interop/src/rx_resource.ts b/packages/core/rxjs-interop/src/rx_resource.ts index 805eeaa46304..92976f577369 100644 --- a/packages/core/rxjs-interop/src/rx_resource.ts +++ b/packages/core/rxjs-interop/src/rx_resource.ts @@ -47,6 +47,7 @@ export function rxResource(opts: RxResourceOptions): ResourceRef({ ...opts, + loader: undefined, stream: (params) => { let sub: Subscription; diff --git a/packages/core/src/resource/api.ts b/packages/core/src/resource/api.ts index ddb1f95acf20..a6cbab70cb6d 100644 --- a/packages/core/src/resource/api.ts +++ b/packages/core/src/resource/api.ts @@ -169,7 +169,7 @@ export type ResourceLoader = (param: ResourceLoaderParams) => PromiseLi */ export type ResourceStreamingLoader = ( param: ResourceLoaderParams, -) => PromiseLike>; +) => PromiseLike>>; /** * Options to the `resource` function, for creating a resource. @@ -212,6 +212,11 @@ export interface PromiseResourceOptions extends BaseResourceOptions * Loading function which returns a `Promise` of the resource's value for a given request. */ loader: ResourceLoader; + + /** + * Cannot specify `stream` and `loader` at the same time. + */ + stream?: never; } /** @@ -225,9 +230,19 @@ export interface StreamingResourceOptions extends BaseResourceOptions; + + /** + * Cannot specify `stream` and `loader` at the same time. + */ + loader?: never; } /** * @experimental */ export type ResourceOptions = PromiseResourceOptions | StreamingResourceOptions; + +/** + * @experimental + */ +export type ResourceStreamItem = {value: T} | {error: unknown}; diff --git a/packages/core/src/resource/resource.ts b/packages/core/src/resource/resource.ts index 18ba9d0f7d2d..79d889c07f2f 100644 --- a/packages/core/src/resource/resource.ts +++ b/packages/core/src/resource/resource.ts @@ -15,14 +15,15 @@ import { ResourceOptions, ResourceStatus, WritableResource, - ResourceLoader, Resource, ResourceRef, ResourceStreamingLoader, - PromiseResourceOptions, StreamingResourceOptions, + ResourceStreamItem, } from './api'; + import {ValueEqualityFn} from '@angular/core/primitives/signals'; + import {Injector} from '../di/injector'; import {assertInInjectionContext} from '../di/contextual'; import {inject} from '../di/injector_compatibility'; @@ -67,16 +68,30 @@ export function resource(options: ResourceOptions): ResourceRef { - // Error state is defined as Resolved && state.error. - status: Exclude; +interface ResourceProtoState { + extRequest: WrappedRequest; + + // For simplicity, status is internally tracked as a subset of the public status enum. + // Reloading and Error statuses are projected from Loading and Resolved based on other state. + status: ResourceInternalStatus; +} + +interface ResourceState extends ResourceProtoState { previousStatus: ResourceStatus; - stream: Signal<{value: T} | {error: unknown}> | undefined; + stream: Signal> | undefined; } +type WrappedRequest = {request: unknown; reload: number}; + /** * Base class which implements `.value` as a `WritableSignal` by delegating `.set` and `.update`. */ @@ -116,18 +131,18 @@ abstract class BaseWritableResource implements WritableResource { * Implementation for `resource()` which uses a `linkedSignal` to manage the resource's state. */ class ResourceImpl extends BaseWritableResource implements ResourceRef { + private readonly pendingTasks: PendingTasks; + /** * The current state of the resource. Status, value, and error are derived from this. */ private readonly state: WritableSignal>; /** - * Signal of both the request value `R` and a writable `reload` signal that's linked/associated - * to the given request. Changing the value of the `reload` signal causes the resource to reload. + * Combines the current request with a reload counter which allows the resource to be reloaded on + * imperative command. */ - private readonly extendedRequest: Signal<{request: R; reload: WritableSignal}>; - - private readonly pendingTasks: PendingTasks; + private readonly extRequest: WritableSignal; private readonly effectRef: EffectRef; private pendingController: AbortController | undefined; @@ -146,49 +161,48 @@ class ResourceImpl extends BaseWritableResource implements ResourceRef< // `WritableSignal` that delegates to `ResourceImpl.set`. computed( () => { - const stream = this.state()?.stream?.(); - return stream && isResolved(stream) ? stream.value : this.defaultValue; + const streamValue = this.state().stream?.(); + return streamValue && isResolved(streamValue) ? streamValue.value : this.defaultValue; }, {equal}, ), ); - this.pendingTasks = injector.get(PendingTasks); // Extend `request()` to include a writable reload signal. - this.extendedRequest = computed(() => ({ - request: request(), - reload: signal(0), - })); + this.extRequest = linkedSignal({ + source: request, + computation: (request) => ({request, reload: 0}), + }); // The main resource state is managed in a `linkedSignal`, which allows the resource to change // state instantaneously when the request signal changes. - this.state = linkedSignal< - ResourceStatus.Idle | ResourceStatus.Loading | ResourceStatus.Reloading, - ResourceState - >({ - // We use the request (as well as its reload signal) to derive the initial status of the - // resource (Idle, Loading, or Reloading) in response to request changes. From this initial - // status, the resource's effect will then trigger the loader and update to a Resolved or - // Error state as appropriate. - source: () => { - const {request, reload} = this.extendedRequest(); - if (request === undefined || this.destroyed) { - return ResourceStatus.Idle; + this.state = linkedSignal>({ + // Whenever the request changes, + source: this.extRequest, + // Compute the state of the resource given a change in status. + computation: (extRequest, previous) => { + const status = + extRequest.request === undefined ? ResourceStatus.Idle : ResourceStatus.Loading; + if (!previous) { + return { + extRequest, + status, + previousStatus: ResourceStatus.Idle, + stream: undefined, + }; + } else { + return { + extRequest, + status, + previousStatus: projectStatusOfState(previous.value), + // If the request hasn't changed, keep the previous stream. + stream: + previous.value.extRequest.request === extRequest.request + ? previous.value.stream + : undefined, + }; } - return reload() === 0 ? ResourceStatus.Loading : ResourceStatus.Reloading; }, - // Compute the state of the resource given a change in status. - computation: (status, previous) => - ({ - status, - // When the state of the resource changes due to the request, remember the previous status - // for the loader to consider. - previousStatus: computeStatusOfState(previous?.value), - // In `Reloading` state, we keep the previous value if there is one, since the identity of - // the request hasn't changed. Otherwise, we switch back to the default value. - stream: - previous && status === ResourceStatus.Reloading ? previous.value.stream : undefined, - }) satisfies ResourceState, }); this.effectRef = effect(this.loadEffect.bind(this), { @@ -196,16 +210,13 @@ class ResourceImpl extends BaseWritableResource implements ResourceRef< manualCleanup: true, }); + this.pendingTasks = injector.get(PendingTasks); + // Cancel any pending request when the resource itself is destroyed. injector.get(DestroyRef).onDestroy(() => this.destroy()); } - override readonly status = computed(() => { - if (this.state().status !== ResourceStatus.Resolved) { - return this.state().status; - } - return isResolved(this.state().stream!()) ? ResourceStatus.Resolved : ResourceStatus.Error; - }); + override readonly status = computed(() => projectStatusOfState(this.state())); override readonly error = computed(() => { const stream = this.state().stream?.(); @@ -221,9 +232,10 @@ class ResourceImpl extends BaseWritableResource implements ResourceRef< } const current = untracked(this.value); + const state = untracked(this.state); if ( - untracked(this.status) === ResourceStatus.Local && + state.status === ResourceStatus.Local && (this.equal ? this.equal(current, value) : current === value) ) { return; @@ -231,6 +243,7 @@ class ResourceImpl extends BaseWritableResource implements ResourceRef< // Enter Local state with the user-defined value. this.state.set({ + extRequest: state.extRequest, status: ResourceStatus.Local, previousStatus: ResourceStatus.Local, stream: signal({value}), @@ -243,17 +256,13 @@ class ResourceImpl extends BaseWritableResource implements ResourceRef< override reload(): boolean { // We don't want to restart in-progress loads. - const status = untracked(this.status); - if ( - status === ResourceStatus.Idle || - status === ResourceStatus.Loading || - status === ResourceStatus.Reloading - ) { + const {status} = untracked(this.state); + if (status === ResourceStatus.Idle || status === ResourceStatus.Loading) { return false; } - // Increment the reload signal to trigger the `state` linked signal to switch us to `Reload` - untracked(this.extendedRequest).reload.update((v) => v + 1); + // Increment the request reload to trigger the `state` linked signal to switch us to `Reload` + this.extRequest.update(({request, reload}) => ({request, reload: reload + 1})); return true; } @@ -264,6 +273,7 @@ class ResourceImpl extends BaseWritableResource implements ResourceRef< // Destroyed resources enter Idle state. this.state.set({ + extRequest: {request: undefined, reload: 0}, status: ResourceStatus.Idle, previousStatus: ResourceStatus.Idle, stream: undefined, @@ -271,25 +281,17 @@ class ResourceImpl extends BaseWritableResource implements ResourceRef< } private async loadEffect(): Promise { + const extRequest = this.extRequest(); + // Capture the previous status before any state transitions. Note that this is `untracked` since // we do not want the effect to depend on the state of the resource, only on the request. const {status: currentStatus, previousStatus} = untracked(this.state); - const {request, reload: reloadCounter} = this.extendedRequest(); - // Subscribe side-effectfully to `reloadCounter`, although we don't actually care about its - // value. This is used to rerun the effect when `reload()` is triggered. - reloadCounter(); - - if (request === undefined) { + if (extRequest.request === undefined) { // Nothing to load (and we should already be in a non-loading state). return; - } else if ( - currentStatus !== ResourceStatus.Loading && - currentStatus !== ResourceStatus.Reloading - ) { - // We might've transitioned into a loading state, but has since been overwritten (likely via - // `.set`). - // In this case, the resource has nothing to do. + } else if (currentStatus !== ResourceStatus.Loading) { + // We're not in a loading or reloading state, so this loading request is stale. return; } @@ -316,7 +318,7 @@ class ResourceImpl extends BaseWritableResource implements ResourceRef< // which side of the `await` they are. const stream = await untracked(() => { return this.loaderFn({ - request: request as Exclude, + request: extRequest.request as Exclude, abortSignal, previous: { status: previousStatus, @@ -324,21 +326,25 @@ class ResourceImpl extends BaseWritableResource implements ResourceRef< }); }); - if (abortSignal.aborted) { + // If this request has been aborted, or the current request no longer + // matches this load, then we should ignore this resolution. + if (abortSignal.aborted || untracked(this.extRequest) !== extRequest) { return; } this.state.set({ + extRequest, status: ResourceStatus.Resolved, previousStatus: ResourceStatus.Resolved, stream, }); } catch (err) { - if (abortSignal.aborted) { + if (abortSignal.aborted || untracked(this.extRequest) !== extRequest) { return; } this.state.set({ + extRequest, status: ResourceStatus.Resolved, previousStatus: ResourceStatus.Error, stream: signal({error: err}), @@ -387,17 +393,20 @@ function isStreamingResourceOptions( return !!(options as StreamingResourceOptions).stream; } -function computeStatusOfState(state: ResourceState | undefined): ResourceStatus { - switch (state?.status) { - case undefined: - return ResourceStatus.Idle; +/** + * Project from a state with `ResourceInternalStatus` to the user-facing `ResourceStatus` + */ +function projectStatusOfState(state: ResourceState): ResourceStatus { + switch (state.status) { + case ResourceStatus.Loading: + return state.extRequest.reload === 0 ? ResourceStatus.Loading : ResourceStatus.Reloading; case ResourceStatus.Resolved: return isResolved(untracked(state.stream!)) ? ResourceStatus.Resolved : ResourceStatus.Error; default: - return state!.status; + return state.status; } } -function isResolved(state: {value: T} | {error: unknown}): state is {value: T} { +function isResolved(state: ResourceStreamItem): state is {value: T} { return (state as {error: unknown}).error === undefined; } diff --git a/packages/core/test/resource/resource_spec.ts b/packages/core/test/resource/resource_spec.ts index ef04b4d92385..8feecbefd9d2 100644 --- a/packages/core/test/resource/resource_spec.ts +++ b/packages/core/test/resource/resource_spec.ts @@ -180,6 +180,50 @@ describe('resource', () => { expect(echoResource.error()).toEqual(Error('KO')); }); + it('should respond to a request that changes while loading', async () => { + const appRef = TestBed.inject(ApplicationRef); + + const request = signal(0); + let resolve: Array<() => void> = []; + const res = resource({ + request, + loader: async ({request}) => { + const p = Promise.withResolvers(); + resolve.push(() => p.resolve(request)); + return p.promise; + }, + injector: TestBed.inject(Injector), + }); + + // Start the load by running the effect inside the resource. + appRef.tick(); + + // We should have a pending load. + expect(resolve.length).toBe(1); + + // Change the request. + request.set(1); + + // Resolve the first load. + resolve[0](); + await flushMicrotasks(); + + // The resource should still be loading. Ticking (triggering the 2nd effect) + // should not change the loading status. + expect(res.status()).toBe(ResourceStatus.Loading); + appRef.tick(); + expect(res.status()).toBe(ResourceStatus.Loading); + expect(resolve.length).toBe(2); + + // Resolve the second load. + resolve[1]?.(); + await flushMicrotasks(); + + // We should see the resolved value. + expect(res.status()).toBe(ResourceStatus.Resolved); + expect(res.value()).toBe(1); + }); + it('should return a default value if provided', async () => { const DEFAULT: string[] = []; const request = signal(0); From 951155eb4c2cf5a3d13aa9b290f4eac094c52cef Mon Sep 17 00:00:00 2001 From: Wadie <1206307+wadie@users.noreply.github.com> Date: Mon, 3 Feb 2025 23:30:49 +0100 Subject: [PATCH 0029/1000] fix(docs-infra): reset sandbox runtime on template change (#59844) Ensure the sandbox runtime is properly reset when the template changes to prevent any unexpected behavior during development. PR Close #59844 --- adev/src/app/features/playground/playground.component.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/adev/src/app/features/playground/playground.component.ts b/adev/src/app/features/playground/playground.component.ts index 00cf9ae474d1..b5b3234c9db9 100644 --- a/adev/src/app/features/playground/playground.component.ts +++ b/adev/src/app/features/playground/playground.component.ts @@ -87,6 +87,7 @@ export default class PlaygroundComponent implements AfterViewInit { async changeTemplate(template: PlaygroundTemplate): Promise { this.selectedTemplate = template; await this.loadTemplate(template.path); + await this.nodeRuntimeSandbox!.reset(); } private async loadTemplate(tutorialPath: string) { From 7196725622781e07cb6217d2209d0c5bc16584ed Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Thu, 6 Feb 2025 12:33:52 -0800 Subject: [PATCH 0030/1000] docs: release notes for the v19.1.5 release --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb9e32f0431b..466d5188bf33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ + +# 19.1.5 (2025-02-06) +### compiler-cli +| Commit | Type | Description | +| -- | -- | -- | +| [d7b5c597ffc](https://github.com/angular/angular/commit/d7b5c597ffcb6469ae3f08a97e7790599d569cc4) | fix | gracefully fall back if const enum cannot be passed through ([#59815](https://github.com/angular/angular/pull/59815)) | +| [53a4668b58b](https://github.com/angular/angular/commit/53a4668b58b645e41baddc5b67d52ede21c8e945) | fix | handle const enums used inside HMR data ([#59815](https://github.com/angular/angular/pull/59815)) | +| [976125e0b4c](https://github.com/angular/angular/commit/976125e0b4cf4e7fb4621a7203e3f43b009885f0) | fix | handle enum members without initializers in partial evaluator ([#59815](https://github.com/angular/angular/pull/59815)) | + + + # 19.2.0-next.1 (2025-01-29) ### core From a7f20eb8634d75a105f4ee3c39d6d364383c061e Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Thu, 6 Feb 2025 12:37:07 -0800 Subject: [PATCH 0031/1000] release: cut the v19.2.0-next.2 release --- CHANGELOG.md | 21 +++++++++++++++++++++ package.json | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 466d5188bf33..72b25e156719 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,24 @@ + +# 19.2.0-next.2 (2025-02-06) +### compiler-cli +| Commit | Type | Description | +| -- | -- | -- | +| [a97136052f9](https://github.com/angular/angular/commit/a97136052f9cfdb696a3b335ed7a1b9fb994d408) | fix | gracefully fall back if const enum cannot be passed through ([#59815](https://github.com/angular/angular/pull/59815)) | +| [bae94b82fda](https://github.com/angular/angular/commit/bae94b82fda1669a6aafad975a3a0eb6f2743039) | fix | handle const enums used inside HMR data ([#59815](https://github.com/angular/angular/pull/59815)) | +| [03bcd30e348](https://github.com/angular/angular/commit/03bcd30e3487443983d450a5dfea2d68d551bbd3) | fix | handle enum members without initializers in partial evaluator ([#59815](https://github.com/angular/angular/pull/59815)) | +### core +| Commit | Type | Description | +| -- | -- | -- | +| [146ab9a76e6](https://github.com/angular/angular/commit/146ab9a76e6b4d8db7d08d34e2571ba5207f8756) | feat | support TypeScript 5.8 ([#59830](https://github.com/angular/angular/pull/59830)) | +| [b592b1b0516](https://github.com/angular/angular/commit/b592b1b0516786c52c7d0638c4e7545b0de8a545) | fix | fix race condition in resource() ([#59851](https://github.com/angular/angular/pull/59851)) | +| [a299e02e914](https://github.com/angular/angular/commit/a299e02e9141cdc4d74185deb58308fa010bb36e) | fix | preserve tracing snapshot until tick finishes ([#59796](https://github.com/angular/angular/pull/59796)) | +### forms +| Commit | Type | Description | +| -- | -- | -- | +| [fa0c3e32108](https://github.com/angular/angular/commit/fa0c3e3210885a36e5c9e9eb76e821032f5cd215) | feat | support type set in form validators ([#45793](https://github.com/angular/angular/pull/45793)) | + + + # 19.1.5 (2025-02-06) ### compiler-cli diff --git a/package.json b/package.json index aec3b444972f..aa253f7403e0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "angular-srcs", - "version": "19.2.0-next.1", + "version": "19.2.0-next.2", "private": true, "description": "Angular - a web framework for modern web apps", "homepage": "https://github.com/angular/angular", From e47c1e5abe87dac3fed0b2bda391029e13b3241b Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Wed, 5 Feb 2025 04:55:15 -0800 Subject: [PATCH 0032/1000] refactor(compiler): pass more information to HMR replacement function (#59854) Adjusts the code we generate for HMR so that it passes in the HMR ID and `import.meta` to the `replaceMetadata` call. This is necessary so we can do better logging of errors. PR Close #59854 --- packages/compiler-cli/test/ngtsc/hmr_spec.ts | 54 ++++++++++++------- .../compiler/src/render3/r3_hmr_compiler.ts | 24 ++++++--- packages/core/src/render3/hmr.ts | 3 ++ packages/core/test/acceptance/hmr_spec.ts | 1 + 4 files changed, 55 insertions(+), 27 deletions(-) diff --git a/packages/compiler-cli/test/ngtsc/hmr_spec.ts b/packages/compiler-cli/test/ngtsc/hmr_spec.ts index 4da69740c23f..63acd4c5290a 100644 --- a/packages/compiler-cli/test/ngtsc/hmr_spec.ts +++ b/packages/compiler-cli/test/ngtsc/hmr_spec.ts @@ -104,18 +104,19 @@ runInEachFileSystem(() => { const hmrContents = env.driveHmr('test.ts', 'Cmp'); expect(jsContents).toContain(`import * as i0 from "@angular/core";`); + expect(jsContents).toContain('const id = "test.ts%40Cmp";'); expect(jsContents).toContain('function Cmp_HmrLoad(t) {'); expect(jsContents).toContain( - 'import(/* @vite-ignore */\nnew URL("./@ng/component?c=test.ts%40Cmp&t=" + encodeURIComponent(t), import.meta.url).href)', + 'import(/* @vite-ignore */\nnew URL("./@ng/component?c=" + id + "&t=" + encodeURIComponent(t), import.meta.url).href)', ); expect(jsContents).toContain( ').then(m => m.default && i0.ɵɵreplaceMetadata(Cmp, m.default, [i0], ' + - '[Dep, transformValue, TOKEN, Component, Inject, ViewChild, Input]));', + '[Dep, transformValue, TOKEN, Component, Inject, ViewChild, Input], import.meta, id));', ); expect(jsContents).toContain('Cmp_HmrLoad(Date.now());'); expect(jsContents).toContain( 'import.meta.hot && import.meta.hot.on("angular:component-update", ' + - 'd => d.id === "test.ts%40Cmp" && Cmp_HmrLoad(d.timestamp)', + 'd => d.id === id && Cmp_HmrLoad(d.timestamp)', ); expect(hmrContents).toContain( @@ -171,18 +172,19 @@ runInEachFileSystem(() => { const hmrContents = env.driveHmr('test.ts', 'Cmp'); expect(jsContents).toContain(`import * as i0 from "@angular/core";`); expect(jsContents).toContain(`import * as i1 from "./dep";`); + expect(jsContents).toContain('const id = "test.ts%40Cmp";'); expect(jsContents).toContain('function Cmp_HmrLoad(t) {'); expect(jsContents).toContain( - 'import(/* @vite-ignore */\nnew URL("./@ng/component?c=test.ts%40Cmp&t=" + encodeURIComponent(t), import.meta.url).href)', + 'import(/* @vite-ignore */\nnew URL("./@ng/component?c=" + id + "&t=" + encodeURIComponent(t), import.meta.url).href)', ); expect(jsContents).toContain( ').then(m => m.default && i0.ɵɵreplaceMetadata(Cmp, m.default, [i0, i1], ' + - '[DepModule, Component]));', + '[DepModule, Component], import.meta, id));', ); expect(jsContents).toContain('Cmp_HmrLoad(Date.now());'); expect(jsContents).toContain( 'import.meta.hot && import.meta.hot.on("angular:component-update", ' + - 'd => d.id === "test.ts%40Cmp" && Cmp_HmrLoad(d.timestamp)', + 'd => d.id === id && Cmp_HmrLoad(d.timestamp)', ); expect(hmrContents).toContain( @@ -340,7 +342,9 @@ runInEachFileSystem(() => { expect(jsContents).toContain('const Cmp_Defer_1_DepsFn = () => [Dep];'); expect(jsContents).toContain('function Cmp_Defer_0_Template(rf, ctx) { if (rf & 1) {'); expect(jsContents).toContain('i0.ɵɵdefer(1, 0, Cmp_Defer_1_DepsFn);'); - expect(jsContents).toContain('ɵɵreplaceMetadata(Cmp, m.default, [i0], [Dep]));'); + expect(jsContents).toContain( + 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [Dep], import.meta, id));', + ); expect(jsContents).not.toContain('setClassMetadata'); expect(hmrContents).toContain( @@ -422,7 +426,9 @@ runInEachFileSystem(() => { const jsContents = env.getContents('test.js'); const hmrContents = env.driveHmr('test.ts', 'Cmp'); expect(jsContents).toContain('dependencies: [Cmp]'); - expect(jsContents).toContain('ɵɵreplaceMetadata(Cmp, m.default, [i0], [Component]));'); + expect(jsContents).toContain( + 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [Component], import.meta, id));', + ); expect(hmrContents).toContain( 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, Component) {', ); @@ -445,7 +451,9 @@ runInEachFileSystem(() => { const jsContents = env.getContents('test.js'); const hmrContents = env.driveHmr('test.ts', 'Cmp'); expect(jsContents).not.toContain('dependencies'); - expect(jsContents).toContain('ɵɵreplaceMetadata(Cmp, m.default, [i0], [Component]));'); + expect(jsContents).toContain( + 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [Component], import.meta, id));', + ); expect(hmrContents).toContain( 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, Component) {', ); @@ -471,7 +479,7 @@ runInEachFileSystem(() => { const hmrContents = env.driveHmr('test.ts', 'Cmp'); expect(jsContents).toContain( - 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [providers, Component]));', + 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [providers, Component], import.meta, id));', ); expect(hmrContents).toContain( 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, providers, Component) {', @@ -508,7 +516,7 @@ runInEachFileSystem(() => { const hmrContents = env.driveHmr('test.ts', 'Cmp'); expect(jsContents).toContain( - 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [token, value, Component]));', + 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [token, value, Component], import.meta, id));', ); expect(hmrContents).toContain( 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, token, value, Component) {', @@ -542,7 +550,7 @@ runInEachFileSystem(() => { const hmrContents = env.driveHmr('test.ts', 'Cmp'); expect(jsContents).toContain( - 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [token, value, Component]));', + 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [token, value, Component], import.meta, id));', ); expect(hmrContents).toContain( 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, token, value, Component) {', @@ -574,7 +582,7 @@ runInEachFileSystem(() => { const hmrContents = env.driveHmr('test.ts', 'Cmp'); expect(jsContents).toContain( - 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [condition, providersA, providersB, Component]));', + 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [condition, providersA, providersB, Component], import.meta, id));', ); expect(hmrContents).toContain( 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, condition, providersA, providersB, Component) {', @@ -608,7 +616,7 @@ runInEachFileSystem(() => { const jsContents = env.getContents('test.js'); const hmrContents = env.driveHmr('test.ts', 'Cmp'); expect(jsContents).toContain( - 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [token, value, otherValue, Component]));', + 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [token, value, otherValue, Component], import.meta, id));', ); expect(jsContents).toContain('useFactory: () => [(value), ((((otherValue))))]'); expect(hmrContents).toContain( @@ -646,7 +654,7 @@ runInEachFileSystem(() => { const hmrContents = env.driveHmr('test.ts', 'Cmp'); expect(jsContents).toContain( - 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [token, value, Optional, dep, Component]));', + 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [token, value, Optional, dep, Component], import.meta, id));', ); expect(hmrContents).toContain( 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, token, value, Optional, dep, Component) {', @@ -697,7 +705,9 @@ runInEachFileSystem(() => { const hmrContents = env.driveHmr('test.ts', 'Cmp'); expect(jsContents).toContain('dependencies: [Dep]'); - expect(jsContents).toContain('ɵɵreplaceMetadata(Cmp, m.default, [i0], [Dep]));'); + expect(jsContents).toContain( + 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [Dep], import.meta, id));', + ); expect(hmrContents).toContain('function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, Dep) {'); }); @@ -741,7 +751,9 @@ runInEachFileSystem(() => { const hmrContents = env.driveHmr('test.ts', 'Cmp'); expect(jsContents).toContain('dependencies: [DepModule, i1.Dep]'); - expect(jsContents).toContain('ɵɵreplaceMetadata(Cmp, m.default, [i0, i1], [DepModule]));'); + expect(jsContents).toContain( + 'ɵɵreplaceMetadata(Cmp, m.default, [i0, i1], [DepModule], import.meta, id));', + ); expect(hmrContents).toContain('function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, DepModule) {'); }); @@ -797,7 +809,9 @@ runInEachFileSystem(() => { const hmrContents = env.driveHmr('test.ts', 'Cmp'); expect(jsContents).toContain('dependencies: [i1.Dep]'); - expect(jsContents).toContain('ɵɵreplaceMetadata(Cmp, m.default, [i0, i1], []));'); + expect(jsContents).toContain( + 'ɵɵreplaceMetadata(Cmp, m.default, [i0, i1], [], import.meta, id));', + ); expect(hmrContents).toContain('function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces) {'); }); @@ -834,7 +848,7 @@ runInEachFileSystem(() => { const jsContents = env.getContents('test.js'); const hmrContents = env.driveHmr('test.ts', 'Cmp'); expect(jsContents).toContain( - 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [token, { one: 0, two: "2", three: 3 }, Component]));', + 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [token, { one: 0, two: "2", three: 3 }, Component], import.meta, id));', ); expect(hmrContents).toContain( 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, token, Foo, Component) {', @@ -881,7 +895,7 @@ runInEachFileSystem(() => { const jsContents = env.getContents('test.js'); const hmrContents = env.driveHmr('test.ts', 'Cmp'); expect(jsContents).toContain( - 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [token, { one: 0, two: "2", three: 3 }, Component]));', + 'ɵɵreplaceMetadata(Cmp, m.default, [i0], [token, { one: 0, two: "2", three: 3 }, Component], import.meta, id));', ); expect(hmrContents).toContain( 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, token, Foo, Component) {', diff --git a/packages/compiler/src/render3/r3_hmr_compiler.ts b/packages/compiler/src/render3/r3_hmr_compiler.ts index 1f6e7e2279e5..db916e07915e 100644 --- a/packages/compiler/src/render3/r3_hmr_compiler.ts +++ b/packages/compiler/src/render3/r3_hmr_compiler.ts @@ -53,11 +53,10 @@ export interface R3HmrNamespaceDependency { * @param meta HMR metadata extracted from the class. */ export function compileHmrInitializer(meta: R3HmrMetadata): o.Expression { - const id = encodeURIComponent(`${meta.filePath}@${meta.className}`); - const urlPartial = `./@ng/component?c=${id}&t=`; const moduleName = 'm'; const dataName = 'd'; const timestampName = 't'; + const idName = 'id'; const importCallbackName = `${meta.className}_HmrLoad`; const namespaces = meta.namespaceDependencies.map((dep) => { return new o.ExternalExpr({moduleName: dep.moduleName, name: null}); @@ -66,7 +65,7 @@ export function compileHmrInitializer(meta: R3HmrMetadata): o.Expression { // m.default const defaultRead = o.variable(moduleName).prop('default'); - // ɵɵreplaceMetadata(Comp, m.default, [...namespaces], [...locals]); + // ɵɵreplaceMetadata(Comp, m.default, [...namespaces], [...locals], import.meta, id); const replaceCall = o .importExpr(R3.replaceMetadata) .callFn([ @@ -74,14 +73,18 @@ export function compileHmrInitializer(meta: R3HmrMetadata): o.Expression { defaultRead, o.literalArr(namespaces), o.literalArr(meta.localDependencies.map((l) => l.runtimeRepresentation)), + o.variable('import').prop('meta'), + o.variable(idName), ]); // (m) => m.default && ɵɵreplaceMetadata(...) const replaceCallback = o.arrowFn([new o.FnParam(moduleName)], defaultRead.and(replaceCall)); - // '' + encodeURIComponent(t) + // '?c=' + id + '&t=' + encodeURIComponent(t) const urlValue = o - .literal(urlPartial) + .literal(`./@ng/component?c=`) + .plus(o.variable(idName)) + .plus(o.literal('&t=')) .plus(o.variable('encodeURIComponent').callFn([o.variable(timestampName)])); // import.meta.url @@ -109,13 +112,13 @@ export function compileHmrInitializer(meta: R3HmrMetadata): o.Expression { o.StmtModifier.Final, ); - // (d) => d.id === && Cmp_HmrLoad(d.timestamp) + // (d) => d.id === id && Cmp_HmrLoad(d.timestamp) const updateCallback = o.arrowFn( [new o.FnParam(dataName)], o .variable(dataName) .prop('id') - .identical(o.literal(id)) + .identical(o.variable(idName)) .and(o.variable(importCallbackName).callFn([o.variable(dataName).prop('timestamp')])), ); @@ -139,6 +142,13 @@ export function compileHmrInitializer(meta: R3HmrMetadata): o.Expression { .arrowFn( [], [ + // const id = ; + new o.DeclareVarStmt( + idName, + o.literal(encodeURIComponent(`${meta.filePath}@${meta.className}`)), + null, + o.StmtModifier.Final, + ), // function Cmp_HmrLoad() {...}. importCallback, // ngDevMode && Cmp_HmrLoad(Date.now()); diff --git a/packages/core/src/render3/hmr.ts b/packages/core/src/render3/hmr.ts index bd3641ba52c5..c559885263ee 100644 --- a/packages/core/src/render3/hmr.ts +++ b/packages/core/src/render3/hmr.ts @@ -51,6 +51,8 @@ import {NG_COMP_DEF} from './fields'; * @param applyMetadata Callback that will apply a new set of metadata on the `type` when invoked. * @param environment Syntehtic namespace imports that need to be passed along to the callback. * @param locals Local symbols from the source location that have to be exposed to the callback. + * @param id ID to the class being replaced. **Not** the same as the component definition ID. + * Optional since the ID might not be available internally. * @codeGenApi */ export function ɵɵreplaceMetadata( @@ -58,6 +60,7 @@ export function ɵɵreplaceMetadata( applyMetadata: (...args: [Type, unknown[], ...unknown[]]) => void, namespaces: unknown[], locals: unknown[], + id: string | null = null, ) { ngDevMode && assertComponentDef(type); const currentDef = getComponentDef(type)!; diff --git a/packages/core/test/acceptance/hmr_spec.ts b/packages/core/test/acceptance/hmr_spec.ts index de012c7e8875..b964e7812690 100644 --- a/packages/core/test/acceptance/hmr_spec.ts +++ b/packages/core/test/acceptance/hmr_spec.ts @@ -2157,6 +2157,7 @@ describe('hot module replacement', () => { }, [angularCoreEnv], [], + '', ); } From b0266bda4ad4efd19710fd0363a50984f48269dc Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Thu, 6 Feb 2025 13:52:20 -0800 Subject: [PATCH 0033/1000] fix(core): invalidate HMR component if replacement throws an error (#59854) Integrates https://github.com/angular/angular-cli/pull/29510 which allows us to invalidate the data in the dev server for a component if a replacement threw an error. PR Close #59854 --- packages/core/src/render3/hmr.ts | 59 ++++++++++++++++++++--- packages/core/test/acceptance/hmr_spec.ts | 1 + 2 files changed, 52 insertions(+), 8 deletions(-) diff --git a/packages/core/src/render3/hmr.ts b/packages/core/src/render3/hmr.ts index c559885263ee..0ea140b35648 100644 --- a/packages/core/src/render3/hmr.ts +++ b/packages/core/src/render3/hmr.ts @@ -45,14 +45,23 @@ import {NgZone} from '../zone'; import {ViewEncapsulation} from '../metadata/view'; import {NG_COMP_DEF} from './fields'; +/** Represents `import.meta` plus some information that's not in the built-in types. */ +type ImportMetaExtended = ImportMeta & { + hot?: { + send?: (name: string, payload: unknown) => void; + }; +}; + /** * Replaces the metadata of a component type and re-renders all live instances of the component. * @param type Class whose metadata will be replaced. * @param applyMetadata Callback that will apply a new set of metadata on the `type` when invoked. * @param environment Syntehtic namespace imports that need to be passed along to the callback. * @param locals Local symbols from the source location that have to be exposed to the callback. + * @param importMeta `import.meta` from the call site of the replacement function. Optional since + * it isn't used internally. * @param id ID to the class being replaced. **Not** the same as the component definition ID. - * Optional since the ID might not be available internally. + * Optional since the ID might not be available internally. * @codeGenApi */ export function ɵɵreplaceMetadata( @@ -60,6 +69,7 @@ export function ɵɵreplaceMetadata( applyMetadata: (...args: [Type, unknown[], ...unknown[]]) => void, namespaces: unknown[], locals: unknown[], + importMeta: ImportMetaExtended | null = null, id: string | null = null, ) { ngDevMode && assertComponentDef(type); @@ -87,7 +97,7 @@ export function ɵɵreplaceMetadata( // Note: we have the additional check, because `IsRoot` can also indicate // a component created through something like `createComponent`. if (isRootView(root) && root[PARENT] === null) { - recreateMatchingLViews(newDef, oldDef, root); + recreateMatchingLViews(importMeta, id, newDef, oldDef, root); } } } @@ -132,10 +142,14 @@ function mergeWithExistingDefinition( /** * Finds all LViews matching a specific component definition and recreates them. + * @param importMeta `import.meta` information. + * @param id HMR ID of the component. * @param oldDef Component definition to search for. * @param rootLView View from which to start the search. */ function recreateMatchingLViews( + importMeta: ImportMetaExtended | null, + id: string | null, newDef: ComponentDef, oldDef: ComponentDef, rootLView: LView, @@ -152,7 +166,7 @@ function recreateMatchingLViews( // produce false positives when using inheritance. if (tView === oldDef.tView) { ngDevMode && assertComponentDef(oldDef.type); - recreateLView(newDef, oldDef, rootLView); + recreateLView(importMeta, id, newDef, oldDef, rootLView); return; } @@ -162,14 +176,14 @@ function recreateMatchingLViews( if (isLContainer(current)) { // The host can be an LView if a component is injecting `ViewContainerRef`. if (isLView(current[HOST])) { - recreateMatchingLViews(newDef, oldDef, current[HOST]); + recreateMatchingLViews(importMeta, id, newDef, oldDef, current[HOST]); } for (let j = CONTAINER_HEADER_OFFSET; j < current.length; j++) { - recreateMatchingLViews(newDef, oldDef, current[j]); + recreateMatchingLViews(importMeta, id, newDef, oldDef, current[j]); } } else if (isLView(current)) { - recreateMatchingLViews(newDef, oldDef, current); + recreateMatchingLViews(importMeta, id, newDef, oldDef, current); } } } @@ -190,11 +204,15 @@ function clearRendererCache(factory: RendererFactory, def: ComponentDef /** * Recreates an LView in-place from a new component definition. + * @param importMeta `import.meta` information. + * @param id HMR ID for the component. * @param newDef Definition from which to recreate the view. * @param oldDef Previous component definition being swapped out. * @param lView View to be recreated. */ function recreateLView( + importMeta: ImportMetaExtended | null, + id: string | null, newDef: ComponentDef, oldDef: ComponentDef, lView: LView, @@ -272,9 +290,34 @@ function recreateLView( // The callback isn't guaranteed to be inside the Zone so we need to bring it in ourselves. if (zone === null) { - recreate(); + executeWithInvalidateFallback(importMeta, id, recreate); } else { - zone.run(recreate); + zone.run(() => executeWithInvalidateFallback(importMeta, id, recreate)); + } +} + +/** + * Runs an HMR-related function and falls back to + * invalidating the HMR data if it throws an error. + */ +function executeWithInvalidateFallback( + importMeta: ImportMetaExtended | null, + id: string | null, + callback: () => void, +) { + try { + callback(); + } catch (e) { + const errorMessage = (e as {message?: string}).message; + + // If we have all the necessary information and APIs to send off the invalidation + // request, send it before rethrowing so the dev server can decide what to do. + if (id !== null && errorMessage) { + importMeta?.hot?.send?.('angular:invalidate', {id, message: errorMessage, error: true}); + } + + // Throw the error in case the page doesn't get refreshed. + throw e; } } diff --git a/packages/core/test/acceptance/hmr_spec.ts b/packages/core/test/acceptance/hmr_spec.ts index b964e7812690..ce88026f1a5e 100644 --- a/packages/core/test/acceptance/hmr_spec.ts +++ b/packages/core/test/acceptance/hmr_spec.ts @@ -2157,6 +2157,7 @@ describe('hot module replacement', () => { }, [angularCoreEnv], [], + null, '', ); } From 5cd26a94206dfe8aabdf0dd15bfc09e7a8c606da Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Wed, 12 Feb 2025 15:13:17 +0100 Subject: [PATCH 0034/1000] fix(compiler-cli): handle deferred blocks with shared dependencies correctly (#59926) When the compiler analyzes the defer blocks in a component, it generates two sets of dependencies: ones specific for each block and others from all the deferred blocks within the component. The logic that combines all the defer block dependencies wasn't de-duplicating them which resulted in us producing `setClassMetadataAsync` calls where the callback can have multiple parameters with the same name. This was a problem both in full and partial compilation, but the latter was more visible, because Babel throws an error in such cases. These changes add some logic to de-duplicate the dependencies so that we produce valid code. Fixes #59922. PR Close #59926 --- .../annotations/component/src/handler.ts | 16 +++- .../GOLDEN_PARTIAL.js | 96 +++++++++++++++++++ .../r3_view_compiler_deferred/TEST_CASES.json | 19 ++++ .../deferred_with_duplicate_external_dep.ts | 21 ++++ ...ferred_with_duplicate_external_dep_lazy.ts | 4 + ...erred_with_duplicate_external_dep_other.ts | 4 + ...ed_with_duplicate_external_dep_template.js | 43 +++++++++ 7 files changed, 200 insertions(+), 3 deletions(-) create mode 100644 packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_with_duplicate_external_dep.ts create mode 100644 packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_with_duplicate_external_dep_lazy.ts create mode 100644 packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_with_duplicate_external_dep_other.ts create mode 100644 packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_with_duplicate_external_dep_template.js diff --git a/packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts b/packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts index d207b5288f7b..c7e122845421 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts @@ -1888,22 +1888,32 @@ export class ComponentDecoratorHandler private resolveAllDeferredDependencies( resolution: Readonly, ): R3DeferPerComponentDependency[] { + const seenDeps = new Set(); const deferrableTypes: R3DeferPerComponentDependency[] = []; // Go over all dependencies of all defer blocks and update the value of // the `isDeferrable` flag and the `importPath` to reflect the current // state after visiting all components during the `resolve` phase. for (const [_, deps] of resolution.deferPerBlockDependencies) { for (const deferBlockDep of deps) { - const importDecl = - resolution.deferrableDeclToImportDecl.get(deferBlockDep.declaration.node) ?? null; + const node = deferBlockDep.declaration.node; + const importDecl = resolution.deferrableDeclToImportDecl.get(node) ?? null; if (importDecl !== null && this.deferredSymbolTracker.canDefer(importDecl)) { deferBlockDep.isDeferrable = true; deferBlockDep.importPath = (importDecl.moduleSpecifier as ts.StringLiteral).text; deferBlockDep.isDefaultImport = isDefaultImport(importDecl); - deferrableTypes.push(deferBlockDep as R3DeferPerComponentDependency); + + // The same dependency may be used across multiple deferred blocks. De-duplicate it + // because it can throw off other logic further down the compilation pipeline. + // Note that the logic above needs to run even if the dependency is seen before, + // because the object literals are different between each block. + if (!seenDeps.has(node)) { + seenDeps.add(node); + deferrableTypes.push(deferBlockDep as R3DeferPerComponentDependency); + } } } } + return deferrableTypes; } diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/GOLDEN_PARTIAL.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/GOLDEN_PARTIAL.js index a53d28b5523d..b1aa2bed948e 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/GOLDEN_PARTIAL.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/GOLDEN_PARTIAL.js @@ -1122,3 +1122,99 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDE ****************************************************************************************************/ export {}; +/**************************************************************************************************** + * PARTIAL FILE: deferred_with_duplicate_external_dep_lazy.js + ****************************************************************************************************/ +import { Directive } from '@angular/core'; +import * as i0 from "@angular/core"; +export class DuplicateLazyDep { +} +DuplicateLazyDep.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: DuplicateLazyDep, deps: [], target: i0.ɵɵFactoryTarget.Directive }); +DuplicateLazyDep.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: DuplicateLazyDep, isStandalone: true, selector: "duplicate-lazy-dep", ngImport: i0 }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: DuplicateLazyDep, decorators: [{ + type: Directive, + args: [{ selector: 'duplicate-lazy-dep' }] + }] }); + +/**************************************************************************************************** + * PARTIAL FILE: deferred_with_duplicate_external_dep_lazy.d.ts + ****************************************************************************************************/ +import * as i0 from "@angular/core"; +export declare class DuplicateLazyDep { + static ɵfac: i0.ɵɵFactoryDeclaration; + static ɵdir: i0.ɵɵDirectiveDeclaration; +} + +/**************************************************************************************************** + * PARTIAL FILE: deferred_with_duplicate_external_dep_other.js + ****************************************************************************************************/ +import { Directive } from '@angular/core'; +import * as i0 from "@angular/core"; +export class OtherLazyDep { +} +OtherLazyDep.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: OtherLazyDep, deps: [], target: i0.ɵɵFactoryTarget.Directive }); +OtherLazyDep.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: OtherLazyDep, isStandalone: true, selector: "other-lazy-dep", ngImport: i0 }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: OtherLazyDep, decorators: [{ + type: Directive, + args: [{ selector: 'other-lazy-dep' }] + }] }); + +/**************************************************************************************************** + * PARTIAL FILE: deferred_with_duplicate_external_dep_other.d.ts + ****************************************************************************************************/ +import * as i0 from "@angular/core"; +export declare class OtherLazyDep { + static ɵfac: i0.ɵɵFactoryDeclaration; + static ɵdir: i0.ɵɵDirectiveDeclaration; +} + +/**************************************************************************************************** + * PARTIAL FILE: deferred_with_duplicate_external_dep.js + ****************************************************************************************************/ +import { Component } from '@angular/core'; +import * as i0 from "@angular/core"; +export class MyApp { +} +MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, isStandalone: true, selector: "ng-component", ngImport: i0, template: ` + @defer { + + } + + @defer { + + } + + @defer { + + } + `, isInline: true, deferBlockDependencies: [() => [import("./deferred_with_duplicate_external_dep_lazy").then(m => m.DuplicateLazyDep)], () => [import("./deferred_with_duplicate_external_dep_lazy").then(m => m.DuplicateLazyDep)], () => [import("./deferred_with_duplicate_external_dep_other").then(m => m.OtherLazyDep)]] }); +i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, resolveDeferredDeps: () => [import("./deferred_with_duplicate_external_dep_lazy").then(m => m.DuplicateLazyDep), import("./deferred_with_duplicate_external_dep_other").then(m => m.OtherLazyDep)], resolveMetadata: (DuplicateLazyDep, OtherLazyDep) => ({ decorators: [{ + type: Component, + args: [{ + template: ` + @defer { + + } + + @defer { + + } + + @defer { + + } + `, + imports: [DuplicateLazyDep, OtherLazyDep], + }] + }], ctorParameters: null, propDecorators: null }) }); + +/**************************************************************************************************** + * PARTIAL FILE: deferred_with_duplicate_external_dep.d.ts + ****************************************************************************************************/ +import * as i0 from "@angular/core"; +export declare class MyApp { + static ɵfac: i0.ɵɵFactoryDeclaration; + static ɵcmp: i0.ɵɵComponentDeclaration; +} + diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/TEST_CASES.json index a027e6c58534..93cbe6d13d32 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/TEST_CASES.json @@ -290,6 +290,25 @@ "failureMessage": "Incorrect template" } ] + }, + { + "description": "should handle a component with deferred blocks that share the same dependency", + "inputFiles": [ + "deferred_with_duplicate_external_dep.ts", + "deferred_with_duplicate_external_dep_lazy.ts", + "deferred_with_duplicate_external_dep_other.ts" + ], + "expectations": [ + { + "files": [ + { + "expected": "deferred_with_duplicate_external_dep_template.js", + "generated": "deferred_with_duplicate_external_dep.js" + } + ], + "failureMessage": "Incorrect template" + } + ] } ] } diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_with_duplicate_external_dep.ts b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_with_duplicate_external_dep.ts new file mode 100644 index 000000000000..59cbe0f4bf38 --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_with_duplicate_external_dep.ts @@ -0,0 +1,21 @@ +import {Component} from '@angular/core'; +import {DuplicateLazyDep} from './deferred_with_duplicate_external_dep_lazy'; +import {OtherLazyDep} from './deferred_with_duplicate_external_dep_other'; + +@Component({ + template: ` + @defer { + + } + + @defer { + + } + + @defer { + + } + `, + imports: [DuplicateLazyDep, OtherLazyDep], +}) +export class MyApp {} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_with_duplicate_external_dep_lazy.ts b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_with_duplicate_external_dep_lazy.ts new file mode 100644 index 000000000000..8321df6e6a6d --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_with_duplicate_external_dep_lazy.ts @@ -0,0 +1,4 @@ +import {Directive} from '@angular/core'; + +@Directive({selector: 'duplicate-lazy-dep'}) +export class DuplicateLazyDep {} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_with_duplicate_external_dep_other.ts b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_with_duplicate_external_dep_other.ts new file mode 100644 index 000000000000..4414f06e6d3d --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_with_duplicate_external_dep_other.ts @@ -0,0 +1,4 @@ +import {Directive} from '@angular/core'; + +@Directive({selector: 'other-lazy-dep'}) +export class OtherLazyDep {} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_with_duplicate_external_dep_template.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_with_duplicate_external_dep_template.js new file mode 100644 index 000000000000..ef430e566967 --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_with_duplicate_external_dep_template.js @@ -0,0 +1,43 @@ +const MyApp_Defer_1_DepsFn = () => [import("./deferred_with_duplicate_external_dep_lazy").then(m => m.DuplicateLazyDep)]; +// NOTE: in linked tests there is one more loader here, because linked compilation doesn't have the ability to de-dupe identical functions. +… +const MyApp_Defer_7_DepsFn = () => [import("./deferred_with_duplicate_external_dep_other").then(m => m.OtherLazyDep)]; + +… + +$r3$.ɵɵdefineComponent({ + … + template: function MyApp_Template(rf, ctx) { + if (rf & 1) { + $r3$.ɵɵtemplate(0, MyApp_Defer_0_Template, 1, 0); + $r3$.ɵɵdefer(1, 0, MyApp_Defer_1_DepsFn); + $r3$.ɵɵdeferOnIdle(); + $r3$.ɵɵtemplate(3, MyApp_Defer_3_Template, 1, 0); + // NOTE: does not check the function name, because linked compilation doesn't have the ability to de-dupe identical functions. + $r3$.ɵɵdefer(4, 3, …); + $r3$.ɵɵdeferOnIdle(); + $r3$.ɵɵtemplate(6, MyApp_Defer_6_Template, 1, 0); + $r3$.ɵɵdefer(7, 6, MyApp_Defer_7_DepsFn); + $r3$.ɵɵdeferOnIdle(); + } + }, + encapsulation: 2 +}); + +… + +(() => { + (typeof ngDevMode === "undefined" || ngDevMode) && $r3$.ɵsetClassMetadataAsync(MyApp, () => [ + import("./deferred_with_duplicate_external_dep_lazy").then(m => m.DuplicateLazyDep), + import("./deferred_with_duplicate_external_dep_other").then(m => m.OtherLazyDep) + ], (DuplicateLazyDep, OtherLazyDep) => { + $r3$.ɵsetClassMetadata(MyApp, [{ + type: Component, + args: [{ + template: …, + // NOTE: there's a ... after the `imports`, because linked compilation produces a trailing comma while full compilation doesn't. + imports: [DuplicateLazyDep, OtherLazyDep]… + }] + }], null, null); + }); +})(); From 8cdb7b8e8581234397b18ff853228a14f4a71d98 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Wed, 12 Feb 2025 12:01:37 +0000 Subject: [PATCH 0035/1000] docs: update Angular CLI help [main] (#59925) Updated Angular CLI help contents. PR Close #59925 --- adev/src/content/cli/help/build-info.json | 2 +- adev/src/content/cli/help/test.json | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/adev/src/content/cli/help/build-info.json b/adev/src/content/cli/help/build-info.json index 72b6d7d10c1f..40937d6a6db6 100644 --- a/adev/src/content/cli/help/build-info.json +++ b/adev/src/content/cli/help/build-info.json @@ -1,4 +1,4 @@ { "branchName": "refs/heads/main", - "sha": "a1e4ec30c9b380e5615e1a75ea8b896986b836f3" + "sha": "4e45bc8fc2704830d6e4099f2455d0135278b002" } \ No newline at end of file diff --git a/adev/src/content/cli/help/test.json b/adev/src/content/cli/help/test.json index daf02e9ff6a0..2ac675458fde 100644 --- a/adev/src/content/cli/help/test.json +++ b/adev/src/content/cli/help/test.json @@ -9,6 +9,12 @@ ], "deprecated": false, "options": [ + { + "name": "aot", + "type": "boolean", + "default": false, + "description": "Run tests using Ahead of Time compilation." + }, { "name": "browsers", "type": "string", From 4a5c3df824e5b703913885da27031f4cc9c3cbdc Mon Sep 17 00:00:00 2001 From: Hendra Arfiansyah Date: Tue, 11 Feb 2025 21:32:22 +0700 Subject: [PATCH 0036/1000] docs: remove trailing parentheses in example code in linked signal (#59917) PR Close #59917 --- adev/src/content/guide/signals/linked-signal.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adev/src/content/guide/signals/linked-signal.md b/adev/src/content/guide/signals/linked-signal.md index 595d07d04723..8a3c00e83cef 100644 --- a/adev/src/content/guide/signals/linked-signal.md +++ b/adev/src/content/guide/signals/linked-signal.md @@ -92,7 +92,7 @@ The `computation` is a function that receives the new value of `source` and a `p ```typescript const activeUser = signal({id: 123, name: 'Morgan', isAdmin: true}); -const activeUserEditCopy = linkedSignal(() => activeUser()), { +const activeUserEditCopy = linkedSignal(() => activeUser(), { // Consider the user as the same if it's the same `id`. equal: (a, b) => a.id === b.id, }); From 0d88463a66f04034fd7090cbd2f366ac7babe634 Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Mon, 10 Feb 2025 19:44:59 +0100 Subject: [PATCH 0037/1000] docs(docs-infra): inline example in description (#59908) fixes #59905 PR Close #59908 --- .../pipeline/api-gen/extraction/interpolate_code_examples.ts | 1 + .../api-gen/extraction/test/interpolate_code_examples.spec.ts | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/adev/shared-docs/pipeline/api-gen/extraction/interpolate_code_examples.ts b/adev/shared-docs/pipeline/api-gen/extraction/interpolate_code_examples.ts index 91e9ac1df596..094902c1b005 100644 --- a/adev/shared-docs/pipeline/api-gen/extraction/interpolate_code_examples.ts +++ b/adev/shared-docs/pipeline/api-gen/extraction/interpolate_code_examples.ts @@ -43,6 +43,7 @@ const MD_CTYPE_MAP: {[key in FileType]: string} = { export function interpolateCodeExamples(entries: DocEntry[]): void { for (const entry of entries) { entry.rawComment = replaceExample(entry.rawComment); + entry.description = replaceExample(entry.description); for (const jsdocTag of entry.jsdocTags) { jsdocTag.comment = replaceExample(jsdocTag.comment); diff --git a/adev/shared-docs/pipeline/api-gen/extraction/test/interpolate_code_examples.spec.ts b/adev/shared-docs/pipeline/api-gen/extraction/test/interpolate_code_examples.spec.ts index 3cd40b38abc9..c0aa3780f16b 100644 --- a/adev/shared-docs/pipeline/api-gen/extraction/test/interpolate_code_examples.spec.ts +++ b/adev/shared-docs/pipeline/api-gen/extraction/test/interpolate_code_examples.spec.ts @@ -15,7 +15,7 @@ const tsMdBlock = (code: string) => '```angular-ts\n' + code + '\n```'; const htmlMdBlock = (code: string) => '```angular-html\n' + code + '\n```'; const entriesBuilder = (comment: string): DocEntry[] => [ - {jsdocTags: [], rawComment: comment} as unknown as DocEntry, + {jsdocTags: [], rawComment: comment, description: ''} as unknown as DocEntry, ]; const getComment = (entries: DocEntry[]) => entries[0].rawComment; @@ -35,6 +35,7 @@ describe('interpolate_code_examples', () => { }, ], rawComment: `{@example dummy/jsdocs_raw.ts region='function'}`, + description: `{@example dummy/jsdocs_raw.ts region='function'}`, }, ]; From 28dd04a866c2a9dd4fe7774739bdd61c4d06cd77 Mon Sep 17 00:00:00 2001 From: AleksanderBodurri Date: Mon, 3 Feb 2025 16:03:13 -0500 Subject: [PATCH 0038/1000] fix(devtools): regressions in component tree (#59873) This commit solves two cases Bug: When a directive of the same name is selected, the property view tab would not update properly. This was caused by a signals refactor that changed the behaviour of a string input property to not re-render because the underlying signal did not change (string equality). This is fixed by converting this input into an object. Bug: When a selected element is removed from the component tree, DevTools would not rerender the component tree properly and deselect that component. Now if DevTools detects that a component is removed, it re-renders the tree and deselects the component. PR Close #59873 --- .../ng-devtools-backend/src/lib/client-event-subscribers.ts | 3 +++ .../property-view/property-tab-body.component.html | 2 +- .../property-view/property-tab-body.component.ts | 4 ++-- .../property-tab/property-view/property-view.component.html | 2 +- .../property-tab/property-view/property-view.component.ts | 6 ++++-- 5 files changed, 11 insertions(+), 6 deletions(-) diff --git a/devtools/projects/ng-devtools-backend/src/lib/client-event-subscribers.ts b/devtools/projects/ng-devtools-backend/src/lib/client-event-subscribers.ts index f7eb2b2bf48c..344d421c6340 100644 --- a/devtools/projects/ng-devtools-backend/src/lib/client-event-subscribers.ts +++ b/devtools/projects/ng-devtools-backend/src/lib/client-event-subscribers.ts @@ -155,6 +155,9 @@ const getLatestComponentExplorerViewCallback = if (state) { const {directiveProperties} = state; messageBus.emit('latestComponentExplorerView', [{forest, properties: directiveProperties}]); + } else { + // if the node is not found in the tree, we assume its gone and send the tree as is. + messageBus.emit('latestComponentExplorerView', [{forest}]); } }; diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-tab-body.component.html b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-tab-body.component.html index a1eb37a5c557..4ff276255e91 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-tab-body.component.html +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-tab-body.component.html @@ -3,7 +3,7 @@
diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-tab-body.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-tab-body.component.ts index 90e5965a9228..583db0f2fd38 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-tab-body.component.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-tab-body.component.ts @@ -29,9 +29,9 @@ export class PropertyTabBodyComponent { if (!selected) { return; } - const directives = selected.directives.map((d) => d.name); + const directives = [...selected.directives]; if (selected.component) { - directives.push(selected.component.name); + directives.push(selected.component); } return directives; }); diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view.component.html b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view.component.html index 0db69adf29c6..dbc5599462ce 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view.component.html +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view.component.html @@ -1,5 +1,5 @@ (); + readonly directive = input.required<{name: string}>(); readonly inspect = output<{node: FlatNode; directivePosition: DirectivePosition}>(); readonly viewSource = output(); private _nestedProps = inject(ElementPropertyResolver); - readonly controller = computed(() => this._nestedProps.getDirectiveController(this.directive())); + readonly controller = computed(() => + this._nestedProps.getDirectiveController(this.directive().name), + ); readonly directiveInputControls = computed(() => this.controller()?.directiveInputControls); From c69125009c5d569629430db957991a8fd59a78d9 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Fri, 7 Feb 2025 13:16:20 +0000 Subject: [PATCH 0039/1000] build: update dependency saucelabs to v9 (#59801) See associated pull request for more information. PR Close #59801 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index aa253f7403e0..c6b4d61080c2 100644 --- a/package.json +++ b/package.json @@ -236,6 +236,6 @@ "// 4": "Ensure that a single instance of the `saucelabs` package is used. Protractor and the Karma sauce launcher pull this package as dependency. A single instance allows for e.g. easier patching in the Karma config.", "resolutions": { "**/https-proxy-agent": "7.0.6", - "**/saucelabs": "8.0.0" + "**/saucelabs": "9.0.2" } } diff --git a/yarn.lock b/yarn.lock index c86db7afd00f..703643624151 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15142,10 +15142,10 @@ sass@1.83.4: optionalDependencies: "@parcel/watcher" "^2.4.1" -saucelabs@8.0.0, saucelabs@^1.5.0, saucelabs@^4.6.3: - version "8.0.0" - resolved "https://registry.yarnpkg.com/saucelabs/-/saucelabs-8.0.0.tgz#63084768ce5950107db988797e4db8d52297d725" - integrity sha512-Rj9m4OCniYk+c4MFuZGqvz64RPX6oRzMqt0bTr9T27IXGnA7Ic7Ms/VHgPtRcJFP6H3sQ169WOzazPZcW4BIAg== +saucelabs@9.0.2, saucelabs@^1.5.0, saucelabs@^4.6.3: + version "9.0.2" + resolved "https://registry.yarnpkg.com/saucelabs/-/saucelabs-9.0.2.tgz#99f6170f3d789fcb0be2f270f7d37a9d7cdf5187" + integrity sha512-37QGEOgp9BP1re6S06qpNcBZ0Hw+ZSkZkDepbXHT9VjYoRQwRzUoLtKqE4yyVeK7dzcQXQapmTGF1kp1jO2VDw== dependencies: change-case "^4.1.2" compressing "^1.10.0" From 1119f85ca935f43641f53ee8bc50efa47ad09717 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Wed, 5 Feb 2025 14:39:55 -0800 Subject: [PATCH 0040/1000] fix(migrations): count used dependencies inside existing control flow (#59861) Fixes that the control flow migration wasn't checking the content of pre-existing control flow nodes for dependencies. Fixes #59846. PR Close #59861 --- .../control-flow-migration/types.ts | 1 + .../test/control_flow_migration_spec.ts | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/packages/core/schematics/ng-generate/control-flow-migration/types.ts b/packages/core/schematics/ng-generate/control-flow-migration/types.ts index c3da13ed3208..f91ffe0ff25b 100644 --- a/packages/core/schematics/ng-generate/control-flow-migration/types.ts +++ b/packages/core/schematics/ng-generate/control-flow-migration/types.ts @@ -390,6 +390,7 @@ export class CommonCollector extends RecursiveVisitor { this.count++; } } + super.visitBlock(ast, null); } override visitText(ast: Text) { diff --git a/packages/core/schematics/test/control_flow_migration_spec.ts b/packages/core/schematics/test/control_flow_migration_spec.ts index db7cd4273bb2..dc13d8450139 100644 --- a/packages/core/schematics/test/control_flow_migration_spec.ts +++ b/packages/core/schematics/test/control_flow_migration_spec.ts @@ -6479,6 +6479,39 @@ describe('control flow migration', () => { expect(actual).toBe(expected); }); + + it('should not remove common module if symbols are used inside new control flow', async () => { + writeFile( + '/comp.ts', + [ + `import {CommonModule} from '@angular/common';`, + `import {Component} from '@angular/core';\n`, + `@Component({`, + ` imports: [CommonModule],`, + ` template: \`@if (toggle) {
{{ d | date }}
} hi\``, + `})`, + `class Comp {`, + ` toggle = false;`, + `}`, + ].join('\n'), + ); + + await runMigration(); + const actual = tree.readContent('/comp.ts'); + const expected = [ + `import {CommonModule} from '@angular/common';`, + `import {Component} from '@angular/core';\n`, + `@Component({`, + ` imports: [CommonModule],`, + ` template: \`@if (toggle) {
{{ d | date }}
} @if (toggle) {hi}\``, + `})`, + `class Comp {`, + ` toggle = false;`, + `}`, + ].join('\n'); + + expect(actual).toBe(expected); + }); }); describe('no migration needed', () => { From aa285c548c164917ebb5760802484843c6830daf Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Wed, 5 Feb 2025 14:45:41 -0800 Subject: [PATCH 0041/1000] fix(migrations): account for let declarations in control flow migration (#59861) Fixes that the control flow migration wasn't accounting for `@let` when determining which symbols are used. PR Close #59861 --- .../control-flow-migration/types.ts | 8 +++++ .../test/control_flow_migration_spec.ts | 33 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/packages/core/schematics/ng-generate/control-flow-migration/types.ts b/packages/core/schematics/ng-generate/control-flow-migration/types.ts index f91ffe0ff25b..bea65d7f3cfa 100644 --- a/packages/core/schematics/ng-generate/control-flow-migration/types.ts +++ b/packages/core/schematics/ng-generate/control-flow-migration/types.ts @@ -10,6 +10,7 @@ import { Attribute, Block, Element, + LetDeclaration, ParseTreeResult, RecursiveVisitor, Text, @@ -399,6 +400,13 @@ export class CommonCollector extends RecursiveVisitor { } } + override visitLetDeclaration(decl: LetDeclaration): void { + if (this.hasPipes(decl.value)) { + this.count++; + } + super.visitLetDeclaration(decl, null); + } + private hasDirectives(input: string): boolean { return commonModuleDirectives.has(input); } diff --git a/packages/core/schematics/test/control_flow_migration_spec.ts b/packages/core/schematics/test/control_flow_migration_spec.ts index dc13d8450139..2bb5fcdf8ed0 100644 --- a/packages/core/schematics/test/control_flow_migration_spec.ts +++ b/packages/core/schematics/test/control_flow_migration_spec.ts @@ -6512,6 +6512,39 @@ describe('control flow migration', () => { expect(actual).toBe(expected); }); + + it('should not remove common module if symbols are used inside @let', async () => { + writeFile( + '/comp.ts', + [ + `import {CommonModule} from '@angular/common';`, + `import {Component} from '@angular/core';\n`, + `@Component({`, + ` imports: [CommonModule],`, + ` template: \`@let foo = 123 | date; {{foo}}\``, + `})`, + `class Comp {`, + ` toggle = false;`, + `}`, + ].join('\n'), + ); + + await runMigration(); + const actual = tree.readContent('/comp.ts'); + const expected = [ + `import {CommonModule} from '@angular/common';`, + `import {Component} from '@angular/core';\n`, + `@Component({`, + ` imports: [CommonModule],`, + ` template: \`@let foo = 123 | date; @if (foo) {{{foo}}}\``, + `})`, + `class Comp {`, + ` toggle = false;`, + `}`, + ].join('\n'); + + expect(actual).toBe(expected); + }); }); describe('no migration needed', () => { From b2f1d4eb9e8ef092ba0cf6c7bdad0592cb69b319 Mon Sep 17 00:00:00 2001 From: Bobokhuja <65486207+Bobokhuja@users.noreply.github.com> Date: Tue, 11 Feb 2025 09:20:23 +0500 Subject: [PATCH 0042/1000] docs: fix tabs in example code in creating injectable services (#59911) PR Close #59911 --- adev/src/content/guide/di/creating-injectable-service.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/adev/src/content/guide/di/creating-injectable-service.md b/adev/src/content/guide/di/creating-injectable-service.md index 2bddb4201d61..0fbb6711d16a 100644 --- a/adev/src/content/guide/di/creating-injectable-service.md +++ b/adev/src/content/guide/di/creating-injectable-service.md @@ -108,11 +108,11 @@ The type of `heroService` is `HeroService`. Angular recognizes the `HeroService` type as a dependency, since that class was previously annotated with the `@Injectable` decorator: - import { inject } from "@angular/core"; +import { inject } from "@angular/core"; - export class HeroListComponent { - private heroService = inject(HeroService); - } +export class HeroListComponent { + private heroService = inject(HeroService); +} It is also possible to inject a service into a component using the component's constructor: From 6f315fe501f79b804a7dafff7995814cd0a29a5b Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Thu, 6 Feb 2025 01:39:42 +0000 Subject: [PATCH 0043/1000] build: update io_bazel_rules_sass digest to d829b6a (#59862) See associated pull request for more information. PR Close #59862 --- WORKSPACE | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a41f3729a613..56298722f345 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -143,10 +143,10 @@ cldr_xml_data_repository( # sass rules http_archive( name = "io_bazel_rules_sass", - sha256 = "1d840af29fe9b6dd1d3cebb31ca143450ab8d4036bff76f958c7873a770a46ba", - strip_prefix = "rules_sass-adeaf81181b25f15a2d1d1081630506cd6bd0045", + sha256 = "0c41055203bd4f6c58dc7431805b336abf4a0e5283955497bbc918bd0ce90b23", + strip_prefix = "rules_sass-d829b6a77d9d88c7bf43144b0963e32ed359fe74", urls = [ - "https://github.com/bazelbuild/rules_sass/archive/adeaf81181b25f15a2d1d1081630506cd6bd0045.zip", + "https://github.com/bazelbuild/rules_sass/archive/d829b6a77d9d88c7bf43144b0963e32ed359fe74.zip", ], ) From 9e847fc60d4eef47e665e789ccd2d4f0b4bb94ea Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Wed, 6 Nov 2024 09:50:40 +0100 Subject: [PATCH 0044/1000] fix(compiler): handle tracking expressions requiring temporary variables (#58520) Currently when we generate the tracking expression for a `@for` block, we process its expression in the context of the creation block. This is incorrect, because the expression may require ops of its own for cases like nullish coalescing or safe reads. The result is that while we do generate the correct variable, they're added to the creation block rather than the tracking function which causes an error at runtime. These changes address the issue by keeping track of a separate set of ops for the `track` expression that are prepended to the generated function, similarly to how we handle event listeners. Fixes #56256. PR Close #58520 --- .../GOLDEN_PARTIAL.js | 38 ++++++++++++ .../TEST_CASES.json | 15 +++++ .../for_track_by_temporary_variables.ts | 12 ++++ ...r_track_by_temporary_variables_template.js | 35 +++++++++++ .../template/pipeline/ir/src/expression.ts | 11 +++- .../template/pipeline/ir/src/ops/create.ts | 7 +++ .../src/template/pipeline/src/compilation.ts | 4 ++ .../src/template/pipeline/src/emit.ts | 2 - .../pipeline/src/phases/generate_variables.ts | 3 + .../src/template/pipeline/src/phases/reify.ts | 47 +++++++++++++- .../pipeline/src/phases/resolve_contexts.ts | 5 ++ .../pipeline/src/phases/resolve_names.ts | 5 ++ .../src/phases/temporary_variables.ts | 2 + .../src/phases/track_fn_generation.ts | 62 ------------------- .../src/phases/track_fn_optimization.ts | 12 +++- .../src/phases/variable_optimization.ts | 4 ++ 16 files changed, 196 insertions(+), 68 deletions(-) create mode 100644 packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_track_by_temporary_variables.ts create mode 100644 packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_track_by_temporary_variables_template.js delete mode 100644 packages/compiler/src/template/pipeline/src/phases/track_fn_generation.ts diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/GOLDEN_PARTIAL.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/GOLDEN_PARTIAL.js index cc1465c2e69b..721204a7c701 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/GOLDEN_PARTIAL.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/GOLDEN_PARTIAL.js @@ -2666,3 +2666,41 @@ it('case 2', () => { ****************************************************************************************************/ export {}; +/**************************************************************************************************** + * PARTIAL FILE: for_track_by_temporary_variables.js + ****************************************************************************************************/ +import { Component } from '@angular/core'; +import * as i0 from "@angular/core"; +export class MyApp { + constructor() { + this.items = []; + } +} +MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, isStandalone: true, selector: "ng-component", ngImport: i0, template: ` + @for (item of items; track item?.name?.[0]?.toUpperCase() ?? foo) {} + @for (item of items; track item.name ?? $index ?? foo) {} + `, isInline: true }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, decorators: [{ + type: Component, + args: [{ + template: ` + @for (item of items; track item?.name?.[0]?.toUpperCase() ?? foo) {} + @for (item of items; track item.name ?? $index ?? foo) {} + `, + }] + }] }); + +/**************************************************************************************************** + * PARTIAL FILE: for_track_by_temporary_variables.d.ts + ****************************************************************************************************/ +import * as i0 from "@angular/core"; +export declare class MyApp { + foo: any; + items: { + name?: string; + }[]; + static ɵfac: i0.ɵɵFactoryDeclaration; + static ɵcmp: i0.ɵɵComponentDeclaration; +} + diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/TEST_CASES.json index 39b9aabe08ee..0f364fcdad52 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/TEST_CASES.json @@ -690,6 +690,21 @@ ] } ] + }, + { + "description": "should support expressions requiring temporary variables inside `track`", + "inputFiles": ["for_track_by_temporary_variables.ts"], + "expectations": [ + { + "failureMessage": "Incorrect generated output.", + "files": [ + { + "expected": "for_track_by_temporary_variables_template.js", + "generated": "for_track_by_temporary_variables.js" + } + ] + } + ] } ] } diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_track_by_temporary_variables.ts b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_track_by_temporary_variables.ts new file mode 100644 index 000000000000..77c3d53dc78c --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_track_by_temporary_variables.ts @@ -0,0 +1,12 @@ +import {Component} from '@angular/core'; + +@Component({ + template: ` + @for (item of items; track item?.name?.[0]?.toUpperCase() ?? foo) {} + @for (item of items; track item.name ?? $index ?? foo) {} + `, +}) +export class MyApp { + foo: any; + items: {name?: string}[] = []; +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_track_by_temporary_variables_template.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_track_by_temporary_variables_template.js new file mode 100644 index 000000000000..fcaebc68108c --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_track_by_temporary_variables_template.js @@ -0,0 +1,35 @@ +function _forTrack0($index, $item) { + let tmp_0_0; + return (tmp_0_0 = + $item == null + ? null + : $item.name == null + ? null + : $item.name[0] == null + ? null + : $item.name[0].toUpperCase()) !== null && tmp_0_0 !== undefined + ? tmp_0_0 + : this.foo; +} + +function _forTrack1($index, $item) { + let tmp_0_0; + return (tmp_0_0 = (tmp_0_0 = $item.name) !== null && tmp_0_0 !== undefined ? tmp_0_0 : $index) !== + null && tmp_0_0 !== undefined + ? tmp_0_0 + : this.foo; +} + +… + +function MyApp_Template(rf, ctx) { + if (rf & 1) { + $r3$.ɵɵrepeaterCreate(0, MyApp_For_1_Template, 0, 0, null, null, _forTrack0, true); + $r3$.ɵɵrepeaterCreate(2, MyApp_For_3_Template, 0, 0, null, null, _forTrack1, true); + } + if (rf & 2) { + $r3$.ɵɵrepeater(ctx.items); + $r3$.ɵɵadvance(2); + $r3$.ɵɵrepeater(ctx.items); + } +} diff --git a/packages/compiler/src/template/pipeline/ir/src/expression.ts b/packages/compiler/src/template/pipeline/ir/src/expression.ts index a3f493c1a379..ba8e39b2c3ef 100644 --- a/packages/compiler/src/template/pipeline/ir/src/expression.ts +++ b/packages/compiler/src/template/pipeline/ir/src/expression.ts @@ -50,7 +50,8 @@ export type Expression = | ConstCollectedExpr | TwoWayBindingSetExpr | ContextLetReferenceExpr - | StoreLetExpr; + | StoreLetExpr + | TrackContextExpr; /** * Transformer type which converts expressions into general `o.Expression`s (which may be an @@ -1153,7 +1154,13 @@ export function transformExpressionsInOp( op.trustedValueFn && transformExpressionsInExpression(op.trustedValueFn, transform, flags); break; case OpKind.RepeaterCreate: - op.track = transformExpressionsInExpression(op.track, transform, flags); + if (op.trackByOps === null) { + op.track = transformExpressionsInExpression(op.track, transform, flags); + } else { + for (const innerOp of op.trackByOps) { + transformExpressionsInOp(innerOp, transform, flags | VisitorContextFlag.InChildOperation); + } + } if (op.trackByFn !== null) { op.trackByFn = transformExpressionsInExpression(op.trackByFn, transform, flags); } diff --git a/packages/compiler/src/template/pipeline/ir/src/ops/create.ts b/packages/compiler/src/template/pipeline/ir/src/ops/create.ts index a8696be1a4b0..c227e8a0a968 100644 --- a/packages/compiler/src/template/pipeline/ir/src/ops/create.ts +++ b/packages/compiler/src/template/pipeline/ir/src/ops/create.ts @@ -324,6 +324,12 @@ export interface RepeaterCreateOp extends ElementOpBase, ConsumesVarsTrait { */ track: o.Expression; + /** + * Some kinds of expressions (e.g. safe reads or nullish coalescing) require additional ops + * in order to work. This OpList keeps track of those ops, if they're necessary. + */ + trackByOps: OpList | null; + /** * `null` initially, then an `o.Expression`. Might be a track expression, or might be a reference * into the constant pool. @@ -393,6 +399,7 @@ export function createRepeaterCreateOp( emptyView, track, trackByFn: null, + trackByOps: null, tag, emptyTag, emptyAttributes: null, diff --git a/packages/compiler/src/template/pipeline/src/compilation.ts b/packages/compiler/src/template/pipeline/src/compilation.ts index a08239f4091e..90fa46e3f61d 100644 --- a/packages/compiler/src/template/pipeline/src/compilation.ts +++ b/packages/compiler/src/template/pipeline/src/compilation.ts @@ -190,6 +190,10 @@ export abstract class CompilationUnit { for (const listenerOp of op.handlerOps) { yield listenerOp; } + } else if (op.kind === ir.OpKind.RepeaterCreate && op.trackByOps !== null) { + for (const trackOp of op.trackByOps) { + yield trackOp; + } } } for (const op of this.update) { diff --git a/packages/compiler/src/template/pipeline/src/emit.ts b/packages/compiler/src/template/pipeline/src/emit.ts index e077d363b2c5..031cc19d60f4 100644 --- a/packages/compiler/src/template/pipeline/src/emit.ts +++ b/packages/compiler/src/template/pipeline/src/emit.ts @@ -74,7 +74,6 @@ import {saveAndRestoreView} from './phases/save_restore_view'; import {allocateSlots} from './phases/slot_allocation'; import {specializeStyleBindings} from './phases/style_binding_specialization'; import {generateTemporaryVariables} from './phases/temporary_variables'; -import {generateTrackFns} from './phases/track_fn_generation'; import {optimizeTrackFns} from './phases/track_fn_optimization'; import {generateTrackVariables} from './phases/track_variables'; import {countVariables} from './phases/var_counting'; @@ -148,7 +147,6 @@ const phases: Phase[] = [ {kind: Kind.Tmpl, fn: resolveI18nElementPlaceholders}, {kind: Kind.Tmpl, fn: resolveI18nExpressionPlaceholders}, {kind: Kind.Tmpl, fn: extractI18nMessages}, - {kind: Kind.Tmpl, fn: generateTrackFns}, {kind: Kind.Tmpl, fn: collectI18nConsts}, {kind: Kind.Tmpl, fn: collectConstExpressions}, {kind: Kind.Both, fn: collectElementConsts}, diff --git a/packages/compiler/src/template/pipeline/src/phases/generate_variables.ts b/packages/compiler/src/template/pipeline/src/phases/generate_variables.ts index 5804dc2a093c..96999f2fda00 100644 --- a/packages/compiler/src/template/pipeline/src/phases/generate_variables.ts +++ b/packages/compiler/src/template/pipeline/src/phases/generate_variables.ts @@ -57,6 +57,9 @@ function recursivelyProcessView(view: ViewCompilationUnit, parentScope: Scope | if (op.emptyView) { recursivelyProcessView(view.job.views.get(op.emptyView)!, scope); } + if (op.trackByOps !== null) { + op.trackByOps.prepend(generateVariablesInScopeForView(view, scope, false)); + } break; case ir.OpKind.Listener: case ir.OpKind.TwoWayListener: diff --git a/packages/compiler/src/template/pipeline/src/phases/reify.ts b/packages/compiler/src/template/pipeline/src/phases/reify.ts index f1d1d8df2a57..6de081c46a28 100644 --- a/packages/compiler/src/template/pipeline/src/phases/reify.ts +++ b/packages/compiler/src/template/pipeline/src/phases/reify.ts @@ -391,7 +391,7 @@ function reifyCreateOperations(unit: CompilationUnit, ops: ir.OpList { - if (expr instanceof ir.PipeBindingExpr || expr instanceof ir.PipeBindingVariadicExpr) { - throw new Error(`Illegal State: Pipes are not allowed in this context`); - } - if (expr instanceof ir.TrackContextExpr) { - usesComponentContext = true; - return o.variable('this'); - } - return expr; - }, - ir.VisitorContextFlag.None, - ); - - let fn: o.FunctionExpr | o.ArrowFunctionExpr; - - const fnParams = [new o.FnParam('$index'), new o.FnParam('$item')]; - if (usesComponentContext) { - fn = new o.FunctionExpr(fnParams, [new o.ReturnStatement(op.track)]); - } else { - fn = o.arrowFn(fnParams, op.track); - } - - op.trackByFn = job.pool.getSharedFunctionReference(fn, '_forTrack'); - } - } -} diff --git a/packages/compiler/src/template/pipeline/src/phases/track_fn_optimization.ts b/packages/compiler/src/template/pipeline/src/phases/track_fn_optimization.ts index 7ebfa4846d20..a6bfa552035d 100644 --- a/packages/compiler/src/template/pipeline/src/phases/track_fn_optimization.ts +++ b/packages/compiler/src/template/pipeline/src/phases/track_fn_optimization.ts @@ -58,7 +58,9 @@ export function optimizeTrackFns(job: CompilationJob): void { op.track = ir.transformExpressionsInExpression( op.track, (expr) => { - if (expr instanceof ir.ContextExpr) { + if (expr instanceof ir.PipeBindingExpr || expr instanceof ir.PipeBindingVariadicExpr) { + throw new Error(`Illegal State: Pipes are not allowed in this context`); + } else if (expr instanceof ir.ContextExpr) { op.usesComponentInstance = true; return new ir.TrackContextExpr(expr.view); } @@ -66,6 +68,14 @@ export function optimizeTrackFns(job: CompilationJob): void { }, ir.VisitorContextFlag.None, ); + + // Also create an OpList for the tracking expression since it may need + // additional ops when generating the final code (e.g. temporary variables). + const trackOpList = new ir.OpList(); + trackOpList.push( + ir.createStatementOp(new o.ReturnStatement(op.track, op.track.sourceSpan)), + ); + op.trackByOps = trackOpList; } } } diff --git a/packages/compiler/src/template/pipeline/src/phases/variable_optimization.ts b/packages/compiler/src/template/pipeline/src/phases/variable_optimization.ts index 1653e9ab4393..f3afc57d285b 100644 --- a/packages/compiler/src/template/pipeline/src/phases/variable_optimization.ts +++ b/packages/compiler/src/template/pipeline/src/phases/variable_optimization.ts @@ -36,6 +36,8 @@ export function optimizeVariables(job: CompilationJob): void { for (const op of unit.create) { if (op.kind === ir.OpKind.Listener || op.kind === ir.OpKind.TwoWayListener) { inlineAlwaysInlineVariables(op.handlerOps); + } else if (op.kind === ir.OpKind.RepeaterCreate && op.trackByOps !== null) { + inlineAlwaysInlineVariables(op.trackByOps); } } @@ -45,6 +47,8 @@ export function optimizeVariables(job: CompilationJob): void { for (const op of unit.create) { if (op.kind === ir.OpKind.Listener || op.kind === ir.OpKind.TwoWayListener) { optimizeVariablesInOpList(op.handlerOps, job.compatibility); + } else if (op.kind === ir.OpKind.RepeaterCreate && op.trackByOps !== null) { + optimizeVariablesInOpList(op.trackByOps, job.compatibility); } } } From 4f3ad984669c554b90e49fbe9b3795d95033780f Mon Sep 17 00:00:00 2001 From: hawkgs Date: Wed, 15 Jan 2025 14:42:01 +0200 Subject: [PATCH 0045/1000] refactor(devtools): styles management (#59589) - Move all styles to ng-devtools/src/styles. - Create a BrowserService that detects the browsers and adds it as a class to the body. Move global browser styles. - Create theme mixins that incorporate the browser type into them. - Refactor some of the affected code along with the introduced changes. PR Close #59589 --- devtools/BUILD.bazel | 15 --- .../projects/demo-standalone/src/BUILD.bazel | 30 ++--- .../src/app/devtools-app/BUILD.bazel | 2 +- .../devtools-app/devtools-app.component.ts | 2 +- .../projects/demo-standalone/src/styles.scss | 2 +- .../src/styles/chrome_styles.scss | 1 - .../src/styles/firefox_styles.scss | 1 - .../projects/ng-devtools/src/lib/BUILD.bazel | 59 ++-------- .../src/lib/application-providers/BUILD.bazel | 11 ++ .../application-providers/window_provider.ts | 16 +++ .../src/lib/application-services/BUILD.bazel | 60 ++++++++++ .../browser_styles_service.ts | 76 ++++++++++++ .../browser_styles_service_spec.ts | 77 +++++++++++++ .../frame_manager.ts | 2 +- .../frame_manager_spec.ts | 2 +- .../lib/application-services/theme_service.ts | 48 ++++++++ .../theme_service_spec.ts | 109 ++++++++++++++++++ .../src/lib/devtools-tabs/BUILD.bazel | 12 +- .../devtools-tabs/devtools-tabs.component.ts | 4 +- .../lib/devtools-tabs/devtools-tabs.spec.ts | 4 +- .../directive-explorer/BUILD.bazel | 6 +- .../directive-explorer.component.ts | 2 +- .../directive-explorer.spec.ts | 2 +- .../property-tab/property-view/BUILD.bazel | 2 +- .../injector-providers/BUILD.bazel | 2 +- .../bargraph-formatter/BUILD.bazel | 2 +- .../flamegraph-formatter/BUILD.bazel | 4 +- .../flamegraph-formatter.ts | 2 +- .../timeline/recording-visualizer/BUILD.bazel | 2 +- .../bargraph-visualizer.component.ts | 2 +- .../flamegraph-visualizer.component.ts | 2 +- .../ng-devtools/src/lib/devtools.component.ts | 30 ++--- .../ng-devtools/src/lib/devtools_spec.ts | 2 +- .../ng-devtools/src/lib/theme-service.ts | 42 ------- .../ng-devtools/src/styles/BUILD.bazel | 42 +++++++ .../ng-devtools/src/styles/_browser.scss | 15 +++ .../ng-devtools/src/styles/_colors.scss | 1 + .../ng-devtools/src/styles/_global.scss} | 4 + .../ng-devtools/src/styles/_theme.scss | 30 +++++ .../ng-devtools/src/styles/chrome.scss | 1 + .../ng-devtools/src/styles/firefox.scss | 1 + .../projects/shell-browser/src/BUILD.bazel | 30 ++--- .../shell-browser/src/app/app.config.ts | 2 +- .../projects/shell-browser/src/styles.scss | 2 +- .../src/styles/chrome_styles.scss | 1 - .../src/styles/firefox_styles.scss | 1 - devtools/src/BUILD.bazel | 30 ++--- devtools/src/app/devtools-app/BUILD.bazel | 2 +- .../app/devtools-app/devtools-app.routes.ts | 2 +- devtools/src/styles.scss | 2 +- devtools/src/styles/chrome_styles.scss | 1 - devtools/src/styles/firefox_styles.scss | 1 - 52 files changed, 588 insertions(+), 215 deletions(-) delete mode 100644 devtools/projects/demo-standalone/src/styles/chrome_styles.scss delete mode 100644 devtools/projects/demo-standalone/src/styles/firefox_styles.scss create mode 100644 devtools/projects/ng-devtools/src/lib/application-providers/BUILD.bazel create mode 100644 devtools/projects/ng-devtools/src/lib/application-providers/window_provider.ts create mode 100644 devtools/projects/ng-devtools/src/lib/application-services/BUILD.bazel create mode 100644 devtools/projects/ng-devtools/src/lib/application-services/browser_styles_service.ts create mode 100644 devtools/projects/ng-devtools/src/lib/application-services/browser_styles_service_spec.ts rename devtools/projects/ng-devtools/src/lib/{ => application-services}/frame_manager.ts (98%) rename devtools/projects/ng-devtools/src/lib/{ => application-services}/frame_manager_spec.ts (99%) create mode 100644 devtools/projects/ng-devtools/src/lib/application-services/theme_service.ts create mode 100644 devtools/projects/ng-devtools/src/lib/application-services/theme_service_spec.ts delete mode 100644 devtools/projects/ng-devtools/src/lib/theme-service.ts create mode 100644 devtools/projects/ng-devtools/src/styles/BUILD.bazel create mode 100644 devtools/projects/ng-devtools/src/styles/_browser.scss create mode 100644 devtools/projects/ng-devtools/src/styles/_colors.scss rename devtools/{styles.scss => projects/ng-devtools/src/styles/_global.scss} (88%) create mode 100644 devtools/projects/ng-devtools/src/styles/_theme.scss create mode 100644 devtools/projects/ng-devtools/src/styles/chrome.scss create mode 100644 devtools/projects/ng-devtools/src/styles/firefox.scss delete mode 100644 devtools/projects/shell-browser/src/styles/chrome_styles.scss delete mode 100644 devtools/projects/shell-browser/src/styles/firefox_styles.scss delete mode 100644 devtools/src/styles/chrome_styles.scss delete mode 100644 devtools/src/styles/firefox_styles.scss diff --git a/devtools/BUILD.bazel b/devtools/BUILD.bazel index f4003bd6d6ea..9e0065b59d36 100644 --- a/devtools/BUILD.bazel +++ b/devtools/BUILD.bazel @@ -1,4 +1,3 @@ -load("@io_bazel_rules_sass//:defs.bzl", "npm_sass_library", "sass_library") load("//tools:defaults.bzl", "ts_config") package(default_visibility = ["//visibility:public"]) @@ -8,14 +7,6 @@ exports_files([ "cypress.json", ]) -npm_sass_library( - name = "material_sass_deps", - deps = [ - "@npm//@angular/cdk", - "@npm//@angular/material", - ], -) - ts_config( name = "tsconfig_spec", src = "tsconfig.spec.json", @@ -23,9 +14,3 @@ ts_config( "//devtools:tsconfig.json", ], ) - -sass_library( - name = "global_styles", - srcs = ["styles.scss"], - deps = [":material_sass_deps"], -) diff --git a/devtools/projects/demo-standalone/src/BUILD.bazel b/devtools/projects/demo-standalone/src/BUILD.bazel index 2ebea2d4daab..1f991e6e911a 100644 --- a/devtools/projects/demo-standalone/src/BUILD.bazel +++ b/devtools/projects/demo-standalone/src/BUILD.bazel @@ -1,8 +1,9 @@ -load("//devtools/tools:ng_module.bzl", "ng_module") -load("@io_bazel_rules_sass//:defs.bzl", "sass_binary") +load("@aspect_bazel_lib//lib:copy_to_directory.bzl", "copy_to_directory") load("@build_bazel_rules_nodejs//:index.bzl", "pkg_web") -load("//tools:defaults.bzl", "esbuild", "http_server") +load("@io_bazel_rules_sass//:defs.bzl", "sass_binary") +load("//devtools/tools:ng_module.bzl", "ng_module") load("//devtools/tools/esbuild:index.bzl", "LINKER_PROCESSED_FW_PACKAGES") +load("//tools:defaults.bzl", "esbuild", "http_server") package(default_visibility = ["//visibility:public"]) @@ -11,17 +12,19 @@ sass_binary( src = "styles.scss", include_paths = ["external/npm/node_modules"], sourcemap = False, - deps = ["//devtools:global_styles"], + deps = ["//devtools/projects/ng-devtools/src/styles:global"], ) -sass_binary( - name = "firefox_styles", - src = "styles/firefox_styles.scss", -) - -sass_binary( - name = "chrome_styles", - src = "styles/chrome_styles.scss", +copy_to_directory( + name = "browser_specific_styles", + srcs = [ + "//devtools/projects/ng-devtools/src/styles:chrome", + "//devtools/projects/ng-devtools/src/styles:firefox", + ], + out = "styles", + replace_prefixes = { + "devtools/projects/ng-devtools/src/styles": "", + }, ) ng_module( @@ -56,9 +59,8 @@ exports_files(["index.html"]) filegroup( name = "dev_app_static_files", srcs = [ - ":chrome_styles", + ":browser_specific_styles", ":demo_styles", - ":firefox_styles", ":index.html", "//packages/zone.js/bundles:zone.umd.js", ], diff --git a/devtools/projects/demo-standalone/src/app/devtools-app/BUILD.bazel b/devtools/projects/demo-standalone/src/app/devtools-app/BUILD.bazel index a81b0fbb4266..2d292a19b00f 100644 --- a/devtools/projects/demo-standalone/src/app/devtools-app/BUILD.bazel +++ b/devtools/projects/demo-standalone/src/app/devtools-app/BUILD.bazel @@ -7,7 +7,7 @@ ng_module( srcs = ["devtools-app.component.ts"], deps = [ "//devtools/projects/ng-devtools", - "//devtools/projects/ng-devtools/src/lib:frame_manager", + "//devtools/projects/ng-devtools/src/lib/application-services:frame_manager", "//devtools/projects/protocol", "//devtools/src:iframe_message_bus", "//packages/common", diff --git a/devtools/projects/demo-standalone/src/app/devtools-app/devtools-app.component.ts b/devtools/projects/demo-standalone/src/app/devtools-app/devtools-app.component.ts index adc938a4d230..d414d51d6c57 100644 --- a/devtools/projects/demo-standalone/src/app/devtools-app/devtools-app.component.ts +++ b/devtools/projects/demo-standalone/src/app/devtools-app/devtools-app.component.ts @@ -11,7 +11,7 @@ import {Events, MessageBus, PriorityAwareMessageBus} from 'protocol'; import {IFrameMessageBus} from '../../../../../src/iframe-message-bus'; import {DevToolsComponent} from 'ng-devtools'; -import {FrameManager} from '../../../../../projects/ng-devtools/src/lib/frame_manager'; +import {FrameManager} from '../../../../../projects/ng-devtools/src/lib/application-services/frame_manager'; @Component({ imports: [DevToolsComponent], diff --git a/devtools/projects/demo-standalone/src/styles.scss b/devtools/projects/demo-standalone/src/styles.scss index b5f91b71cf64..adbeab311bc5 100644 --- a/devtools/projects/demo-standalone/src/styles.scss +++ b/devtools/projects/demo-standalone/src/styles.scss @@ -1 +1 @@ -@use '../../../styles.scss' as devtools; +@use '../../../projects/ng-devtools/src/styles/global'; diff --git a/devtools/projects/demo-standalone/src/styles/chrome_styles.scss b/devtools/projects/demo-standalone/src/styles/chrome_styles.scss deleted file mode 100644 index 9959545b62fe..000000000000 --- a/devtools/projects/demo-standalone/src/styles/chrome_styles.scss +++ /dev/null @@ -1 +0,0 @@ -/** Specific style for Chrome browser */ diff --git a/devtools/projects/demo-standalone/src/styles/firefox_styles.scss b/devtools/projects/demo-standalone/src/styles/firefox_styles.scss deleted file mode 100644 index af7608ad155f..000000000000 --- a/devtools/projects/demo-standalone/src/styles/firefox_styles.scss +++ /dev/null @@ -1 +0,0 @@ -/** Specific style for Firefox browser */ diff --git a/devtools/projects/ng-devtools/src/lib/BUILD.bazel b/devtools/projects/ng-devtools/src/lib/BUILD.bazel index 052e8cd15bf3..a944a6d1e7a3 100644 --- a/devtools/projects/ng-devtools/src/lib/BUILD.bazel +++ b/devtools/projects/ng-devtools/src/lib/BUILD.bazel @@ -1,7 +1,7 @@ -load("//devtools/tools:ng_module.bzl", "ng_module") load("@io_bazel_rules_sass//:defs.bzl", "sass_binary") -load("//devtools/tools:typescript.bzl", "ts_test_library") load("//devtools/tools:defaults.bzl", "karma_web_test_suite") +load("//devtools/tools:ng_module.bzl", "ng_module") +load("//devtools/tools:typescript.bzl", "ts_test_library") package(default_visibility = ["//visibility:public"]) @@ -15,8 +15,6 @@ ng_module( srcs = glob( include = ["*.ts"], exclude = [ - "theme-service.ts", - "frame_manager.ts", "*_spec.ts", ], ), @@ -25,12 +23,13 @@ ng_module( ":devtools_component_styles", ], deps = [ - ":frame_manager", - ":theme", + "//devtools/projects/ng-devtools/src/lib/application-providers:window", + "//devtools/projects/ng-devtools/src/lib/application-services:browser_styles", + "//devtools/projects/ng-devtools/src/lib/application-services:frame_manager", + "//devtools/projects/ng-devtools/src/lib/application-services:theme", "//devtools/projects/ng-devtools/src/lib/devtools-tabs", "//devtools/projects/protocol", "//packages/animations", - "//packages/common", "//packages/core", "//packages/forms", "//packages/platform-browser-dynamic", @@ -45,8 +44,8 @@ ts_test_library( name = "devtools_test", srcs = ["devtools_spec.ts"], deps = [ - ":frame_manager", ":lib", + "//devtools/projects/ng-devtools/src/lib/application-services:frame_manager", "//devtools/projects/ng-devtools/src/lib/devtools-tabs", "//devtools/projects/protocol", "//packages/core", @@ -60,47 +59,3 @@ karma_web_test_suite( ":devtools_test", ], ) - -ng_module( - name = "frame_manager", - srcs = glob( - include = ["frame_manager.ts"], - ), - deps = [ - "//devtools/projects/ng-devtools/src/lib/application-environment", - "//devtools/projects/protocol", - "//packages/core", - ], -) - -ts_test_library( - name = "test_frame_manager_lib", - srcs = [ - "frame_manager_spec.ts", - ], - deps = [ - ":frame_manager", - "//devtools/projects/ng-devtools/src/lib/application-environment", - "//devtools/projects/protocol", - "//packages/core/testing", - ], -) - -karma_web_test_suite( - name = "test_frame_manager", - deps = [ - ":test_frame_manager_lib", - ], -) - -ng_module( - name = "theme", - srcs = glob( - include = ["theme-service.ts"], - ), - deps = [ - "//packages/core", - "@npm//@types", - "@npm//rxjs", - ], -) diff --git a/devtools/projects/ng-devtools/src/lib/application-providers/BUILD.bazel b/devtools/projects/ng-devtools/src/lib/application-providers/BUILD.bazel new file mode 100644 index 000000000000..f4c3db266c8a --- /dev/null +++ b/devtools/projects/ng-devtools/src/lib/application-providers/BUILD.bazel @@ -0,0 +1,11 @@ +load("//devtools/tools:ng_module.bzl", "ng_module") + +package(default_visibility = ["//visibility:public"]) + +ng_module( + name = "window", + srcs = ["window_provider.ts"], + deps = [ + "//packages/core", + ], +) diff --git a/devtools/projects/ng-devtools/src/lib/application-providers/window_provider.ts b/devtools/projects/ng-devtools/src/lib/application-providers/window_provider.ts new file mode 100644 index 000000000000..764d14ea3d80 --- /dev/null +++ b/devtools/projects/ng-devtools/src/lib/application-providers/window_provider.ts @@ -0,0 +1,16 @@ +/** + * @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.dev/license + */ + +import {InjectionToken, Provider} from '@angular/core'; + +export const WINDOW = new InjectionToken('WINDOW'); + +export const WINDOW_PROVIDER: Provider = { + provide: WINDOW, + useValue: window, +}; diff --git a/devtools/projects/ng-devtools/src/lib/application-services/BUILD.bazel b/devtools/projects/ng-devtools/src/lib/application-services/BUILD.bazel new file mode 100644 index 000000000000..ada3c0e7e2ff --- /dev/null +++ b/devtools/projects/ng-devtools/src/lib/application-services/BUILD.bazel @@ -0,0 +1,60 @@ +load("//devtools/tools:defaults.bzl", "karma_web_test_suite") +load("//devtools/tools:ng_module.bzl", "ng_module") +load("//devtools/tools:typescript.bzl", "ts_test_library") + +package(default_visibility = ["//visibility:public"]) + +ng_module( + name = "browser_styles", + srcs = ["browser_styles_service.ts"], + deps = [ + "//packages/common", + "//packages/core", + "@npm//@angular/cdk", + ], +) + +ng_module( + name = "frame_manager", + srcs = ["frame_manager.ts"], + deps = [ + "//devtools/projects/ng-devtools/src/lib/application-environment", + "//devtools/projects/protocol", + "//packages/core", + ], +) + +ng_module( + name = "theme", + srcs = ["theme_service.ts"], + deps = [ + "//devtools/projects/ng-devtools/src/lib/application-providers:window", + "//packages/common", + "//packages/core", + "@npm//@types", + "@npm//rxjs", + ], +) + +ts_test_library( + name = "test_application_services_lib", + srcs = glob(["*_spec.ts"]), + deps = [ + ":browser_styles", + ":frame_manager", + ":theme", + "//devtools/projects/ng-devtools/src/lib/application-environment", + "//devtools/projects/ng-devtools/src/lib/application-providers:window", + "//devtools/projects/protocol", + "//packages/common", + "//packages/core/testing", + "@npm//@angular/cdk", + ], +) + +karma_web_test_suite( + name = "test_application_services", + deps = [ + ":test_application_services_lib", + ], +) diff --git a/devtools/projects/ng-devtools/src/lib/application-services/browser_styles_service.ts b/devtools/projects/ng-devtools/src/lib/application-services/browser_styles_service.ts new file mode 100644 index 000000000000..2a2f1d8ea344 --- /dev/null +++ b/devtools/projects/ng-devtools/src/lib/application-services/browser_styles_service.ts @@ -0,0 +1,76 @@ +/** + * @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.dev/license + */ + +import {inject, Injectable, RendererFactory2} from '@angular/core'; +import {DOCUMENT} from '@angular/common'; +import {Platform} from '@angular/cdk/platform'; + +// Update for with newly supported browser +export type Browser = 'chrome' | 'firefox' | 'unknown'; + +// If for some reason we are unable to properly +// detect the browser, we are defaulting +// to Chrome's styles. + +// Keep class names in sync with _theme.scss and _browser.scss +const BROWSER_CLASS_NAME: {[key in Browser]: string} = { + 'chrome': 'chrome-ui', + 'firefox': 'firefox-ui', + 'unknown': 'chrome-ui', +}; + +const BROWSER_STYLES: {[key in Browser]: string} = { + 'chrome': 'chrome.css', + 'firefox': 'firefox.css', + 'unknown': 'chrome.css', +}; + +@Injectable({ + providedIn: 'root', +}) +export class BrowserStylesService { + private readonly doc = inject(DOCUMENT); + private readonly rendererFactory = inject(RendererFactory2); + private readonly renderer = this.rendererFactory.createRenderer(null, null); + private readonly platform = inject(Platform); + + private readonly browser = this.detectBrowser(); + + initBrowserSpecificStyles() { + this.addBrowserUiClass(); + this.loadBrowserStyle(); + } + + /** Add the browser class to the document body */ + private addBrowserUiClass() { + const browserClass = BROWSER_CLASS_NAME[this.browser]; + this.renderer.addClass(this.doc.body, browserClass); + } + + /** Load browser-specific styles */ + private loadBrowserStyle() { + const fileName = BROWSER_STYLES[this.browser]; + const head = this.doc.getElementsByTagName('head')[0]; + + const style = this.renderer.createElement('link'); + style.rel = 'stylesheet'; + style.href = `./styles/${fileName}`; + + head.appendChild(style); + } + + private detectBrowser(): Browser { + if (this.platform.BLINK) { + return 'chrome'; + } + if (this.platform.FIREFOX) { + return 'firefox'; + } + return 'unknown'; + } +} diff --git a/devtools/projects/ng-devtools/src/lib/application-services/browser_styles_service_spec.ts b/devtools/projects/ng-devtools/src/lib/application-services/browser_styles_service_spec.ts new file mode 100644 index 000000000000..a8062c9ffeb4 --- /dev/null +++ b/devtools/projects/ng-devtools/src/lib/application-services/browser_styles_service_spec.ts @@ -0,0 +1,77 @@ +/** + * @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.dev/license + */ + +import {TestBed} from '@angular/core/testing'; +import {DOCUMENT} from '@angular/common'; +import {Platform} from '@angular/cdk/platform'; +import {Browser, BrowserStylesService} from './browser_styles_service'; + +function configureTestingModuleWithPlatformMock(mock: Partial) { + TestBed.configureTestingModule({ + providers: [ + { + provide: Platform, + useValue: mock, + }, + ], + }); +} + +function checkForBrowserSpecificStyles(browser: Browser) { + const doc = TestBed.inject(DOCUMENT); + + // Keep in sync with the service. + return { + hasClass: doc.body.classList.contains(browser + '-ui'), + hasStylesheet: !!doc.head.querySelector(`link[href="./styles/${browser}.css"]`), + }; +} + +describe('BrowserStylesService', () => { + it('should initialize browser-specific styles for Chrome', () => { + configureTestingModuleWithPlatformMock({ + BLINK: true, + }); + + const service = TestBed.inject(BrowserStylesService); + service.initBrowserSpecificStyles(); + + const {hasClass, hasStylesheet} = checkForBrowserSpecificStyles('chrome'); + + expect(hasClass).toBeTrue(); + expect(hasStylesheet).toBeTrue(); + }); + + it('should initialize browser-specific styles for Firefox', () => { + configureTestingModuleWithPlatformMock({ + FIREFOX: true, + }); + + const service = TestBed.inject(BrowserStylesService); + service.initBrowserSpecificStyles(); + + const {hasClass, hasStylesheet} = checkForBrowserSpecificStyles('firefox'); + + expect(hasClass).toBeTrue(); + expect(hasStylesheet).toBeTrue(); + }); + + it('should default to Chrome UI, if the browser is not supported', () => { + configureTestingModuleWithPlatformMock({ + WEBKIT: true, + }); + + const service = TestBed.inject(BrowserStylesService); + service.initBrowserSpecificStyles(); + + const {hasClass, hasStylesheet} = checkForBrowserSpecificStyles('chrome'); + + expect(hasClass).toBeTrue(); + expect(hasStylesheet).toBeTrue(); + }); +}); diff --git a/devtools/projects/ng-devtools/src/lib/frame_manager.ts b/devtools/projects/ng-devtools/src/lib/application-services/frame_manager.ts similarity index 98% rename from devtools/projects/ng-devtools/src/lib/frame_manager.ts rename to devtools/projects/ng-devtools/src/lib/application-services/frame_manager.ts index 1825a0c7447b..7eb81cdfbba1 100644 --- a/devtools/projects/ng-devtools/src/lib/frame_manager.ts +++ b/devtools/projects/ng-devtools/src/lib/application-services/frame_manager.ts @@ -9,7 +9,7 @@ import {Injectable, inject, signal, computed} from '@angular/core'; import {Events, MessageBus} from 'protocol'; -import {Frame, TOP_LEVEL_FRAME_ID} from './application-environment'; +import {Frame, TOP_LEVEL_FRAME_ID} from '../application-environment'; @Injectable() export class FrameManager { diff --git a/devtools/projects/ng-devtools/src/lib/frame_manager_spec.ts b/devtools/projects/ng-devtools/src/lib/application-services/frame_manager_spec.ts similarity index 99% rename from devtools/projects/ng-devtools/src/lib/frame_manager_spec.ts rename to devtools/projects/ng-devtools/src/lib/application-services/frame_manager_spec.ts index 9d983a4d75c8..62d4954ce285 100644 --- a/devtools/projects/ng-devtools/src/lib/frame_manager_spec.ts +++ b/devtools/projects/ng-devtools/src/lib/application-services/frame_manager_spec.ts @@ -9,7 +9,7 @@ import {Events, MessageBus} from 'protocol'; import {FrameManager} from './frame_manager'; import {TestBed} from '@angular/core/testing'; -import {Frame} from './application-environment'; +import {Frame} from '../application-environment'; describe('FrameManager', () => { let frameManager: FrameManager; diff --git a/devtools/projects/ng-devtools/src/lib/application-services/theme_service.ts b/devtools/projects/ng-devtools/src/lib/application-services/theme_service.ts new file mode 100644 index 000000000000..479aa6caef19 --- /dev/null +++ b/devtools/projects/ng-devtools/src/lib/application-services/theme_service.ts @@ -0,0 +1,48 @@ +/** + * @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.dev/license + */ + +import {inject, Injectable, Renderer2, RendererFactory2, signal} from '@angular/core'; +import {DOCUMENT} from '@angular/common'; +import {WINDOW} from '../application-providers/window_provider'; + +export type Theme = 'dark-theme' | 'light-theme'; + +// Keep class names in sync with _theme.scss and _global.scss +const DARK_THEME_CLASS = 'dark-theme'; +const LIGHT_THEME_CLASS = 'light-theme'; + +@Injectable() +export class ThemeService { + private win = inject(WINDOW); + private doc = inject(DOCUMENT); + private renderer: Renderer2; + readonly currentTheme = signal(LIGHT_THEME_CLASS); + + constructor(private _rendererFactory: RendererFactory2) { + this.renderer = this._rendererFactory.createRenderer(null, null); + this.toggleDarkMode(this.prefersDarkMode); + } + + private get prefersDarkMode(): boolean { + return this.win.matchMedia && this.win.matchMedia('(prefers-color-scheme: dark)').matches; + } + + toggleDarkMode(isDark: boolean): void { + const removeClass = isDark ? LIGHT_THEME_CLASS : DARK_THEME_CLASS; + const addClass = !isDark ? LIGHT_THEME_CLASS : DARK_THEME_CLASS; + this.renderer.removeClass(this.doc.body, removeClass); + this.renderer.addClass(this.doc.body, addClass); + this.currentTheme.set(addClass); + } + + initializeThemeWatcher(): void { + this.win.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => { + this.toggleDarkMode(this.prefersDarkMode); + }); + } +} diff --git a/devtools/projects/ng-devtools/src/lib/application-services/theme_service_spec.ts b/devtools/projects/ng-devtools/src/lib/application-services/theme_service_spec.ts new file mode 100644 index 000000000000..d443df19ec20 --- /dev/null +++ b/devtools/projects/ng-devtools/src/lib/application-services/theme_service_spec.ts @@ -0,0 +1,109 @@ +/** + * @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.dev/license + */ + +import {TestBed} from '@angular/core/testing'; +import {DOCUMENT} from '@angular/common'; +import {ThemeService} from './theme_service'; +import {WINDOW} from '../application-providers/window_provider'; + +function configureTestingModuleWithWindowMock(mock: Partial) { + TestBed.configureTestingModule({ + providers: [ + { + provide: WINDOW, + useValue: mock, + }, + ThemeService, + ], + }); +} + +function mockSystemTheme(initialTheme: 'light' | 'dark' = 'light') { + // Set the initial theme. + let currMediaString = `(prefers-color-scheme: ${initialTheme})`; + let matchMediaListener: (() => void) | null = null; + + return { + /** Alter the system theme */ + switchTheme: (theme: 'light' | 'dark') => { + currMediaString = `(prefers-color-scheme: ${theme})`; + if (matchMediaListener) { + matchMediaListener(); + } + }, + /** matchMedia mock */ + matchMedia: (mediaString: string): MediaQueryList => + ({ + matches: mediaString === currMediaString, + addEventListener: (e: string, cb: () => {}) => { + matchMediaListener = cb; + }, + }) as MediaQueryList, + }; +} + +describe('ThemeService', () => { + it(`should enable light mode, if it's the preferred/system one`, () => { + configureTestingModuleWithWindowMock({ + matchMedia: mockSystemTheme('light').matchMedia, + }); + + const service = TestBed.inject(ThemeService); + const doc = TestBed.inject(DOCUMENT); + + expect(service.currentTheme()).toEqual('light-theme'); + expect(doc.body.classList.contains('light-theme')).toBeTrue(); + }); + + it(`should enable dark mode, if it's the preferred/system one`, () => { + configureTestingModuleWithWindowMock({ + matchMedia: mockSystemTheme('dark').matchMedia, + }); + + const service = TestBed.inject(ThemeService); + const doc = TestBed.inject(DOCUMENT); + + expect(service.currentTheme()).toEqual('dark-theme'); + expect(doc.body.classList.contains('dark-theme')).toBeTrue(); + }); + + it('should toggle dark mode', () => { + configureTestingModuleWithWindowMock({ + matchMedia: mockSystemTheme('light').matchMedia, + }); + + const service = TestBed.inject(ThemeService); + // Toggle dark mode. + service.toggleDarkMode(true); + + const doc = TestBed.inject(DOCUMENT); + + expect(service.currentTheme()).toEqual('dark-theme'); + expect(doc.body.classList.contains('dark-theme')).toBeTrue(); + }); + + it('should update the theme automatically, if the system one changes', () => { + const {switchTheme, matchMedia} = mockSystemTheme('light'); + configureTestingModuleWithWindowMock({matchMedia}); + + const service = TestBed.inject(ThemeService); + // Initialize the watcher. + service.initializeThemeWatcher(); + + const docClassList = TestBed.inject(DOCUMENT).body.classList; + + expect(service.currentTheme()).toEqual('light-theme'); + expect(docClassList.contains('light-theme')).toBeTrue(); + + // This should simulate a system theme change, as if the user did it on OS level. + switchTheme('dark'); + + expect(service.currentTheme()).toEqual('dark-theme'); + expect(docClassList.contains('dark-theme')).toBeTrue(); + }); +}); diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/BUILD.bazel b/devtools/projects/ng-devtools/src/lib/devtools-tabs/BUILD.bazel index 8b7f7e589767..751c31e7825b 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/BUILD.bazel +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/BUILD.bazel @@ -1,7 +1,7 @@ -load("//devtools/tools:ng_module.bzl", "ng_module") load("@io_bazel_rules_sass//:defs.bzl", "sass_binary") -load("//devtools/tools:typescript.bzl", "ts_test_library") load("//devtools/tools:defaults.bzl", "karma_web_test_suite") +load("//devtools/tools:ng_module.bzl", "ng_module") +load("//devtools/tools:typescript.bzl", "ts_test_library") package(default_visibility = ["//visibility:public"]) @@ -20,9 +20,9 @@ ng_module( ":devtools_tabs_component_styles", ], deps = [ - "//devtools/projects/ng-devtools/src/lib:frame_manager", - "//devtools/projects/ng-devtools/src/lib:theme", "//devtools/projects/ng-devtools/src/lib/application-environment", + "//devtools/projects/ng-devtools/src/lib/application-services:frame_manager", + "//devtools/projects/ng-devtools/src/lib/application-services:theme", "//devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer", "//devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree:injector_tree", "//devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler", @@ -43,9 +43,9 @@ ts_test_library( srcs = ["devtools-tabs.spec.ts"], deps = [ ":devtools-tabs", - "//devtools/projects/ng-devtools/src/lib:frame_manager", - "//devtools/projects/ng-devtools/src/lib:theme", "//devtools/projects/ng-devtools/src/lib/application-environment", + "//devtools/projects/ng-devtools/src/lib/application-services:frame_manager", + "//devtools/projects/ng-devtools/src/lib/application-services:theme", "//devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer", "//devtools/projects/ng-devtools/src/lib/devtools-tabs/tab-update", "//devtools/projects/protocol", diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/devtools-tabs.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/devtools-tabs.component.ts index 7a014a2542cc..2fe50a0a0cf2 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/devtools-tabs.component.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/devtools-tabs.component.ts @@ -15,8 +15,8 @@ import {MatTooltip} from '@angular/material/tooltip'; import {Events, MessageBus, Route} from 'protocol'; import {ApplicationEnvironment, Frame, TOP_LEVEL_FRAME_ID} from '../application-environment/index'; -import {FrameManager} from '../frame_manager'; -import {ThemeService} from '../theme-service'; +import {FrameManager} from '../application-services/frame_manager'; +import {ThemeService} from '../application-services/theme_service'; import {DirectiveExplorerComponent} from './directive-explorer/directive-explorer.component'; import {InjectorTreeComponent} from './injector-tree/injector-tree.component'; diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/devtools-tabs.spec.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/devtools-tabs.spec.ts index 8c981ab89916..f27d9ab3de96 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/devtools-tabs.spec.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/devtools-tabs.spec.ts @@ -14,12 +14,12 @@ import {Events, MessageBus} from 'protocol'; import {Subject} from 'rxjs'; import {ApplicationEnvironment} from '../application-environment'; -import {Theme, ThemeService} from '../theme-service'; +import {Theme, ThemeService} from '../application-services/theme_service'; import {DevToolsTabsComponent} from './devtools-tabs.component'; import {TabUpdate} from './tab-update/index'; import {DirectiveExplorerComponent} from './directive-explorer/directive-explorer.component'; -import {FrameManager} from '../frame_manager'; +import {FrameManager} from '../application-services/frame_manager'; @Component({ selector: 'ng-directive-explorer', diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/BUILD.bazel b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/BUILD.bazel index 46147c6d67b5..75ec58788897 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/BUILD.bazel +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/BUILD.bazel @@ -1,7 +1,7 @@ -load("//devtools/tools:ng_module.bzl", "ng_module") load("@io_bazel_rules_sass//:defs.bzl", "sass_binary") -load("//devtools/tools:typescript.bzl", "ts_test_library") load("//devtools/tools:defaults.bzl", "karma_web_test_suite") +load("//devtools/tools:ng_module.bzl", "ng_module") +load("//devtools/tools:typescript.bzl", "ts_test_library") package(default_visibility = ["//visibility:public"]) @@ -43,8 +43,8 @@ ts_test_library( srcs = ["directive-explorer.spec.ts"], deps = [ ":directive-explorer", - "//devtools/projects/ng-devtools/src/lib:frame_manager", "//devtools/projects/ng-devtools/src/lib/application-operations", + "//devtools/projects/ng-devtools/src/lib/application-services:frame_manager", "//devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-forest", "//devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-forest/breadcrumbs", "//devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-forest/index-forest", diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-explorer.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-explorer.component.ts index 3f0e07979a72..c5d2711a01db 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-explorer.component.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-explorer.component.ts @@ -31,7 +31,7 @@ import { import {SplitComponent} from '../../../lib/vendor/angular-split/public_api'; import {ApplicationOperations} from '../../application-operations/index'; -import {FrameManager} from '../../frame_manager'; +import {FrameManager} from '../../application-services/frame_manager'; import {BreadcrumbsComponent} from './directive-forest/breadcrumbs/breadcrumbs.component'; import {FlatNode} from './directive-forest/component-data-source'; diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-explorer.spec.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-explorer.spec.ts index ad0d0bc31119..3a2ca28c3197 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-explorer.spec.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-explorer.spec.ts @@ -17,7 +17,7 @@ import {IndexedNode} from './directive-forest/index-forest'; import SpyObj = jasmine.SpyObj; import {By} from '@angular/platform-browser'; -import {FrameManager} from '../../frame_manager'; +import {FrameManager} from '../../application-services/frame_manager'; import {Component, CUSTOM_ELEMENTS_SCHEMA, output, input} from '@angular/core'; import {ElementPropertyResolver, FlatNode} from './property-resolver/element-property-resolver'; import {BreadcrumbsComponent} from './directive-forest/breadcrumbs/breadcrumbs.component'; diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/BUILD.bazel b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/BUILD.bazel index ad2c5d627694..721d0295f249 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/BUILD.bazel +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/BUILD.bazel @@ -47,8 +47,8 @@ ng_module( "property-tab-body.component.html", ] + _STYLE_LABELS, deps = [ - "//devtools/projects/ng-devtools/src/lib:frame_manager", "//devtools/projects/ng-devtools/src/lib/application-environment", + "//devtools/projects/ng-devtools/src/lib/application-services:frame_manager", "//devtools/projects/ng-devtools/src/lib/devtools-tabs/dependency-injection:injector_tree_visualizer", "//devtools/projects/ng-devtools/src/lib/devtools-tabs/dependency-injection:resolution_path", "//devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-forest/index-forest", diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers/BUILD.bazel b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers/BUILD.bazel index 31cd6c2b28ee..27204f4d5f5a 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers/BUILD.bazel +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers/BUILD.bazel @@ -9,7 +9,7 @@ sass_binary( include_paths = [ "external/npm/node_modules", ], - deps = ["//devtools:material_sass_deps"], + deps = ["//devtools/projects/ng-devtools/src/styles:material_sass_deps"], ) ng_module( diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/record-formatter/bargraph-formatter/BUILD.bazel b/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/record-formatter/bargraph-formatter/BUILD.bazel index 992e093bc57b..1715c6d3ebf2 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/record-formatter/bargraph-formatter/BUILD.bazel +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/record-formatter/bargraph-formatter/BUILD.bazel @@ -10,7 +10,7 @@ ts_library( ], ), deps = [ - "//devtools/projects/ng-devtools/src/lib:theme", + "//devtools/projects/ng-devtools/src/lib/application-services:theme", "//devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/record-formatter", "//devtools/projects/ng-devtools/src/lib/vendor/memo-decorator", "//devtools/projects/protocol", diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/record-formatter/flamegraph-formatter/BUILD.bazel b/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/record-formatter/flamegraph-formatter/BUILD.bazel index a91d46928666..99719aa83325 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/record-formatter/flamegraph-formatter/BUILD.bazel +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/record-formatter/flamegraph-formatter/BUILD.bazel @@ -1,6 +1,6 @@ +load("//devtools/tools:defaults.bzl", "karma_web_test_suite") load("//devtools/tools:ng_module.bzl", "ng_module") load("//devtools/tools:typescript.bzl", "ts_test_library") -load("//devtools/tools:defaults.bzl", "karma_web_test_suite") package(default_visibility = ["//visibility:public"]) @@ -13,7 +13,7 @@ ng_module( exclude = ["flamegraph-formatter.spec.ts"], ), deps = [ - "//devtools/projects/ng-devtools/src/lib:theme", + "//devtools/projects/ng-devtools/src/lib/application-services:theme", "//devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/record-formatter", "//devtools/projects/protocol", "//packages/core", diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/record-formatter/flamegraph-formatter/flamegraph-formatter.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/record-formatter/flamegraph-formatter/flamegraph-formatter.ts index 407202f15b9c..40ea39fbb9f8 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/record-formatter/flamegraph-formatter/flamegraph-formatter.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/record-formatter/flamegraph-formatter/flamegraph-formatter.ts @@ -8,7 +8,7 @@ import {ElementProfile, ProfilerFrame} from 'protocol'; -import {Theme} from '../../../../../theme-service'; +import {Theme} from '../../../../../application-services/theme_service'; import {RecordFormatter} from '../record-formatter'; export interface FlamegraphNode { diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/recording-visualizer/BUILD.bazel b/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/recording-visualizer/BUILD.bazel index bbb89dbe6ba3..e358d4e7cb85 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/recording-visualizer/BUILD.bazel +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/recording-visualizer/BUILD.bazel @@ -45,7 +45,7 @@ ng_module( "execution-details.component.html", ] + _STYLE_LABELS, deps = [ - "//devtools/projects/ng-devtools/src/lib:theme", + "//devtools/projects/ng-devtools/src/lib/application-services:theme", "//devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/record-formatter/bargraph-formatter", "//devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/record-formatter/flamegraph-formatter", "//devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/record-formatter/tree-map-formatter", diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/recording-visualizer/bargraph-visualizer.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/recording-visualizer/bargraph-visualizer.component.ts index 9d0a7c118e87..1c31cd7bc32f 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/recording-visualizer/bargraph-visualizer.component.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/recording-visualizer/bargraph-visualizer.component.ts @@ -9,7 +9,7 @@ import {ChangeDetectionStrategy, Component, computed, inject, input, output} from '@angular/core'; import {ProfilerFrame} from 'protocol'; -import {ThemeService} from '../../../../theme-service'; +import {ThemeService} from '../../../../application-services/theme_service'; import {BarGraphFormatter, BargraphNode} from '../record-formatter/bargraph-formatter/index'; import {formatDirectiveProfile} from './profile-formatter'; diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/recording-visualizer/flamegraph-visualizer.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/recording-visualizer/flamegraph-visualizer.component.ts index 8f2b1a890d23..18c236ceae44 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/recording-visualizer/flamegraph-visualizer.component.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/recording-visualizer/flamegraph-visualizer.component.ts @@ -10,7 +10,7 @@ import {ChangeDetectionStrategy, Component, computed, inject, input, output} fro import {Color, RawData} from 'ngx-flamegraph/lib/utils'; import {ProfilerFrame} from 'protocol'; -import {ThemeService} from '../../../../theme-service'; +import {ThemeService} from '../../../../application-services/theme_service'; import { FlamegraphFormatter, FlamegraphNode, diff --git a/devtools/projects/ng-devtools/src/lib/devtools.component.ts b/devtools/projects/ng-devtools/src/lib/devtools.component.ts index 00b800d161a2..af46953631f0 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools.component.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools.component.ts @@ -8,17 +8,18 @@ import {animate, style, transition, trigger} from '@angular/animations'; import {Platform} from '@angular/cdk/platform'; -import {DOCUMENT} from '@angular/common'; import {Component, computed, inject, OnDestroy, OnInit, signal} from '@angular/core'; import {Events, MessageBus} from 'protocol'; import {interval} from 'rxjs'; -import {FrameManager} from './frame_manager'; -import {ThemeService} from './theme-service'; +import {FrameManager} from './application-services/frame_manager'; +import {ThemeService} from './application-services/theme_service'; import {MatTooltip, MatTooltipModule} from '@angular/material/tooltip'; import {DevToolsTabsComponent} from './devtools-tabs/devtools-tabs.component'; import {MatProgressSpinnerModule} from '@angular/material/progress-spinner'; import {Frame} from './application-environment'; +import {BrowserStylesService} from './application-services/browser_styles_service'; +import {WINDOW_PROVIDER} from './application-providers/window_provider'; const DETECT_ANGULAR_ATTEMPTS = 10; @@ -53,6 +54,7 @@ const LAST_SUPPORTED_VERSION = 9; ]), ], imports: [DevToolsTabsComponent, MatTooltip, MatProgressSpinnerModule, MatTooltipModule], + providers: [WINDOW_PROVIDER, ThemeService], }) export class DevToolsComponent implements OnInit, OnDestroy { readonly AngularStatus = AngularStatus; @@ -74,13 +76,10 @@ export class DevToolsComponent implements OnInit, OnDestroy { return (majorVersion >= LAST_SUPPORTED_VERSION || majorVersion === 0) && this.ivy(); }); - private readonly _firefoxStyleName = 'firefox_styles.css'; - private readonly _chromeStyleName = 'chrome_styles.css'; private readonly _messageBus = inject>(MessageBus); private readonly _themeService = inject(ThemeService); - private readonly _platform = inject(Platform); - private readonly _document = inject(DOCUMENT); private readonly _frameManager = inject(FrameManager); + private readonly _browserStyles = inject(BrowserStylesService); private _interval$ = interval(500).subscribe((attempt) => { if (attempt === DETECT_ANGULAR_ATTEMPTS) { @@ -95,6 +94,7 @@ export class DevToolsComponent implements OnInit, OnDestroy { ngOnInit(): void { this._themeService.initializeThemeWatcher(); + this._browserStyles.initBrowserSpecificStyles(); this._messageBus.once('ngAvailability', ({version, devMode, ivy, hydration}) => { this.angularStatus.set(version ? AngularStatus.EXISTS : AngularStatus.DOES_NOT_EXIST); @@ -104,22 +104,6 @@ export class DevToolsComponent implements OnInit, OnDestroy { this._interval$.unsubscribe(); this.hydration.set(hydration); }); - - const browserStyleName = this._platform.FIREFOX - ? this._firefoxStyleName - : this._chromeStyleName; - this._loadStyle(browserStyleName); - } - - /** Add a style file in header based on fileName */ - private _loadStyle(styleName: string) { - const head = this._document.getElementsByTagName('head')[0]; - - const style = this._document.createElement('link'); - style.rel = 'stylesheet'; - style.href = `./styles/${styleName}`; - - head.appendChild(style); } ngOnDestroy(): void { diff --git a/devtools/projects/ng-devtools/src/lib/devtools_spec.ts b/devtools/projects/ng-devtools/src/lib/devtools_spec.ts index 6005ce7f7523..c48f7e0843c6 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools_spec.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools_spec.ts @@ -8,7 +8,7 @@ import {Component} from '@angular/core'; import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {FrameManager} from './frame_manager'; +import {FrameManager} from './application-services/frame_manager'; import {DevToolsComponent} from './devtools.component'; import {DevToolsTabsComponent} from './devtools-tabs/devtools-tabs.component'; import {MessageBus} from 'protocol'; diff --git a/devtools/projects/ng-devtools/src/lib/theme-service.ts b/devtools/projects/ng-devtools/src/lib/theme-service.ts deleted file mode 100644 index d7c485a547fc..000000000000 --- a/devtools/projects/ng-devtools/src/lib/theme-service.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * @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.dev/license - */ - -import {Injectable, Renderer2, RendererFactory2, signal} from '@angular/core'; - -export type Theme = 'dark-theme' | 'light-theme'; - -@Injectable({ - providedIn: 'root', -}) -export class ThemeService { - private renderer: Renderer2; - readonly currentTheme = signal('light-theme'); - - constructor(private _rendererFactory: RendererFactory2) { - this.renderer = this._rendererFactory.createRenderer(null, null); - this.toggleDarkMode(this._prefersDarkMode); - } - - toggleDarkMode(isDark: boolean): void { - const removeClass = isDark ? 'light-theme' : 'dark-theme'; - const addClass = !isDark ? 'light-theme' : 'dark-theme'; - this.renderer.removeClass(document.body, removeClass); - this.renderer.addClass(document.body, addClass); - this.currentTheme.set(addClass); - } - - initializeThemeWatcher(): void { - window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => { - this.toggleDarkMode(this._prefersDarkMode); - }); - } - - private get _prefersDarkMode(): boolean { - return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches; - } -} diff --git a/devtools/projects/ng-devtools/src/styles/BUILD.bazel b/devtools/projects/ng-devtools/src/styles/BUILD.bazel new file mode 100644 index 000000000000..d834265d052b --- /dev/null +++ b/devtools/projects/ng-devtools/src/styles/BUILD.bazel @@ -0,0 +1,42 @@ +load("@io_bazel_rules_sass//:defs.bzl", "npm_sass_library", "sass_binary", "sass_library") + +package(default_visibility = ["//visibility:public"]) + +npm_sass_library( + name = "material_sass_deps", + deps = [ + "@npm//@angular/cdk", + "@npm//@angular/material", + ], +) + +sass_library( + name = "global", + srcs = ["_global.scss"], + deps = [":material_sass_deps"], +) + +sass_library( + name = "theme", + srcs = ["_theme.scss"], +) + +sass_library( + name = "browser", + srcs = ["_browser.scss"], +) + +sass_library( + name = "colors", + srcs = ["_colors.scss"], +) + +sass_binary( + name = "firefox", + src = "firefox.scss", +) + +sass_binary( + name = "chrome", + src = "chrome.scss", +) diff --git a/devtools/projects/ng-devtools/src/styles/_browser.scss b/devtools/projects/ng-devtools/src/styles/_browser.scss new file mode 100644 index 000000000000..98a5963424b3 --- /dev/null +++ b/devtools/projects/ng-devtools/src/styles/_browser.scss @@ -0,0 +1,15 @@ +/* Keep class names in sync with ThemeService */ + +/* Default. Target Chrome */ +@mixin chrome { + :host-context(.chrome-ui) { + @content; + } +} + +/* Target Firefox */ +@mixin firefox { + :host-context(.firefox-ui) { + @content; + } +} diff --git a/devtools/projects/ng-devtools/src/styles/_colors.scss b/devtools/projects/ng-devtools/src/styles/_colors.scss new file mode 100644 index 000000000000..334e90df56dc --- /dev/null +++ b/devtools/projects/ng-devtools/src/styles/_colors.scss @@ -0,0 +1 @@ +$dummy: #f00; diff --git a/devtools/styles.scss b/devtools/projects/ng-devtools/src/styles/_global.scss similarity index 88% rename from devtools/styles.scss rename to devtools/projects/ng-devtools/src/styles/_global.scss index c6c789e2ccea..5a74158c7aa7 100644 --- a/devtools/styles.scss +++ b/devtools/projects/ng-devtools/src/styles/_global.scss @@ -1,3 +1,5 @@ +/* Global styles imported in the main styles.scss of the app wrapper (shell, demo apps). */ + @use 'sass:map'; @use 'external/npm/node_modules/@angular/material/index' as mat; @include mat.all-component-typographies(); @@ -39,6 +41,7 @@ $dark-theme: map.deep-merge( ) ); +/* Keep class name in sync with ThemeService */ .light-theme { @include mat.all-component-themes($light-theme); @@ -47,6 +50,7 @@ $dark-theme: map.deep-merge( } } +/* Keep class name in sync with ThemeService */ .dark-theme { color-scheme: dark; background: #202124; diff --git a/devtools/projects/ng-devtools/src/styles/_theme.scss b/devtools/projects/ng-devtools/src/styles/_theme.scss new file mode 100644 index 000000000000..ce075843c2d5 --- /dev/null +++ b/devtools/projects/ng-devtools/src/styles/_theme.scss @@ -0,0 +1,30 @@ +/* Keep class names in sync with ThemeService */ +$_dark-theme-class: 'dark-theme'; +$_light-theme-class: 'light-theme'; + +/* $browser expects 'chrome', 'firefox' or 'safari' */ +@mixin _theme($theme, $browser: '') { + @if $browser == '' { + :host-context(body.#{$theme}) { + @content; + } + } @else { + /* Keep browser class name in sync with BrowserService. */ + $browser-class: $browser + '-ui'; + :host-context(body.#{$theme}.#{$browser-class}) { + @content; + } + } +} + +@mixin dark-theme($browser: '') { + @include _theme($_dark-theme-class, $browser) { + @content; + } +} + +@mixin light-theme($browser: '') { + @include _theme($_light-theme-class, $browser) { + @content; + } +} diff --git a/devtools/projects/ng-devtools/src/styles/chrome.scss b/devtools/projects/ng-devtools/src/styles/chrome.scss new file mode 100644 index 000000000000..8b1524d5c5bd --- /dev/null +++ b/devtools/projects/ng-devtools/src/styles/chrome.scss @@ -0,0 +1 @@ +/* Chrome-specific global styles */ diff --git a/devtools/projects/ng-devtools/src/styles/firefox.scss b/devtools/projects/ng-devtools/src/styles/firefox.scss new file mode 100644 index 000000000000..a338892ff93e --- /dev/null +++ b/devtools/projects/ng-devtools/src/styles/firefox.scss @@ -0,0 +1 @@ +/* Firefox-specific global styles */ diff --git a/devtools/projects/shell-browser/src/BUILD.bazel b/devtools/projects/shell-browser/src/BUILD.bazel index 9c946c6476c8..2250080a7149 100644 --- a/devtools/projects/shell-browser/src/BUILD.bazel +++ b/devtools/projects/shell-browser/src/BUILD.bazel @@ -1,10 +1,11 @@ -load("@io_bazel_rules_sass//:defs.bzl", "sass_binary") +load("@aspect_bazel_lib//lib:copy_to_directory.bzl", "copy_to_directory") +load("@bazel_skylib//rules:common_settings.bzl", "string_flag") load("@build_bazel_rules_nodejs//:index.bzl", "js_library", "pkg_web") +load("@io_bazel_rules_sass//:defs.bzl", "sass_binary") load("//devtools/tools:ng_module.bzl", "ng_module") load("//devtools/tools:typescript.bzl", "ts_library") -load("//tools:defaults.bzl", "esbuild") load("//devtools/tools/esbuild:index.bzl", "LINKER_PROCESSED_FW_PACKAGES") -load("@bazel_skylib//rules:common_settings.bzl", "string_flag") +load("//tools:defaults.bzl", "esbuild") package(default_visibility = ["//visibility:public"]) @@ -13,17 +14,19 @@ sass_binary( src = "styles.scss", include_paths = ["external/npm/node_modules"], sourcemap = False, - deps = ["//devtools:global_styles"], + deps = ["//devtools/projects/ng-devtools/src/styles:global"], ) -sass_binary( - name = "shell_firefox_styles", - src = "styles/firefox_styles.scss", -) - -sass_binary( - name = "shell_chrome_styles", - src = "styles/chrome_styles.scss", +copy_to_directory( + name = "browser_specific_styles", + srcs = [ + "//devtools/projects/ng-devtools/src/styles:chrome", + "//devtools/projects/ng-devtools/src/styles:firefox", + ], + out = "styles", + replace_prefixes = { + "devtools/projects/ng-devtools/src/styles": "", + }, ) ts_library( @@ -95,10 +98,9 @@ exports_files(["index.html"]) filegroup( name = "prod_app_static_files", srcs = [ + ":browser_specific_styles", ":index.html", - ":shell_chrome_styles", ":shell_common_styles", - ":shell_firefox_styles", "//packages/zone.js/bundles:zone.umd.js", ], ) diff --git a/devtools/projects/shell-browser/src/app/app.config.ts b/devtools/projects/shell-browser/src/app/app.config.ts index a0b6673e9ea9..d5c37fda24c8 100644 --- a/devtools/projects/shell-browser/src/app/app.config.ts +++ b/devtools/projects/shell-browser/src/app/app.config.ts @@ -14,7 +14,7 @@ import {ChromeApplicationEnvironment} from './chrome-application-environment'; import {ChromeApplicationOperations} from './chrome-application-operations'; import {ZoneAwareChromeMessageBus} from './zone-aware-chrome-message-bus'; import {Events, MessageBus, PriorityAwareMessageBus} from 'protocol'; -import {FrameManager} from '../../../ng-devtools/src/lib/frame_manager'; +import {FrameManager} from '../../../ng-devtools/src/lib/application-services/frame_manager'; export const appConfig: ApplicationConfig = { providers: [ diff --git a/devtools/projects/shell-browser/src/styles.scss b/devtools/projects/shell-browser/src/styles.scss index 7bc3816635c1..3c0d3a127593 100644 --- a/devtools/projects/shell-browser/src/styles.scss +++ b/devtools/projects/shell-browser/src/styles.scss @@ -1,4 +1,4 @@ -@use '../../../styles.scss' as devtools; +@use '../../../projects/ng-devtools/src/styles/global'; body, html { diff --git a/devtools/projects/shell-browser/src/styles/chrome_styles.scss b/devtools/projects/shell-browser/src/styles/chrome_styles.scss deleted file mode 100644 index 9959545b62fe..000000000000 --- a/devtools/projects/shell-browser/src/styles/chrome_styles.scss +++ /dev/null @@ -1 +0,0 @@ -/** Specific style for Chrome browser */ diff --git a/devtools/projects/shell-browser/src/styles/firefox_styles.scss b/devtools/projects/shell-browser/src/styles/firefox_styles.scss deleted file mode 100644 index af7608ad155f..000000000000 --- a/devtools/projects/shell-browser/src/styles/firefox_styles.scss +++ /dev/null @@ -1 +0,0 @@ -/** Specific style for Firefox browser */ diff --git a/devtools/src/BUILD.bazel b/devtools/src/BUILD.bazel index ccca6207b5b9..f5ba71ab6b15 100644 --- a/devtools/src/BUILD.bazel +++ b/devtools/src/BUILD.bazel @@ -1,8 +1,9 @@ -load("//devtools/tools:ng_module.bzl", "ng_module") -load("@io_bazel_rules_sass//:defs.bzl", "sass_binary") +load("@aspect_bazel_lib//lib:copy_to_directory.bzl", "copy_to_directory") load("@build_bazel_rules_nodejs//:index.bzl", "pkg_web") -load("//tools:defaults.bzl", "esbuild", "http_server") +load("@io_bazel_rules_sass//:defs.bzl", "sass_binary") +load("//devtools/tools:ng_module.bzl", "ng_module") load("//devtools/tools/esbuild:index.bzl", "LINKER_PROCESSED_FW_PACKAGES") +load("//tools:defaults.bzl", "esbuild", "http_server") package(default_visibility = ["//visibility:public"]) @@ -11,17 +12,19 @@ sass_binary( src = "styles.scss", include_paths = ["external/npm/node_modules"], sourcemap = False, - deps = ["//devtools:global_styles"], + deps = ["//devtools/projects/ng-devtools/src/styles:global"], ) -sass_binary( - name = "firefox_styles", - src = "styles/firefox_styles.scss", -) - -sass_binary( - name = "chrome_styles", - src = "styles/chrome_styles.scss", +copy_to_directory( + name = "browser_specific_styles", + srcs = [ + "//devtools/projects/ng-devtools/src/styles:chrome", + "//devtools/projects/ng-devtools/src/styles:firefox", + ], + out = "styles", + replace_prefixes = { + "devtools/projects/ng-devtools/src/styles": "", + }, ) ng_module( @@ -59,9 +62,8 @@ exports_files(["index.html"]) filegroup( name = "dev_app_static_files", srcs = [ - ":chrome_styles", + ":browser_specific_styles", ":demo_styles", - ":firefox_styles", ":index.html", "//packages/zone.js/bundles:zone.umd.js", ], diff --git a/devtools/src/app/devtools-app/BUILD.bazel b/devtools/src/app/devtools-app/BUILD.bazel index 9f5cb5689d7c..67fecc3ec09c 100644 --- a/devtools/src/app/devtools-app/BUILD.bazel +++ b/devtools/src/app/devtools-app/BUILD.bazel @@ -20,7 +20,7 @@ ng_module( ], deps = [ "//devtools/projects/ng-devtools", - "//devtools/projects/ng-devtools/src/lib:frame_manager", + "//devtools/projects/ng-devtools/src/lib/application-services:frame_manager", "//devtools/projects/protocol", "//devtools/src:iframe_message_bus", "//packages/common", diff --git a/devtools/src/app/devtools-app/devtools-app.routes.ts b/devtools/src/app/devtools-app/devtools-app.routes.ts index 9f4e03d7887c..8ef8b847e3b6 100644 --- a/devtools/src/app/devtools-app/devtools-app.routes.ts +++ b/devtools/src/app/devtools-app/devtools-app.routes.ts @@ -9,7 +9,7 @@ import {Routes} from '@angular/router'; import {AppDevToolsComponent} from './devtools-app.component'; -import {FrameManager} from '../../../projects/ng-devtools/src/lib/frame_manager'; +import {FrameManager} from '../../../projects/ng-devtools/src/lib/application-services/frame_manager'; import {Events, MessageBus, PriorityAwareMessageBus} from 'protocol'; import {IFrameMessageBus} from '../../iframe-message-bus'; diff --git a/devtools/src/styles.scss b/devtools/src/styles.scss index a8c02e791f07..7ce8097f55e9 100644 --- a/devtools/src/styles.scss +++ b/devtools/src/styles.scss @@ -1 +1 @@ -@use '../styles.scss' as devtools; +@use '../projects/ng-devtools/src/styles/global'; diff --git a/devtools/src/styles/chrome_styles.scss b/devtools/src/styles/chrome_styles.scss deleted file mode 100644 index 9959545b62fe..000000000000 --- a/devtools/src/styles/chrome_styles.scss +++ /dev/null @@ -1 +0,0 @@ -/** Specific style for Chrome browser */ diff --git a/devtools/src/styles/firefox_styles.scss b/devtools/src/styles/firefox_styles.scss deleted file mode 100644 index af7608ad155f..000000000000 --- a/devtools/src/styles/firefox_styles.scss +++ /dev/null @@ -1 +0,0 @@ -/** Specific style for Firefox browser */ From 730fe65d55d506d90f1f4eca28ca4b33f2901851 Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Wed, 12 Feb 2025 12:03:58 -0800 Subject: [PATCH 0046/1000] docs: release notes for the v19.1.6 release (#59930) PR Close #59930 --- CHANGELOG.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 72b25e156719..a0daeb2d472e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,25 @@ + +# 19.1.6 (2025-02-12) +### compiler +| Commit | Type | Description | +| -- | -- | -- | +| [01f669a274](https://github.com/angular/angular/commit/01f669a27425c5034a04274763cc60801f961aa2) | fix | handle tracking expressions requiring temporary variables ([#58520](https://github.com/angular/angular/pull/58520)) | +### compiler-cli +| Commit | Type | Description | +| -- | -- | -- | +| [dcfb9f1959](https://github.com/angular/angular/commit/dcfb9f1959164baf45f5f954b4bf681d650d8a2d) | fix | handle deferred blocks with shared dependencies correctly ([#59926](https://github.com/angular/angular/pull/59926)) | +### core +| Commit | Type | Description | +| -- | -- | -- | +| [cab7a9b69c](https://github.com/angular/angular/commit/cab7a9b69c3a5d789432a87a554e8489c78a0f15) | fix | invalidate HMR component if replacement throws an error ([#59854](https://github.com/angular/angular/pull/59854)) | +### migrations +| Commit | Type | Description | +| -- | -- | -- | +| [710759ddcc](https://github.com/angular/angular/commit/710759ddcc0ecbad68deb20821b535fd5deb69c6) | fix | account for let declarations in control flow migration ([#59861](https://github.com/angular/angular/pull/59861)) | +| [46f36a58bf](https://github.com/angular/angular/commit/46f36a58bf3a7b9131b6330e84d4adb3e73f3601) | fix | count used dependencies inside existing control flow ([#59861](https://github.com/angular/angular/pull/59861)) | + + + # 19.2.0-next.2 (2025-02-06) ### compiler-cli From c87e581dd9e240c88cea50f222942873bdccd01d Mon Sep 17 00:00:00 2001 From: Miles Malerba Date: Thu, 16 Jan 2025 03:12:36 +0000 Subject: [PATCH 0047/1000] fix(core): Don't run effects in check no changes pass (#59455) (#59551) This reverts commit 21f1ba22a6d81d8220c95bd7bd003b82e76ce76c. PR Close #59551 --- packages/core/src/render3/instructions/change_detection.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/core/src/render3/instructions/change_detection.ts b/packages/core/src/render3/instructions/change_detection.ts index 23526287d101..16ebe0ba142b 100644 --- a/packages/core/src/render3/instructions/change_detection.ts +++ b/packages/core/src/render3/instructions/change_detection.ts @@ -498,7 +498,9 @@ function detectChangesInView(lView: LView, mode: ChangeDetectionMode) { if (shouldRefreshView) { refreshView(tView, lView, tView.template, lView[CONTEXT]); } else if (flags & LViewFlags.HasChildViewsToRefresh) { - runEffectsInView(lView); + if (!isInCheckNoChangesPass) { + runEffectsInView(lView); + } detectChangesInEmbeddedViews(lView, ChangeDetectionMode.Targeted); const components = tView.components; if (components !== null) { From 6789c7ef947952551d7598fe37a3d86093b75720 Mon Sep 17 00:00:00 2001 From: Miles Malerba Date: Thu, 16 Jan 2025 03:14:07 +0000 Subject: [PATCH 0048/1000] fix(core): Defer afterRender until after first CD (#59455) (#59551) This reverts commit ac2dbe3eb1205ce0683c69c801c1eeb2b5adfc1b. PR Close #59551 --- .../core/src/application/application_ref.ts | 15 -- .../scheduling/zoneless_scheduling.ts | 1 - .../scheduling/zoneless_scheduling_impl.ts | 11 +- packages/core/src/defer/dom_triggers.ts | 12 +- .../core/src/render3/after_render/hooks.ts | 3 + .../core/src/render3/after_render/manager.ts | 43 +++-- .../core/src/render3/after_render/view.ts | 18 ++ .../render3/instructions/change_detection.ts | 12 +- packages/core/src/render3/interfaces/view.ts | 7 +- .../render3/reactivity/after_render_effect.ts | 18 +- .../test/acceptance/after_render_hook_spec.ts | 154 +++++++++--------- packages/core/test/acceptance/tracing_spec.ts | 16 +- .../bundle.golden_symbols.json | 1 + .../animations/bundle.golden_symbols.json | 1 + .../cyclic_import/bundle.golden_symbols.json | 1 + .../bundling/defer/bundle.golden_symbols.json | 2 + .../forms_reactive/bundle.golden_symbols.json | 1 + .../bundle.golden_symbols.json | 1 + .../hello_world/bundle.golden_symbols.json | 1 + .../hydration/bundle.golden_symbols.json | 1 + .../router/bundle.golden_symbols.json | 1 + .../bundle.golden_symbols.json | 1 + .../bundling/todo/bundle.golden_symbols.json | 1 + .../test/full_app_hydration_spec.ts | 12 +- 24 files changed, 197 insertions(+), 137 deletions(-) create mode 100644 packages/core/src/render3/after_render/view.ts diff --git a/packages/core/src/application/application_ref.ts b/packages/core/src/application/application_ref.ts index 4f610e7b937a..3fe4a7d3f4b9 100644 --- a/packages/core/src/application/application_ref.ts +++ b/packages/core/src/application/application_ref.ts @@ -299,13 +299,6 @@ export class ApplicationRef { */ dirtyFlags = ApplicationRefDirtyFlags.None; - /** - * Like `dirtyFlags` but don't cause `tick()` to loop. - * - * @internal - */ - deferredDirtyFlags = ApplicationRefDirtyFlags.None; - /** * Most recent snapshot from the `TracingService`, if any. * @@ -634,10 +627,6 @@ export class ApplicationRef { this._rendererFactory = this._injector.get(RendererFactory2, null, {optional: true}); } - // When beginning synchronization, all deferred dirtiness becomes active dirtiness. - this.dirtyFlags |= this.deferredDirtyFlags; - this.deferredDirtyFlags = ApplicationRefDirtyFlags.None; - let runs = 0; while (this.dirtyFlags !== ApplicationRefDirtyFlags.None && runs++ < MAXIMUM_REFRESH_RERUNS) { profiler(ProfilerEvent.ChangeDetectionSyncStart); @@ -660,10 +649,6 @@ export class ApplicationRef { * Perform a single synchronization pass. */ private synchronizeOnce(): void { - // If we happened to loop, deferred dirtiness can be processed as active dirtiness again. - this.dirtyFlags |= this.deferredDirtyFlags; - this.deferredDirtyFlags = ApplicationRefDirtyFlags.None; - // First, process any dirty root effects. if (this.dirtyFlags & ApplicationRefDirtyFlags.RootEffects) { this.dirtyFlags &= ~ApplicationRefDirtyFlags.RootEffects; diff --git a/packages/core/src/change_detection/scheduling/zoneless_scheduling.ts b/packages/core/src/change_detection/scheduling/zoneless_scheduling.ts index 5812ae553337..352c92824e57 100644 --- a/packages/core/src/change_detection/scheduling/zoneless_scheduling.ts +++ b/packages/core/src/change_detection/scheduling/zoneless_scheduling.ts @@ -33,7 +33,6 @@ export const enum NotificationSource { // but we should execute render hooks: // Render hooks are guaranteed to execute with the schedulers timing. RenderHook, - DeferredRenderHook, // Views might be created outside and manipulated in ways that // we cannot be aware of. When a view is attached, Angular now "knows" // about it and we now know that DOM might have changed (and we should diff --git a/packages/core/src/change_detection/scheduling/zoneless_scheduling_impl.ts b/packages/core/src/change_detection/scheduling/zoneless_scheduling_impl.ts index 433c7f956634..453aaafea219 100644 --- a/packages/core/src/change_detection/scheduling/zoneless_scheduling_impl.ts +++ b/packages/core/src/change_detection/scheduling/zoneless_scheduling_impl.ts @@ -25,10 +25,10 @@ import {NgZone, NgZonePrivate, NoopNgZone, angularZoneInstanceIdProperty} from ' import { ChangeDetectionScheduler, NotificationSource, - ZONELESS_ENABLED, PROVIDED_ZONELESS, - ZONELESS_SCHEDULER_DISABLED, SCHEDULE_IN_ROOT_ZONE, + ZONELESS_ENABLED, + ZONELESS_SCHEDULER_DISABLED, } from './zoneless_scheduling'; import {TracingService} from '../../application/tracing'; @@ -140,13 +140,6 @@ export class ChangeDetectionSchedulerImpl implements ChangeDetectionScheduler { this.appRef.dirtyFlags |= ApplicationRefDirtyFlags.ViewTreeCheck; break; } - case NotificationSource.DeferredRenderHook: { - // Render hooks are "deferred" when they're triggered from other render hooks. Using the - // deferred dirty flags ensures that adding new hooks doesn't automatically trigger a loop - // inside tick(). - this.appRef.deferredDirtyFlags |= ApplicationRefDirtyFlags.AfterRender; - break; - } case NotificationSource.CustomElement: { // We use `ViewTreeTraversal` to ensure we refresh the element even if this is triggered // during CD. In practice this is a no-op since the elements code also calls via a diff --git a/packages/core/src/defer/dom_triggers.ts b/packages/core/src/defer/dom_triggers.ts index 75b69acbc46a..f66c86f156d6 100644 --- a/packages/core/src/defer/dom_triggers.ts +++ b/packages/core/src/defer/dom_triggers.ts @@ -6,8 +6,9 @@ * found in the LICENSE file at https://angular.dev/license */ -import {afterNextRender} from '../render3/after_render/hooks'; import type {Injector} from '../di'; +import {AfterRenderRef} from '../render3/after_render/api'; +import {afterRender} from '../render3/after_render/hooks'; import {assertLContainer, assertLView} from '../render3/assert'; import {CONTAINER_HEADER_OFFSET} from '../render3/interfaces/container'; import {TNode} from '../render3/interfaces/node'; @@ -280,9 +281,11 @@ export function registerDomTrigger( ) { const injector = initialLView[INJECTOR]; const zone = injector.get(NgZone); + let poll: AfterRenderRef; function pollDomTrigger() { // If the initial view was destroyed, we don't need to do anything. if (isDestroyed(initialLView)) { + poll.destroy(); return; } @@ -294,6 +297,7 @@ export function registerDomTrigger( renderedState !== DeferBlockInternalState.Initial && renderedState !== DeferBlockState.Placeholder ) { + poll.destroy(); return; } @@ -301,10 +305,12 @@ export function registerDomTrigger( // Keep polling until we resolve the trigger's LView. if (!triggerLView) { - afterNextRender({read: pollDomTrigger}, {injector}); + // Keep polling. return; } + poll.destroy(); + // It's possible that the trigger's view was destroyed before we resolved the trigger element. if (isDestroyed(triggerLView)) { return; @@ -339,5 +345,5 @@ export function registerDomTrigger( } // Begin polling for the trigger. - afterNextRender({read: pollDomTrigger}, {injector}); + poll = afterRender({read: pollDomTrigger}, {injector}); } diff --git a/packages/core/src/render3/after_render/hooks.ts b/packages/core/src/render3/after_render/hooks.ts index faae30a83e4e..9e4008fc42f6 100644 --- a/packages/core/src/render3/after_render/hooks.ts +++ b/packages/core/src/render3/after_render/hooks.ts @@ -13,6 +13,7 @@ import {inject} from '../../di/injector_compatibility'; import {DestroyRef} from '../../linker/destroy_ref'; import {performanceMarkFeature} from '../../util/performance'; import {assertNotInReactiveContext} from '../reactivity/asserts'; +import {ViewContext} from '../view_context'; import {AfterRenderPhase, AfterRenderRef} from './api'; import { AfterRenderHooks, @@ -459,9 +460,11 @@ function afterRenderImpl( const hooks = options?.phase ?? AfterRenderPhase.MixedReadWrite; const destroyRef = options?.manualCleanup !== true ? injector.get(DestroyRef) : null; + const viewContext = injector.get(ViewContext, null, {optional: true}); const sequence = new AfterRenderSequence( manager.impl, getHooks(callbackOrSpec, hooks), + viewContext?.view, once, destroyRef, tracing?.snapshot(null), diff --git a/packages/core/src/render3/after_render/manager.ts b/packages/core/src/render3/after_render/manager.ts index 5a5986d00870..79c5264eec9e 100644 --- a/packages/core/src/render3/after_render/manager.ts +++ b/packages/core/src/render3/after_render/manager.ts @@ -6,19 +6,21 @@ * found in the LICENSE file at https://angular.dev/license */ -import {AfterRenderPhase, AfterRenderRef} from './api'; -import {NgZone} from '../../zone'; -import {inject} from '../../di/injector_compatibility'; -import {ɵɵdefineInjectable} from '../../di/interface/defs'; -import {ErrorHandler} from '../../error_handler'; +import {TracingAction, TracingService, TracingSnapshot} from '../../application/tracing'; import { ChangeDetectionScheduler, NotificationSource, } from '../../change_detection/scheduling/zoneless_scheduling'; +import {inject} from '../../di/injector_compatibility'; +import {ɵɵdefineInjectable} from '../../di/interface/defs'; +import {ErrorHandler} from '../../error_handler'; import {type DestroyRef} from '../../linker/destroy_ref'; -import {TracingAction, TracingService, TracingSnapshot} from '../../application/tracing'; +import {NgZone} from '../../zone'; +import {AFTER_RENDER_SEQUENCES_TO_ADD, FLAGS, LView, LViewFlags} from '../interfaces/view'; import {profiler} from '../profiler'; import {ProfilerEvent} from '../profiler_types'; +import {markAncestorsForTraversal} from '../util/view_utils'; +import {AfterRenderPhase, AfterRenderRef} from './api'; export class AfterRenderManager { impl: AfterRenderImpl | null = null; @@ -111,7 +113,7 @@ export class AfterRenderImpl { this.sequences.add(sequence); } if (this.deferredRegistrations.size > 0) { - this.scheduler.notify(NotificationSource.DeferredRenderHook); + this.scheduler.notify(NotificationSource.RenderHook); } this.deferredRegistrations.clear(); @@ -121,16 +123,28 @@ export class AfterRenderImpl { } register(sequence: AfterRenderSequence): void { - if (!this.executing) { - this.sequences.add(sequence); - // Trigger an `ApplicationRef.tick()` if one is not already pending/running, because we have a - // new render hook that needs to run. - this.scheduler.notify(NotificationSource.RenderHook); + const {view} = sequence; + if (view !== undefined) { + // Delay adding it to the manager, add it to the view instead. + (view[AFTER_RENDER_SEQUENCES_TO_ADD] ??= []).push(sequence); + + // Mark the view for traversal to ensure we eventually schedule the afterNextRender. + markAncestorsForTraversal(view); + view[FLAGS] |= LViewFlags.HasChildViewsToRefresh; + } else if (!this.executing) { + this.addSequence(sequence); } else { this.deferredRegistrations.add(sequence); } } + addSequence(sequence: AfterRenderSequence): void { + this.sequences.add(sequence); + // Trigger an `ApplicationRef.tick()` if one is not already pending/running, because we have a + // new render hook that needs to run. + this.scheduler.notify(NotificationSource.RenderHook); + } + unregister(sequence: AfterRenderSequence): void { if (this.executing && this.sequences.has(sequence)) { // We can't remove an `AfterRenderSequence` in the middle of iteration. @@ -185,6 +199,7 @@ export class AfterRenderSequence implements AfterRenderRef { constructor( readonly impl: AfterRenderImpl, readonly hooks: AfterRenderHooks, + readonly view: LView | undefined, public once: boolean, destroyRef: DestroyRef | null, public snapshot: TracingSnapshot | null = null, @@ -207,5 +222,9 @@ export class AfterRenderSequence implements AfterRenderRef { destroy(): void { this.impl.unregister(this); this.unregisterOnDestroy?.(); + const scheduled = this.view?.[AFTER_RENDER_SEQUENCES_TO_ADD]; + if (scheduled) { + this.view[AFTER_RENDER_SEQUENCES_TO_ADD] = scheduled.filter((s) => s !== this); + } } } diff --git a/packages/core/src/render3/after_render/view.ts b/packages/core/src/render3/after_render/view.ts new file mode 100644 index 000000000000..a84febc587fb --- /dev/null +++ b/packages/core/src/render3/after_render/view.ts @@ -0,0 +1,18 @@ +/** + * @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.dev/license + */ + +import {AFTER_RENDER_SEQUENCES_TO_ADD, LView} from '../interfaces/view'; + +export function addAfterRenderSequencesForView(lView: LView) { + if (lView[AFTER_RENDER_SEQUENCES_TO_ADD] !== null) { + for (const sequence of lView[AFTER_RENDER_SEQUENCES_TO_ADD]) { + sequence.impl.addSequence(sequence); + } + lView[AFTER_RENDER_SEQUENCES_TO_ADD].length = 0; + } +} diff --git a/packages/core/src/render3/instructions/change_detection.ts b/packages/core/src/render3/instructions/change_detection.ts index 16ebe0ba142b..406736d6315a 100644 --- a/packages/core/src/render3/instructions/change_detection.ts +++ b/packages/core/src/render3/instructions/change_detection.ts @@ -17,6 +17,7 @@ import { import {RuntimeError, RuntimeErrorCode} from '../../errors'; import {assertDefined, assertEqual} from '../../util/assert'; +import {addAfterRenderSequencesForView} from '../after_render/view'; import {executeCheckHooks, executeInitAndCheckHooks, incrementInitPhaseFlags} from '../hooks'; import {CONTAINER_HEADER_OFFSET, LContainerFlags, MOVED_VIEWS} from '../interfaces/container'; import {ComponentTemplate, HostBindingsFunction, RenderFlags} from '../interfaces/definition'; @@ -33,8 +34,8 @@ import { TView, } from '../interfaces/view'; import { - getOrCreateTemporaryConsumer, getOrBorrowReactiveLViewConsumer, + getOrCreateTemporaryConsumer, maybeReturnReactiveLViewConsumer, ReactiveLViewConsumer, viewShouldHaveReactiveConsumer, @@ -64,11 +65,11 @@ import { } from '../util/view_utils'; import {isDestroyed} from '../interfaces/type_checks'; -import {ProfilerEvent} from '../profiler_types'; import {profiler} from '../profiler'; +import {ProfilerEvent} from '../profiler_types'; +import {executeViewQueryFn, refreshContentQueries} from '../queries/query_execution'; import {runEffectsInView} from '../reactivity/view_effect_runner'; import {executeTemplate, handleError} from './shared'; -import {executeViewQueryFn, refreshContentQueries} from '../queries/query_execution'; /** * The maximum number of times the change detection traversal will rerun before throwing an error. @@ -354,6 +355,8 @@ export function refreshView( // no changes cycle, the component would be not be dirty for the next update pass. This would // be different in production mode where the component dirty state is not reset. if (!isInCheckNoChangesPass) { + addAfterRenderSequencesForView(lView); + lView[FLAGS] &= ~(LViewFlags.Dirty | LViewFlags.FirstLViewPass); } } catch (e) { @@ -506,6 +509,9 @@ function detectChangesInView(lView: LView, mode: ChangeDetectionMode) { if (components !== null) { detectChangesInChildComponents(lView, components, ChangeDetectionMode.Targeted); } + if (!isInCheckNoChangesPass) { + addAfterRenderSequencesForView(lView); + } } } diff --git a/packages/core/src/render3/interfaces/view.ts b/packages/core/src/render3/interfaces/view.ts index f9a76db109f0..73bdbfb692a8 100644 --- a/packages/core/src/render3/interfaces/view.ts +++ b/packages/core/src/render3/interfaces/view.ts @@ -13,6 +13,7 @@ import {ProviderToken} from '../../di/provider_token'; import {DehydratedView} from '../../hydration/interfaces'; import {SchemaMetadata} from '../../metadata/schema'; import {Sanitizer} from '../../sanitization/sanitizer'; +import type {AfterRenderSequence} from '../after_render/manager'; import type {ReactiveLViewConsumer} from '../reactive_lview_consumer'; import type {ViewEffectNode} from '../reactivity/effect'; @@ -67,6 +68,7 @@ export const ON_DESTROY_HOOKS = 21; export const EFFECTS_TO_SCHEDULE = 22; export const EFFECTS = 23; export const REACTIVE_TEMPLATE_CONSUMER = 24; +export const AFTER_RENDER_SEQUENCES_TO_ADD = 25; /** * Size of LView's header. Necessary to adjust for it when setting slots. @@ -75,7 +77,7 @@ export const REACTIVE_TEMPLATE_CONSUMER = 24; * instruction index into `LView` index. All other indexes should be in the `LView` index space and * there should be no need to refer to `HEADER_OFFSET` anywhere else. */ -export const HEADER_OFFSET = 25; +export const HEADER_OFFSET = 26; // This interface replaces the real LView interface if it is an arg or a // return value of a public instruction. This ensures we don't need to expose @@ -362,6 +364,9 @@ export interface LView extends Array { * if any signals were read. */ [REACTIVE_TEMPLATE_CONSUMER]: ReactiveLViewConsumer | null; + + // AfterRenderSequences that need to be scheduled + [AFTER_RENDER_SEQUENCES_TO_ADD]: AfterRenderSequence[] | null; } /** diff --git a/packages/core/src/render3/reactivity/after_render_effect.ts b/packages/core/src/render3/reactivity/after_render_effect.ts index e51db04d93dd..616c0f1d95f1 100644 --- a/packages/core/src/render3/reactivity/after_render_effect.ts +++ b/packages/core/src/render3/reactivity/after_render_effect.ts @@ -19,24 +19,26 @@ import { import {type Signal} from '../reactivity/api'; import {type EffectCleanupFn, type EffectCleanupRegisterFn} from './effect'; +import {TracingService, TracingSnapshot} from '../../application/tracing'; import { ChangeDetectionScheduler, NotificationSource, } from '../../change_detection/scheduling/zoneless_scheduling'; +import {assertInInjectionContext} from '../../di/contextual'; import {Injector} from '../../di/injector'; import {inject} from '../../di/injector_compatibility'; +import {DestroyRef} from '../../linker/destroy_ref'; +import {AfterRenderPhase, type AfterRenderRef} from '../after_render/api'; +import {NOOP_AFTER_RENDER_REF, type AfterRenderOptions} from '../after_render/hooks'; import { AFTER_RENDER_PHASES, AfterRenderImpl, AfterRenderManager, AfterRenderSequence, } from '../after_render/manager'; -import {AfterRenderPhase, type AfterRenderRef} from '../after_render/api'; -import {NOOP_AFTER_RENDER_REF, type AfterRenderOptions} from '../after_render/hooks'; -import {DestroyRef} from '../../linker/destroy_ref'; +import {LView} from '../interfaces/view'; +import {ViewContext} from '../view_context'; import {assertNotInReactiveContext} from './asserts'; -import {assertInInjectionContext} from '../../di/contextual'; -import {TracingService, TracingSnapshot} from '../../application/tracing'; const NOT_SET = Symbol('NOT_SET'); const EMPTY_CLEANUP_SET = new Set<() => void>(); @@ -174,13 +176,14 @@ class AfterRenderEffectSequence extends AfterRenderSequence { constructor( impl: AfterRenderImpl, effectHooks: Array, + view: LView | undefined, readonly scheduler: ChangeDetectionScheduler, destroyRef: DestroyRef, snapshot: TracingSnapshot | null = null, ) { // Note that we also initialize the underlying `AfterRenderSequence` hooks to `undefined` and // populate them as we create reactive nodes below. - super(impl, [undefined, undefined, undefined, undefined], false, destroyRef, snapshot); + super(impl, [undefined, undefined, undefined, undefined], view, false, destroyRef, snapshot); // Setup a reactive node for each phase. for (const phase of AFTER_RENDER_PHASES) { @@ -380,9 +383,12 @@ export function afterRenderEffect( spec = {mixedReadWrite: callbackOrSpec as any}; } + const viewContext = injector.get(ViewContext, null, {optional: true}); + const sequence = new AfterRenderEffectSequence( manager.impl, [spec.earlyRead, spec.write, spec.mixedReadWrite, spec.read] as AfterRenderPhaseEffectHook[], + viewContext?.view, scheduler, injector.get(DestroyRef), tracing?.snapshot(null), diff --git a/packages/core/test/acceptance/after_render_hook_spec.ts b/packages/core/test/acceptance/after_render_hook_spec.ts index 368e27b9dc59..0ab9ebb9089c 100644 --- a/packages/core/test/acceptance/after_render_hook_spec.ts +++ b/packages/core/test/acceptance/after_render_hook_spec.ts @@ -8,8 +8,10 @@ import {PLATFORM_BROWSER_ID, PLATFORM_SERVER_ID} from '@angular/common/src/platform_id'; import { + AfterRenderPhase, AfterRenderRef, ApplicationRef, + ChangeDetectionStrategy, ChangeDetectorRef, Component, ErrorHandler, @@ -25,15 +27,14 @@ import { effect, inject, signal, - AfterRenderPhase, } from '@angular/core'; import {NoopNgZone} from '@angular/core/src/zone/ng_zone'; import {TestBed} from '@angular/core/testing'; +import {setUseMicrotaskEffectsByDefault} from '@angular/core/src/render3/reactivity/effect'; import {firstValueFrom} from 'rxjs'; import {filter} from 'rxjs/operators'; import {EnvironmentInjector, Injectable} from '../../src/di'; -import {setUseMicrotaskEffectsByDefault} from '@angular/core/src/render3/reactivity/effect'; function createAndAttachComponent(component: Type) { const componentRef = createComponent(component, { @@ -163,28 +164,28 @@ describe('after render hooks', () => { const viewContainerRef = compInstance.viewContainerRef; const dynamicCompRef = viewContainerRef.createComponent(DynamicComp); expect(dynamicCompRef.instance.afterRenderCount).toBe(0); - expect(compInstance.afterRenderCount).toBe(1); + expect(compInstance.afterRenderCount).toBe(0); // Running change detection at the dynamicCompRef level dynamicCompRef.changeDetectorRef.detectChanges(); expect(dynamicCompRef.instance.afterRenderCount).toBe(0); - expect(compInstance.afterRenderCount).toBe(1); + expect(compInstance.afterRenderCount).toBe(0); // Running change detection at the compInstance level compInstance.changeDetectorRef.detectChanges(); expect(dynamicCompRef.instance.afterRenderCount).toBe(0); - expect(compInstance.afterRenderCount).toBe(1); + expect(compInstance.afterRenderCount).toBe(0); // Running change detection at the Application level fixture.detectChanges(); expect(dynamicCompRef.instance.afterRenderCount).toBe(1); - expect(compInstance.afterRenderCount).toBe(2); + expect(compInstance.afterRenderCount).toBe(1); // Running change detection after removing view. viewContainerRef.remove(); fixture.detectChanges(); expect(dynamicCompRef.instance.afterRenderCount).toBe(1); - expect(compInstance.afterRenderCount).toBe(3); + expect(compInstance.afterRenderCount).toBe(2); }); it('should run all hooks after outer change detection', () => { @@ -231,7 +232,7 @@ describe('after render hooks', () => { expect(log).toEqual([]); TestBed.inject(ApplicationRef).tick(); - expect(log).toEqual(['pre-cd', 'post-cd', 'parent-comp', 'child-comp']); + expect(log).toEqual(['pre-cd', 'post-cd', 'child-comp', 'parent-comp']); }); it('should run hooks once after tick even if there are multiple root views', () => { @@ -296,56 +297,6 @@ describe('after render hooks', () => { expect(afterRenderCount).toBe(2); }); - it('should defer nested hooks to the next cycle', () => { - let outerHookCount = 0; - let innerHookCount = 0; - - @Component({ - selector: 'comp', - standalone: false, - }) - class Comp { - injector = inject(Injector); - - constructor() { - afterRender(() => { - outerHookCount++; - afterNextRender( - () => { - innerHookCount++; - }, - {injector: this.injector}, - ); - }); - } - } - - TestBed.configureTestingModule({ - declarations: [Comp], - ...COMMON_CONFIGURATION, - }); - createAndAttachComponent(Comp); - - // It hasn't run at all - expect(outerHookCount).toBe(0); - expect(innerHookCount).toBe(0); - - // Running change detection (first time) - TestBed.inject(ApplicationRef).tick(); - expect(outerHookCount).toBe(1); - expect(innerHookCount).toBe(0); - - // Running change detection (second time) - TestBed.inject(ApplicationRef).tick(); - expect(outerHookCount).toBe(2); - expect(innerHookCount).toBe(1); - - // Running change detection (third time) - TestBed.inject(ApplicationRef).tick(); - expect(outerHookCount).toBe(3); - expect(innerHookCount).toBe(2); - }); - it('should run outside of the Angular zone', () => { const zoneLog: boolean[] = []; @@ -973,7 +924,7 @@ describe('after render hooks', () => { expect(log).toEqual([]); TestBed.inject(ApplicationRef).tick(); - expect(log).toEqual(['pre-cd', 'post-cd', 'parent-comp', 'child-comp']); + expect(log).toEqual(['pre-cd', 'post-cd', 'child-comp', 'parent-comp']); }); it('should unsubscribe when calling destroy', () => { @@ -1043,24 +994,24 @@ describe('after render hooks', () => { ); }); - it('should defer nested hooks to the next cycle', () => { - let outerHookCount = 0; - let innerHookCount = 0; - + it('should process inner hook within same tick with CD in between', () => { @Component({ selector: 'comp', standalone: false, + template: `{{outerHookCount()}}:{{innerHookCount}}`, + changeDetection: ChangeDetectionStrategy.OnPush, }) class Comp { injector = inject(Injector); + outerHookCount = signal(0); + innerHookCount = 0; constructor() { afterNextRender(() => { - outerHookCount++; - + this.outerHookCount.update((v) => v + 1); afterNextRender( () => { - innerHookCount++; + this.innerHookCount++; }, {injector: this.injector}, ); @@ -1072,26 +1023,77 @@ describe('after render hooks', () => { declarations: [Comp], ...COMMON_CONFIGURATION, }); - createAndAttachComponent(Comp); + const ref = createAndAttachComponent(Comp); + const instance = ref.instance; // It hasn't run at all - expect(outerHookCount).toBe(0); - expect(innerHookCount).toBe(0); + expect(instance.outerHookCount()).toBe(0); + expect(instance.innerHookCount).toBe(0); // Running change detection (first time) TestBed.inject(ApplicationRef).tick(); - expect(outerHookCount).toBe(1); - expect(innerHookCount).toBe(0); + expect(instance.outerHookCount()).toBe(1); + expect(instance.innerHookCount).toBe(1); + + // In between the inner and outer hook, CD should have run for the component. + expect(ref.location.nativeElement.innerHTML).toEqual('1:0'); // Running change detection (second time) TestBed.inject(ApplicationRef).tick(); - expect(outerHookCount).toBe(1); - expect(innerHookCount).toBe(1); + expect(instance.outerHookCount()).toBe(1); + expect(instance.innerHookCount).toBe(1); + }); + + it('should defer view-associated hook until after view is rendered', () => { + const log: string[] = []; + + @Component({ + selector: 'inner', + standalone: false, + changeDetection: ChangeDetectionStrategy.OnPush, + }) + class Inner { + constructor() { + afterNextRender(() => { + log.push('comp hook'); + }); + } + } + + @Component({ + selector: 'outer', + standalone: false, + template: '', + changeDetection: ChangeDetectionStrategy.OnPush, + }) + class Outer { + changeDetectorRef = inject(ChangeDetectorRef); + } + + TestBed.configureTestingModule({ + declarations: [Inner, Outer], + ...COMMON_CONFIGURATION, + }); + + const ref = createAndAttachComponent(Outer); + ref.instance.changeDetectorRef.detach(); + + const appRef = TestBed.inject(ApplicationRef); + afterNextRender( + () => { + log.push('env hook'); + }, + {injector: appRef.injector}, + ); + + // Initial change detection with component detached. + TestBed.inject(ApplicationRef).tick(); + expect(log).toEqual(['env hook']); - // Running change detection (third time) + // Re-attach component and run change detection. + ref.instance.changeDetectorRef.reattach(); TestBed.inject(ApplicationRef).tick(); - expect(outerHookCount).toBe(1); - expect(innerHookCount).toBe(1); + expect(log).toEqual(['env hook', 'comp hook']); }); it('should run outside of the Angular zone', () => { diff --git a/packages/core/test/acceptance/tracing_spec.ts b/packages/core/test/acceptance/tracing_spec.ts index 5acf143394fa..533624c21ead 100644 --- a/packages/core/test/acceptance/tracing_spec.ts +++ b/packages/core/test/acceptance/tracing_spec.ts @@ -7,11 +7,11 @@ */ import { + afterRender, Component, + ɵTracingAction as TracingAction, ɵTracingService as TracingService, ɵTracingSnapshot as TracingSnapshot, - ɵTracingAction as TracingAction, - afterRender, } from '@angular/core'; import {fakeAsync, TestBed} from '@angular/core/testing'; @@ -85,9 +85,15 @@ describe('TracingService', () => { } } - TestBed.createComponent(App); - expect(mockTracingService.snapshot).toHaveBeenCalledTimes(2); - expect(actions).toEqual([TracingAction.CHANGE_DETECTION, TracingAction.AFTER_NEXT_RENDER]); + const fixture = TestBed.createComponent(App); + fixture.changeDetectorRef.markForCheck(); + fixture.detectChanges(); + expect(mockTracingService.snapshot).toHaveBeenCalledTimes(4); + expect(actions).toEqual([ + TracingAction.CHANGE_DETECTION, + TracingAction.CHANGE_DETECTION, + TracingAction.AFTER_NEXT_RENDER, + ]); })); it('should be able to wrap event listeners through the tracing service', fakeAsync(() => { diff --git a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json index d29d857d7ea6..b71bc1acb0d3 100644 --- a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json @@ -198,6 +198,7 @@ "_platformInjector", "_wasLastNodeCreated", "activeConsumer", + "addAfterRenderSequencesForView", "addClass", "addPropertyBinding", "allocExpando", diff --git a/packages/core/test/bundling/animations/bundle.golden_symbols.json b/packages/core/test/bundling/animations/bundle.golden_symbols.json index 570313bb93c0..d6543d5d1d7f 100644 --- a/packages/core/test/bundling/animations/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations/bundle.golden_symbols.json @@ -217,6 +217,7 @@ "_testabilityGetter", "_wasLastNodeCreated", "activeConsumer", + "addAfterRenderSequencesForView", "addClass", "addPropertyBinding", "allocExpando", diff --git a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json index 2a30f21da706..0d0b59d20915 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -164,6 +164,7 @@ "_testabilityGetter", "_wasLastNodeCreated", "activeConsumer", + "addAfterRenderSequencesForView", "addPropertyBinding", "allocExpando", "allocLFrame", diff --git a/packages/core/test/bundling/defer/bundle.golden_symbols.json b/packages/core/test/bundling/defer/bundle.golden_symbols.json index f5240ad007fe..75abfc490187 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -203,6 +203,7 @@ "_retrieveHydrationInfoImpl", "_wasLastNodeCreated", "activeConsumer", + "addAfterRenderSequencesForView", "addDepsToRegistry", "addPropertyBinding", "addToEndOfViewTree", @@ -732,6 +733,7 @@ "init_version", "init_view", "init_view2", + "init_view3", "init_view_container_ref", "init_view_context", "init_view_effect_runner", diff --git a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json index 0e3f42dc2c07..1271c8ea5569 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -234,6 +234,7 @@ "_testabilityGetter", "_wasLastNodeCreated", "activeConsumer", + "addAfterRenderSequencesForView", "addPropertyBinding", "addToArray", "addToEndOfViewTree", diff --git a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json index 0fbdd4496313..0f671d56cf11 100644 --- a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json @@ -228,6 +228,7 @@ "_testabilityGetter", "_wasLastNodeCreated", "activeConsumer", + "addAfterRenderSequencesForView", "addPropertyBinding", "addToArray", "addToEndOfViewTree", diff --git a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json index 572591d83584..1b03b9c61a31 100644 --- a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json @@ -122,6 +122,7 @@ "_isRefreshingViews", "_platformInjector", "activeConsumer", + "addAfterRenderSequencesForView", "addPropertyBinding", "allocExpando", "allocLFrame", diff --git a/packages/core/test/bundling/hydration/bundle.golden_symbols.json b/packages/core/test/bundling/hydration/bundle.golden_symbols.json index dff15f8056b1..aa326f5d8c18 100644 --- a/packages/core/test/bundling/hydration/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hydration/bundle.golden_symbols.json @@ -168,6 +168,7 @@ "_retrieveHydrationInfoImpl", "_wasLastNodeCreated", "activeConsumer", + "addAfterRenderSequencesForView", "addPropertyBinding", "allocExpando", "allocLFrame", diff --git a/packages/core/test/bundling/router/bundle.golden_symbols.json b/packages/core/test/bundling/router/bundle.golden_symbols.json index 18986f825092..4c29fe53c30f 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -276,6 +276,7 @@ "_stripIndexHtml", "_wasLastNodeCreated", "activeConsumer", + "addAfterRenderSequencesForView", "addEmptyPathsToChildrenIfNeeded", "addPropertyBinding", "addToArray", diff --git a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json index 03b423665752..6a70156c0a74 100644 --- a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json +++ b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json @@ -147,6 +147,7 @@ "_platformInjector", "_wasLastNodeCreated", "activeConsumer", + "addAfterRenderSequencesForView", "addPropertyBinding", "allocExpando", "allocLFrame", diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index 653c95a7e1d8..aa1e72fa09a2 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -193,6 +193,7 @@ "_testabilityGetter", "_wasLastNodeCreated", "activeConsumer", + "addAfterRenderSequencesForView", "addPropertyBinding", "addToArray", "addToEndOfViewTree", diff --git a/packages/platform-server/test/full_app_hydration_spec.ts b/packages/platform-server/test/full_app_hydration_spec.ts index 773c946796ec..1089157fb7e8 100644 --- a/packages/platform-server/test/full_app_hydration_spec.ts +++ b/packages/platform-server/test/full_app_hydration_spec.ts @@ -62,10 +62,12 @@ import { stripUtilAttributes, } from './dom_utils'; import { + clearConsole, EMPTY_TEXT_NODE_COMMENT, getComponentRef, getHydrationInfoFromTransferState, NGH_ATTR_NAME, + resetNgDevModeCounters, ssr, stripExcessiveSpaces, stripSsrIntegrityMarker, @@ -75,6 +77,7 @@ import { verifyAllChildNodesClaimedForHydration, verifyAllNodesClaimedForHydration, verifyClientAndSSRContentsMatch, + verifyEmptyConsole, verifyHasLog, verifyHasNoLog, verifyNodeHasMismatchInfo, @@ -82,9 +85,6 @@ import { verifyNoNodesWereClaimedForHydration, withDebugConsole, withNoopErrorHandler, - verifyEmptyConsole, - clearConsole, - resetNgDevModeCounters, } from './hydration_utils'; import {CLIENT_RENDER_MODE_FLAG} from '@angular/core/src/hydration/api'; @@ -2073,7 +2073,7 @@ describe('platform-server full application hydration integration', () => { const content = clientRootNode.querySelector('app-content'); expect(content.innerHTML).toBe( - 'Start Inner Start Hello World! Inner End Middle Span End', + 'Start Inner Start Hello World! Inner End Middle Span End', ); }); @@ -2127,7 +2127,7 @@ describe('platform-server full application hydration integration', () => { const content = clientRootNode.querySelector('app-content-outer'); expect(content.innerHTML).toBe( - 'Start Outer Start Span Hello World! Outer End Middle End', + 'Start Outer Start Span Hello World! Outer End Middle End', ); }); @@ -2368,7 +2368,7 @@ describe('platform-server full application hydration integration', () => { verifyClientAndSSRContentsMatch(ssrContents, clientRootNode); const div = clientRootNode.querySelector('div'); - expect(div.innerHTML).toMatch(/Some strong<\/strong> content/); + expect(div.innerHTML).toMatch(/Some strong<\/strong> content/); }); it('should support translations that remove elements', async () => { From adf2a0a2d641a766c752050e7888d35e75791c0e Mon Sep 17 00:00:00 2001 From: Doug Parker Date: Wed, 29 Jan 2025 13:20:58 -0800 Subject: [PATCH 0049/1000] release: bump Angular DevTools version to 1.0.22 (#59791) PR Close #59791 --- .../projects/shell-browser/src/manifest/manifest.chrome.json | 4 ++-- .../projects/shell-browser/src/manifest/manifest.firefox.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/devtools/projects/shell-browser/src/manifest/manifest.chrome.json b/devtools/projects/shell-browser/src/manifest/manifest.chrome.json index 086d65458bdd..9f585eb2bd4a 100644 --- a/devtools/projects/shell-browser/src/manifest/manifest.chrome.json +++ b/devtools/projects/shell-browser/src/manifest/manifest.chrome.json @@ -3,8 +3,8 @@ "short_name": "Angular DevTools", "name": "Angular DevTools", "description": "Angular DevTools extends Chrome DevTools adding Angular specific debugging and profiling capabilities.", - "version": "1.0.21", - "version_name": "1.0.21", + "version": "1.0.22", + "version_name": "1.0.22", "minimum_chrome_version": "102", "content_security_policy": { "extension_pages": "script-src 'self'; object-src 'self'" diff --git a/devtools/projects/shell-browser/src/manifest/manifest.firefox.json b/devtools/projects/shell-browser/src/manifest/manifest.firefox.json index 04a5c883127a..6bb9797fcf89 100644 --- a/devtools/projects/shell-browser/src/manifest/manifest.firefox.json +++ b/devtools/projects/shell-browser/src/manifest/manifest.firefox.json @@ -3,7 +3,7 @@ "short_name": "Angular DevTools", "name": "Angular DevTools", "description": "Angular DevTools extends Firefox DevTools adding Angular specific debugging and profiling capabilities.", - "version": "1.0.21", + "version": "1.0.22", "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'", "icons": { "16": "assets/icon16.png", From e0c33814fd1e934d17708d8123c45dad61b72314 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Tue, 11 Feb 2025 11:14:17 +0000 Subject: [PATCH 0050/1000] build: update github/codeql-action action to v3.28.9 (#59914) See associated pull request for more information. PR Close #59914 --- .github/workflows/scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 10ac4a8aba1d..b0f060bf3dc5 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -47,6 +47,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: 'Upload to code-scanning' - uses: github/codeql-action/upload-sarif@dd746615b3b9d728a6a37ca2045b68ca76d4841a # v3.28.8 + uses: github/codeql-action/upload-sarif@9e8d0789d4a0fa9ceb6b1738f7e269594bdd67f0 # v3.28.9 with: sarif_file: results.sarif From b6733eeea48a86c928ed2f838eddedbfb92e1e12 Mon Sep 17 00:00:00 2001 From: hawkgs Date: Tue, 12 Nov 2024 09:35:24 +0200 Subject: [PATCH 0051/1000] docs(docs-infra): drop tabs layout from the API reference details page (#59068) Drop the tabs in favor of a single page separated by sections. PR Close #59068 --- .../table-of-contents.component.html | 32 +- .../table-of-contents.component.ts | 5 +- .../docs-viewer/docs-viewer.component.ts | 7 +- .../api-gen/rendering/styling/css-classes.ts | 7 +- .../rendering/templates/class-member.tsx | 56 +-- .../rendering/templates/class-reference.tsx | 18 +- .../api-gen/rendering/templates/cli-card.tsx | 11 +- .../rendering/templates/cli-reference.tsx | 73 ++-- .../templates/constant-reference.tsx | 15 +- .../rendering/templates/docs-reference.tsx | 7 +- .../rendering/templates/enum-reference.tsx | 32 +- .../templates/function-reference.tsx | 56 +-- .../templates/initializer-api-function.tsx | 67 ++- .../rendering/templates/section-api.tsx | 26 ++ ...escription.tsx => section-description.tsx} | 12 +- .../rendering/templates/section-heading.tsx | 25 ++ ...sage-notes.tsx => section-usage-notes.tsx} | 14 +- .../api-gen/rendering/templates/tab-api.tsx | 26 -- .../templates/type-alias-reference.tsx | 15 +- .../transforms/reference-section-id.ts | 14 + .../rendering/transforms/url-transforms.ts | 12 - .../extensions/docs-workflow/docs-step.ts | 2 +- .../table-of-contents-loader.service.ts | 4 +- adev/shared-docs/styles/_reference.scss | 410 ++++++++++++++++++ .../api-items-section.component.html | 2 +- .../api-items-section.component.scss | 2 +- .../api-items-section.component.spec.ts | 3 +- .../api-reference-details-page.component.html | 31 +- .../api-reference-details-page.component.scss | 406 +---------------- ...i-reference-details-page.component.spec.ts | 70 +-- .../api-reference-details-page.component.ts | 109 ++--- .../cli-reference-details-page.component.html | 12 +- .../cli-reference-details-page.component.scss | 132 +----- ...i-reference-details-page.component.spec.ts | 56 +-- .../cli-reference-details-page.component.ts | 73 +--- .../api-reference-prerender.constants.ts | 7 +- .../reference-scroll-handler.service.ts | 51 +-- 37 files changed, 833 insertions(+), 1067 deletions(-) create mode 100644 adev/shared-docs/pipeline/api-gen/rendering/templates/section-api.tsx rename adev/shared-docs/pipeline/api-gen/rendering/templates/{tab-description.tsx => section-description.tsx} (73%) create mode 100644 adev/shared-docs/pipeline/api-gen/rendering/templates/section-heading.tsx rename adev/shared-docs/pipeline/api-gen/rendering/templates/{tab-usage-notes.tsx => section-usage-notes.tsx} (53%) delete mode 100644 adev/shared-docs/pipeline/api-gen/rendering/templates/tab-api.tsx create mode 100644 adev/shared-docs/pipeline/api-gen/rendering/transforms/reference-section-id.ts create mode 100644 adev/shared-docs/styles/_reference.scss diff --git a/adev/shared-docs/components/table-of-contents/table-of-contents.component.html b/adev/shared-docs/components/table-of-contents/table-of-contents.component.html index f5b514649f14..e791dd207dd0 100644 --- a/adev/shared-docs/components/table-of-contents/table-of-contents.component.html +++ b/adev/shared-docs/components/table-of-contents/table-of-contents.component.html @@ -6,26 +6,26 @@

On this page

@if (shouldDisplayScrollToTop()) { - + } diff --git a/adev/shared-docs/components/table-of-contents/table-of-contents.component.ts b/adev/shared-docs/components/table-of-contents/table-of-contents.component.ts index f18ff9fdf39d..1cb0f0bcb25c 100644 --- a/adev/shared-docs/components/table-of-contents/table-of-contents.component.ts +++ b/adev/shared-docs/components/table-of-contents/table-of-contents.component.ts @@ -14,7 +14,7 @@ import { computed, inject, } from '@angular/core'; -import {RouterLink} from '@angular/router'; +import {Location} from '@angular/common'; import {TableOfContentsLevel} from '../../interfaces/index'; import {TableOfContentsLoader} from '../../services/table-of-contents-loader.service'; import {TableOfContentsScrollSpy} from '../../services/table-of-contents-scroll-spy.service'; @@ -25,11 +25,12 @@ import {IconComponent} from '../icon/icon.component'; changeDetection: ChangeDetectionStrategy.OnPush, templateUrl: './table-of-contents.component.html', styleUrls: ['./table-of-contents.component.scss'], - imports: [RouterLink, IconComponent], + imports: [IconComponent], }) export class TableOfContents { // Element that contains the content from which the Table of Contents is built readonly contentSourceElement = input.required(); + readonly location = inject(Location); private readonly scrollSpy = inject(TableOfContentsScrollSpy); private readonly tableOfContentsLoader = inject(TableOfContentsLoader); diff --git a/adev/shared-docs/components/viewers/docs-viewer/docs-viewer.component.ts b/adev/shared-docs/components/viewers/docs-viewer/docs-viewer.component.ts index 2a7e41043901..a8537908cf51 100644 --- a/adev/shared-docs/components/viewers/docs-viewer/docs-viewer.component.ts +++ b/adev/shared-docs/components/viewers/docs-viewer/docs-viewer.component.ts @@ -343,7 +343,12 @@ export class DocViewer implements OnChanges { relativeUrl = hrefAttr; } - handleHrefClickEventWithRouter(e, this.router, relativeUrl); + // Unless this is a link to an element within the same page, use the Angular router. + // https://github.com/angular/angular/issues/30139 + const scrollToElementExists = relativeUrl.startsWith(this.location.path() + '#'); + if (!scrollToElementExists) { + handleHrefClickEventWithRouter(e, this.router, relativeUrl); + } }); }); } diff --git a/adev/shared-docs/pipeline/api-gen/rendering/styling/css-classes.ts b/adev/shared-docs/pipeline/api-gen/rendering/styling/css-classes.ts index 09a63768f6cb..5bb2a5942ddf 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/styling/css-classes.ts +++ b/adev/shared-docs/pipeline/api-gen/rendering/styling/css-classes.ts @@ -8,13 +8,13 @@ // TODO(jelbourn): all of these CSS classes should use the `docs-` prefix. +export const API_REFERENCE_CONTAINER = 'docs-api'; + export const PARAM_KEYWORD_CLASS_NAME = 'docs-param-keyword'; export const PARAM_GROUP_CLASS_NAME = 'docs-param-group'; -export const REFERENCE_HEADER = 'docs-reference-header'; export const REFERENCE_MEMBERS = 'docs-reference-members'; export const REFERENCE_DEPRECATED = 'docs-reference-deprecated'; -export const REFERENCE_MEMBERS_CONTAINER = 'docs-reference-members-container'; export const REFERENCE_MEMBER_CARD = 'docs-reference-member-card'; export const REFERENCE_MEMBER_CARD_HEADER = 'docs-reference-card-header'; export const REFERENCE_MEMBER_CARD_BODY = 'docs-reference-card-body'; @@ -24,3 +24,6 @@ export const HEADER_CLASS_NAME = 'docs-reference-header'; export const HEADER_ENTRY_CATEGORY = 'docs-reference-category'; export const HEADER_ENTRY_TITLE = 'docs-reference-title'; export const HEADER_ENTRY_LABEL = 'docs-api-item-label'; + +export const SECTION_CONTAINER = 'docs-reference-section'; +export const SECTION_HEADING = 'docs-reference-section-heading'; diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/class-member.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/class-member.tsx index 48d971379265..5635f56cb0ab 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/templates/class-member.tsx +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/class-member.tsx @@ -13,7 +13,7 @@ import { isPropertyEntry, isSetterEntry, } from '../entities/categorization'; -import {MemberEntryRenderable} from '../entities/renderables'; +import {MemberEntryRenderable, MethodEntryRenderable} from '../entities/renderables'; import { REFERENCE_MEMBER_CARD, REFERENCE_MEMBER_CARD_BODY, @@ -27,20 +27,24 @@ import {getFunctionMetadataRenderable} from '../transforms/function-transforms'; import {CodeSymbol} from './code-symbols'; export function ClassMember(props: {member: MemberEntryRenderable}) { + const member = props.member; + + const renderMethod = (method: MethodEntryRenderable) => { + const signature = method.signatures.length ? method.signatures : [method.implementation]; + return signature.map((sig) => { + const renderableMember = getFunctionMetadataRenderable(sig); + return ; + }); + }; + const body = (
- {isClassMethodEntry(props.member) ? ( - (props.member.signatures.length - ? props.member.signatures - : [props.member.implementation] - ).map((sig) => { - const renderableMember = getFunctionMetadataRenderable(sig); - return ; - }) - ) : props.member.htmlDescription || props.member.deprecationMessage ? ( + {isClassMethodEntry(member) ? ( + renderMethod(member) + ) : member.htmlDescription || member.deprecationMessage ? (
- - + +
) : ( <> @@ -48,23 +52,19 @@ export function ClassMember(props: {member: MemberEntryRenderable}) {
); - const memberName = props.member.name; - const returnType = getMemberType(props.member); + const memberName = member.name; + const returnType = getMemberType(member); return ( -
-
-
-

{memberName}

-
- {isClassMethodEntry(props.member) && props.member.signatures.length > 1 ? ( - {props.member.signatures.length} overloads - ) : returnType ? ( - - ) : ( - <> - )} -
-
+
+
+

{memberName}

+ {isClassMethodEntry(member) && member.signatures.length > 1 ? ( + {member.signatures.length} overloads + ) : returnType ? ( + + ) : ( + <> + )}
{body}
diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/class-reference.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/class-reference.tsx index 3723c0fdae08..185348a753e7 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/templates/class-reference.tsx +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/class-reference.tsx @@ -10,26 +10,26 @@ import {Fragment, h} from 'preact'; import {ClassEntryRenderable, DecoratorEntryRenderable} from '../entities/renderables'; import {ClassMemberList} from './class-member-list'; import {HeaderApi} from './header-api'; -import {REFERENCE_MEMBERS_CONTAINER} from '../styling/css-classes'; -import {TabDescription} from './tab-description'; -import {TabUsageNotes} from './tab-usage-notes'; -import {TabApi} from './tab-api'; +import {API_REFERENCE_CONTAINER, REFERENCE_MEMBERS} from '../styling/css-classes'; +import {SectionDescription} from './section-description'; +import {SectionUsageNotes} from './section-usage-notes'; +import {SectionApi} from './section-api'; /** Component to render a class API reference document. */ export function ClassReference(entry: ClassEntryRenderable | DecoratorEntryRenderable) { return ( -
+
- - - + {entry.members.length > 0 ? ( -
+
) : ( <> )} + +
); } diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/cli-card.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/cli-card.tsx index 3212bed0a305..d4cfb69392aa 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/templates/cli-card.tsx +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/cli-card.tsx @@ -9,17 +9,12 @@ import {Fragment, h} from 'preact'; import {CliCardRenderable} from '../entities/renderables'; import {DeprecatedLabel} from './deprecated-label'; -import { REFERENCE_MEMBER_CARD, REFERENCE_MEMBER_CARD_HEADER } from '../styling/css-classes'; +import {REFERENCE_MEMBER_CARD, REFERENCE_MEMBER_CARD_BODY} from '../styling/css-classes'; export function CliCard(props: {card: CliCardRenderable}) { return ( -
-
-
-

{props.card.type}

-
-
-
+
+
{props.card.items.map((item) => (
{item.deprecated ? : <>} diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/cli-reference.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/cli-reference.tsx index 8d6425ef235a..30e7d1c2654e 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/templates/cli-reference.tsx +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/cli-reference.tsx @@ -6,55 +6,74 @@ * found in the LICENSE file at https://angular.dev/license */ -import { Fragment, h } from 'preact'; -import { CliCommandRenderable } from '../entities/renderables'; -import { REFERENCE_MEMBERS, REFERENCE_MEMBERS_CONTAINER } from '../styling/css-classes'; -import { CliCard } from './cli-card'; -import { HeaderCli } from './header-cli'; -import { RawHtml } from './raw-html'; +import {Fragment, h} from 'preact'; +import {CliCommandRenderable} from '../entities/renderables'; +import {REFERENCE_MEMBERS} from '../styling/css-classes'; +import {CliCard} from './cli-card'; +import {HeaderCli} from './header-cli'; +import {RawHtml} from './raw-html'; +import {SectionHeading} from './section-heading'; /** Component to render a CLI command reference document. */ export function CliCommandReference(entry: CliCommandRenderable) { return ( -
+
- {[entry.name, ...entry.aliases].map((command) => + {[entry.name, ...entry.aliases].map((command) => (
               
                 
ng {commandName(entry, command)} - {entry.argumentsLabel ? : <>} - {entry.hasOptions ? : <>} + {entry.argumentsLabel ? ( + + ) : ( + <> + )} + {entry.hasOptions ? ( + + ) : ( + <> + )}
+ ))} + + {entry.subcommands && entry.subcommands?.length > 0 ? ( + <> +

Sub-commands

+

This command has the following sub-commands

+ + + ) : ( + <> )} - - {entry.subcommands && entry.subcommands?.length > 0 ? <> -

Sub-commands

-

This command has the following sub-commands

- - : <>}
-
-
- {entry.cards.map((card) => )} -
+
+ {entry.cards.map((card) => ( + <> + + + + ))}
); } - function commandName(entry: CliCommandRenderable, command: string) { if (entry.parentCommand?.name) { return `${entry.parentCommand?.name} ${command}`; diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/constant-reference.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/constant-reference.tsx index b18e9ec29635..3819c4562b9d 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/templates/constant-reference.tsx +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/constant-reference.tsx @@ -9,18 +9,19 @@ import {h} from 'preact'; import {ConstantEntryRenderable} from '../entities/renderables'; import {HeaderApi} from './header-api'; -import {TabDescription} from './tab-description'; -import {TabUsageNotes} from './tab-usage-notes'; -import {TabApi} from './tab-api'; +import {SectionDescription} from './section-description'; +import {SectionUsageNotes} from './section-usage-notes'; +import {SectionApi} from './section-api'; +import {API_REFERENCE_CONTAINER} from '../styling/css-classes'; /** Component to render a constant API reference document. */ export function ConstantReference(entry: ConstantEntryRenderable) { return ( -
+
- - - + + +
); } diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/docs-reference.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/docs-reference.tsx index 96173978c94d..f226ad1a7aef 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/templates/docs-reference.tsx +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/docs-reference.tsx @@ -9,14 +9,15 @@ import {h} from 'preact'; import {DocEntryRenderable} from '../entities/renderables'; import {HeaderApi} from './header-api'; -import {TabDescription} from './tab-description'; +import {SectionDescription} from './section-description'; +import {API_REFERENCE_CONTAINER} from '../styling/css-classes'; /** Component to render a block or element API reference document. */ export function DocsReference(entry: DocEntryRenderable) { return ( -
+
- +
); } diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/enum-reference.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/enum-reference.tsx index 7772ada9fbeb..6aa74e642d13 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/templates/enum-reference.tsx +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/enum-reference.tsx @@ -9,29 +9,27 @@ import {h, Fragment} from 'preact'; import {EnumEntryRenderable, MemberEntryRenderable} from '../entities/renderables'; import {HeaderApi} from './header-api'; -import {TabDescription} from './tab-description'; -import {TabApi} from './tab-api'; -import {REFERENCE_MEMBERS, REFERENCE_MEMBERS_CONTAINER} from '../styling/css-classes'; +import {SectionDescription} from './section-description'; +import {SectionApi} from './section-api'; +import {API_REFERENCE_CONTAINER, REFERENCE_MEMBERS} from '../styling/css-classes'; import {ClassMember} from './class-member'; /** Component to render a enum API reference document. */ export function EnumReference(entry: EnumEntryRenderable) { return ( -
+
- - - { - entry.members.length > 0 - ? ( -
-
- {entry.members.map((member: MemberEntryRenderable) => ())} -
-
- ) - : (<>) - } + + {entry.members.length > 0 ? ( +
+ {entry.members.map((member: MemberEntryRenderable) => ( + + ))} +
+ ) : ( + <> + )} +
); } diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/function-reference.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/function-reference.tsx index 9c22f7a6b976..b02e13fee765 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/templates/function-reference.tsx +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/function-reference.tsx @@ -6,20 +6,23 @@ * found in the LICENSE file at https://angular.dev/license */ -import {h} from 'preact'; -import {FunctionEntryRenderable, FunctionSignatureMetadataRenderable} from '../entities/renderables'; +import {h, Fragment} from 'preact'; import { + FunctionEntryRenderable, + FunctionSignatureMetadataRenderable, +} from '../entities/renderables'; +import { + API_REFERENCE_CONTAINER, REFERENCE_MEMBERS, - REFERENCE_MEMBERS_CONTAINER, REFERENCE_MEMBER_CARD, REFERENCE_MEMBER_CARD_BODY, REFERENCE_MEMBER_CARD_HEADER, } from '../styling/css-classes'; import {ClassMethodInfo} from './class-method-info'; import {HeaderApi} from './header-api'; -import {TabApi} from './tab-api'; -import {TabDescription} from './tab-description'; -import {TabUsageNotes} from './tab-usage-notes'; +import {SectionApi} from './section-api'; +import {SectionDescription} from './section-description'; +import {SectionUsageNotes} from './section-usage-notes'; import {HighlightTypeScript} from './highlight-ts'; import {printInitializerFunctionSignatureLine} from '../transforms/code-transforms'; import {getFunctionMetadataRenderable} from '../transforms/function-transforms'; @@ -32,8 +35,8 @@ export const signatureCard = ( printSignaturesAsHeader: boolean, ) => { return ( -
-
+
+
{printSignaturesAsHeader ? ( ) : ( -
+ <>

{name}

-
+ )}
@@ -67,25 +70,24 @@ export function FunctionReference(entry: FunctionEntryRenderable) { const printSignaturesAsHeader = entry.signatures.length > 1; return ( -
+
- - - -
-
- {entry.signatures.map((s, i) => - signatureCard( - s.name, - getFunctionMetadataRenderable(s, entry.moduleName), - { - id: `${s.name}_${i}`, - }, - printSignaturesAsHeader, - ), - )} -
+ +
+ {entry.signatures.map((s, i) => + signatureCard( + s.name, + getFunctionMetadataRenderable(s, entry.moduleName), + { + id: `${s.name}_${i}`, + }, + printSignaturesAsHeader, + ), + )}
+ + +
); } diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/initializer-api-function.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/initializer-api-function.tsx index 5657933283c4..bf4ac4e53208 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/templates/initializer-api-function.tsx +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/initializer-api-function.tsx @@ -9,9 +9,9 @@ import {h, JSX} from 'preact'; import {InitializerApiFunctionRenderable} from '../entities/renderables'; import {HeaderApi} from './header-api'; -import {TabApi} from './tab-api'; -import {TabUsageNotes} from './tab-usage-notes'; -import {REFERENCE_MEMBERS, REFERENCE_MEMBERS_CONTAINER} from '../styling/css-classes'; +import {SectionApi} from './section-api'; +import {SectionUsageNotes} from './section-usage-notes'; +import {API_REFERENCE_CONTAINER, REFERENCE_MEMBERS} from '../styling/css-classes'; import {getFunctionMetadataRenderable} from '../transforms/function-transforms'; import {signatureCard} from './function-reference'; @@ -34,42 +34,41 @@ export function InitializerApiFunction(entry: InitializerApiFunctionRenderable) } return ( -
+
- - + -
-
- {entry.callFunction.signatures.map((s, i) => - signatureCard( - s.name, - getFunctionMetadataRenderable(s, entry.moduleName), - { - id: `${s.name}_${i}`, - }, - printSignaturesAsHeader, - ), - )} +
+ {entry.callFunction.signatures.map((s, i) => + signatureCard( + s.name, + getFunctionMetadataRenderable(s, entry.moduleName), + { + id: `${s.name}_${i}`, + }, + printSignaturesAsHeader, + ), + )} - {entry.subFunctions.reduce( - (elements, subFunction) => [ - ...elements, - ...subFunction.signatures.map((s, i) => - signatureCard( - `${entry.name}.${s.name}`, - getFunctionMetadataRenderable(s, entry.moduleName), - { - id: `${entry.name}_${s.name}_${i}`, - }, - printSignaturesAsHeader, - ), + {entry.subFunctions.reduce( + (elements, subFunction) => [ + ...elements, + ...subFunction.signatures.map((s, i) => + signatureCard( + `${entry.name}.${s.name}`, + getFunctionMetadataRenderable(s, entry.moduleName), + { + id: `${entry.name}_${s.name}_${i}`, + }, + printSignaturesAsHeader, ), - ], - [] as JSX.Element[], - )} -
+ ), + ], + [] as JSX.Element[], + )}
+ +
); } diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/section-api.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/section-api.tsx new file mode 100644 index 000000000000..3aebe12eb8c4 --- /dev/null +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/section-api.tsx @@ -0,0 +1,26 @@ +/*! + * @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.dev/license + */ + +import {h} from 'preact'; +import {DocEntryRenderable} from '../entities/renderables'; +import {HasRenderableToc} from '../entities/traits'; +import {CodeTableOfContents} from './code-table-of-contents'; +import {SECTION_CONTAINER} from '../styling/css-classes'; +import {SectionHeading} from './section-heading'; + +const API_SECTION_NAME = 'API'; + +/** Component to render the API section. */ +export function SectionApi(props: {entry: DocEntryRenderable & HasRenderableToc}) { + return ( +
+ + +
+ ); +} diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/tab-description.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/section-description.tsx similarity index 73% rename from adev/shared-docs/pipeline/api-gen/rendering/templates/tab-description.tsx rename to adev/shared-docs/pipeline/api-gen/rendering/templates/section-description.tsx index 4637a6b62fa0..d2d741896ed5 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/templates/tab-description.tsx +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/section-description.tsx @@ -8,14 +8,15 @@ import {Fragment, h} from 'preact'; import {DocEntryRenderable} from '../entities/renderables'; -import {normalizeTabUrl} from '../transforms/url-transforms'; import {RawHtml} from './raw-html'; import {CodeSymbol} from './code-symbols'; +import {SECTION_CONTAINER} from '../styling/css-classes'; +import {SectionHeading} from './section-heading'; -const DESCRIPTION_TAB_NAME = 'Description'; +const DESCRIPTION_SECTION_NAME = 'Description'; -/** Component to render the description tab. */ -export function TabDescription(props: {entry: DocEntryRenderable}) { +/** Component to render the description section. */ +export function SectionDescription(props: {entry: DocEntryRenderable}) { const exportedBy = props.entry.jsdocTags.filter((t) => t.name === 'ngModule'); if ( (!props.entry.htmlDescription || @@ -26,7 +27,8 @@ export function TabDescription(props: {entry: DocEntryRenderable}) { } return ( -
+
+ {exportedBy.length ? ( diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/section-heading.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/section-heading.tsx new file mode 100644 index 000000000000..2984b2a5eb4a --- /dev/null +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/section-heading.tsx @@ -0,0 +1,25 @@ +/*! + * @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.dev/license + */ + +import {h} from 'preact'; +import {convertSectionNameToId} from '../transforms/reference-section-id'; +import {SECTION_HEADING} from '../styling/css-classes'; + +/** Component to render the API section. */ +export function SectionHeading(props: {name: string}) { + const id = convertSectionNameToId(props.name); + const label = 'Link to ' + props.name + ' section'; + + return ( +

+ + {props.name} + +

+ ); +} diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/tab-usage-notes.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/section-usage-notes.tsx similarity index 53% rename from adev/shared-docs/pipeline/api-gen/rendering/templates/tab-usage-notes.tsx rename to adev/shared-docs/pipeline/api-gen/rendering/templates/section-usage-notes.tsx index 56e20007a5f2..b38470ea77a9 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/templates/tab-usage-notes.tsx +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/section-usage-notes.tsx @@ -8,19 +8,21 @@ import {Fragment, h} from 'preact'; import {DocEntryRenderable} from '../entities/renderables'; -import {normalizeTabUrl} from '../transforms/url-transforms'; import {RawHtml} from './raw-html'; +import {SECTION_CONTAINER} from '../styling/css-classes'; +import {SectionHeading} from './section-heading'; -const USAGE_NOTES_TAB_NAME = 'Usage Notes'; +const USAGE_NOTES_SECTION_NAME = 'Usage Notes'; -/** Component to render the usage notes tab. */ -export function TabUsageNotes(props: {entry: DocEntryRenderable}) { +/** Component to render the usage notes section. */ +export function SectionUsageNotes(props: {entry: DocEntryRenderable}) { if (!props.entry.htmlUsageNotes) { - return (<>); + return <>; } return ( -
+
+
); diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/tab-api.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/tab-api.tsx deleted file mode 100644 index 0f99d16b9c8c..000000000000 --- a/adev/shared-docs/pipeline/api-gen/rendering/templates/tab-api.tsx +++ /dev/null @@ -1,26 +0,0 @@ -/*! - * @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.dev/license - */ - -import {h} from 'preact'; -import {DocEntryRenderable} from '../entities/renderables'; -import {HasRenderableToc} from '../entities/traits'; -import {normalizeTabUrl} from '../transforms/url-transforms'; -import {CodeTableOfContents} from './code-table-of-contents'; - -const API_TAB_NAME = 'API'; - -/** Component to render the API tab. */ -export function TabApi(props: {entry: DocEntryRenderable & HasRenderableToc}) { - return ( -
-
- -
-
- ); -} diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/type-alias-reference.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/type-alias-reference.tsx index 47723de1a656..d4a70a3c68bc 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/templates/type-alias-reference.tsx +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/type-alias-reference.tsx @@ -9,18 +9,19 @@ import {h} from 'preact'; import {TypeAliasEntryRenderable} from '../entities/renderables'; import {HeaderApi} from './header-api'; -import {TabDescription} from './tab-description'; -import {TabUsageNotes} from './tab-usage-notes'; -import {TabApi} from './tab-api'; +import {SectionDescription} from './section-description'; +import {SectionUsageNotes} from './section-usage-notes'; +import {SectionApi} from './section-api'; +import {API_REFERENCE_CONTAINER} from '../styling/css-classes'; /** Component to render a type alias API reference document. */ export function TypeAliasReference(entry: TypeAliasEntryRenderable) { return ( -
+
- - - + + +
); } diff --git a/adev/shared-docs/pipeline/api-gen/rendering/transforms/reference-section-id.ts b/adev/shared-docs/pipeline/api-gen/rendering/transforms/reference-section-id.ts new file mode 100644 index 000000000000..fdf0bb3f85ae --- /dev/null +++ b/adev/shared-docs/pipeline/api-gen/rendering/transforms/reference-section-id.ts @@ -0,0 +1,14 @@ +/*! + * @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.dev/license + */ + +export const convertSectionNameToId = (sectionName: string): string => { + return sectionName + .toLowerCase() + .replace(/\s|\//g, '-') // remove spaces and slashes + .replace(/[^0-9a-z\-]/g, ''); // only keep letters, digits & dashes +}; diff --git a/adev/shared-docs/pipeline/api-gen/rendering/transforms/url-transforms.ts b/adev/shared-docs/pipeline/api-gen/rendering/transforms/url-transforms.ts index 4a504bf71fe0..8489636733f7 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/transforms/url-transforms.ts +++ b/adev/shared-docs/pipeline/api-gen/rendering/transforms/url-transforms.ts @@ -19,15 +19,3 @@ export const normalizePath = (path: string): string => { } return path; }; - -export const normalizeTabUrl = (tabName: string): string => { - return tabName - .toLowerCase() - .replace(/(.*?)<\/code>/g, '$1') // remove - .replace(/(.*?)<\/strong>/g, '$1') // remove - .replace(/(.*?)<\/em>/g, '$1') // remove - .replace(/\s|\//g, '-') // remove spaces and slashes - .replace(/gt;|lt;/g, '') // remove escaped < and > - .replace(/&#\d+;/g, '') // remove HTML entities - .replace(/[^0-9a-zA-Z\-]/g, ''); // only keep letters, digits & dashes -}; diff --git a/adev/shared-docs/pipeline/guides/extensions/docs-workflow/docs-step.ts b/adev/shared-docs/pipeline/guides/extensions/docs-workflow/docs-step.ts index 781fe7550df5..36b1fcab6410 100644 --- a/adev/shared-docs/pipeline/guides/extensions/docs-workflow/docs-step.ts +++ b/adev/shared-docs/pipeline/guides/extensions/docs-workflow/docs-step.ts @@ -7,7 +7,7 @@ */ import {Token, Tokens, RendererThis, TokenizerThis} from 'marked'; -import {formatHeading, headingRender} from '../../tranformations/heading'; +import {formatHeading} from '../../tranformations/heading'; interface DocsStepToken extends Tokens.Generic { type: 'docs-step'; diff --git a/adev/shared-docs/services/table-of-contents-loader.service.ts b/adev/shared-docs/services/table-of-contents-loader.service.ts index 40b76424ff6a..281cc1c5c6fa 100644 --- a/adev/shared-docs/services/table-of-contents-loader.service.ts +++ b/adev/shared-docs/services/table-of-contents-loader.service.ts @@ -49,9 +49,7 @@ export class TableOfContentsLoader { const updatedTopValues = new Map(); for (const heading of headings) { - const parentTop = heading.parentElement?.offsetTop ?? 0; - const top = Math.floor(parentTop + heading.offsetTop - this.toleranceThreshold); - updatedTopValues.set(heading.id, top); + updatedTopValues.set(heading.id, this.calculateTop(heading)); } this.tableOfContentItems.update((oldItems) => { diff --git a/adev/shared-docs/styles/_reference.scss b/adev/shared-docs/styles/_reference.scss new file mode 100644 index 000000000000..ca5360bd574e --- /dev/null +++ b/adev/shared-docs/styles/_reference.scss @@ -0,0 +1,410 @@ +@use './anchor' as anchor; + +/* Common styles for the API & CLI references */ +@mixin reference-common() { + .docs-code { + pre { + margin-block: 0; + } + } + + .docs-reference-header { + // deprecated markers beside header + & ~ .docs-deprecated { + margin-block-start: 0.5rem; + } + + & > p { + color: var(--secondary-contrast); + margin-block-start: 0; + margin-block-end: 1.5rem; + } + + .docs-reference-title { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding-block-end: 0; + gap: 0.5rem; + + > div { + margin-block: 0.67em; + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 0.5rem; + + h1 { + margin-block: 0; + } + } + + a { + fill: var(--quinary-contrast); + transition: fill 0.3s ease; + + &:hover { + fill: var(--primary-contrast); + } + } + } + + .docs-reference-category { + color: var(--gray-400); + font-size: 0.875rem; + font-weight: 500; + line-height: 1.4rem; + letter-spacing: -0.00875rem; + } + + .docs-code { + margin-block-end: 1.5rem; + } + } + + .docs-reference-section-heading { + padding-block-start: 3rem; + + a { + @include anchor.docs-anchor(); + color: inherit; + } + } + + .docs-reference-members { + box-sizing: border-box; + width: 100%; + display: flex; + flex-direction: column; + gap: 20px; + + &:not(:first-child) { + margin-top: 1rem; + } + + .docs-reference-member-card { + border: 1px solid var(--senary-contrast); + border-radius: 0.25rem; + position: relative; + transition: border 0.3s ease; + pointer-events: none; + + &::before { + content: ''; + inset: -1px; + position: absolute; + background: transparent; + border-radius: 0.35rem; + z-index: 0; + } + + &:focus { + box-shadow: 10px 4px 40px 0 rgba(0, 0, 0, 0.01); + + &::before { + background: var(--red-to-pink-to-purple-horizontal-gradient); + } + } + + > p { + padding-inline: 1.25rem; + margin-block-end: 0; + } + + a { + pointer-events: initial; + } + + .docs-reference-card-header { + display: flex; + align-items: center; + justify-content: space-between; + border-radius: 0.25rem 0.25rem 0 0; + background-color: var(--octonary-contrast); + position: relative; + z-index: 10; + padding: 0.7rem 1rem; + cursor: pointer; + gap: 0.5rem; + flex-wrap: wrap; + transition: + background-color 0.3s ease, + border 0.3s ease; + + &:focus { + outline: none; + } + + &:has(+ .docs-reference-card-body:empty) { + border-radius: 0.25rem; + } + + code { + font-size: 0.875rem; + + &:has(pre) { + padding: 0; + } + + &:not(pre *) { + padding: 0 0.3rem; + } + } + + pre { + margin: 0; + + /* Do we have a better alternative ? */ + overflow: auto; + } + + h3 { + display: inline-block; + font-family: var(--code-font); + font-size: 1rem; + letter-spacing: -0.025rem; + margin: 0; + } + + span { + font-size: 0.875rem; + } + } + + .docs-reference-card-body { + padding: 0.25rem 1.25rem; + background: var(--septenary-contrast); + transition: background-color 0.3s ease; + color: var(--quaternary-contrast); + border-radius: 0 0 0.25rem 0.25rem; + position: relative; + z-index: 10; + + &:empty { + display: none; + } + + &:first-child { + border-radius: 0.25rem; + } + + hr { + margin-block: 2rem; + } + + .docs-code { + margin-block-end: 1rem; + } + + .docs-deprecation-message { + border-block-end: 1px solid var(--senary-contrast); + + .docs-deprecated { + color: var(--page-background); + background-color: var(--quaternary-contrast); + width: max-content; + border-radius: 0.25rem; + padding: 0.1rem 0.25rem; + margin-block-start: 1rem; + } + } + } + } + } +} + +/* API reference styles */ +@mixin api-reference { + // API section styles + .docs-reference-api-section { + .docs-code { + box-sizing: border-box; + width: 100%; + overflow: hidden; + padding: 0; + + button { + transition: background-color 0.3s ease; + + &.shiki-ln-line-highlighted { + background-color: var(--senary-contrast); + } + + &:hover { + background-color: var(--septenary-contrast); + } + + &:focus { + background-color: var(--senary-contrast); + + span { + background-color: inherit; + } + } + } + + // Hide copy source code button + button[docs-copy-source-code] { + display: none; + } + } + + code { + margin-block: 0; + } + + pre { + white-space: pre; + overflow-x: auto; + margin: 0; + } + } + + // "API member card"-specific styles + .docs-reference-member-card { + .docs-reference-card-item { + // When it's not the only card ... + &:has(~ .docs-reference-card-item) { + border: 1px solid var(--senary-contrast); + margin-block: 1rem; + border-radius: 0.25rem; + padding-inline: 1rem; + } + + // & the last card + &:last-child:not(:first-of-type) { + border: 1px solid var(--senary-contrast); + margin-block: 1rem; + border-radius: 0.25rem; + padding-inline: 1rem; + } + + span { + display: inline-block; + font-size: 0.875rem; + } + + code { + font-size: 0.875rem; + } + + .docs-function-definition:has(*) { + border-block-end: 1px solid var(--senary-contrast); + } + + .docs-param-group { + margin-block-start: 1rem; + + // If it's the only param group... + &:not(:has(~ .docs-param-group)) { + margin-block: 1rem; + } + + .docs-param-name { + color: var(--vivid-pink); + font-family: var(--code-font); + margin-inline-end: 0.25rem; + + &::after { + content: ':'; + } + } + + .docs-parameter-description { + p:first-child { + margin-block-start: 0; + } + } + } + + .docs-param-keyword { + color: var(--primary-contrast); + font-family: var(--code-font); + margin-inline-end: 0.5rem; + } + + .docs-return-type { + padding-block: 1rem; + + // & does not follow a function definition + &:not(.docs-function-definition + .docs-return-type) { + border-block-start: 1px solid var(--senary-contrast); + } + } + } + } +} + +/* CLI reference styles */ +@mixin cli-reference { + // CLI TOC + .docs-reference-cli-toc { + margin-bottom: 1rem; + + .shiki-ln-line-argument, + .shiki-ln-line-option { + padding: 0.1rem 0.2rem 0.2rem; + margin-inline: 0.1rem; + color: var(--quaternary-contrast); + background: transparent; + border-radius: 0.25rem; + position: relative; + transition: + color 0.3s ease, + background 0.3s ease, + border 0.3s ease; + + &:hover { + color: var(--primary-contrast); + background: var(--septenary-contrast); + } + + &.shiki-ln-line-highlighted { + color: var(--primary-contrast); + background: var(--senary-contrast); + } + } + + .shiki-ln-line-argument { + margin-inline-start: 0.2rem; + } + } + + .docs-reference-members { + .docs-reference-section-heading { + margin: 0; + } + + // "CLI member card"-specific styles + .docs-reference-member-card { + .docs-ref-content { + padding: 1rem 0; + + &:not(:first-child) { + border-block-start: 1px solid var(--senary-contrast); + } + + .docs-reference-type-and-default { + width: 4.375rem; + flex-shrink: 0; + + span { + display: block; + font-size: 0.875rem; + margin-block-end: 0.2rem; + white-space: nowrap; + + &:not(:first-child) { + margin-block-start: 1rem; + } + } + + code { + font-size: 0.775rem; + } + } + } + } + } +} diff --git a/adev/src/app/features/references/api-items-section/api-items-section.component.html b/adev/src/app/features/references/api-items-section/api-items-section.component.html index 45c2a24f5b8a..52578f6aecb7 100644 --- a/adev/src/app/features/references/api-items-section/api-items-section.component.html +++ b/adev/src/app/features/references/api-items-section/api-items-section.component.html @@ -29,7 +29,7 @@

{{ apiItem.title }} @if (apiItem.isDeprecated) { - <!> + <!> } } diff --git a/adev/src/app/features/references/api-items-section/api-items-section.component.scss b/adev/src/app/features/references/api-items-section/api-items-section.component.scss index 6790c0c65f4c..a13c428ce45e 100644 --- a/adev/src/app/features/references/api-items-section/api-items-section.component.scss +++ b/adev/src/app/features/references/api-items-section/api-items-section.component.scss @@ -79,7 +79,7 @@ gap: 1em; } -.docs-deprecated { +.adev-deprecated { font-family: var(--code-font); background-color: var(--senary-contrast); color: var(--tertiary-contrast); diff --git a/adev/src/app/features/references/api-items-section/api-items-section.component.spec.ts b/adev/src/app/features/references/api-items-section/api-items-section.component.spec.ts index 7a79182ecfc5..ddb4a9fba95b 100644 --- a/adev/src/app/features/references/api-items-section/api-items-section.component.spec.ts +++ b/adev/src/app/features/references/api-items-section/api-items-section.component.spec.ts @@ -10,7 +10,6 @@ import {ComponentFixture, TestBed} from '@angular/core/testing'; import ApiItemsSection from './api-items-section.component'; import {ApiItemsGroup} from '../interfaces/api-items-group'; -import {ApiReferenceManager} from '../api-reference-list/api-reference-manager.service'; import {ApiItemType} from '../interfaces/api-item-type'; import {provideRouter} from '@angular/router'; import {By} from '@angular/platform-browser'; @@ -60,7 +59,7 @@ describe('ApiItemsSection', () => { fixture.detectChanges(); const deprecatedApiIcons = fixture.debugElement.queryAll( - By.css('.adev-api-items-section-grid li .docs-deprecated'), + By.css('.adev-api-items-section-grid li .adev-deprecated'), ); const deprecatedApiTitle = deprecatedApiIcons[0].parent?.query(By.css('.adev-item-title')); diff --git a/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.html b/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.html index d61fcf0aa8c9..8c5e47f8de6e 100644 --- a/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.html +++ b/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.html @@ -1,30 +1,9 @@ -
- - - - @for (tab of tabs(); track tab.url) { - -
- -
-
- } -
-
- -@if (isApiTabActive()) { +@if (docContent(); as docContent) { - + [docContent]="docContent.contents" + [hasToc]="true" + (contentLoaded)="onContentLoaded()" + /> }
Jump to details
diff --git a/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.scss b/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.scss index a2ac3ac78023..3d475c60b4f1 100644 --- a/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.scss +++ b/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.scss @@ -1,11 +1,23 @@ @use '@angular/docs/styles/media-queries' as mq; +@use '@angular/docs/styles/reference' as ref; :host { - display: flex; - gap: 1rem; + display: block; width: 100%; + max-width: var(--page-width); + padding: var(--layout-padding) 0 1rem var(--layout-padding); box-sizing: border-box; - flex-direction: column; + + @include mq.for-desktop-down { + padding: var(--layout-padding); + max-width: none; + } + + &::-webkit-scrollbar-thumb { + background-color: var(--septenary-contrast); + border-radius: 10px; + transition: background-color 0.3s ease; + } h1 { font-size: 1.5rem; @@ -27,391 +39,7 @@ } } -// stylelint-disable-next-line ::ng-deep { - .adev-header-and-tabs { - padding: var(--layout-padding) 0 1rem var(--layout-padding); - box-sizing: border-box; - width: 100%; - max-width: var(--page-width); - - @include mq.for-desktop-down { - padding: var(--layout-padding); - max-width: none; - } - - &::-webkit-scrollbar-thumb { - background-color: var(--septenary-contrast); - border-radius: 10px; - transition: background-color 0.3s ease; - } - } - - .docs-code { - pre { - margin-block: 0; - } - } - - .docs-reference-header { - > p { - color: var(--secondary-contrast); - margin-block-start: 0; - margin-block-end: 1.5rem; - } - - .docs-code { - margin-block-end: 1.5rem; - } - } - - .adev-reference-tab-body { - margin-block-start: 1.5rem; - docs-viewer > div { - :first-child { - margin-top: 0; - } - } - } - - .docs-reference-api-tab { - display: flex; - gap: 1.81rem; - align-items: flex-start; - margin-bottom: 1px; - - @include mq.for-desktop-down { - flex-direction: column; - } - - & > .docs-code { - box-sizing: border-box; - width: 100%; - overflow: hidden; - padding: 0; - - @include mq.for-desktop-down { - width: 100%; - position: static; - } - - button { - transition: background-color 0.3s ease; - - &.shiki-ln-line-highlighted { - background-color: var(--senary-contrast); - } - &:hover { - background-color: var(--septenary-contrast); - } - &:focus { - background-color: var(--senary-contrast); - } - } - - // Hide copy source code button - button[docs-copy-source-code] { - display: none; - } - } - - code { - margin-block: 0; - } - - pre { - white-space: pre; - overflow-x: auto; - margin: 0; - } - } - - .docs-reference-cli-toc { - margin-bottom: 1rem; - } - - .adev-reference-tab { - min-width: 50ch; - margin-block-start: 2.5rem; - } - - .docs-reference-members-container { - width: 40%; - box-sizing: border-box; - width: 100%; - max-width: var(--page-width); - padding: 0 0 1rem var(--layout-padding); - - @include mq.for-desktop-down { - padding: var(--layout-padding); - padding-top: 0; - max-width: none; - } - } - - // Sidebar - .docs-reference-members { - display: flex; - flex-direction: column; - gap: 20px; - - @include mq.for-desktop-down { - width: 100%; - } - } - - .docs-reference-title { - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: space-between; - padding-block-end: 0; - gap: 0.5rem; - - > div { - margin-block: 0.67em; - display: flex; - flex-wrap: wrap; - align-items: center; - gap: 0.5rem; - - h1 { - margin-block: 0; - } - } - - a { - fill: var(--quinary-contrast); - transition: fill 0.3s ease; - - &:hover { - fill: var(--primary-contrast); - } - } - } - - .adev-reference-labels { - display: flex; - gap: 0.5rem; - } - - .docs-reference-category { - color: var(--gray-400); - font-size: 0.875rem; - font-weight: 500; - line-height: 1.4rem; - letter-spacing: -0.00875rem; - } - - .docs-reference-card-header { - display: flex; - align-items: center; - justify-content: space-between; - gap: 0.5rem; - flex-wrap: wrap; - - padding: 0.7rem 1rem; - - code:not(pre *) { - padding: 0 0.3rem; - } - } - - .docs-reference-member-card { - border: 1px solid var(--senary-contrast); - border-radius: 0.25rem; - position: relative; - transition: border 0.3s ease; - - &::before { - content: ''; - inset: -1px; - position: absolute; - background: transparent; - border-radius: 0.35rem; - z-index: 0; - } - - &:focus { - box-shadow: 10px 4px 40px 0 rgba(0, 0, 0, 0.01); - - &::before { - background: var(--red-to-pink-to-purple-horizontal-gradient); - } - } - - header { - display: flex; - flex-direction: column; - border-radius: 0.25rem 0.25rem 0 0; - background-color: var(--octonary-contrast); - position: relative; - z-index: 10; - cursor: pointer; - transition: - background-color 0.3s ease, - border 0.3s ease; - - & > code { - max-width: 100%; - } - - code:has(pre) { - padding: 0; - } - - pre { - margin: 0; - - /* Do we have a better alternative ? */ - overflow: auto; - } - } - - .docs-reference-card-header { - h3 { - display: inline-block; - font-family: var(--code-font); - font-size: 1rem; - letter-spacing: -0.025rem; - margin: 0; - max-width: 100%; - overflow: hidden; - text-overflow: ellipsis; - } - - code, - span { - font-size: 0.875rem; - } - } - - > p { - padding-inline: 1.25rem; - margin-block-end: 0; - } - } - - .docs-reference-card-body { - padding: 0.25rem 1.25rem; - background: var(--septenary-contrast); - transition: background-color 0.3s ease; - color: var(--quaternary-contrast); - border-radius: 0 0 0.25rem 0.25rem; - position: relative; - z-index: 10; - hr { - margin-block: 2rem; - } - .docs-code { - margin-block-end: 1rem; - } - - &:empty { - display: none; - } - } - - // when it's not the only card... - .docs-reference-card-item:has(~ .docs-reference-card-item) { - border: 1px solid var(--senary-contrast); - margin-block: 1rem; - border-radius: 0.25rem; - padding-inline: 1rem; - } - // & the last card - .docs-reference-card-item:last-child { - &:not(:first-of-type) { - border: 1px solid var(--senary-contrast); - margin-block: 1rem; - border-radius: 0.25rem; - padding-inline: 1rem; - } - } - - .docs-reference-card-item { - span { - display: inline-block; - font-size: 0.875rem; - } - code { - font-size: 0.875rem; - } - } - - .docs-function-definition { - &:has(*) { - border-block-end: 1px solid var(--senary-contrast); - } - } - - .docs-deprecation-message { - border-block-end: 1px solid var(--senary-contrast); - } - - .docs-param-group { - margin-block-start: 1rem; - } - - // If it's the only param group... - .docs-param-group:not(:has(~ .docs-param-group)) { - margin-block: 1rem; - } - - .docs-return-type { - padding-block: 1rem; - - // & does not follow a function definition - &:not(.docs-function-definition + .docs-return-type) { - border-block-start: 1px solid var(--senary-contrast); - } - } - - .docs-param-keyword { - color: var(--primary-contrast); - font-family: var(--code-font); - margin-inline-end: 0.5rem; - } - - .docs-param-name { - color: var(--vivid-pink); - font-family: var(--code-font); - margin-inline-end: 0.25rem; - &::after { - content: ':'; - } - } - - .docs-deprecated { - color: var(--page-background); - background-color: var(--quaternary-contrast); - width: max-content; - border-radius: 0.25rem; - padding: 0.1rem 0.25rem; - margin-block-start: 1rem; - } - - // deprecated markers beside header - .docs-reference-header ~ .docs-deprecated { - margin-block-start: 0.5rem; - } - - .docs-parameter-description { - p:first-child { - margin-block-start: 0; - } - } - - .docs-ref-content { - padding: 1rem 0; - - &:not(:first-child) { - border-block-start: 1px solid var(--senary-contrast); - } - - .docs-param-keyword { - display: block; - margin: 0 0 0.5rem 0; - } - } + @include ref.reference-common(); + @include ref.api-reference(); } diff --git a/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.spec.ts b/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.spec.ts index 7bc5a6a40bc3..18c9830c022e 100644 --- a/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.spec.ts +++ b/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.spec.ts @@ -6,37 +6,29 @@ * found in the LICENSE file at https://angular.dev/license */ -import {HarnessLoader} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {TestBed} from '@angular/core/testing'; -import {MatTabGroupHarness} from '@angular/material/tabs/testing'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; import {provideNoopAnimations} from '@angular/platform-browser/animations'; import {ReferenceScrollHandler} from '../services/reference-scroll-handler.service'; -import {signal} from '@angular/core'; import {provideRouter, withComponentInputBinding} from '@angular/router'; import {RouterTestingHarness} from '@angular/router/testing'; import ApiReferenceDetailsPage from './api-reference-details-page.component'; -import {By} from '@angular/platform-browser'; describe('ApiReferenceDetailsPage', () => { let component: ApiReferenceDetailsPage; - let loader: HarnessLoader; - let harness: RouterTestingHarness; + let fixture: ComponentFixture; let fakeApiReferenceScrollHandler = { setupListeners: () => {}, - membersMarginTopInPx: signal(10), - updateMembersMarginTop: () => {}, }; - const SAMPLE_CONTENT_WITH_TABS = `
-
-
-
-
-
-
`; + const SAMPLE_CONTENT_WITH_SECTIONS = `
+
API
+
+
Description
+
Examples
+
Usage Notes
+
`; beforeEach(async () => { TestBed.configureTestingModule({ @@ -51,7 +43,7 @@ describe('ApiReferenceDetailsPage', () => { data: { 'docContent': { id: 'id', - contents: SAMPLE_CONTENT_WITH_TABS, + contents: SAMPLE_CONTENT_WITH_SECTIONS, }, }, }, @@ -61,10 +53,9 @@ describe('ApiReferenceDetailsPage', () => { ], }); TestBed.overrideProvider(ReferenceScrollHandler, {useValue: fakeApiReferenceScrollHandler}); - harness = await RouterTestingHarness.create(); - const {fixture} = harness; + const harness = await RouterTestingHarness.create(); + fixture = harness.fixture; component = await harness.navigateByUrl('/', ApiReferenceDetailsPage); - loader = TestbedHarnessEnvironment.loader(fixture); fixture.detectChanges(); }); @@ -72,39 +63,10 @@ describe('ApiReferenceDetailsPage', () => { expect(component).toBeTruthy(); }); - it('should render tabs for all elements with tab attribute', async () => { - const matTabGroup = await loader.getHarness(MatTabGroupHarness); + it('should load the doc content', () => { + expect(component.docContent()?.contents).toBeTruthy(); - const tabs = await matTabGroup.getTabs(); - - expect(tabs.length).toBe(4); - }); - - it('should display members cards when API tab is active', async () => { - const matTabGroup = await loader.getHarness(MatTabGroupHarness); - const tabs = await matTabGroup.getTabs(); - - let membersCard = harness.fixture.debugElement.query( - By.css('.docs-reference-members-container'), - ); - expect(membersCard).toBeTruthy(); - - await matTabGroup.selectTab({label: await tabs[1].getLabel()}); - - membersCard = harness.fixture.debugElement.query(By.css('.docs-reference-members-container')); - expect(membersCard).toBeFalsy(); - - await matTabGroup.selectTab({label: await tabs[0].getLabel()}); - - membersCard = harness.fixture.debugElement.query(By.css('.docs-reference-members-container')); - expect(membersCard).toBeTruthy(); - }); - - it('should setup scroll listeners when API members are loaded', () => { - const setupListenersSpy = spyOn(fakeApiReferenceScrollHandler, 'setupListeners'); - - component.membersCardsLoaded(); - - expect(setupListenersSpy).toHaveBeenCalled(); + const docsViewer = fixture.nativeElement.querySelector('docs-viewer'); + expect(docsViewer).toBeTruthy(); }); }); diff --git a/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.ts b/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.ts index 6cd36d3d1a1f..e37635f62904 100644 --- a/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.ts +++ b/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.ts @@ -6,103 +6,50 @@ * found in the LICENSE file at https://angular.dev/license */ -import {ChangeDetectionStrategy, Component, inject, input, computed} from '@angular/core'; -import {DOCUMENT} from '@angular/common'; -import {MatTabsModule} from '@angular/material/tabs'; +import {ChangeDetectionStrategy, Component, inject, input} from '@angular/core'; import {DocContent, DocViewer} from '@angular/docs'; -import {ActivatedRoute, Router} from '@angular/router'; -import {ApiItemType} from './../interfaces/api-item-type'; +import {ActivatedRoute} from '@angular/router'; +import {DOCUMENT} from '@angular/common'; import {ReferenceScrollHandler} from '../services/reference-scroll-handler.service'; -import { - API_REFERENCE_DETAILS_PAGE_HEADER_CLASS_NAME, - API_REFERENCE_DETAILS_PAGE_MEMBERS_CLASS_NAME, - API_REFERENCE_TAB_ATTRIBUTE, - API_REFERENCE_TAB_API_LABEL, - API_TAB_CLASS_NAME, - API_REFERENCE_TAB_URL_ATTRIBUTE, -} from '../constants/api-reference-prerender.constants'; +import {API_SECTION_CLASS_NAME} from '../constants/api-reference-prerender.constants'; @Component({ selector: 'adev-reference-page', - imports: [DocViewer, MatTabsModule], + standalone: true, + imports: [DocViewer], templateUrl: './api-reference-details-page.component.html', styleUrls: ['./api-reference-details-page.component.scss'], providers: [ReferenceScrollHandler], changeDetection: ChangeDetectionStrategy.OnPush, }) export default class ApiReferenceDetailsPage { - private readonly activatedRoute = inject(ActivatedRoute); + private readonly referenceScrollHandler = inject(ReferenceScrollHandler); + private readonly route = inject(ActivatedRoute); private readonly document = inject(DOCUMENT); - private readonly router = inject(Router); - private readonly scrollHandler = inject(ReferenceScrollHandler); docContent = input(); - tab = input(); - - // aliases - ApiItemType = ApiItemType; - - // computed state - parsedDocContent = computed(() => { - // TODO: pull this logic outside of a computed where it can be tested etc. - const docContent = this.docContent(); - - if (docContent === undefined) { - return { - header: undefined, - members: undefined, - tabs: [], - }; - } - - const element = this.document.createElement('div'); - element.innerHTML = docContent.contents; - - // Get the innerHTML of the header element from received document. - const header = element.querySelector(API_REFERENCE_DETAILS_PAGE_HEADER_CLASS_NAME); - // Get the innerHTML of the card elements from received document. - const members = element.querySelector(API_REFERENCE_DETAILS_PAGE_MEMBERS_CLASS_NAME); - // Get the tab elements from received document. - // We're expecting that tab element will contain `tab` attribute. - const tabs = Array.from(element.querySelectorAll(`[${API_REFERENCE_TAB_ATTRIBUTE}]`)).map( - (tab) => ({ - url: tab.getAttribute(API_REFERENCE_TAB_URL_ATTRIBUTE)!, - title: tab.getAttribute(API_REFERENCE_TAB_ATTRIBUTE)!, - content: tab.innerHTML, - }), - ); - - element.remove(); - - return { - header: header?.innerHTML, - members: members?.innerHTML, - tabs, - }; - }); - - tabs = () => this.parsedDocContent().tabs; - - selectedTabIndex = computed(() => { - const existingTabIdx = this.tabs().findIndex((tab) => tab.url === this.tab()); - return Math.max(existingTabIdx, 0); - }); - - isApiTabActive = computed(() => { - const activeTabTitle = this.tabs()[this.selectedTabIndex()]?.title; - return activeTabTitle === API_REFERENCE_TAB_API_LABEL || activeTabTitle === 'CLI'; - }); - - membersCardsLoaded(): void { - this.scrollHandler.setupListeners(API_TAB_CLASS_NAME); + onContentLoaded() { + this.referenceScrollHandler.setupListeners(API_SECTION_CLASS_NAME); + this.scrollToSectionLegacy(); } - tabChange(tabIndex: number) { - this.router.navigate([], { - relativeTo: this.activatedRoute, - queryParams: {tab: this.tabs()[tabIndex].url}, - queryParamsHandling: 'merge', - }); + /** Handle legacy URLs with a `tab` query param from the old tab layout */ + private scrollToSectionLegacy() { + const params = this.route.snapshot.queryParams; + const tab = params['tab'] as string | undefined; + + if (tab) { + const section = this.document.getElementById(tab); + + if (section) { + // `scrollIntoView` is ignored even, if the element exists. + // It seems that it's related to: https://issues.chromium.org/issues/40715316 + // Hence, the usage of `setTimeout`. + setTimeout(() => { + section.scrollIntoView({behavior: 'smooth'}); + }, 100); + } + } } } diff --git a/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.html b/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.html index 4345ce9f1e8e..b9ba87546e1d 100644 --- a/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.html +++ b/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.html @@ -1,11 +1,5 @@ -
- -
- - +@if (docContent(); as docContent) { + +}
Jump to details
diff --git a/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.scss b/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.scss index e1d1fcc38e8d..9d356ce0c804 100644 --- a/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.scss +++ b/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.scss @@ -1,123 +1,21 @@ @use '@angular/docs/styles/media-queries' as mq; -// Note: cli-reference-details-page is receiving page styles -// from api-reference-details-page.component.scss +@use '@angular/docs/styles/reference' as ref; -// stylelint-disable-next-line -::ng-deep { - .adev-ref-content { - display: flex; - padding-block: 1rem; - gap: 1rem; - &:not(:last-of-type) { - border-block-end: 1px solid var(--senary-contrast); - } - } - - .adev-header-and-tabs { - &.adev-cli-content { - width: 100%; - max-width: var(--page-width); - - @include mq.for-desktop-down { - max-width: none; - } - } - } - - .adev-cli-members-container { - padding: 0 0 var(--layout-padding) var(--layout-padding); - padding-bottom: 1rem; - box-sizing: border-box; - max-width: var(--page-width); - - @include mq.for-desktop-down { - width: 100%; - padding: var(--layout-padding); - padding-top: 0; - max-width: none; - } - } - - .adev-ref-option-and-description { - flex-grow: 1; - max-width: calc(100% - 80px); - p { - margin-block-end: 0; - } - } - - .docs-reference-type-and-default { - width: 4.375rem; - flex-shrink: 0; - span { - display: block; - font-size: 0.875rem; - margin-block-end: 0.2rem; - white-space: nowrap; - - &:not(:first-child) { - margin-block-start: 1rem; - } - } +:host { + display: block; + width: 100%; + max-width: var(--page-width); + padding: var(--layout-padding) 0 1rem var(--layout-padding); + box-sizing: border-box; - code { - font-size: 0.775rem; - } + @include mq.for-desktop-down { + padding: var(--layout-padding); + max-width: none; } +} - .adev-reference-cli-toc { - border: 1px solid var(--senary-contrast); - border-radius: 0.3rem; - position: relative; - transition: border 0.3s ease; - - &::before { - content: ''; - inset: -1px; - position: absolute; - background: transparent; - border-radius: 0.35rem; - z-index: 0; - } - - &:has(.shiki-ln-line-highlighted) { - &::before { - background: var(--red-to-pink-to-purple-horizontal-gradient); - } - } - - pre { - border-radius: 0.25rem; - position: relative; - z-index: 100; - background: var(--octonary-contrast); - } - } - - .shiki-ln-line-argument, - .shiki-ln-line-option { - padding: 0.1rem 0.2rem 0.2rem; - margin-inline: 0.1rem; - color: var(--quaternary-contrast); - background: transparent; - border-radius: 0.25rem; - position: relative; - transition: - color 0.3s ease, - background 0.3s ease, - border 0.3s ease; - - &:hover { - color: var(--primary-contrast); - background: var(--septenary-contrast); - } - - &.shiki-ln-line-highlighted { - color: var(--primary-contrast); - background: var(--senary-contrast); - } - } - .shiki-ln-line-argument { - margin-inline-start: 0.2rem; - } +// stylelint-disable-next-line +::ng-deep { + @include ref.reference-common(); + @include ref.cli-reference(); } diff --git a/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.spec.ts b/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.spec.ts index a0e7a100511f..fc7e14c94384 100644 --- a/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.spec.ts +++ b/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.spec.ts @@ -6,23 +6,20 @@ * found in the LICENSE file at https://angular.dev/license */ -import {TestBed} from '@angular/core/testing'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; import CliReferenceDetailsPage from './cli-reference-details-page.component'; -import {RouterTestingHarness, RouterTestingModule} from '@angular/router/testing'; -import {signal} from '@angular/core'; +import {RouterTestingHarness} from '@angular/router/testing'; import {ReferenceScrollHandler} from '../services/reference-scroll-handler.service'; -import {provideRouter} from '@angular/router'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; +import {provideRouter, withComponentInputBinding} from '@angular/router'; +import {provideNoopAnimations} from '@angular/platform-browser/animations'; describe('CliReferenceDetailsPage', () => { let component: CliReferenceDetailsPage; - let harness: RouterTestingHarness; + let fixture: ComponentFixture; let fakeApiReferenceScrollHandler = { setupListeners: () => {}, - membersMarginTopInPx: signal(0), - updateMembersMarginTop: () => {}, }; const SAMPLE_CONTENT = ` @@ -34,33 +31,42 @@ describe('CliReferenceDetailsPage', () => { beforeEach(async () => { TestBed.configureTestingModule({ - imports: [CliReferenceDetailsPage, RouterTestingModule], + imports: [CliReferenceDetailsPage], providers: [ - provideRouter([ - { - path: '**', - component: CliReferenceDetailsPage, - data: { - 'docContent': { - id: 'id', - contents: SAMPLE_CONTENT, + provideNoopAnimations(), + provideRouter( + [ + { + path: '**', + component: CliReferenceDetailsPage, + data: { + 'docContent': { + id: 'id', + contents: SAMPLE_CONTENT, + }, }, }, - }, - ]), + ], + withComponentInputBinding(), + ), ], }); TestBed.overrideProvider(ReferenceScrollHandler, {useValue: fakeApiReferenceScrollHandler}); - harness = await RouterTestingHarness.create(); - const {fixture} = harness; + const harness = await RouterTestingHarness.create(); + fixture = harness.fixture; component = await harness.navigateByUrl('/', CliReferenceDetailsPage); - TestbedHarnessEnvironment.loader(fixture); fixture.detectChanges(); }); - it('should set content on init', () => { - expect(component.mainContentInnerHtml()).toBe('First column content'); - expect(component.cardsInnerHtml()).toBe('Members content'); + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should load the doc content', () => { + expect(component.docContent()?.contents).toBeTruthy(); + + const docsViewer = fixture.nativeElement.querySelector('docs-viewer'); + expect(docsViewer).toBeTruthy(); }); }); diff --git a/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.ts b/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.ts index 75414c361643..ebbadfe7b361 100644 --- a/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.ts +++ b/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.ts @@ -6,81 +6,16 @@ * found in the LICENSE file at https://angular.dev/license */ -import {DOCUMENT} from '@angular/common'; -import { - ChangeDetectionStrategy, - Component, - DestroyRef, - OnInit, - inject, - signal, -} from '@angular/core'; -import {takeUntilDestroyed} from '@angular/core/rxjs-interop'; +import {ChangeDetectionStrategy, Component, input} from '@angular/core'; import {DocContent, DocViewer} from '@angular/docs'; -import {ActivatedRoute} from '@angular/router'; -import {map} from 'rxjs/operators'; -import {ReferenceScrollHandler} from '../services/reference-scroll-handler.service'; -import {API_REFERENCE_DETAILS_PAGE_MEMBERS_CLASS_NAME} from '../constants/api-reference-prerender.constants'; - -export const CLI_MAIN_CONTENT_SELECTOR = '.docs-reference-cli-content'; -export const CLI_TOC = '.adev-reference-cli-toc'; @Component({ selector: 'adev-cli-reference-page', imports: [DocViewer], templateUrl: './cli-reference-details-page.component.html', - styleUrls: [ - './cli-reference-details-page.component.scss', - '../api-reference-details-page/api-reference-details-page.component.scss', - ], - providers: [ReferenceScrollHandler], + styleUrls: ['./cli-reference-details-page.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) -export default class CliReferenceDetailsPage implements OnInit { - private readonly activatedRoute = inject(ActivatedRoute); - private readonly destroyRef = inject(DestroyRef); - private readonly document = inject(DOCUMENT); - private readonly scrollHandler = inject(ReferenceScrollHandler); - - cardsInnerHtml = signal(''); - mainContentInnerHtml = signal(''); - - ngOnInit(): void { - this.setPageContent(); - } - - contentLoaded(): void { - this.scrollHandler.setupListeners(CLI_TOC); - } - - // Fetch the content for CLI Reference page based on the active route. - private setPageContent(): void { - this.activatedRoute.data - .pipe( - map((data) => data['docContent']), - takeUntilDestroyed(this.destroyRef), - ) - .subscribe((doc: DocContent | undefined) => { - this.setContentForPageSections(doc); - }); - } - - private setContentForPageSections(doc: DocContent | undefined) { - const element = this.document.createElement('div'); - element.innerHTML = doc?.contents!; - - // Get the innerHTML of the main content from received document. - const mainContent = element.querySelector(CLI_MAIN_CONTENT_SELECTOR); - if (mainContent) { - this.mainContentInnerHtml.set(mainContent.innerHTML); - } - - // Get the innerHTML of the cards from received document. - const cards = element.querySelector(API_REFERENCE_DETAILS_PAGE_MEMBERS_CLASS_NAME); - if (cards) { - this.cardsInnerHtml.set(cards.innerHTML); - } - - element.remove(); - } +export default class CliReferenceDetailsPage { + docContent = input(); } diff --git a/adev/src/app/features/references/constants/api-reference-prerender.constants.ts b/adev/src/app/features/references/constants/api-reference-prerender.constants.ts index f0a9dd731e2b..84cc97814b90 100644 --- a/adev/src/app/features/references/constants/api-reference-prerender.constants.ts +++ b/adev/src/app/features/references/constants/api-reference-prerender.constants.ts @@ -6,10 +6,5 @@ * found in the LICENSE file at https://angular.dev/license */ -export const API_REFERENCE_DETAILS_PAGE_HEADER_CLASS_NAME = '.docs-reference-header'; -export const API_REFERENCE_DETAILS_PAGE_MEMBERS_CLASS_NAME = '.docs-reference-members-container'; -export const API_REFERENCE_TAB_ATTRIBUTE = 'data-tab'; -export const API_REFERENCE_TAB_URL_ATTRIBUTE = 'data-tab-url'; -export const API_REFERENCE_TAB_API_LABEL = 'API'; -export const API_TAB_CLASS_NAME = '.docs-reference-api-tab'; +export const API_SECTION_CLASS_NAME = 'docs-reference-api-section'; export const MEMBER_ID_ATTRIBUTE = 'member-id'; diff --git a/adev/src/app/features/references/services/reference-scroll-handler.service.ts b/adev/src/app/features/references/services/reference-scroll-handler.service.ts index b479de08d433..f8df1204726e 100644 --- a/adev/src/app/features/references/services/reference-scroll-handler.service.ts +++ b/adev/src/app/features/references/services/reference-scroll-handler.service.ts @@ -7,55 +7,29 @@ */ import {DOCUMENT, isPlatformBrowser} from '@angular/common'; -import {DestroyRef, Injectable, Injector, PLATFORM_ID, inject} from '@angular/core'; +import {DestroyRef, Injectable, PLATFORM_ID, inject} from '@angular/core'; import {takeUntilDestroyed} from '@angular/core/rxjs-interop'; import {fromEvent} from 'rxjs'; import {MEMBER_ID_ATTRIBUTE} from '../constants/api-reference-prerender.constants'; -import {WINDOW} from '@angular/docs'; import {Router} from '@angular/router'; -import {AppScroller} from '../../../app-scroller'; - -// Adds some space/margin between the top of the target element and the top of viewport. -const SCROLL_MARGIN_TOP = 100; @Injectable() export class ReferenceScrollHandler { private readonly destroyRef = inject(DestroyRef); private readonly document = inject(DOCUMENT); - private readonly injector = inject(Injector); - private readonly window = inject(WINDOW); private readonly router = inject(Router); - private readonly appScroller = inject(AppScroller); private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID)); - setupListeners(tocSelector: string): void { + setupListeners(tocClass: string): void { if (!this.isBrowser) { return; } - this.setupCodeToCListeners(tocSelector); - this.setupFragmentChangeListener(); - } - - private setupFragmentChangeListener() { - this.router.routerState.root.fragment - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe((fragment) => { - // If there is no fragment or the scroll event has a position (traversing through history), - // allow the scroller to handle scrolling instead of going to the fragment - if (!fragment || this.appScroller.lastScrollEvent?.position) { - this.appScroller.scroll(this.injector); - return; - } - - const card = this.document.getElementById(fragment) as HTMLDivElement | null; - card?.focus(); - this.scrollToCard(card); - }); + this.setupCodeToCListeners(tocClass); } - private setupCodeToCListeners(tocSelector: string): void { - const tocContainer = this.document.querySelector(tocSelector); + private setupCodeToCListeners(tocClass: string): void { + const tocContainer = this.document.querySelector(`.${tocClass}`); if (!tocContainer) { return; @@ -82,21 +56,6 @@ export class ReferenceScrollHandler { }); } - private scrollToCard(card: HTMLDivElement | null): void { - if (!card) { - return; - } - - if (card !== document.activeElement) { - (document.activeElement).blur(); - } - - this.window.scrollTo({ - top: card!.offsetTop - SCROLL_MARGIN_TOP, - behavior: 'smooth', - }); - } - private getMemberId(lineButton: HTMLButtonElement | null): string | undefined { if (!lineButton) { return undefined; From bb946d71edad32898c2f3e78f001792b6f795421 Mon Sep 17 00:00:00 2001 From: rysavy-dudrtools <94609807+rysavy-dudrtools@users.noreply.github.com> Date: Thu, 13 Feb 2025 12:26:47 +0100 Subject: [PATCH 0052/1000] docs(localize): added link to add-package.md (#59937) PR Close #59937 --- adev/src/content/guide/i18n/add-package.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/adev/src/content/guide/i18n/add-package.md b/adev/src/content/guide/i18n/add-package.md index f26fffd6984b..325c565b4aa5 100644 --- a/adev/src/content/guide/i18n/add-package.md +++ b/adev/src/content/guide/i18n/add-package.md @@ -6,9 +6,10 @@ To add the `@angular/localize` package, use the following command to update the -It adds `types: ["@angular/localize"]` in the TypeScript configuration files as well as the reference to the type definition of `@angular/localize` at the top of the `main.ts` file. +It adds `types: ["@angular/localize"]` in the TypeScript configuration files. +It also adds line `/// ` at the top of the `main.ts` file which is the reference to the type definition. -HELPFUL: For more information about `package.json` and `tsconfig.json` files, see [Workspace npm dependencies][GuideNpmPackages] and [TypeScript Configuration][GuideTsConfig]. +HELPFUL: For more information about `package.json` and `tsconfig.json` files, see [Workspace npm dependencies][GuideNpmPackages] and [TypeScript Configuration][GuideTsConfig]. To learn about Triple-slash Directives visit [Typescript Handbook](https://www.typescriptlang.org/docs/handbook/triple-slash-directives.html#-reference-types-). If `@angular/localize` is not installed and you try to build a localized version of your project (for example, while using the `i18n` attributes in templates), the [Angular CLI][CliMain] will generate an error, which would contain the steps that you can take to enable i18n for your project. From ae6dc71495b0950cb0e23f9f8548fae19866345e Mon Sep 17 00:00:00 2001 From: Doug Parker Date: Tue, 28 Jan 2025 11:49:53 -0800 Subject: [PATCH 0053/1000] docs: link to Tailwind docs about Angular CLI integration (#59765) We should probably have our own authoritative documentation here, but Tailwind's doc is pretty decent, so this is a good starting point. PR Close #59765 --- adev/src/content/tools/cli/build.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/adev/src/content/tools/cli/build.md b/adev/src/content/tools/cli/build.md index fdc0469c5564..f6f2140eb19f 100644 --- a/adev/src/content/tools/cli/build.md +++ b/adev/src/content/tools/cli/build.md @@ -153,3 +153,9 @@ Avoid expanding this list to more browsers. Even if your application code more b You should only ever _reduce_ the set of browsers or versions in this list. HELPFUL: Use [browsersl.ist](https://browsersl.ist) to display compatible browsers for a `browserslist` query. + +## Configuring Tailwind + +Angular supports [Tailwind](https://tailwindcss.com/), a utility-first CSS framework. + +Follow the [Tailwind documentation](https://tailwindcss.com/docs/installation/framework-guides/angular) for integrating with Angular CLI. From 9f092142d98f6d0a61d04cc5abf644c0111d0103 Mon Sep 17 00:00:00 2001 From: hawkgs Date: Wed, 18 Dec 2024 14:46:36 +0200 Subject: [PATCH 0054/1000] docs(docs-infra): replace the WebGL home page animation with a CSS+JS version of it (#59865) 1. The WebGL animation on the home page is completely removed. 2. A new animation processor/player is implemented and added to `adev` web app. 3. A new CSS+JS-based animation substitutes the existing WebGL one. PR Close #59865 --- adev/BUILD.bazel | 9 +- .../src/app/features/home/animation/README.md | 160 +++++ .../animation/animation-creator.service.ts | 31 + .../animation/animation-layer.directive.ts | 21 + .../features/home/animation/animation.spec.ts | 417 +++++++++++++ .../app/features/home/animation/animation.ts | 507 ++++++++++++++++ .../calculations/calc-css-value.spec.ts | 266 +++++++++ .../animation/calculations/calc-css-value.ts | 122 ++++ .../calculations/index.ts} | 4 +- adev/src/app/features/home/animation/index.ts | 12 + .../animation/parser/css-value-lexer.spec.ts | 101 ++++ .../home/animation/parser/css-value-lexer.ts | 125 ++++ .../animation/parser/css-value-parser.spec.ts | 286 +++++++++ .../home/animation/parser/css-value-parser.ts | 216 +++++++ .../parser/index.ts} | 12 +- .../features/home/animation/parser/types.ts | 31 + .../home/animation/parser/utils.spec.ts | 128 ++++ .../features/home/animation/parser/utils.ts | 48 ++ .../plugins/animation-player.component.ts | 123 ++++ .../animation/plugins/animation-player.ts | 40 ++ .../plugins/animation-scroll-handler.ts | 88 +++ .../features/home/animation/plugins/types.ts | 21 + adev/src/app/features/home/animation/types.ts | 58 ++ .../app/features/home/components/canvas.ts | 335 ----------- .../home-animation/animation-definition.ts | 437 ++++++++++++++ .../home-animation.component.html | 142 +++++ .../home-animation.component.scss | 397 +++++++++++++ .../home-animation.component.ts | 178 ++++++ .../home/components/programs/basic-program.ts | 37 -- .../home/components/programs/glyph-program.ts | 43 -- .../components/programs/gradient-program.ts | 41 -- .../components/programs/line-glyph-program.ts | 43 -- .../home/components/programs/logo-program.ts | 38 -- .../home/components/programs/mask-program.ts | 41 -- .../home/components/shaders/basic-shader.ts | 58 -- .../home/components/shaders/glyph-shader.ts | 70 --- .../components/shaders/gradient-shader.ts | 112 ---- .../components/shaders/line-glyph-shader.ts | 108 ---- .../home/components/shaders/logo-shader.ts | 103 ---- .../home/components/shaders/mask-shader.ts | 60 -- .../shaders/modules/msdf/msdf.glsl.ts | 16 - .../modules/sdf-primitives/sd-polygon.glsl.ts | 27 - .../home/components/views/angular-glyph.ts | 89 --- .../home/components/views/angular-logo.ts | 91 --- .../home/components/views/angular-view.ts | 63 -- .../features/home/components/views/angular.ts | 108 ---- .../home/components/views/build-text.ts | 120 ---- .../home/components/views/build-view.ts | 89 --- .../home/components/views/gradient-view.ts | 105 ---- .../home/components/views/gradient.ts | 121 ---- .../home/components/views/line-object.ts | 59 -- .../home/components/views/lines-view.ts | 64 -- .../features/home/components/views/lines.ts | 146 ----- .../features/home/components/views/view.ts | 67 --- .../features/home/home-animation-constants.ts | 33 -- .../src/app/features/home/home.component.html | 153 +---- .../src/app/features/home/home.component.scss | 378 +----------- adev/src/app/features/home/home.component.ts | 127 +--- .../home/services/home-animation.service.ts | 553 ------------------ adev/src/app/features/home/utils/ogl.ts | 21 - adev/src/assets/textures/BUILD.bazel | 13 - .../assets/textures/build-for-everyone.svg | 3 - adev/src/assets/textures/build-msdf.png | Bin 11932 -> 0 bytes adev/src/assets/textures/build-render.png | Bin 3116 -> 0 bytes adev/src/assets/textures/gradient.jpg | Bin 13972 -> 0 bytes adev/src/assets/textures/line-msdf.png | Bin 1971 -> 0 bytes adev/src/assets/textures/line-render.png | Bin 1018 -> 0 bytes adev/src/assets/textures/line.svg | 3 - adev/src/assets/textures/logo-1-msdf.png | Bin 6437 -> 0 bytes adev/src/assets/textures/logo-1-render.png | Bin 1853 -> 0 bytes adev/src/assets/textures/logo-2-msdf.png | Bin 2120 -> 0 bytes adev/src/assets/textures/logo-2-render.png | Bin 549 -> 0 bytes adev/src/assets/textures/logo-3-msdf.png | Bin 3784 -> 0 bytes adev/src/assets/textures/logo-3-render.png | Bin 1260 -> 0 bytes adev/src/assets/textures/logo-4-msdf.png | Bin 2025 -> 0 bytes adev/src/assets/textures/logo-4-render.png | Bin 669 -> 0 bytes adev/src/assets/textures/logo-5-msdf.png | Bin 5244 -> 0 bytes adev/src/assets/textures/logo-5-render.png | Bin 1424 -> 0 bytes adev/src/assets/textures/logo-6-msdf.png | Bin 2004 -> 0 bytes adev/src/assets/textures/logo-6-render.png | Bin 679 -> 0 bytes adev/src/assets/textures/logo-7-msdf.png | Bin 562 -> 0 bytes adev/src/assets/textures/logo-7-render.png | Bin 289 -> 0 bytes adev/src/assets/textures/logo-8-msdf.png | Bin 4439 -> 0 bytes adev/src/assets/textures/logo-8-render.png | Bin 1097 -> 0 bytes adev/src/assets/textures/logo-9-msdf.png | Bin 1330 -> 0 bytes adev/src/assets/textures/logo-9-render.png | Bin 493 -> 0 bytes adev/src/assets/textures/logo-lockup-msdf.png | Bin 19837 -> 0 bytes .../assets/textures/logo-lockup-render.png | Bin 5644 -> 0 bytes adev/src/assets/textures/logo-lockup.svg | 13 - adev/src/index.html | 3 +- package.json | 2 - yarn.lock | 10 - 92 files changed, 4033 insertions(+), 3513 deletions(-) create mode 100644 adev/src/app/features/home/animation/README.md create mode 100644 adev/src/app/features/home/animation/animation-creator.service.ts create mode 100644 adev/src/app/features/home/animation/animation-layer.directive.ts create mode 100644 adev/src/app/features/home/animation/animation.spec.ts create mode 100644 adev/src/app/features/home/animation/animation.ts create mode 100644 adev/src/app/features/home/animation/calculations/calc-css-value.spec.ts create mode 100644 adev/src/app/features/home/animation/calculations/calc-css-value.ts rename adev/src/app/features/home/{utils/math.ts => animation/calculations/index.ts} (69%) create mode 100644 adev/src/app/features/home/animation/index.ts create mode 100644 adev/src/app/features/home/animation/parser/css-value-lexer.spec.ts create mode 100644 adev/src/app/features/home/animation/parser/css-value-lexer.ts create mode 100644 adev/src/app/features/home/animation/parser/css-value-parser.spec.ts create mode 100644 adev/src/app/features/home/animation/parser/css-value-parser.ts rename adev/src/app/features/home/{components/shaders/modules/easing/sine-in-out.glsl.ts => animation/parser/index.ts} (58%) create mode 100644 adev/src/app/features/home/animation/parser/types.ts create mode 100644 adev/src/app/features/home/animation/parser/utils.spec.ts create mode 100644 adev/src/app/features/home/animation/parser/utils.ts create mode 100644 adev/src/app/features/home/animation/plugins/animation-player.component.ts create mode 100644 adev/src/app/features/home/animation/plugins/animation-player.ts create mode 100644 adev/src/app/features/home/animation/plugins/animation-scroll-handler.ts create mode 100644 adev/src/app/features/home/animation/plugins/types.ts create mode 100644 adev/src/app/features/home/animation/types.ts delete mode 100644 adev/src/app/features/home/components/canvas.ts create mode 100644 adev/src/app/features/home/components/home-animation/animation-definition.ts create mode 100644 adev/src/app/features/home/components/home-animation/home-animation.component.html create mode 100644 adev/src/app/features/home/components/home-animation/home-animation.component.scss create mode 100644 adev/src/app/features/home/components/home-animation/home-animation.component.ts delete mode 100644 adev/src/app/features/home/components/programs/basic-program.ts delete mode 100644 adev/src/app/features/home/components/programs/glyph-program.ts delete mode 100644 adev/src/app/features/home/components/programs/gradient-program.ts delete mode 100644 adev/src/app/features/home/components/programs/line-glyph-program.ts delete mode 100644 adev/src/app/features/home/components/programs/logo-program.ts delete mode 100644 adev/src/app/features/home/components/programs/mask-program.ts delete mode 100644 adev/src/app/features/home/components/shaders/basic-shader.ts delete mode 100644 adev/src/app/features/home/components/shaders/glyph-shader.ts delete mode 100644 adev/src/app/features/home/components/shaders/gradient-shader.ts delete mode 100644 adev/src/app/features/home/components/shaders/line-glyph-shader.ts delete mode 100644 adev/src/app/features/home/components/shaders/logo-shader.ts delete mode 100644 adev/src/app/features/home/components/shaders/mask-shader.ts delete mode 100644 adev/src/app/features/home/components/shaders/modules/msdf/msdf.glsl.ts delete mode 100644 adev/src/app/features/home/components/shaders/modules/sdf-primitives/sd-polygon.glsl.ts delete mode 100644 adev/src/app/features/home/components/views/angular-glyph.ts delete mode 100644 adev/src/app/features/home/components/views/angular-logo.ts delete mode 100644 adev/src/app/features/home/components/views/angular-view.ts delete mode 100644 adev/src/app/features/home/components/views/angular.ts delete mode 100644 adev/src/app/features/home/components/views/build-text.ts delete mode 100644 adev/src/app/features/home/components/views/build-view.ts delete mode 100644 adev/src/app/features/home/components/views/gradient-view.ts delete mode 100644 adev/src/app/features/home/components/views/gradient.ts delete mode 100644 adev/src/app/features/home/components/views/line-object.ts delete mode 100644 adev/src/app/features/home/components/views/lines-view.ts delete mode 100644 adev/src/app/features/home/components/views/lines.ts delete mode 100644 adev/src/app/features/home/components/views/view.ts delete mode 100644 adev/src/app/features/home/home-animation-constants.ts delete mode 100644 adev/src/app/features/home/services/home-animation.service.ts delete mode 100644 adev/src/app/features/home/utils/ogl.ts delete mode 100644 adev/src/assets/textures/BUILD.bazel delete mode 100644 adev/src/assets/textures/build-for-everyone.svg delete mode 100644 adev/src/assets/textures/build-msdf.png delete mode 100644 adev/src/assets/textures/build-render.png delete mode 100644 adev/src/assets/textures/gradient.jpg delete mode 100644 adev/src/assets/textures/line-msdf.png delete mode 100644 adev/src/assets/textures/line-render.png delete mode 100644 adev/src/assets/textures/line.svg delete mode 100644 adev/src/assets/textures/logo-1-msdf.png delete mode 100644 adev/src/assets/textures/logo-1-render.png delete mode 100644 adev/src/assets/textures/logo-2-msdf.png delete mode 100644 adev/src/assets/textures/logo-2-render.png delete mode 100644 adev/src/assets/textures/logo-3-msdf.png delete mode 100644 adev/src/assets/textures/logo-3-render.png delete mode 100644 adev/src/assets/textures/logo-4-msdf.png delete mode 100644 adev/src/assets/textures/logo-4-render.png delete mode 100644 adev/src/assets/textures/logo-5-msdf.png delete mode 100644 adev/src/assets/textures/logo-5-render.png delete mode 100644 adev/src/assets/textures/logo-6-msdf.png delete mode 100644 adev/src/assets/textures/logo-6-render.png delete mode 100644 adev/src/assets/textures/logo-7-msdf.png delete mode 100644 adev/src/assets/textures/logo-7-render.png delete mode 100644 adev/src/assets/textures/logo-8-msdf.png delete mode 100644 adev/src/assets/textures/logo-8-render.png delete mode 100644 adev/src/assets/textures/logo-9-msdf.png delete mode 100644 adev/src/assets/textures/logo-9-render.png delete mode 100644 adev/src/assets/textures/logo-lockup-msdf.png delete mode 100644 adev/src/assets/textures/logo-lockup-render.png delete mode 100644 adev/src/assets/textures/logo-lockup.svg diff --git a/adev/BUILD.bazel b/adev/BUILD.bazel index a46bec275fd9..fb51d936498a 100644 --- a/adev/BUILD.bazel +++ b/adev/BUILD.bazel @@ -1,9 +1,9 @@ -load("@npm//@angular/build-tooling/bazel/remote-execution:index.bzl", "ENABLE_NETWORK") -load("@npm//@angular/build-tooling/bazel/http-server:index.bzl", "http_server") +load("@bazel_skylib//lib:collections.bzl", "collections") load("@bazel_skylib//rules:common_settings.bzl", "bool_flag") load("@build_bazel_rules_nodejs//:index.bzl", "copy_to_bin") +load("@npm//@angular/build-tooling/bazel/http-server:index.bzl", "http_server") +load("@npm//@angular/build-tooling/bazel/remote-execution:index.bzl", "ENABLE_NETWORK") load("@npm//@angular-devkit/architect-cli:index.bzl", "architect", "architect_test") -load("@bazel_skylib//lib:collections.bzl", "collections") load("//adev/tools/local_deps:index.bzl", "ensure_local_package_deps", "link_local_packages") package(default_visibility = ["//visibility:public"]) @@ -35,7 +35,6 @@ TEST_FILES = APPLICATION_FILES + [ APPLICATION_ASSETS = [ "//adev/src/assets/images", - "//adev/src/assets/textures", "//adev/src/assets/previews", "//adev/src/assets:tutorials", "//adev/src/assets/icons", @@ -59,10 +58,8 @@ APPLICATION_DEPS = [ "@npm//@angular/platform-server", "@npm//@angular/router", "@npm//@angular/ssr", - "@npm//gsap", "@npm//marked", "@npm//ngx-progressbar", - "@npm//ogl", "@npm//rxjs", "@npm//typescript", "@npm//@typescript/vfs", diff --git a/adev/src/app/features/home/animation/README.md b/adev/src/app/features/home/animation/README.md new file mode 100644 index 000000000000..af68e389fc5b --- /dev/null +++ b/adev/src/app/features/home/animation/README.md @@ -0,0 +1,160 @@ +# `Animation` API + +The `Animation` class provides a simplistic interface for creating and processing CSS-based animations. In essence, it represents a CSS animation player. + +## API + +Anyone capable of writing CSS, and a certain dose of creativity, should be able to create animations with the `Animation` API. + +### Layers + +To start, you need to divide your animation template into layers that make logical sense. These layers should use the `AnimationLayerDirective` which requires a mandatory `layerId` property to be set. The layer ID should be unique for the `Animation` instance. + +```html +
+
+
+
+
+
+``` + +The layers should be styled as normal elements/components in the animation host component stylesheet. These styles will act as the initial animation styles. + +> [!CAUTION] +> Do not style elements via the `style` attribute, if you plan to animate them. Stale styles are removed by the animation processor which means that any initial styles set via `style` will be cleared as well. + +### Creating an `Animation` instance + +To create a new animation instance, you should use the `AnimationCreatorService` service in your animation host component as follows: + +```typescript +class AnimationHost implements AfterViewInit { + private animationCreator = inject(AnimationCreatorService); + layers = viewChildren(AnimationLayerDirective); + + constructor() { + afterNextRender({ read: () => { + // The layers must be provided + const animation = this.animationCreator.createAnimation(this.layers()); + // ... + }}); + } +} +``` + +### Definition + +After you create an `Animation` instance, you have to provide your `AnimationDefinition` to the `define()` method: + +```typescript +animation.define(DEFINITION); +``` + +The definition is where the actual animation is described. The API is very similar to CSS `@keyframes` where you provide start (`from`) and end (`to`) styles with the added extra that you now have control over the timing – when the animation processor should start applying the styles. Additionally, you have to specify the target element or layer in the following format: + +``` + >> . +``` + +The class name should be of an element within the layer. Accessing the layer directly without a specified element is supported as well (i.e. just use ``). Pay attention to the dot in front of the class name. Although, internally, we are using `getElementsByClassName` the dot is still there in case we want to add support for other types of selectors in the future which will require switching to `getQuerySelectorAll`, for instance. It also provides some form of differentiation between the layer ID and the class name. + +> [!TIP] +> You can achieve `@keyframes` percentage-based sequencing by combining multiple `AnimationRule`-s with different timings and change rates. The same can be said about CSS timing functions – you can achieve similar resemblance by animation rule composition (currently, only linear transitions are supported but that might change if there is a need for that). + +```typescript +const DEFINITION: AnimationDefinition = [ + // Changes the color of the circle from black to white. + { + selector: `layer-1 >> .circle`, + timeframe: [3, 5], // Starts at the 3rd and ends at the 5th second. + from: { + 'background-color': '#000', + }, + to: { + 'background-color': '#fff', + } + } +]; +``` + +It is suggested that the start styles match the initial styles of the element. Generally, it shouldn't matter but it can cause issues with the visualizations if you add `transition`-s to the animated CSS properties. + +> [!IMPORTANT] +> The `from` and `to` CSS properties should match. + +#### Static rules + +If you want to apply certain styles at a concrete time, you should use a static animation rule instead: + +```typescript +// Hides the layer at the 7th second. +{ + selector: `layer-2`, + at: 7, + styles: { + 'display': 'none', + }, +} +``` + +> [!NOTE] +> Static values like `display: none` will be applied immediately in the case of dynamic rules (`timeframe`). They can't be animated. + +### Animation duration and animation control methods + +As mentioned in the description, the `Animation` is essentially a CSS player. Hence, you can use the control methods `play`, `pause`, `stop`, `seek` and `reset` to start and play with an animation after providing a definition. + +Note that animation duration is automatically inferred by the rule that ends its execution last. + +#### Plugins + +The plugin system allows for extending the animation functionality. Currently, there are two available plugins: + +- `AnimationPlayer` – Used for development. As the name suggests, it renders animation controls for ease of use. +- `AnimationScrollHandler` – Enables page scroll control over the animation. + +```typescript +animation.addPlugin(new AnimationScrollHandler(...)); +``` + +> [!TIP] +> You can create your own plugin by extending the `AnimationPlugin` interface. + +> [!CAUTION] +> Use `animation.dispose()` on host component destroy, if you add any plugins as they might result in memory leaks or stale UI leftovers. + +##### Scroll handler plugin + +It's worth mentioning that the speed of animation progression in the context of the scroll handler plugin is determined by both the animation duration and the provided timestep (check `AnimationConfig` for detailed info). The timings in the definition merely act as a way to describe relative timing among the different animation rules not absolute time of execution. + +By default, the plugin will add a spacer to the host element that will be tall enough to match the whole animation duration. This means it's implied that the animation layers use `position: fixed`. You can disable the spacer and use an alternative layout if you desire. + +> [!TIP] +> Apply transitions, as part of the initial styles, to the animated properties when using the scroll handler. This might be needed since scrolling via mouse scroll wheel results in non-continuous `scrollY` which results in jagged animation. + +## Limitations + +There are certain limitations that come with the usage of the `Animation` API. Most of them are related to CSS property values parsing. So, it's crucial to understand that there are several data types – `numeric`, `transition`, `color` and `static` values. All values can be animated with the exclusion of `static` values. For example `display: block` is considered static (i.e. non-animatable). However, there are certain cases where the parser is unable to process a value that might be deemed animatable/continuous which will then be treated as static one. These cases are as follows: + +- _Parsing shorthand CSS properties like `border`_ – The animation processor won't be able to animate `1px solid red` <=> `20px solid red`, for example. In such cases, it is suggested to use the standard CSS properties that describe only the numeric part of the property, i.e. `border-width: 1px <=> 20px`. +- _Only hex, `rgb` and `rgba` colors are supported_ – At this stage, color spaces like `hsl` or `lch`, for instance, are not supported. +- _Not all transform functions are supported_ – You can check the list [here](https://github.com/angular/angular/blob/main/adev/src/app/features/home/animation/parser/css-value-parser.ts#L13). It's merely a preventative measure in case a new function is added to the standard that requires additional changes to the parser. You can try adding your desired function to the list and verifying if it works or not. +- _`calc` and `var` (and probably more) are not supported_ – The parser is not fully CSS-spec-compliant. There are probably more CSS perks that won't be parsable but the current functionality should be sufficient enough for rich animations. + +**Other limitations** + +- _Definition can't be changed dynamically_ – This means that you can't add additional layers or animation rules to the animation during its runtime. +- _Number of animated elements_ – This is probably obvious but rendering a lot of elements and animating them can be computationally expensive and, respectively, degrade the user experience. For such animations, use HTML Canvas solutions. + +## How it works? + +The principle is simple: we calculate the value progression based on time progression (e.g. timeframe = [0, 4]; current time = 3s => progression = 75% => we apply 75% of the defined CSS property value span between `from` and `to` styles, unless the value is static). This happens for each frame via the `updateFrame` method that is called internally. + +Other than that the different phases of `Animation` are: + +- Instantiation +- Animation definition +- Object reference extraction and validation; Property validation +- Parsing of the animation definition to the internal data format (CSS value parsing happens here) +- Value processing/calculations on play/seek/forward/back (i.e. frame update) diff --git a/adev/src/app/features/home/animation/animation-creator.service.ts b/adev/src/app/features/home/animation/animation-creator.service.ts new file mode 100644 index 000000000000..f4d3810e34d0 --- /dev/null +++ b/adev/src/app/features/home/animation/animation-creator.service.ts @@ -0,0 +1,31 @@ +/*! + * @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.dev/license + */ + +import {inject, Injectable, Injector} from '@angular/core'; +import {Animation} from './animation'; +import {AnimationLayerDirective} from './animation-layer.directive'; +import {AnimationConfig} from './types'; + +@Injectable() +export class AnimationCreatorService { + private readonly injector = inject(Injector); + + /** + * Create an `Animation` object + * + * @param layers Animation layers + * @param config Animation config + * @returns `Animation` + */ + createAnimation( + layers: readonly AnimationLayerDirective[], + config?: Partial, + ): Animation { + return new Animation(layers, this.injector, config); + } +} diff --git a/adev/src/app/features/home/animation/animation-layer.directive.ts b/adev/src/app/features/home/animation/animation-layer.directive.ts new file mode 100644 index 000000000000..d1563d4c301b --- /dev/null +++ b/adev/src/app/features/home/animation/animation-layer.directive.ts @@ -0,0 +1,21 @@ +/*! + * @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.dev/license + */ + +import {Directive, ElementRef, inject, input} from '@angular/core'; + +/** + * Use on elements that are deemed to be animation layers. + */ +@Directive({ + selector: '[adevAnimationLayer]', +}) +export class AnimationLayerDirective { + readonly elementRef = inject(ElementRef); + + id = input.required({alias: 'layerId'}); +} diff --git a/adev/src/app/features/home/animation/animation.spec.ts b/adev/src/app/features/home/animation/animation.spec.ts new file mode 100644 index 000000000000..c4cf5b98a4c2 --- /dev/null +++ b/adev/src/app/features/home/animation/animation.spec.ts @@ -0,0 +1,417 @@ +/*! + * @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.dev/license + */ + +import {AfterViewInit, Component, inject, viewChildren} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {AnimationLayerDirective} from './animation-layer.directive'; +import {AnimationCreatorService} from './animation-creator.service'; +import {Animation} from './animation'; +import {AnimationDefinition} from './types'; +import {AnimationPlugin} from './plugins/types'; + +// Test component +const TEST_TIMESTEP = 500; + +@Component({ + selector: 'adev-animation-host', + imports: [AnimationLayerDirective], + providers: [AnimationCreatorService], + template: ` +
+
+
+
+
+
+
+
+
+
+ `, +}) +class AnimationHost implements AfterViewInit { + private animationCreator = inject(AnimationCreatorService); + layers = viewChildren(AnimationLayerDirective); + animation!: Animation; + + ngAfterViewInit() { + this.animation = this.animationCreator.createAnimation(this.layers(), { + timestep: TEST_TIMESTEP, + }); + } +} + +// Animation definition +const DEFINITION: AnimationDefinition = [ + { + selector: 'layer-1 >> .circle', + timeframe: [0, 4], + from: { + 'opacity': '0', + 'transform': 'translateX(0)', + }, + to: { + 'opacity': '1', + 'transform': 'translateX(100%)', + }, + }, + { + selector: 'layer-2 >> .square', + timeframe: [1, 5], + from: { + 'font-size': '20px', + 'color': '#000', + }, + to: { + 'font-size': '10px', + 'color': '#ffffff', + }, + }, +]; + +describe('Animation', () => { + let component: AnimationHost; + let fixture: ComponentFixture; + let animation: Animation; + const layerObjects = new Map(); + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [AnimationHost], + }).compileComponents(); + + fixture = TestBed.createComponent(AnimationHost); + component = fixture.componentInstance; + fixture.detectChanges(); + animation = component.animation; + + // Store all layer objects in a map for easier access. + for (const l of component.layers()) { + const layerEl = l.elementRef.nativeElement as HTMLElement; + layerObjects.set(l.id(), layerEl); + + const layerObj = layerEl.firstChild as HTMLElement; + layerObjects.set('.' + layerObj.className, layerObj); + } + }); + + it('should load the layers and initialize the animation', () => { + expect(animation).toBeTruthy(); + expect(layerObjects.get('layer-1')).toBeInstanceOf(HTMLElement); + expect(layerObjects.get('.circle')).toBeInstanceOf(HTMLElement); + expect(layerObjects.get('layer-2')).toBeInstanceOf(HTMLElement); + expect(layerObjects.get('.square')).toBeInstanceOf(HTMLElement); + expect(layerObjects.get('layer-3')).toBeInstanceOf(HTMLElement); + }); + + it(`should throw an error if a layer doesn't exist`, () => { + const defineFn = () => + animation.define([ + { + selector: 'layer-4', + at: 1, + styles: {}, + }, + ]); + + expect(defineFn).toThrowError('Animation: Missing layer ID: layer-4'); + }); + + it('should return the config timestep', () => { + expect(animation.timestep).toEqual(TEST_TIMESTEP); + }); + + it(`should throw an error if a layer object doesn't exist`, () => { + const defineFn = () => + animation.define([ + { + selector: 'layer-1 >> .triangle', + at: 1, + styles: {}, + }, + ]); + + expect(defineFn).toThrowError('Animation: Missing layer object(s): layer-1 >> .triangle'); + }); + + it('should throw an error if the animation duration is negative', () => { + const defineFn = () => + animation.define([ + { + selector: 'layer-1 >> .circle', + timeframe: [5, 4], + from: { + 'background': '#000', + }, + to: { + 'background': '#fff', + }, + }, + ]); + + expect(defineFn).toThrowError( + `Animation: Incorrect time frame for selector 'layer-1 >> .circle'. Start time is greater than end time`, + ); + }); + + it('should throw an error if the animation duration is zero', () => { + const defineFn = () => + animation.define([ + { + selector: 'layer-1 >> .circle', + timeframe: [5, 5], + from: { + 'background': '#000', + }, + to: { + 'background': '#fff', + }, + }, + ]); + + expect(defineFn).toThrowError( + `Animation: Duration for selector 'layer-1 >> .circle' is zero. Use 'at' time selector instead`, + ); + }); + + it('should throw an error if there is a mismatch between the number of "from" and "to" styles', () => { + const defineFn = () => + animation.define([ + { + selector: 'layer-1 >> .circle', + timeframe: [0, 1], + from: { + 'background': '#000', + 'opacity': '0.5', + }, + to: { + 'background': '#fff', + }, + }, + ]); + + expect(defineFn).toThrowError( + `Animation: There is a mismatch between the number of "from" and "to" styles for selector 'layer-1 >> .circle'`, + ); + }); + + it('should throw an error if there is a mismatch between the "from" and "to" styles properties', () => { + const defineFn = () => + animation.define([ + { + selector: 'layer-1 >> .circle', + timeframe: [0, 1], + from: { + 'background': '#000', + 'opacity': '0.5', + }, + to: { + 'background': '#fff', + 'transform': 'scale(2)', + }, + }, + ]); + + expect(defineFn).toThrowError( + `Animation: "from" style 'transform' is missing for selector 'layer-1 >> .circle'`, + ); + }); + + it('should return animation duration', () => { + animation.define([ + { + selector: 'layer-2 >> .square', + timeframe: [3, 7], + from: {}, + to: {}, + }, + { + selector: 'layer-1 >> .circle', + timeframe: [0, 5], + from: {}, + to: {}, + }, + ]); + + expect(animation.duration).toEqual(7000); + }); + + it('should return animation duration (single rule)', () => { + animation.define([ + { + selector: 'layer-2 >> .square', + at: 3, + styles: {}, + }, + ]); + + expect(animation.duration).toEqual(3000); + }); + + it('should add an initialize a plugin', () => { + const mockPlugin: AnimationPlugin = { + init: () => {}, + destroy: () => {}, + }; + const initSpy = spyOn(mockPlugin, 'init'); + + animation.addPlugin(mockPlugin); + + expect(initSpy).toHaveBeenCalled(); + }); + + it('should dispose the animation', () => { + const mockPlugin: AnimationPlugin = { + init: () => {}, + destroy: () => {}, + }; + const destroySpy = spyOn(mockPlugin, 'destroy'); + + animation.addPlugin(mockPlugin); + animation.dispose(); + + expect(destroySpy).toHaveBeenCalled(); + expect(animation.duration).toEqual(0); + expect(animation.progress()).toEqual(0); + expect(animation.isPlaying()).toEqual(false); + }); + + it('should move the animation forward in time', () => { + animation.define(DEFINITION); + animation.forward(2000); + + const circle = layerObjects.get('.circle'); + + expect(circle?.style.opacity).toEqual('0.5'); + expect(circle?.style.transform).toEqual('translateX(50%)'); + + const square = layerObjects.get('.square'); + + expect(square?.style.fontSize).toEqual('17.5px'); + expect(square?.style.color).toEqual('rgb(64, 64, 64)'); + }); + + it('should move the animation back in time', () => { + animation.define(DEFINITION); + animation.forward(5000); + animation.back(2000); + + const circle = layerObjects.get('.circle'); + + expect(circle?.style.opacity).toEqual('0.75'); + expect(circle?.style.transform).toEqual('translateX(75%)'); + + const square = layerObjects.get('.square'); + + expect(square?.style.fontSize).toEqual('15px'); + expect(square?.style.color).toEqual('rgb(128, 128, 128)'); + }); + + it('should seek', () => { + animation.define(DEFINITION); + animation.seek(4 / 5); // 4th second; 0.8 + + const circle = layerObjects.get('.circle'); + + expect(circle?.style.opacity).toEqual('1'); + expect(circle?.style.transform).toEqual('translateX(100%)'); + + const square = layerObjects.get('.square'); + + expect(square?.style.fontSize).toEqual('12.5px'); + expect(square?.style.color).toEqual('rgb(191, 191, 191)'); + }); + + it('should reset the animation', () => { + animation.define(DEFINITION); + animation.seek(1); + animation.reset(); + + expect(animation.progress()).toEqual(0); + + const circle = layerObjects.get('.circle'); + + // i.e. CSS styles are in use + + expect(circle?.style.opacity).toEqual(''); + expect(circle?.style.transform).toEqual(''); + + const square = layerObjects.get('.square'); + + expect(square?.style.fontSize).toEqual(''); + expect(square?.style.color).toEqual(''); + }); + + it('should animate layers', () => { + animation.define([ + { + selector: 'layer-1', + timeframe: [0, 1], + from: { + 'padding': '0', + }, + to: { + 'padding': '32px', + }, + }, + ]); + animation.seek(0.5); + + const layer1 = layerObjects.get('layer-1'); + + expect(layer1?.style.padding).toEqual('16px'); + }); + + it('should animate all objects that are matching a selector', () => { + animation.define([ + { + selector: 'layer-3 >> .triangle', + timeframe: [0, 1], + from: { + 'transform': 'rotate(0)', + }, + to: { + 'transform': 'rotate(360deg)', + }, + }, + ]); + animation.seek(0.5); + + const layer3 = layerObjects.get('layer-3')!; + const triangles = layer3.querySelectorAll('.triangle'); + + for (let i = 0; i < triangles.length; i++) { + expect((triangles[i] as HTMLElement).style.transform).toEqual('rotate(180deg)'); + } + }); + + it('should animate a single static rule', () => { + animation.define([ + { + selector: 'layer-2 >> .square', + at: 1.5, + styles: { + 'top': '100px', + }, + }, + ]); + + animation.seek(1); + + const square = layerObjects.get('.square'); + + expect(square?.style.top).toEqual('100px'); + }); + + it('should track animation progress', () => { + animation.define(DEFINITION); + animation.seek(0.5); + + expect(animation.progress()).toEqual(0.5); + }); +}); diff --git a/adev/src/app/features/home/animation/animation.ts b/adev/src/app/features/home/animation/animation.ts new file mode 100644 index 000000000000..01015bf79542 --- /dev/null +++ b/adev/src/app/features/home/animation/animation.ts @@ -0,0 +1,507 @@ +/*! + * @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.dev/license + */ + +import {Injector, Renderer2, RendererFactory2, signal} from '@angular/core'; +import {AnimationLayerDirective} from './animation-layer.directive'; +import { + AnimationConfig, + AnimationDefinition, + AnimationRule, + DynamicAnimationRule, + ParsedStyles, + Styles, +} from './types'; +import {CssPropertyValue, cssValueParser, stringifyParsedValue} from './parser'; +import {calculateNextCssValue} from './calculations'; +import {AnimationPlugin} from './plugins/types'; + +// The string seperator between a layed ID and an object selector. +const SEL_SEPARATOR = '>>'; + +// One millisecond. +const MS = 1000; + +// Default config. +const DEFAULT_CONFIG: AnimationConfig = { + timestep: 100, +}; + +const getStartTime = (r: AnimationRule): number => + r.timeframe ? r.timeframe[0] : r.at; + +const getEndTime = (r: AnimationRule): number => + r.timeframe ? r.timeframe[1] : r.at; + +const getEndStyles = (r: AnimationRule): ParsedStyles => + r.timeframe ? r.to : r.styles; + +/** + * CSS animation player/processor. + */ +export class Animation { + private renderer: Renderer2; + + /** Parsed rules. Time is in milliseconds. */ + private rules: AnimationRule[] = []; + private config: AnimationConfig; + private currentTime: number = 0; + private allObjects = new Map(); // selector; element(s) + private activeStyles = new Map(); // selector; ParsedStyles + private animationFrameId: number | null = null; + private completed: boolean = false; + private plugins: AnimationPlugin[] = []; + private _duration: number = 0; + private _isPlaying = signal(false); + private _progress = signal(0); + + /** Returns whether the animation is playing or not */ + isPlaying = this._isPlaying.asReadonly(); + + /** Returns the animation progress (`[0,1]`) */ + progress = this._progress.asReadonly(); + + constructor( + layers: readonly AnimationLayerDirective[], + injector: Injector, + config?: Partial, + ) { + this.renderer = injector.get(RendererFactory2).createRenderer(null, null); + this.config = {...DEFAULT_CONFIG, ...(config || {})}; + + // Set layer elements in the objects map. + this.allObjects = new Map(layers.map((f) => [f.id(), f.elementRef.nativeElement])); + } + + /** Animation duration. In milliseconds */ + get duration() { + return this._duration; + } + + /** Animation timestep (config). In milliseconds */ + get timestep() { + return this.config.timestep; + } + + /** + * Define the animation. + * + * @param definition Definition (i.e. `AnimationRule` array) + * @returns The animation + */ + define(definition: AnimationDefinition) { + this.reset(); + this.extractObjectsAndValidateRules(definition); + + // Parse the rules. + // IMPORTANT: Parsed rules use milliseconds instead of seconds. + this.rules = definition + .sort((a, b) => getStartTime(a) - getStartTime(b)) + .map((rule) => { + if (rule.timeframe) { + const from: ParsedStyles = {}; + const to: ParsedStyles = {}; + + for (const [prop, val] of Object.entries(rule.from)) { + from[prop] = cssValueParser(val); + } + for (const [prop, val] of Object.entries(rule.to)) { + to[prop] = cssValueParser(val); + } + // Convert to milliseconds. + const msTimeframe = rule.timeframe.map((t) => t * MS) as [number, number]; + + return {...rule, from, to, timeframe: msTimeframe}; + } else { + const styles: ParsedStyles = {}; + + for (const [prop, val] of Object.entries(rule.styles)) { + styles[prop] = cssValueParser(val); + } + // Convert to milliseconds. + const msAt = rule.at * MS; + + return {...rule, styles, at: msAt}; + } + }); + + // Calculate the duration of the animation. + // IMPORTANT: Use parsed rules with milliseconds. + this._duration = Math.max(...this.rules.map((r) => getEndTime(r))); + + return this; + } + + /** Play the animation. */ + play() { + if (this.animationFrameId !== null) { + return; + } + if (!this.rules.length) { + console.warn("Animation: Can't play without a definition"); + return; + } + if (this.completed) { + this.reset(); + this.completed = false; + } + + this._isPlaying.set(true); + + // Start the animation. + this.animate(Date.now(), 0); + } + + /** Pause the animation. */ + pause() { + if (this.animationFrameId !== null) { + cancelAnimationFrame(this.animationFrameId); + this.animationFrameId = null; + this._isPlaying.set(false); + } + } + + /** + * Fast-forward or go back at a specific time. + * + * @param progress Time (in percent) at which the player should render the animation + * @returns + */ + seek(progress: number) { + this.pause(); + + if (!this.rules.length) { + console.warn("Animation: Can't without a definition"); + return; + } + + progress = Math.max(0, Math.min(progress, 1)); + const time = Math.round(progress * this._duration); + + this.updateFrame(time); + this.completed = progress === 1; + } + + /** + * Go forward in time. + * + * @param timestep Custom timestep different from the config one + * @returns + */ + forward(timestep?: number) { + this.pause(); + + if (!this.rules.length) { + console.warn("Animation: Can't go forward without a definition"); + return; + } + timestep = timestep ?? this.config.timestep; + + const time = this.currentTime + timestep; + + if (time <= this._duration) { + this.updateFrame(time); + } else { + this.completed = true; + } + } + + /** + * Go back in time. + * + * @param timestep Custom timestep different from the config one + * @returns + */ + back(timestep?: number) { + this.pause(); + + if (!this.rules.length) { + console.warn("Animation: Can't go back without a definition"); + return; + } + timestep = timestep ?? this.config.timestep; + + const time = this.currentTime - timestep; + + if (time >= 0) { + this.updateFrame(time); + + // Un-complete the animation, if it was completed. + this.completed = false; + } + } + + /** Reset the animation. */ + reset() { + this.pause(); + this.currentTime = 0; + this._progress.set(0); + + for (const [selector, styles] of this.activeStyles) { + for (const style of Object.keys(styles)) { + this.removeStyle(selector, style); + } + this.activeStyles.delete(selector); + } + } + + /** Alias for `reset`. */ + stop() { + this.reset(); + } + + /** + * Add and initialize `AnimationPlugin` to the animation. + * + * @param plugin Plugin to be added + * @returns The animation + */ + addPlugin(plugin: AnimationPlugin) { + plugin.init(this); + this.plugins.push(plugin); + + return this; + } + + /** + * Cleans all of the resources that might cause memory leaks (e.g. plugins). + * Resets the animation and cleans the definition. + */ + dispose() { + for (const plugin of this.plugins) { + plugin.destroy(); + } + this.reset(); + this.rules = []; + this._duration = 0; + this.plugins = []; + } + + /** + * Update the frame/animation by a given time. + * + * @param time Time at which the animation should be rendered. + */ + private updateFrame(time: number) { + const completedRules = this.rules.filter((r) => time >= getEndTime(r)); + const inProgressDynamicRules = this.rules.filter((r) => { + const start = getStartTime(r); + const end = getEndTime(r); + // We exclude the static animation rules by `start < end` since `start == end`. + return start < end && start <= time && time <= end; + }) as DynamicAnimationRule[]; + + // All styles/styles state at `time`. + const stylesState = new Map(); + + // Extract the completed rules (their styles) directly ... + for (const rule of completedRules) { + let objectStyles = stylesState.get(rule.selector) || {}; + objectStyles = {...objectStyles, ...getEndStyles(rule)}; + stylesState.set(rule.selector, objectStyles); + } + + const deltaTime = time - this.currentTime; + + // ... and then calculate the change of the dynamic rules in progress. + for (const rule of inProgressDynamicRules) { + let timespan: number; + let targetStyles: ParsedStyles; // Direction styles + let sourceStyles: ParsedStyles; // Opposite direction styles + let relativeDeltaT: number; + + // Determine the change direction. Negative Dt means going back in time; postive – forward. + // + // It's important to calculate the relative time since the global current time might go out of + // rule boundaries which will scew the final change rate calculations. + // + // For example: + // If the currentTime = 0; time = 2; for a rule active between [1, 5]; + // the Dt = 2, but only one second has passed from the rule's timespan, + // i.e. we have to use a relative time which in this case is equal to timespan[0]. + // relativeDt = 1 (not 2); timespan = 4 (not 5); changeRate = 0.25 (not 0.4) + if (deltaTime > 0) { + const relativeTime = rule.timeframe[0]; + relativeDeltaT = time - relativeTime; + timespan = getEndTime(rule) - relativeTime; + targetStyles = rule.to; + sourceStyles = rule.from; + } else { + const relativeTime = rule.timeframe[1]; + relativeDeltaT = time - relativeTime; + timespan = relativeTime - getStartTime(rule); + targetStyles = rule.from; + sourceStyles = rule.to; + } + + const changeRate = Math.abs(relativeDeltaT / timespan); + const styles = stylesState.get(rule.selector) || {}; + + for (const [prop, target] of Object.entries(targetStyles)) { + const source = sourceStyles[prop]; + styles[prop] = calculateNextCssValue(source, target, changeRate); + } + + stylesState.set(rule.selector, styles); + } + + // Get rid of any active styles that are not part of the current styles state + for (const [selector, styles] of this.activeStyles) { + const newStyles = stylesState.get(selector); + for (const prop of Object.keys(styles)) { + if (!newStyles || !newStyles[prop]) { + this.removeStyle(selector, prop); + } + } + } + + // Apply the new rule styles. + for (const [selector, styles] of stylesState) { + for (const [prop, value] of Object.entries(styles)) { + this.setStyle(selector, prop, value); + } + } + + this.currentTime = time; + this._progress.set(time / this.duration); + } + + /** Set active style. */ + private setStyle(selector: string, property: string, value: CssPropertyValue) { + const elements = this.allObjects.get(selector)!; + + const valueString = stringifyParsedValue(value); + + if (elements instanceof Element) { + this.renderer.setStyle(elements, property, valueString); + } else { + for (const e of elements) { + this.renderer.setStyle(e, property, valueString); + } + } + + const activeStyles = this.activeStyles.get(selector) || {}; + activeStyles[property] = value; + this.activeStyles.set(selector, activeStyles); + } + + /** Remove active style. */ + private removeStyle(selector: string, property: string) { + const elements = this.allObjects.get(selector)!; + + if (elements instanceof Element) { + this.renderer.removeStyle(elements, property); + } else { + for (const e of elements) { + this.renderer.removeStyle(e, property); + } + } + + const activeStyles = this.activeStyles.get(selector) || {}; + delete activeStyles[property]; + } + + /** Animate function. */ + private animate(then: number, elapsed: number) { + this.animationFrameId = requestAnimationFrame(() => this.animate(then, elapsed)); + + const now = Date.now(); + elapsed = now - then; + + if (elapsed >= this.config.timestep) { + // Subtract the overflowed time from Now to maintain steady fps. + then = now - (elapsed % this.config.timestep); + + const time = this.currentTime + elapsed; + + if (time <= this._duration) { + this.updateFrame(time); + } else { + // Pause the animation and mark it as completed + // when we go over the duration. + this.pause(); + this.completed = true; + + // Since the last frame can be few milliseconds behind the duration + // (e.g. duration = 5000; current time = 4998) when the animation is + // completed, we perform one additional call to updateFrame in order + // to visualize any remaining static rules that match exactly the end + // of the animation. + if (this.duration > this.currentTime) { + requestAnimationFrame(() => this.updateFrame(this.duration)); + } + } + } + } + + /** Extract the objects from the selectors and validate their rules. */ + private extractObjectsAndValidateRules(definition: AnimationDefinition) { + for (const rule of definition) { + this.validateRules(rule); + this.extractObjects(rule); + } + } + + /** Check whether the start and end styles match and the time frame is correct. */ + private validateRules(rule: AnimationRule) { + if (!rule.timeframe) { + return; + } + + const duration = rule.timeframe[1] - rule.timeframe[0]; + if (duration < 0) { + throw new Error( + `Animation: Incorrect time frame for selector '${rule.selector}'. Start time is greater than end time`, + ); + } else if (duration === 0) { + throw new Error( + `Animation: Duration for selector '${rule.selector}' is zero. Use 'at' time selector instead`, + ); + } + + const fromStyles = Object.keys(rule.from); + const toStyles = Object.keys(rule.to); + + if (fromStyles.length !== toStyles.length) { + throw new Error( + `Animation: There is a mismatch between the number of "from" and "to" styles for selector '${rule.selector}'`, + ); + } + for (const prop of toStyles) { + if (!rule.from[prop]) { + throw new Error( + `Animation: "from" style '${prop}' is missing for selector '${rule.selector}'`, + ); + } + } + } + + /** + * Extracts all objects (layer elements and layer child elements) by their provided selectors. + */ + private extractObjects(rule: AnimationRule) { + let [layerId, objectSelector] = rule.selector.split(SEL_SEPARATOR); + layerId = layerId.trim(); + objectSelector = (objectSelector ?? '').trim(); + + const layer = this.allObjects.get(layerId) as Element; + if (!layer) { + throw new Error(`Animation: Missing layer ID: ${layerId}`); + } + + if (objectSelector && !this.allObjects.has(rule.selector)) { + const objects = layer.getElementsByClassName(objectSelector.replaceAll('.', ' ').trim()); + if (!objects.length) { + throw new Error(`Animation: Missing layer object(s): ${rule.selector}`); + } + + if (!this.allObjects.has(rule.selector)) { + this.allObjects.set(rule.selector, objects.length === 1 ? objects[0] : Array.from(objects)); + } + } + } +} diff --git a/adev/src/app/features/home/animation/calculations/calc-css-value.spec.ts b/adev/src/app/features/home/animation/calculations/calc-css-value.spec.ts new file mode 100644 index 000000000000..bde443fb67c6 --- /dev/null +++ b/adev/src/app/features/home/animation/calculations/calc-css-value.spec.ts @@ -0,0 +1,266 @@ +/*! + * @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.dev/license + */ + +import {calculateNextCssValue} from './calc-css-value'; +import {ColorValue, NumericValue, StaticValue, TransformValue} from '../parser'; + +// +// Test values +// + +const sourceNumeric: NumericValue = { + type: 'numeric', + values: [ + [100, 'px'], + [250, 'px'], + ], +}; + +const targetNumeric: NumericValue = { + type: 'numeric', + values: [ + [125, 'px'], + [100, 'px'], + ], +}; + +const sourceTransform: TransformValue = { + type: 'transform', + values: new Map([ + [ + 'transform', + [ + [100, 'px'], + [10, 'px'], + ], + ], + ['scale', [[0.5, '']]], + ]), +}; + +const targetTransform: TransformValue = { + type: 'transform', + values: new Map([ + [ + 'transform', + [ + [150, 'px'], + [5, 'px'], + ], + ], + ['scale', [[1, '']]], + ]), +}; + +const sourceColor: ColorValue = { + type: 'color', + value: ['rgb', 0, 0, 0], +}; + +const targetColor: ColorValue = { + type: 'color', + value: ['rgb', 255, 255, 255], +}; + +// +// Tests +// + +describe('calculateNextCssValue', () => { + it('should return the target value, if static', () => { + const source: StaticValue = { + type: 'static', + value: '1px solid red', + }; + const target: StaticValue = { + type: 'static', + value: '2px solid blue', + }; + const next = calculateNextCssValue(source, target, 0.5); + + expect(next).toEqual(target); + }); + + it('should return the source numeric value, if the change rate is 0', () => { + const next = calculateNextCssValue(sourceNumeric, targetNumeric, 0); + + expect(next).toEqual(sourceNumeric); + }); + + it('should return the target numeric value, if the change rate is 1', () => { + const next = calculateNextCssValue(sourceNumeric, targetNumeric, 1); + + expect(next).toEqual(targetNumeric); + }); + + it('should calculate a numeric value', () => { + const next = calculateNextCssValue(sourceNumeric, targetNumeric, 0.75); + + expect(next).toEqual({ + type: 'numeric', + values: [ + [118.75, 'px'], + [137.5, 'px'], + ], + }); + }); + + it('should calculate a numeric value with negative number', () => { + const next = calculateNextCssValue( + { + type: 'numeric', + values: [ + [-50, 'px'], + [0, '%'], + ], + }, + { + type: 'numeric', + values: [ + [50, 'px'], + [-75, '%'], + ], + }, + 0.5, + ); + + expect(next).toEqual({ + type: 'numeric', + values: [ + [0, 'px'], + [-37.5, '%'], + ], + }); + }); + + it('should handle numeric zero values without units', () => { + const source: NumericValue = { + type: 'numeric', + values: [[100, '%']], + }; + const target: NumericValue = { + type: 'numeric', + values: [[0, '']], + }; + const next = calculateNextCssValue(source, target, 0.25); + + expect(next).toEqual({ + type: 'numeric', + values: [[75, '%']], + }); + }); + + it('should return the source transform value, if the change rate is 0', () => { + const next = calculateNextCssValue(sourceTransform, targetTransform, 0); + + expect(next).toEqual(sourceTransform); + }); + + it('should return the target transform value, if the change rate is 1', () => { + const next = calculateNextCssValue(sourceTransform, targetTransform, 1); + + expect(next).toEqual(targetTransform); + }); + + it('should calculate a transform value', () => { + const next = calculateNextCssValue(sourceTransform, targetTransform, 0.75); + + expect(next).toEqual({ + type: 'transform', + values: new Map([ + [ + 'transform', + [ + [137.5, 'px'], + [6.25, 'px'], + ], + ], + ['scale', [[0.875, '']]], + ]), + }); + }); + + it('should calculate a transform value with negative numbers', () => { + const source: TransformValue = { + type: 'transform', + values: new Map([ + [ + 'translateX', + [ + [-120, 'px'], + [0, '%'], + ], + ], + ]), + }; + const target: TransformValue = { + type: 'transform', + values: new Map([ + [ + 'translateX', + [ + [0, 'px'], + [-50, '%'], + ], + ], + ]), + }; + const next = calculateNextCssValue(source, target, 0.25); + + expect(next).toEqual({ + type: 'transform', + values: new Map([ + [ + 'translateX', + [ + [-90, 'px'], + [-12.5, '%'], + ], + ], + ]), + }); + }); + + it('should handle transform zero values without units', () => { + const source: TransformValue = { + type: 'transform', + values: new Map([['translateX', [[120, 'px']]]]), + }; + const target: TransformValue = { + type: 'transform', + values: new Map([['translateX', [[0, '']]]]), + }; + const next = calculateNextCssValue(source, target, 0.25); + + expect(next).toEqual({ + type: 'transform', + values: new Map([['translateX', [[90, 'px']]]]), + }); + }); + + it('should return the source color value, if the change rate is 0', () => { + const next = calculateNextCssValue(sourceColor, targetColor, 0); + + expect(next).toEqual(sourceColor); + }); + + it('should return the target color value, if the change rate is 1', () => { + const next = calculateNextCssValue(sourceColor, targetColor, 1); + + expect(next).toEqual(targetColor); + }); + + it('should calculate a color value', () => { + const next = calculateNextCssValue(sourceColor, targetColor, 0.75); + + expect(next).toEqual({ + type: 'color', + value: ['rgb', 191, 191, 191], + }); + }); +}); diff --git a/adev/src/app/features/home/animation/calculations/calc-css-value.ts b/adev/src/app/features/home/animation/calculations/calc-css-value.ts new file mode 100644 index 000000000000..43082bb9f30b --- /dev/null +++ b/adev/src/app/features/home/animation/calculations/calc-css-value.ts @@ -0,0 +1,122 @@ +/*! + * @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.dev/license + */ + +import { + ColorValue, + copyParsedValue, + CssPropertyValue, + NumericValue, + TransformValue, +} from '../parser'; + +/** + * Calculate the next `CssPropertyValue` based on the source and a target one. + * + * @param srcValue The source value + * @param targetValue The target values (it's either the final or the initial value) + * @param changeRate The change rate relative to the target (i.e. 1 = target value; 0 = source value) + * @returns The newly generated value + */ +export function calculateNextCssValue( + srcValue: T, + targetValue: T, + changeRate: number, +): T { + switch (targetValue.type) { + case 'numeric': + return calculateNextNumericValue(srcValue as NumericValue, targetValue, changeRate) as T; + case 'transform': + return calculateNextTransformValue(srcValue as TransformValue, targetValue, changeRate) as T; + case 'color': + return calculateNextColorValue(srcValue as ColorValue, targetValue, changeRate) as T; + } + + // Should represent static values + return copyParsedValue(targetValue); +} + +function calculateNextNumericValue( + srcValue: NumericValue, + targetValue: NumericValue, + changeRate: number, +): NumericValue { + const nextValue: NumericValue = { + type: 'numeric', + values: [], + }; + + for (let i = 0; i < targetValue.values.length; i++) { + const src = srcValue.values[i]; + const target = targetValue.values[i]; + const numDelta = calculateValueDelta(src[0], target[0], changeRate); + // We should check both src and target for the unit + // since we might have zero-based value without a unit + // (e.g. 0 <-> 640px) + const unit = target[1] || src[1]; + nextValue.values.push([src[0] + numDelta, unit]); + } + + return nextValue; +} + +function calculateNextTransformValue( + srcValue: TransformValue, + targetValue: TransformValue, + changeRate: number, +): TransformValue { + const nextValue: TransformValue = { + type: 'transform', + values: new Map(), + }; + + for (const [func, numData] of targetValue.values) { + const srcNumData = srcValue.values.get(func)!; + const newNumData: [number, string][] = []; + + for (let i = 0; i < numData.length; i++) { + const target = numData[i]; + const src = srcNumData[i]; + const numDelta = calculateValueDelta(src[0], target[0], changeRate); + // We should check both source and target for the unit + // since we might have zero-based value without a unit + // (e.g. rotate(0) <-> rotate(180deg)) + const unit = target[1] || src[1]; + newNumData.push([src[0] + numDelta, unit]); + } + + nextValue.values.set(func, newNumData); + } + + return nextValue; +} + +function calculateNextColorValue( + srcValue: ColorValue, + targetValue: ColorValue, + changeRate: number, +): ColorValue { + const nextColor: (string | number)[] = [srcValue.value[0]]; + + // Skip the first element since it represents the type. + for (let i = 1; i < targetValue.value.length; i++) { + const srcChannel = srcValue.value[i] as number; + const targetChannel = targetValue.value[i] as number; + const delta = calculateValueDelta(srcChannel, targetChannel, changeRate); + nextColor.push(Math.round(srcChannel + delta)); + } + + return { + type: 'color', + value: nextColor as typeof srcValue.value, + }; +} + +function calculateValueDelta(srcValue: number, targetValue: number, changeRate: number): number { + const valueSpan = targetValue - srcValue; + return valueSpan * changeRate; +} diff --git a/adev/src/app/features/home/utils/math.ts b/adev/src/app/features/home/animation/calculations/index.ts similarity index 69% rename from adev/src/app/features/home/utils/math.ts rename to adev/src/app/features/home/animation/calculations/index.ts index b170021ce544..4027ab650941 100644 --- a/adev/src/app/features/home/utils/math.ts +++ b/adev/src/app/features/home/animation/calculations/index.ts @@ -6,6 +6,4 @@ * found in the LICENSE file at https://angular.dev/license */ -export function toRadians(degrees: number): number { - return degrees * (Math.PI / 180); -} +export * from './calc-css-value'; diff --git a/adev/src/app/features/home/animation/index.ts b/adev/src/app/features/home/animation/index.ts new file mode 100644 index 000000000000..0cf5883208e5 --- /dev/null +++ b/adev/src/app/features/home/animation/index.ts @@ -0,0 +1,12 @@ +/*! + * @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.dev/license + */ + +export * from './animation-creator.service'; +export * from './animation-layer.directive'; +export * from './animation'; +export {AnimationConfig, AnimationDefinition, Styles} from './types'; diff --git a/adev/src/app/features/home/animation/parser/css-value-lexer.spec.ts b/adev/src/app/features/home/animation/parser/css-value-lexer.spec.ts new file mode 100644 index 000000000000..6eed970dfb15 --- /dev/null +++ b/adev/src/app/features/home/animation/parser/css-value-lexer.spec.ts @@ -0,0 +1,101 @@ +/*! + * @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.dev/license + */ + +import {cssValueLexer} from './css-value-lexer'; + +describe('css-value-lexer', () => { + it('should extract the tokens for a simple static value', () => { + const tokens = cssValueLexer('block'); + + expect(tokens).toEqual(['block']); + }); + + it('should extract the tokens for a hex color value', () => { + const tokens = cssValueLexer('#ff0000'); + + expect(tokens).toEqual(['#ff0000']); + }); + + it('should extract the tokens for an RGB color value', () => { + const tokens = cssValueLexer('rgb(255, 255, 0)'); + + expect(tokens).toEqual(['rgb', 255, 255, 0]); + }); + + it('should extract the tokens for an RGBA color value', () => { + const tokens = cssValueLexer('rgba(255, 255, 0, 0.5)'); + + expect(tokens).toEqual(['rgba', 255, 255, 0, 0.5]); + }); + + it('should extract the tokens for a single numeric integer value', () => { + const tokens = cssValueLexer('42px'); + + expect(tokens).toEqual([42, 'px']); + }); + + it('should extract the tokens for a single numeric decimal value', () => { + const tokens = cssValueLexer('66.6%'); + + expect(tokens).toEqual([66.6, '%']); + }); + + it('should extract the tokens for a single numeric negative value', () => { + const tokens = cssValueLexer('-50%'); + + expect(tokens).toEqual([-50, '%']); + }); + + it('should extract the tokens for a single unitless numberic value', () => { + const tokens = cssValueLexer('1337'); + + expect(tokens).toEqual([1337]); + }); + + it('should extract the tokens for a single unitless numeric negative value', () => { + const tokens = cssValueLexer('-33.3'); + + expect(tokens).toEqual([-33.3]); + }); + + it('should extract the tokens for a list of numeric values', () => { + const tokens = cssValueLexer('42px 13.37rem 0%'); + + expect(tokens).toEqual([42, 'px', 13.37, 'rem', 0, '%']); + }); + + it('should extract the tokens for a numeric value with negative numbers', () => { + const tokens = cssValueLexer('42px -13.37px 0rem -25%'); + + expect(tokens).toEqual([42, 'px', -13.37, 'px', 0, 'rem', -25, '%']); + }); + + it('should extract the tokens for a simple transform value', () => { + const tokens = cssValueLexer('translateX(42%)'); + + expect(tokens).toEqual(['translateX', 42, '%']); + }); + + it('should extract the tokens for a transform value with a single function with multiple parameters', () => { + const tokens = cssValueLexer('translate(42%, 0px)'); + + expect(tokens).toEqual(['translate', 42, '%', 0, 'px']); + }); + + it('should extract the tokens for a transform value with multiple functions with multiple parameters', () => { + const tokens = cssValueLexer('translate(42%, 0px) scale(1.5) rotate(180deg)'); + + expect(tokens).toEqual(['translate', 42, '%', 0, 'px', 'scale', 1.5, 'rotate', 180, 'deg']); + }); + + it('should extract the tokens for a transform value with negative numbers', () => { + const tokens = cssValueLexer('translate(42%, -13.37px) scale(-2)'); + + expect(tokens).toEqual(['translate', 42, '%', -13.37, 'px', 'scale', -2]); + }); +}); diff --git a/adev/src/app/features/home/animation/parser/css-value-lexer.ts b/adev/src/app/features/home/animation/parser/css-value-lexer.ts new file mode 100644 index 000000000000..e5c185c4548d --- /dev/null +++ b/adev/src/app/features/home/animation/parser/css-value-lexer.ts @@ -0,0 +1,125 @@ +/*! + * @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.dev/license + */ + +type CharType = + | 'letter' + | 'digit' + | 'point' + | 'comma' + | 'hyphen' + | 'hash' + | 'percent' + | 'space' + | 'bracket' + | 'unknown'; + +type BufferType = 'text' | 'color' | 'number' | null; + +// Symbols/`CharType`-s that mark the end of a token +// but should not be included as such. +const END_SYMBOLS: CharType[] = ['space', 'bracket', 'comma']; + +/** + * Extract tokens from a CSS property value string. + * + * @param value CSS property value + * @returns Tokens in the form of strings and numbers + */ +export function cssValueLexer(value: string): (string | number)[] { + const tokens: (string | number)[] = []; + let buffer = ''; + let bufferType: BufferType | null = null; + + const addToken = () => tokens.push(bufferType === 'number' ? parseFloat(buffer) : buffer); + + for (const char of value) { + const charType = getCharType(char); + const newBufferType = getBufferType(charType, bufferType); + + // Check if token end has been reached + if (END_SYMBOLS.includes(charType) && buffer) { + addToken(); + buffer = ''; + bufferType = null; + } else if (newBufferType !== null) { + if (newBufferType !== bufferType && bufferType !== null) { + // Handle a new token/token change + addToken(); + buffer = char; + bufferType = newBufferType; + } else if (newBufferType === bufferType || bufferType === null) { + // Accumulate token string + buffer += char; + bufferType = newBufferType; + } + } + } + + // If the buffer is still filled, + // add the remaing as the last token + if (buffer) { + addToken(); + } + + return tokens; +} + +/** Get the `CharType` of a character. */ +function getCharType(char: string): CharType { + if (char === '.') { + return 'point'; + } + if (char === '-') { + return 'hyphen'; + } + if (char === ',') { + return 'comma'; + } + if (char === '%') { + return 'percent'; + } + if (char === '#') { + return 'hash'; + } + if (char === ' ') { + return 'space'; + } + if (char === '(' || char === ')') { + return 'bracket'; + } + + const code = char.charCodeAt(0); + + if (48 <= code && code <= 57) { + return 'digit'; + } + if ((65 <= code && code <= 90) || (97 <= code && code <= 122)) { + return 'letter'; + } + return 'unknown'; +} + +/** Get the lexer buffer type of a `CharType`. */ +function getBufferType(type: CharType, currentBuffer: BufferType): BufferType { + const colorSymbols: CharType[] = ['hash']; + if (colorSymbols.includes(type) || currentBuffer === 'color') { + return 'color'; + } + + const textSymbols: CharType[] = ['letter', 'percent']; + if (textSymbols.includes(type)) { + return 'text'; + } + + const numberSymbols: CharType[] = ['digit', 'point', 'hyphen']; + if (numberSymbols.includes(type)) { + return 'number'; + } + + return null; +} diff --git a/adev/src/app/features/home/animation/parser/css-value-parser.spec.ts b/adev/src/app/features/home/animation/parser/css-value-parser.spec.ts new file mode 100644 index 000000000000..b42f2e9c39ac --- /dev/null +++ b/adev/src/app/features/home/animation/parser/css-value-parser.spec.ts @@ -0,0 +1,286 @@ +/*! + * @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.dev/license + */ + +import {cssValueParser} from './css-value-parser'; + +describe('css-value-parser', () => { + it('should parse a simple static value', () => { + const value = cssValueParser('block'); + + expect(value).toEqual({ + type: 'static', + value: 'block', + }); + }); + + it('should parse a hex color value', () => { + const value = cssValueParser('#ff7d00'); + + expect(value).toEqual({ + type: 'color', + value: ['rgb', 255, 125, 0], + }); + }); + + it('should parse a short hex color value', () => { + const value = cssValueParser('#f0f'); + + expect(value).toEqual({ + type: 'color', + value: ['rgb', 255, 0, 255], + }); + }); + + it('should parse a hex color value with upper case letters', () => { + const value = cssValueParser('#AABBFF'); + + expect(value).toEqual({ + type: 'color', + value: ['rgb', 170, 187, 255], + }); + }); + + it('should parse an RGB color value', () => { + const value = cssValueParser('rgb(255, 255, 0)'); + + expect(value).toEqual({ + type: 'color', + value: ['rgb', 255, 255, 0], + }); + }); + + it('should parse an RGBA color value', () => { + const value = cssValueParser('rgba(255, 255, 0, 0.75)'); + + expect(value).toEqual({ + type: 'color', + value: ['rgba', 255, 255, 0, 0.75], + }); + }); + + it('should parse a single numeric integer value', () => { + const value = cssValueParser('42px'); + + expect(value).toEqual({ + type: 'numeric', + values: [[42, 'px']], + }); + }); + + it('should parse a single numberic decimal value', () => { + const value = cssValueParser('66.6%'); + + expect(value).toEqual({ + type: 'numeric', + values: [[66.6, '%']], + }); + }); + + it('should parse a single negative numberic value', () => { + const value = cssValueParser('-50%'); + + expect(value).toEqual({ + type: 'numeric', + values: [[-50, '%']], + }); + }); + + it('should parse a single unitless numberic value', () => { + const value = cssValueParser('1337'); + + expect(value).toEqual({ + type: 'numeric', + values: [[1337, '']], + }); + }); + + it('should parse a list of numeric values', () => { + const value = cssValueParser('42px 13.37rem 0%'); + + expect(value).toEqual({ + type: 'numeric', + values: [ + [42, 'px'], + [13.37, 'rem'], + [0, '%'], + ], + }); + }); + + it('should parse a list of unitless numeric values', () => { + const value = cssValueParser('42 13.37 0'); + + expect(value).toEqual({ + type: 'numeric', + values: [ + [42, ''], + [13.37, ''], + [0, ''], + ], + }); + }); + + it('should parse a list of negative and positive numeric values', () => { + const value = cssValueParser('42% -13.37px 0rem -100vw'); + + expect(value).toEqual({ + type: 'numeric', + values: [ + [42, '%'], + [-13.37, 'px'], + [0, 'rem'], + [-100, 'vw'], + ], + }); + }); + + it('should parse a list of negative and positive unitless numeric values', () => { + const value = cssValueParser('42 -13.37 0 -100'); + + expect(value).toEqual({ + type: 'numeric', + values: [ + [42, ''], + [-13.37, ''], + [0, ''], + [-100, ''], + ], + }); + }); + + it('should parse a list of numeric values with and without units', () => { + const value = cssValueParser('13 37px -3.14 66.6rem'); + + expect(value).toEqual({ + type: 'numeric', + values: [ + [13, ''], + [37, 'px'], + [-3.14, ''], + [66.6, 'rem'], + ], + }); + }); + + it('should parse a simple transform value', () => { + const value = cssValueParser('translateX(42%)'); + + expect(value).toEqual({ + type: 'transform', + values: new Map([['translateX', [[42, '%']]]]), + }); + }); + + it('should parse a transform value with a single function with multiple parameters', () => { + const value = cssValueParser('translate(42%, 0px)'); + + expect(value).toEqual({ + type: 'transform', + values: new Map([ + [ + 'translate', + [ + [42, '%'], + [0, 'px'], + ], + ], + ]), + }); + }); + + it('should parse a transform value with a single function with a single unitless parameter', () => { + const value = cssValueParser('scale(1.5)'); + + expect(value).toEqual({ + type: 'transform', + values: new Map([['scale', [[1.5, '']]]]), + }); + }); + + it('should parse a transform value with a single function with multiple unitless parameter', () => { + const value = cssValueParser('scale(1.5, 42)'); + + expect(value).toEqual({ + type: 'transform', + values: new Map([ + [ + 'scale', + [ + [1.5, ''], + [42, ''], + ], + ], + ]), + }); + }); + + it('should parse a transform value with multiple functions with multiple parameters', () => { + const value = cssValueParser('translate(42%, 0px) scale(1.5) rotate(180deg)'); + + expect(value).toEqual({ + type: 'transform', + values: new Map([ + [ + 'translate', + [ + [42, '%'], + [0, 'px'], + ], + ], + ['scale', [[1.5, '']]], + ['rotate', [[180, 'deg']]], + ]), + }); + }); + + it('should parse a transform value with multiple functions with multiple parameters and negative values', () => { + const value = cssValueParser('translate(42%, -1px) scale(-1.5) rotate(180deg)'); + + expect(value).toEqual({ + type: 'transform', + values: new Map([ + [ + 'translate', + [ + [42, '%'], + [-1, 'px'], + ], + ], + ['scale', [[-1.5, '']]], + ['rotate', [[180, 'deg']]], + ]), + }); + }); + + it('should parse an unsupported transform value as a static one', () => { + const value = cssValueParser('matrix(1, 2, 3)'); + + expect(value).toEqual({ + type: 'static', + value: 'matrix(1, 2, 3)', + }); + }); + + it('should parse a transform value which function have both unit and unitless values as static', () => { + const value = cssValueParser('translate(42, 1337px)'); + + expect(value).toEqual({ + type: 'static', + value: 'translate(42, 1337px)', + }); + }); + + it('should parse a transform value with a function without parameters as a static one', () => { + const value = cssValueParser('translate()'); + + expect(value).toEqual({ + type: 'static', + value: 'translate()', + }); + }); +}); diff --git a/adev/src/app/features/home/animation/parser/css-value-parser.ts b/adev/src/app/features/home/animation/parser/css-value-parser.ts new file mode 100644 index 000000000000..c1940caf6277 --- /dev/null +++ b/adev/src/app/features/home/animation/parser/css-value-parser.ts @@ -0,0 +1,216 @@ +/*! + * @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.dev/license + */ + +import {cssValueLexer} from './css-value-lexer'; +import {ColorValue, CssPropertyValue, NumericValue, TransformValue} from './types'; + +// Transform functions that can be parsed +const SUPPORTED_FUNCS = [ + 'translate', + 'rotate', + 'scale', + 'skew', + 'translateX', + 'translateY', + 'translateZ', + 'scaleX', + 'scaleY', + 'scaleZ', + 'skewX', + 'skewY', +]; + +interface ParserHandler { + (tokens: (string | number)[]): CssPropertyValue | null; +} + +// +// Handlers +// + +const colorValuesHandler: ParserHandler = (tokens) => { + const token = tokens[0]; + if (typeof token === 'string') { + if (token.startsWith('#')) { + const channels = []; + + // Handle standard syntax: #ffffff + if (token.length === 7) { + let channelBuffer = ''; + // Skip the first element since it represents the type. + for (let i = 1; i < token.length; i++) { + channelBuffer += token[i]; + if (channelBuffer.length === 2) { + const dec = parseInt(channelBuffer, 16); + channels.push(dec); + channelBuffer = ''; + } + } + } else if (token.length === 4) { + // Handle shorthand color syntax: #fff + for (let i = 1; i < token.length; i++) { + const channel = token[i]; + const hex = channel + channel; + const dec = parseInt(hex, 16); + channels.push(dec); + } + } + + if (channels.length === 3) { + return { + type: 'color', + value: ['rgb', ...channels], + } as ColorValue; + } + } + // RGB and RGBA + if ((token === 'rgb' && tokens.length === 4) || (token === 'rgba' && tokens.length === 5)) { + return { + type: 'color', + value: tokens, + } as ColorValue; + } + } + return null; +}; + +const numericValueHandler: ParserHandler = (tokens) => { + if (typeof tokens[0] === 'number') { + const value: NumericValue = { + type: 'numeric', + values: [], + }; + let buffer = []; + + for (const token of tokens) { + if (typeof token === 'number') { + // Add a value to the list (with or without unit) + if (buffer.length) { + value.values.push((buffer.length === 1 ? [buffer[0], ''] : buffer) as [number, string]); + buffer = []; + } + + buffer.push(token); + } else if (buffer.length === 1) { + // If string, expect a numeric value (i.e. buffer.length == 1) in the buffer. + buffer.push(token); + } else { + // Any other case means, the value is invalid. + return null; + } + } + + // Add any remaining values in the buffer + if (buffer.length) { + value.values.push((buffer.length === 1 ? [buffer[0], ''] : buffer) as [number, string]); + } + + return value; + } + + return null; +}; + +const transformValueHandler: ParserHandler = (tokens) => { + if (tokens.length > 1 && typeof tokens[0] === 'string') { + const value: TransformValue = { + type: 'transform', + values: new Map(), + }; + let functionName = ''; + let paramPairs: [number, string][] = []; + let paramBuffer: unknown[] = []; + let isValid = true; + + const isBufferNumOnly = () => !paramBuffer.find((v) => typeof v === 'string'); + + for (const token of tokens) { + if (typeof token === 'string' && SUPPORTED_FUNCS.includes(token)) { + // If there is already an extracted function, add it to the values map + if (paramPairs.length || paramBuffer.length) { + // If the param buffer is full, this means that it doesn't + // match the usual [number, string][] pattern (i.e. it should be numbers-only) + if (paramBuffer.length) { + if (!isBufferNumOnly()) { + isValid = false; + break; + } + + const pairs = paramBuffer.map((v) => [v, ''] as [number, string]); + paramPairs = paramPairs.concat(pairs); + } + + value.values.set(functionName, paramPairs); + paramPairs = []; + paramBuffer = []; + } + + functionName = token; + } else if (functionName) { + // Handle standard param pairs – number + unit + paramBuffer.push(token); + + if ( + paramBuffer.length === 2 && + typeof paramBuffer[0] === 'number' && + typeof paramBuffer[1] === 'string' + ) { + paramPairs.push(paramBuffer as [number, string]); + paramBuffer = []; + } + } + } + + // Check for remaining functions after the loop has completed + if (functionName && (paramPairs.length || paramBuffer.length)) { + if (paramBuffer.length && isBufferNumOnly()) { + const pairs = paramBuffer.map((v) => [v, ''] as [number, string]); + paramPairs = paramPairs.concat(pairs); + } + + if (paramPairs.length) { + value.values.set(functionName, paramPairs); + } + } + + if (isValid && value.values.size) { + return value; + } + } + return null; +}; + +// Include all handlers that should be part of the parsing here. +const parserHandlers = [colorValuesHandler, numericValueHandler, transformValueHandler]; + +// +// Parser function +// + +/** + * Parse a string to a `CssPropertyValue`. + * + * @param value CSS property value + * @returns Parsed CSS property value + */ +export function cssValueParser(value: string): CssPropertyValue { + const tokens = cssValueLexer(value); + + for (const handler of parserHandlers) { + const value = handler(tokens); + if (value) { + return value; + } + } + + // If not handled + return { + type: 'static', + value, + }; +} diff --git a/adev/src/app/features/home/components/shaders/modules/easing/sine-in-out.glsl.ts b/adev/src/app/features/home/animation/parser/index.ts similarity index 58% rename from adev/src/app/features/home/components/shaders/modules/easing/sine-in-out.glsl.ts rename to adev/src/app/features/home/animation/parser/index.ts index 0cd58ef92bac..77afd84864fa 100644 --- a/adev/src/app/features/home/components/shaders/modules/easing/sine-in-out.glsl.ts +++ b/adev/src/app/features/home/animation/parser/index.ts @@ -6,12 +6,6 @@ * found in the LICENSE file at https://angular.dev/license */ -export default /* glsl */ ` -#ifndef PI -#define PI 3.141592653589793 -#endif - -float sineInOut(float t) { - return -0.5 * (cos(PI * t) - 1.0); -} -`; +export * from './types'; +export * from './utils'; +export {cssValueParser} from './css-value-parser'; diff --git a/adev/src/app/features/home/animation/parser/types.ts b/adev/src/app/features/home/animation/parser/types.ts new file mode 100644 index 000000000000..1683268563c3 --- /dev/null +++ b/adev/src/app/features/home/animation/parser/types.ts @@ -0,0 +1,31 @@ +/*! + * @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.dev/license + */ + +export type NumericValue = { + type: 'numeric'; + values: [number, string][]; +}; + +export type StaticValue = { + type: 'static'; + value: string; +}; + +export type ColorValue = { + type: 'color'; + value: ['rgb', number, number, number] | ['rgba', number, number, number, number]; + // red, green, blue, alpha? +}; + +export type TransformValue = { + type: 'transform'; + values: Map; // function name, parameters in the form of a numeric data +}; + +/** A parsed CSS property value. */ +export type CssPropertyValue = NumericValue | StaticValue | ColorValue | TransformValue; diff --git a/adev/src/app/features/home/animation/parser/utils.spec.ts b/adev/src/app/features/home/animation/parser/utils.spec.ts new file mode 100644 index 000000000000..a11c43202883 --- /dev/null +++ b/adev/src/app/features/home/animation/parser/utils.spec.ts @@ -0,0 +1,128 @@ +/*! + * @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.dev/license + */ + +import {stringifyParsedValue} from './utils'; + +describe('CSS Value Parser Utils', () => { + describe('stringifyParsedValue', () => { + it('should stringify a static value', () => { + const output = stringifyParsedValue({ + type: 'static', + value: 'block', + }); + + expect(output).toEqual('block'); + }); + + it('should stringify an RGB color value', () => { + const output = stringifyParsedValue({ + type: 'color', + value: ['rgb', 255, 255, 0], + }); + + expect(output).toEqual('rgb(255, 255, 0)'); + }); + + it('should stringify an RGBA color value', () => { + const output = stringifyParsedValue({ + type: 'color', + value: ['rgba', 255, 125, 0, 0.75], + }); + + expect(output).toEqual('rgba(255, 125, 0, 0.75)'); + }); + + it('should stringify a single numeric value', () => { + const output = stringifyParsedValue({ + type: 'numeric', + values: [[42, 'px']], + }); + + expect(output).toEqual('42px'); + }); + + it('should stringify a unitless numeric value', () => { + const output = stringifyParsedValue({ + type: 'numeric', + values: [[1337, '']], + }); + + expect(output).toEqual('1337'); + }); + + it('should stringify multiple numeric values', () => { + const output = stringifyParsedValue({ + type: 'numeric', + values: [ + [42, 'px'], + [13.37, '%'], + [0, 'rem'], + ], + }); + + expect(output).toEqual('42px 13.37% 0rem'); + }); + + it('should stringify multiple unitless values', () => { + const output = stringifyParsedValue({ + type: 'numeric', + values: [ + [42, ''], + [13.37, ''], + [0, ''], + ], + }); + + expect(output).toEqual('42 13.37 0'); + }); + + it('should stringify a transform value', () => { + const output = stringifyParsedValue({ + type: 'transform', + values: new Map([['translate', [[42, 'px']]]]), + }); + + expect(output).toEqual('translate(42px)'); + }); + + it('should stringify a transform value with a function with multiple paramters', () => { + const output = stringifyParsedValue({ + type: 'transform', + values: new Map([ + [ + 'translate', + [ + [42, 'px'], + [13.37, '%'], + ], + ], + ]), + }); + + expect(output).toEqual('translate(42px, 13.37%)'); + }); + + it('should stringify a transform value with multiple functions', () => { + const output = stringifyParsedValue({ + type: 'transform', + values: new Map([ + [ + 'translate', + [ + [42, 'px'], + [13.37, '%'], + ], + ], + ['scale', [[1.5, '']]], + ]), + }); + + expect(output).toEqual('translate(42px, 13.37%) scale(1.5)'); + }); + }); +}); diff --git a/adev/src/app/features/home/animation/parser/utils.ts b/adev/src/app/features/home/animation/parser/utils.ts new file mode 100644 index 000000000000..6efcd8360520 --- /dev/null +++ b/adev/src/app/features/home/animation/parser/utils.ts @@ -0,0 +1,48 @@ +/*! + * @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.dev/license + */ + +import {CssPropertyValue} from './types'; + +/** + * Convert a parsed CSS property value to its string representation. + * + * @param value Parsed CSS property value + * @returns String CSS property value + */ +export function stringifyParsedValue(value: CssPropertyValue): string { + switch (value.type) { + case 'numeric': + return value.values.map(([num, unit]) => num + unit).join(' '); + case 'transform': + return Array.from(value.values) + .map( + ([fnName, numData]) => + `${fnName}(${numData.map(([num, unit]) => num + unit).join(', ')})`, + ) + .join(' '); + case 'color': + const v = value.value; + let color = v[0] + '('; + for (let i = 1; i < v.length; i++) { + color += v[i] + (i < v.length - 1 ? ', ' : ''); + } + return color + ')'; + case 'static': + return value.value; + } +} + +/** + * Creates a deep copy of a parsed CSS property value. + * + * @param value Value to be copied + * @returns Copied value + */ +export function copyParsedValue(value: T): T { + return structuredClone(value); +} diff --git a/adev/src/app/features/home/animation/plugins/animation-player.component.ts b/adev/src/app/features/home/animation/plugins/animation-player.component.ts new file mode 100644 index 000000000000..64cc5695d054 --- /dev/null +++ b/adev/src/app/features/home/animation/plugins/animation-player.component.ts @@ -0,0 +1,123 @@ +/*! + * @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.dev/license + */ + +import {ChangeDetectionStrategy, Component, computed, signal} from '@angular/core'; +import {Animation} from '../animation'; + +// In milliseconds. Used for going forward or back through the animation. +const TIMESTEP = 100; + +export type ComponentAlignment = 'left' | 'center' | 'right'; + +/** + * Animation player component. + */ +@Component({ + selector: 'adev-animation-player', + changeDetection: ChangeDetectionStrategy.OnPush, + template: ` + @if (animation(); as anim) { +
+
+
+
+
+ + + + +
+
+ } + `, + styles: ` + .deck { + position: fixed; + left: 50%; + transform: translateX(-50%); + bottom: 30px; + padding: 10px; + border-radius: 12px; + background: rgba(0,0,0, 0.7); + backdrop-filter: blur(10px); + border: 1px solid rgba(255, 255, 255, 0.1); + z-index: 999999; + } + .deck.left { + left: 130px; + transform: initial; + } + .deck.right { + right: 30px; + left: initial; + transform: initial; + } + .progress-bar { + position: relative; + width: 400px; + height: 6px; + border-radius: 3px; + background-color: #444; + overflow: hidden; + margin-bottom: 10px; + cursor: pointer; + } + .progress { + position: absolute; + top: 0; + left: 0; + height: inherit; + background-color: #ba2391; + pointer-events: none; + } + .controls { + display: flex; + justify-content: center; + gap: 10px; + } + button { + width: 3Opx; + height: 30px; + border-radius: 7px; + background-color: #333; + font-size: 20px; + } + button:hover { + background-color: #444; + } + `, +}) +export class AnimationPlayerComponent { + animation = signal(null); + alignment = signal('center'); + TIMESTEP = TIMESTEP; + + progressPerc = computed(() => this.animation()!.progress() * 100 + '%'); + + playPause() { + const anim = this.animation()!; + + if (!anim.isPlaying()) { + anim.play(); + } else { + anim.pause(); + } + } + + seek(e: MouseEvent) { + const target = e.target as HTMLElement; + const progress = e.offsetX / target.clientWidth; + this.animation()!.seek(progress); + } +} diff --git a/adev/src/app/features/home/animation/plugins/animation-player.ts b/adev/src/app/features/home/animation/plugins/animation-player.ts new file mode 100644 index 000000000000..c00359154b0b --- /dev/null +++ b/adev/src/app/features/home/animation/plugins/animation-player.ts @@ -0,0 +1,40 @@ +/*! + * @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.dev/license + */ + +import {ComponentRef, ViewContainerRef} from '@angular/core'; +import {Animation} from '../animation'; +import {AnimationPlugin} from './types'; +import {AnimationPlayerComponent, ComponentAlignment} from './animation-player.component'; + +export class AnimationPlayer implements AnimationPlugin { + private cmpRef?: ComponentRef; + + /** + * USED FOR ANIMATION DEVELOPMENT. + * Remove imports to this file before shipping the animation. + * + * Animation player. + * + * @param hostVcr VCR of the animation host component. + * @param alignment Alignment of the player. Default: `center` + */ + constructor( + private hostVcr: ViewContainerRef, + private alignment?: ComponentAlignment, + ) {} + + init(animation: Animation) { + this.cmpRef = this.hostVcr.createComponent(AnimationPlayerComponent); + this.cmpRef.instance.animation.set(animation); + this.cmpRef.instance.alignment.set(this.alignment || 'center'); + } + + destroy() { + this.cmpRef?.destroy(); + } +} diff --git a/adev/src/app/features/home/animation/plugins/animation-scroll-handler.ts b/adev/src/app/features/home/animation/plugins/animation-scroll-handler.ts new file mode 100644 index 000000000000..60756e54eea4 --- /dev/null +++ b/adev/src/app/features/home/animation/plugins/animation-scroll-handler.ts @@ -0,0 +1,88 @@ +/*! + * @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.dev/license + */ + +import {ElementRef, Injector, Renderer2, RendererFactory2} from '@angular/core'; +import {WINDOW} from '@angular/docs'; +import {Animation} from '../animation'; +import {AnimationPlugin} from './types'; + +const RESIZE_DEBOUNCE = 500; + +export class AnimationScrollHandler implements AnimationPlugin { + private win: Window; + private renderer: Renderer2; + private unlisteners: (() => void)[] = []; + private scrollHeight: number = 0; + private spacer?: HTMLElement; + private resizeDebounceTimeout?: ReturnType; + + /** + * Enables page scroll control over the animation. + * + * @param hostElementRef `ElementRef` of the animation host component. + * @param injector + * @param addSpacer Enabled by default. Use when the position of the animation is `fixed`. + */ + constructor( + private hostElementRef: ElementRef, + injector: Injector, + private addSpacer: boolean = true, + ) { + this.win = injector.get(WINDOW); + this.renderer = injector.get(RendererFactory2).createRenderer(null, null); + } + + init(animation: Animation) { + // Calculate the total scroll height needed for the animation. + this.scrollHeight = animation.duration / animation.timestep; + + this.unlisteners.push( + this.renderer.listen(this.win, 'scroll', () => { + if (animation.isPlaying()) { + animation.pause(); + } + const progress = this.win.scrollY / this.scrollHeight; + animation.seek(progress); + }), + ); + + if (this.addSpacer) { + this.createSpacer(); + + this.unlisteners.push( + this.renderer.listen(this.win, 'resize', () => { + if (this.resizeDebounceTimeout) { + clearTimeout(this.resizeDebounceTimeout); + } + this.resizeDebounceTimeout = setTimeout(() => this.updateSpacerHeight(), RESIZE_DEBOUNCE); + }), + ); + } + } + + destroy() { + for (const unlisten of this.unlisteners) { + unlisten(); + } + } + + /** Creates and stores a spacer that occupies/creates the scrollable space needed for the animation. */ + private createSpacer() { + this.spacer = this.renderer.createElement('div'); + this.renderer.addClass(this.spacer, 'anim-scroll-spacer'); + this.updateSpacerHeight(); + + this.hostElementRef.nativeElement.appendChild(this.spacer); + } + + /** Update stored spacer's height. */ + private updateSpacerHeight() { + const spacerHeight = this.scrollHeight + this.win.innerHeight; + this.renderer.setStyle(this.spacer, 'height', spacerHeight + 'px'); + } +} diff --git a/adev/src/app/features/home/animation/plugins/types.ts b/adev/src/app/features/home/animation/plugins/types.ts new file mode 100644 index 000000000000..dcf7e0353bac --- /dev/null +++ b/adev/src/app/features/home/animation/plugins/types.ts @@ -0,0 +1,21 @@ +/*! + * @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.dev/license + */ + +import {Animation} from '../animation'; + +/** + * Animation plugin interface. + * Plugins can be added to an animation via `Animation.addPlugin()`. + */ +export interface AnimationPlugin { + /** Contains the plugin initialization login. */ + init(animation: Animation): void; + + /** Will be called on Animation disposal. */ + destroy(): void; +} diff --git a/adev/src/app/features/home/animation/types.ts b/adev/src/app/features/home/animation/types.ts new file mode 100644 index 000000000000..8d541ee6dbee --- /dev/null +++ b/adev/src/app/features/home/animation/types.ts @@ -0,0 +1,58 @@ +/*! + * @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.dev/license + */ + +import {CssPropertyValue} from './parser'; + +export type AnimationConfig = { + /** + * In milliseconds. How much the time increments or decrements when you go forward or back in time. + * In the case of auto play, the timestep virtually acts as FPS (frames per second). + * + * Default: `100` + */ + timestep: number; +}; + +export type Styles = {[key: string]: string}; + +export type ParsedStyles = {[key: string]: CssPropertyValue}; + +interface AnimationRuleBase { + /** + * Selector in the form of `LAYER_ID >> OBJECT_SELECTOR`. + * The object selector should be a class (prefixed with dot: `.my-class`) and is optional. + */ + selector: string; +} + +/** Animation definition */ +export interface DynamicAnimationRule extends AnimationRuleBase { + at?: never; + + /** In seconds. Marks the time frame between which the styles are applied (`[START, END]`). */ + timeframe: [number, number]; + /** Start styles. */ + from: T; + /** End styles. */ + to: T; +} + +export interface StaticAnimationRule extends AnimationRuleBase { + timeframe?: never; + + /** In seconds. Time at which the styles are applied. */ + at: number; + /** Styles to be applied. */ + styles: T; +} + +export type AnimationRule = + | DynamicAnimationRule + | StaticAnimationRule; + +export type AnimationDefinition = AnimationRule[]; diff --git a/adev/src/app/features/home/components/canvas.ts b/adev/src/app/features/home/components/canvas.ts deleted file mode 100644 index d0a9c01e2f98..000000000000 --- a/adev/src/app/features/home/components/canvas.ts +++ /dev/null @@ -1,335 +0,0 @@ -/*! - * @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.dev/license - */ - -import { - Camera, - Color, - Mesh, - OGLRenderingContext, - RenderTarget, - Renderer, - Transform, - Triangle, -} from 'ogl'; - -import {MaskProgram} from './programs/mask-program'; -import {GradientView} from './views/gradient-view'; -import {AngularView} from './views/angular-view'; -import {LinesView} from './views/lines-view'; -import {BuildView} from './views/build-view'; - -import {BREAKPOINT} from '../home-animation-constants'; - -/** - * Controller class for managing the WebGL canvas, OGL renderer and scenes. - */ -export class Canvas { - private renderer!: Renderer; - private gl!: OGLRenderingContext; - private gradientScene!: Transform; - private gradientCamera!: Camera; - private angularScene!: Transform; - private angularCamera!: Camera; - private linesScene!: Transform; - private linesCamera!: Camera; - private buildScene!: Transform; - private buildCamera!: Camera; - private screen!: Mesh; - private renderTargetA!: RenderTarget; - private renderTargetB!: RenderTarget; - private maskProgram!: MaskProgram; - - private currentClearColor: Color = new Color(); - private needsUpdate: boolean = false; - - gradient!: GradientView; - angular!: AngularView; - lines!: LinesView; - build!: BuildView; - - linesProgress = 0; - - /** - * Create the controller. - */ - constructor( - private readonly element: Element, - private readonly document: Document, - private readonly window: Window, - ) { - this.init(); - this.initMesh(); - this.initViews(); - } - - /** - * Initialize the OGL renderer and scenes. - */ - init(): void { - this.renderer = new Renderer({ - powerPreference: 'high-performance', - depth: false, - }); - this.gl = this.renderer.gl; - this.element.appendChild(this.gl.canvas as HTMLCanvasElement); - - // Gradient scene - this.gradientScene = new Transform(); - this.gradientCamera = new Camera(this.gl, { - left: -1, - right: 1, - top: 1, - bottom: -1, - near: 0, - far: 1, - }); - - // Angular scene - this.angularScene = new Transform(); - this.angularCamera = new Camera(this.gl, { - left: -1, - right: 1, - top: 1, - bottom: -1, - near: 0, - far: 1, - }); - - // Lines scene - this.linesScene = new Transform(); - this.linesCamera = new Camera(this.gl, {fov: 30, near: 0.5, far: 40}); - this.linesCamera.position.z = 10; - this.linesCamera.lookAt([0, 0, 0]); - - // Build scene - this.buildScene = new Transform(); - this.buildCamera = new Camera(this.gl, { - left: -1, - right: 1, - top: 1, - bottom: -1, - near: 0, - far: 1, - }); - } - - /** - * Initialize a fullscreen triangle geometry and mesh for rendering scene composites or - * post-processing, plus render targets and programs. - */ - initMesh(): void { - // Fullscreen triangle - const geometry = new Triangle(this.gl); - this.screen = new Mesh(this.gl, {geometry}); - this.screen.frustumCulled = false; - - // Render targets - this.renderTargetA = new RenderTarget(this.gl, {depth: false}); - this.renderTargetB = new RenderTarget(this.gl, {depth: false}); - - // Mask program - this.maskProgram = new MaskProgram(this.gl, this.window); - this.maskProgram.uniforms['tMap'].value = this.renderTargetA.texture; - this.maskProgram.uniforms['tMask'].value = this.renderTargetB.texture; - this.screen.program = this.maskProgram; - } - - /** - * Initialize views. - */ - initViews(): void { - this.gradient = new GradientView(this.gl, this.document, this.window); - this.gradientScene.addChild(this.gradient); - - this.angular = new AngularView(this.gl); - this.angularScene.addChild(this.angular); - - this.lines = new LinesView(this.gl); - this.linesScene.addChild(this.lines); - - this.build = new BuildView(this.gl, this.document); - this.buildScene.addChild(this.build); - } - - /** - * Theme event handler. - */ - theme(): void { - const rootStyle = getComputedStyle(this.document.querySelector(':root')!); - - this.currentClearColor.set(rootStyle.getPropertyValue('--webgl-page-background').trim()); - this.gl.clearColor( - ...(this.currentClearColor as unknown as [red: number, green: number, blue: number]), - 1, - ); - - // Views - this.gradient.theme(); - } - - /** - * Resize event handler. - */ - resize(width: number, height: number, dpr: number, scale: number): void { - this.renderer.dpr = dpr; - this.renderer.setSize(width, height); - - // Views - this.gradient.resize(width, height, dpr, scale); - this.angular.resize(width, height, dpr, scale); - this.build.resize(width, height, dpr, scale); - - // Gradient scene - this.gradientCamera.left = -width / 2; - this.gradientCamera.right = width / 2; - this.gradientCamera.top = height / 2; - this.gradientCamera.bottom = -height / 2; - this.gradientCamera.orthographic(); - // The camera position is offset for 2D positioning of objects top left - this.gradientCamera.position.x = width / 2; - this.gradientCamera.position.y = -height / 2; - - // Angular scene - this.angularCamera.left = -width / 2; - this.angularCamera.right = width / 2; - this.angularCamera.top = height / 2; - this.angularCamera.bottom = -height / 2; - this.angularCamera.orthographic(); - // The camera position is offset for 2D positioning of objects top left - this.angularCamera.position.x = width / 2; - this.angularCamera.position.y = -height / 2; - - // Lines scene - this.linesCamera.aspect = width / height; - this.linesCamera.perspective(); - - if (width < BREAKPOINT) { - this.linesCamera.position.z = 20; - } else { - this.linesCamera.position.z = height / 60; - } - - // Build scene - this.buildCamera.left = -width / 2; - this.buildCamera.right = width / 2; - this.buildCamera.top = height / 2; - this.buildCamera.bottom = -height / 2; - this.buildCamera.orthographic(); - // The camera position is offset for 2D positioning of objects top left - this.buildCamera.position.x = width / 2; - this.buildCamera.position.y = -height / 2; - - // Render targets - const effectiveWidth = width * dpr; - const effectiveHeight = height * dpr; - - this.renderTargetA.setSize(effectiveWidth, effectiveHeight); - this.renderTargetB.setSize(effectiveWidth, effectiveHeight); - } - - /** - * Update event handler. - */ - update(time: number, deltaTime: number, frame: number, progress: number): void { - // Reset gradient progress - if (progress >= 0 && progress <= 0.16) { - this.gradient.background.userData['progress'] = 0; - } - - this.gradient.update(time); - this.angular.update(); - this.lines.update(time); - this.build.update(); - - // Disable animation at end of page - if ( - !this.gradient.visible && - !this.angular.visible && - !this.lines.visible && - !this.build.visible - ) { - if (this.needsUpdate) { - this.needsUpdate = false; - } else { - return; - } - } else { - this.needsUpdate = true; - } - - const {renderer, renderTargetA, renderTargetB} = this; - - // Gradient pass - renderer.render({ - scene: this.gradientScene, - camera: this.gradientCamera, - target: renderTargetA, - }); - - // Angular pass (mask on transparent background) - this.gl.clearColor(0, 0, 0, 0); - renderer.render({ - scene: this.angularScene, - camera: this.angularCamera, - target: renderTargetB, - }); - - // Build pass (mask on transparent background) - renderer.render({ - scene: this.buildScene, - camera: this.buildCamera, - target: renderTargetB, - clear: false, - }); - - // Set clear color back to default - this.gl.clearColor( - ...(this.currentClearColor as unknown as [red: number, green: number, blue: number]), - 1, - ); - - // Mask pass (render to screen) - renderer.render({scene: this.screen}); - - // Camera parallax/pan/zoom by moving the entire scene - this.linesScene.position.z = -6 + 6 * (1 - (-0.5 + this.linesProgress)); - this.linesCamera.lookAt([0, 0, 0]); - - // Lines pass - renderer.render({ - scene: this.linesScene, - camera: this.linesCamera, - clear: false, - }); - } - - /** - * Promise for the views when they're ready. - */ - ready(): Promise { - return Promise.all([ - this.gradient.ready(), - this.angular.ready(), - this.lines.ready(), - this.build.ready(), - ]); - } - - /** - * Destroys the views, all child views and WebGL context. - */ - destroy(): void { - this.gradient.destroy(); - this.angular.destroy(); - this.lines.destroy(); - this.build.destroy(); - - const extension = this.gl.getExtension('WEBGL_lose_context'); - if (extension) extension.loseContext(); - } -} diff --git a/adev/src/app/features/home/components/home-animation/animation-definition.ts b/adev/src/app/features/home/components/home-animation/animation-definition.ts new file mode 100644 index 000000000000..bc8119cee8b7 --- /dev/null +++ b/adev/src/app/features/home/components/home-animation/animation-definition.ts @@ -0,0 +1,437 @@ +/*! + * @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.dev/license + */ + +import {AnimationDefinition, Styles} from '../../animation'; +import {AnimationRule} from '../../animation/types'; + +/** + * CONSTANTS + */ + +// Represents percentage of the total. +// Avoid using large waves (the total shouldn't be too big as well). +// Check meteorShower function for more details. +const FIRST_WAVE_METEORS = 0.05; +const SECOND_WAVE_METEORS = 0.15; +const THIRD_WAVE_METEORS = 0.25; + +// Use to increase or decrease the animation duration (i.e. a fine tuning parameter). +// Employed by `timeframe()` and `at()`. +const TIMING_MULTIPLIER = 1.55; + +export const ANIM_TIMESTEP = 10; // In milliseconds + +/** + * SELECTORS + */ + +const BANNERS_LAYER_ID = 'banners'; +const ADEV_BANNER = `${BANNERS_LAYER_ID} >> .adev-banner`; +const LEARN_ANGULAR_BTN = `${BANNERS_LAYER_ID} >> .learn-angular`; + +const LOGO_LAYER_ID = 'logo'; +const LOGO = `${LOGO_LAYER_ID} >> .logo`; +const SHIELD = `${LOGO_LAYER_ID} >> .shield`; +const SHIELD_MIDDLE = `${LOGO_LAYER_ID} >> .shield-middle`; +const SHIELD_BOTTOM_A_ARC = `${LOGO_LAYER_ID} >> .shield-bottom-a-arc`; +const SHIELD_BOTTOM_EXTENSION = `${LOGO_LAYER_ID} >> .shield-bottom-extension`; +const CAPITAL_A_LETTER = `${LOGO_LAYER_ID} >> .capt-a-letter`; +const N_LETTER = `${LOGO_LAYER_ID} >> .n-letter`; +const G_LETTER = `${LOGO_LAYER_ID} >> .g-letter`; +const U_LETTER = `${LOGO_LAYER_ID} >> .u-letter`; +const L_LETTER = `${LOGO_LAYER_ID} >> .l-letter`; +const A_LETTER = `${LOGO_LAYER_ID} >> .a-letter`; +const R_LETTER = `${LOGO_LAYER_ID} >> .r-letter`; + +const UWU_LAYER_ID = 'uwu'; + +const WORKS_AT_ANY_SCALE_LAYER_ID = 'works-at-any-scale'; + +const METEOR_FIELD_LAYER_ID = 'meteor-field'; +const METEOR_FIELD = `${METEOR_FIELD_LAYER_ID} >> .field`; +const METEORS = `${METEOR_FIELD_LAYER_ID} >> .meteor`; +const METEOR_ID = (id: number) => `${METEOR_FIELD_LAYER_ID} >> .mt-${id}`; + +const LOVED_BY_MILLIONS_LAYER_ID = 'loved-by-millions'; + +const BUILD_FOR_EVERYONE_LAYER_ID = 'build-for-everyone'; +const BUILD_FOR_EVERYONE_TITLE = `${BUILD_FOR_EVERYONE_LAYER_ID} >> .title`; + +/** + * ANIMATION/HELPER FUNCTIONS + */ + +// Timing functions (they employ `TIMING_MULTIPLIER`) – Use when setting the time of a rule. +const at = (at: number): number => at * TIMING_MULTIPLIER; +const timeframe = (from: number, to: number): [number, number] => [ + from * TIMING_MULTIPLIER, + to * TIMING_MULTIPLIER, +]; + +/** Duration: 1 second */ +function hideLetter(selector: string, startTime: number): AnimationRule { + return { + selector, + timeframe: timeframe(startTime, startTime + 1), + from: { + opacity: '1', + }, + to: { + opacity: '0', + }, + }; +} + +/** Duration: 1 to 2 seconds */ +function showMeteor(selector: string, startTime: number): AnimationRule { + const randomizedStartTime = startTime + Math.random(); // Up to +1 second (excl.) + return { + selector, + timeframe: timeframe(randomizedStartTime, randomizedStartTime + 1), + from: { + opacity: '0', + transform: 'translate(200%, 200%) scale(0.3)', + }, + to: { + opacity: '1', + transform: 'translate(0, 0) scale(1)', + }, + }; +} + +/** Duration: 1 to 2 seconds */ +function meteorShower( + startTime: number, + size: number, + total: number, + inUse: Set, +): AnimationDefinition { + const animations: AnimationRule[] = []; + + while (animations.length < size) { + // We pick a random meteor ID. + // If `inUse` is nearly full relative to `total`, + // we might run into a excessive amount of iterations + // until we fill `animation`. This is why we should keep + // the wave sizes (and their total) relatively small. + const id = Math.round(Math.random() * (total - 1) + 1); + + if (!inUse.has(id)) { + animations.push(showMeteor(METEOR_ID(id), startTime)); + inUse.add(id); + } + } + + return animations; +} + +/** + * DEFINITION + */ + +/** Generate the animation definition for the home page animation. */ +export function generateHomeAnimationDefinition( + isUwu: boolean, + meteorCount: number, +): AnimationDefinition { + // Banners and buttons layer + // ************************* + const bannersLayerAnim: AnimationDefinition = [ + { + selector: ADEV_BANNER, + timeframe: timeframe(2, 3), + from: { + transform: 'translateY(0)', + }, + to: { + transform: 'translateY(-200px)', + }, + }, + { + selector: LEARN_ANGULAR_BTN, + timeframe: timeframe(2.5, 3.5), + from: { + opacity: '1', + }, + to: { + opacity: '0', + }, + }, + { + selector: LEARN_ANGULAR_BTN, + at: at(4), + styles: { + visibility: 'hidden', + }, + }, + ]; + + // Logo layer animation + // ******************** + const logoLayerAnim: AnimationDefinition = [ + { + selector: LOGO, + timeframe: timeframe(0, 5), + from: { + transform: 'translateX(0)', + }, + to: { + transform: 'translateX(467px)', // Value based on the 1280x400 SVG view box + }, + }, + hideLetter(R_LETTER, 1), + hideLetter(A_LETTER, 1.5), + hideLetter(L_LETTER, 2), + hideLetter(U_LETTER, 2.5), + hideLetter(G_LETTER, 3), + hideLetter(N_LETTER, 3.5), + // Make sure that the last letter disappers at the end of layer transition, + // i.e. 4 + 1 = 5th second end time + hideLetter(CAPITAL_A_LETTER, 4), + { + selector: SHIELD_MIDDLE, + timeframe: timeframe(5.5, 5.6), + from: { + transform: 'scale(1)', + }, + to: { + transform: 'scale(0)', + }, + }, + { + selector: SHIELD_BOTTOM_A_ARC, + timeframe: timeframe(5.5, 5.6), + from: { + transform: 'scaleY(1)', + }, + to: { + transform: 'scaleY(0)', + }, + }, + { + selector: SHIELD_BOTTOM_EXTENSION, + timeframe: timeframe(5.5, 5.6), + from: { + transform: 'scale(0)', + }, + to: { + transform: 'scale(1)', + }, + }, + { + selector: SHIELD, + timeframe: timeframe(5.5, 10), + from: { + transform: 'scale(1) rotate(0deg)', + }, + to: { + transform: 'scale(50) rotate(-360deg)', + }, + }, + ]; + + // "UwU logo" layer animation + // ************************** + const uwuLayerAnimation: AnimationDefinition = [ + { + selector: UWU_LAYER_ID, + timeframe: timeframe(0, 5.5), + from: { + transform: 'scale(1)', + }, + to: { + transform: 'scale(0)', + }, + }, + { + selector: UWU_LAYER_ID, + timeframe: timeframe(4, 5.5), + from: { + opacity: '1', + }, + to: { + opacity: '0', + }, + }, + ]; + + // "Works at any scale" layer animation + // ************************************ + const waasLayerAnim: AnimationDefinition = [ + { + selector: WORKS_AT_ANY_SCALE_LAYER_ID, + timeframe: timeframe(5.7, 8), // Make sure it appears after SHIELD_MIDDLE disappears. + from: { + transform: 'scale(0.1)', + opacity: '0', + }, + to: { + transform: 'scale(1)', + opacity: '1', + }, + }, + { + selector: WORKS_AT_ANY_SCALE_LAYER_ID, + timeframe: timeframe(11, 12.5), + from: { + transform: 'scale(1)', + opacity: '1', + }, + to: { + transform: 'scale(1.5)', + opacity: '0', + }, + }, + ]; + + // Meteor field layer animation + // **************************** + const firstWaveSize = meteorCount * FIRST_WAVE_METEORS; + const secondWaveSize = meteorCount * SECOND_WAVE_METEORS; + const thirdWaveSize = meteorCount * THIRD_WAVE_METEORS; + + const meteorsInUse = new Set(); + const firstWave = meteorShower(8, firstWaveSize, meteorCount, meteorsInUse); + const secondWave = meteorShower(10, secondWaveSize, meteorCount, meteorsInUse); + const thirdWave = meteorShower(12, thirdWaveSize, meteorCount, meteorsInUse); + const lastWaveStart = 16; + + // For the last wave, just use the remaining meteors (don't use `meteorShower`). + const lastWave: AnimationRule[] = []; + for (let id = 1; id <= meteorCount; id++) { + if (!meteorsInUse.has(id)) { + lastWave.push(showMeteor(METEOR_ID(id), lastWaveStart)); + } + } + + const meteorFieldLayerAnim: AnimationDefinition = [ + { + selector: METEOR_FIELD, + at: at(7), + styles: { + display: 'flex', + }, + }, + { + selector: METEOR_FIELD, + timeframe: timeframe(8, 18), + from: { + transform: 'scale(1.42)', + }, + to: { + transform: 'scale(1)', + }, + }, + ...firstWave, + ...secondWave, + ...thirdWave, + ...lastWave, + { + selector: METEORS, + timeframe: timeframe(19.5, 21), + from: { + transform: 'translate(0, 0) scale(1)', + }, + to: { + transform: 'translate(-200%, -200%) scale(0.3)', + }, + }, + { + selector: METEOR_FIELD, + timeframe: timeframe(19.5, 21), + from: { + opacity: '1', + }, + to: { + opacity: '0', + }, + }, + { + selector: METEOR_FIELD, + at: at(22), + styles: { + display: 'none', + }, + }, + ]; + + // "Loved by millions" layer animation + // *********************************** + const lovedByMillionsAnim: AnimationDefinition = [ + { + selector: LOVED_BY_MILLIONS_LAYER_ID, + timeframe: timeframe(14, 15.5), + from: { + transform: 'scale(0.75)', + opacity: '0', + }, + to: { + transform: 'scale(1)', + opacity: '1', + }, + }, + { + selector: LOVED_BY_MILLIONS_LAYER_ID, + timeframe: timeframe(19, 20.5), + from: { + transform: 'scale(1)', + opacity: '1', + }, + to: { + transform: 'scale(1.5)', + opacity: '0', + }, + }, + ]; + + // "Build for everyone" layer + // ************************** + const buildForEveryoneAnim: AnimationDefinition = [ + { + selector: BUILD_FOR_EVERYONE_LAYER_ID, + timeframe: timeframe(22, 25), + from: { + transform: 'scale(0.75)', + opacity: '0', + }, + to: { + transform: 'scale(1)', + opacity: '1', + }, + }, + { + selector: BUILD_FOR_EVERYONE_TITLE, + timeframe: timeframe(23, 25), + from: { + 'background-position-x': '100%', + }, + to: { + 'background-position-x': '0', + }, + }, + { + selector: BUILD_FOR_EVERYONE_LAYER_ID, + timeframe: timeframe(29, 31.5), + from: { + opacity: '1', + }, + to: { + opacity: '0', + }, + }, + ]; + + return [ + ...bannersLayerAnim, + ...(!isUwu ? logoLayerAnim : uwuLayerAnimation), + ...waasLayerAnim, + ...meteorFieldLayerAnim, + ...lovedByMillionsAnim, + ...buildForEveryoneAnim, + ]; +} diff --git a/adev/src/app/features/home/components/home-animation/home-animation.component.html b/adev/src/app/features/home/components/home-animation/home-animation.component.html new file mode 100644 index 000000000000..a599d9eefada --- /dev/null +++ b/adev/src/app/features/home/components/home-animation/home-animation.component.html @@ -0,0 +1,142 @@ +
+ + + + @if (!isUwu()) { + +
+ + + + + + + + + + + + + + + +
+ } @else { + +
+ Angular logo +
+ } + + +
+

Works at any scale

+

+ Angular lets you start small on a well-lit path and supports you as your team and apps grow. +

+
+ + + @if (meteorFieldData(); as meteorFieldData) { +
+
+ @for (type of meteors(); track $index) { +
+ } +
+
+ } + + +
+

Loved by millions

+

+ Join the millions of developers all over the world building with Angular in a thriving and + friendly community. +

+
+ + +
+

Build for everyone

+

+ Rely on Angular's built-in hydration, internationalization, security, and accessibility + support to build for everyone around the world. +

+
+
diff --git a/adev/src/app/features/home/components/home-animation/home-animation.component.scss b/adev/src/app/features/home/components/home-animation/home-animation.component.scss new file mode 100644 index 000000000000..f34850d587f8 --- /dev/null +++ b/adev/src/app/features/home/components/home-animation/home-animation.component.scss @@ -0,0 +1,397 @@ +@use 'sass:math'; +@use '@angular/docs/styles/media-queries' as mq; + +/* + * Global transition. + * + * Scrolling via mouse scroll wheel will result in a non-continuous scrollY, + * unlike a touchpad, which in turn results in "gaps" in the animation calculations. + * Therefore, in order to keep things smooth, we are systematically adding CSS + * transitions to the CSS properties that else look jagged when scrolling. + */ +$transition: 200ms linear; + +:host { + display: block; + position: relative; + + .animation { + position: fixed; + top: 0; + bottom: 0; + right: 0; + left: 0; + + .layer { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + + h2 { + font-size: 4vw; + font-weight: 600; + white-space: nowrap; + margin-top: 0; + margin-bottom: 0.5em; + z-index: 1; + + @include mq.for-tablet-landscape-down { + & { + font-size: 2rem; + } + } + } + + p { + font-weight: 400; + color: var(--quaternary-contrast); + font-size: clamp(1rem, 1vw, 2rem); + line-height: 1.5; + width: clamp(375px, 50%, 600px); + margin: 0 auto; + } + + h2, + p { + background-color: var(--page-background); + box-shadow: 0 0 20px 20px var(--page-background); + + @include mq.for-desktop-down { + box-shadow: 0 0 10px 10px var(--page-background); + } + } + } + + .banners-layer { + z-index: 10; + + .adev-banner { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: 0.5rem; + border: 1px solid var(--senary-contrast); + background: var(--page-background); + position: absolute; + border-radius: 0.25rem; + padding: 10px; + max-width: 100%; + width: fit-content; + box-sizing: border-box; + transition: + background 0.3s ease, + border 0.3s ease, + transform $transition; + top: var(--layout-padding); + left: calc(var(--layout-padding) + var(--primary-nav-width)); + + @include mq.for-tablet-landscape-down { + & { + top: 6rem; + left: var(--layout-padding); + } + } + + @include mq.for-phone-only { + & { + top: 5rem; + } + } + + h1, + p { + display: inline; + font-size: 0.875rem; + margin: 0; + background-image: var(--red-to-pink-to-purple-horizontal-gradient); + background-clip: text; + color: transparent; + width: fit-content; + font-weight: 500; + box-shadow: none; + position: relative; + + &.adev-banner-cta { + color: var(--tertiary-contrast); + + &::after { + content: ''; + position: absolute; + width: 100%; + transform: scaleX(0); + height: 1px; + bottom: -2px; + left: 0; + background: var(--red-to-pink-to-purple-horizontal-gradient); + transform-origin: bottom right; + transition: transform 0.3s ease; + } + } + } + + &:hover { + .adev-banner-cta { + &::after { + transform: scaleX(1); + transform-origin: bottom left; + } + } + } + } + + .learn-angular { + position: absolute; + left: 50%; + bottom: 5%; + transform: translateX(-50%); + transition: opacity $transition; + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + gap: 50px; + + button { + font-size: 1rem; + padding: 1rem 1.75rem; + + &::after { + font-size: 1rem; + } + } + + .adev-arrow { + transform: rotate(45deg); + border: solid var(--primary-contrast); + border-width: 0 2px 2px 0; + display: inline-block; + padding: 7px; + } + } + } + + .logo-layer { + user-select: none; + pointer-events: none; + + .svg { + position: absolute; + width: 100%; + height: 100%; + fill-rule: evenodd; + clip-rule: evenodd; + stroke-linejoin: round; + stroke-miterlimit: 2; + } + + .wrapper { + transform: scale(0.55); + transform-origin: 50% 50%; + + @include mq.for-tablet-down { + & { + transform: scale(0.8); + } + } + + @include mq.for-big-desktop-up { + & { + transform: scale(0.5); + } + } + + .logo { + transition: transform $transition; + + .shield { + /* `transform-origin` values are calculated based on the 1280x400 SVG view box */ + + &, + .shield-middle { + transform-origin: 177px 200px; + transition: transform $transition; + } + + .shield-bottom-a-arc { + transform-origin: 0 302px; + transition: transform $transition; + } + + .shield-bottom-extension { + transform-origin: 177px 340px; + transition: transform $transition; + transform: scale(0); + } + } + + .letter { + transition: opacity $transition; + } + } + } + } + + .uwu-layer { + display: flex; + align-items: center; + justify-content: center; + transition: + transform $transition, + opacity $transition; + + img { + user-select: none; + width: max(calc(700 * min(100vw, 2560px) / 1470), 350px); + height: auto; + } + } + + .works-at-any-scale-layer, + .loved-by-millions-layer, + .build-for-everyone-layer { + user-select: none; + pointer-events: none; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + text-align: center; + opacity: 0; + z-index: 1; + transition: + transform $transition, + opacity $transition; + } + + .works-at-any-scale-layer { + transform: scale(0); + } + + .loved-by-millions-layer, + .build-for-everyone-layer { + transform: scale(0.75); + } + + .build-for-everyone-layer { + .title { + color: transparent; + display: inline-block; + background: linear-gradient(110deg, #f31a5b 0, #8737e9 50%, #3a373f 0%); + background-size: 205% 100%; + background-clip: text; + background-size: 205% 100%; + background-position-x: 100%; + transition: background-position-x $transition; + } + } + + .meteor-field-layer { + overflow: hidden; + + .field { + --math-pi: #{math.$pi}rad; + + position: absolute; + flex-wrap: wrap; + align-content: flex-start; + gap: var(--meteor-gap); + display: none; + transform: scale(1.42); + top: 0; + left: 0; + transform-origin: 50% 50%; + transition: + opacity $transition, + transform $transition; + + .meteor { + position: relative; + width: var(--meteor-width); + height: var(--meteor-height); + opacity: 0; + transform: translate(200%, 200%) scale(0.3); + transition: + opacity $transition, + transform $transition; + + &::after { + content: ''; + position: absolute; + width: 4px; + height: var(--meteor-tail-length); + border-radius: 2px; + transform-origin: top center; + transform: rotate(var(--meteor-tilt-angle)); + top: 0; + left: 0; + } + + @mixin meteor-gradient($startColor, $endColor) { + background: linear-gradient( + calc(var(--math-pi) + var(--meteor-tilt-angle)), + $startColor 0, + $endColor 66%, + transparent 100% + ); + } + + &.type-1::after { + @include meteor-gradient(rgb(228, 49, 85), rgb(219, 64, 219)); + } + + &.type-2::after { + @include meteor-gradient(rgb(152, 56, 226), rgb(217, 18, 167)); + } + + &.type-3::after { + @include meteor-gradient(rgb(214, 53, 150), rgb(229, 91, 229)); + } + } + } + } + + &.reduced-motion { + position: relative; + + .banners-layer { + height: 100vh; + + @include mq.for-phone-only { + .adev-banner { + top: 6rem; + } + } + + @include mq.for-tablet-landscape-up { + .adev-banner { + left: var(--layout-padding); + } + } + } + + .logo-layer { + position: relative; + height: 100vh; + + @include mq.for-tablet-landscape-down { + margin-top: -75px; + } + } + + .works-at-any-scale-layer, + .loved-by-millions-layer, + .build-for-everyone-layer { + position: relative; + height: 120vh; + opacity: 1; + transform: scale(1); + } + + .build-for-everyone-layer > .title { + background-position-x: 0; + } + } + } +} diff --git a/adev/src/app/features/home/components/home-animation/home-animation.component.ts b/adev/src/app/features/home/components/home-animation/home-animation.component.ts new file mode 100644 index 000000000000..dd7f8fdd0891 --- /dev/null +++ b/adev/src/app/features/home/components/home-animation/home-animation.component.ts @@ -0,0 +1,178 @@ +/*! + * @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.dev/license + */ + +import { + afterNextRender, + ChangeDetectionStrategy, + Component, + ElementRef, + inject, + Injector, + input, + OnDestroy, + output, + signal, + viewChildren, +} from '@angular/core'; +import {RouterLink} from '@angular/router'; +import {WINDOW, isIos, shouldReduceMotion} from '@angular/docs'; + +import {Animation, AnimationCreatorService, AnimationLayerDirective} from '../../animation'; +import {AnimationScrollHandler} from '../../animation/plugins/animation-scroll-handler'; +import {generateHomeAnimationDefinition, ANIM_TIMESTEP} from './animation-definition'; + +export const METEOR_HW_RATIO = 1.42; // Height to width ratio +export const METEOR_GAP_RATIO = 1.33; // Use 0.7 for WebGL-like field. Renders a lot of elements though. + +// A map with screen size to meteor width +export const METEOR_WIDTH_MAP = [ + [800, 60], + [1100, 90], +]; + +export const METEOR_WIDTH_DEFAULT = 120; // For screens larger than 1100px + +type MeteorDimensions = { + width: number; + height: number; + tailLength: number; + gap: number; + tiltAngle: number; // In radians +}; + +type MeteorFieldData = { + width: number; + height: number; + count: number; + marginLeft: number; + marginTop: number; +}; + +@Component({ + selector: 'adev-home-animation', + imports: [AnimationLayerDirective, RouterLink], + templateUrl: './home-animation.component.html', + styleUrl: './home-animation.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [AnimationCreatorService], +}) +export class HomeAnimationComponent implements OnDestroy { + private readonly win = inject(WINDOW); + private readonly animCreator = inject(AnimationCreatorService); + private readonly injector = inject(Injector); + private readonly elementRef = inject(ElementRef); + private animation?: Animation; + + readonly animationLayers = viewChildren(AnimationLayerDirective); + + readonly ctaLink = isIos ? 'overview' : 'tutorials/learn-angular'; + + readonly isUwu = input.required(); + readonly ready = output(); + + readonly reducedMotion = signal(shouldReduceMotion()); + readonly meteorFieldData = signal(null); + readonly meteors = signal([]); + + constructor() { + if (!this.reducedMotion()) { + this.initAnimation(); + } else { + this.ready.emit(true); + } + } + + ngOnDestroy() { + this.animation?.dispose(); + } + + private initAnimation() { + // Limitation: Meteor dimensions won't change on page resize + const meteorDimensions = this.calculateMeteorDimensions(); + const data = this.calculateMeteorFieldData(meteorDimensions); + this.setCssVariables(meteorDimensions); + this.meteorFieldData.set(data); + + // Generate a meteor field. The number represents the type [1, 3] + this.meteors.set(new Array(data.count).fill(1).map(() => Math.round(Math.random() * 2 + 1))); + + afterNextRender({ + read: () => { + this.animation = this.animCreator + .createAnimation(this.animationLayers(), { + timestep: ANIM_TIMESTEP, + }) + .define(generateHomeAnimationDefinition(this.isUwu(), this.meteors().length)) + .addPlugin(new AnimationScrollHandler(this.elementRef, this.injector)); + + this.ready.emit(true); + }, + }); + } + + /** Calculte the dimensions and sizes of a meteor – width, height, tail, tilt angle, etc. */ + private calculateMeteorDimensions(): MeteorDimensions { + let width = METEOR_WIDTH_DEFAULT; + + for (const [screenSize, meteorWidth] of METEOR_WIDTH_MAP) { + if (this.win.innerWidth <= screenSize) { + width = meteorWidth; + } + } + + const height = width * METEOR_HW_RATIO; + const gap = width * METEOR_GAP_RATIO; + + // Pythagorean theorem + some trigonometry + const tailLength = Math.sqrt(width * width + height * height); + const tiltAngle = -Math.asin(width / tailLength); + + return { + width, + height, + gap, + tailLength, + tiltAngle, + }; + } + + /** Calculate the number of meteors and size of the field. */ + private calculateMeteorFieldData(meteorDim: MeteorDimensions): MeteorFieldData { + const mW = meteorDim.width + meteorDim.gap; + const mH = meteorDim.height + meteorDim.gap; + let rows = 1; + let cols = 1; + + while (cols * mW - meteorDim.gap <= this.win.innerWidth) { + cols++; + } + while (rows * mH - meteorDim.gap <= this.win.innerHeight) { + rows++; + } + + const width = cols * mW - meteorDim.gap; + const height = rows * mH - meteorDim.gap; + + return { + count: rows * cols, + width, + height, + marginLeft: -(width - this.win.innerWidth) / 2, + marginTop: -(height - this.win.innerHeight) / 2, + }; + } + + private setCssVariables({width, height, tailLength, tiltAngle, gap}: MeteorDimensions) { + const styleRef = this.elementRef.nativeElement.style; + styleRef.setProperty('--meteor-width', width + 'px'); + styleRef.setProperty('--meteor-height', height + 'px'); + styleRef.setProperty('--meteor-tail-length', tailLength + 'px'); + styleRef.setProperty('--meteor-tilt-angle', tiltAngle + 'rad'); + styleRef.setProperty('--meteor-gap', gap + 'px'); + } +} diff --git a/adev/src/app/features/home/components/programs/basic-program.ts b/adev/src/app/features/home/components/programs/basic-program.ts deleted file mode 100644 index c0f3c9115313..000000000000 --- a/adev/src/app/features/home/components/programs/basic-program.ts +++ /dev/null @@ -1,37 +0,0 @@ -/*! - * @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.dev/license - */ - -import {OGLRenderingContext, Program, Texture} from 'ogl'; - -import BasicShader from '../shaders/basic-shader'; - -const {vertex100, fragment100, vertex300, fragment300} = BasicShader; - -/** - * Basic texture map shader program with alpha channel for the "Build for everyone" heading. - * - * @see {@link BasicShader} for the GLSL shader. - */ -export class BasicProgram extends Program { - /** - * Create the shader program. - */ - constructor(gl: OGLRenderingContext, texture: Texture) { - super(gl, { - uniforms: { - tMap: {value: texture}, - uAlpha: {value: 1}, - }, - vertex: gl.renderer.isWebgl2 ? vertex300 : vertex100, - fragment: gl.renderer.isWebgl2 ? fragment300 : fragment100, - transparent: true, - depthTest: false, - depthWrite: false, - }); - } -} diff --git a/adev/src/app/features/home/components/programs/glyph-program.ts b/adev/src/app/features/home/components/programs/glyph-program.ts deleted file mode 100644 index 60596b2de769..000000000000 --- a/adev/src/app/features/home/components/programs/glyph-program.ts +++ /dev/null @@ -1,43 +0,0 @@ -/*! - * @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.dev/license - */ - -import {Color, OGLRenderingContext, Program, Texture} from 'ogl'; - -import GlyphShader from '../shaders/glyph-shader'; - -const {vertex100, fragment100, vertex300, fragment300} = GlyphShader; - -/** - * Multi-channel signed distance field (MSDF) shader program for the inner triangle and "Angular" - * letters of the logo, and the "Build for everyone" heading. - * - * Textures generated with `msdfgen`, which includes support for advanced SVG decoding: - * `msdfgen -svg logo-lockup.svg -o logo-lockup-msdf.png -size 700 172 -testrender logo-lockup-render.png 700 172` - * `msdfgen -svg build-for-everyone.svg -o build-msdf.png -size 433 58 -autoframe -testrender build-render.png 433 58` - * - * @see {@link GlyphShader} for the GLSL shader. - */ -export class GlyphProgram extends Program { - /** - * Create the shader program. - */ - constructor(gl: OGLRenderingContext, texture: Texture, color: Color) { - super(gl, { - uniforms: { - tMap: {value: texture}, - uColor: {value: color}, - uAlpha: {value: 1}, - }, - vertex: gl.renderer.isWebgl2 ? vertex300 : vertex100, - fragment: gl.renderer.isWebgl2 ? fragment300 : fragment100, - transparent: true, - depthTest: false, - depthWrite: false, - }); - } -} diff --git a/adev/src/app/features/home/components/programs/gradient-program.ts b/adev/src/app/features/home/components/programs/gradient-program.ts deleted file mode 100644 index fa8629156040..000000000000 --- a/adev/src/app/features/home/components/programs/gradient-program.ts +++ /dev/null @@ -1,41 +0,0 @@ -/*! - * @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.dev/license - */ - -import {Color, OGLRenderingContext, Program, Texture} from 'ogl'; - -import GradientShader from '../shaders/gradient-shader'; - -const {vertex100, fragment100, vertex300, fragment300} = GradientShader; - -/** - * Gradient shader program for the background of the Angular logo. - * - * @see {@link GradientShader} for the GLSL shader. - */ -export class GradientProgram extends Program { - /** - * Create the shader program. - */ - constructor(gl: OGLRenderingContext, texture: Texture, window: Window) { - super(gl, { - uniforms: { - tMap: {value: texture}, - uGrayColor: {value: new Color(0xa39fa9)}, - uProgress: {value: 0}, - uAlpha: {value: 1}, - uDebug: {value: /[?&]gradient/.test(window.location.search) ? 1 : 0}, - uTime: {value: 0}, - }, - vertex: gl.renderer.isWebgl2 ? vertex300 : vertex100, - fragment: gl.renderer.isWebgl2 ? fragment300 : fragment100, - transparent: true, - depthTest: false, - depthWrite: false, - }); - } -} diff --git a/adev/src/app/features/home/components/programs/line-glyph-program.ts b/adev/src/app/features/home/components/programs/line-glyph-program.ts deleted file mode 100644 index 227958eaba9e..000000000000 --- a/adev/src/app/features/home/components/programs/line-glyph-program.ts +++ /dev/null @@ -1,43 +0,0 @@ -/*! - * @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.dev/license - */ - -import {Color, OGLRenderingContext, Program, Texture} from 'ogl'; - -import LineGlyphShader from '../shaders/line-glyph-shader'; - -const {vertex100, fragment100, vertex300, fragment300} = LineGlyphShader; - -/** - * Multi-channel signed distance field (MSDF) shader program for a line instance. - * - * Textures generated with `msdfgen`, which includes support for advanced SVG decoding: - * `msdfgen -svg line.svg -o line-msdf.png -size 235 300 -testrender line-render.png 235 300` - * - * @see {@link LineGlyphShader} for the GLSL shader. - */ -export class LineGlyphProgram extends Program { - /** - * Create the shader program. - */ - constructor(gl: OGLRenderingContext, texture: Texture) { - super(gl, { - uniforms: { - tMap: {value: texture}, - uPinkColor: {value: [new Color(0xf65fe3), new Color(0x873df5)]}, - uPurpleColor: {value: [new Color(0xb666f2), new Color(0xea3a8a)]}, - uRedColor: {value: [new Color(0xe92d64), new Color(0xf469e4)]}, - uTime: {value: 0}, - }, - vertex: gl.renderer.isWebgl2 ? vertex300 : vertex100, - fragment: gl.renderer.isWebgl2 ? fragment300 : fragment100, - transparent: true, - depthTest: false, - depthWrite: false, - }); - } -} diff --git a/adev/src/app/features/home/components/programs/logo-program.ts b/adev/src/app/features/home/components/programs/logo-program.ts deleted file mode 100644 index 46a18b006bef..000000000000 --- a/adev/src/app/features/home/components/programs/logo-program.ts +++ /dev/null @@ -1,38 +0,0 @@ -/*! - * @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.dev/license - */ - -import {Color, OGLRenderingContext, Program} from 'ogl'; - -import LogoShader from '../shaders/logo-shader'; - -const {vertex100, fragment100, vertex300, fragment300} = LogoShader; - -/** - * Signed distance field (SDF) shader program for the outer polygons of the logo. - * - * @see {@link LogoShader} for the GLSL shader. - */ -export class LogoProgram extends Program { - /** - * Create the shader program. - */ - constructor(gl: OGLRenderingContext, color: Color) { - super(gl, { - uniforms: { - uColor: {value: color}, - uProgress: {value: 0}, - uAlpha: {value: 1}, - }, - vertex: gl.renderer.isWebgl2 ? vertex300 : vertex100, - fragment: gl.renderer.isWebgl2 ? fragment300 : fragment100, - transparent: true, - depthTest: false, - depthWrite: false, - }); - } -} diff --git a/adev/src/app/features/home/components/programs/mask-program.ts b/adev/src/app/features/home/components/programs/mask-program.ts deleted file mode 100644 index 6be4284a002c..000000000000 --- a/adev/src/app/features/home/components/programs/mask-program.ts +++ /dev/null @@ -1,41 +0,0 @@ -/*! - * @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.dev/license - */ - -import {OGLRenderingContext, Program} from 'ogl'; - -import MaskShader from '../shaders/mask-shader'; - -const {vertex100, fragment100, vertex300, fragment300} = MaskShader; - -/** - * Alpha mask shader program for the Angular logo. - * - * Uses the green channel of the mask texture as the output alpha channel of the gradient map - * texture, creating a mask of the logo with the gradient background inside the logo. - * - * @see {@link MaskShader} for the GLSL shader. - */ -export class MaskProgram extends Program { - /** - * Create the shader program. - */ - constructor(gl: OGLRenderingContext, window: Window) { - super(gl, { - uniforms: { - tMap: {value: null}, - tMask: {value: null}, - uDebug: {value: /[?&]debug|gradient/.test(window.location.search) ? 1 : 0}, - }, - vertex: gl.renderer.isWebgl2 ? vertex300 : vertex100, - fragment: gl.renderer.isWebgl2 ? fragment300 : fragment100, - transparent: true, - depthTest: false, - depthWrite: false, - }); - } -} diff --git a/adev/src/app/features/home/components/shaders/basic-shader.ts b/adev/src/app/features/home/components/shaders/basic-shader.ts deleted file mode 100644 index 6163d4401b19..000000000000 --- a/adev/src/app/features/home/components/shaders/basic-shader.ts +++ /dev/null @@ -1,58 +0,0 @@ -/*! - * @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.dev/license - */ - -const vertex = /* glsl */ ` -attribute vec3 position; -attribute vec2 uv; - -uniform mat4 modelViewMatrix; -uniform mat4 projectionMatrix; - -varying vec2 vUv; - -void main() { - vUv = uv; - - gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); -} -`; - -const fragment = /* glsl */ ` -precision highp float; - -uniform sampler2D tMap; -uniform float uAlpha; - -varying vec2 vUv; - -void main() { - gl_FragColor = texture2D(tMap, vUv); - gl_FragColor.a *= uAlpha; -} -`; - -export default { - vertex100: vertex, - - fragment100: /* glsl */ `#extension GL_OES_standard_derivatives : enable -precision highp float; -${fragment}`, - - vertex300: /* glsl */ `#version 300 es -#define attribute in -#define varying out -${vertex}`, - - fragment300: /* glsl */ `#version 300 es -precision highp float; -#define varying in -#define texture2D texture -#define gl_FragColor FragColor -out vec4 FragColor; -${fragment}`, -}; diff --git a/adev/src/app/features/home/components/shaders/glyph-shader.ts b/adev/src/app/features/home/components/shaders/glyph-shader.ts deleted file mode 100644 index eb48fd0f8fd1..000000000000 --- a/adev/src/app/features/home/components/shaders/glyph-shader.ts +++ /dev/null @@ -1,70 +0,0 @@ -/*! - * @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.dev/license - */ - -import msdf from './modules/msdf/msdf.glsl'; - -const vertex = /* glsl */ ` -attribute vec3 position; -attribute vec2 uv; - -uniform mat4 modelViewMatrix; -uniform mat4 projectionMatrix; - -varying vec2 vUv; - -void main() { - vUv = uv; - - gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); -} -`; - -const fragment = /* glsl */ ` -precision highp float; - -uniform sampler2D tMap; -uniform vec3 uColor; -uniform float uAlpha; - -varying vec2 vUv; - -${msdf} - -void main() { - float alpha = msdf(tMap, vUv); - alpha *= uAlpha; - - if (alpha < 0.01) { - discard; - } - - gl_FragColor.rgb = uColor; - gl_FragColor.a = alpha; -} -`; - -export default { - vertex100: vertex, - - fragment100: /* glsl */ `#extension GL_OES_standard_derivatives : enable -precision highp float; -${fragment}`, - - vertex300: /* glsl */ `#version 300 es -#define attribute in -#define varying out -${vertex}`, - - fragment300: /* glsl */ `#version 300 es -precision highp float; -#define varying in -#define texture2D texture -#define gl_FragColor FragColor -out vec4 FragColor; -${fragment}`, -}; diff --git a/adev/src/app/features/home/components/shaders/gradient-shader.ts b/adev/src/app/features/home/components/shaders/gradient-shader.ts deleted file mode 100644 index 15d229bd4670..000000000000 --- a/adev/src/app/features/home/components/shaders/gradient-shader.ts +++ /dev/null @@ -1,112 +0,0 @@ -/*! - * @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.dev/license - */ - -import sineInOut from './modules/easing/sine-in-out.glsl'; - -const vertex = /* glsl */ ` -attribute vec3 position; -attribute vec2 uv; - -uniform mat4 modelViewMatrix; -uniform mat4 projectionMatrix; - -varying vec2 vUv; - -void main() { - vUv = uv; - - gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); -} -`; - -const fragment = /* glsl */ ` -precision highp float; - -uniform sampler2D tMap; -uniform vec3 uGrayColor; -uniform float uProgress; -uniform float uAlpha; -uniform float uDebug; -uniform float uTime; - -varying vec2 vUv; - -${sineInOut} - -void main() { - float time = fract(uTime / 6.0); - float t = abs(2.0 * time - 1.0); - - // Rotation starts at 35.642°, 3 sec 180° and 6 sec 360° - float currentAngle = 35.642 + time * 360.0; - - vec2 uv = vUv; - uv.x -= 0.1 * (1.0 - sineInOut(t)); - - vec2 origin = vec2(0.5, 0.5); - uv -= origin; - - float angle = radians(currentAngle) + atan(uv.y, uv.x); - - float len = length(uv); - uv = vec2(cos(angle) * len, sin(angle) * len) + origin; - - gl_FragColor = texture2D(tMap, uv); - - if (uDebug == 1.0) { - // Anti-aliased outer circle - float radius = 0.5; - float d = fwidth(len); - float circle = smoothstep(radius - d, radius + d, len); - - gl_FragColor.a = (1.0 - circle) * uAlpha; - - // Anti-aliased center point - radius = 0.005; - circle = smoothstep(radius - d, radius + d, len); - - gl_FragColor.rgb = mix(vec3(1), gl_FragColor.rgb, circle); - } else { - gl_FragColor.a *= uAlpha; - } - - if (uProgress > 0.0) { - // Anti-aliased gray unfilled angle - float theta = radians(20.0); - uv = vec2(cos(theta) * vUv.x - sin(theta) * vUv.y, - sin(theta) * vUv.x + cos(theta) * vUv.y); - - float progress = 2.0 * uProgress - 1.0; - float d = 0.001; - float angle = smoothstep(uv.x - d, uv.x + d, progress); - - gl_FragColor.rgb = mix(uGrayColor, gl_FragColor.rgb, angle); - } -} -`; - -export default { - vertex100: vertex, - - fragment100: /* glsl */ `#extension GL_OES_standard_derivatives : enable -precision highp float; -${fragment}`, - - vertex300: /* glsl */ `#version 300 es -#define attribute in -#define varying out -${vertex}`, - - fragment300: /* glsl */ `#version 300 es -precision highp float; -#define varying in -#define texture2D texture -#define gl_FragColor FragColor -out vec4 FragColor; -${fragment}`, -}; diff --git a/adev/src/app/features/home/components/shaders/line-glyph-shader.ts b/adev/src/app/features/home/components/shaders/line-glyph-shader.ts deleted file mode 100644 index 0395edb6d44e..000000000000 --- a/adev/src/app/features/home/components/shaders/line-glyph-shader.ts +++ /dev/null @@ -1,108 +0,0 @@ -/*! - * @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.dev/license - */ - -import msdf from './modules/msdf/msdf.glsl'; - -const vertex = /* glsl */ ` -attribute vec3 position; -attribute vec2 uv; - -uniform mat4 modelViewMatrix; -uniform mat4 projectionMatrix; - -attribute mat4 instanceMatrix; -attribute float instanceColorIndex; -attribute float instanceRandom; -attribute float instanceOpacity; - -uniform vec3 uPinkColor[2]; -uniform vec3 uPurpleColor[2]; -uniform vec3 uRedColor[2]; - -varying vec2 vUv; -varying vec3 vColor[2]; -varying float vInstanceRandom; -varying float vInstanceOpacity; - -void main() { - vUv = uv; - - if (instanceColorIndex == 0.0) { - vColor[0] = uPinkColor[0]; - vColor[1] = uPinkColor[1]; - } else if (instanceColorIndex == 1.0) { - vColor[0] = uPurpleColor[0]; - vColor[1] = uPurpleColor[1]; - } else if (instanceColorIndex == 2.0) { - vColor[0] = uRedColor[0]; - vColor[1] = uRedColor[1]; - } - - vInstanceRandom = instanceRandom; - vInstanceOpacity = instanceOpacity; - - gl_Position = projectionMatrix * modelViewMatrix * instanceMatrix * vec4(position, 1.0); -} -`; - -const fragment = /* glsl */ ` -precision highp float; - -uniform sampler2D tMap; -uniform float uTime; - -varying vec2 vUv; -varying vec3 vColor[2]; -varying float vInstanceRandom; -varying float vInstanceOpacity; - -${msdf} - -void main() { - float alpha = msdf(tMap, vUv); - alpha *= vInstanceOpacity; - - if (alpha < 0.01) { - discard; - } - - vec2 uv = vUv; - uv.x += vInstanceRandom * uTime * 0.5; - - uv.x = fract(uv.x); // Wrap around 1.0 - - // Linear gradient, mirrored for wrapping - vec3 color = mix(vColor[0], vColor[1], smoothstep(0.0, 0.3333, uv.x)); - color = mix(color, vColor[1], smoothstep(0.3333, 0.6666, uv.x)); - color = mix(color, vColor[0], smoothstep(0.6666, 1.0, uv.x)); - - gl_FragColor.rgb = color; - gl_FragColor.a = smoothstep(1.0, 0.3333, vUv.x) * alpha; -} -`; - -export default { - vertex100: vertex, - - fragment100: /* glsl */ `#extension GL_OES_standard_derivatives : enable -precision highp float; -${fragment}`, - - vertex300: /* glsl */ `#version 300 es -#define attribute in -#define varying out -${vertex}`, - - fragment300: /* glsl */ `#version 300 es -precision highp float; -#define varying in -#define texture2D texture -#define gl_FragColor FragColor -out vec4 FragColor; -${fragment}`, -}; diff --git a/adev/src/app/features/home/components/shaders/logo-shader.ts b/adev/src/app/features/home/components/shaders/logo-shader.ts deleted file mode 100644 index ab58b310760c..000000000000 --- a/adev/src/app/features/home/components/shaders/logo-shader.ts +++ /dev/null @@ -1,103 +0,0 @@ -/*! - * @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.dev/license - */ - -import sdPolygon from './modules/sdf-primitives/sd-polygon.glsl'; - -const vertex = /* glsl */ ` -attribute vec3 position; -attribute vec2 uv; - -uniform mat4 modelViewMatrix; -uniform mat4 projectionMatrix; - -varying vec2 vUv; - -void main() { - vUv = uv; - - gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); -} -`; - -const fragment = /* glsl */ ` -precision highp float; - -uniform vec3 uColor; -uniform float uProgress; -uniform float uAlpha; - -varying vec2 vUv; - -#define MAX_NUM_VERTICES 5 - -${sdPolygon} - -void main() { - // Polygon animation - vec2[MAX_NUM_VERTICES] bottom; - bottom[0] = vec2(0.292446808510638, 1.0 - mix(0.7381, 0.7781, uProgress)); - bottom[1] = vec2(mix(0.239468085106383, 0.133085106382979, uProgress), 1.0 - mix(0.8592, 0.7781, uProgress)); - bottom[2] = vec2(0.50031914893617, 1.0 - 1.0); - bottom[3] = vec2(mix(0.761170212765957, 0.867553191489362, uProgress), 1.0 - mix(0.8592, 0.7781, uProgress)); - bottom[4] = vec2(0.707553191489362, 1.0 - mix(0.7381, 0.7781, uProgress)); - - vec2[MAX_NUM_VERTICES] right; - right[0] = vec2(mix(0.618404255319149, 0.597127659574468, uProgress), 1.0 - 0.0); - right[1] = vec2(0.964042553191489, 1.0 - mix(0.7023, 0.6623, uProgress)); - right[2] = vec2(1.0, 1.0 - 0.1665); - - vec2[MAX_NUM_VERTICES] left; - left[0] = vec2(mix(0.381595744680851, 0.402872340425532, uProgress), 1.0 - 0.0); - left[1] = vec2(0.035957446808511, 1.0 - mix(0.7023, 0.6623, uProgress)); - left[2] = vec2(0.0, 1.0 - 0.1665); - - float sdBottom = sdPolygon(vUv, bottom, 5); - float sdRight = sdPolygon(vUv, right, 3); - float sdLeft = sdPolygon(vUv, left, 3); - - // Anti-alias - float dBottom = fwidth(sdBottom); - float alphaBottom = smoothstep(dBottom, -dBottom, sdBottom); - float dRight = fwidth(sdRight); - float alphaRight = smoothstep(dRight, -dRight, sdRight); - float dLeft = fwidth(sdLeft); - float alphaLeft = smoothstep(dLeft, -dLeft, sdLeft); - - float alpha = max(alphaBottom, alphaRight); - alpha = max(alpha, alphaLeft); - alpha *= uAlpha; - - if (alpha < 0.01) { - discard; - } - - gl_FragColor.rgb = uColor; - gl_FragColor.a = alpha; -} -`; - -export default { - vertex100: vertex, - - fragment100: /* glsl */ `#extension GL_OES_standard_derivatives : enable -precision highp float; -${fragment}`, - - vertex300: /* glsl */ `#version 300 es -#define attribute in -#define varying out -${vertex}`, - - fragment300: /* glsl */ `#version 300 es -precision highp float; -#define varying in -#define texture2D texture -#define gl_FragColor FragColor -out vec4 FragColor; -${fragment}`, -}; diff --git a/adev/src/app/features/home/components/shaders/mask-shader.ts b/adev/src/app/features/home/components/shaders/mask-shader.ts deleted file mode 100644 index f8cb8d05d8af..000000000000 --- a/adev/src/app/features/home/components/shaders/mask-shader.ts +++ /dev/null @@ -1,60 +0,0 @@ -/*! - * @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.dev/license - */ - -const vertex = /* glsl */ ` -attribute vec3 position; -attribute vec2 uv; - -varying vec2 vUv; - -void main() { - vUv = uv; - - gl_Position = vec4(position, 1.0); -} -`; - -const fragment = /* glsl */ ` -precision highp float; - -uniform sampler2D tMap; -uniform sampler2D tMask; -uniform float uDebug; - -varying vec2 vUv; - -void main() { - if (uDebug == 1.0) { - gl_FragColor = max(texture2D(tMap, vUv), texture2D(tMask, vUv)); - } else { - gl_FragColor = texture2D(tMap, vUv); - gl_FragColor.a = texture2D(tMask, vUv).g; - } -} -`; - -export default { - vertex100: vertex, - - fragment100: /* glsl */ `#extension GL_OES_standard_derivatives : enable -precision highp float; -${fragment}`, - - vertex300: /* glsl */ `#version 300 es -#define attribute in -#define varying out -${vertex}`, - - fragment300: /* glsl */ `#version 300 es -precision highp float; -#define varying in -#define texture2D texture -#define gl_FragColor FragColor -out vec4 FragColor; -${fragment}`, -}; diff --git a/adev/src/app/features/home/components/shaders/modules/msdf/msdf.glsl.ts b/adev/src/app/features/home/components/shaders/modules/msdf/msdf.glsl.ts deleted file mode 100644 index bda8ed20fe29..000000000000 --- a/adev/src/app/features/home/components/shaders/modules/msdf/msdf.glsl.ts +++ /dev/null @@ -1,16 +0,0 @@ -/*! - * @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.dev/license - */ - -export default /* glsl */ ` -float msdf(sampler2D image, vec2 uv) { - vec3 tex = texture2D(image, uv).rgb; - float signedDist = max(min(tex.r, tex.g), min(max(tex.r, tex.g), tex.b)) - 0.5; - float d = fwidth(signedDist); - return smoothstep(-d, d, signedDist); -} -`; diff --git a/adev/src/app/features/home/components/shaders/modules/sdf-primitives/sd-polygon.glsl.ts b/adev/src/app/features/home/components/shaders/modules/sdf-primitives/sd-polygon.glsl.ts deleted file mode 100644 index 46f020ba8ba5..000000000000 --- a/adev/src/app/features/home/components/shaders/modules/sdf-primitives/sd-polygon.glsl.ts +++ /dev/null @@ -1,27 +0,0 @@ -/*! - * @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.dev/license - */ - -export default /* glsl */ ` -#ifndef MAX_NUM_VERTICES -#define MAX_NUM_VERTICES 5 -#endif - -float sdPolygon(vec2 p, vec2[MAX_NUM_VERTICES] v, int num) { - float d = dot(p - v[0], p - v[0]); - float s = 1.0; - for (int i = 0, j = num - 1; i < num; j = i, i++) { - vec2 e = v[j] - v[i]; - vec2 w = p - v[i]; - vec2 b = w - e * clamp(dot(w, e) / dot(e, e), 0.0, 1.0); - d = min(d, dot(b, b)); - bvec3 cond = bvec3(p.y >= v[i].y, p.y < v[j].y, e.x * w.y > e.y * w.x); - if (all(cond) || all(not(cond))) s = -s; - } - return s * sqrt(d); -} -`; diff --git a/adev/src/app/features/home/components/views/angular-glyph.ts b/adev/src/app/features/home/components/views/angular-glyph.ts deleted file mode 100644 index 3267f33739ea..000000000000 --- a/adev/src/app/features/home/components/views/angular-glyph.ts +++ /dev/null @@ -1,89 +0,0 @@ -/*! - * @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.dev/license - */ - -import {Color, Mesh, OGLRenderingContext, Plane, Texture, Vec2} from 'ogl'; - -import {View} from './view'; -import {GlyphProgram} from '../programs/glyph-program'; - -import {toRadians} from '../../utils/math'; - -/** - * An OGL `Transform` used for the animation of the inner triangle and "Angular" letters of the logo. - * - * The `userData` object is used for the GSAP animation, and the `override update(): void` method - * applies the values to the `Transform`. - */ -export class AngularGlyph extends View { - private origin: Vec2; - private mesh!: Mesh; - - /** - * Create a glyph view. - */ - constructor( - private readonly gl: OGLRenderingContext, - private readonly texture: Texture, - private readonly color: Color, - private translate: Vec2 = new Vec2(0.5, -0.5), // Top left - ) { - super(); - - this.userData['x'] = 0; - this.userData['y'] = 0; - this.userData['rotation'] = 0; - this.userData['scale'] = 1; - this.userData['opacity'] = 1; - this.userData['width'] = 700; - this.userData['height'] = 172; - - this.origin = new Vec2( - Math.round(this.userData['width'] * (this.translate.x - 0.5)), - Math.round(this.userData['height'] * (this.translate.y + 0.5)), - ); - - this.translate = new Vec2( - Math.round(this.userData['width'] * this.translate.x), - Math.round(this.userData['height'] * this.translate.y), - ); - - this.init(); - } - - /** - * Initialize geometry, program and mesh for the view. - */ - override init(): void { - const geometry = new Plane(this.gl); - - const program = new GlyphProgram(this.gl, this.texture, this.color); - - const mesh = new Mesh(this.gl, {geometry, program}); - mesh.frustumCulled = false; - mesh.position.set(this.translate.x, this.translate.y, 0); // Offset mesh for transform origin - mesh.scale.set(this.userData['width'], this.userData['height'], 1); - this.addChild(mesh); - - this.mesh = mesh; - } - - /** - * Update position, rotation and scale of the view, and alpha uniform of the program. - */ - override update(): void { - this.position.x = -this.origin.x + this.userData['x']; - this.position.y = -this.origin.y + -this.userData['y']; // Y flipped - - this.rotation.z = -toRadians(this.userData['rotation']); - - this.scale.set(this.userData['scale']); - - this.mesh.program.uniforms['uAlpha'].value = - this.userData['opacity'] * this.parent!.userData['opacity']; - } -} diff --git a/adev/src/app/features/home/components/views/angular-logo.ts b/adev/src/app/features/home/components/views/angular-logo.ts deleted file mode 100644 index e40f9bfd8b9e..000000000000 --- a/adev/src/app/features/home/components/views/angular-logo.ts +++ /dev/null @@ -1,91 +0,0 @@ -/*! - * @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.dev/license - */ - -import {Color, Mesh, OGLRenderingContext, Plane, Vec2} from 'ogl'; - -import {View} from './view'; -import {LogoProgram} from '../programs/logo-program'; - -import {toRadians} from '../../utils/math'; - -/** - * An OGL `Transform` used for the animation of the outer polygons of the logo. - * - * The `userData` object is used for the GSAP animation, and the `override update(): void` method - * applies the values to the `Transform`. - */ -export class AngularLogo extends View { - private origin: Vec2; - private mesh!: Mesh; - - /** - * Create the logo view. - */ - constructor( - private readonly gl: OGLRenderingContext, - private readonly color: Color, - private translate: Vec2 = new Vec2(), // Center - ) { - super(); - - this.userData['x'] = 0; - this.userData['y'] = 0; - this.userData['rotation'] = 0; - this.userData['scale'] = 1; - this.userData['opacity'] = 1; - this.userData['width'] = 158.6; - this.userData['height'] = 168; - this.userData['progress'] = 0; - - this.origin = new Vec2( - Math.round(this.userData['width'] * (this.translate.x - 0.5)), - Math.round(this.userData['height'] * (this.translate.y + 0.5)), - ); - - this.translate = new Vec2( - Math.round(this.userData['width'] * this.translate.x), - Math.round(this.userData['height'] * this.translate.y), - ); - - this.init(); - } - - /** - * Initialize geometry, program and mesh for the view. - */ - override init(): void { - const geometry = new Plane(this.gl); - - const program = new LogoProgram(this.gl, this.color); - - const mesh = new Mesh(this.gl, {geometry, program}); - mesh.frustumCulled = false; - mesh.position.set(this.translate.x, this.translate.y, 0); // Offset mesh for transform origin - mesh.scale.set(this.userData['width'], this.userData['height'], 1); - this.addChild(mesh); - - this.mesh = mesh; - } - - /** - * Update position, rotation and scale of the view, and progress and alpha uniforms of the - * program. - */ - override update(): void { - this.position.x = -this.origin.x + this.userData['x']; - this.position.y = -this.origin.y + -this.userData['y']; // Y flipped - - this.rotation.z = -toRadians(this.userData['rotation']); - - this.scale.set(this.userData['scale']); - - this.mesh.program.uniforms['uProgress'].value = this.userData['progress']; - this.mesh.program.uniforms['uAlpha'].value = - this.userData['opacity'] * this.parent!.userData['opacity']; - } -} diff --git a/adev/src/app/features/home/components/views/angular-view.ts b/adev/src/app/features/home/components/views/angular-view.ts deleted file mode 100644 index 8e97092384c9..000000000000 --- a/adev/src/app/features/home/components/views/angular-view.ts +++ /dev/null @@ -1,63 +0,0 @@ -/*! - * @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.dev/license - */ - -import type {OGLRenderingContext} from 'ogl'; - -import {View} from './view'; -import {Angular} from './angular'; - -/** - * An OGL `Transform` used for the top-level view of the Angular logo mask. - */ -export class AngularView extends View { - wordmark!: Angular; - - /** - * Create the mask view. - */ - constructor(private readonly gl: OGLRenderingContext) { - super(); - - this.visible = false; - - this.userData['visible'] = this.visible; - - this.init(); - } - - /** - * Initialize child views. - */ - override init(): void { - this.wordmark = new Angular(this.gl); - this.addChild(this.wordmark); - } - - /** - * Resize the child views. - */ - override resize(width: number, height: number, dpr: number, scale: number): void { - this.wordmark.resize(width, height, dpr, scale); - } - - /** - * Update the child views. - */ - override update(): void { - this.visible = this.userData['visible']; - - this.wordmark.update(); - } - - /** - * Promise for the child views when they're ready. - */ - override ready(): Promise { - return this.wordmark.init(); - } -} diff --git a/adev/src/app/features/home/components/views/angular.ts b/adev/src/app/features/home/components/views/angular.ts deleted file mode 100644 index 57c183cd89d4..000000000000 --- a/adev/src/app/features/home/components/views/angular.ts +++ /dev/null @@ -1,108 +0,0 @@ -/*! - * @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.dev/license - */ - -import {Color, OGLRenderingContext, Vec2} from 'ogl'; - -import {AngularGlyph} from './angular-glyph'; -import {AngularLogo} from './angular-logo'; -import {View} from './view'; - -import {toRadians} from '../../utils/math'; -import {loadTexture} from '../../utils/ogl'; - -/** - * An OGL `Transform` used for the animation of the Angular logo. - * - * The `userData` object is used for the GSAP animation, and the `override update(): void` method - * applies the values to the `Transform`. - */ -export class Angular extends View { - private viewWidth = 700; - private viewHeight = 172; - private viewScale = 1; - private origin: Vec2; - - /** - * Create the Angular logo view. - */ - constructor(private readonly gl: OGLRenderingContext) { - super(); - - this.userData['x'] = 0; - this.userData['y'] = 0; - this.userData['rotation'] = 0; - this.userData['scale'] = 1; - this.userData['opacity'] = 1; - - this.origin = new Vec2(); - } - - /** - * Initialize child views. - */ - override async init(): Promise { - const logo = new AngularLogo(this.gl, new Color(1, 1, 1)); - this.addChild(logo); - - const msdf = await Promise.all([ - loadTexture(this.gl, 'assets/textures/logo-2-msdf.png'), - loadTexture(this.gl, 'assets/textures/logo-3-msdf.png'), - loadTexture(this.gl, 'assets/textures/logo-4-msdf.png'), - loadTexture(this.gl, 'assets/textures/logo-5-msdf.png'), - loadTexture(this.gl, 'assets/textures/logo-6-msdf.png'), - loadTexture(this.gl, 'assets/textures/logo-7-msdf.png'), - loadTexture(this.gl, 'assets/textures/logo-8-msdf.png'), - loadTexture(this.gl, 'assets/textures/logo-9-msdf.png'), - ]); - - msdf.forEach((texture, i) => { - texture.minFilter = this.gl.LINEAR; - texture.generateMipmaps = false; - - const glyph = new AngularGlyph( - this.gl, - texture, - new Color(1, 1, 1), - i < 1 ? new Vec2(0.5 - 0.1123, 0) : new Vec2(0.5, -0.5), - ); - this.addChild(glyph); - }); - } - - /** - * Update size and position of the view, based on the size of the screen. - */ - override resize(width: number, height: number, dpr: number, scale: number): void { - this.viewScale = scale; - - this.userData['width'] = this.viewWidth * this.viewScale; - this.userData['height'] = this.viewHeight * this.viewScale; - - // Centered - this.origin.set( - Math.round((width - this.userData['width']) / 2), - Math.round((height - this.userData['height']) / 2), - ); - } - - /** - * Update position, rotation and scale of the view, and child views. - */ - override update(): void { - this.position.x = this.origin.x + this.userData['x']; - this.position.y = -this.origin.y + -this.userData['y']; // Y flipped - - this.rotation.z = -toRadians(this.userData['rotation']); - - this.scale.set(this.viewScale * this.userData['scale']); - - this.children.forEach((node) => { - node.update(); - }); - } -} diff --git a/adev/src/app/features/home/components/views/build-text.ts b/adev/src/app/features/home/components/views/build-text.ts deleted file mode 100644 index 13f3328905b8..000000000000 --- a/adev/src/app/features/home/components/views/build-text.ts +++ /dev/null @@ -1,120 +0,0 @@ -/*! - * @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.dev/license - */ - -import {Color, Mesh, OGLRenderingContext, Plane} from 'ogl'; - -import {View} from './view'; -import {GlyphProgram} from '../programs/glyph-program'; - -import {toRadians} from '../../utils/math'; -import {loadTexture} from '../../utils/ogl'; - -import {BREAKPOINT, BUILD_TEXT_HEIGHT_RATIO} from '../../home-animation-constants'; - -/** - * An OGL `Transform` used for the animation of the "Build for everyone" heading. - * - * The `userData` object is used for the GSAP animation, and the `override update(): void` method - * applies the values to the `Transform`. - */ -export class BuildText extends View { - private viewWidth = 433; - private viewHeight = 58; - private aspect = this.viewWidth / this.viewHeight; - private mesh!: Mesh; - - /** - * Create the build text. - */ - constructor( - private readonly gl: OGLRenderingContext, - private readonly document: Document, - ) { - super(); - - this.userData['x'] = 0; - this.userData['y'] = 0; - this.userData['rotation'] = 0; - this.userData['scale'] = 1; - this.userData['opacity'] = 1; - } - - /** - * Initialize child views. - */ - override async init(): Promise { - const texture = await loadTexture(this.gl, 'assets/textures/build-msdf.png'); - texture.minFilter = this.gl.LINEAR; - texture.generateMipmaps = false; - - const geometry = new Plane(this.gl); - - const program = new GlyphProgram(this.gl, texture, new Color(1, 1, 1)); - - const mesh = new Mesh(this.gl, {geometry, program}); - mesh.frustumCulled = false; - this.addChild(mesh); - - this.mesh = mesh; - } - - /** - * Update size and position of the view, based on the CSS heading. - */ - override resize(width: number, height: number, dpr: number, scale: number): void { - const heading = this.document.querySelector('.adev-build-webgl-text h2')!; - const bounds = heading.getBoundingClientRect(); - let textHeight; - - if (width < BREAKPOINT) { - // Mobile fixed size (in px) - textHeight = 48; - } else { - // Desktop calculation (in px) - textHeight = bounds.height * BUILD_TEXT_HEIGHT_RATIO; - } - - this.userData['width'] = textHeight * this.aspect; - this.userData['height'] = textHeight; - - // Positioned relative to the CSS heading, vertical offset from the center, Y flipped - let y = 1 - (bounds.y - (height - bounds.height) / 2); - - // Vertical offset adjustment (in px) - if (width < BREAKPOINT) { - y -= 4; - } else { - y -= 6 * scale; - } - - this.mesh.position.set(0, y, 0); - this.mesh.scale.set(this.userData['width'], this.userData['height'], 1); - } - - /** - * Update position, rotation and scale of the view, and alpha uniform of the program. - */ - override update(): void { - this.position.x = this.userData['x']; - this.position.y = -this.userData['y']; // Y flipped - - this.rotation.z = -toRadians(this.userData['rotation']); - - this.scale.set(this.userData['scale']); - - this.mesh.program.uniforms['uAlpha'].value = - this.userData['opacity'] * this.parent!.userData['opacity']; - } - - /** - * Promise for the child views when they're ready. - */ - override ready(): Promise { - return this.init(); - } -} diff --git a/adev/src/app/features/home/components/views/build-view.ts b/adev/src/app/features/home/components/views/build-view.ts deleted file mode 100644 index 6d9f244e73bb..000000000000 --- a/adev/src/app/features/home/components/views/build-view.ts +++ /dev/null @@ -1,89 +0,0 @@ -/*! - * @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.dev/license - */ - -import {OGLRenderingContext, Vec2} from 'ogl'; - -import {View} from './view'; -import {BuildText} from './build-text'; - -import {toRadians} from '../../utils/math'; - -/** - * An OGL `Transform` used for the top-level view of the build section. - * - * The `userData` object is used for the GSAP animation, and the `override update(): void` method - * applies the values to the `Transform`. - */ -export class BuildView extends View { - private origin: Vec2; - - text!: BuildText; - - /** - * Create the build view. - */ - constructor( - private readonly gl: OGLRenderingContext, - private readonly document: Document, - ) { - super(); - - this.visible = false; - - this.userData['x'] = 0; - this.userData['y'] = 0; - this.userData['rotation'] = 0; - this.userData['scale'] = 1; - this.userData['opacity'] = 1; - - this.origin = new Vec2(); - - this.init(); - } - - /** - * Initialize child views. - */ - override init(): void { - this.text = new BuildText(this.gl, this.document); - this.addChild(this.text); - } - - /** - * Update size and position of the view, based on the size of the screen, and child views. - */ - override resize(width: number, height: number, dpr: number, scale: number): void { - // Centered - this.origin.set(Math.round(width / 2), Math.round(height / 2)); - - this.text.resize(width, height, dpr, scale); - } - - /** - * Update position, rotation and scale of the view, and child views. - */ - override update(): void { - this.position.x = this.origin.x + this.userData['x']; - this.position.y = -this.origin.y + -this.userData['y']; // Y flipped - - this.rotation.z = -toRadians(this.userData['rotation']); - - this.scale.set(this.userData['scale']); - - this.visible = this.userData['opacity'] > 0; - - this.text.update(); - } - - /** - * Promise for the child views when they're ready. - */ - override ready(): Promise { - return this.text.init(); - } -} diff --git a/adev/src/app/features/home/components/views/gradient-view.ts b/adev/src/app/features/home/components/views/gradient-view.ts deleted file mode 100644 index abb3dd04a303..000000000000 --- a/adev/src/app/features/home/components/views/gradient-view.ts +++ /dev/null @@ -1,105 +0,0 @@ -/*! - * @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.dev/license - */ - -import {OGLRenderingContext, Vec2} from 'ogl'; - -import {View} from './view'; -import {Gradient} from './gradient'; - -import {toRadians} from '../../utils/math'; - -/** - * An OGL `Transform` used for the top-level view of the gradient background. - * - * The `userData` object is used for the GSAP animation, and the `override update(): void` method - * applies the values to the `Transform`. - */ -export class GradientView extends View { - private origin: Vec2; - - background!: Gradient; - - /** - * Create the gradient view. - */ - constructor( - private readonly gl: OGLRenderingContext, - private readonly document: Document, - private readonly window: Window, - ) { - super(); - - this.visible = false; - - this.userData['x'] = 0; - this.userData['y'] = 0; - this.userData['rotation'] = 0; - this.userData['scale'] = 1; - this.userData['opacity'] = 1; - - this.origin = new Vec2(); - - this.init(); - } - - /** - * Initialize child views. - */ - override init(): void { - this.background = new Gradient(this.gl, this.document, this.window); - this.addChild(this.background); - } - - /** - * Update the theme of child views. - */ - override theme(): void { - this.background.theme(); - } - - /** - * Resize the child views. - */ - override resize(width: number, height: number, dpr: number, scale: number): void { - // Centered - this.origin.set(Math.round(width / 2), Math.round(height / 2)); - - this.background.resize(width, height, dpr, scale); - } - - /** - * Update position, rotation and scale of the view, and child views. - */ - override update(time: number): void { - this.position.x = this.origin.x + this.userData['x']; - this.position.y = -this.origin.y + -this.userData['y']; // Y flipped - - this.rotation.z = -toRadians(this.userData['rotation']); - - this.scale.set(this.userData['scale']); - - // "Build for everyone" gradient centered, scale set by the child view - if (this.background.userData['progress'] > 0) { - this.position.x = this.origin.x; - this.position.y = -this.origin.y; // Y flipped - - this.scale.set(1); - } - - this.visible = this.userData['opacity'] > 0; - - this.background.update(time); - } - - /** - * Promise for the child views when they're ready. - */ - override ready(): Promise { - return this.background.init(); - } -} diff --git a/adev/src/app/features/home/components/views/gradient.ts b/adev/src/app/features/home/components/views/gradient.ts deleted file mode 100644 index 054bacbc2ae0..000000000000 --- a/adev/src/app/features/home/components/views/gradient.ts +++ /dev/null @@ -1,121 +0,0 @@ -/*! - * @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.dev/license - */ - -import {Mesh, OGLRenderingContext, Plane} from 'ogl'; - -import {View} from './view'; -import {GradientProgram} from '../programs/gradient-program'; - -import {toRadians} from '../../utils/math'; -import {loadTexture} from '../../utils/ogl'; - -/** - * An OGL `Transform` used for the animation of the gradient background. - * - * The `userData` object is used for the GSAP animation, and the `override update(): void` method - * applies the values to the `Transform`. - */ -export class Gradient extends View { - private viewWidth = 700; - private viewScale = 1; - private mesh!: Mesh; - - /** - * Create the gradient background. - */ - constructor( - private readonly gl: OGLRenderingContext, - private readonly document: Document, - private readonly window: Window, - ) { - super(); - - this.userData['x'] = 0; - this.userData['y'] = 0; - this.userData['rotation'] = 0; - this.userData['scale'] = 1; - this.userData['opacity'] = 1; - this.userData['progress'] = 0; - this.userData['buildWidth'] = 0; // Used for the "Build for everyone" heading width - } - - /** - * Initialize geometry, program and mesh for the view. - */ - override async init(): Promise { - const texture = await loadTexture(this.gl, 'assets/textures/gradient.jpg'); - - const geometry = new Plane(this.gl); - - const program = new GradientProgram(this.gl, texture, this.window); - - const mesh = new Mesh(this.gl, {geometry, program}); - mesh.frustumCulled = false; - this.addChild(mesh); - - this.mesh = mesh; - } - - /** - * Update color uniforms of the material, based on the current theme. - */ - override theme(): void { - const rootStyle = getComputedStyle(this.document.querySelector(':root')!); - - this.mesh.program.uniforms['uGrayColor'].value.set( - rootStyle.getPropertyValue('--webgl-gray-unfilled').trim(), - ); - } - - /** - * Update size and position of the view, based on the size of the screen. - */ - override resize(width: number, height: number, dpr: number, scale: number): void { - this.viewScale = scale; - - // The gradient is 1.34x the width of the Angular logo - const size = this.viewWidth * this.viewScale * 1.34; - this.userData['width'] = size; - this.userData['height'] = size; - } - - /** - * Update position, rotation and scale of the view, position and scale of the mesh, and progress, - * alpha and time uniforms of the program. - */ - override update(time: number): void { - this.position.x = this.userData['x']; - this.position.y = -this.userData['y']; // Y flipped - - this.rotation.z = -toRadians(this.userData['rotation']); - - this.scale.set(this.userData['scale']); - - if (this.userData['progress'] > 0) { - // "Build for everyone" gradient centered, same width as the heading - this.mesh.position.set(0); - this.mesh.scale.set(this.userData['buildWidth'], this.userData['buildWidth'], 1); - } else { - // Positioned relative to the Angular logo, Y flipped - this.mesh.position.set(-102 * this.viewScale, -40 * this.viewScale, 0); - this.mesh.scale.set(this.userData['width'], this.userData['height'], 1); - } - - this.mesh.program.uniforms['uProgress'].value = this.userData['progress']; - this.mesh.program.uniforms['uAlpha'].value = - this.userData['opacity'] * this.parent!.userData['opacity']; - this.mesh.program.uniforms['uTime'].value = time; - } - - /** - * Promise for the child views when they're ready. - */ - override ready(): Promise { - return this.init(); - } -} diff --git a/adev/src/app/features/home/components/views/line-object.ts b/adev/src/app/features/home/components/views/line-object.ts deleted file mode 100644 index 12948d768db2..000000000000 --- a/adev/src/app/features/home/components/views/line-object.ts +++ /dev/null @@ -1,59 +0,0 @@ -/*! - * @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.dev/license - */ - -import {Mesh, Vec3} from 'ogl'; - -import {View} from './view'; - -import {toRadians} from '../../utils/math'; - -/** - * An OGL `Transform` used for the animation of a line instance. - * - * The `userData` object is used for the GSAP animation, and the `override update(): void` method - * applies the values to the `Transform`. - */ -export class LineObject extends View { - /** - * Create a line view. - */ - constructor( - private readonly origin: Vec3, - private readonly mesh: Mesh, - private readonly index: number, - ) { - super(); - - this.userData['x'] = 0; - this.userData['y'] = 0; - this.userData['rotation'] = 0; - this.userData['scale'] = 1; - this.userData['opacity'] = 1; - } - - /** - * Update position, rotation and scale of the view, and alpha attribute of the geometry. - */ - override update(): void { - this.position.x = this.origin.x + this.userData['x']; - this.position.y = this.origin.y + -this.userData['y']; // Y flipped - - this.rotation.z = -toRadians(this.userData['rotation']); - - this.scale.set(this.userData['scale']); - - this.updateMatrix(); - - this.matrix.toArray(this.mesh.geometry.attributes['instanceMatrix'].data, this.index * 16); - - this.mesh.geometry.attributes['instanceOpacity'].data!.set( - [this.userData['opacity'] * this.parent!.userData['opacity']], - this.index, - ); - } -} diff --git a/adev/src/app/features/home/components/views/lines-view.ts b/adev/src/app/features/home/components/views/lines-view.ts deleted file mode 100644 index 36e4139ac9a7..000000000000 --- a/adev/src/app/features/home/components/views/lines-view.ts +++ /dev/null @@ -1,64 +0,0 @@ -/*! - * @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.dev/license - */ - -import {isMobile} from '@angular/docs'; -import type {OGLRenderingContext} from 'ogl'; - -import {View} from './view'; -import {Lines} from './lines'; - -/** - * An OGL `Transform` used for the top-level view of the lines section. - */ -export class LinesView extends View { - // Number of divisions on a square grid - // For example 9 × 9 = 81 line instances - private divisions = isMobile ? 9 : 14; - - container!: Lines; - - /** - * Create the lines view. - */ - constructor(private readonly gl: OGLRenderingContext) { - super(); - - this.visible = false; - - // Center the container - const offset = this.divisions - 2; - this.position.x = -offset; - this.position.y = -offset; - - this.init(); - } - - /** - * Initialize child views. - */ - override init(): void { - this.container = new Lines(this.gl, this.divisions); - this.addChild(this.container); - } - - /** - * Update the child views. - */ - override update(time: number): void { - this.visible = this.container.userData['opacity'] > 0; - - this.container.update(time); - } - - /** - * Promise for the child views when they're ready. - */ - override ready(): Promise { - return this.container.init(); - } -} diff --git a/adev/src/app/features/home/components/views/lines.ts b/adev/src/app/features/home/components/views/lines.ts deleted file mode 100644 index 191add68d251..000000000000 --- a/adev/src/app/features/home/components/views/lines.ts +++ /dev/null @@ -1,146 +0,0 @@ -/*! - * @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.dev/license - */ - -import {InstancedMesh, OGLRenderingContext, Plane, Transform} from 'ogl'; - -import {View} from './view'; -import {LineGlyphProgram} from '../programs/line-glyph-program'; -import {LineObject} from './line-object'; - -import {toRadians} from '../../utils/math'; -import {loadTexture} from '../../utils/ogl'; - -// An index number used for the color of the line instance -enum InstanceColorIndex { - Pink = 0, - Purple = 1, - Red = 2, -} - -/** - * An OGL `Transform` used for the animation of the lines section. - * - * The `userData` object is used for the GSAP animation, and the `override update(): void` method - * applies the values to the `Transform`. - */ -export class Lines extends View { - private mesh!: InstancedMesh; - - /** - * Create the container view. - */ - constructor( - private readonly gl: OGLRenderingContext, - private readonly divisions: number, - ) { - super(); - - this.userData['x'] = 0; - this.userData['y'] = 0; - this.userData['rotation'] = 0; - this.userData['scale'] = 1; - this.userData['opacity'] = 1; - } - - /** - * Initialize geometry, program and mesh for the view. - */ - override async init(): Promise { - const texture = await loadTexture(this.gl, 'assets/textures/line-msdf.png'); - texture.minFilter = this.gl.LINEAR; - texture.generateMipmaps = false; - - const viewWidth = 235; - const viewHeight = 300; - const aspect = viewWidth / viewHeight; - const size = 1.6; - const width = size * aspect; - const height = size; - const widthDivisions = this.divisions; - const heightDivisions = this.divisions; - const numInstances = widthDivisions * heightDivisions; - - const geometry = new Plane(this.gl, {width, height}); - geometry.addAttribute('instanceMatrix', { - instanced: 1, - size: 16, - data: new Float32Array(numInstances * 16), - }); - geometry.addAttribute('instanceColorIndex', { - instanced: 1, - size: 1, - data: new Float32Array(numInstances).map( - (): InstanceColorIndex => Math.floor(Math.random() * 3), - ), - }); - geometry.addAttribute('instanceRandom', { - instanced: 1, - size: 1, - data: new Float32Array(numInstances).map(() => Math.random()), - }); - geometry.addAttribute('instanceOpacity', { - instanced: 1, - size: 1, - data: new Float32Array(numInstances).fill(1), - }); - - const program = new LineGlyphProgram(this.gl, texture); - - const mesh = new InstancedMesh(this.gl, {geometry, program}); - // TODO: @pschroen add support for instanced mesh frustum culling - // mesh.addFrustumCull(); - - const object = new Transform(); - - let index = 0; - - for (let y = 0; y < heightDivisions; y++) { - for (let x = 0; x < widthDivisions; x++) { - object.position.set(2 * x, 2 * y, 0); - object.updateMatrix(); - - object.matrix.toArray(mesh.geometry.attributes['instanceMatrix'].data, index * 16); - - const line = new LineObject(object.position.clone(), mesh, index); - this.addChild(line); - - index++; - } - } - - mesh.geometry.attributes['instanceMatrix'].needsUpdate = true; - - // Add instanced mesh last - this.addChild(mesh); - - this.mesh = mesh; - } - - /** - * Update position, rotation and scale of the view, time uniform of the program, and child views. - */ - override update(time: number): void { - this.position.x = this.userData['x']; - this.position.y = -this.userData['y']; // Y flipped - - this.rotation.z = -toRadians(this.userData['rotation']); - - this.scale.set(this.userData['scale']); - - this.mesh.program.uniforms['uTime'].value = time; - - this.children.forEach((node: Transform) => { - if (node instanceof View) { - node.update(); - } - }); - - this.mesh.geometry.attributes['instanceMatrix'].needsUpdate = true; - this.mesh.geometry.attributes['instanceOpacity'].needsUpdate = true; - } -} diff --git a/adev/src/app/features/home/components/views/view.ts b/adev/src/app/features/home/components/views/view.ts deleted file mode 100644 index ba6570d17d09..000000000000 --- a/adev/src/app/features/home/components/views/view.ts +++ /dev/null @@ -1,67 +0,0 @@ -/*! - * @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.dev/license - */ - -import {Transform} from 'ogl'; - -/** - * An OGL `Transform` used as a base class for implementing views. - */ -export class View extends Transform { - /** - * The parent. - */ - override parent: View | null = null; - - /** - * An array with the children. - */ - override children: View[] = []; - - /** - * An object for storing custom data. - */ - userData: Record = {}; - - /** - * Stub for initializing child views. - */ - init(): void {} - - /** - * Stub for updating child views, based on the current theme. - */ - theme(): void {} - - /** - * Stub for resizing child views. - */ - resize(width?: number, height?: number, dpr?: number, scale?: number): void {} - - /** - * Stub for updating child views. - */ - update(time?: number, deltaTime?: number, frame?: number, progress?: number): void {} - - /** - * Stub for initializing child views when they're ready. - */ - ready(): void | Promise {} - - /** - * Destroys the child views and empties the children array. - */ - destroy(): void { - for (let i = this.children.length - 1; i >= 0; i--) { - if ('destroy' in this.children[i]) { - this.children[i].destroy(); - } - } - - this.children.length = 0; - } -} diff --git a/adev/src/app/features/home/home-animation-constants.ts b/adev/src/app/features/home/home-animation-constants.ts deleted file mode 100644 index f7429b6f3ec9..000000000000 --- a/adev/src/app/features/home/home-animation-constants.ts +++ /dev/null @@ -1,33 +0,0 @@ -/*! - * @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.dev/license - */ - -// Defines one breakpoint (in px) between mobile and desktop sizing. -export const BREAKPOINT = 1000; - -// Defines maximum application size (in px) that can be rendered on a page. -// If a viewport width is bigger than this size, we limit the width to this value. -export const MAX_APP_WIDTH = 2560; - -// Defines the "Build for everyone" heading height ratio. -// The computed CSS heading size (in px) is multiplied by this value to compensate for the -// difference in height of the MSDF texture. -export const BUILD_TEXT_HEIGHT_RATIO = 0.88; - -export const SCALE_DIV = '.adev-scale'; -export const LINES_TEXT = '.adev-lines-text'; -export const LINES_DIV = '.adev-lines'; -export const BUILD_TEXT = '.adev-build-text'; -export const CTA = '.adev-cta'; -export const ARROW = '.adev-arrow'; -export const SCALE_TEXT = '.adev-scale-text'; -export const CANVAS = '.adev-canvas'; -export const MOVING_LOGO = '.adev-logo'; - -export const HEADER_CLASS_NAME = 'adev-header'; -export const WEBGL_CLASS_NAME = 'adev-webgl'; -export const LOADED_CLASS_NAME = 'adev-loaded'; diff --git a/adev/src/app/features/home/home.component.html b/adev/src/app/features/home/home.component.html index 83e73aa167cc..77e44585fc2f 100644 --- a/adev/src/app/features/home/home.component.html +++ b/adev/src/app/features/home/home.component.html @@ -1,140 +1,17 @@ -
-
- + + + +@if (!animationReady()) { +
+} + +
+
+ @defer (when showEditor(); prefetch when prefetchEditor()) { + + } @loading { + Code editor + }
-
- -
-
-
-
-

Works at any scale

-

- Angular lets you start small on a well-lit path and supports you as your team and apps - grow. -

-
-
-
-
-
-
-
-
-

Loved by millions

-

- Join the millions of developers all over the world building with Angular in a thriving - and friendly community. -

-
-
-
-
-
-
-
-
-

- Build for everyone - -

-

- Rely on Angular's built-in hydration, internationalization, security, and accessibility - support to build for everyone around the world. -

-
-
-
- -
-
-
-
- @defer (on viewport(buildForEveryone); prefetch on viewport(lovedByMillions)) { - - } @loading { - Code editor - } -
-
-
- - -
diff --git a/adev/src/app/features/home/home.component.scss b/adev/src/app/features/home/home.component.scss index fb501f021dd1..8029cb3c70e2 100644 --- a/adev/src/app/features/home/home.component.scss +++ b/adev/src/app/features/home/home.component.scss @@ -2,6 +2,7 @@ :host { width: 100%; + position: relative; // While editor is loading, display an svg of the editor .docs-dark-mode & { @@ -20,262 +21,9 @@ } } } - .adev-banner { - display: flex; - align-items: center; - flex-wrap: wrap; - gap: 0.5rem; - z-index: 10; - border: 1px solid var(--senary-contrast); - background: var(--page-background); - position: relative; - border-radius: 0.25rem; - padding: 10px; - max-width: 100%; - width: fit-content; - box-sizing: border-box; - transition: background 0.3s ease, border 0.3s ease; - - h1, - p { - display: inline; - font-size: 0.875rem; - margin: 0; - background-image: var(--red-to-pink-to-purple-horizontal-gradient); - background-clip: text; - -webkit-background-clip: text; - color: transparent; - width: fit-content; - font-weight: 500; - - &.adev-banner-cta { - color: var(--tertiary-contrast); - &::after { - content: ''; - position: absolute; - width: 100%; - transform: scaleX(0); - height: 1px; - bottom: -2px; - left: 0; - background: var(--red-to-pink-to-purple-horizontal-gradient); - transform-origin: bottom right; - transition: transform 0.3s ease; - } - } - } - &:hover { - .adev-banner-cta { - &::after { - transform: scaleX(1); - transform-origin: bottom left; - } - } - } - } -} - -.adev-top { - position: absolute; - top: 0; - - @include mq.for-tablet-landscape-down { - top: 6rem; - } - - @include mq.for-phone-only { - top: 4.5rem; - } - - .adev-top-content { - display: flex; - justify-content: space-between; - align-items: center; - flex-wrap: wrap; - padding-top: 10px; - padding-inline: var(--layout-padding); - gap: 0.5rem; - - @include mq.for-tablet-landscape-up { - padding-top: var(--layout-padding); - padding-left: calc(var(--layout-padding) + var(--primary-nav-width)); - } - } -} - -.adev-home { - img, - svg { - user-select: none; - } - - h2, - p { - position: relative; - } - - h2 { - font-size: 4vw; - font-weight: 600; - white-space: nowrap; - margin-top: 0; - margin-bottom: 0.5em; - - @media screen and (max-width: 1000px) { - font-size: 2rem; - } - } - p { - font-weight: 400; - color: var(--quaternary-contrast); - font-size: clamp(1rem, 1vw, 2rem); - line-height: 1.5; - width: clamp(375px, 50%, 600px); - margin: 0 auto; - } - - .adev-cta { - position: fixed; - left: 50%; - bottom: 10%; - transform: translateX(-50%); - display: inline-block; - padding: 7px; - opacity: 0; - visibility: hidden; - transition: opacity 0.5s linear, visibility 0.5s linear; - - button { - font-size: 1rem; - padding: 1rem 1.75rem; - &::after { - font-size: 1rem; - } - } - } - - .adev-arrow { - position: fixed; - left: 50%; - bottom: 5%; - transform: translateX(-50%) rotate(45deg); - border: solid var(--primary-contrast); - border-width: 0 2px 2px 0; - display: inline-block; - padding: 7px; - opacity: 0; - transition: opacity 0.5s linear; - } - - .adev-canvas { - position: fixed; - top: 0; - width: calc(100vw - 8px); - height: 100vh; - max-width: 2560px; - margin-inline: auto; - pointer-events: none; - overflow: hidden; - - // hide canvas to prevent fouc - opacity: 0; - - // large viewport height for canvas - @supports (height: 100lvh) { - height: 100lvh; - } - } - - .adev-logo, - .adev-scale, - .adev-lines, - .adev-build { - height: 130vh; - overflow: hidden; - - @supports (height: 100lvh) { - height: 130lvh; - } - } - - .adev-logo-wordmark, - .adev-scale-text, - .adev-lines-text, - .adev-build-text, - .adev-build-webgl-text { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - text-align: center; - top: 0; - width: 100vw; + .spacer { height: 100vh; - max-width: 2560px; - margin-inline: auto; - pointer-events: none; - overflow: hidden; - - @supports (height: 100lvh) { - height: 100lvh; - } - } - - .adev-build-webgl-text { - display: none; - visibility: hidden; - position: fixed; - } - - .adev-scale-container, - .adev-lines-container, - .adev-build-container { - position: relative; - } - - .adev-lines-container { - &::before { - content: ''; - position: absolute; - left: -50px; - top: 0; - right: -50px; - bottom: -50px; - background-color: var(--page-background); - filter: blur(25px); - } - } - - .adev-scale-wrapper, - .adev-lines-wrapper, - .adev-build-wrapper { - position: relative; - } - - .adev-build-text, - .adev-build-webgl-text { - h2 { - color: var(--gray-unfilled); - - @media screen and (max-width: 1000px) { - font-size: 2.75rem; - } - } - - .adev-gradient { - position: absolute; - left: 0; - top: 0; - right: 0; - background: url('../../../assets/textures/gradient.jpg'); - background-size: cover; - background-position: center; - background-clip: text; - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - clip-path: inset(0%); - } } .adev-editor-scroll-container { @@ -283,15 +31,36 @@ height: 300vh; background-color: var(--page-background); - .adev-sticky-editor { + .adev-code-editor { + background-color: var(--page-background); + padding-bottom: 60px; position: sticky; top: calc((100vh - (100vh - 110px)) / 2); + @include mq.for-tablet { top: calc(((100vh - (100vh - 110px)) / 2) + 36px); } @include mq.for-phone-only { top: calc(((100vh - (100vh - 110px)) / 2) + 25px); } + + // stylelint-disable-next-line + ::ng-deep { + embedded-editor { + margin: 0 auto; + display: flex; + width: 75vw; + height: calc(100vh - 110px); + + @include mq.for-phone-only { + width: 95vw; + } + + .adev-editor-container { + width: 100%; + } + } + } } img { @@ -304,103 +73,4 @@ width: 75vw; } } - - &.adev-header { - .adev-cta, - .adev-arrow { - opacity: 1; - visibility: visible; - } - } - - &.adev-webgl { - .adev-logo, - .adev-scale, - .adev-lines { - height: 200vh; - - @supports (height: 100lvh) { - height: 200lvh; - } - } - - .adev-logo-wordmark, - .adev-scale-text, - .adev-lines-text, - .adev-build-text { - position: fixed; - } - - .adev-scale-text, - .adev-lines-text, - .adev-build-text { - opacity: 0; - } - - .adev-build { - height: 300vh; - - @supports (height: 100lvh) { - height: 300lvh; - } - } - - .adev-build-text { - h2 { - opacity: 0; - } - } - - .adev-build-webgl-text { - display: flex; - } - - &.adev-loaded { - .adev-canvas { - opacity: unset; - } - - .adev-logo-wordmark { - opacity: 0; - } - } - } -} - -.adev-code-editor { - background-color: var(--page-background); - padding-bottom: 60px; - - // stylelint-disable-next-line - ::ng-deep { - embedded-editor { - margin: 0 auto; - display: flex; - width: 75vw; - height: calc(100vh - 110px); - - @include mq.for-phone-only { - width: 95vw; - } - - .adev-editor-container { - width: 100%; - } - } - } -} - -.adev-code-editor-gradient { - position: absolute; - left: 0; - right: 0; - margin-top: -100vh; - height: 100vh; - background: linear-gradient(to top, var(--page-background), transparent); - pointer-events: none; - - @supports (height: 100svh) { - margin-top: -100svh; - height: 100svh; - } } diff --git a/adev/src/app/features/home/home.component.ts b/adev/src/app/features/home/home.component.ts index ee9a9fd07bc1..068778e01f27 100644 --- a/adev/src/app/features/home/home.component.ts +++ b/adev/src/app/features/home/home.component.ts @@ -6,130 +6,65 @@ * found in the LICENSE file at https://angular.dev/license */ -import {DOCUMENT} from '@angular/common'; import { + AfterViewInit, ChangeDetectionStrategy, Component, - DestroyRef, - ElementRef, - Injector, - ViewChild, - afterNextRender, + computed, inject, + OnDestroy, + Renderer2, + signal, } from '@angular/core'; -import {takeUntilDestroyed} from '@angular/core/rxjs-interop'; -import {WINDOW, shouldReduceMotion, isIos} from '@angular/docs'; -import {ActivatedRoute, RouterLink} from '@angular/router'; -import {from} from 'rxjs'; - -import {injectAsync} from '../../core/services/inject-async'; +import {ActivatedRoute} from '@angular/router'; +import {DOCUMENT} from '@angular/common'; +import {WINDOW} from '@angular/docs'; +import {HomeAnimationComponent} from './components/home-animation/home-animation.component'; import {CodeEditorComponent} from './components/home-editor.component'; -import {HEADER_CLASS_NAME} from './home-animation-constants'; -import type {HomeAnimation} from './services/home-animation.service'; - export const TUTORIALS_HOMEPAGE_DIRECTORY = 'homepage'; @Component({ selector: 'adev-home', - imports: [RouterLink, CodeEditorComponent], + imports: [HomeAnimationComponent, CodeEditorComponent], templateUrl: './home.component.html', styleUrls: ['./home.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) -export default class Home { - @ViewChild('home') home!: ElementRef; - - private readonly document = inject(DOCUMENT); - private readonly injector = inject(Injector); - private readonly window = inject(WINDOW); +export default class Home implements AfterViewInit, OnDestroy { private readonly activatedRoute = inject(ActivatedRoute); - private readonly destroyRef = inject(DestroyRef); + private readonly renderer = inject(Renderer2); + private readonly win = inject(WINDOW); + private readonly doc = inject(DOCUMENT); + private scrollListener?: () => void; protected readonly tutorialFiles = TUTORIALS_HOMEPAGE_DIRECTORY; protected readonly isUwu = 'uwu' in this.activatedRoute.snapshot.queryParams; - private element!: HTMLDivElement; - private homeAnimation?: HomeAnimation; - private intersectionObserver: IntersectionObserver | undefined; - - readonly ctaLink = isIos ? 'overview' : 'tutorials/learn-angular'; - - constructor() { - afterNextRender(() => { - this.element = this.home.nativeElement; - - // Always scroll to top on home page (even for navigating back) - this.window.scrollTo({top: 0, left: 0, behavior: 'instant'}); - - // Create a single intersection observer used for disabling the animation - // at the end of the page, and to load the embedded editor. - this.initIntersectionObserver(); - if (this.isWebGLAvailable() && !shouldReduceMotion() && !this.isUwu) { - this.loadHomeAnimation(); - } - }); + private scrollProgress = signal(0); - this.destroyRef.onDestroy(() => { - // Stop observing and disconnect - this.intersectionObserver?.disconnect(); - this.homeAnimation?.destroy(); - }); - } - - private initIntersectionObserver(): void { - const header = this.document.querySelector('.adev-top'); - const footer = this.document.querySelector('footer'); - - this.intersectionObserver = new IntersectionObserver((entries) => { - const headerEntry = entries.find((entry) => entry.target === header); - const footerEntry = entries.find((entry) => entry.target === footer); + prefetchEditor = computed(() => this.scrollProgress() > 0.25); + showEditor = computed(() => this.scrollProgress() > 0.35); - // CTA and arrow animation - this.headerTop(headerEntry); + animationReady = signal(false); - // Disable animation at end of page - this.homeAnimation?.disableEnd(footerEntry); - }); - - // Start observing - this.intersectionObserver.observe(header!); - this.intersectionObserver.observe(footer!); + ngAfterViewInit() { + this.scrollListener = this.renderer.listen(this.win, 'scroll', () => + // Keep track of the scroll progress since the home animation uses + // different mechanics for the standard and reduced-motion animations. + this.scrollProgress.set(this.win.scrollY / this.doc.body.scrollHeight), + ); } - private headerTop(headerEntry: IntersectionObserverEntry | undefined): void { - if (!headerEntry) { - return; + ngOnDestroy() { + // Unlisten the scroll event. + if (this.scrollListener) { + this.scrollListener(); } - - if (headerEntry.isIntersecting) { - this.element.classList.add(HEADER_CLASS_NAME); - } else { - this.element.classList.remove(HEADER_CLASS_NAME); - } - } - - private loadHomeAnimation() { - from( - injectAsync(this.injector, () => - import('./services/home-animation.service').then((c) => c.HomeAnimation), - ), - ) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe((homeAnimation) => { - this.homeAnimation = homeAnimation; - this.homeAnimation.init(this.element); - }); } - private isWebGLAvailable() { - try { - return !!document - .createElement('canvas') - .getContext('webgl', {failIfMajorPerformanceCaveat: true}); - } catch (e) { - return false; - } + onAnimationReady(ready: boolean) { + this.animationReady.set(ready); } } diff --git a/adev/src/app/features/home/services/home-animation.service.ts b/adev/src/app/features/home/services/home-animation.service.ts deleted file mode 100644 index bc0c96e8fbdc..000000000000 --- a/adev/src/app/features/home/services/home-animation.service.ts +++ /dev/null @@ -1,553 +0,0 @@ -/*! - * @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.dev/license - */ - -import {DOCUMENT} from '@angular/common'; -import {DestroyRef, Injectable, inject} from '@angular/core'; -import {takeUntilDestroyed} from '@angular/core/rxjs-interop'; -import {RESIZE_EVENT_DELAY, WEBGL_LOADED_DELAY, WINDOW} from '@angular/docs'; -import {gsap} from 'gsap'; -import {ScrollTrigger} from 'gsap/ScrollTrigger'; -import {from, fromEvent} from 'rxjs'; -import {debounceTime} from 'rxjs/operators'; -import {ThemeManager} from '../../../core/services/theme-manager.service'; -import {Canvas} from '../components/canvas'; -import {View} from '../components/views/view'; -import { - BREAKPOINT, - BUILD_TEXT, - CANVAS, - LINES_DIV, - LINES_TEXT, - LOADED_CLASS_NAME, - MAX_APP_WIDTH, - MOVING_LOGO, - SCALE_DIV, - SCALE_TEXT, - WEBGL_CLASS_NAME, -} from '../home-animation-constants'; - -/** - * Injectable service for the WebGL animation of the home page. - * - * This class contains your usual script for GSAP animations, however it's been extended with a - * number of classes and utilities that follow a simple MVC design pattern of views and programs - * for OGL. - * - * A view is an OGL `Transform`, the `userData: View["userData"]` object is used for the GSAP animation, - * and the `update` method applies the values to the `Transform`. - * - * @see {@link Canvas} for the controller class implementation. - */ -@Injectable() -export class HomeAnimation { - private readonly destroyRef = inject(DestroyRef); - private readonly document = inject(DOCUMENT); - private readonly window = inject(WINDOW); - private readonly themeManager = inject(ThemeManager); - - private scale = 1; - private progress = 0; - private logoMovement = 0; - private logoAnimation!: gsap.core.Timeline; - private logoProgress = 0; - private logoProgressTarget = 0; - private lerpSpeed = 0.1; - - private canvas!: Canvas; - private gradientView!: View['userData']; - private gradient!: View['userData']; - private angularView!: View['userData']; - private wordmark!: View['userData']; - private glyphs!: View[]; - private logo!: View['userData']; - private logoInner!: View['userData']; - private angular!: View['userData']; - private linesContainer!: View['userData']; - private lines!: View['userData']; - private buildView!: View['userData']; - - private element!: HTMLDivElement; - private animations: Array = []; - - private refreshRate = 60; - private playbackRate = 1; - - /** - * Initialize CSS styles, GSAP, the WebGL canvas and animations. - */ - init(element: HTMLDivElement): void { - this.element = element; - - // CSS styles needed for the animation - this.element.classList.add(WEBGL_CLASS_NAME); - - // Initialize ScrollTrigger - gsap.registerPlugin(ScrollTrigger); - ScrollTrigger.enable(); - ScrollTrigger.config({ - ignoreMobileResize: true, - }); - - // Wrap `initCanvas` in an observable to prevent executing any code, - // such as `getViews()`, if the view is destroyed before the canvas becomes ready. - from(this.initCanvas()) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(() => { - this.getViews(); - - // Call theme and resize handlers once before setting the animations - this.onTheme(); - this.onResize(); - this.setAnimations(); - - // Call update handler once before starting the animation - this.onUpdate(0, 0, 0, 0); - this.enable(); - - // Workaround for the flash of white before the programs are ready - const timeoutId = setTimeout(() => { - // Show the canvas - this.element.classList.add(LOADED_CLASS_NAME); - }, WEBGL_LOADED_DELAY); - - // If the view is destroyed before the timer fires, we clean up the handle. - // This will be a no-op if the timer has already fired. - this.destroyRef.onDestroy(() => clearTimeout(timeoutId)); - }); - } - - /** - * Initialize the canvas controller. - */ - private initCanvas(): Promise { - this.canvas = new Canvas(this.document.querySelector(CANVAS)!, this.document, this.window); - return this.canvas.ready(); - } - - /** - * Get the views. - */ - private getViews(): void { - this.gradientView = this.canvas.gradient.userData; - this.gradient = this.canvas.gradient.background.userData; - this.angularView = this.canvas.angular.userData; - this.wordmark = this.canvas.angular.wordmark.userData; - this.glyphs = this.canvas.angular.wordmark.children.slice(); - this.logo = this.glyphs[0].userData; - this.logoInner = this.glyphs[1].userData; - this.angular = this.glyphs.slice(2).map((glyph) => glyph.userData); - - this.linesContainer = this.canvas.lines.container.userData; - this.lines = this.canvas.lines.container.children - .slice(0, -1) // Skip the last child, the instanced mesh - .map((line) => line.userData); - - this.buildView = this.canvas.build.userData; - } - - /** - * Set the animations. - */ - private setAnimations(): void { - this.animations = [ - ...this.setLogoAnimation(), - this.setWorksAtAnyScaleAnimation(), - ...this.setColorfulLinesAnimation(), - this.setLovedByMillionsAnimation(), - this.setBuildForEveryoneAnimation(), - this.setBuildForEveryoneGradientAnimation(), - this.setScrollProgressAnimation(), - ]; - } - - /** - * Gradient, logo icon and "Angular" letters animation. - */ - private setLogoAnimation(): Array { - // Gradient and logo movement to the right - const movementAnimation = gsap.timeline({ - scrollTrigger: { - trigger: MOVING_LOGO, - start: 'center bottom', - end: 'center center', - scrub: 0.5, - invalidateOnRefresh: true, - }, - }); - - movementAnimation.fromTo( - [this.gradientView, this.wordmark], - { - x: 0, - }, - { - x: () => this.logoMovement, - ease: 'none', - }, - ); - - // "Angular" letters - const lettersAnimation = gsap.timeline({ - scrollTrigger: { - trigger: MOVING_LOGO, - start: 'center bottom', - end: 'center center', - scrub: 0.5, - }, - }); - - lettersAnimation.fromTo( - this.angular, - { - opacity: 1, - }, - { - opacity: 0, - stagger: { - each: 0.2, - from: 'end', - }, - ease: 'none', - }, - ); - - // Logo icon "explosion" - const logoAnimation = gsap - .timeline({paused: true}) - .to(this.gradientView, {scale: 10, duration: 1, ease: 'power1.in'}) - .to(this.logo, {scale: 40, duration: 1, ease: 'power1.in'}, 0) - .to(this.logo, {rotation: -270, duration: 1, ease: 'power1.in'}, 0) - .to(this.logo, {progress: 1, duration: 0.25, ease: 'power1.in'}, 0) - .to(this.logoInner, {scale: 0, opacity: 0, duration: 0.25, ease: 'power1.out'}, 0) - .set(this.angularView, {visible: false}, 0.8); - - // Logo progress used for icon "transformation" - const logoProgressAnimation = gsap.timeline({ - scrollTrigger: { - trigger: MOVING_LOGO, - start: 'center center', - end: () => `bottom+=${this.document.body.clientHeight} bottom`, - scrub: 0.5, - onUpdate: ({progress}) => { - if (progress > 0.25) { - this.logoProgressTarget = progress; - } else if (progress > 0.125) { - this.logoProgressTarget = 0.25; - } else { - this.logoProgressTarget = 0; - } - }, - }, - }); - - // Logo animation is scrubbed by the `onUpdate` method - this.logoAnimation = logoAnimation; - - return [movementAnimation, lettersAnimation, logoAnimation, logoProgressAnimation]; - } - - /** - * "Works at any scale" animation. - */ - private setWorksAtAnyScaleAnimation(): gsap.core.Animation { - const scaleTextAnimation = gsap.timeline({ - scrollTrigger: { - trigger: MOVING_LOGO, - start: 'center+=10% center', - end: () => `bottom+=${this.document.body.clientHeight} bottom`, - scrub: 0.5, - }, - }); - - scaleTextAnimation.fromTo( - SCALE_TEXT, - {scale: 0.1, opacity: 0}, - {scale: 1, opacity: 1, duration: 1, ease: 'power1.in'}, - ); - - // "Works at any scale" fade out animation - scaleTextAnimation.to(SCALE_TEXT, {scale: 1.3, opacity: 0, delay: 0.8}); - - return scaleTextAnimation; - } - - /** - * Colorful lines animation. - */ - private setColorfulLinesAnimation(): Array { - const linesAnimation = gsap.timeline({ - scrollTrigger: { - trigger: SCALE_DIV, - start: 'top+=18% bottom', - end: () => `bottom+=${this.document.body.clientHeight * 2} bottom`, - scrub: 0.5, - }, - }); - - linesAnimation - .fromTo( - this.lines, - { - x: 3, - y: 4, - scale: 0, - opacity: 0, - }, - { - x: 0, - y: 0, - scale: 1, - opacity: 1, - duration: 1, - stagger: { - each: 0.05, - from: 'random', - }, - ease: 'power1.out', - }, - 0, - ) - .set(this.linesContainer, {opacity: 1}, 0); - - // Lines fade out animation - linesAnimation.to(this.linesContainer, { - x: -1.5, - y: -2, - opacity: 0, - ease: 'power1.in', - }); - - // Lines progress used for camera zoom - const linesProgressAnimation = gsap.timeline({ - scrollTrigger: { - trigger: SCALE_DIV, - start: 'top+=18% bottom', - end: () => `bottom+=${this.document.body.clientHeight * 2} bottom`, - scrub: 0.5, - }, - }); - - linesProgressAnimation.to(this.canvas, {linesProgress: 1, duration: 1, ease: 'none'}); - - return [linesAnimation, linesProgressAnimation]; - } - - /** - * "Loved by millions" animation. - */ - private setLovedByMillionsAnimation(): gsap.core.Animation { - const linesTextAnimation = gsap.timeline({ - scrollTrigger: { - trigger: SCALE_DIV, - start: 'bottom bottom', - end: () => `bottom+=${this.document.body.clientHeight * 2} bottom`, - scrub: 0.5, - }, - }); - - linesTextAnimation.fromTo(LINES_TEXT, {scale: 0.8, opacity: 0}, {scale: 1, opacity: 1}); - - // "Loved by millions" fade out animation - linesTextAnimation.to(LINES_TEXT, {scale: 1.3, opacity: 0, delay: 0.8}); - - return linesTextAnimation; - } - - /** - * "Build for everyone" animation. - */ - private setBuildForEveryoneAnimation(): gsap.core.Animation { - const buildTextAnimation = gsap.timeline({ - scrollTrigger: { - trigger: LINES_DIV, - start: 'bottom bottom', - end: () => `bottom+=${this.document.body.clientHeight * 2} bottom`, - scrub: 0.5, - }, - }); - - buildTextAnimation - .fromTo(BUILD_TEXT, {scale: 0.8, opacity: 0}, {scale: 1, opacity: 1}) - .fromTo(this.buildView, {scale: 0.8, opacity: 0}, {scale: 1, opacity: 1}, 0); - - return buildTextAnimation; - } - - /** - * "Build for everyone" gradient animation. - */ - private setBuildForEveryoneGradientAnimation(): gsap.core.Animation { - const buildTextGradientAnimation = gsap.timeline({ - scrollTrigger: { - trigger: LINES_DIV, - start: 'bottom bottom', - end: () => `bottom+=${this.document.body.clientHeight * 2} bottom`, - scrub: 0.5, - }, - }); - - buildTextGradientAnimation.fromTo(this.gradient, {progress: 0}, {progress: 1}, 0); - - return buildTextGradientAnimation; - } - - /** - * Scroll progress animation. - */ - private setScrollProgressAnimation(): gsap.core.Animation { - const scrollProgressAnimation = gsap.timeline({ - scrollTrigger: { - trigger: '.adev-home', - start: 'top top', - end: 'bottom bottom', - scrub: 0.5, - onUpdate: ({progress}) => { - this.progress = progress; - }, - }, - }); - - // Initial values - scrollProgressAnimation.set(this.angularView, {visible: true, immediateRender: true}); - - return scrollProgressAnimation; - } - - /** - * Add event handlers. - */ - private addListeners(): void { - // TODO: This doesn't unsubscribe because of https://github.com/angular/angular/issues/50221 - // We need to update angular - this.themeManager.themeChanged$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => { - this.onTheme(); - }); - - fromEvent(this.window, 'resize') - .pipe(debounceTime(RESIZE_EVENT_DELAY), takeUntilDestroyed(this.destroyRef)) - .subscribe(() => { - this.onResize(); - }); - - gsap.ticker.add(this.onUpdate); - } - - /** - * Remove event handlers. - */ - private removeListeners(): void { - gsap.ticker.remove(this.onUpdate); - } - - /** - * Theme event handler. - */ - private onTheme(): void { - this.canvas.theme(); - } - - /** - * Resize event handler. - */ - private onResize(): void { - let width = this.window.innerWidth; - const height = this.document.body.clientHeight; - const dpr = this.window.devicePixelRatio; - - if (width > MAX_APP_WIDTH) { - width = MAX_APP_WIDTH; - } - - if (width < BREAKPOINT) { - this.scale = 0.5; - } else { - this.scale = width / 1470; - } - - this.canvas.resize(width, height, dpr, this.scale); - - if (width < BREAKPOINT) { - this.logoMovement = 136; - } else { - this.logoMovement = 272 * this.scale; - } - - // "Build for everyone" gradient is the same width as the heading - gsap.set(this.gradient, {buildWidth: this.canvas.build.text.userData['width']}); - - ScrollTrigger.refresh(); - } - - /** - * Update event handler. - * An arrow function is required for binding to the listener. - */ - private onUpdate: gsap.TickerCallback = (time: number, deltaTime: number, frame: number) => { - this.playbackRate = this.refreshRate / (1000 / deltaTime); - - this.logoProgress = gsap.utils.interpolate( - this.logoProgress, - this.logoProgressTarget, - this.lerpSpeed * this.playbackRate, - ); - this.logoAnimation.progress(this.logoProgress); - - this.canvas.update(time, deltaTime, frame, this.progress); - // TODO: add support for class fields arrow function - // An arrow function is required for binding to the listener - }; - - /** - * Starts the WebGL animation. - */ - private enable(): void { - this.addListeners(); - } - - /** - * Stops the WebGL animation. - */ - private disable(): void { - this.removeListeners(); - } - - /** - * Disables the animation at the end of the page. - */ - disableEnd(footerEntry: IntersectionObserverEntry | undefined): void { - if (!footerEntry) { - return; - } - - // Note: the views disable themselves based on opacity: - // `this.visible = this.userData['opacity'] > 0;` - if (footerEntry.isIntersecting) { - gsap?.set([this.gradientView, this.buildView], {opacity: 0}); - } else if (this.progress > 0.8) { - gsap?.set([this.gradientView, this.buildView], {opacity: 1}); - } - } - - /** - * Destroys the animations, removes the listeners, CSS classes and releases the objects for - * garbage collection. - */ - destroy(): void { - this.element.classList.remove(LOADED_CLASS_NAME); - this.element.classList.remove(WEBGL_CLASS_NAME); - - this.disable(); - - ScrollTrigger.disable(); - - this.animations.forEach((animation) => animation.kill()); - this.animations = []; - - this.canvas.destroy(); - } -} diff --git a/adev/src/app/features/home/utils/ogl.ts b/adev/src/app/features/home/utils/ogl.ts deleted file mode 100644 index 9646ac9142c8..000000000000 --- a/adev/src/app/features/home/utils/ogl.ts +++ /dev/null @@ -1,21 +0,0 @@ -/*! - * @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.dev/license - */ - -import {OGLRenderingContext, Texture, TextureLoader} from 'ogl'; - -/** - * Load a texture. - * @example - * const texture = await loadTexture(gl, 'assets/textures/line-msdf.png'); - * texture.minFilter = gl.LINEAR; - * texture.generateMipmaps = false; - */ -export function loadTexture(gl: OGLRenderingContext, src: string): Promise { - const texture = TextureLoader.load(gl, {src}); - return texture.loaded!.then(() => texture); -} diff --git a/adev/src/assets/textures/BUILD.bazel b/adev/src/assets/textures/BUILD.bazel deleted file mode 100644 index 1b3bdd019281..000000000000 --- a/adev/src/assets/textures/BUILD.bazel +++ /dev/null @@ -1,13 +0,0 @@ -load("@build_bazel_rules_nodejs//:index.bzl", "copy_to_bin") - -exports_files( - glob(["*"]), -) - -copy_to_bin( - name = "textures", - srcs = glob(["*"]), - visibility = [ - "//visibility:public", - ], -) diff --git a/adev/src/assets/textures/build-for-everyone.svg b/adev/src/assets/textures/build-for-everyone.svg deleted file mode 100644 index f2e4213355f7..000000000000 --- a/adev/src/assets/textures/build-for-everyone.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/adev/src/assets/textures/build-msdf.png b/adev/src/assets/textures/build-msdf.png deleted file mode 100644 index 0cebbf8b5937ef9bf952b6bd370c63f380cb7852..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11932 zcmV;NE@RP&P)8XTzgdNO4ub)k@E-*^%z^>G#2@PF>Qq$?1Ok~%=GLuS6B82% zSP2IFoLu@u|5d!Q6%68Y=;N6^{X8486g%NiIMXlEsC!->q& zG4T=r?Tg36>LpHhb2uEPtBYN`*t(UL7Mw6IkHmj<6kdlLqJ0jTl6T^EiO@E{mlR61 z+!i;A%oY*2O<}A76=y!ro@LpI1_Biho&sDuagxatsU*n+iJRQK&h<2D=283!i7^;P zN<~G*?%lf&95^s9M4+aorn|d4kw^><4jMBv@Pm9UX24)^_APMNhsb%|S&NrMTY7W_ zECjI_FTF%}H@c3Tc)ZCp&j4_9ffmJU={oU0u*S)WninT(5+{CLd`{E~ccKdF!^vBaMpv(1O*Vl*AQFk#NB5bg1+bTF z`rMU5_bo2-y)HwdlDBI$G|?lWDXhDwUYyDACloczS=dwcJ>)MclXB62e zot^C8zoZZo2~3lzshr6FT{sADm!uHoafT+)V2$^jSp4xxg>{9O2UPE~EITm`uex+V z4K>g4+{?Uth(j8hk3y86OEQ^^$K#nyhHPeMXYKyc(NXs%Q(PbQK6GQFvSSC&K8q9g zxOay;CgubaA|y)2E?xd99QCD4YhL10ExDwGDu#>CiE5!y*eL-`73{=vPE=fKAV%y( zUVMQUf&{;T)#|CKsf!mc_VxA6&CRg@yXV4%3#nAfr7#o^m&C)+s>2+}Z}qY4XwqEKB; zZ7mX1)cx%Lf-g>U+V|>ULjnKYzZmvT|%}tgWpr7!2OOe}8Cb=-jz;XV0F^t=YM? zmX+V_cuCv~@q5_|{p;5g3MpV^pYQ=6oK#K@T7w9frZL|5Z*vRGx9>nTC5F7j_kD@k zYGKlgWs2X4VNjtC(moawACj^Y4Ic1on0C;LqVV|RtX)eq%C>E6*gzgT+4&itUE)%b zB!Un9PK&>XR}nyef4}WPP16E_z~tnl{mgbEk#JMTR9t9SVn)}TU$8V&Ur#VdHY1FD z%BO=2&g+~wW9ArhW8!4(ffL_k8E{va>NZ3qTD*!IHi8BX>}9*P@FI zs<0H5m8@L3;9Cb^obgdcTo7rqPdt)tY@t0Mr&@|fG&~;i`$oa!nxm$f+ z2O17<@hdUQ#A5GaRdaK*ee>wLZr@1u?PT9n_)UPoCN{;0>F80S4K(15Dyr7AUPJr; zr?r{pAVHs;Xt~tl$OuD2xlf4vk8?9cooR4O$Zjb5+kqZ0BHFf$*mPN(Bzc1N(EAuXgL z0Lqlxv@f`rGIhA{W*IhSe8kcJ9xm5eKj6SGn14VHcg58)$2;sS`9E>_oy*M)x3_F= z67&UrMF#faHFNq5nIG<@Ivf(|D?vl@h5QNG5_`Dc)SU^G71f!?{{nqOXZcfD8Nef6rFl7s(qPt(n-SLasU@BZ(%-S4v0{6s%t*t)AbYKzrb z-uK_1=goUTFFd8E$Q(@WRgCnfO6phS!oz5a;GSId2%xn5uwTD^M;&!kWo0EIyEpq` zTp3Fre)wT+ZS9+HzWM5_ug;k>C%5=ZopLZ*YOP#6k!>mwRW*XG*hd_}6w0fL1M~%A zkZo)D>1v;bX$gejdaCD-^do-XOMBU_e4#JMTc}nwk-E8>yQD!o+G2f(3{VafrW%>*6Z_0R0))CniBZ$B?%fA#9CUmmh^U4B|Y`DT?no^yg6 z!j8sNu8Waq<)ivmEm^{|uV}pWvBw_Uw{KrK5m~~pU~8-lzWCw`LYG7`Uw{2|vfpZI zY9xmc9W0$Mi$4YOiuy)I%5gdltpbBU`Pit9wW=kk$ZPzo{z^Fo#R5x|Td`shy1>q0 z<_eg5lG}^eys0+{`7%b$f1c^HV@x4Ni{C^aSAw6M-K7_k$K)j zJyZawke&U`oxOi)`+w12;DBa7LhC}Wx^>ZK@`AM;-SET{PaH5{05*;aqfMJO-Ll|H z*b~v8IdkR;6#NEq_2XZqrxQ=quwgp$O!kud1uG5Ey5>%!9DW?E089zmkM&~=97Pd! z1)`)O?yx8G=NUcoq@F~U*fv_D8bq9tQV!a+#^_{G##|{T7?^=v3N1#kbSYHv<+^oV zgBp8^PB}p*(1G2xy9xl7>|D|rk*M;kUe?Pz)J)B!d&NgT2&EBN8#Y|$p371b9p2Nm zWc06lx4tuPY<|$1o};c~oWwJG zlQo$zqY9vp`mlEn^@U$l7~JzP9Y$k$V^X8#%+L&0+@|{zy(YT1$jdQKD`KXf=`($Q zzzqDke*O#n!V;oIAHPqKnx4Wg$pWF1p3>89@2D5liySdx#K@5&FS+CrLx^#bO?3>u za^Zy+qE{x&Pj6YNL4%mN5MmSSu^b{DE1gxZcKuX8<@K`r6YfYD_d?kjsgZ1s8m{5H zYS%zjq{#rHqgi;#uH&vAO+ZW`JS3Osl2di6Aw)Myyb>%pzQPv~q@>O#6mQlUONgL` z9=XDRa3ZZ3xQOR;JteLFo~)6G0m5+RnP)|%}12Ws&9 zdS5#zJiGk{zr%U{c_`#c2B;G|u2d(R+cvo?zmz_g!E4MJXKWnxVrN`G7hG_`Nhh78 zri0{ms;l8)M7}K%S#IjrkKNdTz3eypWh0SH2^>a{V^hb6Ily;^YN#gAd{Qx z>|K&vw{LtIDPRSe zly}}RYb2ILGxVMdbOG87@v$`hiGIWqVXf=mU-|f4pD)k?YmPvak5!TrM@Nz{ckeK#b6S>}i+Gv9Z55|os;PM`_ z(VL${R8S0EDgfr!{zHZg*|1^59e3P8O>&1rbdVZ=1F=hac^7R15N={tOblnr5o;#` zQ>VI}wKIZ_-AZI5k`9mOXp=T^8MaTLDjuDm_DV_eAPCML_kw8A0z%=sD5pR_+_J8Y zX@(fEI(CGx46u7vYUO&Z_vPbg=9;Ke%o8Fs*dNT!bnK+nTJ0RY@V6t6jB#FVTtdH~ z&1fYk9sz|P51$GE^$J2XoLEo$8#jvWUYH9AK&MWf1YF+3wQJX68YAla?z^uu?u__- z{q@%f&y*=soLd-OU{_S$Q&oj7sg5`;@?k!f*s<}`K9NDVCxnY{LBZisAb_(^!h zaz2Q(YGpcg>T&YPCs$Qf$$$-xQ>RY7?z-#fXJc<~z4g|&-g-+0)KWY3)KhUsMhL=m zwo8{@!Ee(AYHRh(Gnzb^yi`5%2)~PaZ;8{2aJQl8p(e=SZ~EH}y5TxqH&$aC_jL0= z&+1vLY_M*@s%StEBC29B70?TRi(FAs61{hWlF0p89jzMoeE)9Mb9;O z0U@%$L_Xtg)z$S{9z*X8A}?ONm}L^NX%wMxN0h6GIQ?8+;MH@T5dirGj3vL;=;_r$jpEc17}Mw^+My$bq=z);?S^Uiu!ev zZfX=Hej-TYHU1Gj!WyQ0;MruL@f0f;ehfobnLq4eiyr|;FZpQ%%Yxwov6{&cg7iK3>-MHr#e5S zgt$$Om`hU*F3pLj=U%rwQZ}!}uUlMk#TCe+44~<0)22Q1%ro@X_rv#2B$1OC@EIY# zwnRAr#JAsmn~-!gd>&dFu|PoS?-8duPwvbI*!{4qDQN4O*y%;S+=|#rg9+_l_#JGm+9!0rMlhgxZ`& z29cBL)2CBF-~(bYIe_($kh9M|`%tF5p~dRzYVsM-9+Z#1dB1hWqI#n56LU1@9le7F z{f)jspCv^R9~4Un-op~JbDta<289HV#vQ}B8m$UXkebp8&*?dqF6HAG9m9X(42g&e z1O1lX!j}D7Ukmt2_dB0Ob8;djTbT)AT%}fkha`^9GZQ7`r@kj3tjVY_9ufMktEf*77k`IbdRSj;<@K;Fk`J>TW~%bK0~?IhZ76=FF+-PuCO~ zZ3r>Yc9BtqFwR8RQxYg9cFds5;KdhTeCVNvCQX`T*=^y%g%suE|J$~0OFFkgKm#2S zNbZRg70yfhPhKNQ8ibNRP{_8_>SslvaefKbE^!qp8a;i zzI+*w41hSX$`bxk4sep-vScNr40ZzB`RJhSjuzo=efppwHWK3J(i^Hp#3yLNjk@tq z`V+m}v8z~lk?0C81{qLUhirp@5G_!|SW!_SA)^%fkr;;`emHq#&J~{WXdxjQ&|6eU zYXK2_B(nFay&HltEq-oM*=|SmU=`m?uwulQpa)K2+!1t)y>7Lq?tkl!7P+lrfMti@5F4{7 zHc1PliS^`&am12il|<_OkU*4U?gL#B-wk%=$-Q9n$u=ttCWM z7+gS$wOFyBlR+rJ>T7gWg+MR}0Ymk6p<}~l2#72&WF4xa3$Ex2t`6>_Wy?gS0okcC zm^W`8^+q>A&4oe2_A9Tvg0scO>(~ewE~^F{*2HUMAyi=?64=z1E>I6~BL)VC6(n9e zirxklk<2jOYZi|^{5?{Lv78|dmd=&Vmqth5qDE8h+QBkM0lIJPjarB1K98&*Wmo zJ~atnz@#ErLF6iuWroiiFB?{;iUCcK=_Dy)^|0|AJ;z3)Xa*U#3F9U%{wR3)#SPbkMh1ip4S$?M=i$TM^p2bt{5_Pf*2x>ltBl z#_PhR+JK!Tyq}_HI^pE2t-8k;W5ZW17(Erz;O_+ro)Z5jtckD+3LmC0hs&yqGJ`9kQ?oPxCRvyGqZ`^j2uPBK6U z(x-DjE$vqt86X5Hc}-aa@`gB0WK@_)9KVTs>kw%QE%f-X?+wTE7Hxr^wF3jq9P`R<9*ck$adF71ig04F=!%CR^L3t;Z71Zb z5^6K#{AogI$0XuPQois@DhG&V%uX0$yO5oVfgmkS85y_*Y5i^M*CQCpBow6eFRXVC zPy$Z8K6jn|V@y#h90_bCq^vA^SW(I&l@y2=vN+)J;f-iV1v)v+y57h{O~^9jax-(b zb?>;ZBp~XCSSufNl|CpL@RK?(=C<72e&9({wt?aa9MhDK&Fb})dYMOeOYohc4 z<32w)(VEDfC*MzMIEVf8BN6aXU&Zzlc*Xj;%>g(1=tGNeqGfsfyw;iMdP*Zd%@rZ8 zA`%1c|xN0Hs$`cJpQ&B1Fw}>#dqNQO0(|yG)iDxoO&g zfxS<&iy=@9%*ETMIATc_mcco0LCL_CTpx31i=irxb#j9!Az?SOn^kipzrMNQ(+Z0+ z4oX@hC$b|Vzu<)-K!||9u{7Om;qE8M6ziuRE5rY|L%pf7dByIL3_0QXZ1J7hd(UcF403;(p z$-tFhI}jphnT74Zw)eJ07R@`T@Hd4Yii~TTBlSYZCe)s1xsJMTlqj4t0WG>BEybd= ztm1qX{U{Uz`xs-KPj9dLmP_S8GU1QE$ltm(CaP_ zAT5*5O*lYHxzsf}G-ErbQYh@b_t-r^GAMf>Bi=e9=nR#1C|DOpK6c7N#bGZ_pAfA$ z(l<+#O=VTP41l8Z)=xN@>%z?{H1pw3qM7Zn%|pP6uA#ku4Tpvtfu> z9==5q*0n=|%@Wq#Nlne<#n!o!>$P1_mjxD3D!sLLPCD-Kgm{&d34@6=vo&?6C)LW{ zwHV*}F`P(wh}|aamRrLgRgwAz(q+RQ|T(ugl6a= zAt$b1&k2tTK~@dVMYMC{Mo*s66Csjtk29cTgBj&?L`iI&9=2FO%UX?1IJ z1PS=**Oax=LHPl#UF%GWMq4BppN4sxKA1~1@}g6jkLgt!EgAD zEyv(Ui}v$|Xu+ia)-GSdiSBNANhU{`;l$*yUGCf0r7FJpWwl zzp69eitKzP0NGw-W@)>CIuxJd88Vw&=q*ckb9;*)_#fPvcw*YNzNpA#m%||O#mZdR z49qqCtg2{TZK#UYnP^Q)z!?&BRlwwj+Z2%4e%foURywfz{KBUz7I6-li^KzTI%nQ% zLM4$a5jo`pu|$NFE_}rg5Q4-28IP^klmR-xaAJBO3dV9%$YB?{15Dac(ZkP3UN`BQ zsex=EXEAWfD3QdcV&I5YE;Y>tvim(MDNHWfqllVF zR7SuoRV=8XM44jGD;D-jL+Jv`moH}*iVWD&Pj6KWT*Gr&2RVBf*vXK*|H-@mu|8(c zmUV_OphQI!gWpS+Nk7w}g9aTsU;x1d|KNlDz4!KU4ob770a7wm@gV-e31`(Omgz|S z8@8a?QeZ`nd>bc?l16H;bM`uP;J`z$Y`b;y%gTIwd{C`4Hr05W_8bFbH|GVr<`e@4;0ozN9Xhzz%f}zz zs%KAR!tc<*Cu2)mDh*3TPqgDl#F-N6VSvS)%EGQ4p2}Iip8{v0s%Y$P3Vc%O%#-)s z`4iDHm<-mXNP#)Z%*ATP`%*=bvP)@6y#0!`P$=q!SSv($bRU!#pYP4-Lez9}IjU-? zewISd4LGEX9jUg4Aa%5;g%_TQ=*oeiwHwp!@G(dHD8H`mRij2t898#rIR|T?)K}^z zm1#-a2q*TYRaDR_defx57O;h>Q(*gvWRg#Y1QzV))%9KNF{a01V=m`Z&anOd_a9$& z*~dTonFfg)2*NqI8A9S&mtrGY1+5&ESG1}K{*EC~z(70e!u9Umn`5f*p~u%`qTnXw zLTsHnM2Ov7N)OgZVZ)LgAnJWVAna8y_{Bfe4^a0p-EU`5a@*+9D=xkC9}B zwYEry5IKy6jDw~CEu#Gj7>@v~M@dd}U|Y3qZ@lq_3@De)@w;Iu2a`U=aRpRY?$Duwt#(0e2zGb5 zMRA)Sf}%3Ewhhh@_9?T|iHuqIOh@#W ze>CPJ1ii6+GUgM;5v@PBmi2)LW(HUMCR0(tA7NX&HUqVgJ!WbUusxrj_Vf=bgk!7} zeE40|wX|zh*Q$QK`k@)|MUNajESN`lG-PAOnIoWKJbAdrZqzGE!*9fE}UOyzBk zi=d=f!2#M`Rr^&9s2p$*bq*=3%((!UT%xP4$_~(>%U@dFFgh`D=X1;-X3Usmc&CVB z@~W`h&=3n%E~6$IwsRnJ)DwgIY#ng)LH?g&KFBl?chd3kH*sbwssul!&C>1CZX!&Zecsk0qaU4KBjKrWvWYcXe5zu@edZ)%&vj=Q!4lAH%3~5_}|qHVPjogF72P} zDMh_FN`6@r7(J1E8g``2o;^FaqzFRQqel-GUCwVo>Z~V`s(Rcrb@8!vD(Cz28G@s| zqZOk5OflTk6jG$%SVWN6&dk*2099Jl6V>|DciO+Ra>dHzH6Xx97a@k6h_b}bnAE?Q z^b+%-vF;NpL&%Ba^NKstxBy*}Zy{Ug5%q=VM(dSV7QHk-q{Pum8TdLW!3H&RPMF=X z#MyWl3oL`w)FhPw`5>JIiwq+a8d8nst0owlh9OE*NwgI{eBY<4BNY#a4bJVhCSu(U`j+!jbXfUaH3VgDAt4uR;_B*OB^f& z;@}{h$Ot+{D}!PWv_hf~eHqlWtbqrj$6!^seR9rjvnq2w3=Zx{5!_OhQl*())&0~D z6PvhPonJ@6h~PLa`j2sKBkA-Ll4T~>({u{2)NAa%Ij+%J9IRk%8wMRYfdrKg)Ih?@ z)QII8G)h)hGyoD6AW$4H*2n-HRKVR*OxTVWB)o@R{4RTYdq<9CrxrId7HIkesgV;{ zl4Xoh!@g#du?(2?6zEKrpV*~d>H3R}y`pKDi+y>n^25=RoG4 z3&tNi!}o$qJv=2IK85*?$mas__oppMlo53nEvJEzCx5cpRy1bbZlV^AbT=+ zw=CALUr%lpG9R4V$Jx08u3GenqH*S=CPa3KIeLYm8SW1k@bbJdsPi~v2$`<)*TIQY zU4&{_w4Bih*pMpjkWvgMrtJHo&iGVKg%i~P;?7t}1oAj_A-N5SjLsf2dsSwD(t}mP zeEGqo-P7B%)Gw6_=v+~9@#?22$Hk_iRVDx8zAyi#c=Va3&g} z_?@z$)xHTrU`oP(R`RHwlO#t4Ihn5M9DUWavrKoF{-;@4X~b~v)SaBH1}EC*L8du8 zLCJvnM%QO*j&b>?2*0u06v5@B8x-5*!-L!t4pZ9wOH#|0vxGQ53q=oWT1^C+=6(0w z$ALtYnB6|I3^<>N<3Jfu+#_l_P`fzf$O@Is$noVTOlI*51ceZTiJHiz%}@}KA0Cs3 z#hI>V!J{Qe-p*R9mD1}n2=?>EgVL}F0AgUYyhK3o5I=-4^jvQ*>F0Qy2lXHfgWBjI z1;6-#7JU6-Jo2oiiswxe^ub8R@m_@l{0;?o=CfW$*=1k8Bq9^*N}&8b*$ z^fML;f=iMOz9hT@Y~5=NckmHzZ0vmesTlm)qMF@yqi^vY{I*#C6Fwi#{?*>5ElW8Qx%qVF}b2yRV$9uwB3I`{*i4bu} zhgdUH0xuprn(<+?zlwDp=QJ~cN9DGXhSc}+HChZIX8vIMe^u@w4U1@s!w_j|ZM^*P;j`{e%%e82SM(7vj!Q=4nkq#zBY~{mMLpvzJl4mj(F~#GTos zMeK#R3j0#=DpDAV>iM3^c!E|Tt!x)dw7Y^h{BhAo6cYZ8KGlHf8S7h*5Om+@A! z)sKi`5LzVO!qz=@s=%HIl2llTo~JdR5JxDJT>20ad~tZ#@F6l)%Z8NUn8u~ZZ1v<3 zW`UikX26^c7ABV_w%Z$|bF#m5iOxJe z)%{|kDdP%PKbgJYts<5xVF5T1%7znp#eer~p@ajaj4MNNtdvnwT$;UjpQ!6Y8R@TT z3J4LBMotO^oJfWQ(PyG4_KZq5F31+%hF+ zNxzeNL~Q_#mnLZ&u&ci->o*SmMotX2t`_T0nUs+(R1~mWCW%(gfc%#w3$&=$=Q<7c$sEPq6;<<(sIcy-w3057Y4D_ui?vXOmCn|y~vzP5^ zPPoiSvy=!Z@+_{6oX8S|70WRFe|u-l+Ef^Y;pckA(r)QpnpV{169j9P(8a|LE|v-z zI+qSkP6em<2kc&_EOrozAYC#@vviO^r4}iEr5%b9iKd}7A&p{8!}anl@upl5u8IBR zJiJ`KWIFJj``+(x;CylCCk~z<`aqmZg1oO#!5)I#4NisFgO7jAaiBP#)iBy9efH0o zfd*zBC?cLdqKrcQ=*h{Tbl!z@MByBVrU477JN3F>k1>`o8Ucqvq`u(C*qTW8U>9n1 z`3~ABCIiWehj16J_IhF$*Cn0aOQkf_LN}#!JyEd76CG^DL9k~Rv{CqHoLa;mU{+*} z9>XKJk9)&auB(0zWOkP6X_83|yWvsyfjXUV+=4adL@`0Z@86E}*o8K-BtypG4m`j( zBPy#@HaoPiKqkZ79E*$0&oeUvB^>nL)1Xiu9?`VhtgVsHQ!YoktRQ`7u|=T* z8a|lkM`GgiKN*H#$>=G(hDPL-%{|v;uB@=SO0kF_o+wDw{3qqJKF38vxw~w^8_2;D zJTcD~sC^aXiAP7Qud}>NE=Qq22*Hsai(Lr*V4O%}WSP@{GI~WKm1x~+J->csVgk=& zWCX{d-KNpt@Q{N8c6Qj@+}lnDKE&M+p|j6KOW7 iR;g6}?ubk2wD1cw&RE)5xfVG90000GRb6;NhX<0lF1~= zBT14ZnY=QYB$Fh+|2yaY&OP_u-+S-v?!UiY|K|hReV%)sbI<3TbAG>b?(qMTG(F$w z@BSEmkD9kjdxt-^W_oJyheYites?ZHF=w}QzxwOnjj7K)#yZHL4}qkO$s9aH80JZ_8rj$_ zGO0!c(#9085Q0~vcoW&!Fqvc`O=M%#hG4Q*=oed8A{#p-#oWU?$wwnd6U7*lk6_9sJQoJaEF+82t({zCJ@x4j8PdYr{YhDFkD8rifWcipEaJ%}4b??KIhJwA;qil{FwXr2h06 ztC}L4={o$Pixf{_Qbvjam8NukBh6k<9xP_ml`i1+0+~F9Ni`{kEi>!RS}@jgy#>&` zOUzh4ObUn3NRxVeE@MxB!&ncQG@rv*Vv?L}*Sn2fS|rif?diy$8nV<2uB8m zz%$aE7(d@_8Y4}Ou)pwv6s6odJe=GzjjfTJAyv>P(j1?XrrO_F6Dj5p)!5}DUD2VY zs@nE1q%n=v{{u(&^$L6?i?wITg5n1si78@Z%)#=~`hjU|loV&ZrI|os7mv7c;IsPc z2sTz6v1AVr`uZRaT&~ltmSkhh&QfaowB{qvKsHPI1fz(UPff)I$@XQkm}g_mr|##y zM#EeMjK1@}G6zVstaJ1w7|T-R6g1C~VlgkWv0kzm&$CAD4`TfDu@?8&s`g3o*=cO_ zj!Gb)sp5L`wKzXXrS60^V6Ks(-EPL`fU^=a4r3=>Dm$p)D&GNfofMq_5C6kDC_2s6 z$Tl``1-~eoCyQ19c_+r=>sVc$xs3_D2BI3v;NJZKO!09zV_W3@xzbY(gG^)h;fC9G zJr~R+tF%dESxqqrx0P$Cu-!3j?8GpZ`pbRX&;#ZPDgHtkd35r)+1AF)=Zh`!f?)LY z+h91x`W9qtvo{~njj@H@Y-pN88M|u?D0g#=8pfL7;g+zoRANB%nef11{fRexcwW(-U%TN*25SZ zF>@rw3Mfu8w6Q68;F$Uggb4m2>ReqvTd&_4C&KCXeeT)XSTnryZ@#Or7T}1RUr5!* zY-1I$u?E>OP-`vF8St*ogTb@nVohXYYf}2t8OGS(R?;Y*b609(jqtJ{?Q8VuitamS zvPLUN$>HYz4wD>GB-q$#36;4LTLic#I|JH=tU%5%{SmmoCqEMU$I6F@sJ zMB?sBJ{wzv0jC3*SdjL=xJ}%~o-rK*OT-LBGnO!87n{>yV^!i9;vO)njpe{YKG)fa z9zfjtt*zA`I_Du_nb}L_e5^<( zL60LDD>YYNo2_7D4@prh-Z|%Itb%+v<3e~tetw`x^VRD7z5r1O|@}u0}825^WD8{(V2XK)3qhqWg$QV-gOkZqF zUaL`z@nEX7-v;}JKRd<(jA51+fC$D)%uNKFoje!_m23Nx8s20*npurxA=L$RZox ztZX9&&D#KDJV1M3lkxpL`-12m8HesKnef4aW)lh)3YVr=UmlVcW9eE$AO)q1<#*)%Y z5wGa)#qqvY>#WM!8K`#dF-=*j9ddsjtxpeiJ}8ro885QLPaHdP?~NmKmvpKRGM0TR zyggq}`^%GW+8cb0C0H1}<^f{_>vhLL#&}fFT!#I-p^RbE(?9O$@Ydg$o{N*->ATbM zTZhg;Rc}9yW{`)qXw1B=&skWKEXq9F5!(ndh9U1kL6$Y8PI`=EX+5nJ|Vyu&nZW`J0`j3+%O|1CfAkj(P*xF&3y;K z7;_*NHp#WP3q==Mv;-R~Aor2;^)IAwk1+}Ec6+2bJ+Ryb7>n%^Gu6@5+`ma-je%=O zn=h)0lg(4a+zK)V{oU!N8!=q19r64hop)sO(UZ#2VQ(@QS-0BP$)eED*bv!F7+D50 z-I6S>>eOY;A=ntY$ztVcVHR@B`cFuaLMUUKm&~mrn|DFRq&=g-`B26R4oRdHfyS=y zk;vW^(+$&LuCX#N;b*LZY#PlYbCIK)!N$153RHwLwo_=&8YX*rfyVeBHoLjujG>w& zdJt?3Wyd5@Wrm&1p*&nn#^GxWJ91&&BvFG<#`0E3q77k;O~s+e-zAf?N(39jAUUZ< zNMooFhDs;G7{l#tp>x-|lR};;#p^bs5RC;F)*%e@N`y0pE3>k&U}MYop($7*o9!|L z8*@*lCyfYg3|Gg<$yyD<8N;Pva`EXe7?cuI2?veaZqZK>WUS=h3aeftCu4DhH3q!! zsHjAcvHiL3J8;mxMT&!-EQB+Lo9~I4EI=q@OvQv*;T9m+7;}5%gls0OA-)Yj-{7Wo z#q5?Zav>X&3fqC3$0@Rz;1&;O42ixyvYCGf2ZbJPCdBqAY3Uj0Z?ACPW!!IGWODDl zp8PU1`s|kLCaD5!jBjn|otR%_y|_F-(c5qt{-yD?OxPr!y`No5%}@3>CGfvTnnB@k=pvKm zz}&XK_@sGkzL9_$hW!Wruul>!9Fvzr4Zh`P$ji&mn4usquP{S#25O2*iZh`pDk;rUR#u*+q=L7( zsHsjjg1mx)qN1XTl9GzrT$Qvj;>FIY`R5|m~$QuDPcovgJW;!Kbx42rj(9sYJ|FR21&Lx>!llV3%iKD~gD zf5QtDUD1DX2$*p1!4&wm1++RG!VzJse~ytm$#S8ecR0lB0MI<3Bc>`dV5(t!OW(jE z9Ox}Dbrc996BsoIlOY{=fN&BoN5d+kE5J)CuABAU{33Ol4yOM$J zd)SYg%}BrpZcjAQ(m}*6NTqPVtA0H3V8>fCo?hK`DqvlZZRQ!lAf>5!Nuhv09pDYa!N%oo&SWdevpyp9%VgL`) z0ttQcW29iA_2Ph730DMYAXhjTp^G8r z-O$kOAo04)N#K1>H-s041VCB1zz|chl-G)?)RYTP?$BW3^?>SXBNUB=!>(^PupBY@ zxqnFJNBcx7CnTq%K@M{Pj?@`gz?}t#vm+MYSY;k>H=n1E>Krd|G+Cf=2Ri61Wvpb* zGb|qEE?LQ4EW+sd_F_M9WX;N9xa1e%lfjl zJRz?IBJW_l-S~+!v3gsPtvQfIS_V zkpcgL)0bUT6y>=?#0W zq0e%>e1N2~s&u?S?xa%Yx2*D%)w`6RdbN2 zm|`;s*0aMFtC*I0zipMvV6nF3usa%ZxS~=OvoK5OpJE5cDOV+X|`+LEf~FOiY}!<>l5ehgdSHP_fJ`45iyZ?TIp(;XOT zj;MhfK~hZlq+i9w|I`o{AF1V z4xvZ16jR)xNJ7PtcTObXMm0u(Kl$o=11i146mW$YKqDrVdLRhKS#*&mg-l~S~0R2RLpm54#5k&=S@Y>kWlb0Zp zQK*R=3q&cAQBI*f0s;FUdjy3UO0#C-djvUE$mU1TjC){dX_@~dws$Zv$TB}aUziWI z$=*IcuXZ_`VGvEFQia0&{AW$gv4erA`EfWLwjDcQv{Mr~!{G!3`UR$IHOKbZAaXze z__r+~)@m)=Uq8`UEUu~Ptr<+quWRb+eVUeUDHIAR?6QQ|(N4C%LG&VypPye~U|OM8 zN>?u^2nYyB1M7_C`%?q-A;XLOKt13p)aU|yNIU3fm%a2KZN)>0TTiP?0p&QlfB?S$ z_O^KcmbKju`Z;W{-VFplWS}{=x3{LdyGCqBSK-@>Pj>+S9am!$4B$3Eo*7&Dfy8hxwDSWW@@&Xh)QE~TldInD#OY7YrfbJS z?)}Rq{PKAdqr&d$9_Yjsz)@)g0A zjFMNJz@V+Ux!Ffw)EDk?1w#x;`^!f*+1dM2Q&TU9SadpTF}u9!HSbY4=OGt0usafFqo;`zugAFHLmU=NbenDGBg?)8( zf7OM?MmImpHtZHVaQlxKG^X;>v-dn}41-$Q$p=i&i)}XBY~H+SY>mmDt-Jszg?^3l zXlky;Yxnxt!2ouR7=lz^-&MSM^JZ80x3Srf?Y`x2AxARMGCx|gQf;X4?NO%~sOLd2 z*;Q=g>blw06L>fD?S9r&t>!S%P3jJi%vkv5byrv69(SiWo51w{+um|LE$dcR)~#FD zv#wwHkiD}pDIu;?k<_}1H9M>B*k9j(tr)#;R5Y-8i<>FVd_=?PjlZ^&fA+8HoW z-=KmipZKQb`t>ZqaBjA1R^4l6{iN2qohc!ODJdx-Av;&+?y}+NzdU9p!Z3kiMP66e zo7b<4H*wvc@B-7hp|Pn&FuyiKE4q2%#Zz!RrPwq8R`~B9ZU5=#p9bO2{X@2P9MdVU z>&@HlJ{V`cJw0#VR&55pW(gK_7wA6F6ZPK>92Fan}z~SLBt;wdQ z5ZCOTN%4%z_mu=5A!6CtybWVPK|yQwAFbyF_ytMQZV8JY53bX(dED3Y_HE&AF$2IF z^e(^M|$l_Mr^OmkLk8{^wk9nLr7Pxr>DH$e*(H|n@_s*t15kW8^+cul}cC(_& ztTrFJ+!f?;J@fTgXx!zdXLXx$EOIQ0mzy?lqgD<=9YXm)CPGg)Hl&E&_Vo>}+r0Vd zP>9v$$9-?Jv~u(l^8Tp@R^vW9_eltY*1C1-U4=VqB-%H7KVd)oHMDNC>(jwW?T?i{ zqO$maiKM069OGJM{c}`HP;yWp^F@!IHMVpGgnI-q)^;;0J$<5BshSpix6~h(-FccfClCa&*^FH%JB(8IFO(ZQX;Mesm z_&RsY^9Qa7#^w9X+#CabCbPaty$iw%0q)8bNVu7y&3!*S0j17=A-p%w_XyP-mcO?_ z%*|&Z5Kt|EBf9zNAyMUZA!N;DGq`86`Ef6#3HIa=iC78Sj{4+m_C1rj&Yr#{O{yJ#g zWYf-d-*Jp#FY!-k1MEMaoXy=I8a?QlcIA2Yu8jugCwJ~F{CFz8Yi#|wW01LLb+C9d zmVC6?8&J+~dTZxCTsUSD8Vy58Q~0E5T}aC0$GEhvv2~N6H)K(|R+M?l=r;ipiXV)x z+`glO+pi2~@39Hoy%q5`eLR)c6{IyeSr`(sNSL2f)-$RlYKZS1Oy_QI9`4HR3#$J; zFfcu6&6=_C{KTzOuYwR=m~An*p=8xNTa zRq?oQ&~kju*uDMkTN)B#VZ*g}YQqKlDp`Z4G79ii2H$VVqy5&P<8e7PHJVdAFP+Ih zOQjldI4)%(G@d6C*iiBPU+Gs!qDxk5f|V_DBe%%+i@m`Wc<{ zIdZDu;qgo-r*wM|03cMeYraf|ez;D0m=aBm#vn6Y(h)jn$f8rct*zB2>+`DN@oG-- zXUS51QiukI0R90%P72=X8i1F!%(G&H9Ae?byg0WDnTdf0I#TZVo- z(w_vu5nz_$xG~pbg^(%gXHS?Zsq> zm(>o1B{YbMe*9THj(Y56ddu`U%Um*TZ6^;aDB0RFW*Lyl5PMKaq!5V|>U<+7Te}ac zs(>UM*#iKej}8r#W-@H!8tyBpLHQt^0AM~*+9*_z^AyS{gzH06ak;WGI^B<$j0CHA z@#;N#s^MqOoQbDF#I{gDD%np1IOyUkUU+Cd%G@mQA|BkEPt>UJPd!rR2e+qY>H0c( z7$QAx@^Gen?`8&+^H>Mg*O#w0}w%>>-ZorW22l*f`D-KZj zP5)}VYPb@E%;!hO48#mnuN|m1uhP@waGYq9-D(Unq*F=3z=*>>6f;l@#I-_TiHzI= z%3JR1U*$XLhY{qMzH|rB?U(B2m+0mP=;-3BX9|_{qnK)ZHOwnKo*z|1tzG-R+W1|q zrV!LbMLAuyxuP&%Uo5_wKnM#@r__%dIT*OzG)?EVB_TtMiq*-Ks62f+; zTJvC~@j-+j>a3yN6R+RQ(&-PZ8%oreY@f9QwZ=Ksn*No>{?*0qy+z9!qMEHSb6~(n*8>1szs}s%IPgdRrl$pA=bZe5X>AQmW!#s(Gh+ z?aO5@SGChr!^zBLj`G$J-!gE}C)WH>dj!cRR>L=$ZeR7Ab_PLC4dw@h@OWp6MJF&s ztR3;LjUai)y7?v3#hJu6t*UYgQBV>LvNKVmGj^L#?I|lOtM!NjbTFNk)_Y;5io7a5 z6gP)Mjk!~)Vlg^8`Um{?S857t^p-gh-yRQB@!`_NOf+I~T)Vxze zh2a`BLZbXCf-*&OPf}8?@$J%!7cN{lcj4T{3l~)mR+~pT#jD>g@mb8h<5Ff1Bix9i zXI80c@yC%rERH}M%_-F!h&oGF`d~`Q5mBo6Q74sMG9mKsO6Pj)bAaaIuy3zv_1agy zWZF8Oitn7;3o`g8l{rq%6pi*cD-#o)As86J4C8V&oaYl~1uACFoHtK>xydSxs^4Jd*nL7#g+OK+aIU#r)}5cY z_U|1#G&OasPDIBgTvR&405dxXCotMs(`(ConKbK_q3hRc&z*O1;I8@MyQA;IW~tFU z8oWw&MXB)~B=OJAQu*y>=*smgfuZPF?dZgg;Kr+u&&1E$8>V7UW7ua#C7mT>3Ip%` z{SO3x!cq`ZTYCpjZo%cH5-(HCmI3pE*uKh|pgB}hqPGq^8hVC3+q7siVx_LO)f z+0oO@u5i5RS22yY>dMN2kH>08KVg<9PQ;xvRfxB>$=eu4n5BQsrR>Jj2iAndwFSXD ztgJebt^1|rkK*N=)V}X&wZ5-w%QK)DE%RQ2Rj+hdzaHRzJXYJ<*53I*UrkN5um~#) zC#!{D^R_qSVZ>7=IuJDQMpJXg;Y00)G}`yQ7-0$hvLSZ@mfPZ!&bZ98q=erm6@sL#H^u| zUbv7D9d{}^IxgkK@9k?jNEKy*~YR4*-&{X9dEllu_UxOGgB1rPqVUV$frf_H9AbP(Ku z2X)Z4y%7kqvW)~cd|514_xiJ}ZB+unJ=h1awwfWzE|%*xBVdPCfeWzC;1@T}x}Gky z+GBBeu-;R>7@#ar{Q?D!r$h!q-bxOe2^?B7un4lO5s0eRj;2ez4ou;-(j8;5Ug8$M z{Q77#_~qsF`B2}>cT!Yed>{S!iwo(g>pR!%Bhyl{ldN(N6V88k3IreCeARbrb>7!1 z|M;rwupq1PD_KF|i?8|$tG?DOvE9+1_Vgb$N7r-PQ9|SZ}q2ekJPKm)-T1 zY~NQs<9(JD6L0>@i+7=8^|{%5LKprwd(by{|9^Lbtv&8Q+5g{)1h-mHKM?cq^zIg9 zf0p$u!YR4g6Z;pkwgSaHYiqW<3`*8xsT{Bze#Uao-Te#^;V>oNg zt?_;cP~@D6h`b1h^Y(|*SnNNZz30ekX`d{6x!L`B3Df6zME7iO^TVyky5E6ti;nDK zp!nDQmBE{&j7M7PNAKa_T0D<^(-OFS;`ia}!+-I6Yun&3GV9~fwYOka(IMi`pQT^Y zX@x+PQ!|B$Wr^1%d|r_w5abA-u-_Md9E0D#o_@l%!r|Ka5sy`pcif4^T+xg3yRPv= zxp03hN}Pl*iF4*Pz8!uo+20?o8v^Hu=X}V|&yg&AUKFW@>neF}gh%%`@436XZ|}Q# z?`@Wpq^m>&V#sVndV4c}dtcGm+ne{0l!Utpr_Ju#E+vll6^-}F#Ln-6+YQxllgq&O zeCN;4Lxx*+uK4*GF6X@I+s9y!HnvEzf9nuXpS*bSze%E!WK43yZC;M<2oOOPtWPob~ zJU=4mlsrCwj+WQ6;M!vqV!*B70BToITHm6LjPUNr_}fRAocff;}Iz{2DuFZgyFhD zx=I^y<6x#h>e*wdF_2O%dXJ2O6t4NtaNXJct`A0NLm-L!saiZE*yLn4@Ze4&a3}i< z9nm!sKRJ8`MB0K-Fk(OnnEQmG#gsU`M9Nl5>0&BJkhda87gM5i<^Q~x5-_5is-v~( zlG}LE!;dnk=oRd%t?UO68H>dqg;cTlE!@vRGpk-3Tr&Wjc&j#^bW6P$N2T77b%@2a zjePz`ow(0E)m9rh9KUO!JA}9bq{2%58VCB?Yu@9J@Tt^+8jylE22aDQ*RKL1C)EBU zwHuvqLhx_D>rWoyJQug%2mX)-ejJi^x=Amj2gLHnj+?Gz{t$G)nKShb7(a-gtxuz_ z{=c(T9aJhhBVXW&YXxHQBUuOaASgmo&|VKV;z$1f=P^}EzsPtkJ9+;9lLGna6zHP; z3;}~TVj$Ldnji(LOH3)&-#dEy>u#Ce)2MpRe08|CY{LHC`>yd4!sIwM^X;EHb7LlI zYYRfnC&Xjc>vaxbtzn_}g4ck9mG}D(52fnxQ+3*~nfI;bsZ=X!Wmap!;UWITwlJ*n zA51*))8Sgz{QVw4nqO*lKMd=~=GmNjKmFI^!&Bnmqgb`Y2tW*#4SaA2) zd$&XnuBbqA8`_m)zZ{KKlw>`93_C&rKIS5*mxE&8pX_KgKwtp>vo( zJxR7RzEf>nUEVM8i(UoBst2tx^?46#oX#olSh?UH5EG2=^sR!aq?vn144lRVCaNB1 zz9SzTIVk;1$S$9(Zd4UK>Df2QWd@SZFLXS=EeYK>&w7_=^Jv@YifQ;XMthWmr%V zQ8d66)k}Ou+i{g{zQ``r}8=KF1CDE|SQAO1dK~u-TOmr#O|ILl@x% zEBw7MDHmi-ELx}%!No-mTKpvBd}u8i;?wlm1%8pPq7(vM+_oACFy$(e$H?7 z)J?86X{ex#g(>|KhAqJ9cM$%=cWQ+*<&T%Vs<+xf!eqA#yl8gVQT}YaA zv{ufLkpQQVI%M?;dt)*d*S8>JtYnECh_$Bk?o_#PV7RvL+67DXhx!(uzpe6?FCX7L zoO=J(($*RM8H4kz?<6`^qX9vs8jl^Sptelff5LVgEAsz@<&CvZ0_(=y8;8HC&uR4` zmGi(i7(FocQ`djOinbNE#0^!B6+d6`3A?$ig7WJgcX;WD4Ve)dSJ@fg5Q`_NTp!I% zdnRuU9m^>0D|=Cq`|BQHj6tDKM3a->AE>ZWj~BeC&uu;Sd-3F{1>u%MrKI{?cr!_e zN(4MWoYm{hk9>avHincNx=bf+?-%tsF>EoiC9bCK6^|b(Sxc(_u4DK0OX0fntj9?e zlnZ#diG>vqwg}1%A5wiz|9jqbxzrd%3O+&jCUR4$YeV>LFDkzKb-oXll?uO4}+JdX*+Sd3Gm#nx0Q{;)Z)FZy9NVP{{`x@h;gXtfd;QVT=UrUUSY%{mbO${7?G6pT*lOEG zBn}XX+NJ9zQmF&aV?wT&(`}R@+q6$r58UVXPmUvHbeph&<;8^)7hC@X;ka0Bxpl<} zp`+{8KO{cTTl&)6X7l{)(c0?w6BmXbzW!hvOC;)m%9+QXm%g899|#@(z_A$r5ZOl5 zBoejO&WoMjHX7I5*yfuIqi!fE9=@M(lsXGHJ)e$iJW$O#fqkZX2d$_M4pFW&bu$mHc1XBQJKtN_X;(-WDqOvxjvs*{!0NQ(*QYXb#{3zC3}vBDZy9@oe{{Ryu(DNAJJkuU|D zJFo#AoKK=X-zlq+PJbftPmF$GO+Tq(Bz3j4{`$c&Q!Mhs&#h+9%Zp)r#?12~5p~Xc zQ6P9?OmAIs!;I5oD)`0H#Nk}T`Bzu{*qMpdel9E4R zblWRv)tG}w8_4M`m6w-;gDKtSP^=QnV&T9Rx5NuZ?nb4!Fe*eJ=5V5Ri77B4nYsOX zdgjMqzScyywbCZL@x|a7F`BQvrtWI3R6iPcc=mcme^mT1>iOZjV-Gy5FIE<-k3VxA ze?GBr;%@EW^NAUrbr;JE1;rPw7KJhe#p>_d`WHMn3Sa=Z;7rK>VxfFiQ+^subwXsm;sbxB z9?6WQe#HSHk{QDfNKROcq5J%Tp5>@FC@Vsq$Z3xQDKl zkUijvp2{T7K8<|}nxM#B7Njp3Kl>;%>$%oP<1h2_m~G`qjlb0NXZ&D33#y=;^$wKz z*^j871diI{INQIta#&l91h---DU^#|PLp9ZRK$YYm_}xFgT?Y_*AS0VVqRagF7lE$ zuc5@C62du@Xf>!1vKG2Nrd;IB#2{8vzQb&|$mrcxV+fIo&l(>q5{ZxuyLqYNGF_#Y zsyUkIxpqHbY+q+BH*sQGvuchKjrbl4!?juis@zXwaQ1^i4{79b*ons5&{V4${u3lg z7O&bf6~-@XAi$t(%0sY0TTg=mOaue6C>gU+t`HOMCeCsk?4a!6;gQzZBB>_aO*F4> z{?o(g)|aJ)DsdYULEhS_h8xTp*AslnVGJDT1A39Ea9uJpbOf*ADNCnokP<&Ma-$dN zDlwghJ6N9few3J3RQ}MB(=}UzeKf>SG3+t}^5*B6ThTarMM`$07%r|ET*Y=;hC>Q}%i~kAaU1pbGd{FFKF{;yHxb0;0 z#Nxi)1)d#-uU!XPEG3flJ)TP^(v@BcM&2G<*V8Y^4XFk9hKdCrMp&$29r)4bW7a_M fn_KD)pD;+|v4!Kst9vI{9wvX(EOf2@)cF4Z&o*X{@E2SPgQC48!-eJa=q*%L#(Ce5&eXHQVjZUV>01Xs+(g1c>!mpN(t)-RO=%%v{X%fzM++u0ahG zOamCiA+8U7*KvI<)>1&ZjoWg_qY*tDvwh+F1W&3_{R4iOhk2)PsvrGX$XbIn8?ZqD z!AE>NhGVlZ%MX6_sINj50}MkLp2q1x3|_-EJJ@Z+Mj?cM<8K~#GcnU2{?G92As*5} zpO5+Ri2sbwnaH$-?Ivu>MQ$fLqY$M7od5(p$MZ^5?!le~Sdf5(Aq-_8!v;1~Q1g)2 zfsUg%Is-HIVP69pDp0W-yBA{N8Jro$@D*IKhP5-C^O64nAGqLti*NU1{|mf$fCrxN zT!ckQNcw^=mvPw&R-3U|1W`NMf5y++&}M_(h(;--9`G=R@mZW5!N_m;Z538+!IlCP zyvO?pL})=P5P?l-Do43H+)ZG@2Y(c!mvCt%R&K@CLKMEm+aoxl2~846K?r(u?%G@P32A<++4szyTjy>#e;KnC>I*F6|(D#OSEovX((U15s z7O_3(xrJMfaCCsfP2B87?+KjHgWg{3twS9Ptm8Po4(oKG`^smSN)T!xE>0WWBS=0Q zNQthGS<;HSs+HX&2lZ$Nu2h>!iY7+--CI0^S|q{NZoZST#g^UT=u%WHGk$Eqnm(_+ zc)oq4nk=h&L|naH${lFj&+EQeD81rP&nY|5uOmv!@AJ*~K0Y*>bV(^=6vvbqOF6S= z>5x60l8wxlXbVnUpGEPclfCw=OWE>1M%d8j7@L*t z)%tpsY#(+N-=>&oYDjp^4))a$UUsB3J(%ISbl+T_P+%bHov-xVzJkMwid2Ys6QVY) zsqNL|DXIoKbsQ~?a`hl56N;^we$xfn8eUMOiYVSi+0>rw&U(?H5bIqO1^9P9V;mYB zh_P7K&bKhLBuVZh8Zo>{f&LygWkok7+Okpdgskdj0E3XlXe5QA7SpVB~l<<%_vYswet~@I~l(l<{!q;eerTv|i zQhro}deEmAAzZoNK6Oz~{fO@tIx9GY`;_04uP({E71u@|zosKgu$_<?K{w_>$h1zAI%)PyqQ@5Z6?A+q70GyRO2T`R-6xZm5_OopkmcKPfSKC^$lwVr#7? zJF-#PB#qW(y&miLjf!Fo4G*+ebMLAebk}jl-*l@9%T+1ES%yMMhEO5)OqJ3jJBmv# zq!WS4lSY9YLU8|zC1qG(E24KOJ(DOOe{$7+1(;3g=VZp7mw`Id6y%J94QDF+xLW>i6(R6Ho=h<2!R)x^K zKeaCKT3l^FK{S(aocLr}Q&xZae5PkDEz2)^hgGAQ9y?jnW?LM6F*WIY=H^bN>o2C}e#MjB9#)N$I9ao3Yg|bUZKhv#m{ntBoc$x3#@CV;XP@)GXTPqTR7$O( zQS{ge|7fJ!F|8VP{@n-NgxcztJ;kcAgcoN}QN$N%d5pNB5e`?!#5aW1oI oXtlfEM@y>KxlBn7%|DyM&c7A%MBd>#`HTq{XE&$3O|01e0Ou@1V*mgE diff --git a/adev/src/assets/textures/line-render.png b/adev/src/assets/textures/line-render.png deleted file mode 100644 index 78e110030014a739856a60b07c6867221da80e36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1018 zcmeAS@N?(olHy`uVBq!ia0vp^uNfE^bvS?w2KL|58yOgw4|=*dhEy;nIk1ZVcXlv7 z{DEDMq3Gp73lWB{MGv;;-rj~lvp2qdvQNv8(|Yr!wlIbS@zYiE3BBKfZoFj3mW__# zYlzi)9ee1}_CtP*5wCAPGGcgB6q(Pw#_%4uHD^O^Lbo^L2JO_noEwh)(s;wdux+BQ z9^-*^)4pmQkb1s(Lo&k+wQV~%7YwEj>ZQ$qBOM@|fH+#>av)^zUUwq|O` zP3`7p*f2ZQmVblVPu({L4BL8j&#@oKoBCDfz^pgxH#jrgDBHyLoH1cLcePZ4@5lHX zjtn{Mk$;OBH(0mY@@-gFB(hDO;kIYkeHn%~d5Qf@YhKQ2ean2HZ1PoWZie0AHx4so zvxO&CGj6a=`Fe)sfSkxTg#)ur2H%il$kC6yYs|2rz4b2thP01j+oTz8yN6vbVR#dm z_?>CZ&6?J?Ob5PAzG}$JP#tq)E<-k7eWEqv2IiE%^SK&qHQ$sqnEEf+@Rs3*mEnfwrhTjti|>k-X=Cw84NVfpD_vo`$Lx1pQy8rQZR zVhq;7*QU1|C%%F^0XnW4|;mI#6 PL7Cdq)z4*}Q$iB}O_-*b diff --git a/adev/src/assets/textures/line.svg b/adev/src/assets/textures/line.svg deleted file mode 100644 index 81aa69de69aa..000000000000 --- a/adev/src/assets/textures/line.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/adev/src/assets/textures/logo-1-msdf.png b/adev/src/assets/textures/logo-1-msdf.png deleted file mode 100644 index fc5ea556f355666bbb9fb6925e4c8d29976bb5f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6437 zcmX9@cRbYpA2&j{GqTQE*?Z+W>r}ckvni77arWkvgsZbxWRHv}6;~=VoHJ6^B{{3^ zjL7y4k>dBce*buQJU*}Y`~7-9U(eU;^?bcA#md46%m!tnqoV_x7^7_H=omVH|DT^` z0RHmltklxcLDo%B`gR!ljX8TKJNuKZol&k+Ld9g={ro3Q=E2#{6{6+iw^i-yW-GoP zwIbeC9CRK2axSO%4o;_n`f>D3l4=kGt0J&mxMw4KlDK}MUel!LL8r^w-fsSf<--@> zo7*!ie|ms@s2la-Mwp<)VgrP$OqDLxP9z{`nU0d+p#tKbg2Fl~RDE1I!K1 zfPd`TsgT1L-%m9`kd~b48jz;0A4W$fYUbu}D4sraOO%!Wo{v5cH@5+i$I=x^;DGFJ zNP6CN9vICOC`LOr-O=T=v>ku_lsH_Hl7SOuf0&#s2ffztdXkIW6e#3+vol@Ysl)h> zOd&pDn_i6Wxyz`L7@ws`=doih&LKHDxyo&>t>;J2=WogszacAF0J=6t@T2J7@Qq;7 zY`S{Zh`ozERKXC1;swt%dmst?#8keakPT@6*w;+O=$3_rnIO4NlbFM$r{Uj+s&&(v zeE7g#(h?G>xI0JqN>@vBaNlf}pmz|w##lXf*}SYuH|+^8SVE!-t#xacWRB7qejYSy zjDmsAq1&kj&ZSG^m9}*&BNC^1!9S&F+t~R{oA)L#4kc{KE_vM>Fv3odwIWk%IgrTS z75YV22JWXifR)$B+6`?u{G4X=miygx8GY4v%(>#>=^ltL{TZ<*M}4+Q$8i~gomd(; zU!E7iZ<6r|hicy66-_sjz~QOP{u2scV+JflL<3Euq7|WR|A6_J?|VBF3?3T)d$ids zm>Tiv$Aac~N5$Wvn>R%o-@zj-D&iu1LN`mR^ie4OJFxXB03QyB!>fBXQoDTyx&e5S zTJY!v-AJ}AC5wt{u;k?TRp~gN@|Xyo&_7x^Qb9wmUhm1H&YP|*kF{eltGsj9)3erQ z>QN}qP!utIRIgY?_=1^dU?7CJx8}eq49^n*!e zR7sWc8p=+xn-aS<-OVg9-BBcVjK{2I53l~)kKTZ|Ix)U4tQlAptK!rRX={_K;9bg< z4OY8wJP>Pk9kIu|)pap&m2%|tuHFPd$u0&KFbxYF-5HdXr??MM;0jjgeiEVE2x?9-w;hEjY*LO4&{@c7sGnbNq`uW#wXm3s-Pc;mH0WYuDz_!FZ*i!YkFI1HsiBS_3JB={KWZPxw|rMU&q1(yA|lK@MR#O{Fh2GBv%nO zOP&L!JvAHvPfs;<`h2>0ZY6_FZ_qvNBlT37;s;RhmxgWLK+~^436gSztpws?ws*iX zJ0#b@M6n@qo-pMG0Bx09Vv4j9;l7Zj!W~U21t)Rki?dBfH@nt@kKCt*ru;Ah#cYNg z%nfG&e0jl~S|KQ-HG$smw_pIFhyS75z>dB6BoJEwU;`24PV0fJf;Xa7c;d zvJ_NCMnT8hm^v-3a(FNd+wyRUG{nAE#2E|AN zF3kdXK$e3lNIuLKN{yP{@KJ4UdiSB4;K(RuR-tn+1~4A@TK59{t*()i#R()dpM`VE zOuf!LtWnER0Bmf4JyJ*RH6r1p*X4UxFZjwmNE9HBTdPH)>(Wsu6e;8w(LXj};8kP% zz(i)_*(b4`oHTSYfkcDZ0w6*vZdFV}>-N=K(uxA^Fo&ZaTcFAT&CME?_q<)mLo1rY zNO;z2cA@-T4JNIbKM3Y9L$rM@fB3Je8-FbnH+aPx4F7D?{s?fIMQr$Bb)&IJm$rU) z&ka;(*+iaQtlhxbWBLfqS6g46`C7X3Xwi%286{*W`;QRYBRQzB8FUuI;LKsE3&Afd zHPLQG9OLTTS`F%Xx90R~XEdar7`|X9olMKlZTFnayR10XEc&a8eF2Y#4_8#GCb-wCZZ73qMMk2BdOg#)d?y#&UaDY(d6 z7yHM%So7r|!ASPO=F~QCkZCzUb$$~VP&|;qs^W822q^qdyqH#7iE$^9D&N)wF#^5^ z!FaO-BQ&jd>vwYzPtgZK?X(zZrza;Xy+^OC_x`FowqeUq_im@^eYJ%lM!XNG=}(dT zzi19ZHF_~f5^CHgUjh1^B995~|4dboka(q5RoN`y@!m7L2qy@Kh@C__+rx&YY|zE( zkuAxLG-5yoK#obfJK%mp>``OO^K+v~b$HPcAgiuI!C0(gLToxc^E#dyQ$AT!DP{DJ zIATC(8h~`m9(@K8?V56}*588V`2}N&3B0B4K-OPH5#J{tHP+R$*|+*lif4tOa&hRl zJy|}nd;8!s762<;)5HsIaP?&~C>*P^86bQs1F@Gcd1?m9>CP@zu5nKGbA(Bp}?S17EA1_<1$iu3!ytQ#N~ z4KoIJ@RpkqYCVCHE`J5~+&ePyqHmGolZtKxQLudqpApEH%&g5{4k#CdHH{w0>$|?` zm5q&lY1H7Ji#SqCJAp$e0Jc(w`#=_>nOT1~1Gsj2={?h_paIZknmDH@hU0jdj6T2x zCx1V_ljyptx}>`v&wsGC-_3&0Zv`^G_?!iFq>Kn@Yk&3@LdW@uKY44thhFz#S-3$TycTDh?k@}rjz{y0umnbZ(duBXZB=#WHlm|$* zh)6fk@~C~dx`Q)DXTdq6fa_VUJkraxYoa#JpDQcYzerw7{q*|9sF4dwpwulZxS@0zh5?Nl%4 zD41_Hl19waax`7%;PfrAY+0Ar0Qr25OAi{REs>Af0#IDymKOyoBZiJ~e%Yxbh{1c*a!#Oo}UhSOQrK&SUS z-yu|v?rKa;MstTnyiWJP@ec05F!(`&YOj}y(2#+Oj4o8_VwWV~3BE66*&fvx zke(p8QYo6t00#t6Mm7*;H~Ioq9%GDUdBYLsI}-NAwIM8$WQdh&Rs$Gk<)}$+76f!@ zfI8~v=c?cKS#xv(p9`q4>IZQWY2v}0)-jaUL+PJ8V&zKL&7r6qafz#9 z;381}*i1>b`;(!H`TcknU3qJTO*iaUU*PoHKoZqlSg||2XdaUtHEsZh;sn3c=)cYe z77Bw4RNO#iWgG*b(7&t$?4xWfU61Gq9XRm9!YTSg#6#&SbzE|lxRJ`)WdEV;D$f#1 z1+u*GbNk8q62t?lkt}x(RUh_gY#gf|5uqi=tT`%+p@x!-n_C0bF2tRWi@1!6mX=6m z*7Xjt16j5t;{vmBj6rRLPK6hMOb7r;Y+-*^&zR^pzw{rjsv-`n-6wwsSePSj z<3-}y2*laFIo{syX~G%XVPyCBOHNO7&c1st}`z$qBF5d2*8}h$ueH5=?6*@%QyL+#YpaT*OAf&*jLEm*I zMY_h%N&pyDxuw6nUPb*ZpI+JZ&01ZUj`JK76BcS zR?*G`U;<*+EV%h~Vy<_g%I(F%FmnNLL4dx4CX+KDT>@55s^sIOcmjtGs5VK|N34~X zraY8!LYfZ_%ktYQ>p0y%nIKe_yecbEmlMrb=DbvN^ZIk9+S~3e&_$HWL<5Jl+B|Zp|e(jTwF?UQi1u zPNfavSXNGLA5sYD6FxI$94~&FQw9OZCcX@un;KO-{*njo)5$MQE)xY)SOhi!==I5V zmz48aErDWqd`f!i)%{-xEfn7k2A71%;lbRz)r;KHP&%ISI>6JX#<27RR!;8fN|s|8 z=^ezeXR%@Z>^JP)KdPmM#2B?PP`ms^T4)NlXEQ~?8F@7g9HS*VV7pdjN{p~h?|t^( zS`2p|OEvllh?{!@cHoLHU5C|-yQ#zQTx6F*IU8#kaJR48n9+3rvd^QdH* zcY;8HEz<|8FN7H0TX)~9D+N&SQ*)*BA>nUpmTT@6Y)VTe{+AO4Wviz0d&$ta zpr}$!$owh5+y02#8n~{Roi~}r5oUnMNMcW03I5CT6f*emNiK7DJg4>tV8a?5yO}0E zy;=X^$>7>5J_4z34lJCN-@*gASL40^MrY1EZ>5_akrg;2clE+*4ZRw5kTw<#qE8p* zYM??^xXK6el~Ip}al)sD)C#lR{^{YUp031`)Aqv0cILNWpC>i$N^W1-wy(B;%6ZT@ z_&Fa6mZv+`c%8HiM&r&8O|?bVj0@}bC%$oK+TUOLIa-vJJH}R_uUN^uSd=k$Ii|b$ z2NR=62(Q3DCd}ug>oNVX!uEsmmxmRhI&5K7nQPXXdD|r)Sr(*#IT&C|Vv%FzyR#w) zIs@WJ8AkN>{@6s{^IL(6_wG&&o4pk>O~YMreZ;zN8$|1o@AbPoz(iGxt{3FtXydxN zk?A)|n0=gkJ{ltb{yyCMVPdRrvk7xL?PbBe99Dx#7d=oN4_5rr0x0vY%7Yi*+&%9J zTJZA{rNXllV_7o_0A)+oSNi9Pd&9Z6LOtW4;7efFz`4}r(CxEnmjjjG3OU}8AG6M8 zZ%&puJ?a5b+d=(<&Sq%F1pgyD!CPz7bBN-sa}xsA8`Jst`!XvLM;8{Jj`McN0(6>m zwYWhFj#|JLthl-sJtL4WkTYDegD8)?bugHg=3`{Xe~bpex}|a+pS{?KrZdA7KT3cAA#%Q#{)qATjlIj( zn-j&jtzU(uo}urv4=0V{_Eq1J?!Ivw-XchOJt*D^Zm`zlk_Ymw3|1pop+_l0v^KpH zx&0M`T^P9Da%;u+@t($o+Xn@6&YGfsWVj8`9X)QuGapQ8%2)n_0$5b-T#xGCGaDP8 z=U|$akBOUeN=ih~%ry*V8qK(U7Tg8AO2{xB#^^l@WjDh(1CzFAd3k)143!U4^2(7( znfg>5hA@*MPCWB$S_}&ycmKDfbo#~Xa>_luJG*Ym*pe~u-@Nf}iJX*Zs!F&9gDzDX z2#bUfHu6E(ZB|DL-MCj%><$wnqpfU(&j5#?U;V8+)a3*15_W->Y+1`nofVu$-c;iy zRuD*jIdh;#KE%$)DOX zl|MRNaV0ZD?hI|zGZtV1Gnr)#s75A^unrbwe9nNNXl*t2nY|$7Nvc88HOGrfwl_e3 zcYivpJre4SKhio+pOH-)&#g&#QAf(a&~}3I!fP zoYabBeB14YVFNVpB8uq0&ARSgzFtM_rkhfVj0~8%e9md9{-z5Cb1ZhEde+rBUtjZp z;w*^(sA?QmRVj`5SlIPaT}L;!X(gm&rf-d18gu41m0`B$=>;;qQ6=!gkRye{vM6sO zxB(Xw?caL~ig+y;=Bq{@{l0whFDfTVMJvnS@{%O2#!Io1wz*>&){+B4xI9+2WJ@w) zNR?$#N7qf;J1<2DRSH=k<82woP7k;V2K{?w5PIEhlxG>N8bu;>uHe0{1gx=F{EWGD z>H6nxy_LjgT6=V>mE8OD`Lr>ixRNQ#>RJ?u+QanfdeEHvp5K?}PkVp&1aAw$1w@a* z?VVN@;4!9(g=tMZk8`}E6RlGbZO{ppk22XHf=_3wh(58`UUyo>DY|i~5YJj<5KPga zET9%vp)ml?a(vbuD^|6Q4fr+oeWyhUzP(csNR|dLQnDjak!Eyo;dOVeopZ3N&q(&L z;q{1?4-+mFf%Ts1n=X$&!Mpk1ck7k5u~=S~43Lha*^}9oxA{W_#hTMN3{-VmTwDro z(#>u2HOyfRF$o8>`%?qa3Cg|I7?NA2%gr2FmxCp4Mi5t1-6Nr6)x}Uh$QObr*_hTg zNO+yA|M!$6hGc)<`?4sF1L<$mH5fd7bh^DWKHQ(`e{cpDxt zDO?>u?}s(`G>*f~%`XA_z371yu&jkr^BQ}KI{jP->m;+Q5Q6bpN&+n|Uz7OB#)+i~ zJXmZ6G`#9!xccoJ6EgjIsXm<*W=5Wt{6s@7TK#%l?Z)`JJIgp#aXT$U0^xFLOelnz z`7C=R{yxfqL2`^~GUNp(lz;_BsAM}B)ER5(DzFJA1SbyP|8{RC{yaxni0G>j_G<*_ z><#8Q%7UZl>Lc!bz+anI^pk}AZ6)GkL@cu`Wqeze=4$t06W zW|AaHu4HCrk|dKPnaSs0w_8>BIp_S&^PHV?cJKQI0AP=Op6B=de!i++)5#`-EO3k2k1*8_i{TdAz|7hWA+E?~AT?0W1k%`8$n zgZ_szKM0sj4M(Q^Pe+x~CRcE=MZj!X)$58HmDWvHGQ3s5Y-k;DWxYymyDPi9Q&|Ik z9&waaO7DRqOz!;G?#~a$B>H+I7ILSR#>4=luZdY}HEmxgvr>fN8WMjMM2}rHu zjsr}pYG)i^s%No)G``w1?jU*OAbDBnCD-sdIJvBw^kv5l_wnRch#WP z!3H-9NV2ZqDJ)ejh8^z4cEtfUU2z&GRg)qjYdTRZaRf4s@Yzru}G1CD^6jPYWDSWr%2Y`^V)^MFaLZSf?`4*Vp5!01FA0eDi$fhyM%Fph zSpm^DIMDRM{C}Q1CLr2s2Rfq6Y<8d?0nxs7pax~vo9ciUHhkfUU~dq8SHR zpcufQligM3jyizi0R2w3Lz!!IvMI#@PB_toWrZ>?s}!&-VGfI7z-EO76BlVSlciu(ha|Du*oO5mYm+$^%Mr%ADZKMRbV z^^Q}oSip5hd!Si%$}#3E7I3-9AFIA|v}wfy`W)%8X5IPf%h7=2j?|@D*Ia$2Dsa$I zUM9a=<7GJDeM3N!-Tu;wGAuD)RuZ5ir+Tt@zxoS(N&@_p zS3Oz0N2#+5(2`d@S-kx<|Kb4#dN-;N-@HuwP68}1$+!GJ(oROc|Cl)FZFq~sOS-h+MNXdW! ze{i@okA2UT4CwU-%T=s9es5CAfTMozvi>?-{}<)UQT|kOjibu3J8B2_(>(O#P4(q2%agpQ>yDkzX=GQMeI;1tngpj zl??dCZ;hAhs^Mk<0bcu!-71MSeydqPfGOKk^Hdgte&ag7$tpg!*)sw{Tr69M{(V0c5aNvcR4ThXCLqKSuTi-?zAYfcfy*kHuB!q< zbZ$_|EVv*bM4L+Iuz(PoRXWQB00000NTH=>0t&IjHES18g#E7Bh=3xDxpu1sT48`k7cKwq3f*z^3#0P8JXN6AYW}`&ceYu0lDj%A?)J68huAv1r%l7 z)j1n>f$d|iPEVbHf^|(hy|ax1idTP{u#5jl^quTbc>vo-3A^~WN8hszDjT5wloO4# zsEmMhLyk4kAz)5M-yW42uz#Aci+@-29d1$i0c(fmY}f_1jrvpF0_J4&?QIY+mn=O+ r*u|WVz7y>N=Av!g$^-xa007|svKeN5g>TNU00000NkvXXu0mjfAR2pJ diff --git a/adev/src/assets/textures/logo-2-msdf.png b/adev/src/assets/textures/logo-2-msdf.png deleted file mode 100644 index 7b8c190f5d0155d5a5b28f736b110b9ce5f4dbc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2120 zcmX|DX;hPE7Jf-s1PN&!K?rM0kDNLv&@9dvL`N~`h(St4lt4f%AfTcdj6wsn3TP!b z4#z@dv!t3RtLKc6P#}?vG8RHk4hdn$NQp|yE(8(C+|M8L=lkw?zq>s5dER@I8%LQT z1Ur%)LWpqaVDQ%n;ab72-GGCq)9p785ZXXI6#TbuE?Z2EP=AOvCKTwoMFN3fAZX0) z>m z46jSrV;WV{2#QM~@JU8x{p#ak@m*tlG!CGO!|BZLEs?sh|GuA#YfsL+rv-{|P0}p?E9U|Q z#nn{nuP8HAbM^pW=^f*`jyf5MuPsw8_0J?~(0d=0n=CoTX`8lj z)r!N}n)y=5vaYz-;X9 z_t%NXd7A-hY@e9U?Z!X{O&n*pyN%CGGNDM+%dpOz<%#i5Jaj%?&-yFfEDFF_n0}tT zS`dt>kY|tvcl` zEOK#$u6;{goYt(NW|7C5K3?Bb@%+t17lxL{J$Y$;Rn%t#PTdRV&YxgOH-X!vUSW{> zggIqvFj5jI&tL7aZ1V6T^^~6o+{$Vj3^eKYL;M3ml?$^xnfn|g;V>^zudOjihnn$C zj?iaoa^du7%=)w)ihFz}D>2_{=BOLpsgVcFyq}-PcSt#h*J4oIV80+fNp!%iAE9bJ zS#;GWj3g`|;+t%}NTY43h4t*Qp<8Wx&|-`wMH#SkjL1idTEl$`UU?*z8h)20+IEncYqHPHn|GbqiI?8tP)ylH7 zPSCHalByb!jeY*Hd7x<9dY5;|ASUsSSk^P&bbSYLy#dMpZA(^A>M~^rZS5p~r|A_b zIYbZ3+C6(It-K-U5y@ks=`;o)evZCb6lQ~rp_E~X+PRH4^jmr0nY85`av!}Y zIr0}^h893#Rt}ptnq7C^eSK$i1RH?}ChKAx9)%VqMXlY?0`jGSUJ?I-*VyOZLZr|< zJh*)0%DOUOvWl2KzI=6$WTnBpLbQ-C4ZP3m`%m6R-a-N|B82WNi&`Avu03O0qUdB% z#+>)!;YFeQFS1AHja*#rcFL0-45fSHYwBbylyIogQFV0=qbzU0TA&qQDD`;p0&bsM zkS?X(iJXBtH-GJy7RCY2X3n7rbC4{ zXb`NptF-rU1<&z<4=L-B{7iSSuhLR90~wzCz*(|i&*Qf^VTTJ6L+0=HwveBlHCf#W zROp9SSWnqB8U}E6el6-r04BM$=jO}doDl*fU(Y-yJjWF;Z?i+C-S$~arD2vppo~=) z?s<}&^nc73G0bkWV#aO<2%6-H!;jOi6%sHFmzL%E*u9IoKSb5l^z~yEs-H@KWENNg zI7V{`l2;zM8ivQj+G=u_*jS<^Us8E`97yq^yU{@ft6m|{vP(W#6Hx!PWaq=#dwzM0 zErMZd44e(%@oN=Jr!OtT%*S2Kew9)+^0?gr8ty8~-k#ml4{O4o{Ko_bcIwOR=1!_k z*uELQny8Z}jU7{;eFQl!sGM2=l#*k@*k(tjvnw=|nC}?GhIdHQ%x@pg@iRY#AeC(6 z+&<$onA+lBZI}G+>}Yla4`NEasLmZ43uPV*JgssEaBrvD2iqe#ZA7pymJIqt|M%@b zf#ueR<`%|C3Kz^uoj7YdTvep@*IhS|GANM9lkx(MeOI6N%7t?DH$ z-h&NStv{>G@CIV9Tl;*LtxmnzV#Zt<%EhJ`#i5VPcFztp*aOltCgYiDElUN{eH4DC z?04RQn#10++6L8q6!)u8pUuzgt1rcJ<=;=VZv8vFi@Rd>bA*gG0-}9Ea*M_0=xy%I z#+PULEuW$^HYKo5>TwOYSHG-PIJTaOK#fP#>H39+GN~lbj|4(!#NKC}Mf-7b8UB^A XOK~B({LkWa-=PV#&ae@!=y9G*{HXaXDulQ=ailw%?(s+T}cVm0DD;c)N`m9%;d&yPE z1FZJe+?hb?4Lxw-#ro)w3E=6zILz?WTl zt-yg-?bDoeM$?MP&vV#A5)`6$2nXzIzj?^Z;iuWAsTUhA#h#xg#^kkqj_%uUY*TVI zZqMMNCDUg241SHvNo5;F1D5>z`zB3mfy?HbSEn}!)t-Lm#&oJ!SGqzn zU|#vn1AhJvnR;o;-_KR@$9k0e)`#phqvLcv%!X{$CcxQ$5 zgB|Zd)6v zhCJcuZS#2WGbgJwBu5!t9Zf7}m|wG1Rv$!GN2fE^(j2bRRyLaWQMqRUTRsqLx80HA zw^@p~!j0kR3Vpo$wn0sq2=kMf@kQPdg1fz=jOE^$i5njvSwdmRj1zv71+D_)P{kir zdcgI1)RRl4+;Ut$q>iL zD>hw}{dHfX0KDbLka)X4DOz+NvBwh7zYyr%CIE=K5&kAZk^Z^S-kENe=H;_sa=P))%JbB<^X zA_-)OMz122i~q>6A~Pw%l?X4&#uA33o9>$Deg`drC`f+F-iAPT0C@G>L(h@~GBfkv zg3G(9@MCSM74JJ^&?Sad9wDptBBBQO+`K64FuLz>|8$k!Jw8}}iB-(&<~x)Ag*5=y zA5yw-siOFZER{`a;jpbuImP^5 zt~Z6es`qjAnzN2t=jj>o#5xcvT>oSErI6;Nty#)e1O=UujC!H@3-Rg5oU~d~mV}qb zvV;EE7Y(#G9^mW_R|3_lD4<*V)p`#p&*HhI9l%AE$KL}dUrtVi`?ded6XXQ_JLj7} zE@uOu6Rs2XjQ6M|Ne&*cwlWd(dNahMt8%u+g=Q;Ua#?l+M6le;S$Z7%g%7?Rli_|QAN4mqD-28`2Km0F!I7O^^{a?7B|tU2sG6#zSMiI^DZ}~}It0#7g8?pD@cNMN zimn|UNYb*P?pGX>Cq+s$jsJIPCg$P+2g@GJIjeapjK@hBijQeusFD&z3vUhRZVg8*UtC zgTu>?gRU5*2(Y!K^tH!@XX1Y*Z7VqTt#Zc#q+}$s*eVMqNED(9QH_)CgQ4$-j)G2V zsrOn?5~XdVrZatLs=~gbFRKoMmacggDs~3X&MEmr4>d9qxw_K9mU!XvAHM`GCLQu} z`C+F*SS_&H*2DD~QkdWQXtCxgv*zP)OCeBj&10lKLrxUb$kasOSi=n!W4={SIDbfQ z-PFIFf>&=@)*fUQTjGw9dE=B%NcSoxfS@+h182Lrp@;*+?A^Ptqh7~pOWaBW1El@) ziO%+a3;^;};q=R%?SwT-oZBqXMsSn?GWp-S!lH{UX#*&?Jt2dNYPn|!$zqzVIFQT# z>aW{28J(){QJh{_vleQp{2klO$5Zv!u}q0&Yhr4MVeL}k*{5Nyp#BtywX)k8^s216 z=rp+{jyno21HLfe*$@mr_SZ?QF<({^GRGAEw<_K;VW3=w*xc|k2cH^hQY&GJAOHIf za26X=`Y1^{Flmc1&Tanxc?R&Y-o-G8dEJq=OX9q^8-qH>1jBpYIBoyXvYRyDCpKJrwdMnafN;eS+EU?c6B9u{Fq-&+e~98b=sMrc*tLWQTZV($ z{rfxSAmRVC&d(;%M+bDfigdf+5R9oQ=42#l!Kls~Ug01GDCIq-Mc3)ElrEOu3=Oj~ zXbx!P<(6nML;T$oInK4&vu_f3Z_?yW(305cs^C*ynBuSmUKJJyn%6b(w2++kZgx_T}@nPK8*qK4T>uui{)j#v2jY{kPl#!v@yN8%sx0gEd zyZ6bE7xDUFX^8B?MSF@|a}Jfvl0hs#o7jc;PLk-o~DtFKimywrDm0 zC;+lBa>kVO8`AG?-d-h`^O@DVBXja@TsvE78X0G6DHACRs> z=u8)f2agQ;3P;=h$5^ENe_=nMK>qe4T_!uTqWps7lz7O6M2luC|H2?%{O=y1OhLK_ zK{Og@y)XE`r$eYwfCobcyIrns!EU206w#7cmI5STg6FF{^dH;bZPuRtk*j5?cW*G#T zy!9YTcaz=20}N88dhd^T3{gn-^g0x&t0su0;uF@mb*RsDwa)FWJBDfz0v_vWMr0q= z@W1`o^5K(Tf%mKO8Ns1yREgE0jQ)E>rS!?hgtebS6wezOsA6#RL;I`+InR*LCW>cxAQ3~16jcqV9)g-S9OYc9aWWN zIs?_~mHB&zvw#lFQA3ytuP0oD9VQ>Hf8pO8gE%OV*Ery({ygp0_N`Uy1p~U}W$VsP zzH45^wwo=wFE^>O?W}ewmdgPeo8AnH1N3C{yfBc7zx;kSnZtIFp|rUK1O%Qtou8Oq#IxzVya1a4DeM~Z^h#FdC5C)9-H&V0J?^X!CrNx z528Iu^8SlleDL#s_dNp-aDvvE?h|JzDjM@UC(O6ZSu+3?22)mNxTCahD*2Fyhj+@6 zx~KX4%9>@|K`5!Ug;7It*jq%R{3Swx{g;PN57Y!5R4GtUmf3cAwfL#Ja-qxxwa>U; zo=yWgM{o+x?=!7VGy8?cFNTCg^B7HrAV*bt`&|F0G&9h^wCU1>9cpA!`Yv6^G#Ti2 z#`ylBPgEt}{|uq6O>s>{S@$oQ5``kxRW?iNcIqnrHA+~EL#vy(+OtXd&m6jnB)I-X zRcak+t*FYIK0@s5>LbOCPq*!TNA0dV7VM*%?|YxrkI^lJp}iNSEy@0AI2uPnRD(u* z1yhsg&;HJP7RsRxu@P|xhoT$$F@)@!tU_ozd0nOg^^^xHAAn|uACsN8}K(A-9W zv0Qf8<&iiJ$$HCrS%67knw&eX3fmfQ2g)WH;{IbaMnJ6veIpDe`-(fTL-bxdG zWHVQa!G;;I1>_8mbp@kYOYrbupET%@Tv^JEGH0L9??He$w4wSW&cIwkKlHLw3&?itZcsLfEzxEJ#Uuit}xf{vZA0>s{&4`>@e6FGDpa7qsvnqYI#PTP0vqe z--b3Ey#lf@T=aET`gQNv`8leL2*RzaGUJkv&&RZnl5*67y)DVxo(rW(9?TrzA1Vvs MteIiCzEkx70FKSe8vpD2 zT5Dw2RaYPsN!(Jj`l>Az8zFp^OB-z}ly9YnZq~AYce-=u&N=7aGw0tei=|O84mbw@ z05H^u@OS_~blGszSGECkRlE5B07^{_KS<99r=Npq!v*;6d4W4MLUgW|O7bUCxgvL} zXw02T6Q$8e{$2N{8@9&N9(E@Wu!V+s1uZLZgW=!W%D}4J6IA&BmEAv=sQ=y zZ?)^n6(Y6Hs)waBo=n(z!?Ekp;B4wt^#W>&ixG&4rpC-XS{h9*@T=t^C zQ0B4vk3dxF1+~_RGsw%Ae*^@ng3DTr%E0SrFaoK{z6LJxQhV^estqQ}i2Qf~*sq~& zHhX!)QA|xoKmWGYUiF0k%iH_nne9aQVZK`pk0m4_q95HV9ofrCS^{qFQ&9}<-uq*N zpPIs*Td0}%KxGQ>gW~Rt)hIq+%{s$$uhp9fIpO7MZYI*UfK6 zTx%KPXD-)CG!ERMgvnN2wRent`W^G{+5=LV!tKZ;!7}i#?3rFXan{@Kv;=`!nU@8&^9MZE%>)nYy1uM=Bt;zoz4hFC8qI)zh?d~Oro!aRt+*WUVa+3k9#Ae0w z&SLR#&maP}E0KSkkS}WmSFkCud>2ZhECn_Suvv6rH?}6W11g$lZy$UKtF(5;)3tfD zUtK7pbPv{zN^&y^ydZhpu0;jq?A=J;RQu5W?e!qoo@hNh4xX=xUlXU7+LIqF|E zG}2vI#*FDWGK8T`?GYm_JhmglfpuTLQbz)gNsL8e(2`x)$3U>OuX(b0X#XjQ$PO}H zLF$$#%@czRsI=Vr_+9uYH2}xa3v-8Njz%7;_NLn6|Mn2KEi-@q7MheQ1H*>kHF!^B#a@R za!Pg@$}anM<3G>&M;1|4f5y7TygfQt9N?hx9J+CCTe*=@5ByYlJFZYC+{RvGk|4ji z#t-vVD-lyUV`-ZAMVsY2p~><#w#TZ-CIzqeI1A{B2cJ#LDL3Vv6tffLi})c7;pe zLZTdeP{ur)(^;i)(9iU6mS0?M@$@lSLmHygekE=Vv#2jUi~nix0llbzUm7F)~e~9{;9!HM$bJ-KxxbIU%9iZege#q1itR>)f;Ni?K zVE|6;x`=@E^nL+TWAOQF*yBq3G6J%-Wkx{Rx*%+!gNH*1#6RJ8NHF^^z=9XUAUGW8 z{}za$Vp!XcZvZ{ZJ8fI@ZNMOyXF;+-LH`5ra2Kpg`QsuVBU_8KwX)cSWp$AnNq5NI zA5A}!4Ns~KkJWs?^PzKbuqSiotvvm;HRsgNJc)E;Zod@0k;SpYxMoH?&QE#%26DYl zaxtCkailKJuOYfuRlT%wd2XvxU!95~LT(4W(d1dAxsqGL&VEgS{(}6T!5G~`aWTuH zIQV3`!Hw(^2bQawMU;GyIP?)-I;GtxNfsTQmB<@2V5FglTUIXhx5s57>5tl*A;+ak zSpdte<39TR5RWoFSsSOIXc~)?W)|irx@VkUwKWmShd*CZv#Yd!;tfzyP>}+{Or#dD z+^1AZ1IphVGP`L0j;c9MfKrQAW`gqi!-rd4p!j-+?&I*wo*j~W;k;l4ZiWkS>e!6~L^qU@?bj8a+%)(gtHr6&oK6_|TI+4c zY|KHNZZtxKw$+O@=}PZCu9d;~<4RUx#`CuBtg2xhcd$jo>iQq#lj4m^e|u{M*(v0G z72Dru<8V`X5(5EhW}b3raH9<5Ui+AG^>pD?id(Cwl&{KwJ>ej(Q`fk>B^%iV0WyCg z*JiP!T)Ui?{H|f!J!s&rtma)SU)nz?SS$OIiv@9UF-QZrsWB7QlY5YIjV3V5LnqRF zd;2zoR){v~n{Cn9GF7WC+i;m687SaW*3Ji}TE+6yQVhVUn};$k3$YZZ@>JEt-&thK z7^qf?`M@=pg8PD57GjL!;gWR&H3uJE^R%whk|Wt8CnlMx^a*f zE$fUP^7Rm`e%m0jFC91Ox5Y`jLS?0%?A!y~by7|pdcC^en*sb&O;|L9uTxD-Pv$dt zDn;xfF-KQR&4@9|KjVXD#HdickK8D%UR!HLSZHUq-Vk?Ga0q0nSd!oh!+Cv6HdB*> zqIYEN`xL@COJR5B)S`0nptJK-V<`=Pyi{5i`u&6_YS^qE*w=P>F2VG59Qy-a4?3yV z+&skR&@+@|9mCr@CPv+tcW1?W#<9D?nzIgLD} zjYW&2eZv?}(yB5DM9_I^&_^;)t`CS=jP;I0*1mW3r<5NSx^Fw`cQZGqd6jS=dvx}G*!=iD5-m#B z>9sViiHd!yYXKTiV?2QYD~7FNcqyDKKJMU2B8RdyGgkvU_!&S_#Gk*Jyh3aBGy^Th zdMH;jQ>1oY=}&r}5m3Rc&{qYW5j5||l1W&`Zs6SbJ`@VP9td=25Cs)Opx6Fu z=!YQCmx0PQQV Nxx10@!ec>y`5D)1P67Y` diff --git a/adev/src/assets/textures/logo-4-render.png b/adev/src/assets/textures/logo-4-render.png deleted file mode 100644 index b4fbf2d937b2d576c2478193e9a4c9bd97462897..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 669 zcmeAS@N?(olHy`uVBq!ia0y~yVA=y@ui*d^40~oM=mG^&JY5_^Dj471VoaGDD|7s# zeFfv5Lq0RK9cHwoOq#$@*^=VH#N(_sGiDNJOCnRao`;%2@j(?&BXJg{nJFh)eA?zP zY(utFl8P zl{2Rsj2`{{@1C`SOGD}2@s%qR9XLP6S$Op7vTYH1f4^EjAZpL<*X8Txyqz<1|F$oG zif1J#E?82re@)q=8Qya+b=s*P z(ww2o?n?0ot$o{|^howd#cbC2D#7=O>c?jPp8D#H3!}jMBA-oRZ@l#%{S^^DE4Eue z`Chf*&9r9%Tg2Y`_>@^+tq{6Uwa0p*VfYJ&o{Dhg=h;$Mxif6;6m;DKL<&IRN}zmG#YtiP4)G)2^MLXSai1_XJ;9@?7-)ji*3jgxitTQHPggMF bi1Iq-11wU_M-FbV0V(iw^>bP0l+XkK-z^<) diff --git a/adev/src/assets/textures/logo-5-msdf.png b/adev/src/assets/textures/logo-5-msdf.png deleted file mode 100644 index 96f16e4ec1c09fe52a343a540b26bc70661edd5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5244 zcmYjVbzDqee-?C>bCK0!lYZDM(9=7!87Kqd`Oo6{JHY1r%wd zkrJd!QiSgu-uL@{-~Ko|@to(rp6j~q`?&<4}n}z*1#(2dsD1TG!``7L4@}PqJxtyqEjqY#H|&P$t$523hANl-eXl4!d>Sd z+G_AZUfe@>+^n&SZ(9yr4^CpCfCynAZDrKJ5fXkDQcBU~l2_Rs2kC@0Bv)-2|6_s} z=?ok~xx^tw*Rni1;6XJxeRM3S$`^~4bPyKQ98|#xlE1<)4++Ydwm+Z%uFTiwHqT7) zow*9zqJjv0NIQZMVA+@>33-U53q%>;#tgBLwe+Dd(hKUd@S%Xj{Na^{SW$tar+667 z!(6UVH1u$Rw}hVDdB+*V7t{w_ogV%(s^_ShLI~sSPXXXPpg^!SXyKQk4UbP}fPm9* zi3jxs9YG+s@khWc*_d{C5b?t4*W~Fv$Ze`EDi9Nwe9-J!ATz_;%Ve=sjOjkHcM74$UB(8tc8HK+KWzXS@Y20tANVtsW0Ldyk{Qt>G|Bu)xeL} z&q5O=XF8*}`9laoP4|0puW7OMm2m7(o^zWn%=-`$rE^eDn(^P#aX*x7gV)gix;&SB zS6izh1R;|c1}9uaVe2@tqrLCwOc~UL;q?V%j|jR*&XwCveiU7OczHZwZA)r^AW4dqfH+Se+Y&x z8+nED>c7AEHuKlWHQe;!>PT~0w@9FzII=fS5fgw|RCzD=N8^g@3;iqFGK{#ANO&18 zEHB|hN=1>8fd=1GA|Y2%AI@{>w-Bk3ilrw$AQ7uqRNH$qGEdv%p<3N50oeu$EVh^H z>Erdh_H(M|t%vV~d*(7uBC$Pg;cbkZDg%^EPF9Rh34}P4s5qA>EMk)?z)gNnzJY4Z zY6I;axxO{=x7rm#g+OYd^4`U8Vj0v~zW+{)S<&`dVNe~u%zp;yLH@RE6!9OPTDtj? zWHL9cS;tZ;hl>(l_EPgF-!;Q+YI`niBobV72vByz6bV9J!j{%2sYneVMle5ywWHmy zMk3W=;xnTzhTthr$Xdc)5w+gGWggE%`%}2aO~UJEtEu_F_0Pa+v9r+4j;bZ$7}mCG zb)J8gQ^Fz0W>)%r-CH06Kx&JS@0WsgV;*WflJ_xNS{*+Y`}8BFavzRV!N1|auFYw? zOLLKJJ};3P&vUdZ9IIeM5WT%xn|MEpW|nYyht|)0&xf;)AB;qS^QlR+E}(kb$IomK zt%S52Ipz1dqB*yeK}u2bgl?E!iE(L*UeVU}c07ly@6td)NJvOuUtct{V6Dl!?CfmS zSd^ISqzv%+5?hqIRWsxkh^wQ;V*NlQN%Bt)5 z<|oCqb?*JGabG~2RJ*msT{8Ln_3PJ)M?>>-bEGX6v4;ae6jU3WJfrGN}RIx{eW31PBCV7>H)K)!)L7&`4WK1qNs&PV$3p|Zz|5TXfMI+7yR_#DOGQh1 zC&ud*lYmjeix**_f)au)3#0v?=uDf=HB)^f3Yveg(Rdr^C3yY1h~IU?Vk1jRN+jUA zFYuWMmljD1lpI14*S{OnxPM^~Z13t4=XCK@C%-=h1SMZV!9>LVE!7;P8si0OlfvcSJx6<{%8md zz7GV^!6I#$?yZhhxprsD4mX)NtWSOf^~CO2d_IdIa5W`0r_9IL+S&0}3XSo1Rsdc& zO-zsNCcEj-v|k-wkGC(h&&*h@SfPnT;^{L?K#B3yoXi;3PP+GS4jDo$E}s<5!{eez zAehxS5}C?{=!!ZSUjqJ)ijAw`=1Ij60HoiQ&I!{MY1dl5Y-(z{`&xVC*@hm7F^#z| zIp5AQ@}SF^qt{4JFXUraEjPd)auA<^>aV8JD#^>v=8~7^93w}kYVz_RLJ7kaJBmP# z34B}6!bs4Sm?pCE05&Uq$#I_93X`q)Y{^=qfUQ!L`R0uq$^h3qDEVRjpdgD7{JEy* zbS}f4$IDTG&Hx2Z8nIOO45}^bqFw$=%0gbFKyjf*v)!(_A%Kpj5DKL)EBX2>d=*^> zqDrj&@K}%CMdJ9W3NUf*X0t6iEzCgCWw^@(BP4_Xjq!%V>8{2rV=O=Rh{SRXr*&Bm^b?HUDr^V)@wSI zVjgSbHJU{9aFbJxy1IJL>S_Az+ikd|&)QiUSXo)==`mCaF^dpS<(WzHmHgVv%f4xo zq*&!Lam#asKqM3OU*+XpzH)^Zw8Ex_Ec;B4BK=Hod3pJtKOXhPhVRW}{dO@ro=PCz znItWEn^dNn8O52*@tog7@3RbD^+;;!WKE!WKtVDIa43Al#y&9&dKQMl*t8?oKl(rU z-IFuVFg-nes=dFY_kO6(ZW-ssTrjLT0{(fsOL{Y8ZK5s>E}!SBtQ=$16gENtcK`4r^rAV!jXg;$JMe^NDGo=IJ>l` z6BbK-tN_~TcEqaF&o7m<*EbYC`tE$%jCI9j${b|+tXOv1w%P}<`N?rucT_x43K;lDn>4D{(c!R_oqjhUwV9f zVpkMoTlZG_tjSr{Wg|6bq4hkWiH*4=9l7mJ(R>b^D#=iv#6P8p5_@Q4=5Nc+5k&1$W@SNaJoK zzj$GwuRj%#5y~n`T1_$;I}kkTd(;!v6RFRe{P2H!qM^&6B#viJXyA{X8Oh%AdwVZA z17^67oq5^pH)ubqi9F^R+>d>wbOgCRXMTd|I`c9x1JWK z{j?mSVT29-g=I4Ks;VOsP4;T@m1vpEyt(P3uQp{B+wJ_V52XAFHY0@G>91o~nMy3s z?l%hlBndZj>=xVnx_-}+6HLdesO$T;S#3J)c5!yKZqtwKrRqZYz8TpKWyOF+c}`?b ziC(NU${=vQdwp|K1%2q&=@zNEP5w+!iI9pp^+EUA9g~p@QvZ7XcyahHq|dU;i4be} zQQ~D}l-o4jseTxiM>9k9FOGk(b-1p$uQUhyjY!y$n$wLt`|h1JM*uj~Ddw7VAG+Kf z&39bvKW^tFmK`w=g@8_r7?nfF_44t$)z4gd4q3nm*a#)w6Ng`fp7iX%KhJu7o|cdv zZoF8LK~EneyF>AmMF&O|w9l`4b;VwhBH`)xh@!8FQ3s{`qTBKdCZ8cJOoj*h@Tv zJIQ*f<-E8^djk>7S)K@P=BOHanuN17?DHF0`~5fSw=@GB^XXY_F5ES_frlp1Xu8z$zesm#zEB52ahldbRjVqNGi_ zHbJv_pw~tT5%x#wt^nzfKs8ZKZ^{i5c{lJyIF4MA{EFss`Abu_(G~_aEsq=b!x&IX z>Wpeh;h6KDXP}6wCIb}%sb5)Jj>4@6b6L}!G}`R*ZX7;Yl5!($a#(B*^A2XtTsTL0Bt(9 zMN{sdp+x!Yt;;8mhTRB7*Yk%3`Vs!YFAvvO>5tMtE3_zKSQZn`MwB!K6MpZ862>uJ zSA7+3wM>apP}q%lyDEWPJfVFuEns0gJSDobWSPQeU_i2E25sgroN#urhxVsKU+9eQBp2F91fsZZR85p>Ticx0$fcHSFI4VosDmSWYcH7vPRR0zM@Ul9mUudB6p zl!K{nJwAT+N_w_$CVe?@SwO%e#5lI5=?r~+wlZ|Il23AYG$(R1v$*13e*9xXz^wD4*;@EJ)5X5l`@;JAZinT$ilAdsE-Ike@hoyhG+ODB?`tV( zsH-TPN9u?xP9mbEir$h11$lYZB{Rdqahz&%sxu9CJUq%%@|FfcpDw#$|mUuWq23$!;GQo!I=gm9@{I zBZogC-f6P)gDt6`IbSQ&|Ec??prz$`)~3}e_l1nm@R?xq1FnfS|ICv*@t)D zbc<e~oV`e^xYpemc*hkR|8+1=IOWP}H7Y zLJBN#m;$*Al<${IHR5HzBwrf{>BNb<*eu`cG!0&H!f6cL>CZ2B)?Dbi%-8!8y10mO ziLoy%^j;M+d$z+b>v|0!I1%BdG)}zEeHI?W=^BUWtCOgh{jIyZ%6lcEIYP?kx%wtTV5&9PQvU@YJ(GTdG^FY~x20S7^i>wTBx z&i#RQql3#d#0P{PkVp0PTMF)`%ew~5U+?XCgXBjkDLW3*mOUH{raGF2AFX-$*1Q6e zV$M#Q&Br!u`qJVej@&fYF%H3{4H%=*#quGdZDrg|R33ythk3_H*iMpVFk)vW-QLjP3ZprIgyx za6StKlh;GMPr{`xcDk8WJZ8>DUiN;C=gp#frB-L8r1rT%9I?p=CRj%7Q4@>+X<7a8 zKtr4VS|r+3U7ZWvwfr_AN!gD7?=IQFVhFvpecHHnss3QC8drL)?XjZ%cemUnwqFB> zTOF@)tC4&fHQOfjBvd&<(k*D*gc0`CzZ`_oJEHFRVaY@VO^7M3QSnmhE?`i$z z*J9cFOSoYu1Ut@xi-LlMD0tVPwKWN_wilT1>SF`s7P{T%W5{T?8EUoo)H@r* znh=mgd)`^D3k7_^!6z}{OgH72VLQv_d?>VOZv9bK?;Sm>+~5$(u8i3gfE{} diff --git a/adev/src/assets/textures/logo-5-render.png b/adev/src/assets/textures/logo-5-render.png deleted file mode 100644 index 5b42af6fa4c42843193ef10a9f5a4562c0cbb759..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1424 zcmV;B1#kL^P)UM)QBMB zL_|f!ii(OjwN6BgsECLa5%D>=b8Y7N%{((C_IP1X@FV)f{~ z3ffIa881*brJ^zs#tVF#lZR|{@dDq=&s=2j0;BRZ9aX%*g#5jTC|)3=Qap?%USLoq z*{+QwUf_vJ^m82X0$2A{s{2vI3(Tox%Q3_Y^r{Tm@bLomzpIe_cXR*vWoCIxZjr_d zUU+9Z8|}YpA582;6)(`FL@yicGgaShMHDYEtpu};mgnMVH1PsAm0;MMp2iX{FfO-V zOK|5fig$I(qI*%q3v|h8+zRN7AzolXF7K?MpToxsq~vtR3aZ^DUIf=6m%m#P zeUZis9(iwAFQDzuzr+7#yqqWFT$Fa z!+rCRB3^{GDTj;Z<2~^rqziIbF)x$Ei;%9#Vcfj*5HCV%kwcGpxlOzX>9HK{nU^cX zi;%kI&}e>6h!+73$f3skUo_Sg!UIdg;zMOelB3=YErhMDx zX@PhVS-d&(v`D-NX!I;M?=tZspuZ{Kv3Xh}UIg@m9IDOFCh;PmUY#MpL*hk1X*t|6 zFLfeb1awahUFPL0;zdY*mcy8Nc}BblsYVXV=4F(45!8YEFnZFzm@;&Wh?2@dk$1a%r(*ek0z{&?T37 zE8@9`H#F4CsnZJj@{oAL!$0M6c-;z_74e3Lb~*ie$&!sIf_QUZ7qHK0Y>whOAU$|c^wup~dx#S1j43~j3s#0&JQWMdXZyuhSNv|STPyuiFl^VlMZ z7pQ)#QoOWi;st7#|QWjmjK;5K@8Z(PA zUf`Qq6}0}qVvQI0%PS?yJvWOuULe)?MlLHoX0gW$q|)Q7$NI$P>)z{T#EWy{>g~3k z{(?Kgs3j3#%kxT24P$qFYOH z8n=o9TI9CUYEG9&l;DO{7LZkf#V3}hIdh~06INlsO(oiU)zw^W|I_#+v!O)4rwpjH z7b<9X diff --git a/adev/src/assets/textures/logo-6-msdf.png b/adev/src/assets/textures/logo-6-msdf.png deleted file mode 100644 index d93941e084240a8034f734e885027f5bde3b6d24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2004 zcmaKteO!{~8pm&B$L7pDolKHmY^!0u98DojQDJHt1?Uv5j_(T%P1LkWs07uTWs6dL z0Z}1MNH;r8)biuYYRyu?SIR=fO3^Yi6KBpe+v93$es*^Lxu56xT;Kb5{jTeNc~1M0 zeT+Uregpt8BJA|?2SBd@djIZ2J!mw|dLjW}nULW18RZCUTm%0m)L`xHM{mXz(Tz3g znsH6Nh_0@sZ`unD>J<7_#?zGS!OdrTvG?f3771NkGG>?04RZhe;NS}4FE4V=vsh=jYt5x|A_xDY?1g2 z_*Q7C-g~J(DK5$QF7bQtou|bI>9juJbi@fzdJ*zFu^#p2kG{G>eyYGJy+FEy3VnBu zjl9g($tdG_UpgY6D4g{0%K8h8ibF>WF0ysql*qWG-HD{P_57{d$n~(Lmj9ojCC=Yj z{)_W>-F)BFrNrO#Q=H>(&tyTty>?@(c{PX<7$L$lqfH66Q!U7qu{Cz&BclGJTc&kjXaYO=+g5& zsa9pHF0*%3e4R!;r>P1S4|jv>**5zMo6CDURLuNm*|)Yx8`v)yKYU7GX#{Lqj-TAe zj~y4d&9u6oy;dLTr{9R4NIy7$q-D^6*g7TGtqT0XQW(cTu+@DiKz1Uj>+00FxprBC zT%G!=R&jNt64&m_=9`-ie}A;sxH=L8wxafD65O5@YuJV6Z(MP9l0x0urjFP|{U0nQ zX6Z-gzMX%Hm~F=DxOlZU9OP2MS`3FAY^S@NSU6#)>G~HL^N)OIl~5LAEqsnDT3>ZD zNEJI4*O;7QE1f@`J}8}ynKWQ4%-Q)5ST3Rs{9~gAPl!s`3t}6w$Fw(&j|%qNsf*lDP{hAY9h+08#*4BNR~Be z8;$!#b8^e8ciRn{KVNMr`=tJZkPi*~c>ea~XPgDezR&Bd8D(^0YtG>L=W-UT8$h9_ zV;%j>;CNwPOpI~!js7fb5Oqi2vJx2H-o*64K;Zv*9iWkGXVscvr>Hi^P zKb3|Q?9QhWkfTt2No4nJQuo4)-HOT3SM@97r zoTsj=OQEfBv%Rh1rCF6IiweE8h&(swz@QsMRyUEPU{NN;c zyoxS;RvlWab_nLSoch?T$L_VR&ortVI#qcwtI&tyZZ+`{XX1|(1*6GCa+^Fv(CdK# zTfVlcUC|sOJm?cmU1@X^ot~&a{(YrSMFT6d61m}bRp+0B^jz%B}76+{;{Qe?yT>|r44u$cS&?=rc zeE9PRoG%u^x)b|?oqQ7xamv+8}{?>r7gY0$LBjWh4iTp}1 diff --git a/adev/src/assets/textures/logo-6-render.png b/adev/src/assets/textures/logo-6-render.png deleted file mode 100644 index 4ff91787f54625fd03f965e1e4279b8697eb50e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 679 zcmeAS@N?(olHy`uVBq!ia0y~yVA=y@ui*d^40~oM=mG`uJY5_^Dj45hV?OgFT;#yT z=-rNzSMmaGZ_B;SlXaUfyKQUk?Xukms~+#>u-iNH|Cy|NYR`{cd#^O(8ORX)puss_ zyTfh0=o;zE!ZNd*Yejnhom_aNyTWl#NBEu&@gv-ia@&9$g?njW&eEA6PTVP=IO|8H zI3N$=%~;?yJD+UeZv?gv-NrDGru0;E>G3IFC+2yY~3UN$lyI2a<_fEZ5n+}ezMNK_qLCXUU!Mto!<8E*OT7u z`y?hZUlG)gnG*Z^MVHj0R@cqh?(d^q_Y}mIz1+S+IWD5Wr|kKSs7I~Ao3-;@fR=dQ z?A`jhQ#?#&@?2|EtuFCzXZr36h92csPj8p&KJ}>8c(Zc9OXi^W#9jU1nsTK@R8N#22Uw?Z2|I?>Cp6;-CY5`Oo{y+Ts|Lgz% z|KIU{hsA#jhM5fEGs9=jygqa0|Cuv)Sj@CwkYtdQ440I=E-Cq6QgVl+B+zUWs~WaH zO<`bQEb?@545?szdwnBsg8`3ApuDSE;{VDUt!<1B6Em2m-P4Z!|7gyvW)=SJo9(uX z>ZryE=s#lp*i<2?-ywd4`;qG&g}4j>AR8#;2xJ3=SU)P=yC|}z4=DZr?w$vU&Ol+P zCdWNsO+Xbu5i~tukt5v*Q=oQ0L@;edH4@|wS{m6=?hyQF=~|I9Z+C`Ik})IJ@uxw- eff85(`Z4#UL*ut-bXWl+o59o7&t;ucLK6Uo*5EP# diff --git a/adev/src/assets/textures/logo-7-render.png b/adev/src/assets/textures/logo-7-render.png deleted file mode 100644 index c02dfcdda75120b5dd2d5d98407446d73837c62e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 289 zcmeAS@N?(olHy`uVBq!ia0y~yVA=y@uVG;ZlG%5Y4go2l0G|+7Ag!mT=jG+~|NsAw zA3tv1ym`Jg<5{5SDNh&2kP61P7aSQG1Q=KhR;_Rl{kytiC!5?2r8Pi#5IFEWi(8Vt z>bF_Si>uvnd#f(44%e^x`pR{E+?Q9#0$1VUdtY2#Ee=sA{tcuMNdTe~BoGc4|GEgs w{(__sEU>o&8g|GXdX*Xx|~e4cY&=bXLvPIn>^ph8F?005vwTf7SZa6bdz z?+b8)Pw9VWs{jC|K*U?PMsdx*gH#W5NfO3C6&s$+zUsS{Z|d(j;`^m&clD*n)PKA1 z;<<>}2QjN9&x1?v|NBnuSl(DCb1EuqZ&Q(%{Q~-OE~2w}%KnF@hZ`?Yn|jxA!s#O1 zyMzZQO8tUfd#kqmkq9IP7L~B=)wqDFaj`N2JUI0X-;bBC;MZXJK*a5-*8y=i#QHZ60nOeUc-ioVy5DEXG5C zfzRm2Lu$)iL@c;H>R!s0P{TmT$SL%Kp&($Fo9C_yR9TQFQuB(q^q^tz!VfU4JfH{z!u=}YVc4S8LI;Ro;2vS{qs2TRdNB{9+oY3NtV^0WSC0j0rqCoqL2?_` zmNXG?5pH%Z5A-!RZ`iw(eftY~SAOB0+HxBaI8bE~2JhY2mFpV|l3!ls>m-_lz!`K9 zm94GD)m;Q`ctya$+^QO;3zI7NY`=xUZ_nke7iuv;>M3;mni^LTACWZS9ttnr%mdLu z{}@CL0vN)e+VW#VK?c_LO~D5GhOrFA;H5+y^ov7Lo_;X|d-^C_aAMt&C}`f8OupV-X2o*j|+v*E)4MC8_I zHxFIxYcU>uLiqV5B#eR;hnb#IWrk)UO*4|6E0^9K6A;1sp$oKGsnFr4Qq7URy$bW6 zE<^YgF77NQ__m9p(c~T^o}gkP$HgUMAgZ7c@LpO}l+K5$@N|JIYo&i`GsKl0Gg#lC zyq06P9kNTxm-K2(Y_&9LZjN+zO6+!!GofYe!6Y22a!4vfcs};SzSYOGbBi|Q3V4Rf zA#GVKenlk=?9QFWP)I@8qJqxx)>EZE({|n0cpV+zKJX5zOrp_LF|VVDv(}8k+10r; z*#qK=JJnKl_C809F-2rf41-g~}|zYZhFB&P-i0_{4r!qpm?cj*)c0 z^L!YSg*sZ|@uW6;3c|jX8uU&i;kU4;JoRE%FTqRB#6$*)$NOE)rJW+GADeq8AZQU| zG(YnFy?e`3n@9)@HWES9@+X=^XdgpiB}YbT6H?F8GLxH)E6a^I5n6h{FF%OC*nKsb zF7j6L_iq|4F;ke6rC=xcz>S&QA`@9p?b8JVx6AwWz)(9r+E+B_OC?_x+g=uXi%&fj zJFI8JVF@JC4P4;A4>q8UBHQZy*MFaK@3k_y6!D=cS=GMpnIQ-Av<)$8Xg0U#pm20_ zZN8=CNz{3>H8mw4UN^k52K-+b%{`H~pLQbo;QPAc!Zo5s?j6gMQIlEMkYI%D+z^8k z@R18g;K}^HGbDGs(HjG@l^(U-cS}j+^yRgz{zlPn0(d3e&%A25gM^<7vlyYuljKz8 zeJ(ja05S687k{AIo}3V>3-a+nld7R?H`Vc3+EU2Y5~MpniSEuOvDw+P>+_B;q&%}& zjW~7*Q?_Vk*16ghtWQ*of;}a2HJ|;NxjyuQobA0lr!((j^|}Q@<+2zjd9xn&sErYO$^_oePu(mf z45I&xdX$H9C&KE&-ZLW z_FTgtwK8Zl+apgFmfzKkFNmHy=THP>@%i}BvfCEzD(;Ky_(MKrGiwoiQD!)`>6;9bECu^?Q`+a;6zNUby)EugGJ z0jBPmZ~NzyXx^;qepf##t?CC?A)(YA?l@KX!|>__ct){N%298Bth*=-)}N4B3`_cI ztoh?zo>*ht@2{%Meyk&`7j~OM8F7COw$Xk5s%@eot;rh~GFGG{43Fxh- zlkDtBe4ty&w4~8!Mzmmf($`H7zvs5{b^j6X5~Bm7>3r{1P$=ZSu=%Smu8r6E(;Ot{ zPAh9yxH|uOvw%ScUj{u+wT+KRkdLjp-S2wsb^g`ByV#pa{bXM-Nl^Tu$3&g{UV)>b z^4gV%u2xrKiqK!kZ<_V*`I?+C5JG71-kztnh0Og?6%Hb~WsmCJG)G-pa%gfO97;?y6U$wfQ;(5y@G zJ+XQFO~Ot3N*=*q{8E`Mz72H&qCd~bc3l2SEbg}YXs~Xh8zVr!%;9j&d|S9Nc572W zc3gLx371pBT=)N}Fi*7T@+j6ew-B@=(*aH)R(Rgeej6(B1hfC-<8FOd%X+k8o-bmW zlAh1Nc2)Wyc8l=FYVL_Vzc<_-WPub{;vb9nM0415e+Y!ezn!@oP#Th0>AYXVs})+4 zquKN;M6Bzo6m%x(7DLILGxzXo1;Um7D-@3{-sg>3@2knl0XV@++$9>@#k=N;sXp## zl-T5wmG%h`y>NT)5P^ zKe|z55nXa3A8|{rl6ex0%4v0LJVEF-nK!0o``h5X+m5B%KVIoZ&JWkc|Jk_ZY|pY} zVUazT1SOuOMn}wz)zo1Nx@4e_!LH+}oXdPJXq!0wp)pkD;K9KhfzZ&<^78V3svMSA zS65e7!so`nOiWBnO`+R%ODCA$aYU}WDK$ts+DTbe)qm`1#QB-m@&``Ro10@RZL-(` zKP$O*M^YwpU`V(nH;3nE{*^28CQ*7QRBNBmnb8Iq@9rV$0}@}vb{^t{4@^x>;R%Gz z^>v)FaVGb!@t(xM^Qk{6TB))Pp5KiZpA9@dbIh4U#O@aSP4WD0=-KzRP`eUbC}m^i z>*}{biRoR?LB6gTNa-X_)H>YgxVyXiWLwtDm=m#w-wa4eLO8`&y}zjW$?}@27ZsJB zo_=w2P3j)ffK>lbmQz=DOo}j`tSsd7^t!=0K3?ARM~81{9sRH9gvhQ_?oo>4m79%X z1GjG9ezCnVM>)e}y129kfWv%0uht8*&tmpvkF-t}X;w?O!>ZRo1A znRK0#UwgLvSaal)g;#&NG>4yvIWjrs)WIQfXrYg+B#}f~cylW=!h81WfzVZrN+u30 z3D*H+nT6a$S;xXy^Vrx}%{n}CF*|FIGcTtwVRvI+hh$rbNMb(BjJ|sHDnoaJE{luI z-tAi1-~;?PEe5xGZegK8;2U&M3wJ7%_22Po#x83XBBReGzcu{D){j?IUSX|>G!2vI z3Z~+FGT*rDW|}9~1K@tnG;s3U+5V$qL$6($tMnywmwLxj{`z&FUHLz1JUrwXl1e+KnsYpCui8vrm395IERmFy zl+MmhE-o(9*fq(##-`5q=X`sR#fHgYoMclphrgd-1$mEa7JdKFbpF`mU_nvQwbj*# z$jEb}4R?~0lee-TK5Ts2Rc0|Uqqf+hmY$w_J@c=r&hT%q@ux!f$jVR7j@cbPJl1r6 z=I)Vu(mGx;($e~o3m?o`)MSX+mY&|;y&;orjEkGx4t0uR#&P5D?|sUv$|VcpPP-M$cB_6DVKW2%m>Z9K)Zu&a zj*mwFx&4#puH4_`4Vs#*2bQPw5MS1#gRVJ9Jn{@T;`%Eb78-1^30OJwv6t|?1aDO* zNw5#!6UgG6>=)`-jX}(Vwr{1&2ZF6N3e?k2OsMkNR3!0R!a2z<*pmb!+SW&7=C8C! z_)%qCrJ#Sk@v2>p8*i3>e?|sc+IebwLU&rj8sgXl-c-L(OU{V21v8~hR|dUBHvLM= zWxxrfNq{^UAU~kdhJ}g^o=u8J!VvdrWEMI~(8L(4k2zgsZpr=RUQVHS8H8U?i{=mQ z`<7-S6o#Jh{XKl_*{%J%Q@O@T#f?A0)yZ0A1DE}YW$JE`BpH0A2HD?`cfm!L)7WgU zYLB2K=}F8XA?MQZhl@+{T2pYHGlk#J`!ATws{haVYTh7v8%r-(^viwLQx+}`I;1e6 z?63le{WtLqu})ESJB=Uk-mpJ1p;+oE{~+^n+SgaKU#nS&x*f2OGRq5IOZ~^f#38G+ z8C2+SEq`qGFg2Bt{KbXNiA9W^B zZA~VJ9%W{}e#u*<%X;~8$eO)Pz~j49Mh_8iPg@_EZEP~y#o|v_pYm~2;!YOFiv1KZ z!)&=gAB|s*`+NX^jFx4o$Q_QiJ)vFk&x+hh+IrXd#huY+h)AN360M?T=hkhfvW9TW z@Rn1e%V)%a_~RmLBrKqWm=}k}a*4mxE0Y2LaEJNKfKN~58|W%TasW`>nKI7L_fiQ7 zsN;2LeEk69VYlx8ue){l`uiYC85UR?A23Cwh(qOp8W07vGuKh)>vsbBgfc8JyTVmG zB+<=D1k?o?9k44v1C`<=Qo#i@kt?{!rZu0B260%XsE}k32k79HfSPi^=21u>M|dwX z2Jp1NfS5p{mtH?moAW=c4qni{oWD#;GFcncoTBanRX8gSpO+p7vZ3`1$HUYIq=cxR Vwlr1*Kls4}AX<~~|5=i${|CQu#7qDH diff --git a/adev/src/assets/textures/logo-8-render.png b/adev/src/assets/textures/logo-8-render.png deleted file mode 100644 index 3ee06d72caced6c03a3659274b62a3f076a1f7f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1097 zcmeAS@N?(olHy`uVBq!ia0y~yVA=y@ui*d^40~oM=rS;{2za_UhEy=Vy~CI?r(ELr zNB5A>xrcpP>=atQO6k>+GeU^;LoVNYeEzKD zg6(U5{kf9X$1r#Q>blBe<{1IbX76WlALuPL%{n8)u+K8+aTlA(-P*tEpV>@qPB>Ii z{V;a^p&3AOxu0UP!{sISUWnY=B5^^-*lH>#^QPSX#fG$s)f2AAie2~}sOZdQ;<(=_Zi&u|KBqXT z3oP1PGd5d%7nx-ApuRkoQMG&fiA79)Jz81MHywSQ;Lf97clXzd$yIA-nc7W1*!%5F z!NZEf`y)dicWFsKSokn+wbtqtwahjqIajx8A826l(0tIu_-}5Y!)hQId_a`>&u-5> z9;-YbxjNPAK5|uxty6jA$`mUfGo?e^vq*97&i@s4Z}VFP_3v0tKgZMOKV7R{v!~+W zg`0hMuAI&VitovKJ6B5^D0Jg&jYZ6(*8J!0hn@=Q&)NOw$y}E`9`mMsqxiCtO*_Bom&(hxfEwg)hpscs*+6ukHF=v*2n|hq&Du%@+weF?t^l{XP=yF;h^#rh3tY z{Ieb6_x>(ySPwKL&WrJI*j?2}t<2j+wq}`b5!9D?5q@RC)eD|`3Ldb#)~1<0=@93$ z2|cp!>L>1xhZ-|oL)J`-1u8f0(kNCH>I?`uGVSUHpFJNEyaeB`-IXV(Z*xNX)w0mb zpJr7&JTzg^r?9hII>hx-M7Ne-dt@u}@lg9}t{JQD0Ugv{%WAV>!?Z;m;(0n+DVLl! z%~p#0F)=v6GF$y_6fg|>VuE_YcRsdUCcnn(2zUH5k?i7k7e5?u$ScXJoF1K8@WR{l zT?f#PMN(UDx$Y@YTW*IU>_ip#B`qRdU(afkAL?FZ0zeizPoETG-7Rx_zGEqt@VXb$-$8m(m9(RDSojeBtBZcS$N@i$XGmGgLXh3s0ry#7O6y??k>>VGDJS@0j@AJadd TRBXjIf|Po?`njxgN@xNApQ7k{ diff --git a/adev/src/assets/textures/logo-9-msdf.png b/adev/src/assets/textures/logo-9-msdf.png deleted file mode 100644 index 473b3f6bf6d76371fabd8a13c6cc670c7f149ddc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1330 zcmZ`(3rrMO6upZ<8a7yp3JjHWJ5Wrmu;3z}@HY!(!$*FK7Fm$5wY0?u5yNL$5K#o7 zMZ1i(cAWreqVkc?Vs~IGEP}XdYPE%~XvKyi<*TH0Tg&ZRF|}#xykutXne*;D@1FbS zXjJ687Up*50AL{r6~_RWaOC~`D=Wyo$+^0Z04`DCals@6paEC_1khMoqJsmvx}vu? z`ud`m7m7sa;)2%JXlkkv00;!MK)?zF2m&xShxmBR&Bf!#k!7)^1utDfj>E1lY-_^{ z7x3gsJakB-1W?knQpqZnNGoYjg1tSU?2+`5I2A0xRmWDo^3O%k!l(nu3IR#p%j z3)R&yFaQPvczJ-&h)5Aj&$dQ$^AIaqt6LLg3 zi^vg`1_R!|kJqkYcQ>}TV{0p3yojBh*wcf9gLvl-j*pKK8rf2RKb|>*g@u@sf)Nqu z=ZEg@=;nr-Hlc?H`un3qg4?%aW+vw6V{NU5q{(p3id|YlnT%ar!~+Ld!pzBG02rEPScXA{Szwr)914JKZ38Y&7JH>gg zkyy)@9aU}A9(#_CnG(V?+=xVZzL;aAlCS^CLXa&sWr4M^v`CgD+TUlpVtLsQ#RY5I zJpN4oLbsdKudMXA=j0%*ru6Ac?f2%GsqbI4E!732#%L^mUFF^2ym`D#kuuc8?A+JE zo1Ph2+?j2B)*AA|4V{r(izGxVX96sKbau@ucJ4g#exm0dRjyNeJ=lGv&(%&ZEK4$IEz2FxRee>(ki>OqB1R<=~{zs~ew8DBl~+gG+iZuG9z z+J|LfKXiL diff --git a/adev/src/assets/textures/logo-9-render.png b/adev/src/assets/textures/logo-9-render.png deleted file mode 100644 index 434cbebf630f1bba45148123f6a77c59fe0cb0ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 493 zcmeAS@N?(olHy`uVBq!ia0y~yVA=y@ui*d^40~oM=rS-cZt-++45?szdx?34T!IM0 zh1pxb9Lh01mln6p^7gi=hWb5;C(g!gi<^=Ad-mI<|F2ozv|s7J~D)-U!(zK0)#Qo1iDE$@kRUy-w{p zarfB;v$vBlfHjf5`I!!`1a7!==D#0-R?18X1~(;ebp`Ad3)YEEos>ETFVdQ&MBb@06(w7sQ>@~ diff --git a/adev/src/assets/textures/logo-lockup-msdf.png b/adev/src/assets/textures/logo-lockup-msdf.png deleted file mode 100644 index 30ee184d16bcc10a63da4421e57ce10c6d54efe2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19837 zcmV*SKwZCyP)?+Tfl>rom^47%u4z!z{8T}62@2(BUssK~Y^yH~w4+3fXR z=;dDQCMKKgW|Pf&VfJRT_>5Kx;XPo001GH2pmYM**_KZ8q`^+7r!!}sX@8$Qp{0d( z0wm9m-}#^Ccxg(#U>Fc!%bty5|3xr(xuFw4*njzG(p_9&j`DW!xT3cLWHt&+3O4uPJ`oXx zhWYdDbYW|2mgz!UGf?ERAw5uY8jIPP&0V{Q#|fE2gHKLs!G|gw@;?TqvOz>N2)TH% zopX#v$?EcDCqly|F7@VyWh~2bcWBRQZpIk9QYnRo!kSvrL^zxPF38xHYQov@9Fi zwG3B@h$u8nm_T#0-A6ZXX2Ak-@WT%nLo$gA&Tz(HI_Mx5RaLz3f}NCn@kM6MqHr|O zkh>c2VGfQFO+<<)G)$Yu>eV(btXs#tdE~@SGyM1?Rw+1oOxvy!&qEPp12w?w|If z&=A)4KLaArK=Ek5S8fndXjr(AH{Z-;g*|&%zMOI6u!4jJ*L2WfFlRVJV7|}Rt(io% zcW+M#QC_a6RRu8 zD6VszJi6x|5()d%t~cJGu~DI+Ktl=kD~zWgB(1Vxlv83*XsE5_wb$%r_-CGB$`tbL z+ix+3Lx;#8&%X7@iyPdqlMQ*dbSb-bWir|J?ZjdV4F%~5#^*W}AtIvCT6P=C$jw6! z5szoqk|p%#YR%wf`*1oxlMM+H;}}OFELzmP`aQ`andJ6ug$96n@L@)t>WXi0fVliX z3X!z_6^==fgQh07Z_iWP@+*tE&EJ1bXG zQK8UaYlgghol3G3HN>LCAZ012U;t%h#N&3=*JC+bGkC#&Q#yFru$<)-+U(gqtAFdj z<;(7z)3A+j`P=aGcniis_U)rEKBZ)cY@-m?!(@Uw2>U3mPgHr?&~P^@EA4Zu<8f+g z2+P&0fkT6bMQG9CJm-@n+i7p2i4aVm&YCqO5+sv0J)Ax3LetPjh7@P3sTU<2vuHAB+|VKkU~TR;2($v9R>;w3l^|>vz@bRZf4>{iXhXtU%NJ}QO7hy zVGg;A!uc#;KKHVLVtM#swr$HqhxguN*|L=9r5L#)5qzKVs{EOvD+^Zt%8g^L?tT zl^F6Pt=u5Wts^otw7h0(?V_>M3>Pov;akU<{{E=OHoJ0wKqmA$OkJ zlMNQB6rG(wC9HzhzUZ(K>PN^xLm^aE5s3`(p=(ME$_*lEg$5UDhTw?-cmQI9?T`cX z5$Qm$!iI*cTy-Ec^sGK*@C(=jEzkC^Fj=Fcx|jo~a25ru~1$1#Ru$ATt? z05yXB{B$5+x#1=^ZQ0;XXt0`Kdtd9Y6P8d)?AU?JU*AI@t+GK>HYhX{t!D5DBz9*_ z&R#PF;|)?abkgZuXs{lFEq$%SZ{P_SAJT<<_nUwzQ}BHn8(mBcA|eV6XU}2`9UTn7 z3!LuCvXu=r5QRntln#~~u5r!YM&V#+uxjBoJ1NOCFa^g|R}+aacdi376QYtsM4`dC zvl%?B;AKPh&*VKfBuN^K)1kq-AJ*DQN!G&sj^8&C(swB5p>TK@^~ozsSX+Pd0RRl1h=Yd*SK6+|UZ^p?0(lG*}ZS1}Gam z`bc_IzXmx8n~@P68oF0;ry07s0wji@WrO`#MShZ_=i0rOwrLom@$dxf?Mn|^z{ef6 zwfH_&RSupw>Cumfc>PvBC^9QFT)#e0&EVy+30e$MxG%`@48b>z)0{S#0~{#sISoNA zft`KPVFxrhcyx3KV+{p(0*k0@P=*kNhT+u=H*Vy;W5|A+L>gjF+Kxq^jPpe#4tmJOBm z-9qpJlno9i2CEugvXhcL4>R37I@O}dWiC6=G=#)+>As2c za5S`=JSD9cW{JijN2IdwL&M?27{kevVOPA#SnT%=AASBgH*XRK57Kne)qAS+b38YK zLW76pz)?%zWT_dxIRafgJccn0BsSP_QWq~$>Ld*wrAI`e!PX3TVLnp1A{vc0L}M|& z{1ON)H)KwgPLQaeV&pXqP8{momL)X&=Lq|b@;e`&f&6W-@BYOXgin+kL_t-d;nXRN z;n1Pb+o@Qrd&L?EH8cPoKc;^)7=u~KN`;1k+&A%ee%3k89p&f|j&v^{e^`&mI&%g~ zL_{+Uq1Fr@A&W+d#cFGN-qzKHI}Ph)CL3;Zdqji=kHL6uJgB-iF7)PxpZF=(z0YVZ?NCJc;?0~HMep$!;0Gnhd z-x|IZUGMWfks<80)^=xozxDp7ni@e2n>WL04IN5iKth7yIFK70R)f}HaD(b;RpzDj zq6t+7F0`W6KnEq~;C{s*CK<^Y$jCuXE^@Pxorbjj=pTtl^eTlRjHk`>FGS&R48HI(vB0L=5 zO7Sr*D@$DIm@&BODzQe7#_-`7GK7CFF1$}4=fV@}ZHBYL6j-?u&CPI9#aeN(UVJ64 z{4RtibQiRaK7>PLg<915>45+umkq;n5Vw#$d(Z==OMI)W_6Pi?E0GBXVbA~!NJJvH zQbGgyAROVL2-To5b(dpr+t79bCywH10~!wFFatgNvHu8;z-8jKa1F%3BqSvuAr`UG zi0+HN7vtg(gy_&|@A=>(I3CCGMl^B)t+*C_|DOCkJ#kq31DC*z%D(wex<&ubu^%#W z{!_W%{oCZgfk;jkD3FkV*jND#QBfiTJ1mTQq-YbPY0!0?J`JBwJd(Avi0z}P35|`Y zugBrTsI5g+6(=uBW;UcNy*2Pk2}9Z048!t$5N|@ie(2j*TsXz6X8Y#$cK=m72n{?~ zNeQ7rb9zH!SelqXL=+OBWS9->*1<{fR#k$MFYpDSrFZseaGdt~_ovN3us0K%@c-I~ zP+WwIr1L6z2n~zSZQTTnhP3|Q*_<#Nor)I1U<}Sfp5Y~=AcfEnk9e(fh;K(bL4n{! z0wXl+#a^=44(#C8tJa0(B@hAgkj*n%w; zs6e;$xI8!f)ejBRzxiC;ZmuuwzruFK1CKyj9|!qVs#Qn`a&ze=&^91-5*oNm2xz$U zQbI!y4BdtX0~%A)yZgj~b}Uarr2W;#d0i1t{o;e(0WfPoN>eMYkUS>0uXkads=& zm!@GE${csIHC_mV4n-&;0QKlvD0&ZM3$BqENjIf*S}8ex12(M1+JiWV;F<;rZ5Pn+ zjizH306#axKt^xEA;kl?LP8aU2A75)GBfG4i#;+wpU}YH3Q&*}pT$WVT!!dF?B6e- zp}bt&YqoDkX{q1O)&WiOW)TA14GI0J%UeTS9Im;>h(3rA%*8#~{6hdZU^WoS3}|p# zp`n3U3@Iu6Gx4EuSbR_;G;r(cozS2G=q(8iRj48&&{q#&2pJK-1B*CxH;x`YU-T8` zWB!lvkIfWAa-1pbz2W zNB9vh=P^9SHY$wH;M*%t+!`Nv08c-SXP&{c&tm3Gj2cB^uyU)R!++zAc;pctLae8r z!fm&aQeBrkLQvpIKK2+Mf1JNIh{1i(U=YLc4obK$(kN z?(RI?0xb9;e#nFjSSK1Vyb8Wi58^?Icgg+oL~Hrshp})Wo_rGX<_T7ajI{mkb;~V; z264m%3vm1Gh>O#MK)+MOFnKcO&&NX#VcaoE01ta46WUBk9eeh;t5QjF7p4K6g~g3 zV+jpBx;TfcuU7G9Y4D48uUWG&XAZy8Vv)B^LyU+op}}sOp{@>2D?Ocb;QyqkHybo3 z%!V^(NDS7t%GP>ULIdN|{@6sI*&uxb=y|wAQxcWPLC$@+kHH9Tw|08~H2LXg5KtH| zC_n)$QXu+>7q?kF1g~N?W`7UgvzO~Mj~JW~pQQObO&@;tY-DDtOu8g4Jo+fz4xJlz zQj(g0B~OFcbobrD0y$T@3!Mg)HUpQ$U)rio*i?cNZfVL&C)`gA+1X-yPDqe5Hw;Ii zGy8!VaCUNx`Xq+CaW{89k-F%V7y`T(_cFy{D2Bo!(I6p+5E=+2qUOaBB_QD*+%p3+ z*z~>kZl9jQ!*S=G!i0bDLH1X0OJV2KsXQeSA1N%9<}CSJ!w-Kb-jnOD3r-B`p`o-? z5W~TPjA_zf5ppUbP&?2U3)23=ui?kwW2v`;ogXY-`c8SLO zefQ!1`*GJ@VykwQNHBBf;@*3ierOvvXcsnJn38$ZO%lYQ02)-=3}IoxzC{@{uyc;< zp+SQR8QZg&*aXY*gEnt4Z#L*|@_eHa{R8}9DyC*33o4X?lsj=JPk?1;CVdO?2cP&= zT}Tw7CS&sLxSdyo0QHa_G$(n|BZia|2J9J+5RcTZl%AT(Gi2>X5N^<{dzfHi$Ha-a zRib!S2{e?KqohQ9wO6t^3k3!IF7ci^EFXLZH@F)bG-WmeS9CObBt3}DaQ5G}qut#t zrDe7%+W5EOHl82UDIMwDZh0Eg<%Dt-bCStDVn|A& zyTJWeG%Rwn;^IVl!5w!nPGO$Bf>Q?jFWbP3|bhOxpr%e+PXLn0CxM9i^QT>>lY?@28AUh$`Fasz` zcd66BJO&a&X{mCXA$Sm@Pamf#{1}cA8cI;202ba|z|8d% z9h`cL7^j#tiM0&&g4oEBV)T@R6hMPQn}HP9Z3BUPs?2O4F_0TvIpR`N+d7))U~LLy zU~PpDJ~Lk-2ZH!#sp zJW}^A4Ij>I1BMSI;}5}=EDljvXt5m}Y7;cn)dfO>=BUk}X+8S(k`g#9R$Urq184ZU z$!XBk)=h9(ADak_Q0QMu?oX+y;tW$#P+i?a4%1CkOzc`{)FcJIc{o!l`cJ|kVC#2=9T zpB%IyaoUQY!5{`*SJnlxM{#OGLwY*Lji||NupAoN+IlB3L`R!>j^`N0-TLl&t-hOv z1fju9afbm7I-uFi4KvWCaw4wCxq=Z2xJ;Y^zY!a|0}T;~U=+YD#6TSeesj*uiwE!k zB;*7)cuky`nxR4t>jU7vSpBQgVytovl3}5cUzG_t0qn4Mb9&XJ#h$?Q?(|vV;8HFm##Cz`GvjS?|G~ zDpWBdX50q}4H`5*G_bxg9qD<#kH_VKA&&%=FQu;Z!a$| zKXBkcZEY>-p}D#FY-os$jU_Y;8Z;;;C+D)uE*n04_@!NrI~)b91>iDn@Dv)#;m#JM zGHk(?)mTkqj5FUWP|;b0!q_P5P{$uA0Q{*T785m?gUmtgCX*YO!ujEcuvV)Ck#|q+ z?Wn22kt2NK7d!XYUqjQx`x_pPhzQ|_#Ks~%-WZ4(>VG?Y@R6ioTBlB-q(qU;kd#DX zkO+#0g&Af8anETJl3+{1<$W_7+23hsNJtPiL$>6bP>D)%03AiY`PUu7FrY!+Y#=l! zSLZfEJ?f1B0k`dPl(V#ixPS|Z+~9w58jaCb4Q--vL>i7oEG=JjqN{Kfoi?i)MXz1E zcK!PG#l^*2w{9gdAeiFgW%_j2%1n+H0?kii)~0%^J|)GH&oRYLsY^)W1KZ zMS6Z8?=Q#lkMS|78a)w181Lb|ZP-Rl2vVOCZw6CFI5&|ooD<|3Gyo3VX6%F0k# zDdMg5_4Fdohla>V0~&aX7CY>qL7@QrW&@$YDx0CHNnIC6`F~1iP}Z~II}Qyb2Fuzr zXu+Y4-|UZ2$fq?dTV^5*q{A8w?&Kk3)hGC59oBu0&x4kVG@_AeZ_o8XC|&@jE~H+mLQ9R$5mhxW619#VCO-~Ow8yf7awA5f)de?+?(M4t^S2DQCf1Q^neSCS*6C*Sn z!XeerphKOEZP;XNqPvwz8cyT1!42~BXL!Q-`7TT!qusI?i+_z@zl@jHVr`F#OZg#u z3va!OS6{DKQWgDDfo^o`B+z`;Ouo~6B$L|RZG)_<8gmj3P4^Mx>pGr|`evlOxE~G>xj=%^m znA5gx+y3~+KfdwC8()0!g}G*Q2VZ~vb-vWcyrl+czQ+yD=^fw`pcJSATF{B;=NA^r zmr%Zqx8KB@!UMBH{8{@DAJX1~tkTnI{KIzD*5W_@1Hb+?e)TJ?TZi^`$>vT}8`=mB z?ri9!b4hf8l#Nit#Yr-Zd1w$Jd2>2_n#3T!Dv(;6LF@7M&ws+jPrj*mN@%EiwuJ^X z@IJ`Ro*@aC6XU!8h5zD>m6;GQA?8}9B9-fcqb!+10dv~BckiG7{O2W0mh88p_Nk?% zg)jBiTW>KjLft0sal?yet)Buv2VOgmBtk;yGzd#yPRp>2RJ{QkV4Y}o@&%dVAp6|Z z1J^{8o(1*#>-g<&@&5Z}a{jG!8g}j^F)%qy#q(=gnjnVkY>R3yoaTnF@wH@EX)mEc z1Brp$An~62X+uVR`v%mAD&~fzSjuf)`nDBlS};fK@Ax~+DH+KZ>{eNb!XX%9uC)93 zd+)u+ki?-whhULdWbyXfZ!cZCw5+TQYUFXlc3=!;zR3!=k$7{QgD{qvkbuk~I2 z4nFxrMCGfhy1xrDh`^8pKiGBznx%t!jIJjpqN^ev(|nC3OYr;Oi>45UY=8#!HiK@_ zunF0hu`N`gb=pXvoMQF-Yb>Yp6hlh)tkDK7CRHm$@2I^;(IQ+~9@BV4Zje zNC@zz@c9RRmLLq!FNff-3Eh#?}vq5%?QJ-$*;LuI;EQ89_k2363Y-e%Cm@~1$W zskvxHD=1AisuCFq)v84;VYSv^4R5mIEs|9{;(0T~xynOcKJsBgEUIL!1Zynq zndx877iV^)JNqtr%4}=Ps;(C0f@{{`-FLBgF@Et21YiVzeI7~dJG8I3wRk6XTF-DA zPHU&>&()$9Qi_Q|zkc>$B(ojgdryQX0QW$H(VM}V3)HzJ`~ljy}C1!_}Pm;D}Ax_oHU7Tz#&-mqtkG6 zLn9g?rHBZ79zdAz_|ZrB{Br;l(-$XvX5=Py1xD?8$>WC=e>tnQK| zv>=9Y3xmv33J*tEnAHr~(n7w5;hEV14a&0_bg3CqbaTFD z3Aq6_i=8DmZQ8`S6&^RZN+m!hWVBN(H2c#ewh2DKyGEKs07i5|5?zZ8V7R2aV)y9- zi$#NB!v-`oxCZKJ$6r4JBWjjRT#p!&Ym}6VnQJH?AgPF2DVjz&Egmf9;mdmRKjlbxWQJt zxezki#npAf<)HwQ`02SMks5SE4dH^6_%AihYJl9jRdi1R+yxB=F`PQ3z-FMW9mE!p zOh_^Fs=7&Q$ta^x01c{ahKL9`Vql^&iJ=KikWz5FLUVr&g=n5%iAuJ&f}N^Hbq#9d z;Six*_(q)c!)2nhdne~n!4dI5J9g}V3#GXh9b5`dKEr8157l}ONd(oUxHJ~AaEbQq z6SWC-b?$dn52Hk`wKti+0zfd9$BqTI&8|y95pxZqQTkHO2FQ3-HV5B5Bq^FCk zNJ@eVaWChNu0w~NVzvzzBoy%Y6^`&EB$+9;WR2zS-Mit4m^Q&<9pTlxQ64u0DTEA+ zO|-*C^+*3g6y_q=E$~!XX|#xT7c>~e(A;c_2z9%%59F1dEnYh<4N}q-WH$6Vry(-Z za2h0tK{hra^-`Kd0f=*|M|~aYV6#|5aU91HDEYPx^1C>@K(eh9oDvULQBmRYozvq6 zEf_-#2i~@`EipNGGA47_8%;I0pksA44jpnAG@LnOK!c*^)WL&E3=&O&9I46BO*Yjb zG%%3-ErteTqh;oZv>!v8ftwjjE4XQ)1-DFeMG*?V16;6Kt!U-4s9rAKjLpD-*Oir( za8Se)9u$ts;|5(pphgxKQjvNKZg~`s&c2BSAaeLWON!e)?) zP((zi;ReHOknYpqekr#Z0*7Qaqgj$0l9PEY!kBVgEoc#e6`R$Lb}m>UMtr#-D|U>o zs;Yv6I@BTeJN2Gy#|0fmf({cG7=sv#u~RT*0Tw)qXP?4T{KY7YauGM`IvcHXxe6Lc z4CDqyHUkX?5(CW!+Y}z|HyaeF1SMQw;j3?_)4+{`HbY*X6fsCNf|NEJ9IK(wASEAs zT(DnkgcX=MA>ZpsR<#{+)XO<~^zh-sju&2f+@PyHct7+Th=B~Ca(erXxN$0`&c)n? zSokma7p|Y+CtNS!h3E17kMN_badjjj-NlVQpRpOZ2pURD1vDHysMcmse-L>n(oC8S z>iaaP+G5L5PGVqFBS=V^LNqs~HLyJc7kZDP5zPfDapz`>#^&Z`IIH>&L6z)u>OFC@ zPe=N248I=N3o_8>F3=Y&!XlEv*^7T-{2?jfAv`n#Gj6~QoVX@yn`yRl18)pmHYijU z8kA-;Xqq!7z@S0mI5{~i4TtkGpn(h8NDVsP=}{3u$2}9i++=l%zB4JBr@C(uZsyOBmmxQ z=`nD@leN%LRwjs{yj-5Abo1#3v9V4$8fKtDmxf9LfWZwDFrj->eFZV-I^3?LBmoWS z>2|mR<|7nLWinGi+BGzIia-RH^!!N%3*fkpbqJF3xIulmg>6Z5kduK7nhL2%!xm=!Vw;ZFzN6F1;@pMwzRaM7s?YO2-7kBpYhLJj4W_5X>qzfeY`$CN6!(& zV87~t-vYl=M_cN18d!fsV%W9~YD7#VG34gL5ru?UmDwOaW3U7z3Q8vwB{Y~%fmDVg zQBhsDtMU|rkUr=mUC7?nAvh!X7)AV{T+UD z$^Vo|?+=g!*g-_01ZM19A+n5*b~kufkQ1I1M_W*`6mtVxTqHg{}z_M2N(0 z<6CSo8-DiXsAor+sw3^B@vs+*CN2;fAS+*o;JDg5gkB;K7g!8A24hC*BbnY9hd8Ly zMqsH}*z0)I=pNv1mq0^ZozmDuc)0X~znSVz9&_+u?ga`q<66`b8a83m2#j!B>4a`m z>*z&YZR%Iz$}4dkcIiu>?@KHiWh$*9JY3+LCriiqP^UWtyQTiPp3R^^O4s0;@fbf2 z`Z3d+stL0URNB@Wo#^QLZk&teoN zawhCcYw)CXNY!yYo58iB3p)?<*ktK;+%5{#m5M{;jU(MbcD-C)(Ssu^E~msd+_3za=!FNukHFa%IAq zGe;n!Mj*~i3xN`pFkF{~ESEroF42<92>F||8RXAS?;d&Y5l6vM;1W~iAsaX1TzNW; z(_E0%#T|m<>eHu>IIjETi5cQ-&UhE@ib9k^uf+!+Z_%YF{S==r$J}ancJ6Q<8Vq7+ zGPh+v3M_(@Vqyji8?dP8Pf(>r20A>vWy>OkW`jv+P;WCtMIk_zdH}j?Ofv95W6bos zBs6#h6oE~zPvMjfU4tf-1|8nFZ(kMZ*Fs)w!i7B;*!X!GrjZz&exEh8qO}G!hj8cs z4(!9eGL&&T@h+sf+`!SDhX#}S6=YR(48wkfP$<*OKsnF?Y=IJO!4{*dbP7^>W1j{q zYzD3q(zp<4Imkgna30CZ65Mdb(sZP*v5unz594qxY6%TYVyHwVffzz*-}+{uq38WDqZ4h~ zB#5E57RodXD1u_;iqk+UP^B`nfj=j`&uIt`H=G80ViUT#081b}>=nmC6A)|4Y*@V- z=gLzX+PLJPA*MrcT>U!a*$l1{Cr{pjTT+o~M*~pKCo=|)h_BTDd}*ZWoA`J2goY+H zfpYcS5PIIQ1LNn}b$z3`*AxNCP_H6jm||$4*$|I-g?$?2H&Ii8;U93RaCPO=8Umrg zQwv(SU3Q#ldm$xR8HF;zPH%!DtwN8WX>@4i< zz|Vj;C5|q8$0`7x17<>20|)Yw#n(fJaF#qZqnS(ki9azhk&yz2CqX21$m^)#9Z&;K74%rCf+F zAwi*`qC!B!u3a)H<06|u3;2b~^N~N96FAXX&ju2M&!>PG?6w(Bb<%E0T)KoYq9xf#%#ci#)l}<2M4-G};65L1$ue|cgOE10j%U}L- z*|KFGF<1)?MmB@;Gy;=*f~C7n8c+meD{l0}COOWRPUvR0Px+2cz93t^Ic&278WI!5 zg=c2sEO}}`0~chKk&%(<>|2`FA-G0i2;+jyib0I1N^qZuGWp17Ar@q{cJ125ixZ>bOtf1fEwyoOzrx9{qV)J>>P+cvEVapcPIRtSw>Y`wR?$>EO2L9gNZlwpDuF>#h5~opPz4ectVHHB|Z8%7O{3GGz`Fi zWF*6VNX_4@n=3vvX*2jNMF9Gyz4FU~ni6JFL5JQm6wU^PkcK-#VYw?!UduiT~C=<|t zT@phV>;HySsvxMvWRZdh}?!p<&FJF(XHgWM?PK?|X))D~U3= zh(Y}vNo@RR3&p!`7|%MqYTL z0u@bYVr*VILNRXKI6gJ9b`JK4Eu?sev17-=2DPHK1uc*jO&X#op}~%AVGPEw3xYfA zEyEDT6C*as^?W>h_^{nw!04)yYFz3u*qYOD=8WQOhIHW7^CB^tv7khOCt#f0O5l2R z1JAc%8=-+S*8C-x?gG`!OtD!eCPGpq26BTn)TfznbO;S1anHJ}4o`en%V5eUxc1s> zufP6!`-V?Wm@t8dU;|3npyN0$-4>H7LeX#xx1+it5sBZ!_c(7Ft`zeHxTKpuHa9oh zn>Ub~t7m2DfU(pQgM-ju5QFrHKF!*GPCA!MlS+)l2K8oxO-_RjKwa%Xd%NK@sBh?H zm<<-r1ouP^+hs1W$A%3PCr-Te)>~nNh7TXk7bld!9v#I|GvkgJp`agN$JTxmZkm7z zF%pGgu5WDhb%$))4!DfGS(lVp>j0EMgDOP@CNrpIx6bh;L7Xavf>PO4x(;;`C6_Lr zg-u-GB03mSSopgeyG=nuNXU6+gQvaNyB*s(Di9{bO?~p@$^2@0V+OwLq)C%p+u@30 zBl+uaT>%QLog4XmeBZ(;P?T#*Rq0V&92OR43o95ZD8PsjgjrV*gTv6k*ei*ls!DM` zr?4)_&P^pN!`xvu7*2zWShb))Y?JbXj00>2b=ga((ljn-XL;hHbb7AY_-%_KA&SDXlG6sGtFSwFxJ?!=vJ_XKmIX)yycrePWbA5b9&s!llPjDt&H zldidj#uxJQ)&79%033z}>f~-h!~G7g}mpUd*;oXH-G+oc9@2gqNAgU9ej~FbLOxEgk#Mr zU`{M^xC?j9!Yt_~i7|*FE8K_s_#y$_sec4~1viNUcQ~={!i6VV@Te1;dqzY=*z$nH z+?t6K)q4zTprM%1P^{1l9>(PYw$gh(iQ;0V5sIS%8rt1uGxY5%jVMM!gL_ng3Z79T z8ZE4$@U#&dKgFk{UYOR+H{blwLk~Un*kjYDPv`c4Zi_RonHBN)0TH*Ijp=!>OQLR*i~&5Dz|zN4Z#4LBk+uCuYVY7GmKOc;YcU#+*u+lJ4+l zrXKZ>()jV?Z@A$GE60z~JDfQa)2H`5|53M?7?eRnF}4<;1h~|tK&nG6dHzrh4fq-* zZ6&8pmAD{l5F~DMR=hzB{tk-nPHWIj)u4J>jn!N=sDVXdhv~U<=RWt`bI(8j{0lF< z@Gl+u@sEE@BjMqPAEu-5?6c4Qq(l4$e%n(|J;jYASc=@|c7Q%VPW!MARwx#+Ok*Sm zJdLNH#k2GtSPH>j4tdDSKt?7q`N<4Gcep0HbY2=$%F>CiT8JMLjxM(5ij{^G-^;+t%9esGICa7RX*|=Q-^g* z?2zF_>$=|3(&F>^jBygQ8R%4_Yc-tryNy79#CKtl%4i36uY+yDpI*f28?}> z!}wWc_`eX20rbAE5$?*(aug*Olx2U3{zN^FJHcX{d(!DTtN&I zCNL^?p{T@tz#;|2pa2?*#RA$?ISoUBA|L^P3U1IXu}RcHgIFl$G64;my1EJ7e*!*V zkc0;15ei0vB?&7ji8v+V6bBA?6DZCez4qVuZ|i>aDRumM+2 z#&mS1S0LHZbt|^AnUZ|Z=KtMUN8NNTn9!RjtpIR8Is=U7p+pW*WnuJaQD8ZEu=>nLmC$g^4-F@|6vrkU=LX%n^Iripn;ds3 z4-NZ(V&H1vGG*Kv7bl1zH&^!fhRvXzI^|+$(62Jt@ajBh@bn=*9E3qBNFh2vxwLa? z{Frj_Zf=1iMup0KI`_YA-SIX`?vC|AjUf++^~;#8AVQm-)y){`GhKSjUaV5wkyz4iAu(y znTnNw1XJ(N^5yV!Zc6+I_#hF9b1=tMJ&adk4}SI4S4~Y#98uBU-mZ6qvPAt?bhLnm{{2Pd zCo9V(&ERzailM>hw;9Yi4g1a548w|WFOUWcxxsN>`#-=h@PCy;!!Dp07!PFj#@5j% zPts=Ka?@y0{Q_nKjdV$P^*b@;u*O`u`>rkvvzs-Q7rlBECes&q5feVPX7RNMad2K)k{S=^p`wAS> z`H3hcKrxW1Afdq@v$wu(LWhv19OnJdAP=vG*$^BWbbQCey^7KOFodx?p$6^$w|6eE zQC)W){;t^)QlJn+cx=GDf){L{p1$lhRbiJZO{J}}QoB_jO4~$DTcypaQngAS(30o- zG2=imgczIvfkFTqLx2V_#5Bd2_`$2* zn`|WwPIK%3V|kKD`qsShT}>NJwVe2MhuMWbM zLoY>l_OZ}Sk#F$EqK6lqHO}G@D_JR}p^UQF*mgPP>sc@RCp=$NTuiaN5*t!2933vv zb-Rf)t$OO?XIpf6J@Tqtk}W~JkP>>nSeFLF&OMD~tPh{7UDG0_qi;HpXGudy8qQg8 zKJRusG-HO24v#hh6(C&P8d7v)$4o)b=3U;+&&gkqwP2sI4+FDe6*H`0#d4O*%p;ba zYDE;SVa;xK;}MNCc7`iWG}*ItVd38_C`vQU>sTkp?J}3+p#!FKGV2(}+>k8+#FsSG z+LQ(m@t)_47>>T#pW&r6T=n-~*Dep~hk_*#>yp)F4=)(qqZPL?K%#fODGiK=Mh^-I`tYNk_ zSVBa(Z>A=jU`|jb4Y}mL%**qczlS{$)WLAzskwp`(oXWoE2R|AP$AZvyjeiO4tC%= zW=G*d7Mky9Sr1o22p7j1P>U^uhZAnB0j z#Q5-yV1#$lfGG`#*t9@8y>7yN1rWA2z?af+ic{7vbmBxcXafd(>IG>gKsHP;AEhtx z(hIyGQ-@MYTWATh2aCE;Y!pi)kzOKWhVGtKEnE=Ndg}AZmx0IIynTsFZm;%yjn`i1 z^B)iA?n2 z^JaB&LUcA9gEzasPeX{)QG^W!_DM;xc@}nCn^R|D3k$)7twS%ZB5s_}5rm`3QPs&o z4$5wW=XmZ}o_(69<$ueK3uQ=PK^-n|p@NDfEP38|{zYDt(jY}7uJ*@V#G*X%WcVSk z6X#KC()kurl@4(TaPI*xa2yd)fMgamm$~ooP7GQjtErZwCpAU7olB!9l2IBAfQ3+N z_pzG9(qM6S*cK>)0Ql`B4QAL7qZY`1{p@WWO)waf&zf-Z913h8ZrVDknFQHz=XLuP z7E}BT&q!~0k|&?w2^l}gaCi$_s;H8gM5EDo$+&ctt3iStbX?~0dCoV`Af4lV-Y=wZ zE_3B~J;hT`8&5ya^CgtD(;lBoNML{E#b5?!ktKIEAW7*< zUyGA3+aX{UAAmvEm|ZAAB5@4LpxW&gNDtOcSn~qm#s9-*YBm%GDHoxFT zvLG8up^k{O&>~AZL}VovmTlQS!jX59F@r1_JWOWtL?(`B{AfmxV8k$nrIOn9EX-+6 zpX8(rU_Rm_nYBo72wR%b_2;7y+k}25+hw`=84sl?t65!Qlw^sl&Ou8jeJo=~F{-=U zlV9VS96hNEQc|mp>Iy0%?xivB#yj2M+_<&D{6v=qgK)M%Wk?(HEB3#o&nnoB=eU|dbs(`!Zw+=k(tM5uucseAQ;4HhC{=3f0~7} z?4w2&{0G*_ly&dHSrlqxh%60?9LR<`tYDB7sMJB$I@XP3q?Cp`xML_o2Qg>>17xTv zr$IYU`3e%e!j(&0k|Nbalaz)A8ssx{#jwhpvpG0EE$7+jawVcN{FPP&C32x=b;cPLy-exyIM3MYY>A-a?Ir+T}eYrNEdFB7aAZe1w)jn zBAqZAuuVn-8Q7vmmFqOP@gq;b0XT{EX5KqsP9Dr6{%P>+xZf{94(x#Actc8xtT>r- zuBToW3VPA&b9^qMG_=wxEy3PLq`}coUW4Z&CWmM^!<96kWJ^jzANt%N4ehjdO2awM zb>=kD^hPweHEs<_Fg;<=HAmr%>t`!cdtA&Aey5w*B*mX_wug*?Yup?IgayZ|GQ$Sa z9L{G4KqgGYI+x%8)R3r{%JZ*i9M*;Ku)#ZN=-peD6+|#-1cSIlkYE!{vd~2FyH*Ds zra&ZPUgdowq^*&wf?V)J0JhxtIF!Mf58nhPko+jOjciEOkPCs(5Lu#Y$8-M(s|;0k zFpc3_f=h$O?M=C|AqR%y4gLDjx39IB;p$aY35>?T8d@3*d#eDFBxbO`ft4A?1XQsK z&e?X}c4&)I8qPSZ&6%peZbL&Na}sLc1R7WO@H9+s@P^xNW8grmdyuH|5{==(_iAY{ zu*P{PGQEL?a0EH`W^S?EV;IhGAHGa7uN#egID$nC3rT}8mr*##5XgYBSm#nQ{Gx7U zenoTH>e|aeH#WOw!++y4Lx#w**3Hn`DlS~0N1@TuU|M^8d| z()O&d+{Fe)xHLo=HW)ZXhC?yKHB6FmhC*Y&Z=snG{16V)Z9Zd$4I|+$_#r$3Gt8pN z)h@`9Be~-aEYaM|`SW;;#)!dpX=!krYRKi5TYQxP-{~OXF_K^1pf(B zU?2$GAw8XO&zK<{riL8 z_{O(jBJ_>TE{&5Wk(p`D7%pGtU@%tpU;saBp)h~ zEG#r{a^XUGlRn6Dd_axvZmZ#(wPfmb6IL@5od-9;;Rw-8Kl){maS!+Wf?v#F#y{8n z+&`V^;~9U;v}sJA&V&iXh9N`v@|W@X1XehHoD(NVdbDBaZKOM(-GyQM9QafzICf0^ z5?)zJRTWdGsv0ziBw^b&RV5|r)trXmHuL8Bz;SQLvpk#ReM3XCa0+VR7^IZV)08^&>Xq2-3n5(yn~ZQp8h~HHKw`=`$bj3i&c)`0?C(uljry6c7x$=nY@_iul&Iq%>fak3Lcr zx+rha7$9&7Ee*IO4UyQsy)$w!)!_?YNXYgD(-q`vZ7q>Vhb$Ng^*Bv);>8TAL~==k zs=Ku=M26vz_DR*%rG5YVY5)6&w80F<0$=|+7cX+<3d@$!(cy+Sh)I+9?sxglcd*Kt zGaNXOY)ON5UQJ32`l;FYvyhA-OmWHE@(3iJ>Zt z@YRuK{SW-t{{3G#xNk6)kr}{!_i_LIs_np01c!d{To4D_8jCFL~er($cVwy1U9sD_5k^N};9U zcJRTJ=negqS4?%-yqRDyUfUM}0kgJljdI_K&q5aXdUniU8iODX(Y>Aan00-k@F0BJ z>PYJADKBTw9=mM^JoFF`Kg@#PyEnDP$Mcko5pwSZ(S{kA=hE%L!HaeJ{ z18=`gW21NN3xPoN?F)(14ym_}*3w`YxBUY7g<`DMx#zV|&9cR0k6BW&8F=2bOX5%lzgjkyWi?AaqLG+QxkS`2q|sH_a_ zzR=X<%)XfLH)tlI=%>%ZzA0zn0Mx=5dJw|Sy2K3|7(H5b5je?!0jgq7dppI&tY2^O zIBbn}2%R*H03ZAt4)NZ5=H!6i&+gqZXdE)8g5D>)W8uPGepm|Yphto^5vA5lc2owj=X*)4H|6>S{iJ|41IBpJ$uX@ z9sGVJ_#GV%v@e8oL8^lg@fyM;;0aZ&$(J;p)*}hpH}fm74d}38IAp>o-Ovyv=b#2Y z(#tHnOJgJX`7Bt#TW`_QLY#Bp0Q2Xot6j4OjYdmD;-&BP_0sx7jSgqeaubB0q$G5B zL};h@m`X!RPuM!T6%MFM7IfGkaEHs6)jY+#dCZ+_;}hxr(#mz~XN(ZLK6%F83SFPOV8G&j=)dWK>&WWq504DA+8Py-+8 zn8D6gu=)Asr+C#WPM*YDgrKZUdCbc%tE<|u!Qr#?G#V`p-uEaK7n^QiHaavlDNFGC zL+uM*Gah`9meehf=DLZ4Bs#i@!ywk|+QmyR@#2fT@PcYKtnorU8yeWOiRYe^*PyOs z`En->Mx)WvkO^5Z4DSgwI{5t}5GYw02%Pn#eZl)hCf=Wgo#^N(nG}zrbs^NgPcOf$ z9^218s~lqEMvfkhg)3~|u38f0_#0#~s2m-1oENyNMKxdT`FWef>M^R*|vdaND zNDm~Lq~S5*g)?VV0PxytJn@8Ck3Y_1kCB(B9Ae8BcJJoUAx@l7kNHcNxO$aq*FsxQ z%0FJbDE~=*f&4P12%9&n2q7=e{5kSf{!D2MbLO}lX=pTB8sh2k*92=!L!bcaP|ym+ z;D-P#fWvx*qHCoLH8ki)r@nJRJkipkvWK;6r7lQmFzeArud7HWWB>EtcYaytH=5>A zR76FEvI@7+X!Oz8De*BkA)o}dnXi#J4vV1@s$eQigTZ)78u%a`4#i>2&=PHNXa|78ivy7_M-`M4U6lht?5|EPwtH2&9Q2`-=GJQ(Hw{Dg-0{Ga(}xLl4? z`jx+HhK6kZ?nfgokK?GR8k_zq)}-;W$m}yr2_W3V6ZEy9|WQac;Kn@S?L6 z==sVRL-!FT$I0wDWvpIkDx<*XB80_p@`fpN2f7w1GFyo-I8N~d#fG8nImK4%VVmPT zouijL=v$|U&DLwM$Z_h|=xG85n&|29O*-swoa=2{lqiOYT}lk(AUMal{q~45b1>3D zsZWIn#&Pa_ppU08a`TjO)8#PdIFH8ZXAOpW=x4bGW*n#d8~xS8P$vCtyhwyL$EjVR zf=w73qJsUdRD_|-6QrEn$bV@`FaM&FRv62pn*J=-sS)*+(fR`&tb9A1OD z2`U;bfMwbAG>G`+;>~_fWv>xHF_nESg;kyObbxr};(a(q4QU8smg*Ls!=mr>R*AUe z;w_t^jsXNxNgeA=u;l?IJ|Zr;cu%M$2f?gS%VSv5Ly7b2h(|8o9qRaqfa<9wAC_!V zrUvoI#k)=&53N@ucL#Pnrqox&BNy)?HB2F}R_aKB9Umxn3r-xyJ4Fp;2<+M+H6*}} z1IjhSiNkn5Qr#jfcujRju%m)L=HSF(yaQDC92TTe-PWc36M7d;{Kfl*%6?w@KQ7;4 z#kDi~c?Bo_;%%d{W>}F!Wpl8ihQ3ze#9zD(RJD8g%j_?(Vv_#y;KW_L�cmOP}Y z5!i5x3f{npyLd~e==A30Kc4G@4NX+A0VnR_&8MOsSo4I6x?sZ`RXl6L0aRQq2%7s-~J+Sn!HUcHzWZyopqk2b+FUNjWT7p_(Uf;w)YqQ^f?- zq(MnDFKr!qpNdA{#9O@ER8b5idF@cMM-{o3`3mtQ5l)=N`-2K*p{9QWYC5SR1Ho-D z*2f1FsDcw`@h(t7C6rt{W(Aa_oKe9I1onsm&+t=YX%ty5-mkRx=D$(>jczX$Ah>?< z0^tn>Zo-MLc*p3k4r-RwHy7TazkLL^D?W*rPk{zF@fGiT`uYVmk90N(4Aa+N2&{|( zPd(1=eS;Ob&pU@E=a*NOWw$z42rtIuHBv>1zdnjWE`60z5vpPiPf$ zvGAwNmZ@X@X>+712|6-brcQXlT6YfqFtHlzF8-l*P5{2<1PaXJO|KsOPJ#XD&LVj8 z`~Q9S^#=a{v|1Zama2Ch{1^I}K~M?Dj5X#t^zWrlynZX2$|(w+4n2gbs%eUSF7O-s z_V0Mjehlm|mPx#sZHv;F#ws-)9W3C#vW9sPP;YHKS)1Ntwa4`H89`N1pwjaZ;ZmS@ zE0*c)>m#UW{7G+vsgaMje3HI)-(={=+sRnKQ)}bNermo+o(q3J#b?Gk#y@pa;GTKB zX&)&!lmb7M-zl|U9qo9lR;XqmQ!m~-!d8ICwzgY6(ftoR4Sg5pO$v-kh6Q&S$6K*S zKRXqWN*$%Iz6i%#I7@ZiI`KZ*rHI1B=WN}da>v&!4KC{lWw=y@WNzfTX}qme(GH0x zJ5(?c*?8Yk%a0P}c#BRcl;BV!SyA6a!KyR{%Ld3(HWn74Dpf3<``$x104E#oI{+t+$t|K1MO#r>E36q!#ZI zJpc)m`f9Q}tq5w`!ksSlk^<$@Rm+x1ymeI9384>E*A=~Z8)@W|O1wSv0^rC>KvgDN zW3L~DI+Joq{;hXWphQ33JnDD`fj;V}h+4c&G&JNN?*n@B`@4J5YY8vbCjdxNS@Ap8a*&q1sh_BR)_vR5bRp3u| z4ymg&Lh&YVFo2B&dAuX?cqc79tV%pGJk5BI-cAun0R@J9|HnUR#@kILl9HyVZ6QMO z4l|H<(s+~4EHm>2jOil*sh$^IQGLkiC$zM99o+*eza zlX)k%q-ppUB_1lS`oGj?;onlqKO96c-WG}tX5)g)A&RBw#Cx{8wY`7--*{gJ-xxE* z7~4=(PA}64Vo>F&^$G>j%;Mc@&%|#EN0jzD<yT^;tZBwOrTyjX z$agdkK%zcE@qYbzt~oVp$@`a^1%pEgHv=Bs%^(BD*F~Xcw&wtqsLr|0(~9>v6W%h; zW%tF-m<%Wyj?{DByQR&2zc>6%|Id0w9&axsC{&@Fp80dy)N_iISiY%nS9weETdjCo zAoE)Cq&LlIBxlNgbmEO|xLkh<%$_vf8OR(4yO?Z?UJ9Y8k0K9XtXcUl<1CF)JryP| z0@EaKi0jM-1;2<+ys-_NT(TgI_a0<6DNtwOF0A2T*G6Q)*gORut6zIxq!I5+$c=md zhdvr^W8R8Ny!w(Ua6=OB8~sDPzpUI#l@eqs6I1Qpp|YcK6zRQ2ythoAW54kXh9BXp zJ$~a&q(GW?yk{x;!#`d^(LGAE2D(ry5vJNDK`Mp5rylPNd}Mh3pUE~|>ZiwVyw@m@ z?j7%-{?M?4Bq-{k#E&31tRBPIs?M)LixhaG9B(`PY>d{@m5eT-g*58wf)v^w8$`jXt4lOe^H=V z?=w7C{N_*KtH&$eO$sDI#rL?3_ttA_#yhD0*f0x<3N&sH*8Ss{w0eiimgc6o3B`Cf z;j7Cd-oyZJb_U}w-t79%q;9;O+6$;L^Bv#vW@H+9!Kl@X3i_eBxg$j_-tX|$;Suj$ z`I{7}rud2XMowwtn@>weB=zHM(O!oXK+%nJ-2pKY+mhV0>{6ge_mxJYTD&Xf@jeQ0 zUb`sr@m|X*t?wF~`hGw;dAyCfU&L3adO=^)#ur?7!^{&3Y-)dunb6~X8el`m?Fh%4 zRM5~rvqcGu@!sd3O7+*N68E4e`B>vUiSFCFKK*@hnPJD<804M!c{JlqtLk5&g!Onc zOn=KSp@LqhdMnvop)T=6{|fFo3bckD@2en}e(ppt-n?$zaD&Ht!}JQ?k5q7w07bVo zuZ-0=<+W*WmSZ{Wc)J1$-Gqr5+Vk-8 zJus0$i+aP2w>QX|cOf$Ij`K?6oe)e*^_5L! zFHANa9l}H_E!qw@-ZzYO21RR8iFcAZ=E`ixJ8ZBE4AmN-Y(?^POT`jxDh)N>4hkeg z&1OX69n~qfBNr*QBJ2B_vF8u7lOlGBypmcm2;_T%l; zpD(6QcQ5WN40O?|!%*X`ra&>2q%som7SPAZ_bqqpxvO-1Rrz<#_nk{tk-EpcBy^g-$&EgKIr-g^}2hmsoW@$MSL zTTL$$wP_HsA8)ztc(O2c%Qy5$_0qQF5aYcO;C*DT^>~jA;$5Q9euuc+P~v^0JDw~| zx8w&vq_${VU5N2wm$A+hp<+QV-Zl71qJF#u6zWR`E-&6($)CgJ>z5w@ktm^cQ(?wC zZ+v?AI`!iH1wVHU;(e=sX{!BrZ_Dp+3Xx>=T@ADi(Z2K$;~g+w^j2!ddkjD22Jx;c zk824r-ek#W#49i={SqV&X+$ZB+)qSQeAPPpCcg>x`-nP< zWQ7+m4rI%0i5HZ_`-BGb4>G79Z;i>xgF@@^{zbA2kx@#Lx2;TmWmnK0X&oWP`Dyh9vC zq%?5@np!B58~hB>uMp#{rO@&<`FIO?ybIL4E#StwQM^Oim&*Xt_T%m014PTtvXwhj z)}W<{BE=!aE1AtbohY4(C69MN_r|R$8pYeMKk&7j_T%lCM8vdzgPtskblO;Y41^ai z-coEnL$*4V$6K#A^Dt?WX7P42Rvu&$)k;4n5RB;QlfV<87kueGr2TA>L|4&O7K?qrfUOHBzKJq0Ah!Fhm!x#tYL`ThpSdLyQ-5)F+P@o0QsKonQEVNC~xgKU1U! zB4t15;uR~RNC&i~QshgR@#fJ$)ru_ME^1qOqaSYrg;vUN(Zg|iaq$l5uNt(5Sfz#- zFIuRrAJTZ!sI8$wKi*V&m~TkO|Kz+}BqI=SQD6wg9;IDrsHaF{nDJtenznDq<3$fO zZ9+R<`E>CgA73}u);7HApWY!Eg?Mi4E8R~do7;g@Bm0VT4<+NY`);*_4JB-|<$a1*x;@Tuttt6|& zn|(}mFJKriTB)ZGR~7FUT5x(Dwtb;Uj@AFRT>J5wP5b$g0eQUo$597h94|gm$0DvO z-n+D-8J49`WCez5DDpb&cu}=S1#@Xoix(|aG>!oACM{9j_T4Ls_YJLBg=LNUs|Njp zoIgX47pa5v)eoq~i&iT6gdp)EeT}LP3vgxe?$VB8*fm3uY?zv$NMY#l0uLuC^`jgb z@uHpz`VlN%q|H;!P64hg-fCJh2CFhDvTXZ<_SuhDpm2j9uTa{Hd5SDG0lM+x+IvdP-iL*FQMXTD?}4j}H=ovY zz@}xJs|LxV_fos@N~Bc}teo*To1a^<0fTsfN7MAQ*#KCH7b$&|TQ0>_#`~Vu`~{10 zDY9(;x$&^=c;)UCRW-G~YI{*vo_7;5l;Z^+k9+jg2-u1jxYKh;PiwWnRmOY$g!WXz zp6*GJR|w$Rq!2151yqi=#u|Yp^LT+e z!ZE%9GYXP(iYsgC>uM^CbCMAW#kA@j9Q)^3k`muln zI0EgoY#xs7W!x?tk-uo$12_S6FxC*6n{{yhbo0sE1)ZOt{hAlCIMo}pp*sQ2Z_=Ljt!Tc^zej=7 z1V}jTXI2-x&YhaUbzbz?Y>eaPH*4XD<(UksyzUGP`<=j1BP%BArv^|`r)UR6jampCbb`~7#OW!Uy z;SbWVy->qrpS^o2*Vi^f*r0`*lie3_iPosB)b2itdT^GhT4|W1_p_HlojQ((}uzn_AmD mJKI~Eo|opO;s1l - - - - - - - - - - - - diff --git a/adev/src/index.html b/adev/src/index.html index f6d4c0eb48e9..4b15ccb87c80 100644 --- a/adev/src/index.html +++ b/adev/src/index.html @@ -58,7 +58,7 @@ - + @@ -95,7 +95,6 @@ href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0" rel="stylesheet" /> - diff --git a/package.json b/package.json index c6b4d61080c2..b162e92169f8 100644 --- a/package.json +++ b/package.json @@ -202,7 +202,6 @@ "fast-glob": "3.3.3", "fflate": "^0.8.2", "firebase-tools": "^13.0.0", - "gsap": "^3.12.3", "gulp": "^5.0.0", "gulp-conventional-changelog": "^5.0.0", "html-entities": "^2.5.2", @@ -215,7 +214,6 @@ "madge": "^8.0.0", "marked": "^15.0.0", "mermaid": "^11.0.0", - "ogl": "^1.0.3", "patch-package": "^7.0.0", "playwright-core": "^1.41.2", "preact": "^10.17.1", diff --git a/yarn.lock b/yarn.lock index 703643624151..cf692dec1b02 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9792,11 +9792,6 @@ grpc-gcp@^1.0.0: dependencies: "@grpc/grpc-js" "^1.7.0" -gsap@^3.12.3: - version "3.12.7" - resolved "https://registry.yarnpkg.com/gsap/-/gsap-3.12.7.tgz#1b690def901ac9b21d4909f39c2b52418154463d" - integrity sha512-V4GsyVamhmKefvcAKaoy0h6si0xX7ogwBoBSs2CTJwt7luW0oZzC0LhdkyuKV8PJAXr7Yaj8pMjCKD4GJ+eEMg== - gtoken@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-7.1.0.tgz#d61b4ebd10132222817f7222b1e6064bd463fc26" @@ -13105,11 +13100,6 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -ogl@^1.0.3: - version "1.0.10" - resolved "https://registry.yarnpkg.com/ogl/-/ogl-1.0.10.tgz#88d9a641eb41e126398950da3c8aec61ba337d8b" - integrity sha512-8zXEqktV0CsvYgqvlcDSITj5/zIbZanU2Ox8qDw6FByJ/AqpfBylRM2fXn0/cKZTN8ydOUsJlakKQuSCOjH/lQ== - on-finished@2.4.1, on-finished@^2.2.0, on-finished@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" From 20f5dc5103ec3d7fe2c4e2d898ee689696e8a0e8 Mon Sep 17 00:00:00 2001 From: arturovt Date: Wed, 29 Jan 2025 08:23:20 +0200 Subject: [PATCH 0055/1000] refactor(core): simplify `concatStringsWithSpace` (#59820) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The new version of the function is smaller, eliminating extra bytes. The refactor improves both code size and readability while optimizing the implementation. Benchmark results for the old and new implementations are as follows: ``` concatStringsWithSpace_old x 149,225,311 ops/sec ±8.54% (50 runs sampled) concatStringsWithSpace_new x 160,206,834 ops/sec ±5.72% (54 runs sampled) ``` Thus, the new implementation is both smaller and faster. PR Close #59820 --- packages/core/src/util/stringify.ts | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/packages/core/src/util/stringify.ts b/packages/core/src/util/stringify.ts index 6545d9ee5667..916ddeaeb490 100644 --- a/packages/core/src/util/stringify.ts +++ b/packages/core/src/util/stringify.ts @@ -46,13 +46,9 @@ export function stringify(token: any): string { * @returns concatenated string. */ export function concatStringsWithSpace(before: string | null, after: string | null): string { - return before == null || before === '' - ? after === null - ? '' - : after - : after == null || after === '' - ? before - : before + ' ' + after; + if (!before) return after || ''; + if (!after) return before; + return `${before} ${after}`; } /** From f34aeaeaad6684dda80fc2da2aec6c2c2a62d94e Mon Sep 17 00:00:00 2001 From: arturovt Date: Fri, 31 Jan 2025 15:38:27 +0200 Subject: [PATCH 0056/1000] refactor(common): remove redundant `transferCacheInterceptorFn` dependencies (#59819) The `transferCacheInterceptorFn` injects dependencies in itself; the `TransferCache` and cache options are redundant in the `deps` list. PR Close #59819 --- packages/common/http/src/transfer_cache.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/common/http/src/transfer_cache.ts b/packages/common/http/src/transfer_cache.ts index 3d0966066410..9aa24dd43838 100644 --- a/packages/common/http/src/transfer_cache.ts +++ b/packages/common/http/src/transfer_cache.ts @@ -328,7 +328,6 @@ export function withHttpTransferCache(cacheOptions: HttpTransferCacheOptions): P provide: HTTP_ROOT_INTERCEPTOR_FNS, useValue: transferCacheInterceptorFn, multi: true, - deps: [TransferState, CACHE_OPTIONS], }, { provide: APP_BOOTSTRAP_LISTENER, From fb39fe96501e39dad051da99114143168ccaebe3 Mon Sep 17 00:00:00 2001 From: Jessica Janiuk Date: Thu, 13 Feb 2025 16:25:42 +0000 Subject: [PATCH 0057/1000] release: cut the v19.2.0-next.3 release --- CHANGELOG.md | 24 ++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a0daeb2d472e..0ce61d94c0e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,27 @@ + +# 19.2.0-next.3 (2025-02-13) +### compiler +| Commit | Type | Description | +| -- | -- | -- | +| [9e847fc60d](https://github.com/angular/angular/commit/9e847fc60d4eef47e665e789ccd2d4f0b4bb94ea) | fix | handle tracking expressions requiring temporary variables ([#58520](https://github.com/angular/angular/pull/58520)) | +### compiler-cli +| Commit | Type | Description | +| -- | -- | -- | +| [5cd26a9420](https://github.com/angular/angular/commit/5cd26a94206dfe8aabdf0dd15bfc09e7a8c606da) | fix | handle deferred blocks with shared dependencies correctly ([#59926](https://github.com/angular/angular/pull/59926)) | +### core +| Commit | Type | Description | +| -- | -- | -- | +| [6789c7ef94](https://github.com/angular/angular/commit/6789c7ef947952551d7598fe37a3d86093b75720) | fix | Defer afterRender until after first CD ([#59455](https://github.com/angular/angular/pull/59455)) ([#59551](https://github.com/angular/angular/pull/59551)) | +| [c87e581dd9](https://github.com/angular/angular/commit/c87e581dd9e240c88cea50f222942873bdccd01d) | fix | Don't run effects in check no changes pass ([#59455](https://github.com/angular/angular/pull/59455)) ([#59551](https://github.com/angular/angular/pull/59551)) | +| [b0266bda4a](https://github.com/angular/angular/commit/b0266bda4ad4efd19710fd0363a50984f48269dc) | fix | invalidate HMR component if replacement throws an error ([#59854](https://github.com/angular/angular/pull/59854)) | +### migrations +| Commit | Type | Description | +| -- | -- | -- | +| [aa285c548c](https://github.com/angular/angular/commit/aa285c548c164917ebb5760802484843c6830daf) | fix | account for let declarations in control flow migration ([#59861](https://github.com/angular/angular/pull/59861)) | +| [1119f85ca9](https://github.com/angular/angular/commit/1119f85ca935f43641f53ee8bc50efa47ad09717) | fix | count used dependencies inside existing control flow ([#59861](https://github.com/angular/angular/pull/59861)) | + + + # 19.1.6 (2025-02-12) ### compiler diff --git a/package.json b/package.json index b162e92169f8..361b10c1f555 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "angular-srcs", - "version": "19.2.0-next.2", + "version": "19.2.0-next.3", "private": true, "description": "Angular - a web framework for modern web apps", "homepage": "https://github.com/angular/angular", From 973033abd2d9580cec79948c9c38f977fef2de87 Mon Sep 17 00:00:00 2001 From: JoostK Date: Thu, 6 Feb 2025 20:46:19 +0100 Subject: [PATCH 0058/1000] fix(compiler-cli): avoid crash in isolated transform operations (#59869) The CLI uses the `ts.transform` API to apply the Angular compiler's transformers on the source files when `isolatedModules` is true (and various other constraints) instead of going through a full `ts.Program.emit` operation. This results in the transformers to operate in an environment where no emit resolver is available, which was not previously accounted for. This commit reflects the possibility for the emit resolver to be missing and handles this scenario accordingly. Fixes #59837 PR Close #59869 --- .../src/ngtsc/imports/src/default.ts | 2 +- .../src/patch_alias_reference_resolution.ts | 14 ++- .../src/ngtsc/imports/test/default_spec.ts | 44 ++++++++ .../jit/src/downlevel_decorators_transform.ts | 2 +- .../downlevel_decorators_transform_spec.ts | 103 +++++++++++++----- .../import_typescript_transform.ts | 8 +- .../translator/test/import_manager_spec.ts | 26 +++++ 7 files changed, 162 insertions(+), 37 deletions(-) diff --git a/packages/compiler-cli/src/ngtsc/imports/src/default.ts b/packages/compiler-cli/src/ngtsc/imports/src/default.ts index 2f3b7a9c60c9..d1554a7c6106 100644 --- a/packages/compiler-cli/src/ngtsc/imports/src/default.ts +++ b/packages/compiler-cli/src/ngtsc/imports/src/default.ts @@ -109,7 +109,7 @@ export class DefaultImportTracker { if (clausesToPreserve === null) { clausesToPreserve = loadIsReferencedAliasDeclarationPatch(context); } - clausesToPreserve.add(clause); + clausesToPreserve?.add(clause); } } diff --git a/packages/compiler-cli/src/ngtsc/imports/src/patch_alias_reference_resolution.ts b/packages/compiler-cli/src/ngtsc/imports/src/patch_alias_reference_resolution.ts index ccac9b8d453a..fbefa2b084ad 100644 --- a/packages/compiler-cli/src/ngtsc/imports/src/patch_alias_reference_resolution.ts +++ b/packages/compiler-cli/src/ngtsc/imports/src/patch_alias_reference_resolution.ts @@ -17,7 +17,7 @@ export type AliasImportDeclaration = ts.ImportSpecifier | ts.NamespaceImport | t * that as public API: https://github.com/microsoft/TypeScript/issues/17516. */ interface TransformationContextWithResolver extends ts.TransformationContext { - getEmitResolver: () => EmitResolver; + getEmitResolver: () => EmitResolver | undefined; } const patchedReferencedAliasesSymbol = Symbol('patchedReferencedAliases'); @@ -70,19 +70,29 @@ interface EmitResolver { * that have been referenced in a value-position by the transform, such the installed patch can * ensure that those import declarations are not elided. * + * If `null` is returned then the transform operates in an isolated context, i.e. using the + * `ts.transform` API. In such scenario there is no information whether an alias declaration + * is referenced, so all alias declarations are naturally preserved and explicitly registering + * an alias declaration as used isn't necessary. + * * See below. Note that this uses sourcegraph as the TypeScript checker file doesn't display on * Github. * https://sourcegraph.com/github.com/microsoft/TypeScript@3eaa7c65f6f076a08a5f7f1946fd0df7c7430259/-/blob/src/compiler/checker.ts#L31219-31257 */ export function loadIsReferencedAliasDeclarationPatch( context: ts.TransformationContext, -): Set { +): Set | null { // If the `getEmitResolver` method is not available, TS most likely changed the // internal structure of the transformation context. We will abort gracefully. if (!isTransformationContextWithEmitResolver(context)) { throwIncompatibleTransformationContextError(); } const emitResolver = context.getEmitResolver(); + if (emitResolver === undefined) { + // In isolated `ts.transform` operations no emit resolver is present, return null as `isReferencedAliasDeclaration` + // will never be invoked. + return null; + } // The emit resolver may have been patched already, in which case we return the set of referenced // aliases that was created when the patch was first applied. diff --git a/packages/compiler-cli/src/ngtsc/imports/test/default_spec.ts b/packages/compiler-cli/src/ngtsc/imports/test/default_spec.ts index 395d60d371bc..5693ff5260fb 100644 --- a/packages/compiler-cli/src/ngtsc/imports/test/default_spec.ts +++ b/packages/compiler-cli/src/ngtsc/imports/test/default_spec.ts @@ -82,6 +82,50 @@ runInEachFileSystem(() => { expect(testContents).toContain(`var dep_1 = require("./dep");`); expect(testContents).toContain(`var ref = dep_1.default;`); }); + + it('should prevent a default import from being elided if used in an isolated transform', () => { + const {program} = makeProgram( + [ + {name: _('/dep.ts'), contents: `export default class Foo {}`}, + { + name: _('/test.ts'), + contents: `import Foo from './dep'; export function test(f: Foo) {}`, + }, + + // This control file is identical to the test file, but will not have its import marked + // for preservation. It exists to capture the behavior without the DefaultImportTracker's + // emit modifications. + { + name: _('/ctrl.ts'), + contents: `import Foo from './dep'; export function test(f: Foo) {}`, + }, + ], + { + module: ts.ModuleKind.ES2015, + }, + ); + const fooClause = getDeclaration(program, _('/test.ts'), 'Foo', ts.isImportClause); + const fooDecl = fooClause.parent as ts.ImportDeclaration; + + const tracker = new DefaultImportTracker(); + tracker.recordUsedImport(fooDecl); + + const result = ts.transform( + [program.getSourceFile(_('/test.ts'))!, program.getSourceFile(_('/ctrl.ts'))!], + [tracker.importPreservingTransformer()], + ); + expect(result.diagnostics?.length ?? 0).toBe(0); + expect(result.transformed.length).toBe(2); + + const printer = ts.createPrinter({newLine: ts.NewLineKind.LineFeed}); + + const testOutput = printer.printFile(result.transformed[0]); + expect(testOutput).toContain(`import Foo from './dep';`); + + // In an isolated transform, TypeScript also retains the default import. + const ctrlOutput = printer.printFile(result.transformed[1]); + expect(ctrlOutput).toContain(`import Foo from './dep';`); + }); }); function addReferenceTransformer(id: ts.Identifier): ts.TransformerFactory { diff --git a/packages/compiler-cli/src/ngtsc/transform/jit/src/downlevel_decorators_transform.ts b/packages/compiler-cli/src/ngtsc/transform/jit/src/downlevel_decorators_transform.ts index 4dc3ff12ded5..e47c18da29d2 100644 --- a/packages/compiler-cli/src/ngtsc/transform/jit/src/downlevel_decorators_transform.ts +++ b/packages/compiler-cli/src/ngtsc/transform/jit/src/downlevel_decorators_transform.ts @@ -378,7 +378,7 @@ export function getDownlevelDecoratorsTransform( // ensure that the alias declaration is not elided by TypeScript, and use its // name identifier to reference it at runtime. if (isAliasImportDeclaration(decl)) { - referencedParameterTypes.add(decl); + referencedParameterTypes?.add(decl); // If the entity name resolves to an alias import declaration, we reference the // entity based on the alias import name. This ensures that TypeScript properly // resolves the link to the import. Cloning the original entity name identifier diff --git a/packages/compiler-cli/src/ngtsc/transform/jit/test/downlevel_decorators_transform_spec.ts b/packages/compiler-cli/src/ngtsc/transform/jit/test/downlevel_decorators_transform_spec.ts index 8ed7c153e0da..f2e853f2f1c5 100644 --- a/packages/compiler-cli/src/ngtsc/transform/jit/test/downlevel_decorators_transform_spec.ts +++ b/packages/compiler-cli/src/ngtsc/transform/jit/test/downlevel_decorators_transform_spec.ts @@ -872,38 +872,81 @@ describe('downlevel decorator transform', () => { ); expect(written).toBe(numberOfTestFiles); }); + }); - function createProgramWithTransform(files: string[]) { - const program = ts.createProgram( - files, - { - moduleResolution: ts.ModuleResolutionKind.Node10, - importHelpers: true, - lib: [], - module: ts.ModuleKind.ESNext, - target: ts.ScriptTarget.Latest, - declaration: false, - experimentalDecorators: true, - emitDecoratorMetadata: false, - }, - host, - ); - const typeChecker = program.getTypeChecker(); - const reflectionHost = new TypeScriptReflectionHost(typeChecker); - const transformers: ts.CustomTransformers = { - before: [ - getDownlevelDecoratorsTransform( - program.getTypeChecker(), - reflectionHost, - diagnostics, - /* isCore */ false, - isClosureEnabled, - ), - ], - }; - return {program, transformers}; - } + it('should work using an isolated transform operation', () => { + context.writeFile( + 'foo_service.d.ts', + ` + export declare class Foo {}; + `, + ); + context.writeFile( + 'foo.ts', + ` + import {Injectable} from '@angular/core'; + import {Foo} from './foo_service'; + + @Injectable() + export class MyService { + constructor(foo: Foo) {} + } + `, + ); + + const {program, transformers} = createProgramWithTransform(['/foo.ts', '/foo_service.d.ts']); + const result = ts.transform(program.getSourceFile('/foo.ts')!, [ + ...(transformers.before ?? []), + ...(transformers.after ?? []), + ] as ts.TransformerFactory[]); + expect(result.diagnostics?.length ?? 0).toBe(0); + expect(result.transformed.length).toBe(1); + + const printer = ts.createPrinter({newLine: ts.NewLineKind.LineFeed}); + const output = printer.printFile(result.transformed[0]); + expect(omitLeadingWhitespace(output)).toEqual(dedent` + import { Injectable } from '@angular/core'; + import { Foo } from './foo_service'; + @Injectable() + export class MyService { + constructor(foo: Foo) { } + static ctorParameters = () => [ + { type: Foo } + ]; + } + `); }); + + function createProgramWithTransform(files: string[]) { + const program = ts.createProgram( + files, + { + moduleResolution: ts.ModuleResolutionKind.Node10, + importHelpers: true, + lib: [], + module: ts.ModuleKind.ESNext, + target: ts.ScriptTarget.Latest, + declaration: false, + experimentalDecorators: true, + emitDecoratorMetadata: false, + }, + host, + ); + const typeChecker = program.getTypeChecker(); + const reflectionHost = new TypeScriptReflectionHost(typeChecker); + const transformers: ts.CustomTransformers = { + before: [ + getDownlevelDecoratorsTransform( + program.getTypeChecker(), + reflectionHost, + diagnostics, + /* isCore */ false, + isClosureEnabled, + ), + ], + }; + return {program, transformers}; + } }); /** Template string function that can be used to dedent a given string literal. */ diff --git a/packages/compiler-cli/src/ngtsc/translator/src/import_manager/import_typescript_transform.ts b/packages/compiler-cli/src/ngtsc/translator/src/import_manager/import_typescript_transform.ts index 7fbe38b548b3..8ea733c8e6b6 100644 --- a/packages/compiler-cli/src/ngtsc/translator/src/import_manager/import_typescript_transform.ts +++ b/packages/compiler-cli/src/ngtsc/translator/src/import_manager/import_typescript_transform.ts @@ -37,9 +37,11 @@ export function createTsTransformForImportManager( // doesn't drop these thinking they are unused. if (reusedOriginalAliasDeclarations.size > 0) { const referencedAliasDeclarations = loadIsReferencedAliasDeclarationPatch(ctx); - reusedOriginalAliasDeclarations.forEach((aliasDecl) => - referencedAliasDeclarations.add(aliasDecl), - ); + if (referencedAliasDeclarations !== null) { + reusedOriginalAliasDeclarations.forEach((aliasDecl) => + referencedAliasDeclarations.add(aliasDecl), + ); + } } // Update the set of affected files to include files that need extra statements to be inserted. diff --git a/packages/compiler-cli/src/ngtsc/translator/test/import_manager_spec.ts b/packages/compiler-cli/src/ngtsc/translator/test/import_manager_spec.ts index f1dde68b8920..26f432a921d9 100644 --- a/packages/compiler-cli/src/ngtsc/translator/test/import_manager_spec.ts +++ b/packages/compiler-cli/src/ngtsc/translator/test/import_manager_spec.ts @@ -1081,6 +1081,32 @@ describe('import manager', () => { `), ); }); + + it('should work when using an isolated transform', () => { + const {testFile} = createTestProgram('import { input } from "@angular/core";'); + const manager = new ImportManager(); + const ref = manager.addImport({ + exportModuleSpecifier: '@angular/core', + exportSymbolName: 'input', + requestedFile: testFile, + }); + + const extraStatements = [ts.factory.createExpressionStatement(ref)]; + const transformer = manager.toTsTransform(new Map([[testFile.fileName, extraStatements]])); + + const result = ts.transform(testFile, [transformer]); + expect(result.diagnostics?.length ?? 0).toBe(0); + expect(result.transformed.length).toBe(1); + + const printer = ts.createPrinter({newLine: ts.NewLineKind.LineFeed}); + const output = printer.printFile(result.transformed[0]); + expect(output).toBe( + omitLeadingWhitespace(` + import { input } from "@angular/core"; + input; + `), + ); + }); }); function createTestProgram(text: string): { From 2588985f433b20a6a5a8d239347291f5d6fb2451 Mon Sep 17 00:00:00 2001 From: Matt Turco Date: Mon, 23 Dec 2024 15:20:00 -0600 Subject: [PATCH 0059/1000] feat(core): pass signal node to throwInvalidWriteToSignalErrorFn (#59600) Updates the signature of the `throwInvalidWriteToSignalError` to take the signal node in question and pass it along to the throwInvalidWriteToSignalErrorFn handler function. This allows the handler to e.g. include the signal name in error messaging. PR Close #59600 --- .../public-api/core/primitives/signals/index.api.md | 2 +- packages/core/primitives/signals/src/errors.ts | 10 ++++++---- packages/core/primitives/signals/src/signal.ts | 4 ++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/goldens/public-api/core/primitives/signals/index.api.md b/goldens/public-api/core/primitives/signals/index.api.md index 76f793253276..ec12c218d206 100644 --- a/goldens/public-api/core/primitives/signals/index.api.md +++ b/goldens/public-api/core/primitives/signals/index.api.md @@ -144,7 +144,7 @@ export function setAlternateWeakRefImpl(impl: unknown): void; export function setPostSignalSetFn(fn: (() => void) | null): (() => void) | null; // @public (undocumented) -export function setThrowInvalidWriteToSignalError(fn: () => never): void; +export function setThrowInvalidWriteToSignalError(fn: (node: SignalNode) => never): void; // @public export const SIGNAL: unique symbol; diff --git a/packages/core/primitives/signals/src/errors.ts b/packages/core/primitives/signals/src/errors.ts index c6836a37137f..fc0fa71e33d7 100644 --- a/packages/core/primitives/signals/src/errors.ts +++ b/packages/core/primitives/signals/src/errors.ts @@ -6,16 +6,18 @@ * found in the LICENSE file at https://angular.dev/license */ +import type {SignalNode} from './signal'; + function defaultThrowError(): never { throw new Error(); } -let throwInvalidWriteToSignalErrorFn = defaultThrowError; +let throwInvalidWriteToSignalErrorFn: (node: SignalNode) => never = defaultThrowError; -export function throwInvalidWriteToSignalError() { - throwInvalidWriteToSignalErrorFn(); +export function throwInvalidWriteToSignalError(node: SignalNode) { + throwInvalidWriteToSignalErrorFn(node); } -export function setThrowInvalidWriteToSignalError(fn: () => never): void { +export function setThrowInvalidWriteToSignalError(fn: (node: SignalNode) => never): void { throwInvalidWriteToSignalErrorFn = fn; } diff --git a/packages/core/primitives/signals/src/signal.ts b/packages/core/primitives/signals/src/signal.ts index 7517228bab0e..243fe6630289 100644 --- a/packages/core/primitives/signals/src/signal.ts +++ b/packages/core/primitives/signals/src/signal.ts @@ -70,7 +70,7 @@ export function signalGetFn(this: SignalNode): T { export function signalSetFn(node: SignalNode, newValue: T) { if (!producerUpdatesAllowed()) { - throwInvalidWriteToSignalError(); + throwInvalidWriteToSignalError(node); } if (!node.equal(node.value, newValue)) { @@ -81,7 +81,7 @@ export function signalSetFn(node: SignalNode, newValue: T) { export function signalUpdateFn(node: SignalNode, updater: (value: T) => T): void { if (!producerUpdatesAllowed()) { - throwInvalidWriteToSignalError(); + throwInvalidWriteToSignalError(node); } signalSetFn(node, updater(node.value)); From d1a3e6203cda6ba1cdaea4dcb28f0ea99b0954b8 Mon Sep 17 00:00:00 2001 From: Jessica Janiuk Date: Thu, 13 Feb 2025 12:40:49 -0500 Subject: [PATCH 0060/1000] build: update zone.js pullapprove rule (#59941) This excludes lock and package files from requiring zones approval. PR Close #59941 --- .pullapprove.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pullapprove.yml b/.pullapprove.yml index 13b9da5773e2..502aec8b35f7 100644 --- a/.pullapprove.yml +++ b/.pullapprove.yml @@ -227,9 +227,9 @@ groups: <<: *defaults conditions: - > - contains_any_globs(files, [ + contains_any_globs(files.exclude('yarn.lock','package.json'), [ 'packages/zone.js/**/{*,.*}', - ]) + ]) reviewers: users: - JiaLiPassion From d46aa79873a560b526aba71c7277beb5039f9098 Mon Sep 17 00:00:00 2001 From: Jessica Janiuk Date: Thu, 13 Feb 2025 15:07:58 -0500 Subject: [PATCH 0061/1000] build: update zone.js pullapprove rule (#59942) This fixes the broken pullapprove config due to a missing array. PR Close #59942 --- .pullapprove.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pullapprove.yml b/.pullapprove.yml index 502aec8b35f7..bd5e0bb8e865 100644 --- a/.pullapprove.yml +++ b/.pullapprove.yml @@ -227,7 +227,7 @@ groups: <<: *defaults conditions: - > - contains_any_globs(files.exclude('yarn.lock','package.json'), [ + contains_any_globs(files.exclude('yarn.lock'), [ 'packages/zone.js/**/{*,.*}', ]) reviewers: From 8b757bf35c8814753d217582a3df938f4789597d Mon Sep 17 00:00:00 2001 From: iteriani Date: Tue, 11 Feb 2025 15:34:35 -0800 Subject: [PATCH 0062/1000] refactor(core): Check in some interfaces for the DI package (#59921) This will be the starting point of the DI package. We will first check in some interfaces and then make sure the existing DI package implements that interface. Afterwards, we'll slowly start moving injector implementation. PR Close #59921 --- packages/core/primitives/di/BUILD.bazel | 30 ++++++++ packages/core/primitives/di/README.md | 3 + .../core/primitives/di/src/injection_token.ts | 54 +++++++++++++++ packages/core/primitives/di/src/injector.ts | 13 ++++ packages/core/primitives/di/src/type.ts | 68 +++++++++++++++++++ 5 files changed, 168 insertions(+) create mode 100644 packages/core/primitives/di/BUILD.bazel create mode 100644 packages/core/primitives/di/README.md create mode 100644 packages/core/primitives/di/src/injection_token.ts create mode 100644 packages/core/primitives/di/src/injector.ts create mode 100644 packages/core/primitives/di/src/type.ts diff --git a/packages/core/primitives/di/BUILD.bazel b/packages/core/primitives/di/BUILD.bazel new file mode 100644 index 000000000000..04bea3273c74 --- /dev/null +++ b/packages/core/primitives/di/BUILD.bazel @@ -0,0 +1,30 @@ +load("//tools:defaults.bzl", "ts_library", "tsec_test") + +package(default_visibility = [ + "//packages:__pkg__", + "//packages/core:__subpackages__", +]) + +ts_library( + name = "di", + srcs = glob( + [ + "**/*.ts", + ], + ), +) + +tsec_test( + name = "tsec_test", + target = "di", + tsconfig = "//packages:tsec_config", +) + +filegroup( + name = "files_for_docgen", + srcs = glob([ + "*.ts", + "src/**/*.ts", + ]), + visibility = ["//visibility:public"], +) diff --git a/packages/core/primitives/di/README.md b/packages/core/primitives/di/README.md new file mode 100644 index 000000000000..523ea424ec4d --- /dev/null +++ b/packages/core/primitives/di/README.md @@ -0,0 +1,3 @@ +# Angular Dependency Injection + +This directory contains the code which powers Angular's dependency injection primitive. diff --git a/packages/core/primitives/di/src/injection_token.ts b/packages/core/primitives/di/src/injection_token.ts new file mode 100644 index 000000000000..2b3998664a0a --- /dev/null +++ b/packages/core/primitives/di/src/injection_token.ts @@ -0,0 +1,54 @@ +/** + * @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.dev/license + */ + +import {Type} from './type'; +/** + * Information about how a type or `InjectionToken` interfaces with the DI system. + * + * At a minimum, this includes a `factory` which defines how to create the given type `T`, possibly + * requesting injection of other types if necessary. + * + * Optionally, a `providedIn` parameter specifies that the given type belongs to a particular + * `Injector`, `NgModule`, or a special scope (e.g. `'root'`). A value of `null` indicates + * that the injectable does not belong to any scope. + */ +export interface ɵɵInjectableDeclaration { + /** + * Specifies that the given type belongs to a particular injector: + */ + providedIn: Type | 'root' | 'platform' | 'any' | null; + + /** + * The token to which this definition belongs. + * + * Note that this may not be the same as the type that the `factory` will create. + */ + token: unknown; + + /** + * Factory method to execute to create an instance of the injectable. + */ + factory: (t?: Type) => T; + + /** + * In a case of no explicit injector, a location where the instance of the injectable is stored. + */ + value: T | undefined; +} + +/** + * A `Type` which has a `ɵprov: ɵɵInjectableDeclaration` static field. + * + * `InjectableType`s contain their own Dependency Injection metadata and are usable in an + * `InjectorDef`-based `StaticInjector`. + * + * @publicApi + */ +export interface InjectionToken extends Type { + ɵprov: ɵɵInjectableDeclaration; +} diff --git a/packages/core/primitives/di/src/injector.ts b/packages/core/primitives/di/src/injector.ts new file mode 100644 index 000000000000..8d5095e28553 --- /dev/null +++ b/packages/core/primitives/di/src/injector.ts @@ -0,0 +1,13 @@ +/** + * @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.dev/license + */ + +import {InjectionToken} from './injection_token'; + +export interface Injector { + get(token: InjectionToken, options: unknown): T | undefined; +} diff --git a/packages/core/primitives/di/src/type.ts b/packages/core/primitives/di/src/type.ts new file mode 100644 index 000000000000..6d1fd19632ad --- /dev/null +++ b/packages/core/primitives/di/src/type.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.dev/license + */ + +/** + * @description + * + * Represents a type that a Component or other object is instances of. + * + * An example of a `Type` is `MyCustomComponent` class, which in JavaScript is represented by + * the `MyCustomComponent` constructor function. + * + * @publicApi + */ +export const Type = Function; + +export function isType(v: any): v is Type { + return typeof v === 'function'; +} + +/** + * @description + * + * Represents an abstract class `T`, if applied to a concrete class it would stop being + * instantiable. + * + * @publicApi + */ +export interface AbstractType extends Function { + prototype: T; +} + +export interface Type extends Function { + new (...args: any[]): T; +} + +/** + * Returns a writable type version of type. + * + * USAGE: + * Given: + * ```ts + * interface Person {readonly name: string} + * ``` + * + * We would like to get a read/write version of `Person`. + * ```ts + * const WritablePerson = Writable; + * ``` + * + * The result is that you can do: + * + * ```ts + * const readonlyPerson: Person = {name: 'Marry'}; + * readonlyPerson.name = 'John'; // TypeError + * (readonlyPerson as WritablePerson).name = 'John'; // OK + * + * // Error: Correctly detects that `Person` did not have `age` property. + * (readonlyPerson as WritablePerson).age = 30; + * ``` + */ +export type Writable = { + -readonly [K in keyof T]: T[K]; +}; From 1ebf7bfb23529b06379dbd2fcd2a624ba63760fb Mon Sep 17 00:00:00 2001 From: Jessica Janiuk Date: Thu, 13 Feb 2025 16:40:19 -0500 Subject: [PATCH 0063/1000] ci: fix flakey incremental hydration test (#59945) This extends the test timeout for the two timer tests while shortening the actual hydrate on timer. This hopefully should result in more reliable CI. PR Close #59945 --- .../test/incremental_hydration_spec.ts | 216 +++++++++--------- 1 file changed, 113 insertions(+), 103 deletions(-) diff --git a/packages/platform-server/test/incremental_hydration_spec.ts b/packages/platform-server/test/incremental_hydration_spec.ts index aee30608e216..f570780f8821 100644 --- a/packages/platform-server/test/incremental_hydration_spec.ts +++ b/packages/platform-server/test/incremental_hydration_spec.ts @@ -38,7 +38,7 @@ import { withEventReplay, withIncrementalHydration, } from '@angular/platform-browser'; -import {fakeAsync, TestBed} from '@angular/core/testing'; +import {TestBed} from '@angular/core/testing'; import {PLATFORM_BROWSER_ID} from '@angular/common/src/platform_id'; import {DEHYDRATED_BLOCK_REGISTRY} from '@angular/core/src/defer/registry'; import {JSACTION_BLOCK_ELEMENT_MAP} from '@angular/core/src/hydration/tokens'; @@ -1329,12 +1329,16 @@ describe('platform-server partial hydration integration', () => { }); describe('timer', () => { - it('top level timer', fakeAsync(async () => { - @Component({ - selector: 'app', - template: ` + const TEST_TIMEOUT = 10_000; // 10 seconds + + it( + 'top level timer', + async () => { + @Component({ + selector: 'app', + template: `
- @defer (hydrate on timer(500)) { + @defer (hydrate on timer(150)) {
defer block rendered! {{value()}} @@ -1344,72 +1348,76 @@ describe('platform-server partial hydration integration', () => { }
`, - }) - class SimpleComponent { - value = signal('start'); - fnA() {} - fnB() { - this.value.set('end'); + }) + class SimpleComponent { + value = signal('start'); + fnA() {} + fnB() { + this.value.set('end'); + } } - } - const appId = 'custom-app-id'; - const providers = [{provide: APP_ID, useValue: appId}]; - const hydrationFeatures = () => [withIncrementalHydration()]; + const appId = 'custom-app-id'; + const providers = [{provide: APP_ID, useValue: appId}]; + const hydrationFeatures = () => [withIncrementalHydration()]; - const html = await ssr(SimpleComponent, {envProviders: providers, hydrationFeatures}); - const ssrContents = getAppContents(html); + const html = await ssr(SimpleComponent, {envProviders: providers, hydrationFeatures}); + const ssrContents = getAppContents(html); - //
uses "eager" `custom-app-id` namespace. - expect(ssrContents).toContain('
start'); + expect(appHostNode.outerHTML).toContain('start'); - const testElement = doc.getElementById('test')!; - const clickEvent2 = new CustomEvent('click'); - testElement.dispatchEvent(clickEvent2); + const testElement = doc.getElementById('test')!; + const clickEvent2 = new CustomEvent('click'); + testElement.dispatchEvent(clickEvent2); - appRef.tick(); + appRef.tick(); - expect(appHostNode.outerHTML).toContain('end'); - })); + expect(appHostNode.outerHTML).toContain('end'); + }, + TEST_TIMEOUT, + ); - it('nested timer', fakeAsync(async () => { - @Component({ - selector: 'app', - template: ` + it( + 'nested timer', + async () => { + @Component({ + selector: 'app', + template: `
@defer (on viewport; hydrate on interaction) {
defer block rendered! - @defer (on viewport; hydrate on timer(500)) { + @defer (on viewport; hydrate on timer(150)) {

Nested defer block

{{value()}} @@ -1423,71 +1431,73 @@ describe('platform-server partial hydration integration', () => { }
`, - }) - class SimpleComponent { - value = signal('start'); - fnA() {} - fnB() { - this.value.set('end'); + }) + class SimpleComponent { + value = signal('start'); + fnA() {} + fnB() { + this.value.set('end'); + } } - } - const appId = 'custom-app-id'; - const providers = [{provide: APP_ID, useValue: appId}]; - const hydrationFeatures = () => [withIncrementalHydration()]; + const appId = 'custom-app-id'; + const providers = [{provide: APP_ID, useValue: appId}]; + const hydrationFeatures = () => [withIncrementalHydration()]; - const html = await ssr(SimpleComponent, {envProviders: providers, hydrationFeatures}); - const ssrContents = getAppContents(html); + const html = await ssr(SimpleComponent, {envProviders: providers, hydrationFeatures}); + const ssrContents = getAppContents(html); - //
uses "eager" `custom-app-id` namespace. - expect(ssrContents).toContain('
start'); + expect(appHostNode.outerHTML).toContain('start'); - const testElement = doc.getElementById('test')!; - const clickEvent2 = new CustomEvent('click'); - testElement.dispatchEvent(clickEvent2); + const testElement = doc.getElementById('test')!; + const clickEvent2 = new CustomEvent('click'); + testElement.dispatchEvent(clickEvent2); - appRef.tick(); + appRef.tick(); - expect(appHostNode.outerHTML).toContain('end'); - })); + expect(appHostNode.outerHTML).toContain('end'); + }, + TEST_TIMEOUT, + ); }); it('when', async () => { From 7197e82936c1694fc8dc095541b1c562aedbb409 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Thu, 13 Feb 2025 15:29:28 +0000 Subject: [PATCH 0064/1000] build: update cross-repo angular dependencies (#59946) See associated pull request for more information. PR Close #59946 --- .github/actions/saucelabs-legacy/action.yml | 4 +- .github/workflows/adev-preview-build.yml | 8 +- .github/workflows/adev-preview-deploy.yml | 2 +- .../assistant-to-the-branch-manager.yml | 2 +- .github/workflows/benchmark-compare.yml | 2 +- .github/workflows/ci.yml | 40 +- .github/workflows/dev-infra.yml | 4 +- .github/workflows/google-internal-tests.yml | 2 +- .github/workflows/manual.yml | 8 +- .github/workflows/merge-ready-status.yml | 2 +- .github/workflows/perf.yml | 6 +- .github/workflows/pr.yml | 36 +- .github/workflows/update-cli-help.yml | 2 +- package.json | 22 +- yarn.lock | 1044 ++++++++++++----- 15 files changed, 818 insertions(+), 366 deletions(-) diff --git a/.github/actions/saucelabs-legacy/action.yml b/.github/actions/saucelabs-legacy/action.yml index cdcde69b4c85..77746c7c4892 100644 --- a/.github/actions/saucelabs-legacy/action.yml +++ b/.github/actions/saucelabs-legacy/action.yml @@ -5,9 +5,9 @@ runs: using: 'composite' steps: - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/bazel/setup@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Saucelabs Variables - uses: angular/dev-infra/github-actions/saucelabs@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/saucelabs@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Starting Saucelabs tunnel service shell: bash run: ./tools/saucelabs/sauce-service.sh run & diff --git a/.github/workflows/adev-preview-build.yml b/.github/workflows/adev-preview-build.yml index 165bf34c9459..c8eb9c4dfd2f 100644 --- a/.github/workflows/adev-preview-build.yml +++ b/.github/workflows/adev-preview-build.yml @@ -21,16 +21,16 @@ jobs: (github.event.action == 'synchronize' && contains(github.event.pull_request.labels.*.name, 'adev: preview')) steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/bazel/setup@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/bazel/configure-remote@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Install node modules run: yarn install --frozen-lockfile - name: Build adev to ensure it continues to work run: yarn bazel build //adev:build --full_build_adev --config=release - - uses: angular/dev-infra/github-actions/previews/pack-and-upload-artifact@2670abf637fa155971cdd1f7e570a7f234922a65 + - uses: angular/dev-infra/github-actions/previews/pack-and-upload-artifact@002a34e9875f55bf1850fb57d34261b33b2fd492 with: workflow-artifact-name: 'adev-preview' pull-number: '${{github.event.pull_request.number}}' diff --git a/.github/workflows/adev-preview-deploy.yml b/.github/workflows/adev-preview-deploy.yml index d9783450882a..92cdfd0afe1b 100644 --- a/.github/workflows/adev-preview-deploy.yml +++ b/.github/workflows/adev-preview-deploy.yml @@ -40,7 +40,7 @@ jobs: npx -y firebase-tools@latest target:clear --config adev/firebase.json --project ${{env.PREVIEW_PROJECT}} hosting angular-docs npx -y firebase-tools@latest target:apply --config adev/firebase.json --project ${{env.PREVIEW_PROJECT}} hosting angular-docs ${{env.PREVIEW_SITE}} - - uses: angular/dev-infra/github-actions/previews/upload-artifacts-to-firebase@2670abf637fa155971cdd1f7e570a7f234922a65 + - uses: angular/dev-infra/github-actions/previews/upload-artifacts-to-firebase@002a34e9875f55bf1850fb57d34261b33b2fd492 with: github-token: '${{secrets.GITHUB_TOKEN}}' workflow-artifact-name: 'adev-preview' diff --git a/.github/workflows/assistant-to-the-branch-manager.yml b/.github/workflows/assistant-to-the-branch-manager.yml index 7b3fc34ab7d3..9bc5c725a2ed 100644 --- a/.github/workflows/assistant-to-the-branch-manager.yml +++ b/.github/workflows/assistant-to-the-branch-manager.yml @@ -16,6 +16,6 @@ jobs: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false - - uses: angular/dev-infra/github-actions/branch-manager@2670abf637fa155971cdd1f7e570a7f234922a65 + - uses: angular/dev-infra/github-actions/branch-manager@002a34e9875f55bf1850fb57d34261b33b2fd492 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/benchmark-compare.yml b/.github/workflows/benchmark-compare.yml index 5913ac3ac21d..940187d357eb 100644 --- a/.github/workflows/benchmark-compare.yml +++ b/.github/workflows/benchmark-compare.yml @@ -38,7 +38,7 @@ jobs: - uses: ./.github/actions/yarn-install - - uses: angular/dev-infra/github-actions/bazel/configure-remote@2670abf637fa155971cdd1f7e570a7f234922a65 + - uses: angular/dev-infra/github-actions/bazel/configure-remote@002a34e9875f55bf1850fb57d34261b33b2fd492 with: bazelrc: ./.bazelrc.user diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7f0e6435554d..f6ac58e0d32d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,7 +21,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 with: cache-node-modules: true - name: Install node modules @@ -41,13 +41,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/bazel/setup@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/bazel/configure-remote@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Install node modules run: yarn install --frozen-lockfile - name: Run unit tests @@ -59,13 +59,13 @@ jobs: runs-on: ubuntu-latest-4core steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/bazel/setup@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/bazel/configure-remote@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Install node modules run: yarn install --frozen-lockfile --network-timeout 100000 - name: Run CI tests for framework @@ -76,11 +76,11 @@ jobs: labels: ubuntu-latest-4core steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/bazel/setup@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/bazel/configure-remote@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Install node modules run: yarn install --frozen-lockfile - name: Build adev in fast mode to ensure it continues to work @@ -93,13 +93,13 @@ jobs: labels: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/bazel/setup@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/bazel/configure-remote@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Install node modules run: yarn install --frozen-lockfile - run: echo "https://${{secrets.SNAPSHOT_BUILDS_GITHUB_TOKEN}}:@github.com" > ${HOME}/.git_credentials @@ -111,7 +111,7 @@ jobs: labels: ubuntu-latest-4core steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 with: cache-node-modules: true node-module-directories: | @@ -119,9 +119,9 @@ jobs: ./packages/zone.js/node_modules ./packages/zone.js/test/typings/node_modules - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/bazel/setup@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/bazel/configure-remote@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Install node modules run: yarn install --frozen-lockfile - run: | @@ -158,7 +158,7 @@ jobs: SAUCE_TUNNEL_IDENTIFIER: angular-framework-${{ github.run_number }} steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 with: cache-node-modules: true - name: Install node modules @@ -171,11 +171,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/bazel/setup@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/bazel/configure-remote@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Install node modules run: yarn install --frozen-lockfile - name: Build adev to ensure it continues to work diff --git a/.github/workflows/dev-infra.yml b/.github/workflows/dev-infra.yml index e6ee79ed2fd0..ee6170373828 100644 --- a/.github/workflows/dev-infra.yml +++ b/.github/workflows/dev-infra.yml @@ -13,13 +13,13 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - uses: angular/dev-infra/github-actions/commit-message-based-labels@2670abf637fa155971cdd1f7e570a7f234922a65 + - uses: angular/dev-infra/github-actions/commit-message-based-labels@002a34e9875f55bf1850fb57d34261b33b2fd492 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} post_approval_changes: runs-on: ubuntu-latest steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - uses: angular/dev-infra/github-actions/post-approval-changes@2670abf637fa155971cdd1f7e570a7f234922a65 + - uses: angular/dev-infra/github-actions/post-approval-changes@002a34e9875f55bf1850fb57d34261b33b2fd492 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/google-internal-tests.yml b/.github/workflows/google-internal-tests.yml index 3f360c5b0ca5..3016d863a1c1 100644 --- a/.github/workflows/google-internal-tests.yml +++ b/.github/workflows/google-internal-tests.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - uses: angular/dev-infra/github-actions/google-internal-tests@2670abf637fa155971cdd1f7e570a7f234922a65 + - uses: angular/dev-infra/github-actions/google-internal-tests@002a34e9875f55bf1850fb57d34261b33b2fd492 with: run-tests-guide-url: http://go/angular-g3sync-start github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/manual.yml b/.github/workflows/manual.yml index 6b4951c81eba..5e8a8e3c51bc 100644 --- a/.github/workflows/manual.yml +++ b/.github/workflows/manual.yml @@ -13,17 +13,17 @@ jobs: JOBS: 2 steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 with: cache-node-modules: true - name: Install node modules run: yarn install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/bazel/setup@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/bazel/configure-remote@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Saucelabs Variables - uses: angular/dev-infra/github-actions/saucelabs@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/saucelabs@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Set up Sauce Tunnel Daemon run: yarn bazel run //tools/saucelabs-daemon/background-service -- $JOBS & env: diff --git a/.github/workflows/merge-ready-status.yml b/.github/workflows/merge-ready-status.yml index d8233c5f784c..d53308734be6 100644 --- a/.github/workflows/merge-ready-status.yml +++ b/.github/workflows/merge-ready-status.yml @@ -9,6 +9,6 @@ jobs: status: runs-on: ubuntu-latest steps: - - uses: angular/dev-infra/github-actions/unified-status-check@2670abf637fa155971cdd1f7e570a7f234922a65 + - uses: angular/dev-infra/github-actions/unified-status-check@002a34e9875f55bf1850fb57d34261b33b2fd492 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/perf.yml b/.github/workflows/perf.yml index 8189d31f0704..78c5a8e9e70d 100644 --- a/.github/workflows/perf.yml +++ b/.github/workflows/perf.yml @@ -21,7 +21,7 @@ jobs: workflows: ${{ steps.workflows.outputs.workflows }} steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Install node modules run: yarn -s install --frozen-lockfile - id: workflows @@ -36,9 +36,9 @@ jobs: workflow: ${{ fromJSON(needs.list.outputs.workflows) }} steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/bazel/setup@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Install node modules run: yarn -s install --frozen-lockfile # We utilize the google-github-actions/auth action to allow us to get an active credential using workflow diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 7579f7fdbee8..be21b72ce06f 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 with: cache-node-modules: true - name: Install node modules @@ -39,7 +39,7 @@ jobs: - name: Check code format run: yarn ng-dev format changed --check ${{ github.event.pull_request.base.sha }} - name: Check Package Licenses - uses: angular/dev-infra/github-actions/linting/licenses@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/linting/licenses@002a34e9875f55bf1850fb57d34261b33b2fd492 with: allow-dependencies-licenses: 'pkg:npm/google-protobuf@' @@ -47,13 +47,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/bazel/setup@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/bazel/configure-remote@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Install node modules run: yarn install --frozen-lockfile - name: Run unit tests @@ -65,13 +65,13 @@ jobs: runs-on: ubuntu-latest-4core steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/bazel/setup@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/bazel/configure-remote@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Install node modules run: yarn install --frozen-lockfile --network-timeout 100000 - name: Run CI tests for framework @@ -83,13 +83,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/bazel/setup@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/bazel/configure-remote@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Install node modules run: yarn install --frozen-lockfile --network-timeout 100000 - name: Run CI tests for framework @@ -105,11 +105,11 @@ jobs: labels: ubuntu-latest-4core steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/bazel/setup@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/bazel/configure-remote@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Install node modules run: yarn install --frozen-lockfile - name: Build adev in fast mode to ensure it continues to work @@ -122,7 +122,7 @@ jobs: labels: ubuntu-latest-4core steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 with: cache-node-modules: true node-module-directories: | @@ -130,9 +130,9 @@ jobs: ./packages/zone.js/node_modules ./packages/zone.js/test/typings/node_modules - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/bazel/setup@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/bazel/configure-remote@002a34e9875f55bf1850fb57d34261b33b2fd492 - name: Install node modules run: yarn install --frozen-lockfile - run: | @@ -169,7 +169,7 @@ jobs: SAUCE_TUNNEL_IDENTIFIER: angular-framework-${{ github.run_number }} steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@002a34e9875f55bf1850fb57d34261b33b2fd492 with: cache-node-modules: true - name: Install node modules diff --git a/.github/workflows/update-cli-help.yml b/.github/workflows/update-cli-help.yml index 03e340232485..3703c2865425 100644 --- a/.github/workflows/update-cli-help.yml +++ b/.github/workflows/update-cli-help.yml @@ -32,7 +32,7 @@ jobs: env: ANGULAR_CLI_BUILDS_READONLY_GITHUB_TOKEN: ${{ secrets.ANGULAR_CLI_BUILDS_READONLY_GITHUB_TOKEN }} - name: Create a PR (if necessary) - uses: angular/dev-infra/github-actions/create-pr-for-changes@2670abf637fa155971cdd1f7e570a7f234922a65 + uses: angular/dev-infra/github-actions/create-pr-for-changes@002a34e9875f55bf1850fb57d34261b33b2fd492 with: branch-prefix: update-cli-help pr-title: 'docs: update Angular CLI help [${{github.ref_name}}]' diff --git a/package.json b/package.json index 361b10c1f555..ba9d06ae8af6 100644 --- a/package.json +++ b/package.json @@ -48,14 +48,14 @@ }, "// 1": "dependencies are used locally and by bazel", "dependencies": { - "@angular-devkit/build-angular": "19.2.0-next.0", - "@angular-devkit/core": "19.2.0-next.0", - "@angular-devkit/schematics": "19.2.0-next.0", - "@angular/build": "19.2.0-next.0", - "@angular/cdk": "19.2.0-next.1", - "@angular/cli": "19.2.0-next.0", - "@angular/material": "19.2.0-next.1", - "@angular/ssr": "19.2.0-next.1", + "@angular-devkit/build-angular": "19.2.0-next.2", + "@angular-devkit/core": "19.2.0-next.2", + "@angular-devkit/schematics": "19.2.0-next.2", + "@angular/build": "19.2.0-next.2", + "@angular/cdk": "19.2.0-next.4", + "@angular/cli": "19.2.0-next.2", + "@angular/material": "19.2.0-next.4", + "@angular/ssr": "19.2.0-next.2", "@babel/cli": "7.26.4", "@babel/core": "7.26.0", "@babel/generator": "7.26.5", @@ -72,7 +72,7 @@ "@rollup/plugin-babel": "^6.0.0", "@rollup/plugin-commonjs": "^28.0.0", "@rollup/plugin-node-resolve": "^13.0.4", - "@schematics/angular": "19.2.0-next.0", + "@schematics/angular": "19.2.0-next.2", "@stackblitz/sdk": "^1.11.0", "@types/angular": "^1.6.47", "@types/babel__core": "7.20.5", @@ -159,11 +159,11 @@ "@babel/plugin-proposal-async-generator-functions": "7.20.7", "@actions/core": "^1.10.0", "@actions/github": "^6.0.0", - "@angular-devkit/architect-cli": "0.1902.0-next.0", + "@angular-devkit/architect-cli": "0.1902.0-next.2", "@angular/animations": "^19.2.0-next", "@angular/build-tooling": "https://github.com/angular/dev-infra-private-build-tooling-builds.git#ce04ec6cf7604014191821a637e60964a1a3bb4a", "@angular/core": "^19.2.0-next", - "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#2a80accff0f6515819a6c6e77eeca9d6936cd7b9", + "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#e29eb33d02c473598361716df343c13016a6c943", "@bazel/bazelisk": "^1.7.5", "@bazel/buildifier": "^8.0.0", "@bazel/ibazel": "0.16.2", diff --git a/yarn.lock b/yarn.lock index cf692dec1b02..59630acf5711 100644 --- a/yarn.lock +++ b/yarn.lock @@ -164,13 +164,13 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" -"@angular-devkit/architect-cli@0.1902.0-next.0": - version "0.1902.0-next.0" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect-cli/-/architect-cli-0.1902.0-next.0.tgz#52aacd03b4a0b4e59456aa57581003eba33a8fab" - integrity sha512-SzlsZoKIsVofM/HoqnIksWAWh87Mj0Uezm6eeuKKKIDv/lx/F7MkRKJu/ah7l8pRrSA3lY7pk+P0dkPM5p3xtQ== +"@angular-devkit/architect-cli@0.1902.0-next.2": + version "0.1902.0-next.2" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect-cli/-/architect-cli-0.1902.0-next.2.tgz#63ff37f2b1296a320e521080eb801c21dbc5965d" + integrity sha512-3dVppTdx3+WNwzw8oxSK5Gt7UCrMh5Rrms7B5IR1avFe1D3V6khyhkIycFU0gLBGXbs3N83yogtSxZckDRjugA== dependencies: - "@angular-devkit/architect" "0.1902.0-next.0" - "@angular-devkit/core" "19.2.0-next.0" + "@angular-devkit/architect" "0.1902.0-next.2" + "@angular-devkit/core" "19.2.0-next.2" ansi-colors "4.1.3" progress "2.0.3" symbol-observable "4.0.0" @@ -184,35 +184,35 @@ "@angular-devkit/core" "19.1.0-rc.0" rxjs "7.8.1" -"@angular-devkit/architect@0.1902.0-next.0": - version "0.1902.0-next.0" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1902.0-next.0.tgz#6a672c48fd50996ea16ba5c2169b2bcf09e957f8" - integrity sha512-YvqJs8nbGOtBEizu5s8LVioR0cFIFIqdV8X+inbLxF9TiaBjmuJXhNabknDWhJDNW31MTNe+h9s2CmOgC2TLRg== +"@angular-devkit/architect@0.1902.0-next.2": + version "0.1902.0-next.2" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1902.0-next.2.tgz#68eaa74bd04266d843b90efb8563553ada17638c" + integrity sha512-EWOrRAADKDeirVKfZJsngkgMnjU+SrYdQSqXy6sWcLhxFrd6iQFDarFuYtulHfhyaBv5gDR1119Oc4H7BresGw== dependencies: - "@angular-devkit/core" "19.2.0-next.0" + "@angular-devkit/core" "19.2.0-next.2" rxjs "7.8.1" -"@angular-devkit/build-angular@19.2.0-next.0": - version "19.2.0-next.0" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-19.2.0-next.0.tgz#91d3f2ba715de24439ef69c941cd99310090b699" - integrity sha512-vRctCI5Kxrp5eK80vRytbjHUYCTbMmmlPncvBPw17AgPWMgAXQDdwBOtQKIhw1dEjjV67SHtUUhEjuKfHLr9Uw== +"@angular-devkit/build-angular@19.2.0-next.2": + version "19.2.0-next.2" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-19.2.0-next.2.tgz#db4d88a89f3ec0d84b2680e9dbc90afe55c2c263" + integrity sha512-o3/X02x4p9pCVaPB4uoc2VUL2s2YvGW58jfSHRhwtiLVoIgpnbyHyyhtIdO8rLRr09Pk1fLUvXVY4/d6hjXt1Q== dependencies: "@ampproject/remapping" "2.3.0" - "@angular-devkit/architect" "0.1902.0-next.0" - "@angular-devkit/build-webpack" "0.1902.0-next.0" - "@angular-devkit/core" "19.2.0-next.0" - "@angular/build" "19.2.0-next.0" - "@babel/core" "7.26.0" - "@babel/generator" "7.26.5" + "@angular-devkit/architect" "0.1902.0-next.2" + "@angular-devkit/build-webpack" "0.1902.0-next.2" + "@angular-devkit/core" "19.2.0-next.2" + "@angular/build" "19.2.0-next.2" + "@babel/core" "7.26.8" + "@babel/generator" "7.26.8" "@babel/helper-annotate-as-pure" "7.25.9" "@babel/helper-split-export-declaration" "7.24.7" - "@babel/plugin-transform-async-generator-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-runtime" "7.25.9" - "@babel/preset-env" "7.26.0" - "@babel/runtime" "7.26.0" + "@babel/plugin-transform-runtime" "7.26.8" + "@babel/preset-env" "7.26.8" + "@babel/runtime" "7.26.7" "@discoveryjs/json-ext" "0.6.3" - "@ngtools/webpack" "19.2.0-next.0" + "@ngtools/webpack" "19.2.0-next.2" "@vitejs/plugin-basic-ssl" "1.2.0" ansi-colors "4.1.3" autoprefixer "10.4.20" @@ -220,7 +220,7 @@ browserslist "^4.21.5" copy-webpack-plugin "12.0.2" css-loader "7.1.2" - esbuild-wasm "0.24.2" + esbuild-wasm "0.25.0" fast-glob "3.3.3" http-proxy-middleware "3.0.3" istanbul-lib-instrument "6.0.3" @@ -235,16 +235,16 @@ ora "5.4.1" picomatch "4.0.2" piscina "4.8.0" - postcss "8.5.1" + postcss "8.5.2" postcss-loader "8.1.1" resolve-url-loader "5.0.0" rxjs "7.8.1" - sass "1.83.4" + sass "1.84.0" sass-loader "16.0.4" - semver "7.6.3" + semver "7.7.1" source-map-loader "5.0.0" source-map-support "0.5.21" - terser "5.37.0" + terser "5.38.2" tree-kill "1.2.2" tslib "2.8.1" webpack "5.97.1" @@ -253,7 +253,7 @@ webpack-merge "6.0.1" webpack-subresource-integrity "5.1.0" optionalDependencies: - esbuild "0.24.2" + esbuild "0.25.0" "@angular-devkit/build-optimizer@0.14.0-beta.5": version "0.14.0-beta.5" @@ -265,12 +265,12 @@ typescript "3.2.4" webpack-sources "1.3.0" -"@angular-devkit/build-webpack@0.1902.0-next.0": - version "0.1902.0-next.0" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1902.0-next.0.tgz#bef10317d045012ac50fdb641d5b5d284597b849" - integrity sha512-c1090wPfCwPQ8qVDZ4i9L2BH2wt5xdRzJXyovCWAwgrIsKyAAi+gRqhPN1YC+gT4FdR+bjIPSTWs4yP9Wrq9og== +"@angular-devkit/build-webpack@0.1902.0-next.2": + version "0.1902.0-next.2" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1902.0-next.2.tgz#49469c7a104376927d625ffc521a47b40a6c68ed" + integrity sha512-RSHIFtVxFmwxiUN9Nun3ZdlOoo7d+sNKpnexcjOQ01sTWkOtO9wuBgCPCRWjPgs5JSBN6iDAzBQrydlCOqpwgQ== dependencies: - "@angular-devkit/architect" "0.1902.0-next.0" + "@angular-devkit/architect" "0.1902.0-next.2" rxjs "7.8.1" "@angular-devkit/core@19.1.0-rc.0": @@ -285,10 +285,10 @@ rxjs "7.8.1" source-map "0.7.4" -"@angular-devkit/core@19.2.0-next.0": - version "19.2.0-next.0" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-19.2.0-next.0.tgz#4ead05bec7802752738339f106e45f7763c0f99e" - integrity sha512-TBdtY5/Mnk/+ywcYr6fHOed3q4jm2BoadBYEfRxhJKAA4953oS/HI22bvzZIEOxZ3uvXSGUoUPYVZdeHxDz+kg== +"@angular-devkit/core@19.2.0-next.2": + version "19.2.0-next.2" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-19.2.0-next.2.tgz#5d26a8cc5a868b38e1dd85f65d75ee8499976abf" + integrity sha512-V1O42Dqo7rcy1VtMwqM/TQr47KQ/B3OXrjmM8G8fQyCZMqT2haknf3r44ZrsKuZqYgEBOZ5ILiHn7X1ojQgscQ== dependencies: ajv "8.17.1" ajv-formats "3.0.1" @@ -297,12 +297,12 @@ rxjs "7.8.1" source-map "0.7.4" -"@angular-devkit/schematics@19.2.0-next.0": - version "19.2.0-next.0" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-19.2.0-next.0.tgz#7a19d9bae3418d510490f897e1d568e2933285fd" - integrity sha512-0ChOaR7VmObjUpL9kOYt/WtkqAOg/K0eApt0bQofF1nz3owOVMQ5kE9wbCtajSIq9B87k32+xuyxWN4vIrZvjw== +"@angular-devkit/schematics@19.2.0-next.2": + version "19.2.0-next.2" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-19.2.0-next.2.tgz#6b382f24118b68943bf192f4ac4ba5ea7c67a318" + integrity sha512-p8Q7insna5BD+EbEJZvykxxgRm0gwe5Fjar+oXSnmiwd4RX/nNP46IZXPxZM65hq6IRDx2sVk6Scfd1GbPrseQ== dependencies: - "@angular-devkit/core" "19.2.0-next.0" + "@angular-devkit/core" "19.2.0-next.2" jsonc-parser "3.3.1" magic-string "0.30.17" ora "5.4.1" @@ -393,23 +393,22 @@ optionalDependencies: lmdb "3.2.2" -"@angular/build@19.2.0-next.0": - version "19.2.0-next.0" - resolved "https://registry.yarnpkg.com/@angular/build/-/build-19.2.0-next.0.tgz#3840f060d286bc14dcda6b704361957279e7b67d" - integrity sha512-Y63iOBcohaQl9uEDRbQ7P/Ra8gaQuYgHyzTD3ATPTTPrKxyIsxYy8DE2r5BJIcYohhimrS59uL6rTvQOG/Njfg== +"@angular/build@19.2.0-next.2": + version "19.2.0-next.2" + resolved "https://registry.yarnpkg.com/@angular/build/-/build-19.2.0-next.2.tgz#c08ffd25db28fa456f51da7784b19b88feb7590c" + integrity sha512-FmpJla0+M+BE1bQbHIKbl5wKrHsSg6JTIl+kiW/kW4GKKZsS4FJkg56UhyI7+bjuId9s3wptpdMIFpRDaDytRg== dependencies: "@ampproject/remapping" "2.3.0" - "@angular-devkit/architect" "0.1902.0-next.0" - "@angular-devkit/core" "19.2.0-next.0" - "@babel/core" "7.26.0" + "@angular-devkit/architect" "0.1902.0-next.2" + "@babel/core" "7.26.8" "@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.3" + "@inquirer/confirm" "5.1.5" "@vitejs/plugin-basic-ssl" "1.2.0" beasties "0.2.0" browserslist "^4.23.0" - esbuild "0.24.2" + esbuild "0.25.0" fast-glob "3.3.3" https-proxy-agent "7.0.6" istanbul-lib-instrument "6.0.3" @@ -419,43 +418,43 @@ parse5-html-rewriting-stream "7.0.0" picomatch "4.0.2" piscina "4.8.0" - rollup "4.31.0" - sass "1.83.4" - semver "7.6.3" - vite "6.0.11" + rollup "4.34.6" + sass "1.84.0" + semver "7.7.1" + vite "6.1.0" watchpack "2.4.2" optionalDependencies: - lmdb "3.2.2" + lmdb "3.2.6" -"@angular/cdk@19.2.0-next.1": - version "19.2.0-next.1" - resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-19.2.0-next.1.tgz#45a3065006fe9ad4d47ef34e5052464c54ce7cf0" - integrity sha512-Hvn34v8z8owsq+8qkCws3uwFMMlfoiXkeKVAhcp4Aau+jm9w+nPIL9hD4YuziQ+rqtHghzPPgeSOBC+ADWqUTw== +"@angular/cdk@19.2.0-next.4": + version "19.2.0-next.4" + resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-19.2.0-next.4.tgz#a3c9fe76a712974e26828ae04e37761805efeda4" + integrity sha512-fmmwokyT2IGLRGzQEj2j4EoQBNdML+QYKyH3J3KlGN7i3p3G63uitzrvz5sEAdsXnpebxemhAs9aPW+HPhsvew== dependencies: tslib "^2.3.0" optionalDependencies: parse5 "^7.1.2" -"@angular/cli@19.2.0-next.0": - version "19.2.0-next.0" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-19.2.0-next.0.tgz#9560b8cba1e730d5b91461ad24046d296730a8a9" - integrity sha512-a5cKotZ44wgx4F88wcdP1p8M5TbHi1Xpssuh42UogQHT9XzDAnmWRrcJLMH+fD8UEFLSRNpMJdKAUDlzRVHBgQ== +"@angular/cli@19.2.0-next.2": + version "19.2.0-next.2" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-19.2.0-next.2.tgz#97074ebe6dc6b024561b74125c6184670f836b61" + integrity sha512-sWh9Ltn45rZTHnsbOTNh7hBUiUyJSOLpiOBkaRkJwyH+021PapuCIXr5PBLgkEI2o++DtIXvAdE3UHPKEvRQ/A== dependencies: - "@angular-devkit/architect" "0.1902.0-next.0" - "@angular-devkit/core" "19.2.0-next.0" - "@angular-devkit/schematics" "19.2.0-next.0" - "@inquirer/prompts" "7.2.3" + "@angular-devkit/architect" "0.1902.0-next.2" + "@angular-devkit/core" "19.2.0-next.2" + "@angular-devkit/schematics" "19.2.0-next.2" + "@inquirer/prompts" "7.3.1" "@listr2/prompt-adapter-inquirer" "2.0.18" - "@schematics/angular" "19.2.0-next.0" + "@schematics/angular" "19.2.0-next.2" "@yarnpkg/lockfile" "1.1.0" ini "5.0.0" jsonc-parser "3.3.1" listr2 "8.2.5" - npm-package-arg "12.0.1" + npm-package-arg "12.0.2" npm-pick-manifest "10.0.0" pacote "20.0.0" resolve "1.22.10" - semver "7.6.3" + semver "7.7.1" symbol-observable "4.0.0" yargs "17.7.2" @@ -473,21 +472,21 @@ dependencies: tslib "^2.3.0" -"@angular/material@19.2.0-next.1": - version "19.2.0-next.1" - resolved "https://registry.yarnpkg.com/@angular/material/-/material-19.2.0-next.1.tgz#1e5b63d6509e4e09e02ce5a02079a4f86bf2275f" - integrity sha512-5sgxT0928VkqizIXcoEL8VpZV853XUfC4VXjTHWvjOqFSSX/EN88DXqz4VUsOZ9zIfc7hV9Gzi4JQYgTyXCfuQ== +"@angular/material@19.2.0-next.4": + version "19.2.0-next.4" + resolved "https://registry.yarnpkg.com/@angular/material/-/material-19.2.0-next.4.tgz#4fa6cd7216b52edff40d617cbea276c0b1ffb8fe" + integrity sha512-darSa77CFdlVFax88GLNJWstHJp8j5qUo/kbQwUNsN0ltigS4o7eaczBA9ukekoSpXSgijq6y2VfnkkYi8hCZQ== dependencies: tslib "^2.3.0" -"@angular/ng-dev@https://github.com/angular/dev-infra-private-ng-dev-builds.git#2a80accff0f6515819a6c6e77eeca9d6936cd7b9": - version "0.0.0-2670abf637fa155971cdd1f7e570a7f234922a65" - resolved "https://github.com/angular/dev-infra-private-ng-dev-builds.git#2a80accff0f6515819a6c6e77eeca9d6936cd7b9" +"@angular/ng-dev@https://github.com/angular/dev-infra-private-ng-dev-builds.git#e29eb33d02c473598361716df343c13016a6c943": + version "0.0.0-002a34e9875f55bf1850fb57d34261b33b2fd492" + resolved "https://github.com/angular/dev-infra-private-ng-dev-builds.git#e29eb33d02c473598361716df343c13016a6c943" dependencies: - "@google-cloud/spanner" "7.17.1" + "@google-cloud/spanner" "7.18.1" "@octokit/rest" "21.1.0" "@types/semver" "^7.3.6" - "@types/supports-color" "^8.1.1" + "@types/supports-color" "^10.0.0" "@yarnpkg/lockfile" "^1.1.0" chalk "^5.0.1" semver "^7.5.4" @@ -497,10 +496,10 @@ which "^5.0.0" yaml "2.7.0" -"@angular/ssr@19.2.0-next.1": - version "19.2.0-next.1" - resolved "https://registry.yarnpkg.com/@angular/ssr/-/ssr-19.2.0-next.1.tgz#69434df6c0aa2e38b8135d06532e15424e21335b" - integrity sha512-AdsiSxOXbq6Lk3zbe+0919RXEnNfol0PWcOhGMgr1y0u/YV6akEplLAVFWyrNxVcXl8Dk0BNXgnx1Stjlk9NUw== +"@angular/ssr@19.2.0-next.2": + version "19.2.0-next.2" + resolved "https://registry.yarnpkg.com/@angular/ssr/-/ssr-19.2.0-next.2.tgz#c1205c1cdc5a7375225b05b40e84f80c3a5e1b49" + integrity sha512-JN5Utru8xJRpCF+ArG3CCgzlCYgbnB2XUV4J6uO56KgdqK5OeCOCcsuJYBHu+ifaF4ecb74JdXWm0VgB/HQKXA== dependencies: tslib "^2.3.0" @@ -563,11 +562,16 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.26.0", "@babel/compat-data@^7.26.5": +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.26.5": version "7.26.5" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.5.tgz#df93ac37f4417854130e21d72c66ff3d4b897fc7" integrity sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg== +"@babel/compat-data@^7.26.8": + version "7.26.8" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.8.tgz#821c1d35641c355284d4a870b8a4a7b0c141e367" + integrity sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ== + "@babel/core@7.26.0": version "7.26.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" @@ -589,6 +593,28 @@ json5 "^2.2.3" semver "^6.3.1" +"@babel/core@7.26.8": + version "7.26.8" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.8.tgz#7742f11c75acea6b08a8e24c5c0c8c89e89bf53e" + integrity sha512-l+lkXCHS6tQEc5oUpK28xBOZ6+HwaH7YwoYQbLFiYb4nS2/l1tKnZEtEWkD0GuiYdvArf9qBS0XlQGXzPMsNqQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.8" + "@babel/helper-compilation-targets" "^7.26.5" + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helpers" "^7.26.7" + "@babel/parser" "^7.26.8" + "@babel/template" "^7.26.8" + "@babel/traverse" "^7.26.8" + "@babel/types" "^7.26.8" + "@types/gensync" "^1.0.0" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.23.9": version "7.26.7" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.7.tgz#0439347a183b97534d52811144d763a17f9d2b24" @@ -621,6 +647,17 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" +"@babel/generator@7.26.8", "@babel/generator@^7.26.8": + version "7.26.8" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.8.tgz#f9c5e770309e12e3099ad8271e52f6caa15442ab" + integrity sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA== + dependencies: + "@babel/parser" "^7.26.8" + "@babel/types" "^7.26.8" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + "@babel/helper-annotate-as-pure@7.25.9", "@babel/helper-annotate-as-pure@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz#d8eac4d2dc0d7b6e11fa6e535332e0d3184f06b4" @@ -788,6 +825,13 @@ dependencies: "@babel/types" "^7.26.7" +"@babel/parser@^7.26.8": + version "7.26.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.8.tgz#deca2b4d99e5e1b1553843b99823f118da6107c2" + integrity sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw== + dependencies: + "@babel/types" "^7.26.8" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz#cc2e53ebf0a0340777fff5ed521943e253b4d8fe" @@ -878,14 +922,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-async-generator-functions@7.25.9", "@babel/plugin-transform-async-generator-functions@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz#1b18530b077d18a407c494eb3d1d72da505283a2" - integrity sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw== +"@babel/plugin-transform-async-generator-functions@7.26.8", "@babel/plugin-transform-async-generator-functions@^7.26.8": + version "7.26.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz#5e3991135e3b9c6eaaf5eff56d1ae5a11df45ff8" + integrity sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.26.5" "@babel/helper-remap-async-to-generator" "^7.25.9" - "@babel/traverse" "^7.25.9" + "@babel/traverse" "^7.26.8" "@babel/plugin-transform-async-to-generator@7.25.9", "@babel/plugin-transform-async-to-generator@^7.25.9": version "7.25.9" @@ -896,7 +940,7 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/helper-remap-async-to-generator" "^7.25.9" -"@babel/plugin-transform-block-scoped-functions@^7.25.9": +"@babel/plugin-transform-block-scoped-functions@^7.26.5": version "7.26.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz#3dc4405d31ad1cbe45293aa57205a6e3b009d53e" integrity sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ== @@ -983,7 +1027,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-exponentiation-operator@^7.25.9": +"@babel/plugin-transform-exponentiation-operator@^7.26.3": version "7.26.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz#e29f01b6de302c7c2c794277a48f04a9ca7f03bc" integrity sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ== @@ -1050,7 +1094,7 @@ "@babel/helper-module-transforms" "^7.25.9" "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-commonjs@^7.25.9": +"@babel/plugin-transform-modules-commonjs@^7.26.3": version "7.26.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz#8f011d44b20d02c3de44d8850d971d8497f981fb" integrity sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ== @@ -1091,7 +1135,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-nullish-coalescing-operator@^7.25.9": +"@babel/plugin-transform-nullish-coalescing-operator@^7.26.6": version "7.26.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz#fbf6b3c92cb509e7b319ee46e3da89c5bedd31fe" integrity sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw== @@ -1191,13 +1235,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-runtime@7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz#62723ea3f5b31ffbe676da9d6dae17138ae580ea" - integrity sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ== +"@babel/plugin-transform-runtime@7.26.8": + version "7.26.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.26.8.tgz#e025e062c08809db61de7e249193a8de1bc83092" + integrity sha512-H0jlQxFMI0Q8SyGPsj9pO3ygVQRxPkIGytsL3m1Zqca8KrCPpMlvh+e2dxknqdfS8LFwBw+PpiYPD9qy/FPQpA== dependencies: "@babel/helper-module-imports" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.26.5" babel-plugin-polyfill-corejs2 "^0.4.10" babel-plugin-polyfill-corejs3 "^0.10.6" babel-plugin-polyfill-regenerator "^0.6.1" @@ -1225,14 +1269,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-template-literals@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz#6dbd4a24e8fad024df76d1fac6a03cf413f60fe1" - integrity sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw== +"@babel/plugin-transform-template-literals@^7.26.8": + version "7.26.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz#966b15d153a991172a540a69ad5e1845ced990b5" + integrity sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.26.5" -"@babel/plugin-transform-typeof-symbol@^7.25.9": +"@babel/plugin-transform-typeof-symbol@^7.26.7": version "7.26.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz#d0e33acd9223744c1e857dbd6fa17bd0a3786937" integrity sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw== @@ -1270,14 +1314,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.25.9" "@babel/helper-plugin-utils" "^7.25.9" -"@babel/preset-env@7.26.0": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.26.0.tgz#30e5c6bc1bcc54865bff0c5a30f6d4ccdc7fa8b1" - integrity sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw== +"@babel/preset-env@7.26.8": + version "7.26.8" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.26.8.tgz#7af0090829b606d2046db99679004731e1dc364d" + integrity sha512-um7Sy+2THd697S4zJEfv/U5MHGJzkN2xhtsR3T/SWRbVSic62nbISh51VVfU9JiO/L/Z97QczHTaFVkOU8IzNg== dependencies: - "@babel/compat-data" "^7.26.0" - "@babel/helper-compilation-targets" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@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" @@ -1289,9 +1333,9 @@ "@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.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.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" @@ -1302,7 +1346,7 @@ "@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.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.25.9" "@babel/plugin-transform-function-name" "^7.25.9" @@ -1311,12 +1355,12 @@ "@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.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.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" @@ -1332,17 +1376,17 @@ "@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.25.9" - "@babel/plugin-transform-typeof-symbol" "^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.10.6" + babel-plugin-polyfill-corejs3 "^0.11.0" babel-plugin-polyfill-regenerator "^0.6.1" - core-js-compat "^3.38.1" + core-js-compat "^3.40.0" semver "^6.3.1" "@babel/preset-modules@0.1.6-no-external-plugins": @@ -1354,14 +1398,7 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/runtime@7.26.0": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1" - integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/runtime@^7.8.4": +"@babel/runtime@7.26.7", "@babel/runtime@^7.8.4": version "7.26.7" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.7.tgz#f4e7fe527cd710f8dc0618610b61b4b060c3c341" integrity sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ== @@ -1377,6 +1414,15 @@ "@babel/parser" "^7.25.9" "@babel/types" "^7.25.9" +"@babel/template@^7.26.8": + version "7.26.8" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.26.8.tgz#db3898f47a17bab2f4c78ec1d0de38527c2ffe19" + integrity sha512-iNKaX3ZebKIsCvJ+0jd6embf+Aulaa3vNBqZ41kM7iTWjx5qzWKXGHiJUW3+nTpQ18SG11hdF8OAzKrpXkb96Q== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/parser" "^7.26.8" + "@babel/types" "^7.26.8" + "@babel/traverse@^7.25.9", "@babel/traverse@^7.26.5", "@babel/traverse@^7.26.7": version "7.26.7" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.7.tgz#99a0a136f6a75e7fb8b0a1ace421e0b25994b8bb" @@ -1390,6 +1436,19 @@ debug "^4.3.1" globals "^11.1.0" +"@babel/traverse@^7.26.8": + version "7.26.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.8.tgz#0a8a9c2b7cc9519eed14275f4fd2278ad46e8cc9" + integrity sha512-nic9tRkjYH0oB2dzr/JoGIm+4Q6SuYeLEiIiZDwBscRMYFJ+tMAz98fuel9ZnbXViA2I0HVSSRRK8DW5fjXStA== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.8" + "@babel/parser" "^7.26.8" + "@babel/template" "^7.26.8" + "@babel/types" "^7.26.8" + debug "^4.3.1" + globals "^11.1.0" + "@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.5", "@babel/types@^7.26.7", "@babel/types@^7.4.4": version "7.26.7" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.7.tgz#5e2b89c0768e874d4d061961f3a5a153d71dc17a" @@ -1398,6 +1457,14 @@ "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" +"@babel/types@^7.26.8": + version "7.26.8" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.8.tgz#97dcdc190fab45be7f3dc073e3c11160d677c127" + integrity sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA== + dependencies: + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@bazel/bazelisk@^1.7.5": version "1.25.0" resolved "https://registry.yarnpkg.com/@bazel/bazelisk/-/bazelisk-1.25.0.tgz#aded6d2822dd7220fa2290c97cb5e285c8fda770" @@ -1752,6 +1819,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz#38848d3e25afe842a7943643cbcd387cc6e13461" integrity sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA== +"@esbuild/aix-ppc64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz#499600c5e1757a524990d5d92601f0ac3ce87f64" + integrity sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ== + "@esbuild/android-arm64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz#58565291a1fe548638adb9c584237449e5e14018" @@ -1762,6 +1834,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz#f592957ae8b5643129fa889c79e69cd8669bb894" integrity sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg== +"@esbuild/android-arm64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz#b9b8231561a1dfb94eb31f4ee056b92a985c324f" + integrity sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g== + "@esbuild/android-arm@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.23.1.tgz#5eb8c652d4c82a2421e3395b808e6d9c42c862ee" @@ -1772,6 +1849,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.24.2.tgz#72d8a2063aa630308af486a7e5cbcd1e134335b3" integrity sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q== +"@esbuild/android-arm@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.0.tgz#ca6e7888942505f13e88ac9f5f7d2a72f9facd2b" + integrity sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g== + "@esbuild/android-x64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.23.1.tgz#ae19d665d2f06f0f48a6ac9a224b3f672e65d517" @@ -1782,6 +1864,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.24.2.tgz#9a7713504d5f04792f33be9c197a882b2d88febb" integrity sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw== +"@esbuild/android-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.0.tgz#e765ea753bac442dfc9cb53652ce8bd39d33e163" + integrity sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg== + "@esbuild/darwin-arm64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz#05b17f91a87e557b468a9c75e9d85ab10c121b16" @@ -1792,6 +1879,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz#02ae04ad8ebffd6e2ea096181b3366816b2b5936" integrity sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA== +"@esbuild/darwin-arm64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz#fa394164b0d89d4fdc3a8a21989af70ef579fa2c" + integrity sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw== + "@esbuild/darwin-x64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz#c58353b982f4e04f0d022284b8ba2733f5ff0931" @@ -1802,6 +1894,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz#9ec312bc29c60e1b6cecadc82bd504d8adaa19e9" integrity sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA== +"@esbuild/darwin-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz#91979d98d30ba6e7d69b22c617cc82bdad60e47a" + integrity sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg== + "@esbuild/freebsd-arm64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz#f9220dc65f80f03635e1ef96cfad5da1f446f3bc" @@ -1812,6 +1909,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz#5e82f44cb4906d6aebf24497d6a068cfc152fa00" integrity sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg== +"@esbuild/freebsd-arm64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz#b97e97073310736b430a07b099d837084b85e9ce" + integrity sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w== + "@esbuild/freebsd-x64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz#69bd8511fa013b59f0226d1609ac43f7ce489730" @@ -1822,6 +1924,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz#3fb1ce92f276168b75074b4e51aa0d8141ecce7f" integrity sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q== +"@esbuild/freebsd-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz#f3b694d0da61d9910ec7deff794d444cfbf3b6e7" + integrity sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A== + "@esbuild/linux-arm64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz#8050af6d51ddb388c75653ef9871f5ccd8f12383" @@ -1832,6 +1939,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz#856b632d79eb80aec0864381efd29de8fd0b1f43" integrity sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg== +"@esbuild/linux-arm64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz#f921f699f162f332036d5657cad9036f7a993f73" + integrity sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg== + "@esbuild/linux-arm@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz#ecaabd1c23b701070484990db9a82f382f99e771" @@ -1842,6 +1954,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz#c846b4694dc5a75d1444f52257ccc5659021b736" integrity sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA== +"@esbuild/linux-arm@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz#cc49305b3c6da317c900688995a4050e6cc91ca3" + integrity sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg== + "@esbuild/linux-ia32@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz#3ed2273214178109741c09bd0687098a0243b333" @@ -1852,6 +1969,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz#f8a16615a78826ccbb6566fab9a9606cfd4a37d5" integrity sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw== +"@esbuild/linux-ia32@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz#3e0736fcfab16cff042dec806247e2c76e109e19" + integrity sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg== + "@esbuild/linux-loong64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz#a0fdf440b5485c81b0fbb316b08933d217f5d3ac" @@ -1862,6 +1984,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz#1c451538c765bf14913512c76ed8a351e18b09fc" integrity sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ== +"@esbuild/linux-loong64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz#ea2bf730883cddb9dfb85124232b5a875b8020c7" + integrity sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw== + "@esbuild/linux-mips64el@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz#e11a2806346db8375b18f5e104c5a9d4e81807f6" @@ -1872,6 +1999,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz#0846edeefbc3d8d50645c51869cc64401d9239cb" integrity sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw== +"@esbuild/linux-mips64el@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz#4cababb14eede09248980a2d2d8b966464294ff1" + integrity sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ== + "@esbuild/linux-ppc64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz#06a2744c5eaf562b1a90937855b4d6cf7c75ec96" @@ -1882,6 +2014,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz#8e3fc54505671d193337a36dfd4c1a23b8a41412" integrity sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw== +"@esbuild/linux-ppc64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz#8860a4609914c065373a77242e985179658e1951" + integrity sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw== + "@esbuild/linux-riscv64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz#65b46a2892fc0d1af4ba342af3fe0fa4a8fe08e7" @@ -1892,6 +2029,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz#6a1e92096d5e68f7bb10a0d64bb5b6d1daf9a694" integrity sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q== +"@esbuild/linux-riscv64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz#baf26e20bb2d38cfb86ee282dff840c04f4ed987" + integrity sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA== + "@esbuild/linux-s390x@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz#e71ea18c70c3f604e241d16e4e5ab193a9785d6f" @@ -1902,6 +2044,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz#ab18e56e66f7a3c49cb97d337cd0a6fea28a8577" integrity sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw== +"@esbuild/linux-s390x@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz#8323afc0d6cb1b6dc6e9fd21efd9e1542c3640a4" + integrity sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA== + "@esbuild/linux-x64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz#d47f97391e80690d4dfe811a2e7d6927ad9eed24" @@ -1912,11 +2059,21 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz#8140c9b40da634d380b0b29c837a0b4267aff38f" integrity sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q== +"@esbuild/linux-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz#08fcf60cb400ed2382e9f8e0f5590bac8810469a" + integrity sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw== + "@esbuild/netbsd-arm64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz#65f19161432bafb3981f5f20a7ff45abb2e708e6" integrity sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw== +"@esbuild/netbsd-arm64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz#935c6c74e20f7224918fbe2e6c6fe865b6c6ea5b" + integrity sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw== + "@esbuild/netbsd-x64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz#44e743c9778d57a8ace4b72f3c6b839a3b74a653" @@ -1927,6 +2084,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz#7a3a97d77abfd11765a72f1c6f9b18f5396bcc40" integrity sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw== +"@esbuild/netbsd-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz#414677cef66d16c5a4d210751eb2881bb9c1b62b" + integrity sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA== + "@esbuild/openbsd-arm64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz#05c5a1faf67b9881834758c69f3e51b7dee015d7" @@ -1937,6 +2099,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz#58b00238dd8f123bfff68d3acc53a6ee369af89f" integrity sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A== +"@esbuild/openbsd-arm64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz#8fd55a4d08d25cdc572844f13c88d678c84d13f7" + integrity sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw== + "@esbuild/openbsd-x64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz#2e58ae511bacf67d19f9f2dcd9e8c5a93f00c273" @@ -1947,6 +2114,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz#0ac843fda0feb85a93e288842936c21a00a8a205" integrity sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA== +"@esbuild/openbsd-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz#0c48ddb1494bbc2d6bcbaa1429a7f465fa1dedde" + integrity sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg== + "@esbuild/sunos-x64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz#adb022b959d18d3389ac70769cef5a03d3abd403" @@ -1957,6 +2129,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz#8b7aa895e07828d36c422a4404cc2ecf27fb15c6" integrity sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig== +"@esbuild/sunos-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz#86ff9075d77962b60dd26203d7352f92684c8c92" + integrity sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg== + "@esbuild/win32-arm64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz#84906f50c212b72ec360f48461d43202f4c8b9a2" @@ -1967,6 +2144,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz#c023afb647cabf0c3ed13f0eddfc4f1d61c66a85" integrity sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ== +"@esbuild/win32-arm64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz#849c62327c3229467f5b5cd681bf50588442e96c" + integrity sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw== + "@esbuild/win32-ia32@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz#5e3eacc515820ff729e90d0cb463183128e82fac" @@ -1977,6 +2159,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz#96c356132d2dda990098c8b8b951209c3cd743c2" integrity sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA== +"@esbuild/win32-ia32@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz#f62eb480cd7cca088cb65bb46a6db25b725dc079" + integrity sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA== + "@esbuild/win32-x64@0.23.1": version "0.23.1" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz#81fd50d11e2c32b2d6241470e3185b70c7b30699" @@ -1987,6 +2174,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz#34aa0b52d0fbb1a654b596acfa595f0c7b77a77b" integrity sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg== +"@esbuild/win32-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz#c8e119a30a7c8d60b9d2e22d2073722dde3b710b" + integrity sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ== + "@fastify/busboy@^2.0.0": version "2.1.1" resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" @@ -2060,10 +2252,10 @@ lodash.snakecase "^4.1.1" p-defer "^3.0.0" -"@google-cloud/spanner@7.17.1": - version "7.17.1" - resolved "https://registry.yarnpkg.com/@google-cloud/spanner/-/spanner-7.17.1.tgz#1f8229efe07d9b62829c93837976b7028eeca4f0" - integrity sha512-+dTR6wvb2jANVxNe2bF048QCOVRGbesHe8Tm0OFRhvCgv3ot31JFGPyRKukD7y3jAFSBqyX0bIUV9GVNk4oRPQ== +"@google-cloud/spanner@7.18.1": + version "7.18.1" + resolved "https://registry.yarnpkg.com/@google-cloud/spanner/-/spanner-7.18.1.tgz#4589327e14de18ee5d27e01774c9f501171bb0cd" + integrity sha512-7CwpTX5njfoUAVQL/otowTm3gjWPn+ceUKKH+KGWr/DuAeDsrc4sZH1LY+t2mt/vvMULS/PlWkAkv6Hk/Oi8cw== dependencies: "@google-cloud/common" "^5.0.0" "@google-cloud/precise-date" "^4.0.0" @@ -2169,6 +2361,17 @@ ansi-escapes "^4.3.2" yoctocolors-cjs "^2.1.2" +"@inquirer/checkbox@^4.1.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@inquirer/checkbox/-/checkbox-4.1.1.tgz#5f2c0ce74a75e3872f8e170fd209655972ce7802" + integrity sha512-os5kFd/52gZTl/W6xqMfhaKVJHQM8V/U1P8jcSaQJ/C4Qhdrf2jEXdA/HaxfQs9iiUA/0yzYhk5d3oRHTxGDDQ== + dependencies: + "@inquirer/core" "^10.1.6" + "@inquirer/figures" "^1.0.10" + "@inquirer/type" "^3.0.4" + ansi-escapes "^4.3.2" + yoctocolors-cjs "^2.1.2" + "@inquirer/confirm@5.1.1": version "5.1.1" resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.1.1.tgz#18385064b8275eb79fdba505ce527801804eea04" @@ -2177,7 +2380,15 @@ "@inquirer/core" "^10.1.2" "@inquirer/type" "^3.0.2" -"@inquirer/confirm@5.1.3", "@inquirer/confirm@^5.1.3": +"@inquirer/confirm@5.1.5", "@inquirer/confirm@^5.1.5": + version "5.1.5" + resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.1.5.tgz#0e6bf86794f69f849667ee38815608d6cd5917ba" + integrity sha512-ZB2Cz8KeMINUvoeDi7IrvghaVkYT2RB0Zb31EaLWOE87u276w4wnApv0SH2qWaJ3r0VSUa3BIuz7qAV2ZvsZlg== + dependencies: + "@inquirer/core" "^10.1.6" + "@inquirer/type" "^3.0.4" + +"@inquirer/confirm@^5.1.3": version "5.1.3" resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.1.3.tgz#c1ad57663f54758981811ccb86f823072ddf5c1a" integrity sha512-fuF9laMmHoOgWapF9h9hv6opA5WvmGFHsTYGCmuFxcghIhEhb3dN0CdQR4BUMqa2H506NCj8cGX4jwMsE4t6dA== @@ -2185,7 +2396,21 @@ "@inquirer/core" "^10.1.4" "@inquirer/type" "^3.0.2" -"@inquirer/core@^10.1.2", "@inquirer/core@^10.1.4": +"@inquirer/core@^10.1.2", "@inquirer/core@^10.1.6": + version "10.1.6" + resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.1.6.tgz#2a92a219cb48c81453e145a5040d0e04f7df1aa2" + integrity sha512-Bwh/Zk6URrHwZnSSzAZAKH7YgGYi0xICIBDFOqBQoXNNAzBHw/bgXgLmChfp+GyR3PnChcTbiCTZGC6YJNJkMA== + dependencies: + "@inquirer/figures" "^1.0.10" + "@inquirer/type" "^3.0.4" + 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" + +"@inquirer/core@^10.1.4": version "10.1.4" resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.1.4.tgz#02394e68d894021935caca0d10fc68fd4f3a3ead" integrity sha512-5y4/PUJVnRb4bwWY67KLdebWOhOc7xj5IP2J80oWXa64mVag24rwQ1VAdnj7/eDY/odhguW0zQ1Mp1pj6fO/2w== @@ -2209,6 +2434,15 @@ "@inquirer/type" "^3.0.2" external-editor "^3.1.0" +"@inquirer/editor@^4.2.6": + version "4.2.6" + resolved "https://registry.yarnpkg.com/@inquirer/editor/-/editor-4.2.6.tgz#dec442b9f7ada0804bb9ba689370cc05fd385b20" + integrity sha512-l0smvr8g/KAVdXx4I92sFxZiaTG4kFc06cFZw+qqwTirwdUHMFLnouXBB9OafWhpO3cfEkEz2CdPoCmor3059A== + dependencies: + "@inquirer/core" "^10.1.6" + "@inquirer/type" "^3.0.4" + external-editor "^3.1.0" + "@inquirer/expand@^4.0.6": version "4.0.6" resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-4.0.6.tgz#8676e6049c6114fb306df23358375bd84fa1c92c" @@ -2218,6 +2452,20 @@ "@inquirer/type" "^3.0.2" yoctocolors-cjs "^2.1.2" +"@inquirer/expand@^4.0.8": + version "4.0.8" + resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-4.0.8.tgz#8438bd34af182d4a37d8d7101a328e10430efadc" + integrity sha512-k0ouAC6L+0Yoj/j0ys2bat0fYcyFVtItDB7h+pDFKaDDSFJey/C/YY1rmIOqkmFVZ5rZySeAQuS8zLcKkKRLmg== + dependencies: + "@inquirer/core" "^10.1.6" + "@inquirer/type" "^3.0.4" + yoctocolors-cjs "^2.1.2" + +"@inquirer/figures@^1.0.10": + version "1.0.10" + resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.10.tgz#e3676a51c9c51aaabcd6ba18a28e82b98417db37" + integrity sha512-Ey6176gZmeqZuY/W/nZiUyvmb1/qInjcpiZjXWi6nON+nxJpD1bxtSoBxNliGISae32n6OwbY+TSXPZ1CfS4bw== + "@inquirer/figures@^1.0.9": version "1.0.9" resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.9.tgz#9d8128f8274cde4ca009ca8547337cab3f37a4a3" @@ -2231,6 +2479,14 @@ "@inquirer/core" "^10.1.4" "@inquirer/type" "^3.0.2" +"@inquirer/input@^4.1.5": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-4.1.5.tgz#ea3ffed7947c28d61ef3f261c4f261e99c4cac8a" + integrity sha512-bB6wR5wBCz5zbIVBPnhp94BHv/G4eKbUEjlpCw676pI2chcvzTx1MuwZSCZ/fgNOdqDlAxkhQ4wagL8BI1D3Zg== + dependencies: + "@inquirer/core" "^10.1.6" + "@inquirer/type" "^3.0.4" + "@inquirer/number@^3.0.6": version "3.0.6" resolved "https://registry.yarnpkg.com/@inquirer/number/-/number-3.0.6.tgz#19bba46725df194bdd907762cf432a37e053b300" @@ -2239,6 +2495,14 @@ "@inquirer/core" "^10.1.4" "@inquirer/type" "^3.0.2" +"@inquirer/number@^3.0.8": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@inquirer/number/-/number-3.0.8.tgz#ca44c09a8ac74040e2327e04694799eae603e9de" + integrity sha512-CTKs+dT1gw8dILVWATn8Ugik1OHLkkfY82J+Musb57KpmF6EKyskv8zmMiEJPzOnLTZLo05X/QdMd8VH9oulXw== + dependencies: + "@inquirer/core" "^10.1.6" + "@inquirer/type" "^3.0.4" + "@inquirer/password@^4.0.6": version "4.0.6" resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-4.0.6.tgz#4bbee12fe7cd1d37435401098c296ddc4586861b" @@ -2248,7 +2512,32 @@ "@inquirer/type" "^3.0.2" ansi-escapes "^4.3.2" -"@inquirer/prompts@7.2.3", "@inquirer/prompts@^7.0.0": +"@inquirer/password@^4.0.8": + version "4.0.8" + resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-4.0.8.tgz#ac2b14800a75f15e3404d98616d9dc7d8c2df38b" + integrity sha512-MgA+Z7o3K1df2lGY649fyOBowHGfrKRz64dx3+b6c1w+h2W7AwBoOkHhhF/vfhbs5S4vsKNCuDzS3s9r5DpK1g== + dependencies: + "@inquirer/core" "^10.1.6" + "@inquirer/type" "^3.0.4" + ansi-escapes "^4.3.2" + +"@inquirer/prompts@7.3.1": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-7.3.1.tgz#3fa954a7d9e71197b489a1d2a25a1e19b6688e76" + integrity sha512-r1CiKuDV86BDpvj9DRFR+V+nIjsVBOsa2++dqdPqLYAef8kgHYvmQ8ySdP/ZeAIOWa27YGJZRkENdP3dK0H3gg== + dependencies: + "@inquirer/checkbox" "^4.1.1" + "@inquirer/confirm" "^5.1.5" + "@inquirer/editor" "^4.2.6" + "@inquirer/expand" "^4.0.8" + "@inquirer/input" "^4.1.5" + "@inquirer/number" "^3.0.8" + "@inquirer/password" "^4.0.8" + "@inquirer/rawlist" "^4.0.8" + "@inquirer/search" "^3.0.8" + "@inquirer/select" "^4.0.8" + +"@inquirer/prompts@^7.0.0": version "7.2.3" resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-7.2.3.tgz#8a0d7cb5310d429bf815d25bbff108375fc6315b" integrity sha512-hzfnm3uOoDySDXfDNOm9usOuYIaQvTgKp/13l1uJoe6UNY+Zpcn2RYt0jXz3yA+yemGHvDOxVzqWl3S5sQq53Q== @@ -2273,6 +2562,15 @@ "@inquirer/type" "^3.0.2" yoctocolors-cjs "^2.1.2" +"@inquirer/rawlist@^4.0.8": + version "4.0.8" + resolved "https://registry.yarnpkg.com/@inquirer/rawlist/-/rawlist-4.0.8.tgz#1d4389186d63861a2abe2dd107f72e813dc0ea4b" + integrity sha512-hl7rvYW7Xl4un8uohQRUgO6uc2hpn7PKqfcGkCOWC0AA4waBxAv6MpGOFCEDrUaBCP+pXPVqp4LmnpWmn1E1+g== + dependencies: + "@inquirer/core" "^10.1.6" + "@inquirer/type" "^3.0.4" + yoctocolors-cjs "^2.1.2" + "@inquirer/search@^3.0.6": version "3.0.6" resolved "https://registry.yarnpkg.com/@inquirer/search/-/search-3.0.6.tgz#5537e3f46b7d31ab65ca22b831cf546f88db1d5b" @@ -2283,6 +2581,16 @@ "@inquirer/type" "^3.0.2" yoctocolors-cjs "^2.1.2" +"@inquirer/search@^3.0.8": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@inquirer/search/-/search-3.0.8.tgz#38c25f5b2db15a268be76b09bd12b4599ecc216b" + integrity sha512-ihSE9D3xQAupNg/aGDZaukqoUSXG2KfstWosVmFCG7jbMQPaj2ivxWtsB+CnYY/T4D6LX1GHKixwJLunNCffww== + dependencies: + "@inquirer/core" "^10.1.6" + "@inquirer/figures" "^1.0.10" + "@inquirer/type" "^3.0.4" + yoctocolors-cjs "^2.1.2" + "@inquirer/select@^4.0.6": version "4.0.6" resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-4.0.6.tgz#3062c02c82f7bbe238972672def6d8394732bb2b" @@ -2294,6 +2602,17 @@ ansi-escapes "^4.3.2" yoctocolors-cjs "^2.1.2" +"@inquirer/select@^4.0.8": + version "4.0.8" + resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-4.0.8.tgz#dde85e10bc4e650c51542de533a91b6bc63498b7" + integrity sha512-Io2prxFyN2jOCcu4qJbVoilo19caiD3kqkD3WR0q3yDA5HUCo83v4LrRtg55ZwniYACW64z36eV7gyVbOfORjA== + dependencies: + "@inquirer/core" "^10.1.6" + "@inquirer/figures" "^1.0.10" + "@inquirer/type" "^3.0.4" + ansi-escapes "^4.3.2" + yoctocolors-cjs "^2.1.2" + "@inquirer/type@^1.5.5": version "1.5.5" resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-1.5.5.tgz#303ea04ce7ad2e585b921b662b3be36ef7b4f09b" @@ -2306,6 +2625,11 @@ resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-3.0.2.tgz#baff9f8d70947181deb36772cd9a5b6876d3e60c" integrity sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g== +"@inquirer/type@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-3.0.4.tgz#fa5f9e91a0abf3c9e93d3e1990ecb891d8195cf2" + integrity sha512-2MNFrDY8jkFYc9Il9DgLsHhMzuHnOYM1+CUYVWbzu9oT0hC7V7EcYvdCKeoll/Fcci04A+ERZ9wcc7cQ8lTkIA== + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" @@ -2480,31 +2804,61 @@ resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.2.tgz#39e25e2a95d35a7350862af96d05e5396ea8a074" integrity sha512-WBSJT9Z7DTol5viq+DZD2TapeWOw7mlwXxiSBHgAzqVwsaVb0h/ekMD9iu/jDD8MUA20tO9N0WEdnT06fsUp+g== +"@lmdb/lmdb-darwin-arm64@3.2.6": + version "3.2.6" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.6.tgz#5de419e9b95ba7aa5a0305a451e202be41dd76c0" + integrity sha512-yF/ih9EJJZc72psFQbwnn8mExIWfTnzWJg+N02hnpXtDPETYLmQswIMBn7+V88lfCaFrMozJsUvcEQIkEPU0Gg== + "@lmdb/lmdb-darwin-x64@3.2.2": version "3.2.2" resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.2.tgz#7b9eac5b7a89dbf3433648622fe52799dd4202e5" integrity sha512-4S13kUtR7c/j/MzkTIBJCXv52hQ41LG2ukeaqw4Eng9K0pNKLFjo1sDSz96/yKhwykxrWDb13ddJ/ZqD3rAhUA== +"@lmdb/lmdb-darwin-x64@3.2.6": + version "3.2.6" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.6.tgz#1e2a066f49b454411ed778a589ee57a6051851df" + integrity sha512-5BbCumsFLbCi586Bb1lTWQFkekdQUw8/t8cy++Uq251cl3hbDIGEwD9HAwh8H6IS2F6QA9KdKmO136LmipRNkg== + "@lmdb/lmdb-linux-arm64@3.2.2": version "3.2.2" resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.2.tgz#f81b9233b2b78141af4cd22864f152cfeeed7b93" integrity sha512-4hdgZtWI1idQlWRp+eleWXD9KLvObgboRaVoBj2POdPEYvsKANllvMW0El8tEQwtw74yB9NT6P8ENBB5UJf5+g== +"@lmdb/lmdb-linux-arm64@3.2.6": + version "3.2.6" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.6.tgz#42c4c67dd67da62860f8fb7dd57e9171f407c1d2" + integrity sha512-l5VmJamJ3nyMmeD1ANBQCQqy7do1ESaJQfKPSm2IG9/ADZryptTyCj8N6QaYgIWewqNUrcbdMkJajRQAt5Qjfg== + "@lmdb/lmdb-linux-arm@3.2.2": version "3.2.2" resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.2.tgz#251fa02ed9d2d8b8a4827f5e53bf1e2d8aa745b8" integrity sha512-uW31JmfuPAaLUYW7NsEU8gzwgDAzpGPwjvkxnKlcWd8iDutoPKDJi8Wk9lFmPEZRxVSB0j1/wDQ7N2qliR9UFA== +"@lmdb/lmdb-linux-arm@3.2.6": + version "3.2.6" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.6.tgz#a4aabc336dfbb2efdad6c91e39a95bece96fa7bd" + integrity sha512-+6XgLpMb7HBoWxXj+bLbiiB4s0mRRcDPElnRS3LpWRzdYSe+gFk5MT/4RrVNqd2MESUDmb53NUXw1+BP69bjiQ== + "@lmdb/lmdb-linux-x64@3.2.2": version "3.2.2" resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.2.tgz#f794a5b4c06019a82622565ba3d38e47aa113a2c" integrity sha512-A0zjf4a2vM4B4GAx78ncuOTZ8Ka1DbTaG1Axf1e00Sa7f5coqlWiLg1PX7Gxvyibc2YqtqB+8tg1KKrE8guZVw== +"@lmdb/lmdb-linux-x64@3.2.6": + version "3.2.6" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.6.tgz#83fb669606ebe6275915a06f2ca2e34d2ce1664e" + integrity sha512-nDYT8qN9si5+onHYYaI4DiauDMx24OAiuZAUsEqrDy+ja/3EbpXPX/VAkMV8AEaQhy3xc4dRC+KcYIvOFefJ4Q== + "@lmdb/lmdb-win32-x64@3.2.2": version "3.2.2" resolved "https://registry.yarnpkg.com/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.2.tgz#d160454f0e6c4f4af0a5a05d85141c3bd9523f9c" integrity sha512-Y0qoSCAja+xZE7QQ0LCHoYAuyI1n9ZqukQJa8lv9X3yCvWahFF7OYHAgVH1ejp43XWstj3U89/PAAzcowgF/uQ== +"@lmdb/lmdb-win32-x64@3.2.6": + version "3.2.6" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.6.tgz#729f2035ddef1975279b3329532f5c1f86c91918" + integrity sha512-XlqVtILonQnG+9fH2N3Aytria7P/1fwDgDhl29rde96uH2sLB8CHORIf2PfuLVzFQJ7Uqp8py9AYwr3ZUCFfWg== + "@marijn/find-cluster-break@^1.0.0": version "1.0.2" resolved "https://registry.yarnpkg.com/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz#775374306116d51c0c500b8c4face0f9a04752d8" @@ -2692,10 +3046,10 @@ "@napi-rs/nice-win32-ia32-msvc" "1.0.1" "@napi-rs/nice-win32-x64-msvc" "1.0.1" -"@ngtools/webpack@19.2.0-next.0": - version "19.2.0-next.0" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-19.2.0-next.0.tgz#2c3d1763699a59258822cdc9654dcdefe5d0f363" - integrity sha512-66OpkwQxgIOlihQ0tYjR24o1F4zkTK8B+ZQ3yfnBV8CjPxtA36RAHsoSE47JWJgDkldmYtNEiBDM0/rwOE0Nug== +"@ngtools/webpack@19.2.0-next.2": + version "19.2.0-next.2" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-19.2.0-next.2.tgz#e9f04bf6c5f65ba3c2c12ca8d847b6631cced3d6" + integrity sha512-YxtR1+YiXjOmaunOIt3CpmEQunV42pbG5pYd/l6Pjqg/83MHxO8h2ax51By/LIzKm6P1qKsGTEtyZBanG7JgGQ== "@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3": version "2.1.8-no-fsevents.3" @@ -3263,286 +3617,286 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz#14c737dc19603a096568044eadaa60395eefb809" integrity sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q== -"@rollup/rollup-android-arm-eabi@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.31.0.tgz#d4dd60da0075a6ce9a6c76d71b8204f3e1822285" - integrity sha512-9NrR4033uCbUBRgvLcBrJofa2KY9DzxL2UKZ1/4xA/mnTNyhZCWBuD8X3tPm1n4KxcgaraOYgrFKSgwjASfmlA== - "@rollup/rollup-android-arm-eabi@4.32.0": version "4.32.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.32.0.tgz#42a8e897c7b656adb4edebda3a8b83a57526452f" integrity sha512-G2fUQQANtBPsNwiVFg4zKiPQyjVKZCUdQUol53R8E71J7AsheRMV/Yv/nB8giOcOVqP7//eB5xPqieBYZe9bGg== +"@rollup/rollup-android-arm-eabi@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.6.tgz#9b726b4dcafb9332991e9ca49d54bafc71d9d87f" + integrity sha512-+GcCXtOQoWuC7hhX1P00LqjjIiS/iOouHXhMdiDSnq/1DGTox4SpUvO52Xm+div6+106r+TcvOeo/cxvyEyTgg== + "@rollup/rollup-android-arm64@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz#9d81ea54fc5650eb4ebbc0a7d84cee331bfa30ad" integrity sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w== -"@rollup/rollup-android-arm64@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.31.0.tgz#25c4d33259a7a2ccd2f52a5ffcc0bb3ab3f0729d" - integrity sha512-iBbODqT86YBFHajxxF8ebj2hwKm1k8PTBQSojSt3d1FFt1gN+xf4CowE47iN0vOSdnd+5ierMHBbu/rHc7nq5g== - "@rollup/rollup-android-arm64@4.32.0": version "4.32.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.32.0.tgz#846a73eef25b18ff94bac1e52acab6a7c7ac22fa" integrity sha512-qhFwQ+ljoymC+j5lXRv8DlaJYY/+8vyvYmVx074zrLsu5ZGWYsJNLjPPVJJjhZQpyAKUGPydOq9hRLLNvh1s3A== +"@rollup/rollup-android-arm64@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.6.tgz#88326ff46168a47851077ca0bf0c442689ec088f" + integrity sha512-E8+2qCIjciYUnCa1AiVF1BkRgqIGW9KzJeesQqVfyRITGQN+dFuoivO0hnro1DjT74wXLRZ7QF8MIbz+luGaJA== + "@rollup/rollup-darwin-arm64@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz#29448cb1370cf678b50743d2e392be18470abc23" integrity sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q== -"@rollup/rollup-darwin-arm64@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.31.0.tgz#d137dff254b19163a6b52ac083a71cd055dae844" - integrity sha512-WHIZfXgVBX30SWuTMhlHPXTyN20AXrLH4TEeH/D0Bolvx9PjgZnn4H677PlSGvU6MKNsjCQJYczkpvBbrBnG6g== - "@rollup/rollup-darwin-arm64@4.32.0": version "4.32.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.32.0.tgz#014ed37f1f7809fdf3442a6b689d3a074a844058" integrity sha512-44n/X3lAlWsEY6vF8CzgCx+LQaoqWGN7TzUfbJDiTIOjJm4+L2Yq+r5a8ytQRGyPqgJDs3Rgyo8eVL7n9iW6AQ== +"@rollup/rollup-darwin-arm64@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.6.tgz#b8fbcc9389bc6fad3334a1d16dbeaaa5637c5772" + integrity sha512-z9Ib+OzqN3DZEjX7PDQMHEhtF+t6Mi2z/ueChQPLS/qUMKY7Ybn5A2ggFoKRNRh1q1T03YTQfBTQCJZiepESAg== + "@rollup/rollup-darwin-x64@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz#0ca99741c3ed096700557a43bb03359450c7857d" integrity sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA== -"@rollup/rollup-darwin-x64@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.31.0.tgz#58ff20b5dacb797d3adca19f02a21c532f9d55bf" - integrity sha512-hrWL7uQacTEF8gdrQAqcDy9xllQ0w0zuL1wk1HV8wKGSGbKPVjVUv/DEwT2+Asabf8Dh/As+IvfdU+H8hhzrQQ== - "@rollup/rollup-darwin-x64@4.32.0": version "4.32.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.32.0.tgz#dde6ed3e56d0b34477fa56c4a199abe5d4b9846b" integrity sha512-F9ct0+ZX5Np6+ZDztxiGCIvlCaW87HBdHcozUfsHnj1WCUTBUubAoanhHUfnUHZABlElyRikI0mgcw/qdEm2VQ== +"@rollup/rollup-darwin-x64@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.6.tgz#1aa2bcad84c0fb5902e945d88822e17a4f661d51" + integrity sha512-PShKVY4u0FDAR7jskyFIYVyHEPCPnIQY8s5OcXkdU8mz3Y7eXDJPdyM/ZWjkYdR2m0izD9HHWA8sGcXn+Qrsyg== + "@rollup/rollup-freebsd-arm64@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz#233f8e4c2f54ad9b719cd9645887dcbd12b38003" integrity sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ== -"@rollup/rollup-freebsd-arm64@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.31.0.tgz#96ce1a241c591ec3e068f4af765d94eddb24e60c" - integrity sha512-S2oCsZ4hJviG1QjPY1h6sVJLBI6ekBeAEssYKad1soRFv3SocsQCzX6cwnk6fID6UQQACTjeIMB+hyYrFacRew== - "@rollup/rollup-freebsd-arm64@4.32.0": version "4.32.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.32.0.tgz#8ad634f462a6b7e338257cf64c7baff99618a08e" integrity sha512-JpsGxLBB2EFXBsTLHfkZDsXSpSmKD3VxXCgBQtlPcuAqB8TlqtLcbeMhxXQkCDv1avgwNjF8uEIbq5p+Cee0PA== +"@rollup/rollup-freebsd-arm64@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.6.tgz#29c54617e0929264dcb6416597d6d7481696e49f" + integrity sha512-YSwyOqlDAdKqs0iKuqvRHLN4SrD2TiswfoLfvYXseKbL47ht1grQpq46MSiQAx6rQEN8o8URtpXARCpqabqxGQ== + "@rollup/rollup-freebsd-x64@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz#dfba762a023063dc901610722995286df4a48360" integrity sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw== -"@rollup/rollup-freebsd-x64@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.31.0.tgz#e59e7ede505be41f0b4311b0b943f8eb44938467" - integrity sha512-pCANqpynRS4Jirn4IKZH4tnm2+2CqCNLKD7gAdEjzdLGbH1iO0zouHz4mxqg0uEMpO030ejJ0aA6e1PJo2xrPA== - "@rollup/rollup-freebsd-x64@4.32.0": version "4.32.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.32.0.tgz#9d4d1dbbafcb0354d52ba6515a43c7511dba8052" integrity sha512-wegiyBT6rawdpvnD9lmbOpx5Sph+yVZKHbhnSP9MqUEDX08G4UzMU+D87jrazGE7lRSyTRs6NEYHtzfkJ3FjjQ== +"@rollup/rollup-freebsd-x64@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.6.tgz#a8b58ab7d31882559d93f2d1b5863d9e4b4b2678" + integrity sha512-HEP4CgPAY1RxXwwL5sPFv6BBM3tVeLnshF03HMhJYCNc6kvSqBgTMmsEjb72RkZBAWIqiPUyF1JpEBv5XT9wKQ== + "@rollup/rollup-linux-arm-gnueabihf@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz#b9da54171726266c5ef4237f462a85b3c3cf6ac9" integrity sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg== -"@rollup/rollup-linux-arm-gnueabihf@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.31.0.tgz#e455ca6e4ff35bd46d62201c153352e717000a7b" - integrity sha512-0O8ViX+QcBd3ZmGlcFTnYXZKGbFu09EhgD27tgTdGnkcYXLat4KIsBBQeKLR2xZDCXdIBAlWLkiXE1+rJpCxFw== - "@rollup/rollup-linux-arm-gnueabihf@4.32.0": version "4.32.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.32.0.tgz#3bd5fcbab92a66e032faef1078915d1dbf27de7a" integrity sha512-3pA7xecItbgOs1A5H58dDvOUEboG5UfpTq3WzAdF54acBbUM+olDJAPkgj1GRJ4ZqE12DZ9/hNS2QZk166v92A== +"@rollup/rollup-linux-arm-gnueabihf@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.6.tgz#a844e1978c8b9766b169ecb1cb5cc0d8a3f05930" + integrity sha512-88fSzjC5xeH9S2Vg3rPgXJULkHcLYMkh8faix8DX4h4TIAL65ekwuQMA/g2CXq8W+NJC43V6fUpYZNjaX3+IIg== + "@rollup/rollup-linux-arm-musleabihf@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz#b9db69b3f85f5529eb992936d8f411ee6d04297b" integrity sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug== -"@rollup/rollup-linux-arm-musleabihf@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.31.0.tgz#bc1a93d807d19e70b1e343a5bfea43723bcd6327" - integrity sha512-w5IzG0wTVv7B0/SwDnMYmbr2uERQp999q8FMkKG1I+j8hpPX2BYFjWe69xbhbP6J9h2gId/7ogesl9hwblFwwg== - "@rollup/rollup-linux-arm-musleabihf@4.32.0": version "4.32.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.32.0.tgz#a77838b9779931ce4fa01326b585eee130f51e60" integrity sha512-Y7XUZEVISGyge51QbYyYAEHwpGgmRrAxQXO3siyYo2kmaj72USSG8LtlQQgAtlGfxYiOwu+2BdbPjzEpcOpRmQ== +"@rollup/rollup-linux-arm-musleabihf@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.6.tgz#6b44c3b7257985d71b087fcb4ef01325e2fff201" + integrity sha512-wM4ztnutBqYFyvNeR7Av+reWI/enK9tDOTKNF+6Kk2Q96k9bwhDDOlnCUNRPvromlVXo04riSliMBs/Z7RteEg== + "@rollup/rollup-linux-arm64-gnu@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz#2550cf9bb4d47d917fd1ab4af756d7bbc3ee1528" integrity sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw== -"@rollup/rollup-linux-arm64-gnu@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.31.0.tgz#f38bf843f1dc3d5de680caf31084008846e3efae" - integrity sha512-JyFFshbN5xwy6fulZ8B/8qOqENRmDdEkcIMF0Zz+RsfamEW+Zabl5jAb0IozP/8UKnJ7g2FtZZPEUIAlUSX8cA== - "@rollup/rollup-linux-arm64-gnu@4.32.0": version "4.32.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.32.0.tgz#ec1b1901b82d57a20184adb61c725dd8991a0bf0" integrity sha512-r7/OTF5MqeBrZo5omPXcTnjvv1GsrdH8a8RerARvDFiDwFpDVDnJyByYM/nX+mvks8XXsgPUxkwe/ltaX2VH7w== +"@rollup/rollup-linux-arm64-gnu@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.6.tgz#ebb499cf1720115256d0c9ae7598c90cc2251bc5" + integrity sha512-9RyprECbRa9zEjXLtvvshhw4CMrRa3K+0wcp3KME0zmBe1ILmvcVHnypZ/aIDXpRyfhSYSuN4EPdCCj5Du8FIA== + "@rollup/rollup-linux-arm64-musl@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz#9d06b26d286c7dded6336961a2f83e48330e0c80" integrity sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA== -"@rollup/rollup-linux-arm64-musl@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.31.0.tgz#b3987a96c18b7287129cf735be2dbf83e94d9d05" - integrity sha512-kpQXQ0UPFeMPmPYksiBL9WS/BDiQEjRGMfklVIsA0Sng347H8W2iexch+IEwaR7OVSKtr2ZFxggt11zVIlZ25g== - "@rollup/rollup-linux-arm64-musl@4.32.0": version "4.32.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.32.0.tgz#7aa23b45bf489b7204b5a542e857e134742141de" integrity sha512-HJbifC9vex9NqnlodV2BHVFNuzKL5OnsV2dvTw6e1dpZKkNjPG6WUq+nhEYV6Hv2Bv++BXkwcyoGlXnPrjAKXw== +"@rollup/rollup-linux-arm64-musl@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.6.tgz#9658221b59d9e5643348f9a52fa5ef35b4dc07b1" + integrity sha512-qTmklhCTyaJSB05S+iSovfo++EwnIEZxHkzv5dep4qoszUMX5Ca4WM4zAVUMbfdviLgCSQOu5oU8YoGk1s6M9Q== + "@rollup/rollup-linux-loongarch64-gnu@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz#e957bb8fee0c8021329a34ca8dfa825826ee0e2e" integrity sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ== -"@rollup/rollup-linux-loongarch64-gnu@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.31.0.tgz#0f0324044e71c4f02e9f49e7ec4e347b655b34ee" - integrity sha512-pMlxLjt60iQTzt9iBb3jZphFIl55a70wexvo8p+vVFK+7ifTRookdoXX3bOsRdmfD+OKnMozKO6XM4zR0sHRrQ== - "@rollup/rollup-linux-loongarch64-gnu@4.32.0": version "4.32.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.32.0.tgz#7bf0ebd8c5ad08719c3b4786be561d67f95654a7" integrity sha512-VAEzZTD63YglFlWwRj3taofmkV1V3xhebDXffon7msNz4b14xKsz7utO6F8F4cqt8K/ktTl9rm88yryvDpsfOw== +"@rollup/rollup-linux-loongarch64-gnu@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.6.tgz#19418cc57579a5655af2d850a89d74b3f7e9aa92" + integrity sha512-4Qmkaps9yqmpjY5pvpkfOerYgKNUGzQpFxV6rnS7c/JfYbDSU0y6WpbbredB5cCpLFGJEqYX40WUmxMkwhWCjw== + "@rollup/rollup-linux-powerpc64le-gnu@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz#e8585075ddfb389222c5aada39ea62d6d2511ccc" integrity sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw== -"@rollup/rollup-linux-powerpc64le-gnu@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.31.0.tgz#809479f27f1fd5b4eecd2aa732132ad952d454ba" - integrity sha512-D7TXT7I/uKEuWiRkEFbed1UUYZwcJDU4vZQdPTcepK7ecPhzKOYk4Er2YR4uHKme4qDeIh6N3XrLfpuM7vzRWQ== - "@rollup/rollup-linux-powerpc64le-gnu@4.32.0": version "4.32.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.32.0.tgz#e687dfcaf08124aafaaebecef0cc3986675cb9b6" integrity sha512-Sts5DST1jXAc9YH/iik1C9QRsLcCoOScf3dfbY5i4kH9RJpKxiTBXqm7qU5O6zTXBTEZry69bGszr3SMgYmMcQ== +"@rollup/rollup-linux-powerpc64le-gnu@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.6.tgz#fe0bce7778cb6ce86898c781f3f11369d1a4952c" + integrity sha512-Zsrtux3PuaxuBTX/zHdLaFmcofWGzaWW1scwLU3ZbW/X+hSsFbz9wDIp6XvnT7pzYRl9MezWqEqKy7ssmDEnuQ== + "@rollup/rollup-linux-riscv64-gnu@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz#7d0d40cee7946ccaa5a4e19a35c6925444696a9e" integrity sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw== -"@rollup/rollup-linux-riscv64-gnu@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.31.0.tgz#7bc75c4f22db04d3c972f83431739cfa41c6a36e" - integrity sha512-wal2Tc8O5lMBtoePLBYRKj2CImUCJ4UNGJlLwspx7QApYny7K1cUYlzQ/4IGQBLmm+y0RS7dwc3TDO/pmcneTw== - "@rollup/rollup-linux-riscv64-gnu@4.32.0": version "4.32.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.32.0.tgz#19fce2594f9ce73d1cb0748baf8cd90a7bedc237" integrity sha512-qhlXeV9AqxIyY9/R1h1hBD6eMvQCO34ZmdYvry/K+/MBs6d1nRFLm6BOiITLVI+nFAAB9kUB6sdJRKyVHXnqZw== +"@rollup/rollup-linux-riscv64-gnu@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.6.tgz#9c158360abf6e6f7794285642ba0898c580291f6" + integrity sha512-aK+Zp+CRM55iPrlyKiU3/zyhgzWBxLVrw2mwiQSYJRobCURb781+XstzvA8Gkjg/hbdQFuDw44aUOxVQFycrAg== + "@rollup/rollup-linux-s390x-gnu@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz#c2dcd8a4b08b2f2778eceb7a5a5dfde6240ebdea" integrity sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA== -"@rollup/rollup-linux-s390x-gnu@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.31.0.tgz#cfe8052345c55864d83ae343362cf1912480170e" - integrity sha512-O1o5EUI0+RRMkK9wiTVpk2tyzXdXefHtRTIjBbmFREmNMy7pFeYXCFGbhKFwISA3UOExlo5GGUuuj3oMKdK6JQ== - "@rollup/rollup-linux-s390x-gnu@4.32.0": version "4.32.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.32.0.tgz#fd99b335bb65c59beb7d15ae82be0aafa9883c19" integrity sha512-8ZGN7ExnV0qjXa155Rsfi6H8M4iBBwNLBM9lcVS+4NcSzOFaNqmt7djlox8pN1lWrRPMRRQ8NeDlozIGx3Omsw== +"@rollup/rollup-linux-s390x-gnu@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.6.tgz#f9113498d22962baacdda008b5587d568b05aa34" + integrity sha512-WoKLVrY9ogmaYPXwTH326+ErlCIgMmsoRSx6bO+l68YgJnlOXhygDYSZe/qbUJCSiCiZAQ+tKm88NcWuUXqOzw== + "@rollup/rollup-linux-x64-gnu@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz#183637d91456877cb83d0a0315eb4788573aa588" integrity sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg== -"@rollup/rollup-linux-x64-gnu@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.31.0.tgz#c6b048f1e25f3fea5b4bd246232f4d07a159c5a0" - integrity sha512-zSoHl356vKnNxwOWnLd60ixHNPRBglxpv2g7q0Cd3Pmr561gf0HiAcUBRL3S1vPqRC17Zo2CX/9cPkqTIiai1g== - "@rollup/rollup-linux-x64-gnu@4.32.0": version "4.32.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.32.0.tgz#4e8c697bbaa2e2d7212bd42086746c8275721166" integrity sha512-VDzNHtLLI5s7xd/VubyS10mq6TxvZBp+4NRWoW+Hi3tgV05RtVm4qK99+dClwTN1McA6PHwob6DEJ6PlXbY83A== +"@rollup/rollup-linux-x64-gnu@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.6.tgz#aec8d4cdf911cd869a72b8bd00833cb426664e0c" + integrity sha512-Sht4aFvmA4ToHd2vFzwMFaQCiYm2lDFho5rPcvPBT5pCdC+GwHG6CMch4GQfmWTQ1SwRKS0dhDYb54khSrjDWw== + "@rollup/rollup-linux-x64-musl@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz#036a4c860662519f1f9453807547fd2a11d5bb01" integrity sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow== -"@rollup/rollup-linux-x64-musl@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.31.0.tgz#615273ac52d1a201f4de191cbd3389016a9d7d80" - integrity sha512-ypB/HMtcSGhKUQNiFwqgdclWNRrAYDH8iMYH4etw/ZlGwiTVxBz2tDrGRrPlfZu6QjXwtd+C3Zib5pFqID97ZA== - "@rollup/rollup-linux-x64-musl@4.32.0": version "4.32.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.32.0.tgz#0d2f74bd9cfe0553f20f056760a95b293e849ab2" integrity sha512-qcb9qYDlkxz9DxJo7SDhWxTWV1gFuwznjbTiov289pASxlfGbaOD54mgbs9+z94VwrXtKTu+2RqwlSTbiOqxGg== +"@rollup/rollup-linux-x64-musl@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.6.tgz#61c0a146bdd1b5e0dcda33690dd909b321d8f20f" + integrity sha512-zmmpOQh8vXc2QITsnCiODCDGXFC8LMi64+/oPpPx5qz3pqv0s6x46ps4xoycfUiVZps5PFn1gksZzo4RGTKT+A== + "@rollup/rollup-win32-arm64-msvc@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz#51cad812456e616bfe4db5238fb9c7497e042a52" integrity sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw== -"@rollup/rollup-win32-arm64-msvc@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.31.0.tgz#32ed85810c1b831c648eca999d68f01255b30691" - integrity sha512-JuhN2xdI/m8Hr+aVO3vspO7OQfUFO6bKLIRTAy0U15vmWjnZDLrEgCZ2s6+scAYaQVpYSh9tZtRijApw9IXyMw== - "@rollup/rollup-win32-arm64-msvc@4.32.0": version "4.32.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.32.0.tgz#6534a09fcdd43103645155cedb5bfa65fbf2c23f" integrity sha512-pFDdotFDMXW2AXVbfdUEfidPAk/OtwE/Hd4eYMTNVVaCQ6Yl8et0meDaKNL63L44Haxv4UExpv9ydSf3aSayDg== +"@rollup/rollup-win32-arm64-msvc@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.6.tgz#c6c5bf290a3a459c18871110bc2e7009ce35b15a" + integrity sha512-3/q1qUsO/tLqGBaD4uXsB6coVGB3usxw3qyeVb59aArCgedSF66MPdgRStUd7vbZOsko/CgVaY5fo2vkvPLWiA== + "@rollup/rollup-win32-ia32-msvc@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz#661c8b3e4cd60f51deaa39d153aac4566e748e5e" integrity sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw== -"@rollup/rollup-win32-ia32-msvc@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.31.0.tgz#d47effada68bcbfdccd30c4a788d42e4542ff4d3" - integrity sha512-U1xZZXYkvdf5MIWmftU8wrM5PPXzyaY1nGCI4KI4BFfoZxHamsIe+BtnPLIvvPykvQWlVbqUXdLa4aJUuilwLQ== - "@rollup/rollup-win32-ia32-msvc@4.32.0": version "4.32.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.32.0.tgz#8222ccfecffd63a6b0ddbe417d8d959e4f2b11b3" integrity sha512-/TG7WfrCAjeRNDvI4+0AAMoHxea/USWhAzf9PVDFHbcqrQ7hMMKp4jZIy4VEjk72AAfN5k4TiSMRXRKf/0akSw== +"@rollup/rollup-win32-ia32-msvc@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.6.tgz#16ca6bdadc9e054818b9c51f8dac82f6b8afab81" + integrity sha512-oLHxuyywc6efdKVTxvc0135zPrRdtYVjtVD5GUm55I3ODxhU/PwkQFD97z16Xzxa1Fz0AEe4W/2hzRtd+IfpOA== + "@rollup/rollup-win32-x64-msvc@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz#73bf1885ff052b82fbb0f82f8671f73c36e9137c" integrity sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og== -"@rollup/rollup-win32-x64-msvc@4.31.0": - version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.31.0.tgz#7a2d89a82cf0388d60304964217dd7beac6de645" - integrity sha512-ul8rnCsUumNln5YWwz0ted2ZHFhzhRRnkpBZ+YRuHoRAlUji9KChpOUOndY7uykrPEPXVbHLlsdo6v5yXo/TXw== - "@rollup/rollup-win32-x64-msvc@4.32.0": version "4.32.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.32.0.tgz#1a40b4792c08094b6479c48c90fe7f4b10ec2f54" integrity sha512-5hqO5S3PTEO2E5VjCePxv40gIgyS2KvO7E7/vvC/NbIW4SIRamkMr1hqj+5Y67fbBWv/bQLB6KelBQmXlyCjWA== +"@rollup/rollup-win32-x64-msvc@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.6.tgz#f3d03ce2d82723eb089188ea1494a719b09e1561" + integrity sha512-0PVwmgzZ8+TZ9oGBmdZoQVXflbvuwzN/HRclujpl4N/q3i+y0lqLw8n1bXA8ru3sApDjlmONaNAuYr38y1Kr9w== + "@rushstack/node-core-library@5.10.2": version "5.10.2" resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-5.10.2.tgz#8d12bc5bd9244ea57f441877246efb0a1b7b7df6" @@ -3583,13 +3937,13 @@ argparse "~1.0.9" string-argv "~0.3.1" -"@schematics/angular@19.2.0-next.0": - version "19.2.0-next.0" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-19.2.0-next.0.tgz#909bb7dd72e584da7d49fd38245899bb61d59ff9" - integrity sha512-othXA6SXWiV2h37sGHJ7sg/vttmLAkU5BXcuVo7kFB1uqDeLXbgrL3toarTChXAaKTXvUzkDwYtTzPlRbbWf0A== +"@schematics/angular@19.2.0-next.2": + version "19.2.0-next.2" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-19.2.0-next.2.tgz#092cbc9608acb933f61bee66beb834d17e648473" + integrity sha512-WzM0Ipyy8vgnouyJ8snYpk4pxMrx6BItxjLkorAROY0saLkm0pkGKuWq0oM2qP9Yh00q1xnS7Jg+CnRw6NlyRQ== dependencies: - "@angular-devkit/core" "19.2.0-next.0" - "@angular-devkit/schematics" "19.2.0-next.0" + "@angular-devkit/core" "19.2.0-next.2" + "@angular-devkit/schematics" "19.2.0-next.2" jsonc-parser "3.3.1" "@shikijs/core@2.1.0": @@ -4236,6 +4590,11 @@ resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.33.tgz#d9d611db9d9cd99ae4e458de420eeb64ad604ea8" integrity sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g== +"@types/gensync@^1.0.0": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@types/gensync/-/gensync-1.0.4.tgz#7122d8f0cd3bf437f9725cc95b180197190cf50b" + integrity sha512-C3YYeRQWp2fmq9OryX+FoDy8nXS6scQ7dPptD8LnFDAUNcKWJjXQKDNJD3HVm+kOUsXhTOkpi69vI4EuAr95bA== + "@types/geojson@*": version "7946.0.16" resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.16.tgz#8ebe53d69efada7044454e3305c19017d97ced2a" @@ -4554,10 +4913,12 @@ resolved "https://registry.yarnpkg.com/@types/stack-trace/-/stack-trace-0.0.33.tgz#979a3fde9e721e78603b781e468ef30f0df0f049" integrity sha512-O7in6531Bbvlb2KEsJ0dq0CHZvc3iWSR5ZYMtvGgnHA56VgriAN/AU2LorfmcvAl2xc9N5fbCTRyMRRl8nd74g== -"@types/supports-color@^8.1.1": - version "8.1.3" - resolved "https://registry.yarnpkg.com/@types/supports-color/-/supports-color-8.1.3.tgz#b769cdce1d1bb1a3fa794e35b62c62acdf93c139" - integrity sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg== +"@types/supports-color@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@types/supports-color/-/supports-color-10.0.0.tgz#dc1f3aa42646db9663f446184082d4da8ee28672" + integrity sha512-Kpp/hhA8/pcxqBBKmOCIgvwCOJAI5y6TWTHhhqnB6KmuYlKtixKgN/Z7VzhShdgONe2jYREnTQbsrb3E0nt/OQ== + dependencies: + supports-color "*" "@types/systemjs@6.15.1": version "6.15.1" @@ -5586,6 +5947,14 @@ babel-plugin-polyfill-corejs3@^0.10.6: "@babel/helper-define-polyfill-provider" "^0.6.2" core-js-compat "^3.38.0" +babel-plugin-polyfill-corejs3@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz#4e4e182f1bb37c7ba62e2af81d8dd09df31344f6" + integrity sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.3" + core-js-compat "^3.40.0" + babel-plugin-polyfill-regenerator@^0.6.1: version "0.6.3" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz#abeb1f3f1c762eace37587f42548b08b57789bc8" @@ -7049,7 +7418,7 @@ copy-webpack-plugin@12.0.2: schema-utils "^4.2.0" serialize-javascript "^6.0.2" -core-js-compat@^3.38.0, core-js-compat@^3.38.1: +core-js-compat@^3.38.0, core-js-compat@^3.40.0: version "3.40.0" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.40.0.tgz#7485912a5a4a4315c2fdb2cbdc623e6881c88b38" integrity sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ== @@ -8394,10 +8763,10 @@ es6-module-loader@^0.17.4: dependencies: when "^3.7.2" -esbuild-wasm@0.24.2: - version "0.24.2" - resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.24.2.tgz#1ab3b4b858ecf226a3c1a63455358ecea704c500" - integrity sha512-03/7Z1gD+ohDnScFztvI4XddTAbKVmMEzCvvkBpQdWKEXJ+73dTyeNrmdxP1Q0zpDMFjzUJwtK4rLjqwiHbzkw== +esbuild-wasm@0.25.0: + version "0.25.0" + resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.25.0.tgz#56bbcc29d9eb5052ff1598248dc37dd958876e82" + integrity sha512-60iuWr6jdTVylmGXjpnqk3pCktUi5Rmjiv6EMza3h4X20BLtfL2BjUGs1+UCt2G9UK7jVGrJdUr5i1k0sL3wBg== esbuild@0.24.2, esbuild@^0.24.2: version "0.24.2" @@ -8430,6 +8799,37 @@ esbuild@0.24.2, esbuild@^0.24.2: "@esbuild/win32-ia32" "0.24.2" "@esbuild/win32-x64" "0.24.2" +esbuild@0.25.0: + version "0.25.0" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.0.tgz#0de1787a77206c5a79eeb634a623d39b5006ce92" + integrity sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw== + optionalDependencies: + "@esbuild/aix-ppc64" "0.25.0" + "@esbuild/android-arm" "0.25.0" + "@esbuild/android-arm64" "0.25.0" + "@esbuild/android-x64" "0.25.0" + "@esbuild/darwin-arm64" "0.25.0" + "@esbuild/darwin-x64" "0.25.0" + "@esbuild/freebsd-arm64" "0.25.0" + "@esbuild/freebsd-x64" "0.25.0" + "@esbuild/linux-arm" "0.25.0" + "@esbuild/linux-arm64" "0.25.0" + "@esbuild/linux-ia32" "0.25.0" + "@esbuild/linux-loong64" "0.25.0" + "@esbuild/linux-mips64el" "0.25.0" + "@esbuild/linux-ppc64" "0.25.0" + "@esbuild/linux-riscv64" "0.25.0" + "@esbuild/linux-s390x" "0.25.0" + "@esbuild/linux-x64" "0.25.0" + "@esbuild/netbsd-arm64" "0.25.0" + "@esbuild/netbsd-x64" "0.25.0" + "@esbuild/openbsd-arm64" "0.25.0" + "@esbuild/openbsd-x64" "0.25.0" + "@esbuild/sunos-x64" "0.25.0" + "@esbuild/win32-arm64" "0.25.0" + "@esbuild/win32-ia32" "0.25.0" + "@esbuild/win32-x64" "0.25.0" + esbuild@~0.23.0: version "0.23.1" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.23.1.tgz#40fdc3f9265ec0beae6f59824ade1bd3d3d2dab8" @@ -11787,6 +12187,24 @@ lmdb@3.2.2: "@lmdb/lmdb-linux-x64" "3.2.2" "@lmdb/lmdb-win32-x64" "3.2.2" +lmdb@3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/lmdb/-/lmdb-3.2.6.tgz#dd18bae6323679f99bc3cb57df81dc507f50f505" + integrity sha512-SuHqzPl7mYStna8WRotY8XX/EUZBjjv3QyKIByeCLFfC9uXT/OIHByEcA07PzbMfQAM0KYJtLgtpMRlIe5dErQ== + dependencies: + 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" + 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" + loader-runner@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" @@ -12972,7 +13390,17 @@ npm-normalize-package-bin@^4.0.0: resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz#df79e70cd0a113b77c02d1fe243c96b8e618acb1" integrity sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w== -npm-package-arg@12.0.1, npm-package-arg@^12.0.0: +npm-package-arg@12.0.2: + version "12.0.2" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-12.0.2.tgz#3b1e04ebe651cc45028e298664e8c15ce9c0ca40" + integrity sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA== + dependencies: + hosted-git-info "^8.0.0" + proc-log "^5.0.0" + semver "^7.3.5" + validate-npm-package-name "^6.0.0" + +npm-package-arg@^12.0.0: version "12.0.1" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-12.0.1.tgz#eb05e797b2fbdf8acf7f1d15344e1e05904202d5" integrity sha512-aDxjFfPV3Liw0WOBWlyZLMBqtbgbg03rmGvHDJa2Ttv7tIz+1oB5qWec4psCDFZcZi9b5XdGkPdQiJxOPzvQRQ== @@ -13916,7 +14344,16 @@ postcss-values-parser@^6.0.2: is-url-superb "^4.0.0" quote-unquote "^1.0.0" -postcss@8.5.1, postcss@^8.2.14, postcss@^8.4.33, postcss@^8.4.40, postcss@^8.4.48, postcss@^8.4.49: +postcss@8.5.2, postcss@^8.5.1: + version "8.5.2" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.2.tgz#e7b99cb9d2ec3e8dd424002e7c16517cb2b846bd" + integrity sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA== + dependencies: + nanoid "^3.3.8" + picocolors "^1.1.1" + source-map-js "^1.2.1" + +postcss@^8.2.14, postcss@^8.4.33, postcss@^8.4.40, postcss@^8.4.48, postcss@^8.4.49: version "8.5.1" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.1.tgz#e2272a1f8a807fafa413218245630b5db10a3214" integrity sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ== @@ -14902,32 +15339,32 @@ rollup@4.30.1: "@rollup/rollup-win32-x64-msvc" "4.30.1" fsevents "~2.3.2" -rollup@4.31.0: - version "4.31.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.31.0.tgz#b84af969a0292cb047dce2c0ec5413a9457597a4" - integrity sha512-9cCE8P4rZLx9+PjoyqHLs31V9a9Vpvfo4qNcs6JCiGWYhw2gijSetFbH6SSy1whnkgcefnUwr8sad7tgqsGvnw== +rollup@4.34.6, rollup@^4.30.1: + version "4.34.6" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.34.6.tgz#a07e4d2621759e29034d909655e7a32eee9195c9" + integrity sha512-wc2cBWqJgkU3Iz5oztRkQbfVkbxoz5EhnCGOrnJvnLnQ7O0WhQUYyv18qQI79O8L7DdHrrlJNeCHd4VGpnaXKQ== dependencies: "@types/estree" "1.0.6" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.31.0" - "@rollup/rollup-android-arm64" "4.31.0" - "@rollup/rollup-darwin-arm64" "4.31.0" - "@rollup/rollup-darwin-x64" "4.31.0" - "@rollup/rollup-freebsd-arm64" "4.31.0" - "@rollup/rollup-freebsd-x64" "4.31.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.31.0" - "@rollup/rollup-linux-arm-musleabihf" "4.31.0" - "@rollup/rollup-linux-arm64-gnu" "4.31.0" - "@rollup/rollup-linux-arm64-musl" "4.31.0" - "@rollup/rollup-linux-loongarch64-gnu" "4.31.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.31.0" - "@rollup/rollup-linux-riscv64-gnu" "4.31.0" - "@rollup/rollup-linux-s390x-gnu" "4.31.0" - "@rollup/rollup-linux-x64-gnu" "4.31.0" - "@rollup/rollup-linux-x64-musl" "4.31.0" - "@rollup/rollup-win32-arm64-msvc" "4.31.0" - "@rollup/rollup-win32-ia32-msvc" "4.31.0" - "@rollup/rollup-win32-x64-msvc" "4.31.0" + "@rollup/rollup-android-arm-eabi" "4.34.6" + "@rollup/rollup-android-arm64" "4.34.6" + "@rollup/rollup-darwin-arm64" "4.34.6" + "@rollup/rollup-darwin-x64" "4.34.6" + "@rollup/rollup-freebsd-arm64" "4.34.6" + "@rollup/rollup-freebsd-x64" "4.34.6" + "@rollup/rollup-linux-arm-gnueabihf" "4.34.6" + "@rollup/rollup-linux-arm-musleabihf" "4.34.6" + "@rollup/rollup-linux-arm64-gnu" "4.34.6" + "@rollup/rollup-linux-arm64-musl" "4.34.6" + "@rollup/rollup-linux-loongarch64-gnu" "4.34.6" + "@rollup/rollup-linux-powerpc64le-gnu" "4.34.6" + "@rollup/rollup-linux-riscv64-gnu" "4.34.6" + "@rollup/rollup-linux-s390x-gnu" "4.34.6" + "@rollup/rollup-linux-x64-gnu" "4.34.6" + "@rollup/rollup-linux-x64-musl" "4.34.6" + "@rollup/rollup-win32-arm64-msvc" "4.34.6" + "@rollup/rollup-win32-ia32-msvc" "4.34.6" + "@rollup/rollup-win32-x64-msvc" "4.34.6" fsevents "~2.3.2" rollup@^4.23.0: @@ -15121,10 +15558,10 @@ sass@1.83.1: optionalDependencies: "@parcel/watcher" "^2.4.1" -sass@1.83.4: - version "1.83.4" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.83.4.tgz#5ccf60f43eb61eeec300b780b8dcb85f16eec6d1" - integrity sha512-B1bozCeNQiOgDcLd33e2Cs2U60wZwjUUXzh900ZyQF5qUasvMdDZYbQ566LJu7cqR+sAHlAfO6RMkaID5s6qpA== +sass@1.84.0: + version "1.84.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.84.0.tgz#da9154cbccb2d2eac7a9486091b6d9ba93ef5bad" + integrity sha512-XDAbhEPJRxi7H0SxrnOpiXFQoUJHwkR2u3Zc4el+fK/Tt5Hpzw5kkQ59qVDfvdaUq6gCrEZIbySFBM2T9DNKHg== dependencies: chokidar "^4.0.0" immutable "^5.0.2" @@ -15271,6 +15708,11 @@ semver@7.6.3, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.5, semver resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== +semver@7.7.1: + version "7.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== + semver@^5.3.0, semver@^5.6.0: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" @@ -16294,7 +16736,7 @@ superstatic@^9.1.0: optionalDependencies: re2 "^1.17.7" -supports-color@10.0.0: +supports-color@*, supports-color@10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-10.0.0.tgz#32000d5e49f1ae70b2645d47701004644a1d7b90" integrity sha512-HRVVSbCCMbj7/kdWF9Q+bbckjBHLtHMEoJWlkmYzzdwhYMkjkOwubLM6t7NbWKjgKamGDrWL1++KrjUO1t9oAQ== @@ -16483,7 +16925,17 @@ terser-webpack-plugin@^5.3.10: serialize-javascript "^6.0.2" terser "^5.31.1" -terser@5.37.0, terser@^5.0.0, terser@^5.31.1, terser@^5.8.0: +terser@5.38.2: + version "5.38.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.38.2.tgz#24aef4ea48c900d46a4b13f6a53789980d59967f" + integrity sha512-w8CXxxbFA5zfNsR/i8HZq5bvn18AK0O9jj7hyo1YqkovLxEFa0uP0LCVGZRqiRaKRFxXhELBp8SteeAjEnfeJg== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +terser@^5.0.0, terser@^5.31.1, terser@^5.8.0: version "5.37.0" resolved "https://registry.yarnpkg.com/terser/-/terser-5.37.0.tgz#38aa66d1cfc43d0638fab54e43ff8a4f72a21ba3" integrity sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA== @@ -17512,10 +17964,10 @@ vinyl@^3.0.0: replace-ext "^2.0.0" teex "^1.0.1" -vite@6.0.11: - version "6.0.11" - resolved "https://registry.yarnpkg.com/vite/-/vite-6.0.11.tgz#224497e93e940b34c3357c9ebf2ec20803091ed8" - integrity sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg== +vite@6.0.7: + version "6.0.7" + resolved "https://registry.yarnpkg.com/vite/-/vite-6.0.7.tgz#f0f8c120733b04af52b4a1e3e7cb54eb851a799b" + integrity sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ== dependencies: esbuild "^0.24.2" postcss "^8.4.49" @@ -17523,14 +17975,14 @@ vite@6.0.11: optionalDependencies: fsevents "~2.3.3" -vite@6.0.7: - version "6.0.7" - resolved "https://registry.yarnpkg.com/vite/-/vite-6.0.7.tgz#f0f8c120733b04af52b4a1e3e7cb54eb851a799b" - integrity sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ== +vite@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/vite/-/vite-6.1.0.tgz#00a4e99a23751af98a2e4701c65ba89ce23858a6" + integrity sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ== dependencies: esbuild "^0.24.2" - postcss "^8.4.49" - rollup "^4.23.0" + postcss "^8.5.1" + rollup "^4.30.1" optionalDependencies: fsevents "~2.3.3" From c93e4fe49734bb6af8412322d9f4bcfafba1c9c5 Mon Sep 17 00:00:00 2001 From: Alan Agius <17563226+alan-agius4@users.noreply.github.com> Date: Fri, 14 Feb 2025 14:21:37 +0000 Subject: [PATCH 0065/1000] build: update bazel node.js version to 18.20.5 (#59943) This is needed as selenium-webdriver requires at least this version. PR Close #59943 --- WORKSPACE | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 56298722f345..9ab28d544918 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -50,16 +50,16 @@ load("@rules_nodejs//nodejs:repositories.bzl", "nodejs_register_toolchains") nodejs_register_toolchains( name = "nodejs", node_repositories = { - "18.20.0-darwin_arm64": ("node-v18.20.0-darwin-arm64.tar.gz", "node-v18.20.0-darwin-arm64", "10066ad4dd9e03ea5c4c45ef8775420ff37b860de09bbdf87b97e0c07b1ea036"), - "18.20.0-darwin_amd64": ("node-v18.20.0-darwin-x64.tar.gz", "node-v18.20.0-darwin-x64", "062ba71618e88e06321de5caa038843c350aababa2d315f3ca7b8551f8e66c1c"), - "18.20.0-linux_arm64": ("node-v18.20.0-linux-arm64.tar.xz", "node-v18.20.0-linux-arm64", "afe51da9ffb38ac1e3a20d9a06efd403ced4bf8831ab554a02a088dd8392fd79"), - "18.20.0-linux_ppc64le": ("node-v18.20.0-linux-ppc64le.tar.xz", "node-v18.20.0-linux-ppc64le", "9e652bbf53a3e37285b11dfb9d6a9bb8b02010c3b50e5c8229d4cc10e72681da"), - "18.20.0-linux_s390x": ("node-v18.20.0-linux-s390x.tar.xz", "node-v18.20.0-linux-s390x", "a6c2a5796b9d9e9bf21da62ec89ff30b41a8108880b9eaa3c912f1ce795a7743"), - "18.20.0-linux_amd64": ("node-v18.20.0-linux-x64.tar.xz", "node-v18.20.0-linux-x64", "03eea148e56785babb27930b05ed6bf311aaa3bc573c0399dd63cad2fe5713c7"), - "18.20.0-windows_amd64": ("node-v18.20.0-win-x64.zip", "node-v18.20.0-win-x64", "1c0aab05cc6836a8f5148cca345b92ebc948a4a2013f18d117b7ade6ff05aca6"), + "18.20.5-darwin_arm64": ("node-v18.20.5-darwin-arm64.tar.gz", "node-v18.20.5-darwin-arm64", "bdfeaf59dbf29aec08c0c66130edf0a8a17014b4f2997727641dfd0b58b51f48"), + "18.20.5-darwin_amd64": ("node-v18.20.5-darwin-x64.tar.gz", "node-v18.20.5-darwin-x64", "dff01068da7d3fe7b515f72a3903dca96a34dc377f6f426b6a813901274b6441"), + "18.20.5-linux_arm64": ("node-v18.20.5-linux-arm64.tar.xz", "node-v18.20.5-linux-arm64", "a77db6ab34267f3bc80e02ed68abf51b7065eb5c82fcd69adc4b40e390d9b116"), + "18.20.5-linux_ppc64le": ("node-v18.20.5-linux-ppc64le.tar.xz", "node-v18.20.5-linux-ppc64le", "63b4c6801c96fb452e3bd8125e8b5b195ecacc4fa2505e47a128e94587999aeb"), + "18.20.5-linux_s390x": ("node-v18.20.5-linux-s390x.tar.xz", "node-v18.20.5-linux-s390x", "617d7456e16534a4b4e03f5285cc8d13581f39cdad9196efff2516d6588de319"), + "18.20.5-linux_amd64": ("node-v18.20.5-linux-x64.tar.xz", "node-v18.20.5-linux-x64", "e4a3a21e5ac7e074ed50d2533dd0087d8460647ab567464867141a2b643f3fb3"), + "18.20.5-windows_amd64": ("node-v18.20.5-win-x64.zip", "node-v18.20.5-win-x64", "910237449895b4de61026568dc076fa6c3ffcd667563ed03112a4a77e1f1556b"), }, - # We need at least Node 18.17 due to some transitive dependencies. - node_version = "18.20.0", + # We need at least Node 18.20.5 due to some transitive dependencies. + node_version = "18.20.5", ) # Download npm dependencies. From dcb23ef706840e9c1adef029db080b594923efd5 Mon Sep 17 00:00:00 2001 From: Doug Parker Date: Wed, 12 Feb 2025 15:15:51 -0800 Subject: [PATCH 0066/1000] release: bump Angular DevTools version to 1.0.23 (#59931) PR Close #59931 --- .../projects/shell-browser/src/manifest/manifest.chrome.json | 4 ++-- .../projects/shell-browser/src/manifest/manifest.firefox.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/devtools/projects/shell-browser/src/manifest/manifest.chrome.json b/devtools/projects/shell-browser/src/manifest/manifest.chrome.json index 9f585eb2bd4a..b328f5c05467 100644 --- a/devtools/projects/shell-browser/src/manifest/manifest.chrome.json +++ b/devtools/projects/shell-browser/src/manifest/manifest.chrome.json @@ -3,8 +3,8 @@ "short_name": "Angular DevTools", "name": "Angular DevTools", "description": "Angular DevTools extends Chrome DevTools adding Angular specific debugging and profiling capabilities.", - "version": "1.0.22", - "version_name": "1.0.22", + "version": "1.0.23", + "version_name": "1.0.23", "minimum_chrome_version": "102", "content_security_policy": { "extension_pages": "script-src 'self'; object-src 'self'" diff --git a/devtools/projects/shell-browser/src/manifest/manifest.firefox.json b/devtools/projects/shell-browser/src/manifest/manifest.firefox.json index 6bb9797fcf89..4c6231480f5d 100644 --- a/devtools/projects/shell-browser/src/manifest/manifest.firefox.json +++ b/devtools/projects/shell-browser/src/manifest/manifest.firefox.json @@ -3,7 +3,7 @@ "short_name": "Angular DevTools", "name": "Angular DevTools", "description": "Angular DevTools extends Firefox DevTools adding Angular specific debugging and profiling capabilities.", - "version": "1.0.22", + "version": "1.0.23", "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'", "icons": { "16": "assets/icon16.png", From 5553b5cfa8437a3b0b0c30f487166720fa16b6fc Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Fri, 14 Feb 2025 09:56:01 +0100 Subject: [PATCH 0067/1000] build: update to TypeScript 5.8 RC (#59952) Updates the repo to the release candidate TypeScript 5.8. PR Close #59952 --- integration/typings_test_ts58/package.json | 2 +- integration/typings_test_ts58/yarn.lock | 36 +++++++++++----------- package.json | 2 +- yarn.lock | 8 ++--- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/integration/typings_test_ts58/package.json b/integration/typings_test_ts58/package.json index d5584625fad6..a5f6f78462c6 100644 --- a/integration/typings_test_ts58/package.json +++ b/integration/typings_test_ts58/package.json @@ -20,7 +20,7 @@ "@angular/upgrade": "file:../../dist/packages-dist/upgrade", "@types/jasmine": "file:../../node_modules/@types/jasmine", "rxjs": "file:../../node_modules/rxjs", - "typescript": "5.8.0-beta", + "typescript": "5.8.1-rc", "zone.js": "0.14.10" }, "scripts": { diff --git a/integration/typings_test_ts58/yarn.lock b/integration/typings_test_ts58/yarn.lock index 93ce6ff42df5..eb8068719632 100644 --- a/integration/typings_test_ts58/yarn.lock +++ b/integration/typings_test_ts58/yarn.lock @@ -11,17 +11,17 @@ "@jridgewell/trace-mapping" "^0.3.24" "@angular/animations@file:../../dist/packages-dist/animations": - version "19.2.0-next.0" + version "19.2.0-next.2" dependencies: tslib "^2.3.0" "@angular/common@file:../../dist/packages-dist/common": - version "19.2.0-next.0" + version "19.2.0-next.2" dependencies: tslib "^2.3.0" "@angular/compiler-cli@file:../../dist/packages-dist/compiler-cli": - version "19.2.0-next.0" + version "19.2.0-next.2" dependencies: "@babel/core" "7.26.0" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -33,27 +33,27 @@ yargs "^17.2.1" "@angular/compiler@file:../../dist/packages-dist/compiler": - version "19.2.0-next.0" + version "19.2.0-next.2" dependencies: tslib "^2.3.0" "@angular/core@file:../../dist/packages-dist/core": - version "19.2.0-next.0" + version "19.2.0-next.2" dependencies: tslib "^2.3.0" "@angular/elements@file:../../dist/packages-dist/elements": - version "19.2.0-next.0" + version "19.2.0-next.2" dependencies: tslib "^2.3.0" "@angular/forms@file:../../dist/packages-dist/forms": - version "19.2.0-next.0" + version "19.2.0-next.2" dependencies: tslib "^2.3.0" "@angular/localize@file:../../dist/packages-dist/localize": - version "19.2.0-next.0" + version "19.2.0-next.2" dependencies: "@babel/core" "7.26.0" "@types/babel__core" "7.20.5" @@ -61,33 +61,33 @@ yargs "^17.2.1" "@angular/platform-browser-dynamic@file:../../dist/packages-dist/platform-browser-dynamic": - version "19.2.0-next.0" + version "19.2.0-next.2" dependencies: tslib "^2.3.0" "@angular/platform-browser@file:../../dist/packages-dist/platform-browser": - version "19.2.0-next.0" + version "19.2.0-next.2" dependencies: tslib "^2.3.0" "@angular/platform-server@file:../../dist/packages-dist/platform-server": - version "19.2.0-next.0" + version "19.2.0-next.2" dependencies: tslib "^2.3.0" xhr2 "^0.2.0" "@angular/router@file:../../dist/packages-dist/router": - version "19.2.0-next.0" + version "19.2.0-next.2" dependencies: tslib "^2.3.0" "@angular/service-worker@file:../../dist/packages-dist/service-worker": - version "19.2.0-next.0" + version "19.2.0-next.2" dependencies: tslib "^2.3.0" "@angular/upgrade@file:../../dist/packages-dist/upgrade": - version "19.2.0-next.0" + version "19.2.0-next.2" dependencies: tslib "^2.3.0" @@ -643,10 +643,10 @@ tslib@^2.1.0, tslib@^2.3.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== -typescript@5.8.0-beta: - version "5.8.0-beta" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.0-beta.tgz#ba16fac5715be6540d01f0a9778f5eab7ae2ec61" - integrity sha512-7VGUiBOGi+BYhiuy3iITIgu6m2wVW2Vb4CW+OJsW6OJS/TgvezKbAN3WBfiSErE8QOLdce0ilm6VANMkzNWW1A== +typescript@5.8.1-rc: + version "5.8.1-rc" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.1-rc.tgz#678b7586bf1d7fdec0dbf35708ab7bb39ce13c3d" + integrity sha512-D8IlSOUk1E08jpFdK81reYkA1a/4XtEdV6MElOGdbu/uOy1RpEDqNO/onWmqUaLkTyeHmmU/QlWvjcM9cqF85g== update-browserslist-db@^1.1.1: version "1.1.1" diff --git a/package.json b/package.json index ba9d06ae8af6..dbe56145d0f9 100644 --- a/package.json +++ b/package.json @@ -148,7 +148,7 @@ "tslib": "^2.3.0", "tslint": "6.1.3", "tsx": "^4.7.2", - "typescript": "5.8.0-beta", + "typescript": "5.8.1-rc", "webtreemap": "^2.0.1", "ws": "^8.15.0", "xhr2": "0.2.1", diff --git a/yarn.lock b/yarn.lock index 59630acf5711..ca6c568ef0ec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17466,10 +17466,10 @@ typescript@5.7.3, typescript@^5.4.4, typescript@^5.4.5, typescript@^5.5.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.3.tgz#919b44a7dbb8583a9b856d162be24a54bf80073e" integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw== -typescript@5.8.0-beta: - version "5.8.0-beta" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.0-beta.tgz#ba16fac5715be6540d01f0a9778f5eab7ae2ec61" - integrity sha512-7VGUiBOGi+BYhiuy3iITIgu6m2wVW2Vb4CW+OJsW6OJS/TgvezKbAN3WBfiSErE8QOLdce0ilm6VANMkzNWW1A== +typescript@5.8.1-rc: + version "5.8.1-rc" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.1-rc.tgz#678b7586bf1d7fdec0dbf35708ab7bb39ce13c3d" + integrity sha512-D8IlSOUk1E08jpFdK81reYkA1a/4XtEdV6MElOGdbu/uOy1RpEDqNO/onWmqUaLkTyeHmmU/QlWvjcM9cqF85g== typescript@~4.9.0: version "4.9.5" From 650e1f9a86b1339d441d0cd7283541ae3bc44572 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Fri, 14 Feb 2025 01:37:50 +0000 Subject: [PATCH 0068/1000] build: update io_bazel_rules_sass digest to c01e884 (#59948) See associated pull request for more information. PR Close #59948 --- WORKSPACE | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 9ab28d544918..cd54637d1dba 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -143,10 +143,10 @@ cldr_xml_data_repository( # sass rules http_archive( name = "io_bazel_rules_sass", - sha256 = "0c41055203bd4f6c58dc7431805b336abf4a0e5283955497bbc918bd0ce90b23", - strip_prefix = "rules_sass-d829b6a77d9d88c7bf43144b0963e32ed359fe74", + sha256 = "54bca211ea0a4de2c740a6e24b9d11225942a95452799b6a64dba36e082b7249", + strip_prefix = "rules_sass-c01e8848f30f8e4672babcbe41c3ac3551f3a800", urls = [ - "https://github.com/bazelbuild/rules_sass/archive/d829b6a77d9d88c7bf43144b0963e32ed359fe74.zip", + "https://github.com/bazelbuild/rules_sass/archive/c01e8848f30f8e4672babcbe41c3ac3551f3a800.zip", ], ) From 5ca2fa53d59ac29a6484b7fe804ea242d725a0ba Mon Sep 17 00:00:00 2001 From: Alan Agius <17563226+alan-agius4@users.noreply.github.com> Date: Fri, 14 Feb 2025 17:11:05 +0000 Subject: [PATCH 0069/1000] ci: update nvm node.js verson to `18.20.5` (#59957) This is needed due to some deps. PR Close #59957 --- .nvmrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.nvmrc b/.nvmrc index f4e1dd5b00ce..1117d417c6ac 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -18.20.0 +18.20.5 From 47d5e1e2751057dc93c263c3baf7b0ab42b8d482 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Fri, 14 Feb 2025 17:15:29 +0000 Subject: [PATCH 0070/1000] build: update dependency jsdom to v26 (#59444) See associated pull request for more information. PR Close #59444 --- adev/shared-docs/package.json | 2 +- package.json | 2 +- yarn.lock | 45 +++++++++++++++++++---------------- 3 files changed, 26 insertions(+), 23 deletions(-) diff --git a/adev/shared-docs/package.json b/adev/shared-docs/package.json index 31691aee9996..dafd62122e54 100644 --- a/adev/shared-docs/package.json +++ b/adev/shared-docs/package.json @@ -20,7 +20,7 @@ "fast-glob": "~3.3.2", "fflate": "^0.8.2", "html-entities": "~2.5.2", - "jsdom": "~25.0.0", + "jsdom": "~26.0.0", "marked": "~15.0.0", "mermaid": "^11.0.0", "shiki": "^2.0.0" diff --git a/package.json b/package.json index dbe56145d0f9..933f69c0b0ea 100644 --- a/package.json +++ b/package.json @@ -206,7 +206,7 @@ "gulp-conventional-changelog": "^5.0.0", "html-entities": "^2.5.2", "husky": "9.1.7", - "jsdom": "^25.0.0", + "jsdom": "^26.0.0", "karma-coverage": "^2.2.1", "karma-jasmine-html-reporter": "^2.1.0", "karma-sauce-launcher": "^4.3.6", diff --git a/yarn.lock b/yarn.lock index ca6c568ef0ec..392bdf5897bc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7574,7 +7574,7 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssstyle@^4.1.0: +cssstyle@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-4.2.1.tgz#5142782410fea95db66fb68147714a652a7c2381" integrity sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw== @@ -9584,7 +9584,7 @@ form-data@^2.5.0: mime-types "^2.1.12" safe-buffer "^5.2.1" -form-data@^4.0.0: +form-data@^4.0.0, form-data@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48" integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw== @@ -10640,7 +10640,7 @@ http2-wrapper@^1.0.0-beta.5.2: quick-lru "^5.1.1" resolve-alpn "^1.0.0" -https-proxy-agent@7.0.6, https-proxy-agent@^2.2.1, https-proxy-agent@^4.0.0, https-proxy-agent@^5.0.0, https-proxy-agent@^7.0.1, https-proxy-agent@^7.0.5, https-proxy-agent@^7.0.6: +https-proxy-agent@7.0.6, https-proxy-agent@^2.2.1, https-proxy-agent@^4.0.0, https-proxy-agent@^5.0.0, https-proxy-agent@^7.0.1, https-proxy-agent@^7.0.6: version "7.0.6" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== @@ -11650,22 +11650,22 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== -jsdom@^25.0.0: - version "25.0.1" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-25.0.1.tgz#536ec685c288fc8a5773a65f82d8b44badcc73ef" - integrity sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw== +jsdom@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-26.0.0.tgz#446dd1ad8cfc50df7e714e58f1f972c1763b354c" + integrity sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw== dependencies: - cssstyle "^4.1.0" + cssstyle "^4.2.1" data-urls "^5.0.0" decimal.js "^10.4.3" - form-data "^4.0.0" + form-data "^4.0.1" html-encoding-sniffer "^4.0.0" http-proxy-agent "^7.0.2" - https-proxy-agent "^7.0.5" + https-proxy-agent "^7.0.6" is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.12" - parse5 "^7.1.2" - rrweb-cssom "^0.7.1" + nwsapi "^2.2.16" + parse5 "^7.2.1" + rrweb-cssom "^0.8.0" saxes "^6.0.0" symbol-tree "^3.2.4" tough-cookie "^5.0.0" @@ -11673,7 +11673,7 @@ jsdom@^25.0.0: webidl-conversions "^7.0.0" whatwg-encoding "^3.1.1" whatwg-mimetype "^4.0.0" - whatwg-url "^14.0.0" + whatwg-url "^14.1.0" ws "^8.18.0" xml-name-validator "^5.0.0" @@ -13448,7 +13448,7 @@ nth-check@^2.0.1: dependencies: boolbase "^1.0.0" -nwsapi@^2.2.12: +nwsapi@^2.2.16: version "2.2.16" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.16.tgz#177760bba02c351df1d2644e220c31dfec8cdb43" integrity sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ== @@ -13928,7 +13928,7 @@ parse5@^6.0.1: resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== -parse5@^7.0.0, parse5@^7.1.2: +parse5@^7.0.0, parse5@^7.1.2, parse5@^7.2.1: version "7.2.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.2.1.tgz#8928f55915e6125f430cc44309765bf17556a33a" integrity sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ== @@ -15434,11 +15434,6 @@ router@^2.0.0: setprototypeof "1.2.0" utils-merge "1.0.1" -rrweb-cssom@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz#c73451a484b86dd7cfb1e0b2898df4b703183e4b" - integrity sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg== - rrweb-cssom@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz#3021d1b4352fbf3b614aaeed0bc0d5739abe0bc2" @@ -18307,6 +18302,14 @@ whatwg-url@^14.0.0: tr46 "^5.0.0" webidl-conversions "^7.0.0" +whatwg-url@^14.1.0: + version "14.1.1" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-14.1.1.tgz#ce71e240c61541315833b5cdafd139a479e47058" + integrity sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ== + dependencies: + tr46 "^5.0.0" + webidl-conversions "^7.0.0" + whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" From 506d38dc1c95b69689e6445e49abc5be975234c2 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Fri, 14 Feb 2025 18:27:01 +0000 Subject: [PATCH 0071/1000] build: update all non-major dependencies (#59641) See associated pull request for more information. PR Close #59641 --- .../first-app/common/package-lock.json | 8 ++-- .../tutorials/first-app/common/package.json | 2 +- package.json | 8 ++-- yarn.lock | 45 ++++++++++--------- 4 files changed, 34 insertions(+), 29 deletions(-) diff --git a/adev/src/content/tutorials/first-app/common/package-lock.json b/adev/src/content/tutorials/first-app/common/package-lock.json index 5f668eec6891..7c2d64b352ab 100644 --- a/adev/src/content/tutorials/first-app/common/package-lock.json +++ b/adev/src/content/tutorials/first-app/common/package-lock.json @@ -26,7 +26,7 @@ "@types/jasmine": "~5.1.0", "@types/node": "^16.11.35", "copyfiles": "^2.4.1", - "jasmine-core": "~5.5.0", + "jasmine-core": "~5.6.0", "jasmine-marbles": "~0.9.2", "jasmine-spec-reporter": "~7.0.0", "karma": "~6.4.0", @@ -9881,9 +9881,9 @@ } }, "node_modules/jasmine-core": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.5.0.tgz", - "integrity": "sha512-NHOvoPO6o9gVR6pwqEACTEpbgcH+JJ6QDypyymGbSUIFIFsMMbBJ/xsFNud8MSClfnWclXd7RQlAZBz7yVo5TQ==", + "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, "license": "MIT" }, diff --git a/adev/src/content/tutorials/first-app/common/package.json b/adev/src/content/tutorials/first-app/common/package.json index 9b27e88186bd..74623d8d3bac 100644 --- a/adev/src/content/tutorials/first-app/common/package.json +++ b/adev/src/content/tutorials/first-app/common/package.json @@ -27,7 +27,7 @@ "@types/jasmine": "~5.1.0", "@types/node": "^16.11.35", "copyfiles": "^2.4.1", - "jasmine-core": "~5.5.0", + "jasmine-core": "~5.6.0", "jasmine-marbles": "~0.9.2", "jasmine-spec-reporter": "~7.0.0", "karma": "~6.4.0", diff --git a/package.json b/package.json index 933f69c0b0ea..08299b3baafa 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "@types/babel__core": "7.20.5", "@types/babel__generator": "7.6.8", "@types/bluebird": "^3.5.27", - "@types/chrome": "^0.0.294", + "@types/chrome": "^0.0.304", "@types/convert-source-map": "^2.0.0", "@types/diff": "^7.0.0", "@types/dom-view-transitions": "^1.0.1", @@ -114,7 +114,7 @@ "domino": "https://github.com/angular/domino.git#8f228f8862540c6ccd14f76b5a1d9bb5458618af", "hammerjs": "~2.0.8", "http-server": "^14.0.0", - "jasmine": "~5.5.0", + "jasmine": "~5.6.0", "jasmine-ajax": "^4.0.0", "jasmine-core": "^5.0.0", "karma": "~6.4.0", @@ -136,7 +136,7 @@ "rollup-plugin-sourcemaps": "^0.6.3", "rxjs": "^7.0.0", "selenium-webdriver": "3.5.0", - "selenium-webdriver4": "npm:selenium-webdriver@4.27.0", + "selenium-webdriver4": "npm:selenium-webdriver@4.28.1", "semver-dsl": "^1.0.1", "shelljs": "^0.8.5", "source-map": "0.7.4", @@ -195,7 +195,7 @@ "adm-zip": "^0.5.10", "angular-split": "^19.0.0", "check-side-effects": "0.0.23", - "cldr": "7.6.0", + "cldr": "7.7.0", "cldrjs": "0.5.5", "conventional-changelog": "^6.0.0", "emoji-regex": "^10.3.0", diff --git a/yarn.lock b/yarn.lock index 392bdf5897bc..0224ce8849e0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4245,10 +4245,10 @@ resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.5.tgz#db9468cb1b1b5a925b8f34822f1669df0c5472f5" integrity sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg== -"@types/chrome@^0.0.294": - version "0.0.294" - resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.294.tgz#da2476b5c37abb699d46f5d0ae93d9f11c47708a" - integrity sha512-Jlea6UseJ0g/RZKVv33hsBcf95e5sbwfkhlNKmx8+7w/azGe2vGtpNiscMR5RESEj5HHEqOHW46F3nTJsMP7GA== +"@types/chrome@^0.0.304": + version "0.0.304" + resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.304.tgz#8d696ba6c0bb464c3f23fdfa61326439469ea55c" + integrity sha512-ms9CLILU+FEMK7gcmgz/Mtn2E81YQWiMIzCFF8ktp98EVNIIfoqaDTD4+ailOCq1sGjbnEmfJxQ1FAsQtk5M3A== dependencies: "@types/filesystem" "*" "@types/har-format" "*" @@ -5243,7 +5243,7 @@ resolved "https://registry.yarnpkg.com/@webcontainer/api/-/api-1.5.1.tgz#e6d9be74d9becc5afdeefcb422fa595c2b4a4b34" integrity sha512-+ELk+TbTOUx0LawAUdB+nnxaofg/FxUXo/Ac/+CzHSP3SOc3ebBAW3fLo4UZfvJdUW+ygWZOiQMthPLQXvKZEg== -"@xmldom/xmldom@^0.8.0", "@xmldom/xmldom@^0.8.5": +"@xmldom/xmldom@^0.8.3", "@xmldom/xmldom@^0.8.5": version "0.8.10" resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== @@ -6803,12 +6803,12 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -cldr@7.6.0: - version "7.6.0" - resolved "https://registry.yarnpkg.com/cldr/-/cldr-7.6.0.tgz#d60e2bf653d92250a8ee282ad717a53b9d0e706f" - integrity sha512-x1fXSd+5qacodW7Er+LnNmduSEeR59c3lJY2XhXtiuB+Fxv3BOgiIs7zxggEMOPXYjSJHxMNEBlgUopJXZezGQ== +cldr@7.7.0: + version "7.7.0" + resolved "https://registry.yarnpkg.com/cldr/-/cldr-7.7.0.tgz#ae63fe3ad8af60a7f32ec361434033809845e1b8" + integrity sha512-msq6/WPgHphmZwuxrjr4oAsVUSYc572/5EFn5LBf6waDsMWGg8Fx1PbGHgN8OoWN2NdNXluoL4VkmU2/oIyuSw== dependencies: - "@xmldom/xmldom" "^0.8.0" + "@xmldom/xmldom" "^0.8.3" escodegen "^2.0.0" esprima "^4.0.1" memoizeasync "^1.1.0" @@ -11543,7 +11543,7 @@ jasmine-core@^4.1.0: resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-4.6.1.tgz#5ebb8afa07282078f8d7b15871737a83b74e58f2" integrity sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ== -jasmine-core@^5.0.0, jasmine-core@~5.5.0: +jasmine-core@^5.0.0: version "5.5.0" resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-5.5.0.tgz#43564e4b41f73a37cff3aeb262e23bbd073576d8" integrity sha512-NHOvoPO6o9gVR6pwqEACTEpbgcH+JJ6QDypyymGbSUIFIFsMMbBJ/xsFNud8MSClfnWclXd7RQlAZBz7yVo5TQ== @@ -11553,6 +11553,11 @@ jasmine-core@~2.8.0: resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.8.0.tgz#bcc979ae1f9fd05701e45e52e65d3a5d63f1a24e" integrity sha512-SNkOkS+/jMZvLhuSx1fjhcNWUC/KG6oVyFUGkSBEr9n1axSNduWU8GlI7suaHXr4yxjet6KjrUZxUTE5WzzWwQ== +jasmine-core@~5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-5.6.0.tgz#4b979c254e7d9b1fe8e767ab00c5d2901c00bd4f" + integrity sha512-niVlkeYVRwKFpmfWg6suo6H9CrNnydfBLEqefM5UjibYS+UoTjZdmvPJSiuyrRLGnFj1eYRhFd/ch+5hSlsFVA== + jasmine-reporters@~2.5.0: version "2.5.2" resolved "https://registry.yarnpkg.com/jasmine-reporters/-/jasmine-reporters-2.5.2.tgz#b5dfa1d9c40b8020c5225e0e1e2b9953d66a4d69" @@ -11570,13 +11575,13 @@ jasmine@2.8.0: glob "^7.0.6" jasmine-core "~2.8.0" -jasmine@~5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-5.5.0.tgz#dbcb7a59a3ce88d475cc6e9341db92b8a8bb7974" - integrity sha512-JKlEVCVD5QBPYLsg/VE+IUtjyseDCrW8rMBu8la+9ysYashDgavMLM9Kotls1FhI6dCJLJ40dBCIfQjGLPZI1Q== +jasmine@~5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-5.6.0.tgz#83be3acf8dd44ad365d15f01c13c019a5e9c01cc" + integrity sha512-6frlW22jhgRjtlp68QY/DDVCUfrYqmSxDBWM13mrBzYQGx1XITfVcJltnY15bk8B5cRfN5IpKvemkDiDTSRCsA== dependencies: glob "^10.2.2" - jasmine-core "~5.5.0" + jasmine-core "~5.6.0" jasminewd2@^2.1.0: version "2.2.0" @@ -15619,10 +15624,10 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== -"selenium-webdriver4@npm:selenium-webdriver@4.27.0": - version "4.27.0" - resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.27.0.tgz#f0f26ce453805e7dc77151040442c67e441dbe7a" - integrity sha512-LkTJrNz5socxpPnWPODQ2bQ65eYx9JK+DQMYNihpTjMCqHwgWGYQnQTCAAche2W3ZP87alA+1zYPvgS8tHNzMQ== +"selenium-webdriver4@npm:selenium-webdriver@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.28.1.tgz#0f6cc4fbc83cee3fdf8b116257656892957b72da" + integrity sha512-TwbTpu/NUQkorBODGAkGowJ8sar63bvqi66/tjqhS05rBl34HkVp8DoRg1cOv2iSnNonVSbkxazS3wjbc+NRtg== dependencies: "@bazel/runfiles" "^6.3.1" jszip "^3.10.1" From e7c6ecc955928ab531648bffe794fd890a431e66 Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Fri, 14 Feb 2025 10:10:12 -0800 Subject: [PATCH 0072/1000] refactor(benchpress): move initializer to constructor (#59960) Move the initializer into the constructor for instance members that reference identifiers declared in the constructor. When TypeScript outputs modern language features, the below case throws an TS error. PR Close #59960 --- packages/benchpress/src/reporter/console_reporter.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/benchpress/src/reporter/console_reporter.ts b/packages/benchpress/src/reporter/console_reporter.ts index 4f81a57b9ab2..8986d540916d 100644 --- a/packages/benchpress/src/reporter/console_reporter.ts +++ b/packages/benchpress/src/reporter/console_reporter.ts @@ -32,7 +32,7 @@ export class ConsoleReporter extends Reporter { }, ]; - private textReporter = new TextReporterBase(this._columnWidth, this._sampleDescription); + private textReporter: TextReporterBase; constructor( @Inject(COLUMN_WIDTH) private _columnWidth: number, @@ -40,6 +40,7 @@ export class ConsoleReporter extends Reporter { @Inject(ConsoleReporter.PRINT) private _print: Function, ) { super(); + this.textReporter = new TextReporterBase(this._columnWidth, this._sampleDescription); this._print(this.textReporter.description()); } From 538c4d4c9d5f871375fd9a5dbfe70561bb043590 Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Mon, 10 Feb 2025 11:54:54 -0800 Subject: [PATCH 0073/1000] ci: disable adev tests (#59876) The changes in #58288 are responsible for breaking the tests. (see #54858). We'll re-enable them on the next release. PR Close #59876 --- .github/workflows/ci.yml | 6 ++++-- .github/workflows/pr.yml | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f6ac58e0d32d..c4ca54203804 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -85,8 +85,10 @@ jobs: run: yarn install --frozen-lockfile - name: Build adev in fast mode to ensure it continues to work run: yarn bazel build //adev:build --config=release - - name: Run tests - run: yarn bazel test //adev/... + # TODO: re-enable tests once the next release is shipped + # Tests are broken because of https://github.com/angular/angular/issues/54858 + # - name: Run tests + # run: yarn bazel test //adev/... publish-snapshots: runs-on: diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index be21b72ce06f..84669cc80170 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -114,8 +114,10 @@ jobs: run: yarn install --frozen-lockfile - name: Build adev in fast mode to ensure it continues to work run: yarn bazel build //adev:build --config=release - - name: Run tests - run: yarn bazel test //adev/... + # TODO: re-enable tests once the next release is shipped + # Tests are broken because of https://github.com/angular/angular/issues/54858 + # - name: Run tests + # run: yarn bazel test //adev/... zone-js: runs-on: From 3e39da593a0a0c047a2a03b8d5fcabf9dbace40f Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Fri, 13 Dec 2024 02:40:20 -0800 Subject: [PATCH 0074/1000] feat(common): introduce experimental `httpResource` (#59876) `httpResource` is a new frontend to the `HttpClient` infrastructure. It declares a dependency on an HTTP endpoint. The request to be made can be reactive, updating in response to signals for the URL, method, or otherwise. The response is returned as an instance of `HttpResource`, a `WritableResource` with some additional signals which represent parts of the HTTP response metadata (status, headers, etc). PR Close #59876 --- goldens/public-api/common/http/index.api.md | 83 ++++ packages/common/http/public_api.ts | 2 + packages/common/http/src/resource.ts | 421 ++++++++++++++++++++ packages/common/http/src/resource_api.ts | 138 +++++++ packages/common/http/test/resource_spec.ts | 202 ++++++++++ packages/core/src/core_private_export.ts | 2 + packages/core/src/resource/resource.ts | 4 +- 7 files changed, 850 insertions(+), 2 deletions(-) create mode 100644 packages/common/http/src/resource.ts create mode 100644 packages/common/http/src/resource_api.ts create mode 100644 packages/common/http/test/resource_spec.ts diff --git a/goldens/public-api/common/http/index.api.md b/goldens/public-api/common/http/index.api.md index eb7a169a79c0..61538327ac40 100644 --- a/goldens/public-api/common/http/index.api.md +++ b/goldens/public-api/common/http/index.api.md @@ -8,9 +8,14 @@ import { EnvironmentInjector } from '@angular/core'; import { EnvironmentProviders } from '@angular/core'; import * as i0 from '@angular/core'; import { InjectionToken } from '@angular/core'; +import type { Injector } from '@angular/core'; import { ModuleWithProviders } from '@angular/core'; import { Observable } from 'rxjs'; import { Provider } from '@angular/core'; +import type { ResourceRef } from '@angular/core'; +import type { Signal } from '@angular/core'; +import type { ValueEqualityFn } from '@angular/core'; +import type { WritableResource } from '@angular/core'; import { XhrFactory } from '@angular/common'; // @public @@ -2153,6 +2158,84 @@ export class HttpRequest { readonly withCredentials: boolean; } +// @public +export const httpResource: HttpResourceFn; + +// @public +export interface HttpResourceFn { + (url: string | (() => string | undefined), options: HttpResourceOptions & { + defaultValue: NoInfer; + }): HttpResourceRef; + (url: string | (() => string | undefined), options?: HttpResourceOptions): HttpResourceRef; + (request: HttpResourceRequest | (() => HttpResourceRequest | undefined), options: HttpResourceOptions & { + defaultValue: NoInfer; + }): HttpResourceRef; + (request: HttpResourceRequest | (() => HttpResourceRequest | undefined), options?: HttpResourceOptions): HttpResourceRef; + arrayBuffer: { + (url: string | (() => string | undefined), options: HttpResourceOptions & { + defaultValue: NoInfer; + }): HttpResourceRef; + (url: string | (() => string | undefined), options?: HttpResourceOptions): HttpResourceRef; + (request: HttpResourceRequest | (() => HttpResourceRequest | undefined), options: HttpResourceOptions & { + defaultValue: NoInfer; + }): HttpResourceRef; + (request: HttpResourceRequest | (() => HttpResourceRequest | undefined), options?: HttpResourceOptions): HttpResourceRef; + }; + blob: { + (url: string | (() => string | undefined), options: HttpResourceOptions & { + defaultValue: NoInfer; + }): HttpResourceRef; + (url: string | (() => string | undefined), options?: HttpResourceOptions): HttpResourceRef; + (request: HttpResourceRequest | (() => HttpResourceRequest | undefined), options: HttpResourceOptions & { + defaultValue: NoInfer; + }): HttpResourceRef; + (request: HttpResourceRequest | (() => HttpResourceRequest | undefined), options?: HttpResourceOptions): HttpResourceRef; + }; + text: { + (url: string | (() => string | undefined), options: HttpResourceOptions & { + defaultValue: NoInfer; + }): HttpResourceRef; + (url: string | (() => string | undefined), options?: HttpResourceOptions): HttpResourceRef; + (request: HttpResourceRequest | (() => HttpResourceRequest | undefined), options: HttpResourceOptions & { + defaultValue: NoInfer; + }): HttpResourceRef; + (request: HttpResourceRequest | (() => HttpResourceRequest | undefined), options?: HttpResourceOptions): HttpResourceRef; + }; +} + +// @public +export interface HttpResourceOptions { + defaultValue?: NoInfer; + equal?: ValueEqualityFn>; + injector?: Injector; + map?: (value: TRaw) => TResult; +} + +// @public +export interface HttpResourceRef extends WritableResource, ResourceRef { + // (undocumented) + destroy(): void; + // (undocumented) + hasValue(): this is HttpResourceRef>; + readonly headers: Signal; + readonly progress: Signal; + readonly statusCode: Signal; +} + +// @public +export interface HttpResourceRequest { + body?: unknown; + headers?: HttpHeaders | Record>; + method?: string; + params?: HttpParams | Record>; + reportProgress?: boolean; + transferCache?: { + includeHeaders?: string[]; + } | boolean; + url: string; + withCredentials?: boolean; +} + // @public export class HttpResponse extends HttpResponseBase { constructor(init?: { diff --git a/packages/common/http/public_api.ts b/packages/common/http/public_api.ts index e40149cab142..332e1ff454c2 100644 --- a/packages/common/http/public_api.ts +++ b/packages/common/http/public_api.ts @@ -54,6 +54,8 @@ export { HttpUploadProgressEvent, HttpUserEvent, } from './src/response'; +export {HttpResourceRef, HttpResourceOptions, HttpResourceRequest} from './src/resource_api'; +export {httpResource, HttpResourceFn} from './src/resource'; export { HttpTransferCacheOptions, withHttpTransferCache as ɵwithHttpTransferCache, diff --git a/packages/common/http/src/resource.ts b/packages/common/http/src/resource.ts new file mode 100644 index 000000000000..1db25db81160 --- /dev/null +++ b/packages/common/http/src/resource.ts @@ -0,0 +1,421 @@ +/** + * @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.dev/license + */ + +import { + Injector, + Signal, + ɵResourceImpl as ResourceImpl, + inject, + linkedSignal, + assertInInjectionContext, + signal, + ResourceStatus, + computed, + Resource, + WritableSignal, + ResourceStreamItem, +} from '@angular/core'; +import {Subscription} from 'rxjs'; + +import {HttpRequest} from './request'; +import {HttpClient} from './client'; +import {HttpEventType, HttpProgressEvent, HttpResponseBase} from './response'; +import {HttpHeaders} from './headers'; +import {HttpParams} from './params'; +import {HttpResourceRef, HttpResourceOptions, HttpResourceRequest} from './resource_api'; + +/** + * Type for the `httpRequest` top-level function, which includes the call signatures for the JSON- + * based `httpRequest` as well as sub-functions for `ArrayBuffer`, `Blob`, and `string` type + * requests. + * + * @experimental + */ +export interface HttpResourceFn { + /** + * Create a `Resource` that fetches data with an HTTP GET request to the given URL. + * + * If a reactive function is passed for the URL, the resource will update when the URL changes via + * signals. + * + * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features + * of the `HttpClient` API. Data is parsed as JSON by default - use a sub-function of + * `httpResource`, such as `httpResource.text()`, to parse the response differently. + * + * @experimental + */ + ( + url: string | (() => string | undefined), + options: HttpResourceOptions & {defaultValue: NoInfer}, + ): HttpResourceRef; + + /** + * Create a `Resource` that fetches data with an HTTP GET request to the given URL. + * + * If a reactive function is passed for the URL, the resource will update when the URL changes via + * signals. + * + * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features + * of the `HttpClient` API. Data is parsed as JSON by default - use a sub-function of + * `httpResource`, such as `httpResource.text()`, to parse the response differently. + * + * @experimental + */ + ( + url: string | (() => string | undefined), + options?: HttpResourceOptions, + ): HttpResourceRef; + + /** + * Create a `Resource` that fetches data with the configured HTTP request. + * + * If a reactive function is passed for the request, the resource will update when the request + * changes via signals. + * + * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features + * of the `HttpClient` API. Data is parsed as JSON by default - use a sub-function of + * `httpResource`, such as `httpResource.text()`, to parse the response differently. + * + * @experimental + */ + ( + request: HttpResourceRequest | (() => HttpResourceRequest | undefined), + options: HttpResourceOptions & {defaultValue: NoInfer}, + ): HttpResourceRef; + + /** + * Create a `Resource` that fetches data with the configured HTTP request. + * + * If a reactive function is passed for the request, the resource will update when the request + * changes via signals. + * + * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features + * of the `HttpClient` API. Data is parsed as JSON by default - use a sub-function of + * `httpResource`, such as `httpResource.text()`, to parse the response differently. + * + * @experimental + */ + ( + request: HttpResourceRequest | (() => HttpResourceRequest | undefined), + options?: HttpResourceOptions, + ): HttpResourceRef; + + /** + * Create a `Resource` that fetches data with the configured HTTP request. + * + * If a reactive function is passed for the URL or request, the resource will update when the + * URL or request changes via signals. + * + * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features + * of the `HttpClient` API. Data is parsed into an `ArrayBuffer`. + * + * @experimental + */ + arrayBuffer: { + ( + url: string | (() => string | undefined), + options: HttpResourceOptions & {defaultValue: NoInfer}, + ): HttpResourceRef; + + ( + url: string | (() => string | undefined), + options?: HttpResourceOptions, + ): HttpResourceRef; + + ( + request: HttpResourceRequest | (() => HttpResourceRequest | undefined), + options: HttpResourceOptions & {defaultValue: NoInfer}, + ): HttpResourceRef; + + ( + request: HttpResourceRequest | (() => HttpResourceRequest | undefined), + options?: HttpResourceOptions, + ): HttpResourceRef; + }; + + /** + * Create a `Resource` that fetches data with the configured HTTP request. + * + * If a reactive function is passed for the URL or request, the resource will update when the + * URL or request changes via signals. + * + * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features + * of the `HttpClient` API. Data is parsed into a `Blob`. + * + * @experimental + */ + blob: { + ( + url: string | (() => string | undefined), + options: HttpResourceOptions & {defaultValue: NoInfer}, + ): HttpResourceRef; + + ( + url: string | (() => string | undefined), + options?: HttpResourceOptions, + ): HttpResourceRef; + + ( + request: HttpResourceRequest | (() => HttpResourceRequest | undefined), + options: HttpResourceOptions & {defaultValue: NoInfer}, + ): HttpResourceRef; + + ( + request: HttpResourceRequest | (() => HttpResourceRequest | undefined), + options?: HttpResourceOptions, + ): HttpResourceRef; + }; + + /** + * Create a `Resource` that fetches data with the configured HTTP request. + * + * If a reactive function is passed for the URL or request, the resource will update when the + * URL or request changes via signals. + * + * Uses `HttpClient` to make requests and supports interceptors, testing, and the other features + * of the `HttpClient` API. Data is parsed as a `string`. + * + * @experimental + */ + text: { + ( + url: string | (() => string | undefined), + options: HttpResourceOptions & {defaultValue: NoInfer}, + ): HttpResourceRef; + + ( + url: string | (() => string | undefined), + options?: HttpResourceOptions, + ): HttpResourceRef; + + ( + request: HttpResourceRequest | (() => HttpResourceRequest | undefined), + options: HttpResourceOptions & {defaultValue: NoInfer}, + ): HttpResourceRef; + + ( + request: HttpResourceRequest | (() => HttpResourceRequest | undefined), + options?: HttpResourceOptions, + ): HttpResourceRef; + }; +} + +/** + * `httpResource` makes a reactive HTTP request and exposes the request status and response value as + * a `WritableResource`. By default, it assumes that the backend will return JSON data. To make a + * request that expects a different kind of data, you can use a sub-constructor of `httpResource`, + * such as `httpResource.text`. + * + * @experimental + * @initializerApiFunction + */ +export const httpResource: HttpResourceFn = (() => { + const jsonFn = makeHttpResourceFn('json') as HttpResourceFn; + jsonFn.arrayBuffer = makeHttpResourceFn('arraybuffer'); + jsonFn.blob = makeHttpResourceFn('blob'); + jsonFn.text = makeHttpResourceFn('text'); + return jsonFn; +})(); + +type RawRequestType = + | string + | (() => string | undefined) + | HttpResourceRequest + | (() => HttpResourceRequest | undefined); + +function makeHttpResourceFn(responseType: 'arraybuffer' | 'blob' | 'json' | 'text') { + return function httpResourceRef( + request: RawRequestType, + options?: HttpResourceOptions, + ): HttpResourceRef { + options?.injector || assertInInjectionContext(httpResource); + const injector = options?.injector ?? inject(Injector); + return new HttpResourceImpl( + injector, + () => normalizeRequest(request, responseType), + options?.defaultValue, + options?.map as (value: unknown) => TResult, + ) as HttpResourceRef; + }; +} + +function normalizeRequest( + request: RawRequestType, + responseType: 'arraybuffer' | 'blob' | 'json' | 'text', +): HttpRequest | undefined { + let unwrappedRequest = typeof request === 'function' ? request() : request; + if (unwrappedRequest === undefined) { + return undefined; + } else if (typeof unwrappedRequest === 'string') { + unwrappedRequest = {url: unwrappedRequest}; + } + + const headers = + unwrappedRequest.headers instanceof HttpHeaders + ? unwrappedRequest.headers + : new HttpHeaders( + unwrappedRequest.headers as + | Record> + | undefined, + ); + + const params = + unwrappedRequest.params instanceof HttpParams + ? unwrappedRequest.params + : new HttpParams({fromObject: unwrappedRequest.params}); + + return new HttpRequest( + unwrappedRequest.method ?? 'GET', + unwrappedRequest.url, + unwrappedRequest.body ?? null, + { + headers, + params, + reportProgress: unwrappedRequest.reportProgress, + withCredentials: unwrappedRequest.withCredentials, + responseType, + }, + ); +} +class HttpResourceImpl + extends ResourceImpl | undefined> + implements HttpResourceRef +{ + private client!: HttpClient; + private _headers = linkedSignal({ + source: this.extRequest, + computation: () => undefined as HttpHeaders | undefined, + }); + private _progress = linkedSignal({ + source: this.extRequest, + computation: () => undefined as HttpProgressEvent | undefined, + }); + private _statusCode = linkedSignal({ + source: this.extRequest, + computation: () => undefined as number | undefined, + }); + + readonly headers = computed(() => + this.status() === ResourceStatus.Resolved || this.status() === ResourceStatus.Error + ? this._headers() + : undefined, + ); + readonly progress = this._progress.asReadonly(); + readonly statusCode = this._statusCode.asReadonly(); + + constructor( + injector: Injector, + request: () => HttpRequest | undefined, + defaultValue: T, + map?: (value: unknown) => T, + ) { + super( + request, + ({request, abortSignal}) => { + let sub: Subscription; + + // Track the abort listener so it can be removed if the Observable completes (as a memory + // optimization). + const onAbort = () => sub.unsubscribe(); + abortSignal.addEventListener('abort', onAbort); + + // Start off stream as undefined. + const stream = signal>({value: undefined as T}); + let resolve: ((value: Signal>) => void) | undefined; + const promise = new Promise>>((r) => (resolve = r)); + + const send = (value: ResourceStreamItem): void => { + stream.set(value); + resolve?.(stream); + resolve = undefined; + }; + + sub = this.client.request(request!).subscribe({ + next: (event) => { + switch (event.type) { + case HttpEventType.Response: + this._headers.set(event.headers); + this._statusCode.set(event.status); + try { + send({value: map ? map(event.body) : (event.body as T)}); + } catch (error) { + send({error}); + } + break; + case HttpEventType.DownloadProgress: + this._progress.set(event); + break; + } + }, + error: (error) => send({error}), + complete: () => { + if (resolve) { + send({error: new Error('Resource completed before producing a value')}); + } + abortSignal.removeEventListener('abort', onAbort); + }, + }); + + return promise; + }, + defaultValue, + undefined, + injector, + ); + this.client = injector.get(HttpClient); + } + + override hasValue(): this is HttpResourceRef> { + return super.hasValue(); + } +} + +/** + * A `Resource` of the `HttpResponse` meant for use in `HttpResource` if we decide to go this route. + * + * TODO(alxhub): delete this if we decide we don't want it. + */ +class HttpResponseResource implements Resource { + readonly status: Signal; + readonly value: WritableSignal; + readonly error: Signal; + readonly isLoading: Signal; + + constructor( + private parent: Resource, + request: Signal, + ) { + this.status = computed(() => { + // There are two kinds of errors which can occur in an HTTP request: HTTP errors or normal JS + // errors. Since we have a response for HTTP errors, we report `Resolved` status even if the + // overall request is considered to be in an Error state. + if (parent.status() === ResourceStatus.Error) { + return this.value() !== undefined ? ResourceStatus.Resolved : ResourceStatus.Error; + } + return parent.status(); + }); + this.error = computed(() => { + // Filter out HTTP errors. + return this.value() === undefined ? parent.error() : undefined; + }); + this.value = linkedSignal({ + source: request, + computation: () => undefined as HttpResponseBase | undefined, + }); + this.isLoading = parent.isLoading; + } + + hasValue(): this is Resource { + return this.value() !== undefined; + } + + reload(): boolean { + // TODO: should you be able to reload this way? + return this.parent.reload(); + } +} diff --git a/packages/common/http/src/resource_api.ts b/packages/common/http/src/resource_api.ts new file mode 100644 index 000000000000..f99f971397eb --- /dev/null +++ b/packages/common/http/src/resource_api.ts @@ -0,0 +1,138 @@ +/** + * @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.dev/license + */ + +import type {Injector, ResourceRef, Signal, ValueEqualityFn, WritableResource} from '@angular/core'; +import type {HttpHeaders} from './headers'; +import type {HttpParams} from './params'; +import type {HttpProgressEvent} from './response'; + +/** + * The structure of an `httpResource` request which will be sent to the backend. + * + * @experimental + */ +export interface HttpResourceRequest { + /** + * URL of the request. + * + * This URL should not include query parameters. Instead, specify query parameters through the + * `params` field. + */ + url: string; + + /** + * HTTP method of the request, which defaults to GET if not specified. + */ + method?: string; + + /** + * Body to send with the request, if there is one. + * + * If no Content-Type header is specified by the user, Angular will attempt to set one based on + * the type of `body`. + */ + body?: unknown; + + /** + * Dictionary of query parameters which will be appeneded to the request URL. + */ + params?: + | HttpParams + | Record>; + + /** + * Dictionary of headers to include with the outgoing request. + */ + headers?: HttpHeaders | Record>; + + /** + * If `true`, progress events will be enabled for the request and delivered through the + * `HttpResource.progress` signal. + */ + reportProgress?: boolean; + + /** + * Specifies whether the `withCredentials` flag should be set on the outgoing request. + * + * This flag causes the browser to send cookies and other authentication information along with + * the request. + */ + withCredentials?: boolean; + + /** + * Configures the server-side rendering transfer cache for this request. + * + * See the documentation on the transfer cache for more information. + */ + transferCache?: {includeHeaders?: string[]} | boolean; +} + +/** + * Options for creating an `httpResource`. + * + * @experimental + */ +export interface HttpResourceOptions { + /** + * Transform the result of the HTTP request before it's delivered to the resource. + * + * `map` receives the value from the HTTP layer as its raw type (e.g. as `unknown` for JSON data). + * It can be used to validate or transform the type of the resource, and return a more specific + * type. This is also useful for validating backend responses using a runtime schema validation + * library such as Zod. + */ + map?: (value: TRaw) => TResult; + + /** + * Value that the resource will take when in Idle, Loading, or Error states. + * + * If not set, the resource will use `undefined` as its default value. + */ + defaultValue?: NoInfer; + + /** + * The `Injector` in which to create the `httpResource`. + * + * If this is not provided, the current [injection context](guide/di/dependency-injection-context) + * will be used instead (via `inject`). + */ + injector?: Injector; + + /** + * A comparison function which defines equality for the response value. + */ + equal?: ValueEqualityFn>; +} + +/** + * A `WritableResource` that represents the results of a reactive HTTP request. + * + * `HttpResource`s are backed by `HttpClient`, including support for interceptors, testing, and the + * other features of the `HttpClient` API. + * + * @experimental + */ +export interface HttpResourceRef extends WritableResource, ResourceRef { + /** + * Signal of the response headers, when available. + */ + readonly headers: Signal; + + /** + * Signal of the response status code, when available. + */ + readonly statusCode: Signal; + + /** + * Signal of the latest progress update, if the request was made with `reportProgress: true`. + */ + readonly progress: Signal; + + hasValue(): this is HttpResourceRef>; + destroy(): void; +} diff --git a/packages/common/http/test/resource_spec.ts b/packages/common/http/test/resource_spec.ts new file mode 100644 index 000000000000..631c5325d897 --- /dev/null +++ b/packages/common/http/test/resource_spec.ts @@ -0,0 +1,202 @@ +/** + * @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.dev/license + */ + +import {ApplicationRef, Injector, signal} from '@angular/core'; +import {TestBed} from '@angular/core/testing'; +import {HttpEventType, provideHttpClient, httpResource} from '@angular/common/http'; +import {HttpTestingController, provideHttpClientTesting} from '@angular/common/http/testing'; + +describe('httpResource', () => { + beforeEach(() => { + TestBed.configureTestingModule({providers: [provideHttpClient(), provideHttpClientTesting()]}); + }); + + it('should send a basic request', async () => { + const backend = TestBed.inject(HttpTestingController); + const res = httpResource('/data', {injector: TestBed.inject(Injector)}); + TestBed.flushEffects(); + const req = backend.expectOne('/data'); + req.flush([]); + await TestBed.inject(ApplicationRef).whenStable(); + expect(res.value()).toEqual([]); + }); + + it('should be reactive in its request URL', async () => { + const id = signal(0); + const backend = TestBed.inject(HttpTestingController); + const res = httpResource(() => `/data/${id()}`, {injector: TestBed.inject(Injector)}); + TestBed.flushEffects(); + const req1 = backend.expectOne('/data/0'); + req1.flush(0); + await TestBed.inject(ApplicationRef).whenStable(); + expect(res.value()).toEqual(0); + + id.set(1); + TestBed.flushEffects(); + const req2 = backend.expectOne('/data/1'); + req2.flush(1); + await TestBed.inject(ApplicationRef).whenStable(); + expect(res.value()).toEqual(1); + }); + + it('should not make backend requests if the request is undefined', async () => { + const id = signal(0); + const backend = TestBed.inject(HttpTestingController); + const res = httpResource(() => (id() !== 1 ? `/data/${id()}` : undefined), { + injector: TestBed.inject(Injector), + }); + TestBed.flushEffects(); + backend.expectOne('/data/0').flush(0); + await TestBed.inject(ApplicationRef).whenStable(); + expect(res.value()).toEqual(0); + + id.set(1); + TestBed.flushEffects(); + + // Verify no requests have been made. + backend.verify({ignoreCancelled: false}); + await TestBed.inject(ApplicationRef).whenStable(); + backend.verify({ignoreCancelled: false}); + + id.set(2); + TestBed.flushEffects(); + backend.expectOne('/data/2').flush(2); + await TestBed.inject(ApplicationRef).whenStable(); + expect(res.value()).toBe(2); + }); + + it('should support the suite of HttpRequest APIs', async () => { + const backend = TestBed.inject(HttpTestingController); + const res = httpResource( + { + url: '/data', + method: 'POST', + body: {message: 'Hello, backend!'}, + headers: { + 'X-Special': 'true', + }, + params: { + 'fast': 'yes', + }, + withCredentials: true, + }, + {injector: TestBed.inject(Injector)}, + ); + TestBed.flushEffects(); + const req = backend.expectOne('/data?fast=yes'); + expect(req.request.method).toBe('POST'); + expect(req.request.body).toEqual({message: 'Hello, backend!'}); + expect(req.request.headers.get('X-Special')).toBe('true'); + expect(req.request.withCredentials).toBe(true); + + req.flush([]); + + await TestBed.inject(ApplicationRef).whenStable(); + expect(res.value()).toEqual([]); + }); + + it('should return response headers & status when resolved', async () => { + const backend = TestBed.inject(HttpTestingController); + const res = httpResource('/data', {injector: TestBed.inject(Injector)}); + TestBed.flushEffects(); + const req = backend.expectOne('/data'); + req.flush([], { + headers: { + 'X-Special': '123', + }, + }); + await TestBed.inject(ApplicationRef).whenStable(); + expect(res.value()).toEqual([]); + expect(res.headers()?.get('X-Special')).toBe('123'); + expect(res.statusCode()).toBe(200); + }); + + it('should support progress events', async () => { + const backend = TestBed.inject(HttpTestingController); + const res = httpResource( + { + url: '/data', + reportProgress: true, + }, + {injector: TestBed.inject(Injector)}, + ); + TestBed.flushEffects(); + const req = backend.expectOne('/data'); + req.event({ + type: HttpEventType.DownloadProgress, + loaded: 100, + total: 200, + }); + + expect(res.progress()).toEqual({ + type: HttpEventType.DownloadProgress, + loaded: 100, + total: 200, + }); + + req.flush([]); + + await TestBed.inject(ApplicationRef).whenStable(); + expect(res.value()).toEqual([]); + }); + + it('should allow mapping data to an arbitrary type', async () => { + const backend = TestBed.inject(HttpTestingController); + const res = httpResource( + { + url: '/data', + reportProgress: true, + }, + { + injector: TestBed.inject(Injector), + map: (value) => JSON.stringify(value), + }, + ); + TestBed.flushEffects(); + const req = backend.expectOne('/data'); + req.flush([1, 2, 3]); + + await TestBed.inject(ApplicationRef).whenStable(); + expect(res.value()).toEqual('[1,2,3]'); + }); + + it('should support text responses', async () => { + const backend = TestBed.inject(HttpTestingController); + const res = httpResource.text( + { + url: '/data', + reportProgress: true, + }, + {injector: TestBed.inject(Injector)}, + ); + TestBed.flushEffects(); + const req = backend.expectOne('/data'); + req.flush('[1,2,3]'); + + await TestBed.inject(ApplicationRef).whenStable(); + expect(res.value()).toEqual('[1,2,3]'); + }); + + it('should support ArrayBuffer responses', async () => { + const backend = TestBed.inject(HttpTestingController); + const res = httpResource.arrayBuffer( + { + url: '/data', + reportProgress: true, + }, + {injector: TestBed.inject(Injector)}, + ); + TestBed.flushEffects(); + const req = backend.expectOne('/data'); + const buffer = new ArrayBuffer(); + req.flush(buffer); + + await TestBed.inject(ApplicationRef).whenStable(); + expect(res.value()).toBe(buffer); + }); +}); diff --git a/packages/core/src/core_private_export.ts b/packages/core/src/core_private_export.ts index ed2f1869c032..00442e53ec57 100644 --- a/packages/core/src/core_private_export.ts +++ b/packages/core/src/core_private_export.ts @@ -148,4 +148,6 @@ export { disableProfiling as ɵdisableProfiling, } from './profiler'; +export {ResourceImpl as ɵResourceImpl} from './resource/resource'; + export {getClosestComponentName as ɵgetClosestComponentName} from './internal/get_closest_component_name'; diff --git a/packages/core/src/resource/resource.ts b/packages/core/src/resource/resource.ts index 79d889c07f2f..2e56258cb0b8 100644 --- a/packages/core/src/resource/resource.ts +++ b/packages/core/src/resource/resource.ts @@ -130,7 +130,7 @@ abstract class BaseWritableResource implements WritableResource { /** * Implementation for `resource()` which uses a `linkedSignal` to manage the resource's state. */ -class ResourceImpl extends BaseWritableResource implements ResourceRef { +export class ResourceImpl extends BaseWritableResource implements ResourceRef { private readonly pendingTasks: PendingTasks; /** @@ -142,7 +142,7 @@ class ResourceImpl extends BaseWritableResource implements ResourceRef< * Combines the current request with a reload counter which allows the resource to be reloaded on * imperative command. */ - private readonly extRequest: WritableSignal; + protected readonly extRequest: WritableSignal; private readonly effectRef: EffectRef; private pendingController: AbortController | undefined; From 751dc4ad5b1ad7f25959d70770c6497cf46c7b30 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Fri, 14 Feb 2025 17:13:38 +0000 Subject: [PATCH 0075/1000] build: update babel dependencies to v7.26.9 (#59743) See associated pull request for more information. PR Close #59743 --- package.json | 4 +- packages/compiler-cli/package.json | 2 +- packages/localize/package.json | 2 +- yarn.lock | 99 ++++++++++++++++++++++++++---- 4 files changed, 92 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index 08299b3baafa..b9e468f6c45f 100644 --- a/package.json +++ b/package.json @@ -57,8 +57,8 @@ "@angular/material": "19.2.0-next.4", "@angular/ssr": "19.2.0-next.2", "@babel/cli": "7.26.4", - "@babel/core": "7.26.0", - "@babel/generator": "7.26.5", + "@babel/core": "7.26.9", + "@babel/generator": "7.26.9", "@bazel/concatjs": "5.8.1", "@bazel/esbuild": "5.8.1", "@bazel/jasmine": "5.8.1", diff --git a/packages/compiler-cli/package.json b/packages/compiler-cli/package.json index ca4bcbca50b1..e63a5ad6a321 100644 --- a/packages/compiler-cli/package.json +++ b/packages/compiler-cli/package.json @@ -43,7 +43,7 @@ } }, "dependencies": { - "@babel/core": "7.26.0", + "@babel/core": "7.26.9", "@jridgewell/sourcemap-codec": "^1.4.14", "reflect-metadata": "^0.2.0", "chokidar": "^4.0.0", diff --git a/packages/localize/package.json b/packages/localize/package.json index 514ab7b16dec..06257a2169ac 100644 --- a/packages/localize/package.json +++ b/packages/localize/package.json @@ -33,7 +33,7 @@ "./fesm2022/init.mjs" ], "dependencies": { - "@babel/core": "7.26.0", + "@babel/core": "7.26.9", "@types/babel__core": "7.20.5", "fast-glob": "3.3.3", "yargs": "^17.2.1" diff --git a/yarn.lock b/yarn.lock index 0224ce8849e0..6889c94a1fb0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -615,6 +615,27 @@ json5 "^2.2.3" semver "^6.3.1" +"@babel/core@7.26.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.9.tgz#71838542a4b1e49dfed353d7acbc6eb89f4a76f2" + integrity sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw== + 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" + "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.23.9": version "7.26.7" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.7.tgz#0439347a183b97534d52811144d763a17f9d2b24" @@ -636,17 +657,6 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@7.26.5", "@babel/generator@^7.26.0", "@babel/generator@^7.26.5": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.5.tgz#e44d4ab3176bbcaf78a5725da5f1dc28802a9458" - integrity sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw== - dependencies: - "@babel/parser" "^7.26.5" - "@babel/types" "^7.26.5" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^3.0.2" - "@babel/generator@7.26.8", "@babel/generator@^7.26.8": version "7.26.8" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.8.tgz#f9c5e770309e12e3099ad8271e52f6caa15442ab" @@ -658,6 +668,28 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" +"@babel/generator@7.26.9", "@babel/generator@^7.26.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.9.tgz#75a9482ad3d0cc7188a537aa4910bc59db67cbca" + integrity sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg== + dependencies: + "@babel/parser" "^7.26.9" + "@babel/types" "^7.26.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + +"@babel/generator@^7.26.0", "@babel/generator@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.5.tgz#e44d4ab3176bbcaf78a5725da5f1dc28802a9458" + integrity sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw== + dependencies: + "@babel/parser" "^7.26.5" + "@babel/types" "^7.26.5" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + "@babel/helper-annotate-as-pure@7.25.9", "@babel/helper-annotate-as-pure@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz#d8eac4d2dc0d7b6e11fa6e535332e0d3184f06b4" @@ -818,6 +850,14 @@ "@babel/template" "^7.25.9" "@babel/types" "^7.26.7" +"@babel/helpers@^7.26.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.9.tgz#28f3fb45252fc88ef2dc547c8a911c255fc9fef6" + integrity sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA== + dependencies: + "@babel/template" "^7.26.9" + "@babel/types" "^7.26.9" + "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.4", "@babel/parser@^7.25.3", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.5", "@babel/parser@^7.26.7": version "7.26.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.7.tgz#e114cd099e5f7d17b05368678da0fb9f69b3385c" @@ -832,6 +872,13 @@ dependencies: "@babel/types" "^7.26.8" +"@babel/parser@^7.26.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.9.tgz#d9e78bee6dc80f9efd8f2349dcfbbcdace280fd5" + integrity sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A== + dependencies: + "@babel/types" "^7.26.9" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz#cc2e53ebf0a0340777fff5ed521943e253b4d8fe" @@ -1423,6 +1470,15 @@ "@babel/parser" "^7.26.8" "@babel/types" "^7.26.8" +"@babel/template@^7.26.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.26.9.tgz#4577ad3ddf43d194528cff4e1fa6b232fa609bb2" + integrity sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/parser" "^7.26.9" + "@babel/types" "^7.26.9" + "@babel/traverse@^7.25.9", "@babel/traverse@^7.26.5", "@babel/traverse@^7.26.7": version "7.26.7" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.7.tgz#99a0a136f6a75e7fb8b0a1ace421e0b25994b8bb" @@ -1449,6 +1505,19 @@ debug "^4.3.1" globals "^11.1.0" +"@babel/traverse@^7.26.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.9.tgz#4398f2394ba66d05d988b2ad13c219a2c857461a" + integrity sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.9" + "@babel/parser" "^7.26.9" + "@babel/template" "^7.26.9" + "@babel/types" "^7.26.9" + debug "^4.3.1" + globals "^11.1.0" + "@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.5", "@babel/types@^7.26.7", "@babel/types@^7.4.4": version "7.26.7" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.7.tgz#5e2b89c0768e874d4d061961f3a5a153d71dc17a" @@ -1465,6 +1534,14 @@ "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" +"@babel/types@^7.26.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.9.tgz#08b43dec79ee8e682c2ac631c010bdcac54a21ce" + integrity sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw== + dependencies: + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@bazel/bazelisk@^1.7.5": version "1.25.0" resolved "https://registry.yarnpkg.com/@bazel/bazelisk/-/bazelisk-1.25.0.tgz#aded6d2822dd7220fa2290c97cb5e285c8fda770" From be32d6365251bf9d03bcb2f97525d28daa83f610 Mon Sep 17 00:00:00 2001 From: Doug Parker Date: Wed, 29 Jan 2025 13:52:35 -0800 Subject: [PATCH 0076/1000] docs: update `zip` command and link to recent DevTools commits (#59792) `-x dist/` never worked for reasons I don't really understand. Historically I've just deleted `dist/` before zipping. I tried a few different approaches, but all of them lead to some form of "Name not matched" error in `zip` of the `dist/` directory. Instead I just opted to delete `dist/` as part of the zipping command. The link to recent DevTools commits seems good enough to manually write a changelog. All relevant commits should be using `refactor(devtools)`, so the string "devtools" should definitely be in there. PR Close #59792 --- devtools/docs/release.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/devtools/docs/release.md b/devtools/docs/release.md index 14d41346ac2a..86d24316bfbc 100644 --- a/devtools/docs/release.md +++ b/devtools/docs/release.md @@ -68,14 +68,20 @@ Then upload it: 1. Set up Google Authenticator with the 2FA QR code. * You can find the QR code [on Valentine as well](http://valentine/#/show/1651792043556329) -The Firefox publishing process is slightly more involved than Chrome. In particular, they -require extension source code with instructions to build and run it. Since DevTools exists in -a monorepo with critical build tooling existing outside the `devtools/` directory, we need to -upload the entire monorepo. Package it without dependencies and generated files with the +The Firefox publishing process is slightly more involved than Chrome. + +Mozilla asks for a changelog, which needs to be authored manually. You can search for recent +`devtools` commits to see what has landed since the last release. + +https://github.com/search?q=repo%3Aangular%2Fangular+devtools&type=commits&s=committer-date&o=desc + +Mozilla also requires extension source code with instructions to build and run it. Since DevTools +exists in a monorepo with critical build tooling existing outside the `devtools/` directory, we +need to upload the entire monorepo. Package it without dependencies and generated files with the following command and upload it. ```shell -zip -r ~/angular-source.zip * -x ".git/*" -x "node_modules/*" -x "**/node_modules/*" -x "dist/" +rm -rf dist/ && zip -r ~/angular-source.zip * -x ".git/*" -x "node_modules/*" -x "**/node_modules/*" ``` Suggested note to reviewer: From 5b20bab96d20fe89b5cc4b4af28edbaae2604da1 Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Thu, 16 Jan 2025 14:06:40 -0800 Subject: [PATCH 0077/1000] feat(compiler): Add Skip Hydration diagnostic. (#59576) The diagnostic was created in #49512 but was never added to the list of diagnostic that run. fixes #59569 PR Close #59576 --- packages/compiler-cli/src/ngtsc/typecheck/extended/index.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/index.ts b/packages/compiler-cli/src/ngtsc/typecheck/extended/index.ts index 5cb45e946b00..51cf10c9a38f 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/extended/index.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/extended/index.ts @@ -19,6 +19,7 @@ import {factory as suffixNotSupportedFactory} from './checks/suffix_not_supporte import {factory as textAttributeNotBindingFactory} from './checks/text_attribute_not_binding'; import {factory as uninvokedFunctionInEventBindingFactory} from './checks/uninvoked_function_in_event_binding'; import {factory as unusedLetDeclarationFactory} from './checks/unused_let_declaration'; +import {factory as skipHydrationNotStaticFactory} from './checks/skip_hydration_not_static'; export {ExtendedTemplateCheckerImpl} from './src/extended_template_checker'; @@ -36,6 +37,7 @@ export const ALL_DIAGNOSTIC_FACTORIES: readonly TemplateCheckFactory< interpolatedSignalNotInvoked, uninvokedFunctionInEventBindingFactory, unusedLetDeclarationFactory, + skipHydrationNotStaticFactory, ]; export const SUPPORTED_DIAGNOSTIC_NAMES = new Set([ From c3e95ef1d5fda062e86f37ee5c16c636da19b248 Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Tue, 18 Feb 2025 13:18:30 +0100 Subject: [PATCH 0078/1000] docs(docs-infra): attemp to fix flaky mermaid test (#59994) This test has 2 async parts, loading the markdown file and the marked parsing. First attempt to fix the flakiness is by inline the markdown file. If this test timeouts again in the future it means the timeout is related to marked itself (and the dynamic import of mermaid). PR Close #59994 --- .../guides/testing/mermaid/mermaid.md | 14 ------------- .../guides/testing/mermaid/mermaid.spec.ts | 21 ++++++++++++++++--- 2 files changed, 18 insertions(+), 17 deletions(-) delete mode 100644 adev/shared-docs/pipeline/guides/testing/mermaid/mermaid.md diff --git a/adev/shared-docs/pipeline/guides/testing/mermaid/mermaid.md b/adev/shared-docs/pipeline/guides/testing/mermaid/mermaid.md deleted file mode 100644 index 56daf4428210..000000000000 --- a/adev/shared-docs/pipeline/guides/testing/mermaid/mermaid.md +++ /dev/null @@ -1,14 +0,0 @@ -```mermaid - graph TD; - A-->B; - A-->C; - B-->D; - C-->D; -``` - -```mermaid - pie title Pets adopted by volunteers - "Dogs" : 386 - "Cats" : 85 - "Rats" : 15 -``` \ No newline at end of file diff --git a/adev/shared-docs/pipeline/guides/testing/mermaid/mermaid.spec.ts b/adev/shared-docs/pipeline/guides/testing/mermaid/mermaid.spec.ts index fe9d2247662b..3e09ad504e2b 100644 --- a/adev/shared-docs/pipeline/guides/testing/mermaid/mermaid.spec.ts +++ b/adev/shared-docs/pipeline/guides/testing/mermaid/mermaid.spec.ts @@ -20,9 +20,24 @@ describe('markdown to html', () => { // Extend the timeout interval tyo 15 seconds because we were seeing issues with not being able to run marked // within the default timeframe. jasmine.DEFAULT_TIMEOUT_INTERVAL = 15000; - const markdownContent = await readFile(runfiles.resolvePackageRelative('./mermaid.md'), { - encoding: 'utf-8', - }); + + // This test was flaky, 1st attemp to fix it is by inlining the markdown content + const markdownContent = ` +\`\`\`mermaid + graph TD; + A-->B; + A-->C; + B-->D; + C-->D; +\`\`\` + +\`\`\`mermaid + pie title Pets adopted by volunteers + "Dogs" : 386 + "Cats" : 85 + "Rats" : 15 +\`\`\` + `; marked.use({ async: true, From ea5b7371e55be177fa113be2f7c8603741c6c0e5 Mon Sep 17 00:00:00 2001 From: hawkgs Date: Sat, 15 Feb 2025 11:05:59 +0200 Subject: [PATCH 0079/1000] docs(docs-infra): fix card highlighting in the API reference details page (#59965) Drop `pointer-events: none` and update the member card highlighting mechanism. PR Close #59965 --- .../rendering/templates/class-member.tsx | 2 +- .../templates/function-reference.tsx | 2 +- adev/shared-docs/styles/_reference.scss | 8 +---- .../api-reference-details-page.component.ts | 33 ++++++++++++++++++- 4 files changed, 35 insertions(+), 10 deletions(-) diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/class-member.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/class-member.tsx index 5635f56cb0ab..8d34f3b330af 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/templates/class-member.tsx +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/class-member.tsx @@ -55,7 +55,7 @@ export function ClassMember(props: {member: MemberEntryRenderable}) { const memberName = member.name; const returnType = getMemberType(member); return ( -
+

{memberName}

{isClassMethodEntry(member) && member.signatures.length > 1 ? ( diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/function-reference.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/function-reference.tsx index b02e13fee765..219d526ca41e 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/templates/function-reference.tsx +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/function-reference.tsx @@ -35,7 +35,7 @@ export const signatureCard = ( printSignaturesAsHeader: boolean, ) => { return ( -
+
{printSignaturesAsHeader ? ( diff --git a/adev/shared-docs/styles/_reference.scss b/adev/shared-docs/styles/_reference.scss index ca5360bd574e..c1e9d4f34522 100644 --- a/adev/shared-docs/styles/_reference.scss +++ b/adev/shared-docs/styles/_reference.scss @@ -88,7 +88,6 @@ border-radius: 0.25rem; position: relative; transition: border 0.3s ease; - pointer-events: none; &::before { content: ''; @@ -99,7 +98,7 @@ z-index: 0; } - &:focus { + &.highlighted { box-shadow: 10px 4px 40px 0 rgba(0, 0, 0, 0.01); &::before { @@ -112,10 +111,6 @@ margin-block-end: 0; } - a { - pointer-events: initial; - } - .docs-reference-card-header { display: flex; align-items: center; @@ -125,7 +120,6 @@ position: relative; z-index: 10; padding: 0.7rem 1rem; - cursor: pointer; gap: 0.5rem; flex-wrap: wrap; transition: diff --git a/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.ts b/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.ts index e37635f62904..77201a355f42 100644 --- a/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.ts +++ b/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.ts @@ -6,13 +6,16 @@ * found in the LICENSE file at https://angular.dev/license */ -import {ChangeDetectionStrategy, Component, inject, input} from '@angular/core'; +import {ChangeDetectionStrategy, Component, effect, inject, input, Renderer2} from '@angular/core'; +import {toSignal} from '@angular/core/rxjs-interop'; import {DocContent, DocViewer} from '@angular/docs'; import {ActivatedRoute} from '@angular/router'; import {DOCUMENT} from '@angular/common'; import {ReferenceScrollHandler} from '../services/reference-scroll-handler.service'; import {API_SECTION_CLASS_NAME} from '../constants/api-reference-prerender.constants'; +const HIGHLIGHTED_CARD_CLASS = 'highlighted'; + @Component({ selector: 'adev-reference-page', standalone: true, @@ -26,12 +29,21 @@ export default class ApiReferenceDetailsPage { private readonly referenceScrollHandler = inject(ReferenceScrollHandler); private readonly route = inject(ActivatedRoute); private readonly document = inject(DOCUMENT); + private readonly renderer = inject(Renderer2); + + private highlightedElement: HTMLElement | null = null; docContent = input(); + urlFragment = toSignal(this.route.fragment); + + constructor() { + effect(() => this.highlightCard()); + } onContentLoaded() { this.referenceScrollHandler.setupListeners(API_SECTION_CLASS_NAME); this.scrollToSectionLegacy(); + this.highlightCard(); } /** Handle legacy URLs with a `tab` query param from the old tab layout */ @@ -52,4 +64,23 @@ export default class ApiReferenceDetailsPage { } } } + + /** Highlight the member card that corresponds to the URL fragment. */ + private highlightCard() { + if (this.highlightedElement) { + this.renderer.removeClass(this.highlightedElement, HIGHLIGHTED_CARD_CLASS); + this.highlightedElement = null; + } + + const fragment = this.urlFragment(); + + if (fragment) { + const element = this.document.getElementById(fragment); + + if (element) { + this.renderer.addClass(element, HIGHLIGHTED_CARD_CLASS); + } + this.highlightedElement = element; + } + } } From 7bd4be0fa585fda8a09d27683ade77b383500768 Mon Sep 17 00:00:00 2001 From: arturovt Date: Fri, 24 Jan 2025 16:38:28 +0200 Subject: [PATCH 0080/1000] fix(common): clean up `urlChanges` subscribers when root scope is destroyed (#59703) In this commit, the `urlChanges` subject is completed to release all active observers when the root scope is destroyed. Previously, subscribing to the `urlChanges` subject caused the subscriber to capture `this`, resulting in a memory leak after the root scope was destroyed. PR Close #59703 --- packages/common/upgrade/src/location_shim.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/common/upgrade/src/location_shim.ts b/packages/common/upgrade/src/location_shim.ts index 479b2eca8c6d..5b6c7bb7ca33 100644 --- a/packages/common/upgrade/src/location_shim.ts +++ b/packages/common/upgrade/src/location_shim.ts @@ -179,7 +179,10 @@ export class $locationShim { } }); - // update browser + // Synchronize the browser's URL and state with the application. + // Note: There is no need to save the `$watch` return value (deregister listener) + // into a variable because `$scope.$$watchers` is automatically cleaned up when + // the root scope is destroyed. $rootScope.$watch(() => { if (this.initializing || this.updateBrowser) { this.updateBrowser = false; @@ -244,6 +247,14 @@ export class $locationShim { } this.$$replace = false; }); + + $rootScope.$on('$destroy', () => { + // Complete the subject to release all active observers when the root + // scope is destroyed. Before this change, we subscribed to the `urlChanges` + // subject, and the subscriber captured `this`, leading to a memory leak + // after the root scope was destroyed. + this.urlChanges.complete(); + }); } private resetBrowserUpdate() { From 3bfa85f5c8dc7fb5b1ca041f66755c21f069ea28 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Fri, 14 Feb 2025 22:14:17 +0000 Subject: [PATCH 0081/1000] build: lock file maintenance (#59836) See associated pull request for more information. PR Close #59836 --- .github/actions/deploy-docs-site/main.js | 210 +- .../deferrable-views/common/package-lock.json | 862 +++--- .../first-app/common/package-lock.json | 1198 ++++---- .../tutorials/homepage/package-lock.json | 850 +++--- .../learn-angular/common/package-lock.json | 862 +++--- .../playground/common/package-lock.json | 872 +++--- packages/zone.js/yarn.lock | 128 +- yarn.lock | 2417 ++++++++--------- 8 files changed, 3857 insertions(+), 3542 deletions(-) diff --git a/.github/actions/deploy-docs-site/main.js b/.github/actions/deploy-docs-site/main.js index a8f92a6bb11b..d3ccf7be8b8a 100644 --- a/.github/actions/deploy-docs-site/main.js +++ b/.github/actions/deploy-docs-site/main.js @@ -3283,7 +3283,7 @@ var require_dist_node2 = __commonJS({ }); module.exports = __toCommonJS(dist_src_exports); var import_universal_user_agent7 = require_dist_node(); - var VERSION11 = "9.0.5"; + var VERSION11 = "9.0.6"; var userAgent3 = `octokit-endpoint.js/${VERSION11} ${(0, import_universal_user_agent7.getUserAgent)()}`; var DEFAULTS3 = { method: "GET", @@ -3373,9 +3373,9 @@ var require_dist_node2 = __commonJS({ return `${name}=${encodeURIComponent(parameters[name])}`; }).join("&"); } - var urlVariableRegex3 = /\{[^}]+\}/g; + var urlVariableRegex3 = /\{[^{}}]+\}/g; function removeNonChars3(variableName) { - return variableName.replace(/^\W+|\W+$/g, "").split(/,/); + return variableName.replace(/(?:^\W+)|(?:(? { const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json"; return `application/vnd.github.${preview}-preview${format}`; @@ -4158,13 +4158,13 @@ var require_dist_node7 = __commonJS({ createTokenAuth: () => createTokenAuth3 }); module.exports = __toCommonJS(dist_src_exports); - var REGEX_IS_INSTALLATION_LEGACY2 = /^v1\./; - var REGEX_IS_INSTALLATION2 = /^ghs_/; - var REGEX_IS_USER_TO_SERVER2 = /^ghu_/; + var REGEX_IS_INSTALLATION_LEGACY = /^v1\./; + var REGEX_IS_INSTALLATION = /^ghs_/; + var REGEX_IS_USER_TO_SERVER = /^ghu_/; async function auth2(token) { const isApp = token.split(/\./).length === 3; - const isInstallation = REGEX_IS_INSTALLATION_LEGACY2.test(token) || REGEX_IS_INSTALLATION2.test(token); - const isUserToServer = REGEX_IS_USER_TO_SERVER2.test(token); + const isInstallation = REGEX_IS_INSTALLATION_LEGACY.test(token) || REGEX_IS_INSTALLATION.test(token); + const isUserToServer = REGEX_IS_USER_TO_SERVER.test(token); const tokenType = isApp ? "app" : isInstallation ? "installation" : isUserToServer ? "user-to-server" : "oauth"; return { type: "token", @@ -7376,6 +7376,7 @@ var require_re = __commonJS({ var re = exports.re = []; var safeRe = exports.safeRe = []; var src = exports.src = []; + var safeSrc = exports.safeSrc = []; var t = exports.t = {}; var R = 0; var LETTERDASHNUMBER = "[a-zA-Z0-9-]"; @@ -7396,6 +7397,7 @@ var require_re = __commonJS({ debug(name, index, value); t[name] = index; src[index] = value; + safeSrc[index] = safe; re[index] = new RegExp(value, isGlobal ? "g" : void 0); safeRe[index] = new RegExp(safe, isGlobal ? "g" : void 0); }; @@ -7492,7 +7494,7 @@ var require_semver = __commonJS({ ""(exports, module) { var debug = require_debug(); var { MAX_LENGTH, MAX_SAFE_INTEGER } = require_constants(); - var { safeRe: re, t } = require_re(); + var { safeRe: re, safeSrc: src, t } = require_re(); var parseOptions = require_parse_options(); var { compareIdentifiers } = require_identifiers(); var SemVer = class { @@ -7630,6 +7632,18 @@ var require_semver = __commonJS({ } while (++i); } inc(release, identifier, identifierBase) { + if (release.startsWith("pre")) { + if (!identifier && identifierBase === false) { + throw new Error("invalid increment argument: identifier is empty"); + } + if (identifier) { + const r = new RegExp(`^${this.options.loose ? src[t.PRERELEASELOOSE] : src[t.PRERELEASE]}$`); + const match = `-${identifier}`.match(r); + if (!match || match[1] !== identifier) { + throw new Error(`invalid identifier: ${identifier}`); + } + } + } switch (release) { case "premajor": this.prerelease.length = 0; @@ -7655,6 +7669,12 @@ var require_semver = __commonJS({ } this.inc("pre", identifier, identifierBase); break; + case "release": + if (this.prerelease.length === 0) { + throw new Error(`version ${this.raw} is not a prerelease`); + } + this.prerelease.length = 0; + break; case "major": if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) { this.major++; @@ -7678,9 +7698,6 @@ var require_semver = __commonJS({ break; case "pre": { const base = Number(identifierBase) ? 1 : 0; - if (!identifier && identifierBase === false) { - throw new Error("invalid increment argument: identifier is empty"); - } if (this.prerelease.length === 0) { this.prerelease = [base]; } else { @@ -7815,13 +7832,12 @@ var require_diff = __commonJS({ if (!lowVersion.patch && !lowVersion.minor) { return "major"; } - if (highVersion.patch) { + if (lowVersion.compareMain(highVersion) === 0) { + if (lowVersion.minor && !lowVersion.patch) { + return "minor"; + } return "patch"; } - if (highVersion.minor) { - return "minor"; - } - return "major"; } const prefix = highHasPre ? "pre" : ""; if (v1.major !== v2.major) { @@ -9719,9 +9735,9 @@ var require_cjs = __commonJS({ var require_lib2 = __commonJS({ ""(exports, module) { var { isexe, sync: isexeSync } = require_cjs(); - var { join: join3, delimiter, sep, posix } = __require("path"); + var { join: join3, delimiter, sep: sep2, posix } = __require("path"); var isWindows = process.platform === "win32"; - var rSlash = new RegExp(`[${posix.sep}${sep === posix.sep ? "" : sep}]`.replace(/(\\)/g, "\\$1")); + var rSlash = new RegExp(`[${posix.sep}${sep2 === posix.sep ? "" : sep2}]`.replace(/(\\)/g, "\\$1")); var rRel = new RegExp(`^\\.${rSlash.source}`); var getNotFoundError = (cmd) => Object.assign(new Error(`not found: ${cmd}`), { code: "ENOENT" }); var getPathInfo = (cmd, { @@ -11800,15 +11816,15 @@ var require_lockfile = __commonJS({ } toString(opts) { opts = opts || {}; - let sep = opts.sep || " "; + let sep2 = opts.sep || " "; if (opts.strict) { - sep = sep.replace(/\S+/g, " "); + sep2 = sep2.replace(/\S+/g, " "); } return Object.keys(this).map((k) => { return this[k].map((hash) => { return Hash.prototype.toString.call(hash, opts); - }).filter((x) => x.length).join(sep); - }).filter((x) => x.length).join(sep); + }).filter((x) => x.length).join(sep2); + }).filter((x) => x.length).join(sep2); } concat(integrity, opts) { const other = typeof integrity === "string" ? integrity : stringify(integrity, opts); @@ -21217,10 +21233,10 @@ var require_resolve_block_map = __commonJS({ let offset = bm.offset; let commentEnd = null; for (const collItem of bm.items) { - const { start, key, sep, value } = collItem; + const { start, key, sep: sep2, value } = collItem; const keyProps = resolveProps.resolveProps(start, { indicator: "explicit-key-ind", - next: key ?? (sep == null ? void 0 : sep[0]), + next: key ?? (sep2 == null ? void 0 : sep2[0]), offset, onError, parentIndent: bm.indent, @@ -21234,7 +21250,7 @@ var require_resolve_block_map = __commonJS({ else if ("indent" in key && key.indent !== bm.indent) onError(offset, "BAD_INDENT", startColMsg); } - if (!keyProps.anchor && !keyProps.tag && !sep) { + if (!keyProps.anchor && !keyProps.tag && !sep2) { commentEnd = keyProps.end; if (keyProps.comment) { if (map.comment) @@ -21258,7 +21274,7 @@ var require_resolve_block_map = __commonJS({ ctx.atKey = false; if (utilMapIncludes.mapIncludes(ctx, map.items, keyNode)) onError(keyStart, "DUPLICATE_KEY", "Map keys must be unique"); - const valueProps = resolveProps.resolveProps(sep ?? [], { + const valueProps = resolveProps.resolveProps(sep2 ?? [], { indicator: "map-value-ind", next: value, offset: keyNode.range[2], @@ -21274,7 +21290,7 @@ var require_resolve_block_map = __commonJS({ if (ctx.options.strict && keyProps.start < valueProps.found.offset - 1024) onError(keyNode.range, "KEY_OVER_1024_CHARS", "The : indicator must be at most 1024 chars after the start of an implicit block mapping key"); } - const valueNode = value ? composeNode(ctx, value, valueProps, onError) : composeEmptyNode(ctx, offset, sep, null, valueProps, onError); + const valueNode = value ? composeNode(ctx, value, valueProps, onError) : composeEmptyNode(ctx, offset, sep2, null, valueProps, onError); if (ctx.schema.compat) utilFlowIndentCheck.flowIndentCheck(bm.indent, value, onError); offset = valueNode.range[2]; @@ -21365,7 +21381,7 @@ var require_resolve_end = __commonJS({ let comment = ""; if (end) { let hasSpace = false; - let sep = ""; + let sep2 = ""; for (const token of end) { const { source, type } = token; switch (type) { @@ -21379,13 +21395,13 @@ var require_resolve_end = __commonJS({ if (!comment) comment = cb; else - comment += sep + cb; - sep = ""; + comment += sep2 + cb; + sep2 = ""; break; } case "newline": if (comment) - sep += source; + sep2 += source; hasSpace = true; break; default: @@ -21428,18 +21444,18 @@ var require_resolve_flow_collection = __commonJS({ let offset = fc.offset + fc.start.source.length; for (let i = 0; i < fc.items.length; ++i) { const collItem = fc.items[i]; - const { start, key, sep, value } = collItem; + const { start, key, sep: sep2, value } = collItem; const props = resolveProps.resolveProps(start, { flow: fcName, indicator: "explicit-key-ind", - next: key ?? (sep == null ? void 0 : sep[0]), + next: key ?? (sep2 == null ? void 0 : sep2[0]), offset, onError, parentIndent: fc.indent, startOnNewline: false }); if (!props.found) { - if (!props.anchor && !props.tag && !sep && !value) { + if (!props.anchor && !props.tag && !sep2 && !value) { if (i === 0 && props.comma) onError(props.comma, "UNEXPECTED_TOKEN", `Unexpected , in ${fcName}`); else if (i < fc.items.length - 1) @@ -21493,8 +21509,8 @@ var require_resolve_flow_collection = __commonJS({ } } } - if (!isMap && !sep && !props.found) { - const valueNode = value ? composeNode(ctx, value, props, onError) : composeEmptyNode(ctx, props.end, sep, null, props, onError); + if (!isMap && !sep2 && !props.found) { + const valueNode = value ? composeNode(ctx, value, props, onError) : composeEmptyNode(ctx, props.end, sep2, null, props, onError); coll.items.push(valueNode); offset = valueNode.range[2]; if (isBlock(value)) @@ -21506,7 +21522,7 @@ var require_resolve_flow_collection = __commonJS({ if (isBlock(key)) onError(keyNode.range, "BLOCK_IN_FLOW", blockMsg); ctx.atKey = false; - const valueProps = resolveProps.resolveProps(sep ?? [], { + const valueProps = resolveProps.resolveProps(sep2 ?? [], { flow: fcName, indicator: "map-value-ind", next: value, @@ -21517,8 +21533,8 @@ var require_resolve_flow_collection = __commonJS({ }); if (valueProps.found) { if (!isMap && !props.found && ctx.options.strict) { - if (sep) - for (const st of sep) { + if (sep2) + for (const st of sep2) { if (st === valueProps.found) break; if (st.type === "newline") { @@ -21535,7 +21551,7 @@ var require_resolve_flow_collection = __commonJS({ else onError(valueProps.start, "MISSING_CHAR", `Missing , or : between ${fcName} items`); } - const valueNode = value ? composeNode(ctx, value, valueProps, onError) : valueProps.found ? composeEmptyNode(ctx, valueProps.end, sep, null, valueProps, onError) : null; + const valueNode = value ? composeNode(ctx, value, valueProps, onError) : valueProps.found ? composeEmptyNode(ctx, valueProps.end, sep2, null, valueProps, onError) : null; if (valueNode) { if (isBlock(value)) onError(valueNode.range, "BLOCK_IN_FLOW", blockMsg); @@ -21716,7 +21732,7 @@ var require_resolve_block_scalar = __commonJS({ chompStart = i + 1; } let value = ""; - let sep = ""; + let sep2 = ""; let prevMoreIndented = false; for (let i = 0; i < contentStart; ++i) value += lines[i][0].slice(trimIndent) + "\n"; @@ -21733,24 +21749,24 @@ var require_resolve_block_scalar = __commonJS({ indent = ""; } if (type === Scalar.Scalar.BLOCK_LITERAL) { - value += sep + indent.slice(trimIndent) + content; - sep = "\n"; + value += sep2 + indent.slice(trimIndent) + content; + sep2 = "\n"; } else if (indent.length > trimIndent || content[0] === " ") { - if (sep === " ") - sep = "\n"; - else if (!prevMoreIndented && sep === "\n") - sep = "\n\n"; - value += sep + indent.slice(trimIndent) + content; - sep = "\n"; + if (sep2 === " ") + sep2 = "\n"; + else if (!prevMoreIndented && sep2 === "\n") + sep2 = "\n\n"; + value += sep2 + indent.slice(trimIndent) + content; + sep2 = "\n"; prevMoreIndented = true; } else if (content === "") { - if (sep === "\n") + if (sep2 === "\n") value += "\n"; else - sep = "\n"; + sep2 = "\n"; } else { - value += sep + content; - sep = " "; + value += sep2 + content; + sep2 = " "; prevMoreIndented = false; } } @@ -21928,25 +21944,25 @@ var require_resolve_flow_scalar = __commonJS({ if (!match) return source; let res = match[1]; - let sep = " "; + let sep2 = " "; let pos = first.lastIndex; line.lastIndex = pos; while (match = line.exec(source)) { if (match[1] === "") { - if (sep === "\n") - res += sep; + if (sep2 === "\n") + res += sep2; else - sep = "\n"; + sep2 = "\n"; } else { - res += sep + match[1]; - sep = " "; + res += sep2 + match[1]; + sep2 = " "; } pos = line.lastIndex; } const last = /[ \t]*(.*)/sy; last.lastIndex = pos; match = last.exec(source); - return res + sep + ((match == null ? void 0 : match[1]) ?? ""); + return res + sep2 + ((match == null ? void 0 : match[1]) ?? ""); } function doubleQuotedValue(source, onError) { let res = ""; @@ -22726,14 +22742,14 @@ var require_cst_stringify = __commonJS({ } } } - function stringifyItem({ start, key, sep, value }) { + function stringifyItem({ start, key, sep: sep2, value }) { let res = ""; for (const st of start) res += st.source; if (key) res += stringifyToken(key); - if (sep) - for (const st of sep) + if (sep2) + for (const st of sep2) res += st.source; if (value) res += stringifyToken(value); @@ -23857,18 +23873,18 @@ var require_parser = __commonJS({ if (this.type === "map-value-ind") { const prev = getPrevProps(this.peek(2)); const start = getFirstKeyStartProps(prev); - let sep; + let sep2; if (scalar.end) { - sep = scalar.end; - sep.push(this.sourceToken); + sep2 = scalar.end; + sep2.push(this.sourceToken); delete scalar.end; } else - sep = [this.sourceToken]; + sep2 = [this.sourceToken]; const map = { type: "block-map", offset: scalar.offset, indent: scalar.indent, - items: [{ start, key: scalar, sep }] + items: [{ start, key: scalar, sep: sep2 }] }; this.onKeyLine = true; this.stack[this.stack.length - 1] = map; @@ -24021,15 +24037,15 @@ var require_parser = __commonJS({ } else if (isFlowToken(it.key) && !includesToken(it.sep, "newline")) { const start2 = getFirstKeyStartProps(it.start); const key = it.key; - const sep = it.sep; - sep.push(this.sourceToken); + const sep2 = it.sep; + sep2.push(this.sourceToken); delete it.key; delete it.sep; this.stack.push({ type: "block-map", offset: this.offset, indent: this.indent, - items: [{ start: start2, key, sep }] + items: [{ start: start2, key, sep: sep2 }] }); } else if (start.length > 0) { it.sep = it.sep.concat(start, this.sourceToken); @@ -24214,13 +24230,13 @@ var require_parser = __commonJS({ const prev = getPrevProps(parent); const start = getFirstKeyStartProps(prev); fixFlowSeqItems(fc); - const sep = fc.end.splice(1, fc.end.length); - sep.push(this.sourceToken); + const sep2 = fc.end.splice(1, fc.end.length); + sep2.push(this.sourceToken); const map = { type: "block-map", offset: fc.offset, indent: fc.indent, - items: [{ start, key: fc, sep }] + items: [{ start, key: fc, sep: sep2 }] }; this.onKeyLine = true; this.stack[this.stack.length - 1] = map; @@ -26220,9 +26236,9 @@ function addQueryParameters(url, parameters) { return `${name}=${encodeURIComponent(parameters[name])}`; }).join("&"); } -var urlVariableRegex = /\{[^}]+\}/g; +var urlVariableRegex = /\{[^{}}]+\}/g; function removeNonChars(variableName) { - return variableName.replace(/^\W+|\W+$/g, "").split(/,/); + return variableName.replace(/(?:^\W+)|(?:(? { const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json"; return `application/vnd.github.${preview}-preview${format}`; @@ -26472,7 +26488,7 @@ var RequestError = class extends Error { if (options.request.headers.authorization) { requestCopy.headers = Object.assign({}, options.request.headers, { authorization: options.request.headers.authorization.replace( - / .*$/, + /(?]+)>; rel="deprecation"/); + const matches = responseHeaders.link && responseHeaders.link.match(/<([^<>]+)>; rel="deprecation"/); const deprecationLink = matches && matches.pop(); log.warn( `[@octokit/request] "${requestOptions.method} ${requestOptions.url}" is deprecated. It is scheduled to be removed on ${responseHeaders.sunset}${deprecationLink ? `. See ${deprecationLink}` : ""}` @@ -26761,9 +26777,9 @@ function addQueryParameters2(url, parameters) { return `${name}=${encodeURIComponent(parameters[name])}`; }).join("&"); } -var urlVariableRegex2 = /\{[^}]+\}/g; +var urlVariableRegex2 = /\{[^{}}]+\}/g; function removeNonChars2(variableName) { - return variableName.replace(/^\W+|\W+$/g, "").split(/,/); + return variableName.replace(/(?:^\W+)|(?:(? { const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json"; return `application/vnd.github.${preview}-preview${format}`; @@ -27013,7 +27029,7 @@ var RequestError2 = class extends Error { if (options.request.headers.authorization) { requestCopy.headers = Object.assign({}, options.request.headers, { authorization: options.request.headers.authorization.replace( - / .*$/, + /(?]+)>; rel="deprecation"/); + const matches = responseHeaders.link && responseHeaders.link.match(/<([^<>]+)>; rel="deprecation"/); const deprecationLink = matches && matches.pop(); log.warn( `[@octokit/request] "${requestOptions.method} ${requestOptions.url}" is deprecated. It is scheduled to be removed on ${responseHeaders.sunset}${deprecationLink ? `. See ${deprecationLink}` : ""}` @@ -27229,7 +27245,8 @@ var NON_VARIABLE_OPTIONS = [ "headers", "request", "query", - "mediaType" + "mediaType", + "operationName" ]; var FORBIDDEN_VARIABLE_OPTIONS = ["query", "method", "url"]; var GHES_V3_SUFFIX_REGEX = /\/api\/v3\/?$/; @@ -27308,13 +27325,14 @@ function withCustomRequest(customRequest) { } // -var REGEX_IS_INSTALLATION_LEGACY = /^v1\./; -var REGEX_IS_INSTALLATION = /^ghs_/; -var REGEX_IS_USER_TO_SERVER = /^ghu_/; +var b64url = "(?:[a-zA-Z0-9_-]+)"; +var sep = "\\."; +var jwtRE = new RegExp(`^${b64url}${sep}${b64url}${sep}${b64url}$`); +var isJWT = jwtRE.test.bind(jwtRE); async function auth(token) { - const isApp = token.split(/\./).length === 3; - const isInstallation = REGEX_IS_INSTALLATION_LEGACY.test(token) || REGEX_IS_INSTALLATION.test(token); - const isUserToServer = REGEX_IS_USER_TO_SERVER.test(token); + const isApp = isJWT(token); + const isInstallation = token.startsWith("v1.") || token.startsWith("ghs_"); + const isUserToServer = token.startsWith("ghu_"); const tokenType = isApp ? "app" : isInstallation ? "installation" : isUserToServer ? "user-to-server" : "oauth"; return { type: "token", @@ -27352,7 +27370,7 @@ var createTokenAuth = function createTokenAuth2(token) { }; // -var VERSION6 = "6.1.3"; +var VERSION6 = "6.1.4"; // var noop = () => { @@ -27540,7 +27558,7 @@ function iterator(octokit, route, parameters) { const response = await requestMethod({ method, url, headers }); const normalizedResponse = normalizePaginatedListResponse(response); url = ((normalizedResponse.headers.link || "").match( - /<([^>]+)>;\s*rel="next"/ + /<([^<>]+)>;\s*rel="next"/ ) || [])[1]; return { value: normalizedResponse }; } catch (error) { @@ -27602,7 +27620,7 @@ function paginateRest(octokit) { paginateRest.VERSION = VERSION8; // -var VERSION9 = "13.3.0"; +var VERSION9 = "13.3.1"; // var Endpoints = { diff --git a/adev/src/content/tutorials/deferrable-views/common/package-lock.json b/adev/src/content/tutorials/deferrable-views/common/package-lock.json index 2db9269eb091..c7e530756a8c 100644 --- a/adev/src/content/tutorials/deferrable-views/common/package-lock.json +++ b/adev/src/content/tutorials/deferrable-views/common/package-lock.json @@ -40,13 +40,13 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1901.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.4.tgz", - "integrity": "sha512-EoRTN8p7z0YnqOEIJKKu/NwSsCJxFkyGuZOobz7btnUWwlDqG8CNAhJgtlsOXPihwEkHEkzRIm1feDkWEjCYsA==", + "version": "0.1901.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.7.tgz", + "integrity": "sha512-qltyebfbej7joIKZVH8EFfrVDrkw0p9N9ja3A0XeU1sl2vlepHNAQdVm0Os8Vy2XjjyHvT5bXWE3G3/221qEKw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.4", + "@angular-devkit/core": "19.1.7", "rxjs": "7.8.1" }, "engines": { @@ -56,9 +56,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.4.tgz", - "integrity": "sha512-IDvSSiQgaixH2RtZtIpq1+XaHeuzMiTWfDyNF9DuYcU+S8CdG1SWrc8d59tmOrM/q+IRGyFgbBhTU1un52hNHw==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.7.tgz", + "integrity": "sha512-q0I6L9KTqyQ7D5M8H+fWLT+yjapvMNb7SRdfU6GzmexO66Dpo83q4HDzuDKIPDF29Yl0ELs9ICJqe9yUXh6yDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -84,13 +84,13 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.4.tgz", - "integrity": "sha512-EKXBkx6EDcvyO+U68w/eXicRaF92zSSzYNvR3tMZszEKYE6xBr3kZxY99PP54HXQHR4zYwLvFJVp+T6bnvte2w==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.7.tgz", + "integrity": "sha512-AP6FvhMybCYs3gs+vzEAzSU1K//AFT3SVTRFv+C3WMO5dLeAHeGzM8I2dxD5EHQQtqIE/8apP6CxGrnpA5YlFg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.4", + "@angular-devkit/core": "19.1.7", "jsonc-parser": "3.3.1", "magic-string": "0.30.17", "ora": "5.4.1", @@ -103,14 +103,15 @@ } }, "node_modules/@angular/build": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.4.tgz", - "integrity": "sha512-yfvLeUT2a8JTuVBY259vsSv0uLyhikHHgQcWa3VSr0TvCKrwCsBIFDq7vqmhLqIVWi/Z4D7n3J5JQAbDrl38Sg==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.7.tgz", + "integrity": "sha512-22SjHZDTk91JHU5aFVDU2n+xkPolDosRVfsK4zs+RRXQs30LYPH9KCLiUWCYjFbRj7oYvw7sbrs94szo7dWYvw==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1901.4", + "@angular-devkit/architect": "0.1901.7", + "@angular-devkit/core": "19.1.7", "@babel/core": "7.26.0", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", @@ -132,7 +133,7 @@ "rollup": "4.30.1", "sass": "1.83.1", "semver": "7.6.3", - "vite": "6.0.7", + "vite": "6.0.11", "watchpack": "2.4.2" }, "engines": { @@ -149,11 +150,11 @@ "@angular/localize": "^19.0.0", "@angular/platform-server": "^19.0.0", "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.1.4", + "@angular/ssr": "^19.1.7", "less": "^4.2.0", "ng-packagr": "^19.0.0", "postcss": "^8.4.0", - "tailwindcss": "^2.0.0 || ^3.0.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", "typescript": ">=5.5 <5.8" }, "peerDependenciesMeta": { @@ -184,18 +185,18 @@ } }, "node_modules/@angular/cli": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.4.tgz", - "integrity": "sha512-C1Z2OTLjUJIkLsay6RJ1rzY0Tdb1Mj/cBh9dZryDstuits8G0Tphe36hnLownnoHspFQfjSRtVzF4NwKiDlQRw==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.7.tgz", + "integrity": "sha512-qVEy0R4QKQ2QAGfpj2mPVxRxgOVst+rIgZBtLwf/mrbN9YyzJUaBKvaVslUpOqkvoW9mX5myf0iZkT5NykrIoA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1901.4", - "@angular-devkit/core": "19.1.4", - "@angular-devkit/schematics": "19.1.4", + "@angular-devkit/architect": "0.1901.7", + "@angular-devkit/core": "19.1.7", + "@angular-devkit/schematics": "19.1.7", "@inquirer/prompts": "7.2.1", "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.1.4", + "@schematics/angular": "19.1.7", "@yarnpkg/lockfile": "1.1.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", @@ -218,9 +219,9 @@ } }, "node_modules/@angular/common": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.3.tgz", - "integrity": "sha512-r1P0W6FKrON83szIJboF8z6UNCVL4HIxyD+nhmHMMT/iJpu4kDHVugaN/+w2jYLb4oelAJK5xzkzA+1IaHpzLg==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.6.tgz", + "integrity": "sha512-FkuejwbxsOLhcyOgDM/7YEYvMG3tuyOvr+831VzPwMwYp5QO9AUYtn4ffGf698JccbA+Ocw3BAdhPU6i+YZC1A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -229,14 +230,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.1.3", + "@angular/core": "19.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.3.tgz", - "integrity": "sha512-omX5Gyt3zlJVTUteO2YxsqYWtAIpkvs8kRYSUsLTi79V1gbGo+J1TawFuyBTrWxj4UtTGvwmDgZxiCIwMtP5KQ==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.6.tgz", + "integrity": "sha512-Tl2PFEtnU8UgSqtEKG827xDUGZrErhR6S1JICeV1kbRCYmwQA4hhG25tzi+ifSAOPW7eJiyzP2LWIvOuZkq3Vw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -245,7 +246,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.1.3" + "@angular/core": "19.1.6" }, "peerDependenciesMeta": { "@angular/core": { @@ -254,9 +255,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.3.tgz", - "integrity": "sha512-nDBvZenQECcr9CClmTp3iJNilRQ6oDKFgBkhlWffEFBx0Z6kBA36MXKKLuCkf31D+NGmt5VJlAkl8Ax8BJ9qJw==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.6.tgz", + "integrity": "sha512-rTpHC/tfLBj+5a3X+BA/4s2w5T/cHT6x3RgO8CYy7003Musn0/BiqjfE6VCIllQgLaOQRhCcf51T6Kerkzv8Dw==", "dev": true, "license": "MIT", "dependencies": { @@ -278,14 +279,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.1.3", + "@angular/compiler": "19.1.6", "typescript": ">=5.5 <5.8" } }, "node_modules/@angular/core": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.3.tgz", - "integrity": "sha512-Hh1eHvi+y+gsTRODiEEEWnRj5zqv9WNoou1KmQ1mv1NTOf0Pv61Hg9P2rBWDr0mPIXFSzqUKjyzW30BgdQ+AEA==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.6.tgz", + "integrity": "sha512-FD167URT+apxjzj9sG/MzffW5G6YyQiPQ6nrrIoYi9jeY3LYurybuOgvcXrU8PT4Z3+CKMq9k/ZnmrlHU72BpA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -299,9 +300,9 @@ } }, "node_modules/@angular/forms": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.3.tgz", - "integrity": "sha512-M6eEJBysJm9zSUhm8ggljZCsgHLccZl70P34tyddb8erh9it2uoOXW0aVaZgDt1UAiF5a1EzjdVdN4TZTT/OGA==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.6.tgz", + "integrity": "sha512-uu/76KAwCAcDuhD67Vv78UvOC/tiprtFXOgqNCj0LK8vyFcvPsunb3nF/PtfF9rSHyslXAqxZhME+Ha2tU6Lpw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -310,16 +311,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.1.3", - "@angular/core": "19.1.3", - "@angular/platform-browser": "19.1.3", + "@angular/common": "19.1.6", + "@angular/core": "19.1.6", + "@angular/platform-browser": "19.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.3.tgz", - "integrity": "sha512-bLgnM2hRyzUdoWRoUhe+IMenlr74EvrgwyG7anJ27bjg5PcvhQPXrGqU0hri5yPDb9SHVJZminr7OjNCN8QJkQ==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.6.tgz", + "integrity": "sha512-sfWU+gMpqQ6GYtE3tAfDktftC01NgtqAOKfeCQ/KY2rxRTIxYahenW0Licuzgmd+8AZtmncoZaYX0Fd/5XMqzQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -328,9 +329,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "19.1.3", - "@angular/common": "19.1.3", - "@angular/core": "19.1.3" + "@angular/animations": "19.1.6", + "@angular/common": "19.1.6", + "@angular/core": "19.1.6" }, "peerDependenciesMeta": { "@angular/animations": { @@ -339,9 +340,9 @@ } }, "node_modules/@angular/router": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.1.3.tgz", - "integrity": "sha512-DJ9BgvtxJV6xohaPQXPdBsFCZoQIEq2OPDyKcoW4L0ST4kIIFpHyI6wJ+AlPnLkhSwmOOoHciH0oxZ2xPVxmiQ==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.1.6.tgz", + "integrity": "sha512-TEfw3W5jVodVDMD4krhXGog1THZN3x1yoh2oZmCv3lXg22+pVC6Cp+x3vVExq0mS+g3/6uZwy/3qAYdlzqYjTg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -350,9 +351,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.1.3", - "@angular/core": "19.1.3", - "@angular/platform-browser": "19.1.3", + "@angular/common": "19.1.6", + "@angular/core": "19.1.6", + "@angular/platform-browser": "19.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -372,9 +373,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", - "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true, "license": "MIT", "engines": { @@ -430,14 +431,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", - "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", + "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.5", - "@babel/types": "^7.26.5", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -572,27 +573,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz", - "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", + "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.7" + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", - "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", + "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.7" + "@babel/types": "^7.26.9" }, "bin": { "parser": "bin/babel-parser.js" @@ -618,32 +619,32 @@ } }, "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz", - "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", + "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.5", - "@babel/parser": "^7.26.7", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.7", + "@babel/generator": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -652,9 +653,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", - "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", + "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", "dev": true, "license": "MIT", "dependencies": { @@ -1091,15 +1092,15 @@ } }, "node_modules/@inquirer/checkbox": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.6.tgz", - "integrity": "sha512-PgP35JfmGjHU0LSXOyRew0zHuA9N6OJwOlos1fZ20b7j8ISeAdib3L+n0jIxBtX958UeEpte6xhG/gxJ5iUqMw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.1.tgz", + "integrity": "sha512-os5kFd/52gZTl/W6xqMfhaKVJHQM8V/U1P8jcSaQJ/C4Qhdrf2jEXdA/HaxfQs9iiUA/0yzYhk5d3oRHTxGDDQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -1108,6 +1109,11 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/confirm": { @@ -1128,35 +1134,42 @@ } }, "node_modules/@inquirer/core": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.4.tgz", - "integrity": "sha512-5y4/PUJVnRb4bwWY67KLdebWOhOc7xj5IP2J80oWXa64mVag24rwQ1VAdnj7/eDY/odhguW0zQ1Mp1pj6fO/2w==", + "version": "10.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.6.tgz", + "integrity": "sha512-Bwh/Zk6URrHwZnSSzAZAKH7YgGYi0xICIBDFOqBQoXNNAzBHw/bgXgLmChfp+GyR3PnChcTbiCTZGC6YJNJkMA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", - "strip-ansi": "^6.0.1", "wrap-ansi": "^6.2.0", "yoctocolors-cjs": "^2.1.2" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/editor": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.3.tgz", - "integrity": "sha512-S9KnIOJuTZpb9upeRSBBhoDZv7aSV3pG9TECrBj0f+ZsFwccz886hzKBrChGrXMJwd4NKY+pOA9Vy72uqnd6Eg==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.6.tgz", + "integrity": "sha512-l0smvr8g/KAVdXx4I92sFxZiaTG4kFc06cFZw+qqwTirwdUHMFLnouXBB9OafWhpO3cfEkEz2CdPoCmor3059A==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "external-editor": "^3.1.0" }, "engines": { @@ -1164,17 +1177,22 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/expand": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.6.tgz", - "integrity": "sha512-TRTfi1mv1GeIZGyi9PQmvAaH65ZlG4/FACq6wSzs7Vvf1z5dnNWsAAXBjWMHt76l+1hUY8teIqJFrWBk5N6gsg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.8.tgz", + "integrity": "sha512-k0ouAC6L+0Yoj/j0ys2bat0fYcyFVtItDB7h+pDFKaDDSFJey/C/YY1rmIOqkmFVZ5rZySeAQuS8zLcKkKRLmg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -1182,12 +1200,17 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/figures": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.9.tgz", - "integrity": "sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.10.tgz", + "integrity": "sha512-Ey6176gZmeqZuY/W/nZiUyvmb1/qInjcpiZjXWi6nON+nxJpD1bxtSoBxNliGISae32n6OwbY+TSXPZ1CfS4bw==", "dev": true, "license": "MIT", "engines": { @@ -1195,48 +1218,58 @@ } }, "node_modules/@inquirer/input": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.3.tgz", - "integrity": "sha512-zeo++6f7hxaEe7OjtMzdGZPHiawsfmCZxWB9X1NpmYgbeoyerIbWemvlBxxl+sQIlHC0WuSAG19ibMq3gbhaqQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.5.tgz", + "integrity": "sha512-bB6wR5wBCz5zbIVBPnhp94BHv/G4eKbUEjlpCw676pI2chcvzTx1MuwZSCZ/fgNOdqDlAxkhQ4wagL8BI1D3Zg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2" + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/number": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.6.tgz", - "integrity": "sha512-xO07lftUHk1rs1gR0KbqB+LJPhkUNkyzV/KhH+937hdkMazmAYHLm1OIrNKpPelppeV1FgWrgFDjdUD8mM+XUg==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.8.tgz", + "integrity": "sha512-CTKs+dT1gw8dILVWATn8Ugik1OHLkkfY82J+Musb57KpmF6EKyskv8zmMiEJPzOnLTZLo05X/QdMd8VH9oulXw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2" + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/password": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.6.tgz", - "integrity": "sha512-QLF0HmMpHZPPMp10WGXh6F+ZPvzWE7LX6rNoccdktv/Rov0B+0f+eyXkAcgqy5cH9V+WSpbLxu2lo3ysEVK91w==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.8.tgz", + "integrity": "sha512-MgA+Z7o3K1df2lGY649fyOBowHGfrKRz64dx3+b6c1w+h2W7AwBoOkHhhF/vfhbs5S4vsKNCuDzS3s9r5DpK1g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2" }, "engines": { @@ -1244,6 +1277,11 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/prompts": { @@ -1272,14 +1310,14 @@ } }, "node_modules/@inquirer/rawlist": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.6.tgz", - "integrity": "sha512-QoE4s1SsIPx27FO4L1b1mUjVcoHm1pWE/oCmm4z/Hl+V1Aw5IXl8FYYzGmfXaBT0l/sWr49XmNSiq7kg3Kd/Lg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.8.tgz", + "integrity": "sha512-hl7rvYW7Xl4un8uohQRUgO6uc2hpn7PKqfcGkCOWC0AA4waBxAv6MpGOFCEDrUaBCP+pXPVqp4LmnpWmn1E1+g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -1287,18 +1325,23 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/search": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.6.tgz", - "integrity": "sha512-eFZ2hiAq0bZcFPuFFBmZEtXU1EarHLigE+ENCtpO+37NHCl4+Yokq1P/d09kUblObaikwfo97w+0FtG/EXl5Ng==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.8.tgz", + "integrity": "sha512-ihSE9D3xQAupNg/aGDZaukqoUSXG2KfstWosVmFCG7jbMQPaj2ivxWtsB+CnYY/T4D6LX1GHKixwJLunNCffww==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -1306,18 +1349,23 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/select": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.6.tgz", - "integrity": "sha512-yANzIiNZ8fhMm4NORm+a74+KFYHmf7BZphSOBovIzYPVLquseTGEkU5l2UTnBOf5k0VLmTgPighNDLE9QtbViQ==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.8.tgz", + "integrity": "sha512-Io2prxFyN2jOCcu4qJbVoilo19caiD3kqkD3WR0q3yDA5HUCo83v4LrRtg55ZwniYACW64z36eV7gyVbOfORjA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -1326,12 +1374,17 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/type": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.2.tgz", - "integrity": "sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.4.tgz", + "integrity": "sha512-2MNFrDY8jkFYc9Il9DgLsHhMzuHnOYM1+CUYVWbzu9oT0hC7V7EcYvdCKeoll/Fcci04A+ERZ9wcc7cQ8lTkIA==", "dev": true, "license": "MIT", "engines": { @@ -1339,6 +1392,11 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@isaacs/cliui": { @@ -1359,19 +1417,6 @@ "node": ">=12" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", @@ -1410,22 +1455,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -2195,9 +2224,9 @@ } }, "node_modules/@npmcli/redact": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.0.0.tgz", - "integrity": "sha512-/1uFzjVcfzqrgCeGW7+SZ4hv0qLWmKXVzFahZGJ6QuJBj6Myt9s17+JL86i76NV9YSnJRcGXJYQbAU0rn1YTCQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.1.1.tgz", + "integrity": "sha512-3Hc2KGIkrvJWJqTbvueXzBeZlmvoOxc2jyX00yzr3+sNFquJg0N8hH4SAPLPVrkWIRQICVpVgjrss971awXVnA==", "dev": true, "license": "ISC", "engines": { @@ -2223,9 +2252,9 @@ } }, "node_modules/@parcel/watcher": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", - "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2244,25 +2273,25 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.0", - "@parcel/watcher-darwin-arm64": "2.5.0", - "@parcel/watcher-darwin-x64": "2.5.0", - "@parcel/watcher-freebsd-x64": "2.5.0", - "@parcel/watcher-linux-arm-glibc": "2.5.0", - "@parcel/watcher-linux-arm-musl": "2.5.0", - "@parcel/watcher-linux-arm64-glibc": "2.5.0", - "@parcel/watcher-linux-arm64-musl": "2.5.0", - "@parcel/watcher-linux-x64-glibc": "2.5.0", - "@parcel/watcher-linux-x64-musl": "2.5.0", - "@parcel/watcher-win32-arm64": "2.5.0", - "@parcel/watcher-win32-ia32": "2.5.0", - "@parcel/watcher-win32-x64": "2.5.0" + "@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.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", - "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", + "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" ], @@ -2281,9 +2310,9 @@ } }, "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", - "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "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" ], @@ -2302,9 +2331,9 @@ } }, "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", - "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", + "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" ], @@ -2323,9 +2352,9 @@ } }, "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", - "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "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" ], @@ -2344,9 +2373,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", - "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "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" ], @@ -2365,9 +2394,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", - "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "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" ], @@ -2386,9 +2415,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", - "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "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" ], @@ -2407,9 +2436,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", - "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "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" ], @@ -2428,9 +2457,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", - "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "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" ], @@ -2449,9 +2478,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", - "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "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" ], @@ -2470,9 +2499,9 @@ } }, "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", - "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "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" ], @@ -2491,9 +2520,9 @@ } }, "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", - "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "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" ], @@ -2512,9 +2541,9 @@ } }, "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", - "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", + "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" ], @@ -2832,14 +2861,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.4.tgz", - "integrity": "sha512-HFf83SoXbj1K4jkYSSfCg/oXkmSGBx0zG1Lh+dE5GZFdTQmykrBY519aSdrqLVyZzKYjTGfDfSewUeO4a0GE2A==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.7.tgz", + "integrity": "sha512-BB8yMGmYDZzSb8Nu+Ln0TKyeoS3++f9STCYw30NwM3IViHxJJYxu/zowzwSa9TjftIzdCpbOaPxGS0vU9UOUDQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.4", - "@angular-devkit/schematics": "19.1.4", + "@angular-devkit/core": "19.1.7", + "@angular-devkit/schematics": "19.1.7", "jsonc-parser": "3.3.1" }, "engines": { @@ -2849,13 +2878,13 @@ } }, "node_modules/@sigstore/bundle": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.0.0.tgz", - "integrity": "sha512-XDUYX56iMPAn/cdgh/DTJxz5RWmqKV4pwvUAEKEWJl+HzKdCd/24wUa9JYNMlDSCb7SUHAdtksxYX779Nne/Zg==", + "version": "3.1.0", + "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": { - "@sigstore/protobuf-specs": "^0.3.2" + "@sigstore/protobuf-specs": "^0.4.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -2872,9 +2901,9 @@ } }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.3.tgz", - "integrity": "sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.0.tgz", + "integrity": "sha512-o09cLSIq9EKyRXwryWDOJagkml9XgQCoCSRjHOnHLnvsivaW7Qznzz6yjfV7PHJHhIvyp8OH7OX8w0Dc5bQK7A==", "dev": true, "license": "Apache-2.0", "engines": { @@ -2882,16 +2911,16 @@ } }, "node_modules/@sigstore/sign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.0.0.tgz", - "integrity": "sha512-UjhDMQOkyDoktpXoc5YPJpJK6IooF2gayAr5LvXI4EL7O0vd58okgfRcxuaH+YTdhvb5aa1Q9f+WJ0c2sVuYIw==", + "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.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "make-fetch-happen": "^14.0.1", + "@sigstore/protobuf-specs": "^0.4.0", + "make-fetch-happen": "^14.0.2", "proc-log": "^5.0.0", "promise-retry": "^2.0.1" }, @@ -2900,13 +2929,13 @@ } }, "node_modules/@sigstore/tuf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.0.0.tgz", - "integrity": "sha512-9Xxy/8U5OFJu7s+OsHzI96IX/OzjF/zj0BSSaWhgJgTqtlBhQIV2xdrQI5qxLD7+CWWDepadnXAxzaZ3u9cvRw==", + "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": { - "@sigstore/protobuf-specs": "^0.3.2", + "@sigstore/protobuf-specs": "^0.4.0", "tuf-js": "^3.0.1" }, "engines": { @@ -2914,15 +2943,15 @@ } }, "node_modules/@sigstore/verify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.0.0.tgz", - "integrity": "sha512-Ggtq2GsJuxFNUvQzLoXqRwS4ceRfLAJnrIHUDrzAD0GgnOhwujJkKkxM/s5Bako07c3WtAs/sZo5PJq7VHjeDg==", + "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": { - "@sigstore/bundle": "^3.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2" + "@sigstore/protobuf-specs": "^0.4.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -2960,9 +2989,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.10.tgz", - "integrity": "sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww==", + "version": "22.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", + "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", "dev": true, "license": "MIT", "peer": true, @@ -3062,13 +3091,16 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/ansi-styles": { @@ -3321,9 +3353,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001695", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz", - "integrity": "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==", + "version": "1.0.30001699", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz", + "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==", "dev": true, "funding": [ { @@ -3462,6 +3494,16 @@ "node": ">=12" } }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -3494,6 +3536,19 @@ "node": ">=8" } }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -3733,9 +3788,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.87", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.87.tgz", - "integrity": "sha512-mPFwmEWmRivw2F8x3w3l2m6htAUN97Gy0kwpO++2m9iT1Gt8RCFVUfv9U/sIbHJ6rY4P6/ooqFL/eL7ock+pPg==", + "version": "1.5.100", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.100.tgz", + "integrity": "sha512-u1z9VuzDXV86X2r3vAns0/5ojfXBue9o0+JDUDBKYqGLjxLkSqsSUoPU/6kW0gx76V44frHaf6Zo+QF74TQCMg==", "dev": true, "license": "ISC" }, @@ -3873,9 +3928,9 @@ "license": "MIT" }, "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", + "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", "dev": true, "license": "Apache-2.0" }, @@ -3936,9 +3991,9 @@ "license": "BSD-3-Clause" }, "node_modules/fastq": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", - "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", + "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", "dev": true, "license": "ISC", "dependencies": { @@ -4527,19 +4582,6 @@ "node": ">=18.0.0" } }, - "node_modules/listr2/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, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/listr2/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", @@ -4553,22 +4595,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/listr2/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, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/listr2/node_modules/wrap-ansi": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", @@ -4667,19 +4693,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/log-update/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", @@ -4726,22 +4739,6 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/log-update/node_modules/wrap-ansi": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", @@ -5145,9 +5142,9 @@ "optional": true }, "node_modules/node-gyp": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.0.0.tgz", - "integrity": "sha512-zQS+9MTTeCMgY0F3cWPyJyRFAkVltQ1uXm+xXu/ES6KFgC6Czo1Seb9vQW2wNxSX2OrDTiqL0ojtkFxBQ0ypIw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.1.0.tgz", + "integrity": "sha512-/+7TuHKnBpnMvUQnsYEb0JOozDZqarQbfNuSGLXIjhStMT0fbw7IdSqWgopOP5xhRZE+lsbIvAHcekddruPZgQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5416,6 +5413,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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": ">=8" + } + }, "node_modules/ora/node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -5466,6 +5473,19 @@ "dev": true, "license": "ISC" }, + "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": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ordered-binary": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.3.tgz", @@ -5649,9 +5669,9 @@ } }, "node_modules/postcss": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", - "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", + "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", "dev": true, "funding": [ { @@ -5752,9 +5772,9 @@ } }, "node_modules/readdirp": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz", - "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, "license": "MIT", "engines": { @@ -6045,18 +6065,18 @@ } }, "node_modules/sigstore": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.0.0.tgz", - "integrity": "sha512-PHMifhh3EN4loMcHCz6l3v/luzgT3za+9f8subGgeMNjbJjzH4Ij/YoX3Gvu+kaouJRIlVdTHHCREADYf+ZteA==", + "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.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "@sigstore/sign": "^3.0.0", - "@sigstore/tuf": "^3.0.0", - "@sigstore/verify": "^2.0.0" + "@sigstore/protobuf-specs": "^0.4.0", + "@sigstore/sign": "^3.1.0", + "@sigstore/tuf": "^3.1.0", + "@sigstore/verify": "^2.1.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -6104,9 +6124,9 @@ } }, "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", + "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6253,6 +6273,16 @@ "node": ">=8" } }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -6270,20 +6300,20 @@ "node": ">=8" } }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "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, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "ansi-regex": "^5.0.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=8" } }, - "node_modules/string-width/node_modules/strip-ansi": { + "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==", @@ -6299,7 +6329,8 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/strip-ansi": { + "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==", @@ -6312,16 +6343,12 @@ "node": ">=8" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "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, "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { "node": ">=8" } @@ -6618,9 +6645,9 @@ } }, "node_modules/vite": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.7.tgz", - "integrity": "sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==", + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz", + "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==", "dev": true, "license": "MIT", "dependencies": { @@ -6771,6 +6798,16 @@ "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", @@ -6803,6 +6840,29 @@ "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-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", @@ -6835,6 +6895,19 @@ "node": ">=8" } }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -6881,6 +6954,16 @@ "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==", + "dev": true, + "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", @@ -6913,6 +6996,19 @@ "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yoctocolors-cjs": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", diff --git a/adev/src/content/tutorials/first-app/common/package-lock.json b/adev/src/content/tutorials/first-app/common/package-lock.json index 7c2d64b352ab..7ec817557892 100644 --- a/adev/src/content/tutorials/first-app/common/package-lock.json +++ b/adev/src/content/tutorials/first-app/common/package-lock.json @@ -54,13 +54,13 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1901.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.4.tgz", - "integrity": "sha512-EoRTN8p7z0YnqOEIJKKu/NwSsCJxFkyGuZOobz7btnUWwlDqG8CNAhJgtlsOXPihwEkHEkzRIm1feDkWEjCYsA==", + "version": "0.1901.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.7.tgz", + "integrity": "sha512-qltyebfbej7joIKZVH8EFfrVDrkw0p9N9ja3A0XeU1sl2vlepHNAQdVm0Os8Vy2XjjyHvT5bXWE3G3/221qEKw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.4", + "@angular-devkit/core": "19.1.7", "rxjs": "7.8.1" }, "engines": { @@ -70,17 +70,17 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.1.4.tgz", - "integrity": "sha512-t8qC26Boz1aAMt2xVKthwEXRqMI4ZVwelxRNfHryLdLTujTaehFt3qbjxukMmRGCWmQObauH0UOvDh3pAA24dQ==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.1.7.tgz", + "integrity": "sha512-CMl3D5cpXoY0WuvdYtuOU2TetCwqxNsYM2jpuGG/kuuTEASAOI1cs9OhGwny1A/63bB8eyL33eLe82ON2Oemow==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1901.4", - "@angular-devkit/build-webpack": "0.1901.4", - "@angular-devkit/core": "19.1.4", - "@angular/build": "19.1.4", + "@angular-devkit/architect": "0.1901.7", + "@angular-devkit/build-webpack": "0.1901.7", + "@angular-devkit/core": "19.1.7", + "@angular/build": "19.1.7", "@babel/core": "7.26.0", "@babel/generator": "7.26.3", "@babel/helper-annotate-as-pure": "7.25.9", @@ -91,7 +91,7 @@ "@babel/preset-env": "7.26.0", "@babel/runtime": "7.26.0", "@discoveryjs/json-ext": "0.6.3", - "@ngtools/webpack": "19.1.4", + "@ngtools/webpack": "19.1.7", "@vitejs/plugin-basic-ssl": "1.2.0", "ansi-colors": "4.1.3", "autoprefixer": "10.4.20", @@ -145,7 +145,7 @@ "@angular/localize": "^19.0.0", "@angular/platform-server": "^19.0.0", "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.1.4", + "@angular/ssr": "^19.1.7", "@web/test-runner": "^0.19.0", "browser-sync": "^3.0.2", "jest": "^29.5.0", @@ -153,7 +153,7 @@ "karma": "^6.3.0", "ng-packagr": "^19.0.0", "protractor": "^7.0.0", - "tailwindcss": "^2.0.0 || ^3.0.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", "typescript": ">=5.5 <5.8" }, "peerDependenciesMeta": { @@ -196,9 +196,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@types/node": { - "version": "22.10.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.10.tgz", - "integrity": "sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww==", + "version": "22.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", + "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", "dev": true, "license": "MIT", "optional": true, @@ -221,16 +221,16 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/vite": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz", - "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.0.tgz", + "integrity": "sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { "esbuild": "^0.24.2", - "postcss": "^8.4.49", - "rollup": "^4.23.0" + "postcss": "^8.5.1", + "rollup": "^4.30.1" }, "bin": { "vite": "bin/vite.js" @@ -293,14 +293,44 @@ } } }, + "node_modules/@angular-devkit/build-angular/node_modules/vite/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", + "peer": true, + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1901.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1901.4.tgz", - "integrity": "sha512-C/Cd1JeRTy2P/powIldc5UZObw92TDGATD/LFlfPfi94celLa2DlEL1ybPTpnGs/R5/q5R26F6fbhmAVSeTJ8g==", + "version": "0.1901.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1901.7.tgz", + "integrity": "sha512-g7xPN7unBnqP9HsgFvEV1DIhNYmVwmWR9ZiSP0xJq+EjpjWlz2vmgru4a5WKwGeuLsP8vg7RKV0kCH3bunOmFA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1901.4", + "@angular-devkit/architect": "0.1901.7", "rxjs": "7.8.1" }, "engines": { @@ -314,9 +344,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.4.tgz", - "integrity": "sha512-IDvSSiQgaixH2RtZtIpq1+XaHeuzMiTWfDyNF9DuYcU+S8CdG1SWrc8d59tmOrM/q+IRGyFgbBhTU1un52hNHw==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.7.tgz", + "integrity": "sha512-q0I6L9KTqyQ7D5M8H+fWLT+yjapvMNb7SRdfU6GzmexO66Dpo83q4HDzuDKIPDF29Yl0ELs9ICJqe9yUXh6yDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -342,13 +372,13 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.4.tgz", - "integrity": "sha512-EKXBkx6EDcvyO+U68w/eXicRaF92zSSzYNvR3tMZszEKYE6xBr3kZxY99PP54HXQHR4zYwLvFJVp+T6bnvte2w==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.7.tgz", + "integrity": "sha512-AP6FvhMybCYs3gs+vzEAzSU1K//AFT3SVTRFv+C3WMO5dLeAHeGzM8I2dxD5EHQQtqIE/8apP6CxGrnpA5YlFg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.4", + "@angular-devkit/core": "19.1.7", "jsonc-parser": "3.3.1", "magic-string": "0.30.17", "ora": "5.4.1", @@ -361,9 +391,9 @@ } }, "node_modules/@angular/animations": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.1.3.tgz", - "integrity": "sha512-MI+Tbp9OOisrQtTQH7o+xiQCODXicCs8WHNpGzdCpnXdRkQuVSOb6xAjD9OXJqcQGotLgeyennnkIJGXdz4RTA==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.1.6.tgz", + "integrity": "sha512-iacosz3fygp0AyT57+suVpLChl10xS5RBje09TfQIKHTUY0LWkMspgaK9gwtlflpIhjedPV0UmgRIKhhFcQM1A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -372,18 +402,19 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.1.3" + "@angular/core": "19.1.6" } }, "node_modules/@angular/build": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.4.tgz", - "integrity": "sha512-yfvLeUT2a8JTuVBY259vsSv0uLyhikHHgQcWa3VSr0TvCKrwCsBIFDq7vqmhLqIVWi/Z4D7n3J5JQAbDrl38Sg==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.7.tgz", + "integrity": "sha512-22SjHZDTk91JHU5aFVDU2n+xkPolDosRVfsK4zs+RRXQs30LYPH9KCLiUWCYjFbRj7oYvw7sbrs94szo7dWYvw==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1901.4", + "@angular-devkit/architect": "0.1901.7", + "@angular-devkit/core": "19.1.7", "@babel/core": "7.26.0", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", @@ -405,7 +436,7 @@ "rollup": "4.30.1", "sass": "1.83.1", "semver": "7.6.3", - "vite": "6.0.7", + "vite": "6.0.11", "watchpack": "2.4.2" }, "engines": { @@ -422,11 +453,11 @@ "@angular/localize": "^19.0.0", "@angular/platform-server": "^19.0.0", "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.1.4", + "@angular/ssr": "^19.1.7", "less": "^4.2.0", "ng-packagr": "^19.0.0", "postcss": "^8.4.0", - "tailwindcss": "^2.0.0 || ^3.0.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", "typescript": ">=5.5 <5.8" }, "peerDependenciesMeta": { @@ -473,10 +504,38 @@ "@types/node": ">=18" } }, + "node_modules/@angular/build/node_modules/@inquirer/core": { + "version": "10.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.6.tgz", + "integrity": "sha512-Bwh/Zk6URrHwZnSSzAZAKH7YgGYi0xICIBDFOqBQoXNNAzBHw/bgXgLmChfp+GyR3PnChcTbiCTZGC6YJNJkMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", + "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": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/@angular/build/node_modules/@inquirer/type": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.2.tgz", - "integrity": "sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.4.tgz", + "integrity": "sha512-2MNFrDY8jkFYc9Il9DgLsHhMzuHnOYM1+CUYVWbzu9oT0hC7V7EcYvdCKeoll/Fcci04A+ERZ9wcc7cQ8lTkIA==", "dev": true, "license": "MIT", "engines": { @@ -484,12 +543,17 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@angular/build/node_modules/@types/node": { - "version": "22.10.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.10.tgz", - "integrity": "sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww==", + "version": "22.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", + "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", "dev": true, "license": "MIT", "peer": true, @@ -510,10 +574,81 @@ "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, + "node_modules/@angular/build/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, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular/build/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/@angular/build/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/@angular/build/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/@angular/build/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/@angular/build/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@angular/build/node_modules/vite": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.7.tgz", - "integrity": "sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==", + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz", + "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==", "dev": true, "license": "MIT", "dependencies": { @@ -582,19 +717,34 @@ } } }, + "node_modules/@angular/build/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, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@angular/cli": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.4.tgz", - "integrity": "sha512-C1Z2OTLjUJIkLsay6RJ1rzY0Tdb1Mj/cBh9dZryDstuits8G0Tphe36hnLownnoHspFQfjSRtVzF4NwKiDlQRw==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.7.tgz", + "integrity": "sha512-qVEy0R4QKQ2QAGfpj2mPVxRxgOVst+rIgZBtLwf/mrbN9YyzJUaBKvaVslUpOqkvoW9mX5myf0iZkT5NykrIoA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1901.4", - "@angular-devkit/core": "19.1.4", - "@angular-devkit/schematics": "19.1.4", + "@angular-devkit/architect": "0.1901.7", + "@angular-devkit/core": "19.1.7", + "@angular-devkit/schematics": "19.1.7", "@inquirer/prompts": "7.2.1", "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.1.4", + "@schematics/angular": "19.1.7", "@yarnpkg/lockfile": "1.1.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", @@ -617,15 +767,15 @@ } }, "node_modules/@angular/cli/node_modules/@inquirer/checkbox": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.6.tgz", - "integrity": "sha512-PgP35JfmGjHU0LSXOyRew0zHuA9N6OJwOlos1fZ20b7j8ISeAdib3L+n0jIxBtX958UeEpte6xhG/gxJ5iUqMw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.1.tgz", + "integrity": "sha512-os5kFd/52gZTl/W6xqMfhaKVJHQM8V/U1P8jcSaQJ/C4Qhdrf2jEXdA/HaxfQs9iiUA/0yzYhk5d3oRHTxGDDQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -634,34 +784,72 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@angular/cli/node_modules/@inquirer/confirm": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.3.tgz", - "integrity": "sha512-fuF9laMmHoOgWapF9h9hv6opA5WvmGFHsTYGCmuFxcghIhEhb3dN0CdQR4BUMqa2H506NCj8cGX4jwMsE4t6dA==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.5.tgz", + "integrity": "sha512-ZB2Cz8KeMINUvoeDi7IrvghaVkYT2RB0Zb31EaLWOE87u276w4wnApv0SH2qWaJ3r0VSUa3BIuz7qAV2ZvsZlg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2" + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@angular/cli/node_modules/@inquirer/core": { + "version": "10.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.6.tgz", + "integrity": "sha512-Bwh/Zk6URrHwZnSSzAZAKH7YgGYi0xICIBDFOqBQoXNNAzBHw/bgXgLmChfp+GyR3PnChcTbiCTZGC6YJNJkMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", + "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": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@angular/cli/node_modules/@inquirer/editor": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.3.tgz", - "integrity": "sha512-S9KnIOJuTZpb9upeRSBBhoDZv7aSV3pG9TECrBj0f+ZsFwccz886hzKBrChGrXMJwd4NKY+pOA9Vy72uqnd6Eg==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.6.tgz", + "integrity": "sha512-l0smvr8g/KAVdXx4I92sFxZiaTG4kFc06cFZw+qqwTirwdUHMFLnouXBB9OafWhpO3cfEkEz2CdPoCmor3059A==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "external-editor": "^3.1.0" }, "engines": { @@ -669,17 +857,22 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@angular/cli/node_modules/@inquirer/expand": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.6.tgz", - "integrity": "sha512-TRTfi1mv1GeIZGyi9PQmvAaH65ZlG4/FACq6wSzs7Vvf1z5dnNWsAAXBjWMHt76l+1hUY8teIqJFrWBk5N6gsg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.8.tgz", + "integrity": "sha512-k0ouAC6L+0Yoj/j0ys2bat0fYcyFVtItDB7h+pDFKaDDSFJey/C/YY1rmIOqkmFVZ5rZySeAQuS8zLcKkKRLmg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -687,51 +880,66 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@angular/cli/node_modules/@inquirer/input": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.3.tgz", - "integrity": "sha512-zeo++6f7hxaEe7OjtMzdGZPHiawsfmCZxWB9X1NpmYgbeoyerIbWemvlBxxl+sQIlHC0WuSAG19ibMq3gbhaqQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.5.tgz", + "integrity": "sha512-bB6wR5wBCz5zbIVBPnhp94BHv/G4eKbUEjlpCw676pI2chcvzTx1MuwZSCZ/fgNOdqDlAxkhQ4wagL8BI1D3Zg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2" + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@angular/cli/node_modules/@inquirer/number": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.6.tgz", - "integrity": "sha512-xO07lftUHk1rs1gR0KbqB+LJPhkUNkyzV/KhH+937hdkMazmAYHLm1OIrNKpPelppeV1FgWrgFDjdUD8mM+XUg==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.8.tgz", + "integrity": "sha512-CTKs+dT1gw8dILVWATn8Ugik1OHLkkfY82J+Musb57KpmF6EKyskv8zmMiEJPzOnLTZLo05X/QdMd8VH9oulXw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2" + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@angular/cli/node_modules/@inquirer/password": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.6.tgz", - "integrity": "sha512-QLF0HmMpHZPPMp10WGXh6F+ZPvzWE7LX6rNoccdktv/Rov0B+0f+eyXkAcgqy5cH9V+WSpbLxu2lo3ysEVK91w==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.8.tgz", + "integrity": "sha512-MgA+Z7o3K1df2lGY649fyOBowHGfrKRz64dx3+b6c1w+h2W7AwBoOkHhhF/vfhbs5S4vsKNCuDzS3s9r5DpK1g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2" }, "engines": { @@ -739,6 +947,11 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@angular/cli/node_modules/@inquirer/prompts": { @@ -767,14 +980,14 @@ } }, "node_modules/@angular/cli/node_modules/@inquirer/rawlist": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.6.tgz", - "integrity": "sha512-QoE4s1SsIPx27FO4L1b1mUjVcoHm1pWE/oCmm4z/Hl+V1Aw5IXl8FYYzGmfXaBT0l/sWr49XmNSiq7kg3Kd/Lg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.8.tgz", + "integrity": "sha512-hl7rvYW7Xl4un8uohQRUgO6uc2hpn7PKqfcGkCOWC0AA4waBxAv6MpGOFCEDrUaBCP+pXPVqp4LmnpWmn1E1+g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -782,18 +995,23 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@angular/cli/node_modules/@inquirer/search": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.6.tgz", - "integrity": "sha512-eFZ2hiAq0bZcFPuFFBmZEtXU1EarHLigE+ENCtpO+37NHCl4+Yokq1P/d09kUblObaikwfo97w+0FtG/EXl5Ng==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.8.tgz", + "integrity": "sha512-ihSE9D3xQAupNg/aGDZaukqoUSXG2KfstWosVmFCG7jbMQPaj2ivxWtsB+CnYY/T4D6LX1GHKixwJLunNCffww==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -801,18 +1019,23 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@angular/cli/node_modules/@inquirer/select": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.6.tgz", - "integrity": "sha512-yANzIiNZ8fhMm4NORm+a74+KFYHmf7BZphSOBovIzYPVLquseTGEkU5l2UTnBOf5k0VLmTgPighNDLE9QtbViQ==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.8.tgz", + "integrity": "sha512-Io2prxFyN2jOCcu4qJbVoilo19caiD3kqkD3WR0q3yDA5HUCo83v4LrRtg55ZwniYACW64z36eV7gyVbOfORjA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -821,12 +1044,17 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@angular/cli/node_modules/@inquirer/type": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.2.tgz", - "integrity": "sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.4.tgz", + "integrity": "sha512-2MNFrDY8jkFYc9Il9DgLsHhMzuHnOYM1+CUYVWbzu9oT0hC7V7EcYvdCKeoll/Fcci04A+ERZ9wcc7cQ8lTkIA==", "dev": true, "license": "MIT", "engines": { @@ -834,6 +1062,11 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@angular/cli/node_modules/@listr2/prompt-adapter-inquirer": { @@ -865,10 +1098,20 @@ "node": ">=18" } }, + "node_modules/@angular/cli/node_modules/@listr2/prompt-adapter-inquirer/node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/@angular/cli/node_modules/@types/node": { - "version": "22.10.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.10.tgz", - "integrity": "sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww==", + "version": "22.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", + "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", "dev": true, "license": "MIT", "peer": true, @@ -892,20 +1135,80 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular/cli/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==", + "node_modules/@angular/cli/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": "ISC", + "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=8" + } + }, + "node_modules/@angular/cli/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/@angular/cli/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/@angular/cli/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/@angular/cli/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/cli/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, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/@angular/common": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.3.tgz", - "integrity": "sha512-r1P0W6FKrON83szIJboF8z6UNCVL4HIxyD+nhmHMMT/iJpu4kDHVugaN/+w2jYLb4oelAJK5xzkzA+1IaHpzLg==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.6.tgz", + "integrity": "sha512-FkuejwbxsOLhcyOgDM/7YEYvMG3tuyOvr+831VzPwMwYp5QO9AUYtn4ffGf698JccbA+Ocw3BAdhPU6i+YZC1A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -914,14 +1217,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.1.3", + "@angular/core": "19.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.3.tgz", - "integrity": "sha512-omX5Gyt3zlJVTUteO2YxsqYWtAIpkvs8kRYSUsLTi79V1gbGo+J1TawFuyBTrWxj4UtTGvwmDgZxiCIwMtP5KQ==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.6.tgz", + "integrity": "sha512-Tl2PFEtnU8UgSqtEKG827xDUGZrErhR6S1JICeV1kbRCYmwQA4hhG25tzi+ifSAOPW7eJiyzP2LWIvOuZkq3Vw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -930,7 +1233,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.1.3" + "@angular/core": "19.1.6" }, "peerDependenciesMeta": { "@angular/core": { @@ -939,9 +1242,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.3.tgz", - "integrity": "sha512-nDBvZenQECcr9CClmTp3iJNilRQ6oDKFgBkhlWffEFBx0Z6kBA36MXKKLuCkf31D+NGmt5VJlAkl8Ax8BJ9qJw==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.6.tgz", + "integrity": "sha512-rTpHC/tfLBj+5a3X+BA/4s2w5T/cHT6x3RgO8CYy7003Musn0/BiqjfE6VCIllQgLaOQRhCcf51T6Kerkzv8Dw==", "dev": true, "license": "MIT", "dependencies": { @@ -963,14 +1266,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.1.3", + "@angular/compiler": "19.1.6", "typescript": ">=5.5 <5.8" } }, "node_modules/@angular/core": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.3.tgz", - "integrity": "sha512-Hh1eHvi+y+gsTRODiEEEWnRj5zqv9WNoou1KmQ1mv1NTOf0Pv61Hg9P2rBWDr0mPIXFSzqUKjyzW30BgdQ+AEA==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.6.tgz", + "integrity": "sha512-FD167URT+apxjzj9sG/MzffW5G6YyQiPQ6nrrIoYi9jeY3LYurybuOgvcXrU8PT4Z3+CKMq9k/ZnmrlHU72BpA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -984,9 +1287,9 @@ } }, "node_modules/@angular/forms": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.3.tgz", - "integrity": "sha512-M6eEJBysJm9zSUhm8ggljZCsgHLccZl70P34tyddb8erh9it2uoOXW0aVaZgDt1UAiF5a1EzjdVdN4TZTT/OGA==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.6.tgz", + "integrity": "sha512-uu/76KAwCAcDuhD67Vv78UvOC/tiprtFXOgqNCj0LK8vyFcvPsunb3nF/PtfF9rSHyslXAqxZhME+Ha2tU6Lpw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -995,16 +1298,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.1.3", - "@angular/core": "19.1.3", - "@angular/platform-browser": "19.1.3", + "@angular/common": "19.1.6", + "@angular/core": "19.1.6", + "@angular/platform-browser": "19.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.3.tgz", - "integrity": "sha512-bLgnM2hRyzUdoWRoUhe+IMenlr74EvrgwyG7anJ27bjg5PcvhQPXrGqU0hri5yPDb9SHVJZminr7OjNCN8QJkQ==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.6.tgz", + "integrity": "sha512-sfWU+gMpqQ6GYtE3tAfDktftC01NgtqAOKfeCQ/KY2rxRTIxYahenW0Licuzgmd+8AZtmncoZaYX0Fd/5XMqzQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1013,9 +1316,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "19.1.3", - "@angular/common": "19.1.3", - "@angular/core": "19.1.3" + "@angular/animations": "19.1.6", + "@angular/common": "19.1.6", + "@angular/core": "19.1.6" }, "peerDependenciesMeta": { "@angular/animations": { @@ -1024,9 +1327,9 @@ } }, "node_modules/@angular/router": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.1.3.tgz", - "integrity": "sha512-DJ9BgvtxJV6xohaPQXPdBsFCZoQIEq2OPDyKcoW4L0ST4kIIFpHyI6wJ+AlPnLkhSwmOOoHciH0oxZ2xPVxmiQ==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.1.6.tgz", + "integrity": "sha512-TEfw3W5jVodVDMD4krhXGog1THZN3x1yoh2oZmCv3lXg22+pVC6Cp+x3vVExq0mS+g3/6uZwy/3qAYdlzqYjTg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1035,9 +1338,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.1.3", - "@angular/core": "19.1.3", - "@angular/platform-browser": "19.1.3", + "@angular/common": "19.1.6", + "@angular/core": "19.1.6", + "@angular/platform-browser": "19.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -1057,9 +1360,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", - "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true, "license": "MIT", "engines": { @@ -1172,18 +1475,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", - "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.26.9.tgz", + "integrity": "sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==", "dev": true, "license": "MIT", "dependencies": { "@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.25.9", + "@babel/helper-replace-supers": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.25.9", + "@babel/traverse": "^7.26.9", "semver": "^6.3.1" }, "engines": { @@ -1426,27 +1729,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz", - "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", + "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.7" + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", - "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", + "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.7" + "@babel/types": "^7.26.9" }, "bin": { "parser": "bin/babel-parser.js" @@ -1872,13 +2175,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", - "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", + "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.25.9", + "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { @@ -2371,13 +2674,13 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", - "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", + "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.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -2592,32 +2895,32 @@ } }, "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz", - "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", + "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.5", - "@babel/parser": "^7.26.7", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.7", + "@babel/generator": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2626,14 +2929,14 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", - "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", + "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.5", - "@babel/types": "^7.26.5", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -2643,9 +2946,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", - "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", + "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", "dev": true, "license": "MIT", "dependencies": { @@ -3125,141 +3428,10 @@ "node": ">=18" } }, - "node_modules/@inquirer/core": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.4.tgz", - "integrity": "sha512-5y4/PUJVnRb4bwWY67KLdebWOhOc7xj5IP2J80oWXa64mVag24rwQ1VAdnj7/eDY/odhguW0zQ1Mp1pj6fO/2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", - "ansi-escapes": "^4.3.2", - "cli-width": "^4.1.0", - "mute-stream": "^2.0.0", - "signal-exit": "^4.1.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/core/node_modules/@inquirer/type": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.2.tgz", - "integrity": "sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - } - }, - "node_modules/@inquirer/core/node_modules/@types/node": { - "version": "22.10.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.10.tgz", - "integrity": "sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "undici-types": "~6.20.0" - } - }, - "node_modules/@inquirer/core/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, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@inquirer/core/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/@inquirer/core/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/@inquirer/core/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/@inquirer/core/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/@inquirer/core/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@inquirer/core/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, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@inquirer/figures": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.9.tgz", - "integrity": "sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.10.tgz", + "integrity": "sha512-Ey6176gZmeqZuY/W/nZiUyvmb1/qInjcpiZjXWi6nON+nxJpD1bxtSoBxNliGISae32n6OwbY+TSXPZ1CfS4bw==", "dev": true, "license": "MIT", "engines": { @@ -3965,9 +4137,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.1.4.tgz", - "integrity": "sha512-ZmUlbVqu/pz8abxVxNCKgKeY5g2MX1NsKxhM8rRV5tVV/MaAtSYNHgmFSYcKWA178v7k6BUuhnoNNxl5qqc1kw==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.1.7.tgz", + "integrity": "sha512-U39LVqHWj+GtKzBA3+AseHZgLPlL5YE/iRkZJ4PHQVrgW9LtyMzPuUmnW+e0XQwPFHq9xQxaoj3w8gApj4/MIg==", "dev": true, "license": "MIT", "engines": { @@ -4243,9 +4415,9 @@ } }, "node_modules/@npmcli/redact": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.0.0.tgz", - "integrity": "sha512-/1uFzjVcfzqrgCeGW7+SZ4hv0qLWmKXVzFahZGJ6QuJBj6Myt9s17+JL86i76NV9YSnJRcGXJYQbAU0rn1YTCQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.1.1.tgz", + "integrity": "sha512-3Hc2KGIkrvJWJqTbvueXzBeZlmvoOxc2jyX00yzr3+sNFquJg0N8hH4SAPLPVrkWIRQICVpVgjrss971awXVnA==", "dev": true, "license": "ISC", "engines": { @@ -4297,9 +4469,9 @@ } }, "node_modules/@parcel/watcher": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", - "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4318,25 +4490,25 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.0", - "@parcel/watcher-darwin-arm64": "2.5.0", - "@parcel/watcher-darwin-x64": "2.5.0", - "@parcel/watcher-freebsd-x64": "2.5.0", - "@parcel/watcher-linux-arm-glibc": "2.5.0", - "@parcel/watcher-linux-arm-musl": "2.5.0", - "@parcel/watcher-linux-arm64-glibc": "2.5.0", - "@parcel/watcher-linux-arm64-musl": "2.5.0", - "@parcel/watcher-linux-x64-glibc": "2.5.0", - "@parcel/watcher-linux-x64-musl": "2.5.0", - "@parcel/watcher-win32-arm64": "2.5.0", - "@parcel/watcher-win32-ia32": "2.5.0", - "@parcel/watcher-win32-x64": "2.5.0" + "@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.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", - "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", + "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" ], @@ -4355,9 +4527,9 @@ } }, "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", - "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "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" ], @@ -4376,9 +4548,9 @@ } }, "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", - "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", + "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" ], @@ -4397,9 +4569,9 @@ } }, "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", - "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "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" ], @@ -4418,9 +4590,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", - "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "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" ], @@ -4439,9 +4611,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", - "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "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" ], @@ -4460,9 +4632,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", - "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "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" ], @@ -4481,9 +4653,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", - "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "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" ], @@ -4502,9 +4674,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", - "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "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" ], @@ -4523,9 +4695,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", - "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "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" ], @@ -4544,9 +4716,9 @@ } }, "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", - "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "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" ], @@ -4565,9 +4737,9 @@ } }, "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", - "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "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" ], @@ -4586,9 +4758,9 @@ } }, "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", - "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", + "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" ], @@ -4906,14 +5078,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.4.tgz", - "integrity": "sha512-HFf83SoXbj1K4jkYSSfCg/oXkmSGBx0zG1Lh+dE5GZFdTQmykrBY519aSdrqLVyZzKYjTGfDfSewUeO4a0GE2A==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.7.tgz", + "integrity": "sha512-BB8yMGmYDZzSb8Nu+Ln0TKyeoS3++f9STCYw30NwM3IViHxJJYxu/zowzwSa9TjftIzdCpbOaPxGS0vU9UOUDQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.4", - "@angular-devkit/schematics": "19.1.4", + "@angular-devkit/core": "19.1.7", + "@angular-devkit/schematics": "19.1.7", "jsonc-parser": "3.3.1" }, "engines": { @@ -4923,13 +5095,13 @@ } }, "node_modules/@sigstore/bundle": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.0.0.tgz", - "integrity": "sha512-XDUYX56iMPAn/cdgh/DTJxz5RWmqKV4pwvUAEKEWJl+HzKdCd/24wUa9JYNMlDSCb7SUHAdtksxYX779Nne/Zg==", + "version": "3.1.0", + "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": { - "@sigstore/protobuf-specs": "^0.3.2" + "@sigstore/protobuf-specs": "^0.4.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -4946,9 +5118,9 @@ } }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.3.tgz", - "integrity": "sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.0.tgz", + "integrity": "sha512-o09cLSIq9EKyRXwryWDOJagkml9XgQCoCSRjHOnHLnvsivaW7Qznzz6yjfV7PHJHhIvyp8OH7OX8w0Dc5bQK7A==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4956,16 +5128,16 @@ } }, "node_modules/@sigstore/sign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.0.0.tgz", - "integrity": "sha512-UjhDMQOkyDoktpXoc5YPJpJK6IooF2gayAr5LvXI4EL7O0vd58okgfRcxuaH+YTdhvb5aa1Q9f+WJ0c2sVuYIw==", + "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.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "make-fetch-happen": "^14.0.1", + "@sigstore/protobuf-specs": "^0.4.0", + "make-fetch-happen": "^14.0.2", "proc-log": "^5.0.0", "promise-retry": "^2.0.1" }, @@ -4974,13 +5146,13 @@ } }, "node_modules/@sigstore/tuf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.0.0.tgz", - "integrity": "sha512-9Xxy/8U5OFJu7s+OsHzI96IX/OzjF/zj0BSSaWhgJgTqtlBhQIV2xdrQI5qxLD7+CWWDepadnXAxzaZ3u9cvRw==", + "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": { - "@sigstore/protobuf-specs": "^0.3.2", + "@sigstore/protobuf-specs": "^0.4.0", "tuf-js": "^3.0.1" }, "engines": { @@ -4988,15 +5160,15 @@ } }, "node_modules/@sigstore/verify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.0.0.tgz", - "integrity": "sha512-Ggtq2GsJuxFNUvQzLoXqRwS4ceRfLAJnrIHUDrzAD0GgnOhwujJkKkxM/s5Bako07c3WtAs/sZo5PJq7VHjeDg==", + "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": { - "@sigstore/bundle": "^3.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2" + "@sigstore/protobuf-specs": "^0.4.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -5195,9 +5367,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.5.tgz", - "integrity": "sha512-GLZPrd9ckqEBFMcVM/qRFAP0Hg3qiVEojgEFsx/N/zKXsBzbGF6z5FBDpZ0+Xhp1xr+qRZYjfGr1cWHB9oFHSA==", + "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": { @@ -5228,9 +5400,9 @@ "license": "MIT" }, "node_modules/@types/http-proxy": { - "version": "1.17.15", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", - "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", + "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": { @@ -5238,9 +5410,9 @@ } }, "node_modules/@types/jasmine": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.5.tgz", - "integrity": "sha512-SaCZ3kM5NjOiJqMRYwHpLbTfUC2Dyk1KS3QanNFsUYPGTk70CWVK/J9ueun6zNhw/UkgV7xl8V4ZLQZNRbfnNw==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.6.tgz", + "integrity": "sha512-JDwKwipGFDwf021BtRTuluYe1aMDNimtO72ygPrVXnZSC8Df2V22AHeIgGa84tbF4SLkRvN+dJnlV8aMwQjkVw==", "dev": true, "license": "MIT" }, @@ -5259,9 +5431,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "16.18.125", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.125.tgz", - "integrity": "sha512-w7U5ojboSPfZP4zD98d+/cjcN2BDW6lKH2M0ubipt8L8vUC7qUAC6ENKGSJL4tEktH2Saw2K4y1uwSjyRGKMhw==", + "version": "16.18.126", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.126.tgz", + "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==", "dev": true, "license": "MIT" }, @@ -6509,9 +6681,9 @@ } }, "node_modules/call-bind-apply-helpers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", - "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "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": { @@ -6560,9 +6732,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001695", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz", - "integrity": "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==", + "version": "1.0.30001699", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz", + "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==", "dev": true, "funding": [ { @@ -6907,9 +7079,9 @@ } }, "node_modules/compression": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.5.tgz", - "integrity": "sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==", + "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": { @@ -7033,13 +7205,13 @@ "license": "MIT" }, "node_modules/cookie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", - "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "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": ">=18" + "node": ">= 0.6" } }, "node_modules/cookie-signature": { @@ -7764,9 +7936,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.87", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.87.tgz", - "integrity": "sha512-mPFwmEWmRivw2F8x3w3l2m6htAUN97Gy0kwpO++2m9iT1Gt8RCFVUfv9U/sIbHJ6rY4P6/ooqFL/eL7ock+pPg==", + "version": "1.5.100", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.100.tgz", + "integrity": "sha512-u1z9VuzDXV86X2r3vAns0/5ojfXBue9o0+JDUDBKYqGLjxLkSqsSUoPU/6kW0gx76V44frHaf6Zo+QF74TQCMg==", "dev": true, "license": "ISC" }, @@ -7823,9 +7995,9 @@ } }, "node_modules/engine.io": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.3.tgz", - "integrity": "sha512-2hkLItQMBkoYSagneiisupWGvsQlWXqzhSMvsjaM8GYbnfUsX7tzYQq9QARnate5LRedVTX+MbkSZAANAr3NtQ==", + "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": { @@ -7833,7 +8005,7 @@ "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", - "cookie": "~1.0.2", + "cookie": "~0.7.2", "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", @@ -7872,9 +8044,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz", - "integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==", + "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": { @@ -8200,9 +8372,9 @@ } }, "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", + "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", "dev": true, "license": "Apache-2.0" }, @@ -8426,9 +8598,9 @@ "license": "BSD-3-Clause" }, "node_modules/fastq": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", - "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", + "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", "dev": true, "license": "ISC", "dependencies": { @@ -8853,18 +9025,18 @@ } }, "node_modules/globby": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", - "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", + "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": { "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.2", - "ignore": "^5.2.4", - "path-type": "^5.0.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" + "unicorn-magic": "^0.3.0" }, "engines": { "node": ">=18" @@ -9307,9 +9479,9 @@ "license": "BSD-3-Clause" }, "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz", + "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==", "dev": true, "license": "MIT", "engines": { @@ -9384,9 +9556,9 @@ "license": "MIT" }, "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==", + "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": { @@ -11534,9 +11706,9 @@ } }, "node_modules/node-gyp": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.0.0.tgz", - "integrity": "sha512-zQS+9MTTeCMgY0F3cWPyJyRFAkVltQ1uXm+xXu/ES6KFgC6Czo1Seb9vQW2wNxSX2OrDTiqL0ojtkFxBQ0ypIw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.1.0.tgz", + "integrity": "sha512-/+7TuHKnBpnMvUQnsYEb0JOozDZqarQbfNuSGLXIjhStMT0fbw7IdSqWgopOP5xhRZE+lsbIvAHcekddruPZgQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11890,9 +12062,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, "license": "MIT", "engines": { @@ -12397,13 +12569,13 @@ "license": "MIT" }, "node_modules/path-type": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "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": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -12627,9 +12799,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "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": { @@ -13222,9 +13394,9 @@ } }, "node_modules/readdirp": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz", - "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, "license": "MIT", "engines": { @@ -13280,9 +13452,9 @@ } }, "node_modules/regex-parser": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", - "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.1.tgz", + "integrity": "sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==", "dev": true, "license": "MIT" }, @@ -14250,18 +14422,18 @@ } }, "node_modules/sigstore": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.0.0.tgz", - "integrity": "sha512-PHMifhh3EN4loMcHCz6l3v/luzgT3za+9f8subGgeMNjbJjzH4Ij/YoX3Gvu+kaouJRIlVdTHHCREADYf+ZteA==", + "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.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "@sigstore/sign": "^3.0.0", - "@sigstore/tuf": "^3.0.0", - "@sigstore/verify": "^2.0.0" + "@sigstore/protobuf-specs": "^0.4.0", + "@sigstore/sign": "^3.1.0", + "@sigstore/tuf": "^3.1.0", + "@sigstore/verify": "^2.1.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -14442,9 +14614,9 @@ } }, "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", + "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15394,9 +15566,9 @@ } }, "node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", "dev": true, "license": "MIT", "engines": { diff --git a/adev/src/content/tutorials/homepage/package-lock.json b/adev/src/content/tutorials/homepage/package-lock.json index 67c62c5b24e2..6efd17b737d1 100644 --- a/adev/src/content/tutorials/homepage/package-lock.json +++ b/adev/src/content/tutorials/homepage/package-lock.json @@ -39,13 +39,13 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1901.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.4.tgz", - "integrity": "sha512-EoRTN8p7z0YnqOEIJKKu/NwSsCJxFkyGuZOobz7btnUWwlDqG8CNAhJgtlsOXPihwEkHEkzRIm1feDkWEjCYsA==", + "version": "0.1901.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.7.tgz", + "integrity": "sha512-qltyebfbej7joIKZVH8EFfrVDrkw0p9N9ja3A0XeU1sl2vlepHNAQdVm0Os8Vy2XjjyHvT5bXWE3G3/221qEKw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.4", + "@angular-devkit/core": "19.1.7", "rxjs": "7.8.1" }, "engines": { @@ -55,9 +55,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.4.tgz", - "integrity": "sha512-IDvSSiQgaixH2RtZtIpq1+XaHeuzMiTWfDyNF9DuYcU+S8CdG1SWrc8d59tmOrM/q+IRGyFgbBhTU1un52hNHw==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.7.tgz", + "integrity": "sha512-q0I6L9KTqyQ7D5M8H+fWLT+yjapvMNb7SRdfU6GzmexO66Dpo83q4HDzuDKIPDF29Yl0ELs9ICJqe9yUXh6yDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -83,13 +83,13 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.4.tgz", - "integrity": "sha512-EKXBkx6EDcvyO+U68w/eXicRaF92zSSzYNvR3tMZszEKYE6xBr3kZxY99PP54HXQHR4zYwLvFJVp+T6bnvte2w==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.7.tgz", + "integrity": "sha512-AP6FvhMybCYs3gs+vzEAzSU1K//AFT3SVTRFv+C3WMO5dLeAHeGzM8I2dxD5EHQQtqIE/8apP6CxGrnpA5YlFg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.4", + "@angular-devkit/core": "19.1.7", "jsonc-parser": "3.3.1", "magic-string": "0.30.17", "ora": "5.4.1", @@ -102,14 +102,15 @@ } }, "node_modules/@angular/build": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.4.tgz", - "integrity": "sha512-yfvLeUT2a8JTuVBY259vsSv0uLyhikHHgQcWa3VSr0TvCKrwCsBIFDq7vqmhLqIVWi/Z4D7n3J5JQAbDrl38Sg==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.7.tgz", + "integrity": "sha512-22SjHZDTk91JHU5aFVDU2n+xkPolDosRVfsK4zs+RRXQs30LYPH9KCLiUWCYjFbRj7oYvw7sbrs94szo7dWYvw==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1901.4", + "@angular-devkit/architect": "0.1901.7", + "@angular-devkit/core": "19.1.7", "@babel/core": "7.26.0", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", @@ -131,7 +132,7 @@ "rollup": "4.30.1", "sass": "1.83.1", "semver": "7.6.3", - "vite": "6.0.7", + "vite": "6.0.11", "watchpack": "2.4.2" }, "engines": { @@ -148,11 +149,11 @@ "@angular/localize": "^19.0.0", "@angular/platform-server": "^19.0.0", "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.1.4", + "@angular/ssr": "^19.1.7", "less": "^4.2.0", "ng-packagr": "^19.0.0", "postcss": "^8.4.0", - "tailwindcss": "^2.0.0 || ^3.0.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", "typescript": ">=5.5 <5.8" }, "peerDependenciesMeta": { @@ -183,18 +184,18 @@ } }, "node_modules/@angular/cli": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.4.tgz", - "integrity": "sha512-C1Z2OTLjUJIkLsay6RJ1rzY0Tdb1Mj/cBh9dZryDstuits8G0Tphe36hnLownnoHspFQfjSRtVzF4NwKiDlQRw==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.7.tgz", + "integrity": "sha512-qVEy0R4QKQ2QAGfpj2mPVxRxgOVst+rIgZBtLwf/mrbN9YyzJUaBKvaVslUpOqkvoW9mX5myf0iZkT5NykrIoA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1901.4", - "@angular-devkit/core": "19.1.4", - "@angular-devkit/schematics": "19.1.4", + "@angular-devkit/architect": "0.1901.7", + "@angular-devkit/core": "19.1.7", + "@angular-devkit/schematics": "19.1.7", "@inquirer/prompts": "7.2.1", "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.1.4", + "@schematics/angular": "19.1.7", "@yarnpkg/lockfile": "1.1.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", @@ -217,9 +218,9 @@ } }, "node_modules/@angular/common": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.3.tgz", - "integrity": "sha512-r1P0W6FKrON83szIJboF8z6UNCVL4HIxyD+nhmHMMT/iJpu4kDHVugaN/+w2jYLb4oelAJK5xzkzA+1IaHpzLg==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.6.tgz", + "integrity": "sha512-FkuejwbxsOLhcyOgDM/7YEYvMG3tuyOvr+831VzPwMwYp5QO9AUYtn4ffGf698JccbA+Ocw3BAdhPU6i+YZC1A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -228,14 +229,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.1.3", + "@angular/core": "19.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.3.tgz", - "integrity": "sha512-omX5Gyt3zlJVTUteO2YxsqYWtAIpkvs8kRYSUsLTi79V1gbGo+J1TawFuyBTrWxj4UtTGvwmDgZxiCIwMtP5KQ==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.6.tgz", + "integrity": "sha512-Tl2PFEtnU8UgSqtEKG827xDUGZrErhR6S1JICeV1kbRCYmwQA4hhG25tzi+ifSAOPW7eJiyzP2LWIvOuZkq3Vw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -244,7 +245,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.1.3" + "@angular/core": "19.1.6" }, "peerDependenciesMeta": { "@angular/core": { @@ -253,9 +254,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.3.tgz", - "integrity": "sha512-nDBvZenQECcr9CClmTp3iJNilRQ6oDKFgBkhlWffEFBx0Z6kBA36MXKKLuCkf31D+NGmt5VJlAkl8Ax8BJ9qJw==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.6.tgz", + "integrity": "sha512-rTpHC/tfLBj+5a3X+BA/4s2w5T/cHT6x3RgO8CYy7003Musn0/BiqjfE6VCIllQgLaOQRhCcf51T6Kerkzv8Dw==", "dev": true, "license": "MIT", "dependencies": { @@ -277,14 +278,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.1.3", + "@angular/compiler": "19.1.6", "typescript": ">=5.5 <5.8" } }, "node_modules/@angular/core": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.3.tgz", - "integrity": "sha512-Hh1eHvi+y+gsTRODiEEEWnRj5zqv9WNoou1KmQ1mv1NTOf0Pv61Hg9P2rBWDr0mPIXFSzqUKjyzW30BgdQ+AEA==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.6.tgz", + "integrity": "sha512-FD167URT+apxjzj9sG/MzffW5G6YyQiPQ6nrrIoYi9jeY3LYurybuOgvcXrU8PT4Z3+CKMq9k/ZnmrlHU72BpA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -298,9 +299,9 @@ } }, "node_modules/@angular/forms": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.3.tgz", - "integrity": "sha512-M6eEJBysJm9zSUhm8ggljZCsgHLccZl70P34tyddb8erh9it2uoOXW0aVaZgDt1UAiF5a1EzjdVdN4TZTT/OGA==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.6.tgz", + "integrity": "sha512-uu/76KAwCAcDuhD67Vv78UvOC/tiprtFXOgqNCj0LK8vyFcvPsunb3nF/PtfF9rSHyslXAqxZhME+Ha2tU6Lpw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -309,16 +310,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.1.3", - "@angular/core": "19.1.3", - "@angular/platform-browser": "19.1.3", + "@angular/common": "19.1.6", + "@angular/core": "19.1.6", + "@angular/platform-browser": "19.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.3.tgz", - "integrity": "sha512-bLgnM2hRyzUdoWRoUhe+IMenlr74EvrgwyG7anJ27bjg5PcvhQPXrGqU0hri5yPDb9SHVJZminr7OjNCN8QJkQ==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.6.tgz", + "integrity": "sha512-sfWU+gMpqQ6GYtE3tAfDktftC01NgtqAOKfeCQ/KY2rxRTIxYahenW0Licuzgmd+8AZtmncoZaYX0Fd/5XMqzQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -327,9 +328,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "19.1.3", - "@angular/common": "19.1.3", - "@angular/core": "19.1.3" + "@angular/animations": "19.1.6", + "@angular/common": "19.1.6", + "@angular/core": "19.1.6" }, "peerDependenciesMeta": { "@angular/animations": { @@ -353,9 +354,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", - "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true, "license": "MIT", "engines": { @@ -411,14 +412,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", - "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", + "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.5", - "@babel/types": "^7.26.5", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -553,27 +554,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz", - "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", + "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.7" + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", - "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", + "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.7" + "@babel/types": "^7.26.9" }, "bin": { "parser": "bin/babel-parser.js" @@ -599,32 +600,32 @@ } }, "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz", - "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", + "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.5", - "@babel/parser": "^7.26.7", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.7", + "@babel/generator": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -633,9 +634,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", - "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", + "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", "dev": true, "license": "MIT", "dependencies": { @@ -1072,15 +1073,15 @@ } }, "node_modules/@inquirer/checkbox": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.6.tgz", - "integrity": "sha512-PgP35JfmGjHU0LSXOyRew0zHuA9N6OJwOlos1fZ20b7j8ISeAdib3L+n0jIxBtX958UeEpte6xhG/gxJ5iUqMw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.1.tgz", + "integrity": "sha512-os5kFd/52gZTl/W6xqMfhaKVJHQM8V/U1P8jcSaQJ/C4Qhdrf2jEXdA/HaxfQs9iiUA/0yzYhk5d3oRHTxGDDQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -1089,6 +1090,11 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/confirm": { @@ -1109,35 +1115,42 @@ } }, "node_modules/@inquirer/core": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.4.tgz", - "integrity": "sha512-5y4/PUJVnRb4bwWY67KLdebWOhOc7xj5IP2J80oWXa64mVag24rwQ1VAdnj7/eDY/odhguW0zQ1Mp1pj6fO/2w==", + "version": "10.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.6.tgz", + "integrity": "sha512-Bwh/Zk6URrHwZnSSzAZAKH7YgGYi0xICIBDFOqBQoXNNAzBHw/bgXgLmChfp+GyR3PnChcTbiCTZGC6YJNJkMA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", - "strip-ansi": "^6.0.1", "wrap-ansi": "^6.2.0", "yoctocolors-cjs": "^2.1.2" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/editor": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.3.tgz", - "integrity": "sha512-S9KnIOJuTZpb9upeRSBBhoDZv7aSV3pG9TECrBj0f+ZsFwccz886hzKBrChGrXMJwd4NKY+pOA9Vy72uqnd6Eg==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.6.tgz", + "integrity": "sha512-l0smvr8g/KAVdXx4I92sFxZiaTG4kFc06cFZw+qqwTirwdUHMFLnouXBB9OafWhpO3cfEkEz2CdPoCmor3059A==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "external-editor": "^3.1.0" }, "engines": { @@ -1145,17 +1158,22 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/expand": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.6.tgz", - "integrity": "sha512-TRTfi1mv1GeIZGyi9PQmvAaH65ZlG4/FACq6wSzs7Vvf1z5dnNWsAAXBjWMHt76l+1hUY8teIqJFrWBk5N6gsg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.8.tgz", + "integrity": "sha512-k0ouAC6L+0Yoj/j0ys2bat0fYcyFVtItDB7h+pDFKaDDSFJey/C/YY1rmIOqkmFVZ5rZySeAQuS8zLcKkKRLmg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -1163,12 +1181,17 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/figures": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.9.tgz", - "integrity": "sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.10.tgz", + "integrity": "sha512-Ey6176gZmeqZuY/W/nZiUyvmb1/qInjcpiZjXWi6nON+nxJpD1bxtSoBxNliGISae32n6OwbY+TSXPZ1CfS4bw==", "dev": true, "license": "MIT", "engines": { @@ -1176,48 +1199,58 @@ } }, "node_modules/@inquirer/input": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.3.tgz", - "integrity": "sha512-zeo++6f7hxaEe7OjtMzdGZPHiawsfmCZxWB9X1NpmYgbeoyerIbWemvlBxxl+sQIlHC0WuSAG19ibMq3gbhaqQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.5.tgz", + "integrity": "sha512-bB6wR5wBCz5zbIVBPnhp94BHv/G4eKbUEjlpCw676pI2chcvzTx1MuwZSCZ/fgNOdqDlAxkhQ4wagL8BI1D3Zg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2" + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/number": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.6.tgz", - "integrity": "sha512-xO07lftUHk1rs1gR0KbqB+LJPhkUNkyzV/KhH+937hdkMazmAYHLm1OIrNKpPelppeV1FgWrgFDjdUD8mM+XUg==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.8.tgz", + "integrity": "sha512-CTKs+dT1gw8dILVWATn8Ugik1OHLkkfY82J+Musb57KpmF6EKyskv8zmMiEJPzOnLTZLo05X/QdMd8VH9oulXw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2" + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/password": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.6.tgz", - "integrity": "sha512-QLF0HmMpHZPPMp10WGXh6F+ZPvzWE7LX6rNoccdktv/Rov0B+0f+eyXkAcgqy5cH9V+WSpbLxu2lo3ysEVK91w==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.8.tgz", + "integrity": "sha512-MgA+Z7o3K1df2lGY649fyOBowHGfrKRz64dx3+b6c1w+h2W7AwBoOkHhhF/vfhbs5S4vsKNCuDzS3s9r5DpK1g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2" }, "engines": { @@ -1225,6 +1258,11 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/prompts": { @@ -1253,14 +1291,14 @@ } }, "node_modules/@inquirer/rawlist": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.6.tgz", - "integrity": "sha512-QoE4s1SsIPx27FO4L1b1mUjVcoHm1pWE/oCmm4z/Hl+V1Aw5IXl8FYYzGmfXaBT0l/sWr49XmNSiq7kg3Kd/Lg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.8.tgz", + "integrity": "sha512-hl7rvYW7Xl4un8uohQRUgO6uc2hpn7PKqfcGkCOWC0AA4waBxAv6MpGOFCEDrUaBCP+pXPVqp4LmnpWmn1E1+g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -1268,18 +1306,23 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/search": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.6.tgz", - "integrity": "sha512-eFZ2hiAq0bZcFPuFFBmZEtXU1EarHLigE+ENCtpO+37NHCl4+Yokq1P/d09kUblObaikwfo97w+0FtG/EXl5Ng==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.8.tgz", + "integrity": "sha512-ihSE9D3xQAupNg/aGDZaukqoUSXG2KfstWosVmFCG7jbMQPaj2ivxWtsB+CnYY/T4D6LX1GHKixwJLunNCffww==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -1287,18 +1330,23 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/select": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.6.tgz", - "integrity": "sha512-yANzIiNZ8fhMm4NORm+a74+KFYHmf7BZphSOBovIzYPVLquseTGEkU5l2UTnBOf5k0VLmTgPighNDLE9QtbViQ==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.8.tgz", + "integrity": "sha512-Io2prxFyN2jOCcu4qJbVoilo19caiD3kqkD3WR0q3yDA5HUCo83v4LrRtg55ZwniYACW64z36eV7gyVbOfORjA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -1307,12 +1355,17 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/type": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.2.tgz", - "integrity": "sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.4.tgz", + "integrity": "sha512-2MNFrDY8jkFYc9Il9DgLsHhMzuHnOYM1+CUYVWbzu9oT0hC7V7EcYvdCKeoll/Fcci04A+ERZ9wcc7cQ8lTkIA==", "dev": true, "license": "MIT", "engines": { @@ -1320,6 +1373,11 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@isaacs/cliui": { @@ -1340,19 +1398,6 @@ "node": ">=12" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", @@ -1391,22 +1436,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -2176,9 +2205,9 @@ } }, "node_modules/@npmcli/redact": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.0.0.tgz", - "integrity": "sha512-/1uFzjVcfzqrgCeGW7+SZ4hv0qLWmKXVzFahZGJ6QuJBj6Myt9s17+JL86i76NV9YSnJRcGXJYQbAU0rn1YTCQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.1.1.tgz", + "integrity": "sha512-3Hc2KGIkrvJWJqTbvueXzBeZlmvoOxc2jyX00yzr3+sNFquJg0N8hH4SAPLPVrkWIRQICVpVgjrss971awXVnA==", "dev": true, "license": "ISC", "engines": { @@ -2204,9 +2233,9 @@ } }, "node_modules/@parcel/watcher": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", - "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2225,25 +2254,25 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.0", - "@parcel/watcher-darwin-arm64": "2.5.0", - "@parcel/watcher-darwin-x64": "2.5.0", - "@parcel/watcher-freebsd-x64": "2.5.0", - "@parcel/watcher-linux-arm-glibc": "2.5.0", - "@parcel/watcher-linux-arm-musl": "2.5.0", - "@parcel/watcher-linux-arm64-glibc": "2.5.0", - "@parcel/watcher-linux-arm64-musl": "2.5.0", - "@parcel/watcher-linux-x64-glibc": "2.5.0", - "@parcel/watcher-linux-x64-musl": "2.5.0", - "@parcel/watcher-win32-arm64": "2.5.0", - "@parcel/watcher-win32-ia32": "2.5.0", - "@parcel/watcher-win32-x64": "2.5.0" + "@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.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", - "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", + "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" ], @@ -2262,9 +2291,9 @@ } }, "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", - "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "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" ], @@ -2283,9 +2312,9 @@ } }, "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", - "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", + "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" ], @@ -2304,9 +2333,9 @@ } }, "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", - "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "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" ], @@ -2325,9 +2354,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", - "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "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" ], @@ -2346,9 +2375,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", - "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "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" ], @@ -2367,9 +2396,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", - "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "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" ], @@ -2388,9 +2417,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", - "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "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" ], @@ -2409,9 +2438,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", - "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "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" ], @@ -2430,9 +2459,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", - "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "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" ], @@ -2451,9 +2480,9 @@ } }, "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", - "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "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" ], @@ -2472,9 +2501,9 @@ } }, "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", - "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "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" ], @@ -2493,9 +2522,9 @@ } }, "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", - "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", + "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" ], @@ -2813,14 +2842,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.4.tgz", - "integrity": "sha512-HFf83SoXbj1K4jkYSSfCg/oXkmSGBx0zG1Lh+dE5GZFdTQmykrBY519aSdrqLVyZzKYjTGfDfSewUeO4a0GE2A==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.7.tgz", + "integrity": "sha512-BB8yMGmYDZzSb8Nu+Ln0TKyeoS3++f9STCYw30NwM3IViHxJJYxu/zowzwSa9TjftIzdCpbOaPxGS0vU9UOUDQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.4", - "@angular-devkit/schematics": "19.1.4", + "@angular-devkit/core": "19.1.7", + "@angular-devkit/schematics": "19.1.7", "jsonc-parser": "3.3.1" }, "engines": { @@ -2830,13 +2859,13 @@ } }, "node_modules/@sigstore/bundle": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.0.0.tgz", - "integrity": "sha512-XDUYX56iMPAn/cdgh/DTJxz5RWmqKV4pwvUAEKEWJl+HzKdCd/24wUa9JYNMlDSCb7SUHAdtksxYX779Nne/Zg==", + "version": "3.1.0", + "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": { - "@sigstore/protobuf-specs": "^0.3.2" + "@sigstore/protobuf-specs": "^0.4.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -2853,9 +2882,9 @@ } }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.3.tgz", - "integrity": "sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.0.tgz", + "integrity": "sha512-o09cLSIq9EKyRXwryWDOJagkml9XgQCoCSRjHOnHLnvsivaW7Qznzz6yjfV7PHJHhIvyp8OH7OX8w0Dc5bQK7A==", "dev": true, "license": "Apache-2.0", "engines": { @@ -2863,16 +2892,16 @@ } }, "node_modules/@sigstore/sign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.0.0.tgz", - "integrity": "sha512-UjhDMQOkyDoktpXoc5YPJpJK6IooF2gayAr5LvXI4EL7O0vd58okgfRcxuaH+YTdhvb5aa1Q9f+WJ0c2sVuYIw==", + "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.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "make-fetch-happen": "^14.0.1", + "@sigstore/protobuf-specs": "^0.4.0", + "make-fetch-happen": "^14.0.2", "proc-log": "^5.0.0", "promise-retry": "^2.0.1" }, @@ -2881,13 +2910,13 @@ } }, "node_modules/@sigstore/tuf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.0.0.tgz", - "integrity": "sha512-9Xxy/8U5OFJu7s+OsHzI96IX/OzjF/zj0BSSaWhgJgTqtlBhQIV2xdrQI5qxLD7+CWWDepadnXAxzaZ3u9cvRw==", + "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": { - "@sigstore/protobuf-specs": "^0.3.2", + "@sigstore/protobuf-specs": "^0.4.0", "tuf-js": "^3.0.1" }, "engines": { @@ -2895,15 +2924,15 @@ } }, "node_modules/@sigstore/verify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.0.0.tgz", - "integrity": "sha512-Ggtq2GsJuxFNUvQzLoXqRwS4ceRfLAJnrIHUDrzAD0GgnOhwujJkKkxM/s5Bako07c3WtAs/sZo5PJq7VHjeDg==", + "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": { - "@sigstore/bundle": "^3.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2" + "@sigstore/protobuf-specs": "^0.4.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -2941,9 +2970,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.10.tgz", - "integrity": "sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww==", + "version": "22.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", + "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", "dev": true, "license": "MIT", "peer": true, @@ -3043,13 +3072,16 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/ansi-styles": { @@ -3302,9 +3334,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001695", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz", - "integrity": "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==", + "version": "1.0.30001699", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz", + "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==", "dev": true, "funding": [ { @@ -3443,6 +3475,16 @@ "node": ">=12" } }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -3475,6 +3517,19 @@ "node": ">=8" } }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -3714,9 +3769,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.87", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.87.tgz", - "integrity": "sha512-mPFwmEWmRivw2F8x3w3l2m6htAUN97Gy0kwpO++2m9iT1Gt8RCFVUfv9U/sIbHJ6rY4P6/ooqFL/eL7ock+pPg==", + "version": "1.5.100", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.100.tgz", + "integrity": "sha512-u1z9VuzDXV86X2r3vAns0/5ojfXBue9o0+JDUDBKYqGLjxLkSqsSUoPU/6kW0gx76V44frHaf6Zo+QF74TQCMg==", "dev": true, "license": "ISC" }, @@ -3854,9 +3909,9 @@ "license": "MIT" }, "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", + "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", "dev": true, "license": "Apache-2.0" }, @@ -3917,9 +3972,9 @@ "license": "BSD-3-Clause" }, "node_modules/fastq": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", - "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", + "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", "dev": true, "license": "ISC", "dependencies": { @@ -4508,19 +4563,6 @@ "node": ">=18.0.0" } }, - "node_modules/listr2/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, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/listr2/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", @@ -4534,22 +4576,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/listr2/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, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/listr2/node_modules/wrap-ansi": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", @@ -4648,19 +4674,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/log-update/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", @@ -4707,22 +4720,6 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/log-update/node_modules/wrap-ansi": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", @@ -5126,9 +5123,9 @@ "optional": true }, "node_modules/node-gyp": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.0.0.tgz", - "integrity": "sha512-zQS+9MTTeCMgY0F3cWPyJyRFAkVltQ1uXm+xXu/ES6KFgC6Czo1Seb9vQW2wNxSX2OrDTiqL0ojtkFxBQ0ypIw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.1.0.tgz", + "integrity": "sha512-/+7TuHKnBpnMvUQnsYEb0JOozDZqarQbfNuSGLXIjhStMT0fbw7IdSqWgopOP5xhRZE+lsbIvAHcekddruPZgQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5397,6 +5394,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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": ">=8" + } + }, "node_modules/ora/node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -5447,6 +5454,19 @@ "dev": true, "license": "ISC" }, + "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": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ordered-binary": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.3.tgz", @@ -5630,9 +5650,9 @@ } }, "node_modules/postcss": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", - "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", + "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", "dev": true, "funding": [ { @@ -5733,9 +5753,9 @@ } }, "node_modules/readdirp": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz", - "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, "license": "MIT", "engines": { @@ -6026,18 +6046,18 @@ } }, "node_modules/sigstore": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.0.0.tgz", - "integrity": "sha512-PHMifhh3EN4loMcHCz6l3v/luzgT3za+9f8subGgeMNjbJjzH4Ij/YoX3Gvu+kaouJRIlVdTHHCREADYf+ZteA==", + "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.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "@sigstore/sign": "^3.0.0", - "@sigstore/tuf": "^3.0.0", - "@sigstore/verify": "^2.0.0" + "@sigstore/protobuf-specs": "^0.4.0", + "@sigstore/sign": "^3.1.0", + "@sigstore/tuf": "^3.1.0", + "@sigstore/verify": "^2.1.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -6085,9 +6105,9 @@ } }, "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", + "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6234,6 +6254,16 @@ "node": ">=8" } }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -6251,20 +6281,20 @@ "node": ">=8" } }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "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, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "ansi-regex": "^5.0.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=8" } }, - "node_modules/string-width/node_modules/strip-ansi": { + "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==", @@ -6280,7 +6310,8 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/strip-ansi": { + "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==", @@ -6293,16 +6324,12 @@ "node": ">=8" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "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, "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { "node": ">=8" } @@ -6599,9 +6626,9 @@ } }, "node_modules/vite": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.7.tgz", - "integrity": "sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==", + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz", + "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==", "dev": true, "license": "MIT", "dependencies": { @@ -6752,6 +6779,16 @@ "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", @@ -6784,6 +6821,29 @@ "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-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", @@ -6816,6 +6876,19 @@ "node": ">=8" } }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -6862,6 +6935,16 @@ "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==", + "dev": true, + "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", @@ -6894,6 +6977,19 @@ "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yoctocolors-cjs": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", diff --git a/adev/src/content/tutorials/learn-angular/common/package-lock.json b/adev/src/content/tutorials/learn-angular/common/package-lock.json index 2db9269eb091..c7e530756a8c 100644 --- a/adev/src/content/tutorials/learn-angular/common/package-lock.json +++ b/adev/src/content/tutorials/learn-angular/common/package-lock.json @@ -40,13 +40,13 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1901.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.4.tgz", - "integrity": "sha512-EoRTN8p7z0YnqOEIJKKu/NwSsCJxFkyGuZOobz7btnUWwlDqG8CNAhJgtlsOXPihwEkHEkzRIm1feDkWEjCYsA==", + "version": "0.1901.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.7.tgz", + "integrity": "sha512-qltyebfbej7joIKZVH8EFfrVDrkw0p9N9ja3A0XeU1sl2vlepHNAQdVm0Os8Vy2XjjyHvT5bXWE3G3/221qEKw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.4", + "@angular-devkit/core": "19.1.7", "rxjs": "7.8.1" }, "engines": { @@ -56,9 +56,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.4.tgz", - "integrity": "sha512-IDvSSiQgaixH2RtZtIpq1+XaHeuzMiTWfDyNF9DuYcU+S8CdG1SWrc8d59tmOrM/q+IRGyFgbBhTU1un52hNHw==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.7.tgz", + "integrity": "sha512-q0I6L9KTqyQ7D5M8H+fWLT+yjapvMNb7SRdfU6GzmexO66Dpo83q4HDzuDKIPDF29Yl0ELs9ICJqe9yUXh6yDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -84,13 +84,13 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.4.tgz", - "integrity": "sha512-EKXBkx6EDcvyO+U68w/eXicRaF92zSSzYNvR3tMZszEKYE6xBr3kZxY99PP54HXQHR4zYwLvFJVp+T6bnvte2w==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.7.tgz", + "integrity": "sha512-AP6FvhMybCYs3gs+vzEAzSU1K//AFT3SVTRFv+C3WMO5dLeAHeGzM8I2dxD5EHQQtqIE/8apP6CxGrnpA5YlFg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.4", + "@angular-devkit/core": "19.1.7", "jsonc-parser": "3.3.1", "magic-string": "0.30.17", "ora": "5.4.1", @@ -103,14 +103,15 @@ } }, "node_modules/@angular/build": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.4.tgz", - "integrity": "sha512-yfvLeUT2a8JTuVBY259vsSv0uLyhikHHgQcWa3VSr0TvCKrwCsBIFDq7vqmhLqIVWi/Z4D7n3J5JQAbDrl38Sg==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.7.tgz", + "integrity": "sha512-22SjHZDTk91JHU5aFVDU2n+xkPolDosRVfsK4zs+RRXQs30LYPH9KCLiUWCYjFbRj7oYvw7sbrs94szo7dWYvw==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1901.4", + "@angular-devkit/architect": "0.1901.7", + "@angular-devkit/core": "19.1.7", "@babel/core": "7.26.0", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", @@ -132,7 +133,7 @@ "rollup": "4.30.1", "sass": "1.83.1", "semver": "7.6.3", - "vite": "6.0.7", + "vite": "6.0.11", "watchpack": "2.4.2" }, "engines": { @@ -149,11 +150,11 @@ "@angular/localize": "^19.0.0", "@angular/platform-server": "^19.0.0", "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.1.4", + "@angular/ssr": "^19.1.7", "less": "^4.2.0", "ng-packagr": "^19.0.0", "postcss": "^8.4.0", - "tailwindcss": "^2.0.0 || ^3.0.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", "typescript": ">=5.5 <5.8" }, "peerDependenciesMeta": { @@ -184,18 +185,18 @@ } }, "node_modules/@angular/cli": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.4.tgz", - "integrity": "sha512-C1Z2OTLjUJIkLsay6RJ1rzY0Tdb1Mj/cBh9dZryDstuits8G0Tphe36hnLownnoHspFQfjSRtVzF4NwKiDlQRw==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.7.tgz", + "integrity": "sha512-qVEy0R4QKQ2QAGfpj2mPVxRxgOVst+rIgZBtLwf/mrbN9YyzJUaBKvaVslUpOqkvoW9mX5myf0iZkT5NykrIoA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1901.4", - "@angular-devkit/core": "19.1.4", - "@angular-devkit/schematics": "19.1.4", + "@angular-devkit/architect": "0.1901.7", + "@angular-devkit/core": "19.1.7", + "@angular-devkit/schematics": "19.1.7", "@inquirer/prompts": "7.2.1", "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.1.4", + "@schematics/angular": "19.1.7", "@yarnpkg/lockfile": "1.1.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", @@ -218,9 +219,9 @@ } }, "node_modules/@angular/common": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.3.tgz", - "integrity": "sha512-r1P0W6FKrON83szIJboF8z6UNCVL4HIxyD+nhmHMMT/iJpu4kDHVugaN/+w2jYLb4oelAJK5xzkzA+1IaHpzLg==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.6.tgz", + "integrity": "sha512-FkuejwbxsOLhcyOgDM/7YEYvMG3tuyOvr+831VzPwMwYp5QO9AUYtn4ffGf698JccbA+Ocw3BAdhPU6i+YZC1A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -229,14 +230,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.1.3", + "@angular/core": "19.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.3.tgz", - "integrity": "sha512-omX5Gyt3zlJVTUteO2YxsqYWtAIpkvs8kRYSUsLTi79V1gbGo+J1TawFuyBTrWxj4UtTGvwmDgZxiCIwMtP5KQ==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.6.tgz", + "integrity": "sha512-Tl2PFEtnU8UgSqtEKG827xDUGZrErhR6S1JICeV1kbRCYmwQA4hhG25tzi+ifSAOPW7eJiyzP2LWIvOuZkq3Vw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -245,7 +246,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.1.3" + "@angular/core": "19.1.6" }, "peerDependenciesMeta": { "@angular/core": { @@ -254,9 +255,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.3.tgz", - "integrity": "sha512-nDBvZenQECcr9CClmTp3iJNilRQ6oDKFgBkhlWffEFBx0Z6kBA36MXKKLuCkf31D+NGmt5VJlAkl8Ax8BJ9qJw==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.6.tgz", + "integrity": "sha512-rTpHC/tfLBj+5a3X+BA/4s2w5T/cHT6x3RgO8CYy7003Musn0/BiqjfE6VCIllQgLaOQRhCcf51T6Kerkzv8Dw==", "dev": true, "license": "MIT", "dependencies": { @@ -278,14 +279,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.1.3", + "@angular/compiler": "19.1.6", "typescript": ">=5.5 <5.8" } }, "node_modules/@angular/core": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.3.tgz", - "integrity": "sha512-Hh1eHvi+y+gsTRODiEEEWnRj5zqv9WNoou1KmQ1mv1NTOf0Pv61Hg9P2rBWDr0mPIXFSzqUKjyzW30BgdQ+AEA==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.6.tgz", + "integrity": "sha512-FD167URT+apxjzj9sG/MzffW5G6YyQiPQ6nrrIoYi9jeY3LYurybuOgvcXrU8PT4Z3+CKMq9k/ZnmrlHU72BpA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -299,9 +300,9 @@ } }, "node_modules/@angular/forms": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.3.tgz", - "integrity": "sha512-M6eEJBysJm9zSUhm8ggljZCsgHLccZl70P34tyddb8erh9it2uoOXW0aVaZgDt1UAiF5a1EzjdVdN4TZTT/OGA==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.6.tgz", + "integrity": "sha512-uu/76KAwCAcDuhD67Vv78UvOC/tiprtFXOgqNCj0LK8vyFcvPsunb3nF/PtfF9rSHyslXAqxZhME+Ha2tU6Lpw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -310,16 +311,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.1.3", - "@angular/core": "19.1.3", - "@angular/platform-browser": "19.1.3", + "@angular/common": "19.1.6", + "@angular/core": "19.1.6", + "@angular/platform-browser": "19.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.3.tgz", - "integrity": "sha512-bLgnM2hRyzUdoWRoUhe+IMenlr74EvrgwyG7anJ27bjg5PcvhQPXrGqU0hri5yPDb9SHVJZminr7OjNCN8QJkQ==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.6.tgz", + "integrity": "sha512-sfWU+gMpqQ6GYtE3tAfDktftC01NgtqAOKfeCQ/KY2rxRTIxYahenW0Licuzgmd+8AZtmncoZaYX0Fd/5XMqzQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -328,9 +329,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "19.1.3", - "@angular/common": "19.1.3", - "@angular/core": "19.1.3" + "@angular/animations": "19.1.6", + "@angular/common": "19.1.6", + "@angular/core": "19.1.6" }, "peerDependenciesMeta": { "@angular/animations": { @@ -339,9 +340,9 @@ } }, "node_modules/@angular/router": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.1.3.tgz", - "integrity": "sha512-DJ9BgvtxJV6xohaPQXPdBsFCZoQIEq2OPDyKcoW4L0ST4kIIFpHyI6wJ+AlPnLkhSwmOOoHciH0oxZ2xPVxmiQ==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.1.6.tgz", + "integrity": "sha512-TEfw3W5jVodVDMD4krhXGog1THZN3x1yoh2oZmCv3lXg22+pVC6Cp+x3vVExq0mS+g3/6uZwy/3qAYdlzqYjTg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -350,9 +351,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.1.3", - "@angular/core": "19.1.3", - "@angular/platform-browser": "19.1.3", + "@angular/common": "19.1.6", + "@angular/core": "19.1.6", + "@angular/platform-browser": "19.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -372,9 +373,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", - "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true, "license": "MIT", "engines": { @@ -430,14 +431,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", - "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", + "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.5", - "@babel/types": "^7.26.5", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -572,27 +573,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz", - "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", + "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.7" + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", - "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", + "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.7" + "@babel/types": "^7.26.9" }, "bin": { "parser": "bin/babel-parser.js" @@ -618,32 +619,32 @@ } }, "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz", - "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", + "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.5", - "@babel/parser": "^7.26.7", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.7", + "@babel/generator": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -652,9 +653,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", - "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", + "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", "dev": true, "license": "MIT", "dependencies": { @@ -1091,15 +1092,15 @@ } }, "node_modules/@inquirer/checkbox": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.6.tgz", - "integrity": "sha512-PgP35JfmGjHU0LSXOyRew0zHuA9N6OJwOlos1fZ20b7j8ISeAdib3L+n0jIxBtX958UeEpte6xhG/gxJ5iUqMw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.1.tgz", + "integrity": "sha512-os5kFd/52gZTl/W6xqMfhaKVJHQM8V/U1P8jcSaQJ/C4Qhdrf2jEXdA/HaxfQs9iiUA/0yzYhk5d3oRHTxGDDQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -1108,6 +1109,11 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/confirm": { @@ -1128,35 +1134,42 @@ } }, "node_modules/@inquirer/core": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.4.tgz", - "integrity": "sha512-5y4/PUJVnRb4bwWY67KLdebWOhOc7xj5IP2J80oWXa64mVag24rwQ1VAdnj7/eDY/odhguW0zQ1Mp1pj6fO/2w==", + "version": "10.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.6.tgz", + "integrity": "sha512-Bwh/Zk6URrHwZnSSzAZAKH7YgGYi0xICIBDFOqBQoXNNAzBHw/bgXgLmChfp+GyR3PnChcTbiCTZGC6YJNJkMA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", - "strip-ansi": "^6.0.1", "wrap-ansi": "^6.2.0", "yoctocolors-cjs": "^2.1.2" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/editor": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.3.tgz", - "integrity": "sha512-S9KnIOJuTZpb9upeRSBBhoDZv7aSV3pG9TECrBj0f+ZsFwccz886hzKBrChGrXMJwd4NKY+pOA9Vy72uqnd6Eg==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.6.tgz", + "integrity": "sha512-l0smvr8g/KAVdXx4I92sFxZiaTG4kFc06cFZw+qqwTirwdUHMFLnouXBB9OafWhpO3cfEkEz2CdPoCmor3059A==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "external-editor": "^3.1.0" }, "engines": { @@ -1164,17 +1177,22 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/expand": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.6.tgz", - "integrity": "sha512-TRTfi1mv1GeIZGyi9PQmvAaH65ZlG4/FACq6wSzs7Vvf1z5dnNWsAAXBjWMHt76l+1hUY8teIqJFrWBk5N6gsg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.8.tgz", + "integrity": "sha512-k0ouAC6L+0Yoj/j0ys2bat0fYcyFVtItDB7h+pDFKaDDSFJey/C/YY1rmIOqkmFVZ5rZySeAQuS8zLcKkKRLmg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -1182,12 +1200,17 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/figures": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.9.tgz", - "integrity": "sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.10.tgz", + "integrity": "sha512-Ey6176gZmeqZuY/W/nZiUyvmb1/qInjcpiZjXWi6nON+nxJpD1bxtSoBxNliGISae32n6OwbY+TSXPZ1CfS4bw==", "dev": true, "license": "MIT", "engines": { @@ -1195,48 +1218,58 @@ } }, "node_modules/@inquirer/input": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.3.tgz", - "integrity": "sha512-zeo++6f7hxaEe7OjtMzdGZPHiawsfmCZxWB9X1NpmYgbeoyerIbWemvlBxxl+sQIlHC0WuSAG19ibMq3gbhaqQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.5.tgz", + "integrity": "sha512-bB6wR5wBCz5zbIVBPnhp94BHv/G4eKbUEjlpCw676pI2chcvzTx1MuwZSCZ/fgNOdqDlAxkhQ4wagL8BI1D3Zg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2" + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/number": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.6.tgz", - "integrity": "sha512-xO07lftUHk1rs1gR0KbqB+LJPhkUNkyzV/KhH+937hdkMazmAYHLm1OIrNKpPelppeV1FgWrgFDjdUD8mM+XUg==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.8.tgz", + "integrity": "sha512-CTKs+dT1gw8dILVWATn8Ugik1OHLkkfY82J+Musb57KpmF6EKyskv8zmMiEJPzOnLTZLo05X/QdMd8VH9oulXw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2" + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/password": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.6.tgz", - "integrity": "sha512-QLF0HmMpHZPPMp10WGXh6F+ZPvzWE7LX6rNoccdktv/Rov0B+0f+eyXkAcgqy5cH9V+WSpbLxu2lo3ysEVK91w==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.8.tgz", + "integrity": "sha512-MgA+Z7o3K1df2lGY649fyOBowHGfrKRz64dx3+b6c1w+h2W7AwBoOkHhhF/vfhbs5S4vsKNCuDzS3s9r5DpK1g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2" }, "engines": { @@ -1244,6 +1277,11 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/prompts": { @@ -1272,14 +1310,14 @@ } }, "node_modules/@inquirer/rawlist": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.6.tgz", - "integrity": "sha512-QoE4s1SsIPx27FO4L1b1mUjVcoHm1pWE/oCmm4z/Hl+V1Aw5IXl8FYYzGmfXaBT0l/sWr49XmNSiq7kg3Kd/Lg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.8.tgz", + "integrity": "sha512-hl7rvYW7Xl4un8uohQRUgO6uc2hpn7PKqfcGkCOWC0AA4waBxAv6MpGOFCEDrUaBCP+pXPVqp4LmnpWmn1E1+g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -1287,18 +1325,23 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/search": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.6.tgz", - "integrity": "sha512-eFZ2hiAq0bZcFPuFFBmZEtXU1EarHLigE+ENCtpO+37NHCl4+Yokq1P/d09kUblObaikwfo97w+0FtG/EXl5Ng==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.8.tgz", + "integrity": "sha512-ihSE9D3xQAupNg/aGDZaukqoUSXG2KfstWosVmFCG7jbMQPaj2ivxWtsB+CnYY/T4D6LX1GHKixwJLunNCffww==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -1306,18 +1349,23 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/select": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.6.tgz", - "integrity": "sha512-yANzIiNZ8fhMm4NORm+a74+KFYHmf7BZphSOBovIzYPVLquseTGEkU5l2UTnBOf5k0VLmTgPighNDLE9QtbViQ==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.8.tgz", + "integrity": "sha512-Io2prxFyN2jOCcu4qJbVoilo19caiD3kqkD3WR0q3yDA5HUCo83v4LrRtg55ZwniYACW64z36eV7gyVbOfORjA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -1326,12 +1374,17 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/type": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.2.tgz", - "integrity": "sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.4.tgz", + "integrity": "sha512-2MNFrDY8jkFYc9Il9DgLsHhMzuHnOYM1+CUYVWbzu9oT0hC7V7EcYvdCKeoll/Fcci04A+ERZ9wcc7cQ8lTkIA==", "dev": true, "license": "MIT", "engines": { @@ -1339,6 +1392,11 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@isaacs/cliui": { @@ -1359,19 +1417,6 @@ "node": ">=12" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", @@ -1410,22 +1455,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -2195,9 +2224,9 @@ } }, "node_modules/@npmcli/redact": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.0.0.tgz", - "integrity": "sha512-/1uFzjVcfzqrgCeGW7+SZ4hv0qLWmKXVzFahZGJ6QuJBj6Myt9s17+JL86i76NV9YSnJRcGXJYQbAU0rn1YTCQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.1.1.tgz", + "integrity": "sha512-3Hc2KGIkrvJWJqTbvueXzBeZlmvoOxc2jyX00yzr3+sNFquJg0N8hH4SAPLPVrkWIRQICVpVgjrss971awXVnA==", "dev": true, "license": "ISC", "engines": { @@ -2223,9 +2252,9 @@ } }, "node_modules/@parcel/watcher": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", - "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2244,25 +2273,25 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.0", - "@parcel/watcher-darwin-arm64": "2.5.0", - "@parcel/watcher-darwin-x64": "2.5.0", - "@parcel/watcher-freebsd-x64": "2.5.0", - "@parcel/watcher-linux-arm-glibc": "2.5.0", - "@parcel/watcher-linux-arm-musl": "2.5.0", - "@parcel/watcher-linux-arm64-glibc": "2.5.0", - "@parcel/watcher-linux-arm64-musl": "2.5.0", - "@parcel/watcher-linux-x64-glibc": "2.5.0", - "@parcel/watcher-linux-x64-musl": "2.5.0", - "@parcel/watcher-win32-arm64": "2.5.0", - "@parcel/watcher-win32-ia32": "2.5.0", - "@parcel/watcher-win32-x64": "2.5.0" + "@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.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", - "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", + "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" ], @@ -2281,9 +2310,9 @@ } }, "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", - "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "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" ], @@ -2302,9 +2331,9 @@ } }, "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", - "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", + "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" ], @@ -2323,9 +2352,9 @@ } }, "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", - "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "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" ], @@ -2344,9 +2373,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", - "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "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" ], @@ -2365,9 +2394,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", - "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "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" ], @@ -2386,9 +2415,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", - "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "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" ], @@ -2407,9 +2436,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", - "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "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" ], @@ -2428,9 +2457,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", - "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "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" ], @@ -2449,9 +2478,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", - "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "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" ], @@ -2470,9 +2499,9 @@ } }, "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", - "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "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" ], @@ -2491,9 +2520,9 @@ } }, "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", - "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "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" ], @@ -2512,9 +2541,9 @@ } }, "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", - "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", + "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" ], @@ -2832,14 +2861,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.4.tgz", - "integrity": "sha512-HFf83SoXbj1K4jkYSSfCg/oXkmSGBx0zG1Lh+dE5GZFdTQmykrBY519aSdrqLVyZzKYjTGfDfSewUeO4a0GE2A==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.7.tgz", + "integrity": "sha512-BB8yMGmYDZzSb8Nu+Ln0TKyeoS3++f9STCYw30NwM3IViHxJJYxu/zowzwSa9TjftIzdCpbOaPxGS0vU9UOUDQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.4", - "@angular-devkit/schematics": "19.1.4", + "@angular-devkit/core": "19.1.7", + "@angular-devkit/schematics": "19.1.7", "jsonc-parser": "3.3.1" }, "engines": { @@ -2849,13 +2878,13 @@ } }, "node_modules/@sigstore/bundle": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.0.0.tgz", - "integrity": "sha512-XDUYX56iMPAn/cdgh/DTJxz5RWmqKV4pwvUAEKEWJl+HzKdCd/24wUa9JYNMlDSCb7SUHAdtksxYX779Nne/Zg==", + "version": "3.1.0", + "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": { - "@sigstore/protobuf-specs": "^0.3.2" + "@sigstore/protobuf-specs": "^0.4.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -2872,9 +2901,9 @@ } }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.3.tgz", - "integrity": "sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.0.tgz", + "integrity": "sha512-o09cLSIq9EKyRXwryWDOJagkml9XgQCoCSRjHOnHLnvsivaW7Qznzz6yjfV7PHJHhIvyp8OH7OX8w0Dc5bQK7A==", "dev": true, "license": "Apache-2.0", "engines": { @@ -2882,16 +2911,16 @@ } }, "node_modules/@sigstore/sign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.0.0.tgz", - "integrity": "sha512-UjhDMQOkyDoktpXoc5YPJpJK6IooF2gayAr5LvXI4EL7O0vd58okgfRcxuaH+YTdhvb5aa1Q9f+WJ0c2sVuYIw==", + "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.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "make-fetch-happen": "^14.0.1", + "@sigstore/protobuf-specs": "^0.4.0", + "make-fetch-happen": "^14.0.2", "proc-log": "^5.0.0", "promise-retry": "^2.0.1" }, @@ -2900,13 +2929,13 @@ } }, "node_modules/@sigstore/tuf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.0.0.tgz", - "integrity": "sha512-9Xxy/8U5OFJu7s+OsHzI96IX/OzjF/zj0BSSaWhgJgTqtlBhQIV2xdrQI5qxLD7+CWWDepadnXAxzaZ3u9cvRw==", + "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": { - "@sigstore/protobuf-specs": "^0.3.2", + "@sigstore/protobuf-specs": "^0.4.0", "tuf-js": "^3.0.1" }, "engines": { @@ -2914,15 +2943,15 @@ } }, "node_modules/@sigstore/verify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.0.0.tgz", - "integrity": "sha512-Ggtq2GsJuxFNUvQzLoXqRwS4ceRfLAJnrIHUDrzAD0GgnOhwujJkKkxM/s5Bako07c3WtAs/sZo5PJq7VHjeDg==", + "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": { - "@sigstore/bundle": "^3.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2" + "@sigstore/protobuf-specs": "^0.4.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -2960,9 +2989,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.10.tgz", - "integrity": "sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww==", + "version": "22.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", + "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", "dev": true, "license": "MIT", "peer": true, @@ -3062,13 +3091,16 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/ansi-styles": { @@ -3321,9 +3353,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001695", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz", - "integrity": "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==", + "version": "1.0.30001699", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz", + "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==", "dev": true, "funding": [ { @@ -3462,6 +3494,16 @@ "node": ">=12" } }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -3494,6 +3536,19 @@ "node": ">=8" } }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -3733,9 +3788,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.87", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.87.tgz", - "integrity": "sha512-mPFwmEWmRivw2F8x3w3l2m6htAUN97Gy0kwpO++2m9iT1Gt8RCFVUfv9U/sIbHJ6rY4P6/ooqFL/eL7ock+pPg==", + "version": "1.5.100", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.100.tgz", + "integrity": "sha512-u1z9VuzDXV86X2r3vAns0/5ojfXBue9o0+JDUDBKYqGLjxLkSqsSUoPU/6kW0gx76V44frHaf6Zo+QF74TQCMg==", "dev": true, "license": "ISC" }, @@ -3873,9 +3928,9 @@ "license": "MIT" }, "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", + "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", "dev": true, "license": "Apache-2.0" }, @@ -3936,9 +3991,9 @@ "license": "BSD-3-Clause" }, "node_modules/fastq": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", - "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", + "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", "dev": true, "license": "ISC", "dependencies": { @@ -4527,19 +4582,6 @@ "node": ">=18.0.0" } }, - "node_modules/listr2/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, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/listr2/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", @@ -4553,22 +4595,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/listr2/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, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/listr2/node_modules/wrap-ansi": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", @@ -4667,19 +4693,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/log-update/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", @@ -4726,22 +4739,6 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/log-update/node_modules/wrap-ansi": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", @@ -5145,9 +5142,9 @@ "optional": true }, "node_modules/node-gyp": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.0.0.tgz", - "integrity": "sha512-zQS+9MTTeCMgY0F3cWPyJyRFAkVltQ1uXm+xXu/ES6KFgC6Czo1Seb9vQW2wNxSX2OrDTiqL0ojtkFxBQ0ypIw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.1.0.tgz", + "integrity": "sha512-/+7TuHKnBpnMvUQnsYEb0JOozDZqarQbfNuSGLXIjhStMT0fbw7IdSqWgopOP5xhRZE+lsbIvAHcekddruPZgQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5416,6 +5413,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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": ">=8" + } + }, "node_modules/ora/node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -5466,6 +5473,19 @@ "dev": true, "license": "ISC" }, + "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": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ordered-binary": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.3.tgz", @@ -5649,9 +5669,9 @@ } }, "node_modules/postcss": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", - "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", + "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", "dev": true, "funding": [ { @@ -5752,9 +5772,9 @@ } }, "node_modules/readdirp": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz", - "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, "license": "MIT", "engines": { @@ -6045,18 +6065,18 @@ } }, "node_modules/sigstore": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.0.0.tgz", - "integrity": "sha512-PHMifhh3EN4loMcHCz6l3v/luzgT3za+9f8subGgeMNjbJjzH4Ij/YoX3Gvu+kaouJRIlVdTHHCREADYf+ZteA==", + "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.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "@sigstore/sign": "^3.0.0", - "@sigstore/tuf": "^3.0.0", - "@sigstore/verify": "^2.0.0" + "@sigstore/protobuf-specs": "^0.4.0", + "@sigstore/sign": "^3.1.0", + "@sigstore/tuf": "^3.1.0", + "@sigstore/verify": "^2.1.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -6104,9 +6124,9 @@ } }, "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", + "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6253,6 +6273,16 @@ "node": ">=8" } }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -6270,20 +6300,20 @@ "node": ">=8" } }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "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, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "ansi-regex": "^5.0.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=8" } }, - "node_modules/string-width/node_modules/strip-ansi": { + "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==", @@ -6299,7 +6329,8 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/strip-ansi": { + "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==", @@ -6312,16 +6343,12 @@ "node": ">=8" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "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, "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { "node": ">=8" } @@ -6618,9 +6645,9 @@ } }, "node_modules/vite": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.7.tgz", - "integrity": "sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==", + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz", + "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==", "dev": true, "license": "MIT", "dependencies": { @@ -6771,6 +6798,16 @@ "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", @@ -6803,6 +6840,29 @@ "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-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", @@ -6835,6 +6895,19 @@ "node": ">=8" } }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -6881,6 +6954,16 @@ "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==", + "dev": true, + "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", @@ -6913,6 +6996,19 @@ "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yoctocolors-cjs": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", diff --git a/adev/src/content/tutorials/playground/common/package-lock.json b/adev/src/content/tutorials/playground/common/package-lock.json index b103a96c7d79..de05369e340a 100644 --- a/adev/src/content/tutorials/playground/common/package-lock.json +++ b/adev/src/content/tutorials/playground/common/package-lock.json @@ -42,13 +42,13 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1901.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.4.tgz", - "integrity": "sha512-EoRTN8p7z0YnqOEIJKKu/NwSsCJxFkyGuZOobz7btnUWwlDqG8CNAhJgtlsOXPihwEkHEkzRIm1feDkWEjCYsA==", + "version": "0.1901.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.7.tgz", + "integrity": "sha512-qltyebfbej7joIKZVH8EFfrVDrkw0p9N9ja3A0XeU1sl2vlepHNAQdVm0Os8Vy2XjjyHvT5bXWE3G3/221qEKw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.4", + "@angular-devkit/core": "19.1.7", "rxjs": "7.8.1" }, "engines": { @@ -58,9 +58,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.4.tgz", - "integrity": "sha512-IDvSSiQgaixH2RtZtIpq1+XaHeuzMiTWfDyNF9DuYcU+S8CdG1SWrc8d59tmOrM/q+IRGyFgbBhTU1un52hNHw==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.7.tgz", + "integrity": "sha512-q0I6L9KTqyQ7D5M8H+fWLT+yjapvMNb7SRdfU6GzmexO66Dpo83q4HDzuDKIPDF29Yl0ELs9ICJqe9yUXh6yDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -86,13 +86,13 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.4.tgz", - "integrity": "sha512-EKXBkx6EDcvyO+U68w/eXicRaF92zSSzYNvR3tMZszEKYE6xBr3kZxY99PP54HXQHR4zYwLvFJVp+T6bnvte2w==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.7.tgz", + "integrity": "sha512-AP6FvhMybCYs3gs+vzEAzSU1K//AFT3SVTRFv+C3WMO5dLeAHeGzM8I2dxD5EHQQtqIE/8apP6CxGrnpA5YlFg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.4", + "@angular-devkit/core": "19.1.7", "jsonc-parser": "3.3.1", "magic-string": "0.30.17", "ora": "5.4.1", @@ -105,9 +105,9 @@ } }, "node_modules/@angular/animations": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.1.3.tgz", - "integrity": "sha512-MI+Tbp9OOisrQtTQH7o+xiQCODXicCs8WHNpGzdCpnXdRkQuVSOb6xAjD9OXJqcQGotLgeyennnkIJGXdz4RTA==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.1.6.tgz", + "integrity": "sha512-iacosz3fygp0AyT57+suVpLChl10xS5RBje09TfQIKHTUY0LWkMspgaK9gwtlflpIhjedPV0UmgRIKhhFcQM1A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -116,18 +116,19 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.1.3" + "@angular/core": "19.1.6" } }, "node_modules/@angular/build": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.4.tgz", - "integrity": "sha512-yfvLeUT2a8JTuVBY259vsSv0uLyhikHHgQcWa3VSr0TvCKrwCsBIFDq7vqmhLqIVWi/Z4D7n3J5JQAbDrl38Sg==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.7.tgz", + "integrity": "sha512-22SjHZDTk91JHU5aFVDU2n+xkPolDosRVfsK4zs+RRXQs30LYPH9KCLiUWCYjFbRj7oYvw7sbrs94szo7dWYvw==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1901.4", + "@angular-devkit/architect": "0.1901.7", + "@angular-devkit/core": "19.1.7", "@babel/core": "7.26.0", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", @@ -149,7 +150,7 @@ "rollup": "4.30.1", "sass": "1.83.1", "semver": "7.6.3", - "vite": "6.0.7", + "vite": "6.0.11", "watchpack": "2.4.2" }, "engines": { @@ -166,11 +167,11 @@ "@angular/localize": "^19.0.0", "@angular/platform-server": "^19.0.0", "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.1.4", + "@angular/ssr": "^19.1.7", "less": "^4.2.0", "ng-packagr": "^19.0.0", "postcss": "^8.4.0", - "tailwindcss": "^2.0.0 || ^3.0.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", "typescript": ">=5.5 <5.8" }, "peerDependenciesMeta": { @@ -201,9 +202,9 @@ } }, "node_modules/@angular/cdk": { - "version": "19.1.1", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.1.1.tgz", - "integrity": "sha512-MmfNB9iANuDN1TS+HL8uKqA3/7pdVeCRN+HdAcfqFrcqZmSUUSlYWy8PXqymmyeXxoSwt9p4I/6R0By03VoCMw==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.1.4.tgz", + "integrity": "sha512-PyvJ1VbYjW8tVnVHvcasiqI9eNWf8EJnr0in1QWnhpSbpVpVpc4yjbgnu2pTrW9mPo/YjV4pF+qs6E97y9mdYQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -218,18 +219,18 @@ } }, "node_modules/@angular/cli": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.4.tgz", - "integrity": "sha512-C1Z2OTLjUJIkLsay6RJ1rzY0Tdb1Mj/cBh9dZryDstuits8G0Tphe36hnLownnoHspFQfjSRtVzF4NwKiDlQRw==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.7.tgz", + "integrity": "sha512-qVEy0R4QKQ2QAGfpj2mPVxRxgOVst+rIgZBtLwf/mrbN9YyzJUaBKvaVslUpOqkvoW9mX5myf0iZkT5NykrIoA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1901.4", - "@angular-devkit/core": "19.1.4", - "@angular-devkit/schematics": "19.1.4", + "@angular-devkit/architect": "0.1901.7", + "@angular-devkit/core": "19.1.7", + "@angular-devkit/schematics": "19.1.7", "@inquirer/prompts": "7.2.1", "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.1.4", + "@schematics/angular": "19.1.7", "@yarnpkg/lockfile": "1.1.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", @@ -252,9 +253,9 @@ } }, "node_modules/@angular/common": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.3.tgz", - "integrity": "sha512-r1P0W6FKrON83szIJboF8z6UNCVL4HIxyD+nhmHMMT/iJpu4kDHVugaN/+w2jYLb4oelAJK5xzkzA+1IaHpzLg==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.6.tgz", + "integrity": "sha512-FkuejwbxsOLhcyOgDM/7YEYvMG3tuyOvr+831VzPwMwYp5QO9AUYtn4ffGf698JccbA+Ocw3BAdhPU6i+YZC1A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -263,14 +264,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.1.3", + "@angular/core": "19.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.3.tgz", - "integrity": "sha512-omX5Gyt3zlJVTUteO2YxsqYWtAIpkvs8kRYSUsLTi79V1gbGo+J1TawFuyBTrWxj4UtTGvwmDgZxiCIwMtP5KQ==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.6.tgz", + "integrity": "sha512-Tl2PFEtnU8UgSqtEKG827xDUGZrErhR6S1JICeV1kbRCYmwQA4hhG25tzi+ifSAOPW7eJiyzP2LWIvOuZkq3Vw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -279,7 +280,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.1.3" + "@angular/core": "19.1.6" }, "peerDependenciesMeta": { "@angular/core": { @@ -288,9 +289,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.3.tgz", - "integrity": "sha512-nDBvZenQECcr9CClmTp3iJNilRQ6oDKFgBkhlWffEFBx0Z6kBA36MXKKLuCkf31D+NGmt5VJlAkl8Ax8BJ9qJw==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.6.tgz", + "integrity": "sha512-rTpHC/tfLBj+5a3X+BA/4s2w5T/cHT6x3RgO8CYy7003Musn0/BiqjfE6VCIllQgLaOQRhCcf51T6Kerkzv8Dw==", "dev": true, "license": "MIT", "dependencies": { @@ -312,14 +313,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.1.3", + "@angular/compiler": "19.1.6", "typescript": ">=5.5 <5.8" } }, "node_modules/@angular/core": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.3.tgz", - "integrity": "sha512-Hh1eHvi+y+gsTRODiEEEWnRj5zqv9WNoou1KmQ1mv1NTOf0Pv61Hg9P2rBWDr0mPIXFSzqUKjyzW30BgdQ+AEA==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.6.tgz", + "integrity": "sha512-FD167URT+apxjzj9sG/MzffW5G6YyQiPQ6nrrIoYi9jeY3LYurybuOgvcXrU8PT4Z3+CKMq9k/ZnmrlHU72BpA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -333,9 +334,9 @@ } }, "node_modules/@angular/forms": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.3.tgz", - "integrity": "sha512-M6eEJBysJm9zSUhm8ggljZCsgHLccZl70P34tyddb8erh9it2uoOXW0aVaZgDt1UAiF5a1EzjdVdN4TZTT/OGA==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.6.tgz", + "integrity": "sha512-uu/76KAwCAcDuhD67Vv78UvOC/tiprtFXOgqNCj0LK8vyFcvPsunb3nF/PtfF9rSHyslXAqxZhME+Ha2tU6Lpw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -344,23 +345,23 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.1.3", - "@angular/core": "19.1.3", - "@angular/platform-browser": "19.1.3", + "@angular/common": "19.1.6", + "@angular/core": "19.1.6", + "@angular/platform-browser": "19.1.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/material": { - "version": "19.1.1", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-19.1.1.tgz", - "integrity": "sha512-x/EwyBx3yCIYyu/hve19eecmufJzwltRWOO/3Y74jY4jSNNFrR9046t0ptw4fyEXjN8UQZI6Fp/melcZxl3IiA==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-19.1.4.tgz", + "integrity": "sha512-bqliTnUnMiTG6Quvk16epiQPZQB0zV/L2ctPinFcP6NhahcQFfahjabUlgMlfBk5qObolJArJr5HCMiOmpOGIQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/animations": "^19.0.0 || ^20.0.0", - "@angular/cdk": "19.1.1", + "@angular/cdk": "19.1.4", "@angular/common": "^19.0.0 || ^20.0.0", "@angular/core": "^19.0.0 || ^20.0.0", "@angular/forms": "^19.0.0 || ^20.0.0", @@ -369,9 +370,9 @@ } }, "node_modules/@angular/platform-browser": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.3.tgz", - "integrity": "sha512-bLgnM2hRyzUdoWRoUhe+IMenlr74EvrgwyG7anJ27bjg5PcvhQPXrGqU0hri5yPDb9SHVJZminr7OjNCN8QJkQ==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.6.tgz", + "integrity": "sha512-sfWU+gMpqQ6GYtE3tAfDktftC01NgtqAOKfeCQ/KY2rxRTIxYahenW0Licuzgmd+8AZtmncoZaYX0Fd/5XMqzQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -380,9 +381,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "19.1.3", - "@angular/common": "19.1.3", - "@angular/core": "19.1.3" + "@angular/animations": "19.1.6", + "@angular/common": "19.1.6", + "@angular/core": "19.1.6" }, "peerDependenciesMeta": { "@angular/animations": { @@ -406,9 +407,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", - "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true, "license": "MIT", "engines": { @@ -464,14 +465,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", - "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", + "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.5", - "@babel/types": "^7.26.5", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -606,27 +607,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz", - "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", + "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.7" + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", - "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", + "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.7" + "@babel/types": "^7.26.9" }, "bin": { "parser": "bin/babel-parser.js" @@ -652,32 +653,32 @@ } }, "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz", - "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", + "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.5", - "@babel/parser": "^7.26.7", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.7", + "@babel/generator": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -686,9 +687,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", - "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", + "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", "dev": true, "license": "MIT", "dependencies": { @@ -1125,15 +1126,15 @@ } }, "node_modules/@inquirer/checkbox": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.6.tgz", - "integrity": "sha512-PgP35JfmGjHU0LSXOyRew0zHuA9N6OJwOlos1fZ20b7j8ISeAdib3L+n0jIxBtX958UeEpte6xhG/gxJ5iUqMw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.1.tgz", + "integrity": "sha512-os5kFd/52gZTl/W6xqMfhaKVJHQM8V/U1P8jcSaQJ/C4Qhdrf2jEXdA/HaxfQs9iiUA/0yzYhk5d3oRHTxGDDQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -1142,6 +1143,11 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/confirm": { @@ -1162,35 +1168,42 @@ } }, "node_modules/@inquirer/core": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.4.tgz", - "integrity": "sha512-5y4/PUJVnRb4bwWY67KLdebWOhOc7xj5IP2J80oWXa64mVag24rwQ1VAdnj7/eDY/odhguW0zQ1Mp1pj6fO/2w==", + "version": "10.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.6.tgz", + "integrity": "sha512-Bwh/Zk6URrHwZnSSzAZAKH7YgGYi0xICIBDFOqBQoXNNAzBHw/bgXgLmChfp+GyR3PnChcTbiCTZGC6YJNJkMA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", - "strip-ansi": "^6.0.1", "wrap-ansi": "^6.2.0", "yoctocolors-cjs": "^2.1.2" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/editor": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.3.tgz", - "integrity": "sha512-S9KnIOJuTZpb9upeRSBBhoDZv7aSV3pG9TECrBj0f+ZsFwccz886hzKBrChGrXMJwd4NKY+pOA9Vy72uqnd6Eg==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.6.tgz", + "integrity": "sha512-l0smvr8g/KAVdXx4I92sFxZiaTG4kFc06cFZw+qqwTirwdUHMFLnouXBB9OafWhpO3cfEkEz2CdPoCmor3059A==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "external-editor": "^3.1.0" }, "engines": { @@ -1198,17 +1211,22 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/expand": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.6.tgz", - "integrity": "sha512-TRTfi1mv1GeIZGyi9PQmvAaH65ZlG4/FACq6wSzs7Vvf1z5dnNWsAAXBjWMHt76l+1hUY8teIqJFrWBk5N6gsg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.8.tgz", + "integrity": "sha512-k0ouAC6L+0Yoj/j0ys2bat0fYcyFVtItDB7h+pDFKaDDSFJey/C/YY1rmIOqkmFVZ5rZySeAQuS8zLcKkKRLmg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -1216,12 +1234,17 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/figures": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.9.tgz", - "integrity": "sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.10.tgz", + "integrity": "sha512-Ey6176gZmeqZuY/W/nZiUyvmb1/qInjcpiZjXWi6nON+nxJpD1bxtSoBxNliGISae32n6OwbY+TSXPZ1CfS4bw==", "dev": true, "license": "MIT", "engines": { @@ -1229,48 +1252,58 @@ } }, "node_modules/@inquirer/input": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.3.tgz", - "integrity": "sha512-zeo++6f7hxaEe7OjtMzdGZPHiawsfmCZxWB9X1NpmYgbeoyerIbWemvlBxxl+sQIlHC0WuSAG19ibMq3gbhaqQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.5.tgz", + "integrity": "sha512-bB6wR5wBCz5zbIVBPnhp94BHv/G4eKbUEjlpCw676pI2chcvzTx1MuwZSCZ/fgNOdqDlAxkhQ4wagL8BI1D3Zg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2" + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/number": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.6.tgz", - "integrity": "sha512-xO07lftUHk1rs1gR0KbqB+LJPhkUNkyzV/KhH+937hdkMazmAYHLm1OIrNKpPelppeV1FgWrgFDjdUD8mM+XUg==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.8.tgz", + "integrity": "sha512-CTKs+dT1gw8dILVWATn8Ugik1OHLkkfY82J+Musb57KpmF6EKyskv8zmMiEJPzOnLTZLo05X/QdMd8VH9oulXw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2" + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/password": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.6.tgz", - "integrity": "sha512-QLF0HmMpHZPPMp10WGXh6F+ZPvzWE7LX6rNoccdktv/Rov0B+0f+eyXkAcgqy5cH9V+WSpbLxu2lo3ysEVK91w==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.8.tgz", + "integrity": "sha512-MgA+Z7o3K1df2lGY649fyOBowHGfrKRz64dx3+b6c1w+h2W7AwBoOkHhhF/vfhbs5S4vsKNCuDzS3s9r5DpK1g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2" }, "engines": { @@ -1278,6 +1311,11 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/prompts": { @@ -1306,14 +1344,14 @@ } }, "node_modules/@inquirer/rawlist": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.6.tgz", - "integrity": "sha512-QoE4s1SsIPx27FO4L1b1mUjVcoHm1pWE/oCmm4z/Hl+V1Aw5IXl8FYYzGmfXaBT0l/sWr49XmNSiq7kg3Kd/Lg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.8.tgz", + "integrity": "sha512-hl7rvYW7Xl4un8uohQRUgO6uc2hpn7PKqfcGkCOWC0AA4waBxAv6MpGOFCEDrUaBCP+pXPVqp4LmnpWmn1E1+g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -1321,18 +1359,23 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/search": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.6.tgz", - "integrity": "sha512-eFZ2hiAq0bZcFPuFFBmZEtXU1EarHLigE+ENCtpO+37NHCl4+Yokq1P/d09kUblObaikwfo97w+0FtG/EXl5Ng==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.8.tgz", + "integrity": "sha512-ihSE9D3xQAupNg/aGDZaukqoUSXG2KfstWosVmFCG7jbMQPaj2ivxWtsB+CnYY/T4D6LX1GHKixwJLunNCffww==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -1340,18 +1383,23 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/select": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.6.tgz", - "integrity": "sha512-yANzIiNZ8fhMm4NORm+a74+KFYHmf7BZphSOBovIzYPVLquseTGEkU5l2UTnBOf5k0VLmTgPighNDLE9QtbViQ==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.8.tgz", + "integrity": "sha512-Io2prxFyN2jOCcu4qJbVoilo19caiD3kqkD3WR0q3yDA5HUCo83v4LrRtg55ZwniYACW64z36eV7gyVbOfORjA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.4", - "@inquirer/figures": "^1.0.9", - "@inquirer/type": "^3.0.2", + "@inquirer/core": "^10.1.6", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -1360,12 +1408,17 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/type": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.2.tgz", - "integrity": "sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.4.tgz", + "integrity": "sha512-2MNFrDY8jkFYc9Il9DgLsHhMzuHnOYM1+CUYVWbzu9oT0hC7V7EcYvdCKeoll/Fcci04A+ERZ9wcc7cQ8lTkIA==", "dev": true, "license": "MIT", "engines": { @@ -1373,6 +1426,11 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@isaacs/cliui": { @@ -1393,19 +1451,6 @@ "node": ">=12" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", @@ -1444,22 +1489,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -2229,9 +2258,9 @@ } }, "node_modules/@npmcli/redact": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.0.0.tgz", - "integrity": "sha512-/1uFzjVcfzqrgCeGW7+SZ4hv0qLWmKXVzFahZGJ6QuJBj6Myt9s17+JL86i76NV9YSnJRcGXJYQbAU0rn1YTCQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.1.1.tgz", + "integrity": "sha512-3Hc2KGIkrvJWJqTbvueXzBeZlmvoOxc2jyX00yzr3+sNFquJg0N8hH4SAPLPVrkWIRQICVpVgjrss971awXVnA==", "dev": true, "license": "ISC", "engines": { @@ -2257,9 +2286,9 @@ } }, "node_modules/@parcel/watcher": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", - "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2278,25 +2307,25 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.0", - "@parcel/watcher-darwin-arm64": "2.5.0", - "@parcel/watcher-darwin-x64": "2.5.0", - "@parcel/watcher-freebsd-x64": "2.5.0", - "@parcel/watcher-linux-arm-glibc": "2.5.0", - "@parcel/watcher-linux-arm-musl": "2.5.0", - "@parcel/watcher-linux-arm64-glibc": "2.5.0", - "@parcel/watcher-linux-arm64-musl": "2.5.0", - "@parcel/watcher-linux-x64-glibc": "2.5.0", - "@parcel/watcher-linux-x64-musl": "2.5.0", - "@parcel/watcher-win32-arm64": "2.5.0", - "@parcel/watcher-win32-ia32": "2.5.0", - "@parcel/watcher-win32-x64": "2.5.0" + "@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.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", - "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", + "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" ], @@ -2315,9 +2344,9 @@ } }, "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", - "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "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" ], @@ -2336,9 +2365,9 @@ } }, "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", - "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", + "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" ], @@ -2357,9 +2386,9 @@ } }, "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", - "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "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" ], @@ -2378,9 +2407,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", - "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "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" ], @@ -2399,9 +2428,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", - "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "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" ], @@ -2420,9 +2449,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", - "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "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" ], @@ -2441,9 +2470,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", - "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "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" ], @@ -2462,9 +2491,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", - "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "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" ], @@ -2483,9 +2512,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", - "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "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" ], @@ -2504,9 +2533,9 @@ } }, "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", - "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "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" ], @@ -2525,9 +2554,9 @@ } }, "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", - "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "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" ], @@ -2546,9 +2575,9 @@ } }, "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", - "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", + "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" ], @@ -2866,14 +2895,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.4.tgz", - "integrity": "sha512-HFf83SoXbj1K4jkYSSfCg/oXkmSGBx0zG1Lh+dE5GZFdTQmykrBY519aSdrqLVyZzKYjTGfDfSewUeO4a0GE2A==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.7.tgz", + "integrity": "sha512-BB8yMGmYDZzSb8Nu+Ln0TKyeoS3++f9STCYw30NwM3IViHxJJYxu/zowzwSa9TjftIzdCpbOaPxGS0vU9UOUDQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.4", - "@angular-devkit/schematics": "19.1.4", + "@angular-devkit/core": "19.1.7", + "@angular-devkit/schematics": "19.1.7", "jsonc-parser": "3.3.1" }, "engines": { @@ -2883,13 +2912,13 @@ } }, "node_modules/@sigstore/bundle": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.0.0.tgz", - "integrity": "sha512-XDUYX56iMPAn/cdgh/DTJxz5RWmqKV4pwvUAEKEWJl+HzKdCd/24wUa9JYNMlDSCb7SUHAdtksxYX779Nne/Zg==", + "version": "3.1.0", + "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": { - "@sigstore/protobuf-specs": "^0.3.2" + "@sigstore/protobuf-specs": "^0.4.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -2906,9 +2935,9 @@ } }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.3.tgz", - "integrity": "sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.0.tgz", + "integrity": "sha512-o09cLSIq9EKyRXwryWDOJagkml9XgQCoCSRjHOnHLnvsivaW7Qznzz6yjfV7PHJHhIvyp8OH7OX8w0Dc5bQK7A==", "dev": true, "license": "Apache-2.0", "engines": { @@ -2916,16 +2945,16 @@ } }, "node_modules/@sigstore/sign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.0.0.tgz", - "integrity": "sha512-UjhDMQOkyDoktpXoc5YPJpJK6IooF2gayAr5LvXI4EL7O0vd58okgfRcxuaH+YTdhvb5aa1Q9f+WJ0c2sVuYIw==", + "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.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "make-fetch-happen": "^14.0.1", + "@sigstore/protobuf-specs": "^0.4.0", + "make-fetch-happen": "^14.0.2", "proc-log": "^5.0.0", "promise-retry": "^2.0.1" }, @@ -2934,13 +2963,13 @@ } }, "node_modules/@sigstore/tuf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.0.0.tgz", - "integrity": "sha512-9Xxy/8U5OFJu7s+OsHzI96IX/OzjF/zj0BSSaWhgJgTqtlBhQIV2xdrQI5qxLD7+CWWDepadnXAxzaZ3u9cvRw==", + "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": { - "@sigstore/protobuf-specs": "^0.3.2", + "@sigstore/protobuf-specs": "^0.4.0", "tuf-js": "^3.0.1" }, "engines": { @@ -2948,15 +2977,15 @@ } }, "node_modules/@sigstore/verify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.0.0.tgz", - "integrity": "sha512-Ggtq2GsJuxFNUvQzLoXqRwS4ceRfLAJnrIHUDrzAD0GgnOhwujJkKkxM/s5Bako07c3WtAs/sZo5PJq7VHjeDg==", + "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": { - "@sigstore/bundle": "^3.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2" + "@sigstore/protobuf-specs": "^0.4.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -2994,9 +3023,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.10.tgz", - "integrity": "sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww==", + "version": "22.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", + "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", "dev": true, "license": "MIT", "peer": true, @@ -3096,13 +3125,16 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/ansi-styles": { @@ -3355,9 +3387,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001695", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz", - "integrity": "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==", + "version": "1.0.30001699", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz", + "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==", "dev": true, "funding": [ { @@ -3496,6 +3528,16 @@ "node": ">=12" } }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -3528,6 +3570,19 @@ "node": ">=8" } }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -3767,9 +3822,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.87", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.87.tgz", - "integrity": "sha512-mPFwmEWmRivw2F8x3w3l2m6htAUN97Gy0kwpO++2m9iT1Gt8RCFVUfv9U/sIbHJ6rY4P6/ooqFL/eL7ock+pPg==", + "version": "1.5.100", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.100.tgz", + "integrity": "sha512-u1z9VuzDXV86X2r3vAns0/5ojfXBue9o0+JDUDBKYqGLjxLkSqsSUoPU/6kW0gx76V44frHaf6Zo+QF74TQCMg==", "dev": true, "license": "ISC" }, @@ -3907,9 +3962,9 @@ "license": "MIT" }, "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", + "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", "dev": true, "license": "Apache-2.0" }, @@ -3970,9 +4025,9 @@ "license": "BSD-3-Clause" }, "node_modules/fastq": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", - "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", + "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", "dev": true, "license": "ISC", "dependencies": { @@ -4561,19 +4616,6 @@ "node": ">=18.0.0" } }, - "node_modules/listr2/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, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/listr2/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", @@ -4587,22 +4629,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/listr2/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, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/listr2/node_modules/wrap-ansi": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", @@ -4701,19 +4727,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/log-update/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", @@ -4760,22 +4773,6 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/log-update/node_modules/wrap-ansi": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", @@ -5179,9 +5176,9 @@ "optional": true }, "node_modules/node-gyp": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.0.0.tgz", - "integrity": "sha512-zQS+9MTTeCMgY0F3cWPyJyRFAkVltQ1uXm+xXu/ES6KFgC6Czo1Seb9vQW2wNxSX2OrDTiqL0ojtkFxBQ0ypIw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.1.0.tgz", + "integrity": "sha512-/+7TuHKnBpnMvUQnsYEb0JOozDZqarQbfNuSGLXIjhStMT0fbw7IdSqWgopOP5xhRZE+lsbIvAHcekddruPZgQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5450,6 +5447,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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": ">=8" + } + }, "node_modules/ora/node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -5500,6 +5507,19 @@ "dev": true, "license": "ISC" }, + "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": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ordered-binary": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.3.tgz", @@ -5683,9 +5703,9 @@ } }, "node_modules/postcss": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", - "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", + "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", "dev": true, "funding": [ { @@ -5786,9 +5806,9 @@ } }, "node_modules/readdirp": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz", - "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, "license": "MIT", "engines": { @@ -6079,18 +6099,18 @@ } }, "node_modules/sigstore": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.0.0.tgz", - "integrity": "sha512-PHMifhh3EN4loMcHCz6l3v/luzgT3za+9f8subGgeMNjbJjzH4Ij/YoX3Gvu+kaouJRIlVdTHHCREADYf+ZteA==", + "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.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "@sigstore/sign": "^3.0.0", - "@sigstore/tuf": "^3.0.0", - "@sigstore/verify": "^2.0.0" + "@sigstore/protobuf-specs": "^0.4.0", + "@sigstore/sign": "^3.1.0", + "@sigstore/tuf": "^3.1.0", + "@sigstore/verify": "^2.1.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -6138,9 +6158,9 @@ } }, "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", + "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6287,6 +6307,16 @@ "node": ">=8" } }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -6304,20 +6334,20 @@ "node": ">=8" } }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "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, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "ansi-regex": "^5.0.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=8" } }, - "node_modules/string-width/node_modules/strip-ansi": { + "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==", @@ -6333,7 +6363,8 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/strip-ansi": { + "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==", @@ -6346,16 +6377,12 @@ "node": ">=8" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "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, "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { "node": ">=8" } @@ -6652,9 +6679,9 @@ } }, "node_modules/vite": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.7.tgz", - "integrity": "sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==", + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz", + "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==", "dev": true, "license": "MIT", "dependencies": { @@ -6805,6 +6832,16 @@ "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", @@ -6837,6 +6874,29 @@ "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-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", @@ -6869,6 +6929,19 @@ "node": ">=8" } }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -6915,6 +6988,16 @@ "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==", + "dev": true, + "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", @@ -6947,6 +7030,19 @@ "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yoctocolors-cjs": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", diff --git a/packages/zone.js/yarn.lock b/packages/zone.js/yarn.lock index a861994ee43a..0c307258807a 100644 --- a/packages/zone.js/yarn.lock +++ b/packages/zone.js/yarn.lock @@ -10,7 +10,7 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.2": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.26.2": version "7.26.2" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== @@ -20,38 +20,38 @@ picocolors "^1.0.0" "@babel/compat-data@^7.26.5": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.5.tgz#df93ac37f4417854130e21d72c66ff3d4b897fc7" - integrity sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg== + version "7.26.8" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.8.tgz#821c1d35641c355284d4a870b8a4a7b0c141e367" + integrity sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ== "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.7.tgz#0439347a183b97534d52811144d763a17f9d2b24" - integrity sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA== + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.9.tgz#71838542a4b1e49dfed353d7acbc6eb89f4a76f2" + integrity sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.5" + "@babel/generator" "^7.26.9" "@babel/helper-compilation-targets" "^7.26.5" "@babel/helper-module-transforms" "^7.26.0" - "@babel/helpers" "^7.26.7" - "@babel/parser" "^7.26.7" - "@babel/template" "^7.25.9" - "@babel/traverse" "^7.26.7" - "@babel/types" "^7.26.7" + "@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" -"@babel/generator@^7.26.5", "@babel/generator@^7.7.2": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.5.tgz#e44d4ab3176bbcaf78a5725da5f1dc28802a9458" - integrity sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw== +"@babel/generator@^7.26.9", "@babel/generator@^7.7.2": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.9.tgz#75a9482ad3d0cc7188a537aa4910bc59db67cbca" + integrity sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg== dependencies: - "@babel/parser" "^7.26.5" - "@babel/types" "^7.26.5" + "@babel/parser" "^7.26.9" + "@babel/types" "^7.26.9" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" @@ -104,20 +104,20 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== -"@babel/helpers@^7.26.7": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.7.tgz#fd1d2a7c431b6e39290277aacfd8367857c576a4" - integrity sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A== +"@babel/helpers@^7.26.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.9.tgz#28f3fb45252fc88ef2dc547c8a911c255fc9fef6" + integrity sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA== dependencies: - "@babel/template" "^7.25.9" - "@babel/types" "^7.26.7" + "@babel/template" "^7.26.9" + "@babel/types" "^7.26.9" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.9", "@babel/parser@^7.26.5", "@babel/parser@^7.26.7": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.7.tgz#e114cd099e5f7d17b05368678da0fb9f69b3385c" - integrity sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.26.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.9.tgz#d9e78bee6dc80f9efd8f2349dcfbbcdace280fd5" + integrity sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A== dependencies: - "@babel/types" "^7.26.7" + "@babel/types" "^7.26.9" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -238,32 +238,32 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/template@^7.25.9", "@babel/template@^7.3.3": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" - integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== +"@babel/template@^7.26.9", "@babel/template@^7.3.3": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.26.9.tgz#4577ad3ddf43d194528cff4e1fa6b232fa609bb2" + integrity sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA== dependencies: - "@babel/code-frame" "^7.25.9" - "@babel/parser" "^7.25.9" - "@babel/types" "^7.25.9" + "@babel/code-frame" "^7.26.2" + "@babel/parser" "^7.26.9" + "@babel/types" "^7.26.9" -"@babel/traverse@^7.25.9", "@babel/traverse@^7.26.7": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.7.tgz#99a0a136f6a75e7fb8b0a1ace421e0b25994b8bb" - integrity sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA== +"@babel/traverse@^7.25.9", "@babel/traverse@^7.26.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.9.tgz#4398f2394ba66d05d988b2ad13c219a2c857461a" + integrity sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg== dependencies: "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.5" - "@babel/parser" "^7.26.7" - "@babel/template" "^7.25.9" - "@babel/types" "^7.26.7" + "@babel/generator" "^7.26.9" + "@babel/parser" "^7.26.9" + "@babel/template" "^7.26.9" + "@babel/types" "^7.26.9" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.26.5", "@babel/types@^7.26.7", "@babel/types@^7.3.3": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.7.tgz#5e2b89c0768e874d4d061961f3a5a153d71dc17a" - integrity sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.26.9", "@babel/types@^7.3.3": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.9.tgz#08b43dec79ee8e682c2ac631c010bdcac54a21ce" + integrity sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw== dependencies: "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" @@ -628,9 +628,9 @@ parse5 "^7.0.0" "@types/node@*": - version "22.10.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.10.tgz#85fe89f8bf459dc57dfef1689bd5b52ad1af07e6" - integrity sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww== + version "22.13.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.4.tgz#3fe454d77cd4a2d73c214008b3e331bfaaf5038a" + integrity sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg== dependencies: undici-types "~6.20.0" @@ -895,9 +895,9 @@ camelcase@^6.0.0, camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001688: - version "1.0.30001695" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz#39dfedd8f94851132795fdf9b79d29659ad9c4d4" - integrity sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw== + version "1.0.30001699" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz#a102cf330d153bf8c92bfb5be3cd44c0a89c8c12" + integrity sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w== chalk@4.x, chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" @@ -933,9 +933,9 @@ ci-info@^3.2.0: integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjs-module-lexer@^1.0.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" - integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== + version "1.4.3" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz#0f79731eb8cfe1ec72acd4066efac9d61991b00d" + integrity sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q== cliui@^8.0.1: version "8.0.1" @@ -1126,9 +1126,9 @@ eastasianwidth@^0.2.0: integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== electron-to-chromium@^1.5.73: - version "1.5.87" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.87.tgz#3a89bec85e43a8b32445ec938228e4ec982e0f79" - integrity sha512-mPFwmEWmRivw2F8x3w3l2m6htAUN97Gy0kwpO++2m9iT1Gt8RCFVUfv9U/sIbHJ6rY4P6/ooqFL/eL7ock+pPg== + version "1.5.100" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.100.tgz#c99b7cfe49ec72c5e22237f036bb8b1d8b7f0621" + integrity sha512-u1z9VuzDXV86X2r3vAns0/5ojfXBue9o0+JDUDBKYqGLjxLkSqsSUoPU/6kW0gx76V44frHaf6Zo+QF74TQCMg== emittery@^0.13.1: version "0.13.1" @@ -2534,9 +2534,9 @@ semver@^6.3.0, semver@^6.3.1: integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.5.3, semver@^7.5.4: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + version "7.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== serialize-javascript@^6.0.2: version "6.0.2" diff --git a/yarn.lock b/yarn.lock index 6889c94a1fb0..27ac1a4ed7e5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -40,121 +40,121 @@ resolved "https://registry.yarnpkg.com/@actions/io/-/io-1.1.3.tgz#4cdb6254da7962b07473ff5c335f3da485d94d71" integrity sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q== -"@algolia/client-abtesting@5.20.0": - version "5.20.0" - resolved "https://registry.yarnpkg.com/@algolia/client-abtesting/-/client-abtesting-5.20.0.tgz#984472e4ae911285a8e3be2b81c121108f87a179" - integrity sha512-YaEoNc1Xf2Yk6oCfXXkZ4+dIPLulCx8Ivqj0OsdkHWnsI3aOJChY5qsfyHhDBNSOhqn2ilgHWxSfyZrjxBcAww== - dependencies: - "@algolia/client-common" "5.20.0" - "@algolia/requester-browser-xhr" "5.20.0" - "@algolia/requester-fetch" "5.20.0" - "@algolia/requester-node-http" "5.20.0" - -"@algolia/client-analytics@5.20.0": - version "5.20.0" - resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-5.20.0.tgz#25944c8c7bcc06a16ae3b26ddf86d0d18f984349" - integrity sha512-CIT9ni0+5sYwqehw+t5cesjho3ugKQjPVy/iPiJvtJX4g8Cdb6je6SPt2uX72cf2ISiXCAX9U3cY0nN0efnRDw== - dependencies: - "@algolia/client-common" "5.20.0" - "@algolia/requester-browser-xhr" "5.20.0" - "@algolia/requester-fetch" "5.20.0" - "@algolia/requester-node-http" "5.20.0" - -"@algolia/client-common@5.20.0": - version "5.20.0" - resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-5.20.0.tgz#0b6b96c779d30afada68cf36f20f0c280e3f1273" - integrity sha512-iSTFT3IU8KNpbAHcBUJw2HUrPnMXeXLyGajmCL7gIzWOsYM4GabZDHXOFx93WGiXMti1dymz8k8R+bfHv1YZmA== - -"@algolia/client-insights@5.20.0": - version "5.20.0" - resolved "https://registry.yarnpkg.com/@algolia/client-insights/-/client-insights-5.20.0.tgz#37b59043a86423dd283d05909faea06e4eff026b" - integrity sha512-w9RIojD45z1csvW1vZmAko82fqE/Dm+Ovsy2ElTsjFDB0HMAiLh2FO86hMHbEXDPz6GhHKgGNmBRiRP8dDPgJg== - dependencies: - "@algolia/client-common" "5.20.0" - "@algolia/requester-browser-xhr" "5.20.0" - "@algolia/requester-fetch" "5.20.0" - "@algolia/requester-node-http" "5.20.0" - -"@algolia/client-personalization@5.20.0": - version "5.20.0" - resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-5.20.0.tgz#d10da6d798f9a5f6cf239c57b9a850deb29e5683" - integrity sha512-p/hftHhrbiHaEcxubYOzqVV4gUqYWLpTwK+nl2xN3eTrSW9SNuFlAvUBFqPXSVBqc6J5XL9dNKn3y8OA1KElSQ== - dependencies: - "@algolia/client-common" "5.20.0" - "@algolia/requester-browser-xhr" "5.20.0" - "@algolia/requester-fetch" "5.20.0" - "@algolia/requester-node-http" "5.20.0" - -"@algolia/client-query-suggestions@5.20.0": - version "5.20.0" - resolved "https://registry.yarnpkg.com/@algolia/client-query-suggestions/-/client-query-suggestions-5.20.0.tgz#1d4f1d638f857fad202cee7feecd3ffc270d9c60" - integrity sha512-m4aAuis5vZi7P4gTfiEs6YPrk/9hNTESj3gEmGFgfJw3hO2ubdS4jSId1URd6dGdt0ax2QuapXufcrN58hPUcw== - dependencies: - "@algolia/client-common" "5.20.0" - "@algolia/requester-browser-xhr" "5.20.0" - "@algolia/requester-fetch" "5.20.0" - "@algolia/requester-node-http" "5.20.0" - -"@algolia/client-search@5.20.0": - version "5.20.0" - resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-5.20.0.tgz#4b847bda4bef2eee8ba72ef3ce59be612319e8d0" - integrity sha512-KL1zWTzrlN4MSiaK1ea560iCA/UewMbS4ZsLQRPoDTWyrbDKVbztkPwwv764LAqgXk0fvkNZvJ3IelcK7DqhjQ== - dependencies: - "@algolia/client-common" "5.20.0" - "@algolia/requester-browser-xhr" "5.20.0" - "@algolia/requester-fetch" "5.20.0" - "@algolia/requester-node-http" "5.20.0" - -"@algolia/ingestion@1.20.0": - version "1.20.0" - resolved "https://registry.yarnpkg.com/@algolia/ingestion/-/ingestion-1.20.0.tgz#b91849fe4a8efed21c048a0a69ad77934d2fc3fd" - integrity sha512-shj2lTdzl9un4XJblrgqg54DoK6JeKFO8K8qInMu4XhE2JuB8De6PUuXAQwiRigZupbI0xq8aM0LKdc9+qiLQA== - dependencies: - "@algolia/client-common" "5.20.0" - "@algolia/requester-browser-xhr" "5.20.0" - "@algolia/requester-fetch" "5.20.0" - "@algolia/requester-node-http" "5.20.0" - -"@algolia/monitoring@1.20.0": - version "1.20.0" - resolved "https://registry.yarnpkg.com/@algolia/monitoring/-/monitoring-1.20.0.tgz#5b3a7964b08a91b1c71466bf5adb8a1597e3134b" - integrity sha512-aF9blPwOhKtWvkjyyXh9P5peqmhCA1XxLBRgItT+K6pbT0q4hBDQrCid+pQZJYy4HFUKjB/NDDwyzFhj/rwKhw== - dependencies: - "@algolia/client-common" "5.20.0" - "@algolia/requester-browser-xhr" "5.20.0" - "@algolia/requester-fetch" "5.20.0" - "@algolia/requester-node-http" "5.20.0" - -"@algolia/recommend@5.20.0": - version "5.20.0" - resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-5.20.0.tgz#49f8f8d31f815b107c8ebd1c35220d90b22fd876" - integrity sha512-T6B/WPdZR3b89/F9Vvk6QCbt/wrLAtrGoL8z4qPXDFApQ8MuTFWbleN/4rHn6APWO3ps+BUePIEbue2rY5MlRw== - dependencies: - "@algolia/client-common" "5.20.0" - "@algolia/requester-browser-xhr" "5.20.0" - "@algolia/requester-fetch" "5.20.0" - "@algolia/requester-node-http" "5.20.0" - -"@algolia/requester-browser-xhr@5.20.0": - version "5.20.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.20.0.tgz#998fd5c1123fbc49b664c484c6b0cd7cefc6a1fa" - integrity sha512-t6//lXsq8E85JMenHrI6mhViipUT5riNhEfCcvtRsTV+KIBpC6Od18eK864dmBhoc5MubM0f+sGpKOqJIlBSCg== - dependencies: - "@algolia/client-common" "5.20.0" - -"@algolia/requester-fetch@5.20.0": - version "5.20.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-fetch/-/requester-fetch-5.20.0.tgz#fed4f135f22c246ce40cf23c9d6518884be43e5e" - integrity sha512-FHxYGqRY+6bgjKsK4aUsTAg6xMs2S21elPe4Y50GB0Y041ihvw41Vlwy2QS6K9ldoftX4JvXodbKTcmuQxywdQ== - dependencies: - "@algolia/client-common" "5.20.0" - -"@algolia/requester-node-http@5.20.0": - version "5.20.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-5.20.0.tgz#920a9488be07c0521951da92f36be61f47c4d0e0" - integrity sha512-kmtQClq/w3vtPteDSPvaW9SPZL/xrIgMrxZyAgsFwrJk0vJxqyC5/hwHmrCraDnStnGSADnLpBf4SpZnwnkwWw== - dependencies: - "@algolia/client-common" "5.20.0" +"@algolia/client-abtesting@5.20.2": + version "5.20.2" + resolved "https://registry.yarnpkg.com/@algolia/client-abtesting/-/client-abtesting-5.20.2.tgz#e0d950735cbe4e00960418749839820a333f9df0" + integrity sha512-IS8JSFsDD33haaKIIFaL7qj3bEIG9GldZfb3ILW0QF3at7TcrIJYy58hrDvFee5T3p3E2aH/+wqIr0eha8jB/w== + dependencies: + "@algolia/client-common" "5.20.2" + "@algolia/requester-browser-xhr" "5.20.2" + "@algolia/requester-fetch" "5.20.2" + "@algolia/requester-node-http" "5.20.2" + +"@algolia/client-analytics@5.20.2": + version "5.20.2" + resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-5.20.2.tgz#b8bc4ff50c3968e58b11a56ce50e8732c056ca19" + integrity sha512-k0KxCfcX/HZySqPasKy6GkiiDuebaMh2v/nE0HHg1PbsyeyagLapDi6Ktjkxhz8NlUq6eTJR+ddGJegippKQtQ== + dependencies: + "@algolia/client-common" "5.20.2" + "@algolia/requester-browser-xhr" "5.20.2" + "@algolia/requester-fetch" "5.20.2" + "@algolia/requester-node-http" "5.20.2" + +"@algolia/client-common@5.20.2": + version "5.20.2" + resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-5.20.2.tgz#4a80baedbe739ae84fde300a1f539508e5ae38a7" + integrity sha512-xoZcL/Uu49KYDb3feu2n06gALD17p5CslO8Zk3mZ7+uTurK3lgjLws7LNetZ172Ap/GpzPCRXI83d2iDoYQD6Q== + +"@algolia/client-insights@5.20.2": + version "5.20.2" + resolved "https://registry.yarnpkg.com/@algolia/client-insights/-/client-insights-5.20.2.tgz#cf1c21e2c40c3751276c27048c72a3b164b0a4f2" + integrity sha512-fy7aCbo9y7WHt/9G03EYc471Dd5kIaM8PNP4z6AEQYr9a9X8c4inwNs6tePxAEfRHwVQi0CZ7kuVdn6/MjWx1A== + dependencies: + "@algolia/client-common" "5.20.2" + "@algolia/requester-browser-xhr" "5.20.2" + "@algolia/requester-fetch" "5.20.2" + "@algolia/requester-node-http" "5.20.2" + +"@algolia/client-personalization@5.20.2": + version "5.20.2" + resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-5.20.2.tgz#ab8342c1e5f1a4ae71383dffdb25910c5df9d06e" + integrity sha512-ocL1ZXulfuXzJAwsKw2kMscKMD0rs/f4CFYu6Gjh4mK4um6rGfa1a6u1MSc4swFqRQer0wNP9Pi+kVfKhuKt5A== + dependencies: + "@algolia/client-common" "5.20.2" + "@algolia/requester-browser-xhr" "5.20.2" + "@algolia/requester-fetch" "5.20.2" + "@algolia/requester-node-http" "5.20.2" + +"@algolia/client-query-suggestions@5.20.2": + version "5.20.2" + resolved "https://registry.yarnpkg.com/@algolia/client-query-suggestions/-/client-query-suggestions-5.20.2.tgz#fc2d5836aaf90fba60fc347e0f1b1e8e4ab15592" + integrity sha512-Xjs4Tj1zkLCnmq1ys8RRhLQPy002I6GuT/nbHVdSQmQu4yKCI0gOFbwxHdM6yYPEuE3cJx7A4wSQjCH21mUKsg== + dependencies: + "@algolia/client-common" "5.20.2" + "@algolia/requester-browser-xhr" "5.20.2" + "@algolia/requester-fetch" "5.20.2" + "@algolia/requester-node-http" "5.20.2" + +"@algolia/client-search@5.20.2": + version "5.20.2" + resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-5.20.2.tgz#941788be5c238197d30a21237e0b3f28d80db874" + integrity sha512-2cD3RGB5byusLS0DAX1Nvl5MLiv7OoGgQrRs+94dTalqjvK8lGKzxxJhXoVojgx2qcROyIUAIDXFdTqv6NIHaA== + dependencies: + "@algolia/client-common" "5.20.2" + "@algolia/requester-browser-xhr" "5.20.2" + "@algolia/requester-fetch" "5.20.2" + "@algolia/requester-node-http" "5.20.2" + +"@algolia/ingestion@1.20.2": + version "1.20.2" + resolved "https://registry.yarnpkg.com/@algolia/ingestion/-/ingestion-1.20.2.tgz#f506af644979974a6842fb75ac90df8782da4b0d" + integrity sha512-S593Kmhc98+5zdzGet4GrZEBEBGl4vVtqg/MPfW8dCRf9qDRNYSkhBsIzlhQe9JWiohe9oB9LW5meibwOgRmww== + dependencies: + "@algolia/client-common" "5.20.2" + "@algolia/requester-browser-xhr" "5.20.2" + "@algolia/requester-fetch" "5.20.2" + "@algolia/requester-node-http" "5.20.2" + +"@algolia/monitoring@1.20.2": + version "1.20.2" + resolved "https://registry.yarnpkg.com/@algolia/monitoring/-/monitoring-1.20.2.tgz#920ce38c5d2250bc34692bc256b622e72c3f8169" + integrity sha512-bW41aWLYgBv/coJUIT85mkN3kk1VBKsM8tlwB5S/s446Mgc7r8t5TX7kA8kCR2UbwDedOK51i/85/x/rM0ZXbg== + dependencies: + "@algolia/client-common" "5.20.2" + "@algolia/requester-browser-xhr" "5.20.2" + "@algolia/requester-fetch" "5.20.2" + "@algolia/requester-node-http" "5.20.2" + +"@algolia/recommend@5.20.2": + version "5.20.2" + resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-5.20.2.tgz#423ebaddf13de43a8eb28b0642b60e85f3393e34" + integrity sha512-wBMf3J1L5ogvU8p8ifHkknDXWn1zdZ2epkqpt2MkUaZynE3G77rrFU9frcO+Pu1FQJQ5xCDTKcYUUcJCDD00rg== + dependencies: + "@algolia/client-common" "5.20.2" + "@algolia/requester-browser-xhr" "5.20.2" + "@algolia/requester-fetch" "5.20.2" + "@algolia/requester-node-http" "5.20.2" + +"@algolia/requester-browser-xhr@5.20.2": + version "5.20.2" + resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.20.2.tgz#ec674ae20e9fecde1c1a73c5cb0fcfacd3803bac" + integrity sha512-w+VMzOkIq2XDGg6Ybzr74RlBZvJQnuIdKpVusQSXCXknvxwAwbO457LmoavhZWl06Lcsk9YDx1X2k0zb+iJQmw== + dependencies: + "@algolia/client-common" "5.20.2" + +"@algolia/requester-fetch@5.20.2": + version "5.20.2" + resolved "https://registry.yarnpkg.com/@algolia/requester-fetch/-/requester-fetch-5.20.2.tgz#13d59d9c946d9cd3de319865d70db64e255028e4" + integrity sha512-wpjnbvbi3A13b0DvijE45DRYDvwcP5Ttz7RTMkPWTkF1s6AHuo6O2UcwGyaogMAGa1QOOzFYfp5u4YQwMOQx5g== + dependencies: + "@algolia/client-common" "5.20.2" + +"@algolia/requester-node-http@5.20.2": + version "5.20.2" + resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-5.20.2.tgz#29bd7333dbec0d24dfecd2e1d8276fe40e67ea9d" + integrity sha512-YuSSdtgUt1dFBTNYUb+2TA5j0Hd0eDXE0bVISjUvTCqmoaGsGLwW+rKI7p1eLQ1r7RESwBAvUwcY1qP2Wl3Lyw== + dependencies: + "@algolia/client-common" "5.20.2" "@ampproject/remapping@2.3.0", "@ampproject/remapping@^2.2.0": version "2.3.0" @@ -309,9 +309,9 @@ rxjs "7.8.1" "@angular/animations@^19.2.0-next": - version "19.2.0-next.0" - resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-19.2.0-next.0.tgz#cf5b9f21308bc1fd8952c693d7aadb7bbd4f1b11" - integrity sha512-xeh+Y9L3w1df2ebMEFOh/pniRoGOZ2zkvZxIkGPeAcIsrAchkWnOziUq1hsXzlilBOAWt5A5rcHsEfFj0atFQQ== + version "19.2.0-next.3" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-19.2.0-next.3.tgz#14633e295cba9f1903e015577337a09f7e0b56ba" + integrity sha512-yG941CZo2RbBX3ap5mw7heKFSmxPAVRSzHaIun3S6FkSZ40PdhVDKPV6ATGvv6Q8IhuCS1uSyWWSczdYI4N8hw== dependencies: tslib "^2.3.0" @@ -325,6 +325,7 @@ "@angular/build-tooling@https://github.com/angular/dev-infra-private-build-tooling-builds.git#ce04ec6cf7604014191821a637e60964a1a3bb4a": version "0.0.0-2670abf637fa155971cdd1f7e570a7f234922a65" + uid ce04ec6cf7604014191821a637e60964a1a3bb4a resolved "https://github.com/angular/dev-infra-private-build-tooling-builds.git#ce04ec6cf7604014191821a637e60964a1a3bb4a" dependencies: "@angular/benchpress" "0.3.0" @@ -466,9 +467,9 @@ tslib "^2.3.0" "@angular/core@^19.2.0-next": - version "19.2.0-next.0" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-19.2.0-next.0.tgz#f06853518ccb893f05a68402f34bc105d5ac7176" - integrity sha512-3pEKc5gVgZ9tKzoQhTGco+47zePDQ+n+4a0oB6ioethR+zLtor1eFciVu7SdiSpwqGO9CE9YIl0zZQ5seLSYcQ== + version "19.2.0-next.3" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-19.2.0-next.3.tgz#c352ccda7afc9bd321ec0b23d87f273b9cdb1cc5" + integrity sha512-AvbXcJZjo2djukfVsSOHQFQ6yV/D1aySqMxlwpNdGwr/cL03Rsf+Is40NBl9uakhJSg9UN16k5klmul0hczIhQ== dependencies: tslib "^2.3.0" @@ -481,6 +482,7 @@ "@angular/ng-dev@https://github.com/angular/dev-infra-private-ng-dev-builds.git#e29eb33d02c473598361716df343c13016a6c943": version "0.0.0-002a34e9875f55bf1850fb57d34261b33b2fd492" + uid e29eb33d02c473598361716df343c13016a6c943 resolved "https://github.com/angular/dev-infra-private-ng-dev-builds.git#e29eb33d02c473598361716df343c13016a6c943" dependencies: "@google-cloud/spanner" "7.18.1" @@ -503,18 +505,18 @@ dependencies: tslib "^2.3.0" -"@antfu/install-pkg@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@antfu/install-pkg/-/install-pkg-0.4.1.tgz#d1d7f3be96ecdb41581629cafe8626d1748c0cf1" - integrity sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw== +"@antfu/install-pkg@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@antfu/install-pkg/-/install-pkg-1.0.0.tgz#2912a150fc8b35ec912f583f90074ee98f64d66a" + integrity sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw== dependencies: - package-manager-detector "^0.2.0" - tinyexec "^0.3.0" + package-manager-detector "^0.2.8" + tinyexec "^0.3.2" -"@antfu/utils@^0.7.10": - version "0.7.10" - resolved "https://registry.yarnpkg.com/@antfu/utils/-/utils-0.7.10.tgz#ae829f170158e297a9b6a28f161a8e487d00814d" - integrity sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww== +"@antfu/utils@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@antfu/utils/-/utils-8.1.0.tgz#eea8fd74f35942a31c98f2bbd5a79b20bc18a515" + integrity sha512-XPR7Jfwp0FFl/dFYPX8ZjpmU4/1mIXTjnZ1ba48BLMyKOV62/tiRjdsFcPs2hsYcSud4tzk7w3a3LjX8Fu3huA== "@apidevtools/json-schema-ref-parser@^9.0.3": version "9.1.2" @@ -553,7 +555,7 @@ "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" chokidar "^3.6.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2": version "7.26.2" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== @@ -562,12 +564,7 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.26.5": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.5.tgz#df93ac37f4417854130e21d72c66ff3d4b897fc7" - integrity sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg== - -"@babel/compat-data@^7.26.8": +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.26.5", "@babel/compat-data@^7.26.8": version "7.26.8" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.8.tgz#821c1d35641c355284d4a870b8a4a7b0c141e367" integrity sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ== @@ -615,7 +612,7 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/core@7.26.9": +"@babel/core@7.26.9", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.23.9": version "7.26.9" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.9.tgz#71838542a4b1e49dfed353d7acbc6eb89f4a76f2" integrity sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw== @@ -636,28 +633,7 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.23.9": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.7.tgz#0439347a183b97534d52811144d763a17f9d2b24" - integrity sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.5" - "@babel/helper-compilation-targets" "^7.26.5" - "@babel/helper-module-transforms" "^7.26.0" - "@babel/helpers" "^7.26.7" - "@babel/parser" "^7.26.7" - "@babel/template" "^7.25.9" - "@babel/traverse" "^7.26.7" - "@babel/types" "^7.26.7" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/generator@7.26.8", "@babel/generator@^7.26.8": +"@babel/generator@7.26.8": version "7.26.8" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.8.tgz#f9c5e770309e12e3099ad8271e52f6caa15442ab" integrity sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA== @@ -668,7 +644,7 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" -"@babel/generator@7.26.9", "@babel/generator@^7.26.9": +"@babel/generator@7.26.9", "@babel/generator@^7.26.0", "@babel/generator@^7.26.8", "@babel/generator@^7.26.9": version "7.26.9" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.9.tgz#75a9482ad3d0cc7188a537aa4910bc59db67cbca" integrity sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg== @@ -679,17 +655,6 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" -"@babel/generator@^7.26.0", "@babel/generator@^7.26.5": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.5.tgz#e44d4ab3176bbcaf78a5725da5f1dc28802a9458" - integrity sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw== - dependencies: - "@babel/parser" "^7.26.5" - "@babel/types" "^7.26.5" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^3.0.2" - "@babel/helper-annotate-as-pure@7.25.9", "@babel/helper-annotate-as-pure@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz#d8eac4d2dc0d7b6e11fa6e535332e0d3184f06b4" @@ -709,16 +674,16 @@ semver "^6.3.1" "@babel/helper-create-class-features-plugin@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz#7644147706bb90ff613297d49ed5266bde729f83" - integrity sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ== + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.26.9.tgz#d6f83e3039547fbb39967e78043cd3c8b7820c71" + integrity sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg== dependencies: "@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.25.9" + "@babel/helper-replace-supers" "^7.26.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" - "@babel/traverse" "^7.25.9" + "@babel/traverse" "^7.26.9" semver "^6.3.1" "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.25.9": @@ -794,7 +759,7 @@ "@babel/helper-wrap-function" "^7.25.9" "@babel/traverse" "^7.25.9" -"@babel/helper-replace-supers@^7.25.9": +"@babel/helper-replace-supers@^7.25.9", "@babel/helper-replace-supers@^7.26.5": version "7.26.5" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz#6cb04e82ae291dae8e72335dfe438b0725f14c8d" integrity sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg== @@ -842,15 +807,7 @@ "@babel/traverse" "^7.25.9" "@babel/types" "^7.25.9" -"@babel/helpers@^7.26.0", "@babel/helpers@^7.26.7": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.7.tgz#fd1d2a7c431b6e39290277aacfd8367857c576a4" - integrity sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A== - dependencies: - "@babel/template" "^7.25.9" - "@babel/types" "^7.26.7" - -"@babel/helpers@^7.26.9": +"@babel/helpers@^7.26.0", "@babel/helpers@^7.26.7", "@babel/helpers@^7.26.9": version "7.26.9" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.9.tgz#28f3fb45252fc88ef2dc547c8a911c255fc9fef6" integrity sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA== @@ -858,21 +815,7 @@ "@babel/template" "^7.26.9" "@babel/types" "^7.26.9" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.4", "@babel/parser@^7.25.3", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.5", "@babel/parser@^7.26.7": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.7.tgz#e114cd099e5f7d17b05368678da0fb9f69b3385c" - integrity sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w== - dependencies: - "@babel/types" "^7.26.7" - -"@babel/parser@^7.26.8": - version "7.26.8" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.8.tgz#deca2b4d99e5e1b1553843b99823f118da6107c2" - integrity sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw== - dependencies: - "@babel/types" "^7.26.8" - -"@babel/parser@^7.26.9": +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.3", "@babel/parser@^7.26.0", "@babel/parser@^7.26.7", "@babel/parser@^7.26.8", "@babel/parser@^7.26.9": version "7.26.9" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.9.tgz#d9e78bee6dc80f9efd8f2349dcfbbcdace280fd5" integrity sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A== @@ -1089,11 +1032,11 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-for-of@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz#4bdc7d42a213397905d89f02350c5267866d5755" - integrity sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A== + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz#27231f79d5170ef33b5111f07fe5cafeb2c96a56" + integrity sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.26.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" "@babel/plugin-transform-function-name@^7.25.9": @@ -1445,32 +1388,21 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/runtime@7.26.7", "@babel/runtime@^7.8.4": +"@babel/runtime@7.26.7": version "7.26.7" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.7.tgz#f4e7fe527cd710f8dc0618610b61b4b060c3c341" integrity sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" - integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== - dependencies: - "@babel/code-frame" "^7.25.9" - "@babel/parser" "^7.25.9" - "@babel/types" "^7.25.9" - -"@babel/template@^7.26.8": - version "7.26.8" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.26.8.tgz#db3898f47a17bab2f4c78ec1d0de38527c2ffe19" - integrity sha512-iNKaX3ZebKIsCvJ+0jd6embf+Aulaa3vNBqZ41kM7iTWjx5qzWKXGHiJUW3+nTpQ18SG11hdF8OAzKrpXkb96Q== +"@babel/runtime@^7.8.4": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.9.tgz#aa4c6facc65b9cb3f87d75125ffd47781b475433" + integrity sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg== dependencies: - "@babel/code-frame" "^7.26.2" - "@babel/parser" "^7.26.8" - "@babel/types" "^7.26.8" + regenerator-runtime "^0.14.0" -"@babel/template@^7.26.9": +"@babel/template@^7.25.9", "@babel/template@^7.26.8", "@babel/template@^7.26.9": version "7.26.9" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.26.9.tgz#4577ad3ddf43d194528cff4e1fa6b232fa609bb2" integrity sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA== @@ -1479,33 +1411,7 @@ "@babel/parser" "^7.26.9" "@babel/types" "^7.26.9" -"@babel/traverse@^7.25.9", "@babel/traverse@^7.26.5", "@babel/traverse@^7.26.7": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.7.tgz#99a0a136f6a75e7fb8b0a1ace421e0b25994b8bb" - integrity sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA== - dependencies: - "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.5" - "@babel/parser" "^7.26.7" - "@babel/template" "^7.25.9" - "@babel/types" "^7.26.7" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/traverse@^7.26.8": - version "7.26.8" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.8.tgz#0a8a9c2b7cc9519eed14275f4fd2278ad46e8cc9" - integrity sha512-nic9tRkjYH0oB2dzr/JoGIm+4Q6SuYeLEiIiZDwBscRMYFJ+tMAz98fuel9ZnbXViA2I0HVSSRRK8DW5fjXStA== - dependencies: - "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.8" - "@babel/parser" "^7.26.8" - "@babel/template" "^7.26.8" - "@babel/types" "^7.26.8" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/traverse@^7.26.9": +"@babel/traverse@^7.25.9", "@babel/traverse@^7.26.5", "@babel/traverse@^7.26.8", "@babel/traverse@^7.26.9": version "7.26.9" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.9.tgz#4398f2394ba66d05d988b2ad13c219a2c857461a" integrity sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg== @@ -1518,23 +1424,7 @@ debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.5", "@babel/types@^7.26.7", "@babel/types@^7.4.4": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.7.tgz#5e2b89c0768e874d4d061961f3a5a153d71dc17a" - integrity sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg== - dependencies: - "@babel/helper-string-parser" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" - -"@babel/types@^7.26.8": - version "7.26.8" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.8.tgz#97dcdc190fab45be7f3dc073e3c11160d677c127" - integrity sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA== - dependencies: - "@babel/helper-string-parser" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" - -"@babel/types@^7.26.9": +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.8", "@babel/types@^7.26.9", "@babel/types@^7.4.4": version "7.26.9" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.9.tgz#08b43dec79ee8e682c2ac631c010bdcac54a21ce" integrity sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw== @@ -1553,9 +1443,9 @@ integrity sha512-0f5eNWhylZQbiTddfVkIXKkugQadzZdonLw4ur58oK4X+gIHOZ42Xv94sepu8Di9UWKFXNc4zxuuTiWM22hGvw== "@bazel/buildifier@^8.0.0": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@bazel/buildifier/-/buildifier-8.0.1.tgz#ddad9c35b1f2ac13fa294aa3dc9803d2942668a4" - integrity sha512-ioXkHJvteN33pFpSsI8zNij2QU4ZlvG4JBB/jxNkeLzU9FPsSY3SiMtxPCWkQj1THjsTtX1p+4bEd4HQNm28LA== + version "8.0.3" + resolved "https://registry.yarnpkg.com/@bazel/buildifier/-/buildifier-8.0.3.tgz#445c6f078040e8c155fe0922ae1114dafc7ce1ee" + integrity sha512-X4BbSHDZrvXaldGKW0AkBMC0HPOosJyPykE8Z5LpGBCmCdgIhRJHtAjBOG21NRmZpwI8fc7A1rhhSOJ7UGmbFg== "@bazel/concatjs@5.8.1": version "5.8.1" @@ -1671,9 +1561,9 @@ integrity sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ== "@codemirror/autocomplete@^6.0.0", "@codemirror/autocomplete@^6.11.1": - version "6.18.4" - resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.18.4.tgz#4394f55d6771727179f2e28a871ef46bbbeb11b1" - integrity sha512-sFAphGQIqyQZfP2ZBsSHV7xQvo9Py0rV0dW7W3IMRdS+zDuNb2l3no78CvUaWKGfzFjI4FTrLdUSj86IGb2hRA== + version "6.18.6" + resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.18.6.tgz#de26e864a1ec8192a1b241eb86addbb612964ddb" + integrity sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg== dependencies: "@codemirror/language" "^6.0.0" "@codemirror/state" "^6.0.0" @@ -1729,9 +1619,9 @@ "@lezer/html" "^1.3.0" "@codemirror/lang-javascript@^6.0.0", "@codemirror/lang-javascript@^6.1.2", "@codemirror/lang-javascript@^6.2.1": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@codemirror/lang-javascript/-/lang-javascript-6.2.2.tgz#7141090b22994bef85bcc5608a3bc1257f2db2ad" - integrity sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg== + version "6.2.3" + resolved "https://registry.yarnpkg.com/@codemirror/lang-javascript/-/lang-javascript-6.2.3.tgz#d705c359dc816afcd3bcdf120a559f83d31d4cda" + integrity sha512-8PR3vIWg7pSu7ur8A07pGiYHgy3hHj+mRYRCSG8q+mPIrl0F02rgpGv+DsQTHRTc30rydOsf5PZ7yjKFg2Ackw== dependencies: "@codemirror/autocomplete" "^6.0.0" "@codemirror/language" "^6.6.0" @@ -1774,18 +1664,18 @@ crelt "^1.0.5" "@codemirror/search@^6.5.5": - version "6.5.8" - resolved "https://registry.yarnpkg.com/@codemirror/search/-/search-6.5.8.tgz#b59b3659b46184cc75d6108d7c050a4ca344c3a0" - integrity sha512-PoWtZvo7c1XFeZWmmyaOp2G0XVbOnm+fJzvghqGAktBW3cufwJUWvSCcNG0ppXiBEM05mZu6RhMtXPv2hpllig== + version "6.5.9" + resolved "https://registry.yarnpkg.com/@codemirror/search/-/search-6.5.9.tgz#08829cf1db9d093dd4822bb22ece93da3ebffefc" + integrity sha512-7DdQ9aaZMMxuWB1u6IIFWWuK9NocVZwvo4nG8QjJTS6oZGvteoLSiXw3EbVZVlO08Ri2ltO89JVInMpfcJxhtg== dependencies: "@codemirror/state" "^6.0.0" "@codemirror/view" "^6.0.0" crelt "^1.0.5" "@codemirror/state@^6.0.0", "@codemirror/state@^6.3.3", "@codemirror/state@^6.4.0", "@codemirror/state@^6.5.0": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.5.1.tgz#e5c0599f7b43cf03f19e05861317df5425c07904" - integrity sha512-3rA9lcwciEB47ZevqvD8qgbzhM9qMb8vCcQCNmDfVRPQG4JT9mSb0Jg8H7YjKGGQcFnLN323fj9jdnG59Kx6bg== + version "6.5.2" + resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.5.2.tgz#8eca3a64212a83367dc85475b7d78d5c9b7076c6" + integrity sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA== dependencies: "@marijn/find-cluster-break" "^1.0.0" @@ -1860,13 +1750,13 @@ enabled "2.0.x" kuler "^2.0.0" -"@dependents/detective-less@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@dependents/detective-less/-/detective-less-5.0.0.tgz#e06bd05352a9e90ad337c740ea98783709e0630c" - integrity sha512-D/9dozteKcutI5OdxJd8rU+fL6XgaaRg60sPPJWkT33OCiRfkCu5wO5B/yXTaaL2e6EB0lcCBGe5E0XscZCvvQ== +"@dependents/detective-less@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@dependents/detective-less/-/detective-less-5.0.1.tgz#e6c5b502f0d26a81da4170c1ccd848a6eaa68470" + integrity sha512-Y6+WUMsTFWE5jb20IFP4YGa5IrGY/+a/FbOSjDF/wz9gepU2hwCYSXRHP/vPwBvwcY3SVMASt4yXxbXNXigmZQ== dependencies: gonzales-pe "^4.3.0" - node-source-walk "^7.0.0" + node-source-walk "^7.0.1" "@discoveryjs/json-ext@0.6.3": version "0.6.3" @@ -1881,10 +1771,10 @@ buffer-crc32 "~0.2.3" fd-slicer2 "^1.2.0" -"@electric-sql/pglite@^0.2.0": - version "0.2.16" - resolved "https://registry.yarnpkg.com/@electric-sql/pglite/-/pglite-0.2.16.tgz#df586341c8143ea997db0e51aae30c2dc1a634fa" - integrity sha512-dCSHpoOKuTxecaYhWDRp2yFTN3XWcMPMrBVl5yOR8VZEUprz4+R3iuU7BipmlsqBnBDO/6l9H/C2ZwJdunkWyw== +"@electric-sql/pglite@^0.2.16": + version "0.2.17" + resolved "https://registry.yarnpkg.com/@electric-sql/pglite/-/pglite-0.2.17.tgz#23d53a9b7ddd1590d59d7c701aba23b037f08108" + integrity sha512-qEpKRT2oUaWDH6tjRxLHjdzMqRUGYDnGZlKrnL4dJ77JVMcP2Hpo3NYnOSPKdZdeec57B6QPprCUFg0picx5Pw== "@esbuild/aix-ppc64@0.23.1": version "0.23.1" @@ -2310,16 +2200,16 @@ integrity sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g== "@google-cloud/pubsub@^4.5.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@google-cloud/pubsub/-/pubsub-4.9.0.tgz#42acbb37d67a0850ea2a6444992e5dde532e9bad" - integrity sha512-VLGRwWwjEnyC+NVEiScCRGfVBJzAw9fT5IM3YvC6mlEkv8llr5vcVsoDjv1EbE0P31I601RqlLXH7s6J9tqpfA== + version "4.10.0" + resolved "https://registry.yarnpkg.com/@google-cloud/pubsub/-/pubsub-4.10.0.tgz#f1380fccecd87910758c747b0711f722aae06a50" + integrity sha512-HLlIA8qGr6PxAnjK4YjSi2swqEiXjGAC2Tj9GHMNYFtL4uubTIJLHv4CtbJ/Gzem5Cb1HRjuubt/H0oTuRLV0g== dependencies: "@google-cloud/paginator" "^5.0.0" "@google-cloud/precise-date" "^4.0.0" "@google-cloud/projectify" "^4.0.0" "@google-cloud/promisify" "^4.0.0" "@opentelemetry/api" "~1.9.0" - "@opentelemetry/semantic-conventions" "~1.26.0" + "@opentelemetry/semantic-conventions" "~1.28.0" arrify "^2.0.0" extend "^3.0.2" google-auth-library "^9.3.0" @@ -2374,9 +2264,9 @@ googleapis-common "^7.0.0" "@grpc/grpc-js@^1.10.9", "@grpc/grpc-js@^1.7.0": - version "1.12.5" - resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.12.5.tgz#0064a28fe9b1ec54ac27e1c9bf70720aa01285e8" - integrity sha512-d3iiHxdpg5+ZcJ6jnDSOT8Z0O0VMVGy34jAnYLUX8yd36b1qn8f1TwOA/Lc7TsOh03IkPJ38eGI5qD2EjNkoEA== + version "1.12.6" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.12.6.tgz#a3586ffdfb6a1f5cd5b4866dec9074c4a1e65472" + integrity sha512-JXUj6PI0oqqzTGvKtzOkxtpsyPRNsrmhh41TtIz/zEB6J+AUiZZ0dxWzcMwO9Ns5rmSPuMdghlTbUuqIM48d3Q== dependencies: "@grpc/proto-loader" "^0.7.13" "@js-sdsl/ordered-map" "^4.4.2" @@ -2414,29 +2304,18 @@ integrity sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg== "@iconify/utils@^2.1.32": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@iconify/utils/-/utils-2.2.1.tgz#635b9bd8fd3e5e53742471bc0b5291f1570dda41" - integrity sha512-0/7J7hk4PqXmxo5PDBDxmnecw5PxklZJfNjIVG9FM0mEfVrvfudS22rYWsqVk6gR3UJ/mSYS90X4R3znXnqfNA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/@iconify/utils/-/utils-2.3.0.tgz#1bbbf8c477ebe9a7cacaea78b1b7e8937f9cbfba" + integrity sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA== dependencies: - "@antfu/install-pkg" "^0.4.1" - "@antfu/utils" "^0.7.10" + "@antfu/install-pkg" "^1.0.0" + "@antfu/utils" "^8.1.0" "@iconify/types" "^2.0.0" debug "^4.4.0" - globals "^15.13.0" + globals "^15.14.0" kolorist "^1.8.0" - local-pkg "^0.5.1" - mlly "^1.7.3" - -"@inquirer/checkbox@^4.0.6": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@inquirer/checkbox/-/checkbox-4.0.6.tgz#e71401a7e1900332f17ed68c172a89fe20225f49" - integrity sha512-PgP35JfmGjHU0LSXOyRew0zHuA9N6OJwOlos1fZ20b7j8ISeAdib3L+n0jIxBtX958UeEpte6xhG/gxJ5iUqMw== - dependencies: - "@inquirer/core" "^10.1.4" - "@inquirer/figures" "^1.0.9" - "@inquirer/type" "^3.0.2" - ansi-escapes "^4.3.2" - yoctocolors-cjs "^2.1.2" + local-pkg "^1.0.0" + mlly "^1.7.4" "@inquirer/checkbox@^4.1.1": version "4.1.1" @@ -2465,14 +2344,6 @@ "@inquirer/core" "^10.1.6" "@inquirer/type" "^3.0.4" -"@inquirer/confirm@^5.1.3": - version "5.1.3" - resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.1.3.tgz#c1ad57663f54758981811ccb86f823072ddf5c1a" - integrity sha512-fuF9laMmHoOgWapF9h9hv6opA5WvmGFHsTYGCmuFxcghIhEhb3dN0CdQR4BUMqa2H506NCj8cGX4jwMsE4t6dA== - dependencies: - "@inquirer/core" "^10.1.4" - "@inquirer/type" "^3.0.2" - "@inquirer/core@^10.1.2", "@inquirer/core@^10.1.6": version "10.1.6" resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.1.6.tgz#2a92a219cb48c81453e145a5040d0e04f7df1aa2" @@ -2487,30 +2358,6 @@ wrap-ansi "^6.2.0" yoctocolors-cjs "^2.1.2" -"@inquirer/core@^10.1.4": - version "10.1.4" - resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.1.4.tgz#02394e68d894021935caca0d10fc68fd4f3a3ead" - integrity sha512-5y4/PUJVnRb4bwWY67KLdebWOhOc7xj5IP2J80oWXa64mVag24rwQ1VAdnj7/eDY/odhguW0zQ1Mp1pj6fO/2w== - dependencies: - "@inquirer/figures" "^1.0.9" - "@inquirer/type" "^3.0.2" - ansi-escapes "^4.3.2" - cli-width "^4.1.0" - mute-stream "^2.0.0" - signal-exit "^4.1.0" - strip-ansi "^6.0.1" - wrap-ansi "^6.2.0" - yoctocolors-cjs "^2.1.2" - -"@inquirer/editor@^4.2.3": - version "4.2.3" - resolved "https://registry.yarnpkg.com/@inquirer/editor/-/editor-4.2.3.tgz#0858adcd07d9607b0614778eaa5ce8a83871c367" - integrity sha512-S9KnIOJuTZpb9upeRSBBhoDZv7aSV3pG9TECrBj0f+ZsFwccz886hzKBrChGrXMJwd4NKY+pOA9Vy72uqnd6Eg== - dependencies: - "@inquirer/core" "^10.1.4" - "@inquirer/type" "^3.0.2" - external-editor "^3.1.0" - "@inquirer/editor@^4.2.6": version "4.2.6" resolved "https://registry.yarnpkg.com/@inquirer/editor/-/editor-4.2.6.tgz#dec442b9f7ada0804bb9ba689370cc05fd385b20" @@ -2520,15 +2367,6 @@ "@inquirer/type" "^3.0.4" external-editor "^3.1.0" -"@inquirer/expand@^4.0.6": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-4.0.6.tgz#8676e6049c6114fb306df23358375bd84fa1c92c" - integrity sha512-TRTfi1mv1GeIZGyi9PQmvAaH65ZlG4/FACq6wSzs7Vvf1z5dnNWsAAXBjWMHt76l+1hUY8teIqJFrWBk5N6gsg== - dependencies: - "@inquirer/core" "^10.1.4" - "@inquirer/type" "^3.0.2" - yoctocolors-cjs "^2.1.2" - "@inquirer/expand@^4.0.8": version "4.0.8" resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-4.0.8.tgz#8438bd34af182d4a37d8d7101a328e10430efadc" @@ -2543,19 +2381,6 @@ resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.10.tgz#e3676a51c9c51aaabcd6ba18a28e82b98417db37" integrity sha512-Ey6176gZmeqZuY/W/nZiUyvmb1/qInjcpiZjXWi6nON+nxJpD1bxtSoBxNliGISae32n6OwbY+TSXPZ1CfS4bw== -"@inquirer/figures@^1.0.9": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.9.tgz#9d8128f8274cde4ca009ca8547337cab3f37a4a3" - integrity sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ== - -"@inquirer/input@^4.1.3": - version "4.1.3" - resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-4.1.3.tgz#fa0ea9a392b2ec4ddd763c504d0b0c8839a48fe2" - integrity sha512-zeo++6f7hxaEe7OjtMzdGZPHiawsfmCZxWB9X1NpmYgbeoyerIbWemvlBxxl+sQIlHC0WuSAG19ibMq3gbhaqQ== - dependencies: - "@inquirer/core" "^10.1.4" - "@inquirer/type" "^3.0.2" - "@inquirer/input@^4.1.5": version "4.1.5" resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-4.1.5.tgz#ea3ffed7947c28d61ef3f261c4f261e99c4cac8a" @@ -2564,14 +2389,6 @@ "@inquirer/core" "^10.1.6" "@inquirer/type" "^3.0.4" -"@inquirer/number@^3.0.6": - version "3.0.6" - resolved "https://registry.yarnpkg.com/@inquirer/number/-/number-3.0.6.tgz#19bba46725df194bdd907762cf432a37e053b300" - integrity sha512-xO07lftUHk1rs1gR0KbqB+LJPhkUNkyzV/KhH+937hdkMazmAYHLm1OIrNKpPelppeV1FgWrgFDjdUD8mM+XUg== - dependencies: - "@inquirer/core" "^10.1.4" - "@inquirer/type" "^3.0.2" - "@inquirer/number@^3.0.8": version "3.0.8" resolved "https://registry.yarnpkg.com/@inquirer/number/-/number-3.0.8.tgz#ca44c09a8ac74040e2327e04694799eae603e9de" @@ -2580,15 +2397,6 @@ "@inquirer/core" "^10.1.6" "@inquirer/type" "^3.0.4" -"@inquirer/password@^4.0.6": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-4.0.6.tgz#4bbee12fe7cd1d37435401098c296ddc4586861b" - integrity sha512-QLF0HmMpHZPPMp10WGXh6F+ZPvzWE7LX6rNoccdktv/Rov0B+0f+eyXkAcgqy5cH9V+WSpbLxu2lo3ysEVK91w== - dependencies: - "@inquirer/core" "^10.1.4" - "@inquirer/type" "^3.0.2" - ansi-escapes "^4.3.2" - "@inquirer/password@^4.0.8": version "4.0.8" resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-4.0.8.tgz#ac2b14800a75f15e3404d98616d9dc7d8c2df38b" @@ -2598,7 +2406,7 @@ "@inquirer/type" "^3.0.4" ansi-escapes "^4.3.2" -"@inquirer/prompts@7.3.1": +"@inquirer/prompts@7.3.1", "@inquirer/prompts@^7.0.0": version "7.3.1" resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-7.3.1.tgz#3fa954a7d9e71197b489a1d2a25a1e19b6688e76" integrity sha512-r1CiKuDV86BDpvj9DRFR+V+nIjsVBOsa2++dqdPqLYAef8kgHYvmQ8ySdP/ZeAIOWa27YGJZRkENdP3dK0H3gg== @@ -2614,31 +2422,6 @@ "@inquirer/search" "^3.0.8" "@inquirer/select" "^4.0.8" -"@inquirer/prompts@^7.0.0": - version "7.2.3" - resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-7.2.3.tgz#8a0d7cb5310d429bf815d25bbff108375fc6315b" - integrity sha512-hzfnm3uOoDySDXfDNOm9usOuYIaQvTgKp/13l1uJoe6UNY+Zpcn2RYt0jXz3yA+yemGHvDOxVzqWl3S5sQq53Q== - dependencies: - "@inquirer/checkbox" "^4.0.6" - "@inquirer/confirm" "^5.1.3" - "@inquirer/editor" "^4.2.3" - "@inquirer/expand" "^4.0.6" - "@inquirer/input" "^4.1.3" - "@inquirer/number" "^3.0.6" - "@inquirer/password" "^4.0.6" - "@inquirer/rawlist" "^4.0.6" - "@inquirer/search" "^3.0.6" - "@inquirer/select" "^4.0.6" - -"@inquirer/rawlist@^4.0.6": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@inquirer/rawlist/-/rawlist-4.0.6.tgz#b55d5828d850f07bc6792bbce3b2a963e33b3ef5" - integrity sha512-QoE4s1SsIPx27FO4L1b1mUjVcoHm1pWE/oCmm4z/Hl+V1Aw5IXl8FYYzGmfXaBT0l/sWr49XmNSiq7kg3Kd/Lg== - dependencies: - "@inquirer/core" "^10.1.4" - "@inquirer/type" "^3.0.2" - yoctocolors-cjs "^2.1.2" - "@inquirer/rawlist@^4.0.8": version "4.0.8" resolved "https://registry.yarnpkg.com/@inquirer/rawlist/-/rawlist-4.0.8.tgz#1d4389186d63861a2abe2dd107f72e813dc0ea4b" @@ -2648,16 +2431,6 @@ "@inquirer/type" "^3.0.4" yoctocolors-cjs "^2.1.2" -"@inquirer/search@^3.0.6": - version "3.0.6" - resolved "https://registry.yarnpkg.com/@inquirer/search/-/search-3.0.6.tgz#5537e3f46b7d31ab65ca22b831cf546f88db1d5b" - integrity sha512-eFZ2hiAq0bZcFPuFFBmZEtXU1EarHLigE+ENCtpO+37NHCl4+Yokq1P/d09kUblObaikwfo97w+0FtG/EXl5Ng== - dependencies: - "@inquirer/core" "^10.1.4" - "@inquirer/figures" "^1.0.9" - "@inquirer/type" "^3.0.2" - yoctocolors-cjs "^2.1.2" - "@inquirer/search@^3.0.8": version "3.0.8" resolved "https://registry.yarnpkg.com/@inquirer/search/-/search-3.0.8.tgz#38c25f5b2db15a268be76b09bd12b4599ecc216b" @@ -2668,17 +2441,6 @@ "@inquirer/type" "^3.0.4" yoctocolors-cjs "^2.1.2" -"@inquirer/select@^4.0.6": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-4.0.6.tgz#3062c02c82f7bbe238972672def6d8394732bb2b" - integrity sha512-yANzIiNZ8fhMm4NORm+a74+KFYHmf7BZphSOBovIzYPVLquseTGEkU5l2UTnBOf5k0VLmTgPighNDLE9QtbViQ== - dependencies: - "@inquirer/core" "^10.1.4" - "@inquirer/figures" "^1.0.9" - "@inquirer/type" "^3.0.2" - ansi-escapes "^4.3.2" - yoctocolors-cjs "^2.1.2" - "@inquirer/select@^4.0.8": version "4.0.8" resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-4.0.8.tgz#dde85e10bc4e650c51542de533a91b6bc63498b7" @@ -2697,12 +2459,7 @@ dependencies: mute-stream "^1.0.0" -"@inquirer/type@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-3.0.2.tgz#baff9f8d70947181deb36772cd9a5b6876d3e60c" - integrity sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g== - -"@inquirer/type@^3.0.4": +"@inquirer/type@^3.0.2", "@inquirer/type@^3.0.4": version "3.0.4" resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-3.0.4.tgz#fa5f9e91a0abf3c9e93d3e1990ecb891d8195cf2" integrity sha512-2MNFrDY8jkFYc9Il9DgLsHhMzuHnOYM1+CUYVWbzu9oT0hC7V7EcYvdCKeoll/Fcci04A+ERZ9wcc7cQ8lTkIA== @@ -2957,7 +2714,16 @@ "@microsoft/tsdoc-config" "~0.17.1" "@rushstack/node-core-library" "5.10.2" -"@microsoft/api-extractor@7.49.1", "@microsoft/api-extractor@^7.24.2": +"@microsoft/api-extractor-model@7.30.3": + version "7.30.3" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.30.3.tgz#d1256b6955c8c2a1115e0cfe99e1e8f9802e52cc" + integrity sha512-yEAvq0F78MmStXdqz9TTT4PZ05Xu5R8nqgwI5xmUmQjWBQ9E6R2n8HB/iZMRciG4rf9iwI2mtuQwIzDXBvHn1w== + dependencies: + "@microsoft/tsdoc" "~0.15.1" + "@microsoft/tsdoc-config" "~0.17.1" + "@rushstack/node-core-library" "5.11.0" + +"@microsoft/api-extractor@7.49.1": version "7.49.1" resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.49.1.tgz#e525cadfa09a9d376fd05e8b9415f6bc6260f01a" integrity sha512-jRTR/XbQF2kb+dYn8hfYSicOGA99+Fo00GrsdMwdfE3eIgLtKdH6Qa2M3wZV9S2XmbgCaGX1OdPtYctbfu5jQg== @@ -2976,6 +2742,25 @@ source-map "~0.6.1" typescript "5.7.2" +"@microsoft/api-extractor@^7.24.2": + version "7.50.0" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.50.0.tgz#e9fa4ecdb4fbb3327cb199fc5f87b79eae6b3f13" + integrity sha512-Ds/PHTiVzuENQsmXrJKkSdfgNkr/SDG/2rDef0AWl3BchAnXdO7gXaYsAkNx4gWiC4OngNA3fQfd3+BcQxP1DQ== + dependencies: + "@microsoft/api-extractor-model" "7.30.3" + "@microsoft/tsdoc" "~0.15.1" + "@microsoft/tsdoc-config" "~0.17.1" + "@rushstack/node-core-library" "5.11.0" + "@rushstack/rig-package" "0.5.3" + "@rushstack/terminal" "0.15.0" + "@rushstack/ts-command-line" "4.23.5" + lodash "~4.17.15" + minimatch "~3.0.3" + resolve "~1.22.1" + semver "~7.5.4" + source-map "~0.6.1" + typescript "5.7.2" + "@microsoft/tsdoc-config@~0.17.1": version "0.17.1" resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.17.1.tgz#e0f0b50628f4ad7fe121ca616beacfe6a25b9335" @@ -3239,9 +3024,9 @@ which "^5.0.0" "@npmcli/redact@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/redact/-/redact-3.0.0.tgz#ab3b6413355be7f3c02e87c36c2b0c2f9773fce4" - integrity sha512-/1uFzjVcfzqrgCeGW7+SZ4hv0qLWmKXVzFahZGJ6QuJBj6Myt9s17+JL86i76NV9YSnJRcGXJYQbAU0rn1YTCQ== + version "3.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/redact/-/redact-3.1.1.tgz#ac295c148d01c70a5a006d2e162388b3cef15195" + integrity sha512-3Hc2KGIkrvJWJqTbvueXzBeZlmvoOxc2jyX00yzr3+sNFquJg0N8hH4SAPLPVrkWIRQICVpVgjrss971awXVnA== "@npmcli/run-script@^9.0.0": version "9.0.2" @@ -3261,9 +3046,9 @@ integrity sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA== "@octokit/auth-token@^5.0.0": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-5.1.1.tgz#3bbfe905111332a17f72d80bd0b51a3e2fa2cf07" - integrity sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA== + version "5.1.2" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-5.1.2.tgz#68a486714d7a7fd1df56cb9bc89a860a0de866de" + integrity sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw== "@octokit/core@^5.0.1": version "5.2.0" @@ -3279,30 +3064,30 @@ universal-user-agent "^6.0.0" "@octokit/core@^6.1.3": - version "6.1.3" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-6.1.3.tgz#280d3bb66c702297baac0a202219dd66611286e4" - integrity sha512-z+j7DixNnfpdToYsOutStDgeRzJSMnbj8T1C/oQjB6Aa+kRfNjs/Fn7W6c8bmlt6mfy3FkgeKBRnDjxQow5dow== + version "6.1.4" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-6.1.4.tgz#f5ccf911cc95b1ce9daf6de425d1664392f867db" + integrity sha512-lAS9k7d6I0MPN+gb9bKDt7X8SdxknYqAMh44S5L+lNqIN2NuV8nvv3g8rPp7MuRxcOpxpUIATWprO0C34a8Qmg== dependencies: "@octokit/auth-token" "^5.0.0" "@octokit/graphql" "^8.1.2" - "@octokit/request" "^9.1.4" - "@octokit/request-error" "^6.1.6" + "@octokit/request" "^9.2.1" + "@octokit/request-error" "^6.1.7" "@octokit/types" "^13.6.2" before-after-hook "^3.0.2" universal-user-agent "^7.0.0" -"@octokit/endpoint@^10.0.0": - version "10.1.2" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-10.1.2.tgz#d38e727e2a64287114fdaa1eb9cd7c81c09460df" - integrity sha512-XybpFv9Ms4hX5OCHMZqyODYqGTZ3H6K6Vva+M9LR7ib/xr1y1ZnlChYv9H680y77Vd/i/k+thXApeRASBQkzhA== +"@octokit/endpoint@^10.1.3": + version "10.1.3" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-10.1.3.tgz#bfe8ff2ec213eb4216065e77654bfbba0fc6d4de" + integrity sha512-nBRBMpKPhQUxCsQQeW+rCJ/OPSMcj3g0nfHn01zGYZXuNDvvXudF/TYY6APj5THlurerpFN4a/dQAIAaM6BYhA== dependencies: "@octokit/types" "^13.6.2" universal-user-agent "^7.0.2" "@octokit/endpoint@^9.0.1": - version "9.0.5" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.5.tgz#e6c0ee684e307614c02fc6ac12274c50da465c44" - integrity sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw== + version "9.0.6" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.6.tgz#114d912108fe692d8b139cfe7fc0846dfd11b6c0" + integrity sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw== dependencies: "@octokit/types" "^13.1.0" universal-user-agent "^6.0.0" @@ -3317,12 +3102,12 @@ universal-user-agent "^6.0.0" "@octokit/graphql@^8.0.0", "@octokit/graphql@^8.1.2": - version "8.1.2" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-8.1.2.tgz#98b9072b22e0471b782d52ed0da08e2b2de52b17" - integrity sha512-bdlj/CJVjpaz06NBpfHhp4kGJaRZfz7AzC+6EwUImRtrwIw8dIgJ63Xg0OzV9pRn3rIzrt5c2sa++BL0JJ8GLw== + version "8.2.0" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-8.2.0.tgz#983a7ebc6479338d78921a1ca9b4095f85991e28" + integrity sha512-gejfDywEml/45SqbWTWrhfwvLBrcGYhOn50sPOjIeVvH6i7D16/9xcFA8dAJNp2HMcd+g4vru41g4E2RBiZvfQ== dependencies: "@octokit/request" "^9.1.4" - "@octokit/types" "^13.6.2" + "@octokit/types" "^13.8.0" universal-user-agent "^7.0.0" "@octokit/openapi-types@^20.0.0": @@ -3336,9 +3121,9 @@ integrity sha512-izFjMJ1sir0jn0ldEKhZ7xegCTj/ObmEDlEfpFrx4k/JyZSMRHbO3/rBwgE7f3m2DHt+RrNGIVw4wSmwnm3t/g== "@octokit/plugin-paginate-rest@^11.4.0": - version "11.4.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.4.0.tgz#a9c3347113d793e48a014f0aa549eada00de7c9a" - integrity sha512-ttpGck5AYWkwMkMazNCZMqxKqIq1fJBNxBfsFwwfyYKTf914jKkLF0POMS3YkPBwp5g1c2Y4L79gDz01GhSr1g== + version "11.4.2" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.4.2.tgz#8f46a1de74c35e016c86701ef4ea0e8ef25a06e0" + integrity sha512-BXJ7XPCTDXFF+wxcg/zscfgw2O/iDPtNSkwwR1W1W5c4Mb3zav/M2XvxQ23nVmKj7jpweB4g8viMeCQdm7LMVA== dependencies: "@octokit/types" "^13.7.0" @@ -3362,11 +3147,11 @@ "@octokit/types" "^12.6.0" "@octokit/plugin-rest-endpoint-methods@^13.3.0": - version "13.3.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.3.0.tgz#ee18b9d6364bbae1d86e960d5576b555b41d2079" - integrity sha512-LUm44shlmkp/6VC+qQgHl3W5vzUP99ZM54zH6BuqkJK4DqfFLhegANd+fM4YRLapTvPm4049iG7F3haANKMYvQ== + version "13.3.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.3.1.tgz#1915976b689662f14d033a16e7d9307c22842234" + integrity sha512-o8uOBdsyR+WR8MK9Cco8dCgvG13H1RlM1nWnK/W7TEACQBFux/vPREgKucxUfuDQ5yi1T3hGf4C5ZmZXAERgwQ== dependencies: - "@octokit/types" "^13.7.0" + "@octokit/types" "^13.8.0" "@octokit/request-error@^5.1.0": version "5.1.0" @@ -3377,10 +3162,10 @@ deprecation "^2.0.0" once "^1.4.0" -"@octokit/request-error@^6.0.1", "@octokit/request-error@^6.1.6": - version "6.1.6" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-6.1.6.tgz#5f42c7894e7c3ab47c63aa3241f78cee8a826644" - integrity sha512-pqnVKYo/at0NuOjinrgcQYpEbv4snvP3bKMRqHaD9kIsk9u1LCpb2smHZi8/qJfgeNqLo5hNW4Z7FezNdEo0xg== +"@octokit/request-error@^6.1.6", "@octokit/request-error@^6.1.7": + version "6.1.7" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-6.1.7.tgz#44fc598f5cdf4593e0e58b5155fe2e77230ff6da" + integrity sha512-69NIppAwaauwZv6aOzb+VVLwt+0havz9GT5YplkeJv7fG7a40qpLt/yZKyiDxAhgz0EtgNdNcb96Z0u+Zyuy2g== dependencies: "@octokit/types" "^13.6.2" @@ -3394,13 +3179,13 @@ "@octokit/types" "^13.1.0" universal-user-agent "^6.0.0" -"@octokit/request@^9.1.4": - version "9.2.0" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-9.2.0.tgz#21aa1e72ff645f5b99ccf4a590cc33c4578bb356" - integrity sha512-kXLfcxhC4ozCnAXy2ff+cSxpcF0A1UqxjvYMqNuPIeOAzJbVWQ+dy5G2fTylofB/gTbObT8O6JORab+5XtA1Kw== +"@octokit/request@^9.1.4", "@octokit/request@^9.2.1": + version "9.2.1" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-9.2.1.tgz#63bd74b2bcc93dde62039a7d6184557523237c80" + integrity sha512-TqHLIdw1KFvx8WvLc7Jv94r3C3+AzKY2FWq7c20zvrxmCIa6MCVkLCE/826NCXnml3LFJjLsidDh1BhMaGEDQw== dependencies: - "@octokit/endpoint" "^10.0.0" - "@octokit/request-error" "^6.0.1" + "@octokit/endpoint" "^10.1.3" + "@octokit/request-error" "^6.1.6" "@octokit/types" "^13.6.2" fast-content-type-parse "^2.0.0" universal-user-agent "^7.0.2" @@ -3422,10 +3207,10 @@ dependencies: "@octokit/openapi-types" "^20.0.0" -"@octokit/types@^13.0.0", "@octokit/types@^13.1.0", "@octokit/types@^13.6.2", "@octokit/types@^13.7.0": - version "13.7.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-13.7.0.tgz#22d0e26a8c9f53599bfb907213d8ccde547f36aa" - integrity sha512-BXfRP+3P3IN6fd4uF3SniaHKOO4UXWBfkdR3vA8mIvaoO/wLjGN5qivUtW0QRitBHHMcfC41SLhNVYIZZE+wkA== +"@octokit/types@^13.0.0", "@octokit/types@^13.1.0", "@octokit/types@^13.6.2", "@octokit/types@^13.7.0", "@octokit/types@^13.8.0": + version "13.8.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-13.8.0.tgz#3815885e5abd16ed9ffeea3dced31d37ce3f8a0a" + integrity sha512-x7DjTIbEpEWXK99DMd01QfWy0hd5h4EN+Q7shkdKds3otGQP+oWE/y0A76i1OvH9fygo4ddvNf7ZvF0t78P98A== dependencies: "@octokit/openapi-types" "^23.0.1" @@ -3446,104 +3231,104 @@ dependencies: "@opentelemetry/semantic-conventions" "1.28.0" -"@opentelemetry/semantic-conventions@1.28.0", "@opentelemetry/semantic-conventions@^1.25.1": +"@opentelemetry/semantic-conventions@1.28.0", "@opentelemetry/semantic-conventions@~1.28.0": version "1.28.0" resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz#337fb2bca0453d0726696e745f50064411f646d6" integrity sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA== -"@opentelemetry/semantic-conventions@~1.26.0": - version "1.26.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.26.0.tgz#42da14476529ca86d0af4c11f58910f242a0a232" - integrity sha512-U9PJlOswJPSgQVPI+XEuNLElyFWkb0hAiMg+DExD9V0St03X2lPHGMdxMY/LrVmoukuIpXJ12oyrOtEZ4uXFkw== +"@opentelemetry/semantic-conventions@^1.25.1": + version "1.30.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.30.0.tgz#3a42c4c475482f2ec87c12aad98832dc0087dc9a" + integrity sha512-4VlGgo32k2EQ2wcCY3vEU28A0O13aOtHz3Xt2/2U5FAh9EfhD6t6DqL5Z6yAnRCntbTFDU4YfbpyzSlHNWycPw== -"@parcel/watcher-android-arm64@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz#e32d3dda6647791ee930556aee206fcd5ea0fb7a" - integrity sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ== +"@parcel/watcher-android-arm64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz#507f836d7e2042f798c7d07ad19c3546f9848ac1" + integrity sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA== -"@parcel/watcher-darwin-arm64@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz#0d9e680b7e9ec1c8f54944f1b945aa8755afb12f" - integrity sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw== +"@parcel/watcher-darwin-arm64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz#3d26dce38de6590ef79c47ec2c55793c06ad4f67" + integrity sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw== -"@parcel/watcher-darwin-x64@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz#f9f1d5ce9d5878d344f14ef1856b7a830c59d1bb" - integrity sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA== +"@parcel/watcher-darwin-x64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz#99f3af3869069ccf774e4ddfccf7e64fd2311ef8" + integrity sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg== -"@parcel/watcher-freebsd-x64@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz#2b77f0c82d19e84ff4c21de6da7f7d096b1a7e82" - integrity sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw== +"@parcel/watcher-freebsd-x64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz#14d6857741a9f51dfe51d5b08b7c8afdbc73ad9b" + integrity sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ== -"@parcel/watcher-linux-arm-glibc@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz#92ed322c56dbafa3d2545dcf2803334aee131e42" - integrity sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA== +"@parcel/watcher-linux-arm-glibc@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz#43c3246d6892381db473bb4f663229ad20b609a1" + integrity sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA== -"@parcel/watcher-linux-arm-musl@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz#cd48e9bfde0cdbbd2ecd9accfc52967e22f849a4" - integrity sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA== +"@parcel/watcher-linux-arm-musl@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz#663750f7090bb6278d2210de643eb8a3f780d08e" + integrity sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q== -"@parcel/watcher-linux-arm64-glibc@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz#7b81f6d5a442bb89fbabaf6c13573e94a46feb03" - integrity sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA== +"@parcel/watcher-linux-arm64-glibc@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz#ba60e1f56977f7e47cd7e31ad65d15fdcbd07e30" + integrity sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w== -"@parcel/watcher-linux-arm64-musl@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz#dcb8ff01077cdf59a18d9e0a4dff7a0cfe5fd732" - integrity sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q== +"@parcel/watcher-linux-arm64-musl@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz#f7fbcdff2f04c526f96eac01f97419a6a99855d2" + integrity sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg== -"@parcel/watcher-linux-x64-glibc@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz#2e254600fda4e32d83942384d1106e1eed84494d" - integrity sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw== +"@parcel/watcher-linux-x64-glibc@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz#4d2ea0f633eb1917d83d483392ce6181b6a92e4e" + integrity sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A== -"@parcel/watcher-linux-x64-musl@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz#01fcea60fedbb3225af808d3f0a7b11229792eef" - integrity sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA== +"@parcel/watcher-linux-x64-musl@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz#277b346b05db54f55657301dd77bdf99d63606ee" + integrity sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg== -"@parcel/watcher-win32-arm64@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz#87cdb16e0783e770197e52fb1dc027bb0c847154" - integrity sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig== +"@parcel/watcher-win32-arm64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz#7e9e02a26784d47503de1d10e8eab6cceb524243" + integrity sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw== -"@parcel/watcher-win32-ia32@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz#778c39b56da33e045ba21c678c31a9f9d7c6b220" - integrity sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA== +"@parcel/watcher-win32-ia32@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz#2d0f94fa59a873cdc584bf7f6b1dc628ddf976e6" + integrity sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ== -"@parcel/watcher-win32-x64@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz#33873876d0bbc588aacce38e90d1d7480ce81cb7" - integrity sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw== +"@parcel/watcher-win32-x64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz#ae52693259664ba6f2228fa61d7ee44b64ea0947" + integrity sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA== "@parcel/watcher@^2.4.1": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.5.0.tgz#5c88818b12b8de4307a9d3e6dc3e28eba0dfbd10" - integrity sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ== + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.5.1.tgz#342507a9cfaaf172479a882309def1e991fb1200" + integrity sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg== dependencies: detect-libc "^1.0.3" is-glob "^4.0.3" micromatch "^4.0.5" node-addon-api "^7.0.0" optionalDependencies: - "@parcel/watcher-android-arm64" "2.5.0" - "@parcel/watcher-darwin-arm64" "2.5.0" - "@parcel/watcher-darwin-x64" "2.5.0" - "@parcel/watcher-freebsd-x64" "2.5.0" - "@parcel/watcher-linux-arm-glibc" "2.5.0" - "@parcel/watcher-linux-arm-musl" "2.5.0" - "@parcel/watcher-linux-arm64-glibc" "2.5.0" - "@parcel/watcher-linux-arm64-musl" "2.5.0" - "@parcel/watcher-linux-x64-glibc" "2.5.0" - "@parcel/watcher-linux-x64-musl" "2.5.0" - "@parcel/watcher-win32-arm64" "2.5.0" - "@parcel/watcher-win32-ia32" "2.5.0" - "@parcel/watcher-win32-x64" "2.5.0" + "@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" "@pkgjs/parseargs@^0.11.0": version "0.11.0" @@ -3624,18 +3409,17 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== -"@puppeteer/browsers@2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-2.7.0.tgz#dad70b30458f4e0855b2f402055f408823cc67c5" - integrity sha512-bO61XnTuopsz9kvtfqhVbH6LTM1koxK0IlBR+yuVrM2LB7mk8+5o1w18l5zqd5cs8xlf+ntgambqRqGifMDjog== +"@puppeteer/browsers@2.7.1": + version "2.7.1" + resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-2.7.1.tgz#6df07e95d8e22239b77599f3ceaef4041b933e62" + integrity sha512-MK7rtm8JjaxPN7Mf1JdZIZKPD2Z+W7osvrC1vjpvfOX1K0awDIHYbNi89f7eotp7eMUn2shWnt03HwVbriXtKQ== dependencies: debug "^4.4.0" extract-zip "^2.0.1" progress "^2.0.3" proxy-agent "^6.5.0" - semver "^7.6.3" - tar-fs "^3.0.6" - unbzip2-stream "^1.4.3" + semver "^7.7.0" + tar-fs "^3.0.8" yargs "^17.7.2" "@rollup/plugin-babel@^6.0.0": @@ -3694,286 +3478,286 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz#14c737dc19603a096568044eadaa60395eefb809" integrity sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q== -"@rollup/rollup-android-arm-eabi@4.32.0": - version "4.32.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.32.0.tgz#42a8e897c7b656adb4edebda3a8b83a57526452f" - integrity sha512-G2fUQQANtBPsNwiVFg4zKiPQyjVKZCUdQUol53R8E71J7AsheRMV/Yv/nB8giOcOVqP7//eB5xPqieBYZe9bGg== - "@rollup/rollup-android-arm-eabi@4.34.6": version "4.34.6" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.6.tgz#9b726b4dcafb9332991e9ca49d54bafc71d9d87f" integrity sha512-+GcCXtOQoWuC7hhX1P00LqjjIiS/iOouHXhMdiDSnq/1DGTox4SpUvO52Xm+div6+106r+TcvOeo/cxvyEyTgg== +"@rollup/rollup-android-arm-eabi@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.7.tgz#e554185b1afa5509a7a4040d15ec0c3b4435ded1" + integrity sha512-l6CtzHYo8D2TQ3J7qJNpp3Q1Iye56ssIAtqbM2H8axxCEEwvN7o8Ze9PuIapbxFL3OHrJU2JBX6FIIVnP/rYyw== + "@rollup/rollup-android-arm64@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz#9d81ea54fc5650eb4ebbc0a7d84cee331bfa30ad" integrity sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w== -"@rollup/rollup-android-arm64@4.32.0": - version "4.32.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.32.0.tgz#846a73eef25b18ff94bac1e52acab6a7c7ac22fa" - integrity sha512-qhFwQ+ljoymC+j5lXRv8DlaJYY/+8vyvYmVx074zrLsu5ZGWYsJNLjPPVJJjhZQpyAKUGPydOq9hRLLNvh1s3A== - "@rollup/rollup-android-arm64@4.34.6": version "4.34.6" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.6.tgz#88326ff46168a47851077ca0bf0c442689ec088f" integrity sha512-E8+2qCIjciYUnCa1AiVF1BkRgqIGW9KzJeesQqVfyRITGQN+dFuoivO0hnro1DjT74wXLRZ7QF8MIbz+luGaJA== +"@rollup/rollup-android-arm64@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.7.tgz#b1ee64bb413b2feba39803b0a1bebf2a9f3d70e1" + integrity sha512-KvyJpFUueUnSp53zhAa293QBYqwm94TgYTIfXyOTtidhm5V0LbLCJQRGkQClYiX3FXDQGSvPxOTD/6rPStMMDg== + "@rollup/rollup-darwin-arm64@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz#29448cb1370cf678b50743d2e392be18470abc23" integrity sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q== -"@rollup/rollup-darwin-arm64@4.32.0": - version "4.32.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.32.0.tgz#014ed37f1f7809fdf3442a6b689d3a074a844058" - integrity sha512-44n/X3lAlWsEY6vF8CzgCx+LQaoqWGN7TzUfbJDiTIOjJm4+L2Yq+r5a8ytQRGyPqgJDs3Rgyo8eVL7n9iW6AQ== - "@rollup/rollup-darwin-arm64@4.34.6": version "4.34.6" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.6.tgz#b8fbcc9389bc6fad3334a1d16dbeaaa5637c5772" integrity sha512-z9Ib+OzqN3DZEjX7PDQMHEhtF+t6Mi2z/ueChQPLS/qUMKY7Ybn5A2ggFoKRNRh1q1T03YTQfBTQCJZiepESAg== +"@rollup/rollup-darwin-arm64@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.7.tgz#bfdce3e07a345dd1bd628f3b796050f39629d7f0" + integrity sha512-jq87CjmgL9YIKvs8ybtIC98s/M3HdbqXhllcy9EdLV0yMg1DpxES2gr65nNy7ObNo/vZ/MrOTxt0bE5LinL6mA== + "@rollup/rollup-darwin-x64@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz#0ca99741c3ed096700557a43bb03359450c7857d" integrity sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA== -"@rollup/rollup-darwin-x64@4.32.0": - version "4.32.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.32.0.tgz#dde6ed3e56d0b34477fa56c4a199abe5d4b9846b" - integrity sha512-F9ct0+ZX5Np6+ZDztxiGCIvlCaW87HBdHcozUfsHnj1WCUTBUubAoanhHUfnUHZABlElyRikI0mgcw/qdEm2VQ== - "@rollup/rollup-darwin-x64@4.34.6": version "4.34.6" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.6.tgz#1aa2bcad84c0fb5902e945d88822e17a4f661d51" integrity sha512-PShKVY4u0FDAR7jskyFIYVyHEPCPnIQY8s5OcXkdU8mz3Y7eXDJPdyM/ZWjkYdR2m0izD9HHWA8sGcXn+Qrsyg== +"@rollup/rollup-darwin-x64@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.7.tgz#781a94a537c57bdf0a500e47a25ab5985e5e8dff" + integrity sha512-rSI/m8OxBjsdnMMg0WEetu/w+LhLAcCDEiL66lmMX4R3oaml3eXz3Dxfvrxs1FbzPbJMaItQiksyMfv1hoIxnA== + "@rollup/rollup-freebsd-arm64@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz#233f8e4c2f54ad9b719cd9645887dcbd12b38003" integrity sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ== -"@rollup/rollup-freebsd-arm64@4.32.0": - version "4.32.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.32.0.tgz#8ad634f462a6b7e338257cf64c7baff99618a08e" - integrity sha512-JpsGxLBB2EFXBsTLHfkZDsXSpSmKD3VxXCgBQtlPcuAqB8TlqtLcbeMhxXQkCDv1avgwNjF8uEIbq5p+Cee0PA== - "@rollup/rollup-freebsd-arm64@4.34.6": version "4.34.6" resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.6.tgz#29c54617e0929264dcb6416597d6d7481696e49f" integrity sha512-YSwyOqlDAdKqs0iKuqvRHLN4SrD2TiswfoLfvYXseKbL47ht1grQpq46MSiQAx6rQEN8o8URtpXARCpqabqxGQ== +"@rollup/rollup-freebsd-arm64@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.7.tgz#7a028357cbd12c5869c446ad18177c89f3405102" + integrity sha512-oIoJRy3ZrdsXpFuWDtzsOOa/E/RbRWXVokpVrNnkS7npz8GEG++E1gYbzhYxhxHbO2om1T26BZjVmdIoyN2WtA== + "@rollup/rollup-freebsd-x64@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz#dfba762a023063dc901610722995286df4a48360" integrity sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw== -"@rollup/rollup-freebsd-x64@4.32.0": - version "4.32.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.32.0.tgz#9d4d1dbbafcb0354d52ba6515a43c7511dba8052" - integrity sha512-wegiyBT6rawdpvnD9lmbOpx5Sph+yVZKHbhnSP9MqUEDX08G4UzMU+D87jrazGE7lRSyTRs6NEYHtzfkJ3FjjQ== - "@rollup/rollup-freebsd-x64@4.34.6": version "4.34.6" resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.6.tgz#a8b58ab7d31882559d93f2d1b5863d9e4b4b2678" integrity sha512-HEP4CgPAY1RxXwwL5sPFv6BBM3tVeLnshF03HMhJYCNc6kvSqBgTMmsEjb72RkZBAWIqiPUyF1JpEBv5XT9wKQ== +"@rollup/rollup-freebsd-x64@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.7.tgz#f24836a6371cccc4408db74f0fd986dacf098950" + integrity sha512-X++QSLm4NZfZ3VXGVwyHdRf58IBbCu9ammgJxuWZYLX0du6kZvdNqPwrjvDfwmi6wFdvfZ/s6K7ia0E5kI7m8Q== + "@rollup/rollup-linux-arm-gnueabihf@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz#b9da54171726266c5ef4237f462a85b3c3cf6ac9" integrity sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg== -"@rollup/rollup-linux-arm-gnueabihf@4.32.0": - version "4.32.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.32.0.tgz#3bd5fcbab92a66e032faef1078915d1dbf27de7a" - integrity sha512-3pA7xecItbgOs1A5H58dDvOUEboG5UfpTq3WzAdF54acBbUM+olDJAPkgj1GRJ4ZqE12DZ9/hNS2QZk166v92A== - "@rollup/rollup-linux-arm-gnueabihf@4.34.6": version "4.34.6" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.6.tgz#a844e1978c8b9766b169ecb1cb5cc0d8a3f05930" integrity sha512-88fSzjC5xeH9S2Vg3rPgXJULkHcLYMkh8faix8DX4h4TIAL65ekwuQMA/g2CXq8W+NJC43V6fUpYZNjaX3+IIg== +"@rollup/rollup-linux-arm-gnueabihf@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.7.tgz#95f27e96f0eb9b9ae9887739a8b6dffc90c1237f" + integrity sha512-Z0TzhrsNqukTz3ISzrvyshQpFnFRfLunYiXxlCRvcrb3nvC5rVKI+ZXPFG/Aa4jhQa1gHgH3A0exHaRRN4VmdQ== + "@rollup/rollup-linux-arm-musleabihf@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz#b9db69b3f85f5529eb992936d8f411ee6d04297b" integrity sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug== -"@rollup/rollup-linux-arm-musleabihf@4.32.0": - version "4.32.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.32.0.tgz#a77838b9779931ce4fa01326b585eee130f51e60" - integrity sha512-Y7XUZEVISGyge51QbYyYAEHwpGgmRrAxQXO3siyYo2kmaj72USSG8LtlQQgAtlGfxYiOwu+2BdbPjzEpcOpRmQ== - "@rollup/rollup-linux-arm-musleabihf@4.34.6": version "4.34.6" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.6.tgz#6b44c3b7257985d71b087fcb4ef01325e2fff201" integrity sha512-wM4ztnutBqYFyvNeR7Av+reWI/enK9tDOTKNF+6Kk2Q96k9bwhDDOlnCUNRPvromlVXo04riSliMBs/Z7RteEg== +"@rollup/rollup-linux-arm-musleabihf@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.7.tgz#677b34fba9d070877736c3fe8b02aacb5e142d97" + integrity sha512-nkznpyXekFAbvFBKBy4nNppSgneB1wwG1yx/hujN3wRnhnkrYVugMTCBXED4+Ni6thoWfQuHNYbFjgGH0MBXtw== + "@rollup/rollup-linux-arm64-gnu@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz#2550cf9bb4d47d917fd1ab4af756d7bbc3ee1528" integrity sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw== -"@rollup/rollup-linux-arm64-gnu@4.32.0": - version "4.32.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.32.0.tgz#ec1b1901b82d57a20184adb61c725dd8991a0bf0" - integrity sha512-r7/OTF5MqeBrZo5omPXcTnjvv1GsrdH8a8RerARvDFiDwFpDVDnJyByYM/nX+mvks8XXsgPUxkwe/ltaX2VH7w== - "@rollup/rollup-linux-arm64-gnu@4.34.6": version "4.34.6" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.6.tgz#ebb499cf1720115256d0c9ae7598c90cc2251bc5" integrity sha512-9RyprECbRa9zEjXLtvvshhw4CMrRa3K+0wcp3KME0zmBe1ILmvcVHnypZ/aIDXpRyfhSYSuN4EPdCCj5Du8FIA== +"@rollup/rollup-linux-arm64-gnu@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.7.tgz#32d3d19dedde54e91574a098f22ea43a09cf63dd" + integrity sha512-KCjlUkcKs6PjOcxolqrXglBDcfCuUCTVlX5BgzgoJHw+1rWH1MCkETLkLe5iLLS9dP5gKC7mp3y6x8c1oGBUtA== + "@rollup/rollup-linux-arm64-musl@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz#9d06b26d286c7dded6336961a2f83e48330e0c80" integrity sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA== -"@rollup/rollup-linux-arm64-musl@4.32.0": - version "4.32.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.32.0.tgz#7aa23b45bf489b7204b5a542e857e134742141de" - integrity sha512-HJbifC9vex9NqnlodV2BHVFNuzKL5OnsV2dvTw6e1dpZKkNjPG6WUq+nhEYV6Hv2Bv++BXkwcyoGlXnPrjAKXw== - "@rollup/rollup-linux-arm64-musl@4.34.6": version "4.34.6" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.6.tgz#9658221b59d9e5643348f9a52fa5ef35b4dc07b1" integrity sha512-qTmklhCTyaJSB05S+iSovfo++EwnIEZxHkzv5dep4qoszUMX5Ca4WM4zAVUMbfdviLgCSQOu5oU8YoGk1s6M9Q== +"@rollup/rollup-linux-arm64-musl@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.7.tgz#a58dff44a18696df65ed8c0ad68a2945cf900484" + integrity sha512-uFLJFz6+utmpbR313TTx+NpPuAXbPz4BhTQzgaP0tozlLnGnQ6rCo6tLwaSa6b7l6gRErjLicXQ1iPiXzYotjw== + "@rollup/rollup-linux-loongarch64-gnu@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz#e957bb8fee0c8021329a34ca8dfa825826ee0e2e" integrity sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ== -"@rollup/rollup-linux-loongarch64-gnu@4.32.0": - version "4.32.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.32.0.tgz#7bf0ebd8c5ad08719c3b4786be561d67f95654a7" - integrity sha512-VAEzZTD63YglFlWwRj3taofmkV1V3xhebDXffon7msNz4b14xKsz7utO6F8F4cqt8K/ktTl9rm88yryvDpsfOw== - "@rollup/rollup-linux-loongarch64-gnu@4.34.6": version "4.34.6" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.6.tgz#19418cc57579a5655af2d850a89d74b3f7e9aa92" integrity sha512-4Qmkaps9yqmpjY5pvpkfOerYgKNUGzQpFxV6rnS7c/JfYbDSU0y6WpbbredB5cCpLFGJEqYX40WUmxMkwhWCjw== +"@rollup/rollup-linux-loongarch64-gnu@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.7.tgz#a7488ab078233111e8aeb370d1ecf107ec7e1716" + integrity sha512-ws8pc68UcJJqCpneDFepnwlsMUFoWvPbWXT/XUrJ7rWUL9vLoIN3GAasgG+nCvq8xrE3pIrd+qLX/jotcLy0Qw== + "@rollup/rollup-linux-powerpc64le-gnu@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz#e8585075ddfb389222c5aada39ea62d6d2511ccc" integrity sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw== -"@rollup/rollup-linux-powerpc64le-gnu@4.32.0": - version "4.32.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.32.0.tgz#e687dfcaf08124aafaaebecef0cc3986675cb9b6" - integrity sha512-Sts5DST1jXAc9YH/iik1C9QRsLcCoOScf3dfbY5i4kH9RJpKxiTBXqm7qU5O6zTXBTEZry69bGszr3SMgYmMcQ== - "@rollup/rollup-linux-powerpc64le-gnu@4.34.6": version "4.34.6" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.6.tgz#fe0bce7778cb6ce86898c781f3f11369d1a4952c" integrity sha512-Zsrtux3PuaxuBTX/zHdLaFmcofWGzaWW1scwLU3ZbW/X+hSsFbz9wDIp6XvnT7pzYRl9MezWqEqKy7ssmDEnuQ== +"@rollup/rollup-linux-powerpc64le-gnu@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.7.tgz#e9b9c0d6bd248a92b2d6ec01ebf99c62ae1f2e9a" + integrity sha512-vrDk9JDa/BFkxcS2PbWpr0C/LiiSLxFbNOBgfbW6P8TBe9PPHx9Wqbvx2xgNi1TOAyQHQJ7RZFqBiEohm79r0w== + "@rollup/rollup-linux-riscv64-gnu@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz#7d0d40cee7946ccaa5a4e19a35c6925444696a9e" integrity sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw== -"@rollup/rollup-linux-riscv64-gnu@4.32.0": - version "4.32.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.32.0.tgz#19fce2594f9ce73d1cb0748baf8cd90a7bedc237" - integrity sha512-qhlXeV9AqxIyY9/R1h1hBD6eMvQCO34ZmdYvry/K+/MBs6d1nRFLm6BOiITLVI+nFAAB9kUB6sdJRKyVHXnqZw== - "@rollup/rollup-linux-riscv64-gnu@4.34.6": version "4.34.6" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.6.tgz#9c158360abf6e6f7794285642ba0898c580291f6" integrity sha512-aK+Zp+CRM55iPrlyKiU3/zyhgzWBxLVrw2mwiQSYJRobCURb781+XstzvA8Gkjg/hbdQFuDw44aUOxVQFycrAg== +"@rollup/rollup-linux-riscv64-gnu@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.7.tgz#0df84ce2bea48ee686fb55060d76ab47aff45c4c" + integrity sha512-rB+ejFyjtmSo+g/a4eovDD1lHWHVqizN8P0Hm0RElkINpS0XOdpaXloqM4FBkF9ZWEzg6bezymbpLmeMldfLTw== + "@rollup/rollup-linux-s390x-gnu@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz#c2dcd8a4b08b2f2778eceb7a5a5dfde6240ebdea" integrity sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA== -"@rollup/rollup-linux-s390x-gnu@4.32.0": - version "4.32.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.32.0.tgz#fd99b335bb65c59beb7d15ae82be0aafa9883c19" - integrity sha512-8ZGN7ExnV0qjXa155Rsfi6H8M4iBBwNLBM9lcVS+4NcSzOFaNqmt7djlox8pN1lWrRPMRRQ8NeDlozIGx3Omsw== - "@rollup/rollup-linux-s390x-gnu@4.34.6": version "4.34.6" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.6.tgz#f9113498d22962baacdda008b5587d568b05aa34" integrity sha512-WoKLVrY9ogmaYPXwTH326+ErlCIgMmsoRSx6bO+l68YgJnlOXhygDYSZe/qbUJCSiCiZAQ+tKm88NcWuUXqOzw== +"@rollup/rollup-linux-s390x-gnu@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.7.tgz#73df374c57d036856e33dbd2715138922e91e452" + integrity sha512-nNXNjo4As6dNqRn7OrsnHzwTgtypfRA3u3AKr0B3sOOo+HkedIbn8ZtFnB+4XyKJojIfqDKmbIzO1QydQ8c+Pw== + "@rollup/rollup-linux-x64-gnu@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz#183637d91456877cb83d0a0315eb4788573aa588" integrity sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg== -"@rollup/rollup-linux-x64-gnu@4.32.0": - version "4.32.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.32.0.tgz#4e8c697bbaa2e2d7212bd42086746c8275721166" - integrity sha512-VDzNHtLLI5s7xd/VubyS10mq6TxvZBp+4NRWoW+Hi3tgV05RtVm4qK99+dClwTN1McA6PHwob6DEJ6PlXbY83A== - "@rollup/rollup-linux-x64-gnu@4.34.6": version "4.34.6" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.6.tgz#aec8d4cdf911cd869a72b8bd00833cb426664e0c" integrity sha512-Sht4aFvmA4ToHd2vFzwMFaQCiYm2lDFho5rPcvPBT5pCdC+GwHG6CMch4GQfmWTQ1SwRKS0dhDYb54khSrjDWw== +"@rollup/rollup-linux-x64-gnu@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.7.tgz#f27af0b55f0cdd84e182e6cd44a6d03da0458149" + integrity sha512-9kPVf9ahnpOMSGlCxXGv980wXD0zRR3wyk8+33/MXQIpQEOpaNe7dEHm5LMfyRZRNt9lMEQuH0jUKj15MkM7QA== + "@rollup/rollup-linux-x64-musl@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz#036a4c860662519f1f9453807547fd2a11d5bb01" integrity sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow== -"@rollup/rollup-linux-x64-musl@4.32.0": - version "4.32.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.32.0.tgz#0d2f74bd9cfe0553f20f056760a95b293e849ab2" - integrity sha512-qcb9qYDlkxz9DxJo7SDhWxTWV1gFuwznjbTiov289pASxlfGbaOD54mgbs9+z94VwrXtKTu+2RqwlSTbiOqxGg== - "@rollup/rollup-linux-x64-musl@4.34.6": version "4.34.6" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.6.tgz#61c0a146bdd1b5e0dcda33690dd909b321d8f20f" integrity sha512-zmmpOQh8vXc2QITsnCiODCDGXFC8LMi64+/oPpPx5qz3pqv0s6x46ps4xoycfUiVZps5PFn1gksZzo4RGTKT+A== +"@rollup/rollup-linux-x64-musl@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.7.tgz#c7981ad5cfb8c3cd5d643d33ca54e4d2802b9201" + integrity sha512-7wJPXRWTTPtTFDFezA8sle/1sdgxDjuMoRXEKtx97ViRxGGkVQYovem+Q8Pr/2HxiHp74SSRG+o6R0Yq0shPwQ== + "@rollup/rollup-win32-arm64-msvc@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz#51cad812456e616bfe4db5238fb9c7497e042a52" integrity sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw== -"@rollup/rollup-win32-arm64-msvc@4.32.0": - version "4.32.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.32.0.tgz#6534a09fcdd43103645155cedb5bfa65fbf2c23f" - integrity sha512-pFDdotFDMXW2AXVbfdUEfidPAk/OtwE/Hd4eYMTNVVaCQ6Yl8et0meDaKNL63L44Haxv4UExpv9ydSf3aSayDg== - "@rollup/rollup-win32-arm64-msvc@4.34.6": version "4.34.6" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.6.tgz#c6c5bf290a3a459c18871110bc2e7009ce35b15a" integrity sha512-3/q1qUsO/tLqGBaD4uXsB6coVGB3usxw3qyeVb59aArCgedSF66MPdgRStUd7vbZOsko/CgVaY5fo2vkvPLWiA== +"@rollup/rollup-win32-arm64-msvc@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.7.tgz#06cedc0ef3cbf1cbd8abcf587090712e40ae6941" + integrity sha512-MN7aaBC7mAjsiMEZcsJvwNsQVNZShgES/9SzWp1HC9Yjqb5OpexYnRjF7RmE4itbeesHMYYQiAtUAQaSKs2Rfw== + "@rollup/rollup-win32-ia32-msvc@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz#661c8b3e4cd60f51deaa39d153aac4566e748e5e" integrity sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw== -"@rollup/rollup-win32-ia32-msvc@4.32.0": - version "4.32.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.32.0.tgz#8222ccfecffd63a6b0ddbe417d8d959e4f2b11b3" - integrity sha512-/TG7WfrCAjeRNDvI4+0AAMoHxea/USWhAzf9PVDFHbcqrQ7hMMKp4jZIy4VEjk72AAfN5k4TiSMRXRKf/0akSw== - "@rollup/rollup-win32-ia32-msvc@4.34.6": version "4.34.6" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.6.tgz#16ca6bdadc9e054818b9c51f8dac82f6b8afab81" integrity sha512-oLHxuyywc6efdKVTxvc0135zPrRdtYVjtVD5GUm55I3ODxhU/PwkQFD97z16Xzxa1Fz0AEe4W/2hzRtd+IfpOA== +"@rollup/rollup-win32-ia32-msvc@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.7.tgz#90b39b977b14961a769be6ea61238e7fc668dd4d" + integrity sha512-aeawEKYswsFu1LhDM9RIgToobquzdtSc4jSVqHV8uApz4FVvhFl/mKh92wc8WpFc6aYCothV/03UjY6y7yLgbg== + "@rollup/rollup-win32-x64-msvc@4.30.1": version "4.30.1" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz#73bf1885ff052b82fbb0f82f8671f73c36e9137c" integrity sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og== -"@rollup/rollup-win32-x64-msvc@4.32.0": - version "4.32.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.32.0.tgz#1a40b4792c08094b6479c48c90fe7f4b10ec2f54" - integrity sha512-5hqO5S3PTEO2E5VjCePxv40gIgyS2KvO7E7/vvC/NbIW4SIRamkMr1hqj+5Y67fbBWv/bQLB6KelBQmXlyCjWA== - "@rollup/rollup-win32-x64-msvc@4.34.6": version "4.34.6" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.6.tgz#f3d03ce2d82723eb089188ea1494a719b09e1561" integrity sha512-0PVwmgzZ8+TZ9oGBmdZoQVXflbvuwzN/HRclujpl4N/q3i+y0lqLw8n1bXA8ru3sApDjlmONaNAuYr38y1Kr9w== +"@rollup/rollup-win32-x64-msvc@4.34.7": + version "4.34.7" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.7.tgz#6531d61e7141091eaab0461ee8e0380c10e4ca57" + integrity sha512-4ZedScpxxIrVO7otcZ8kCX1mZArtH2Wfj3uFCxRJ9NO80gg1XV0U/b2f/MKaGwj2X3QopHfoWiDQ917FRpwY3w== + "@rushstack/node-core-library@5.10.2": version "5.10.2" resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-5.10.2.tgz#8d12bc5bd9244ea57f441877246efb0a1b7b7df6" @@ -3982,7 +3766,21 @@ ajv "~8.13.0" ajv-draft-04 "~1.0.0" ajv-formats "~3.0.1" - fs-extra "~7.0.1" + fs-extra "~7.0.1" + import-lazy "~4.0.0" + jju "~1.4.0" + resolve "~1.22.1" + semver "~7.5.4" + +"@rushstack/node-core-library@5.11.0": + version "5.11.0" + resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-5.11.0.tgz#8ceb980f3a591e1254167bb5ffdc200d1893b783" + integrity sha512-I8+VzG9A0F3nH2rLpPd7hF8F7l5Xb7D+ldrWVZYegXM6CsKkvWc670RlgK3WX8/AseZfXA/vVrh0bpXe2Y2UDQ== + dependencies: + ajv "~8.13.0" + ajv-draft-04 "~1.0.0" + ajv-formats "~3.0.1" + fs-extra "~11.3.0" import-lazy "~4.0.0" jju "~1.4.0" resolve "~1.22.1" @@ -4004,6 +3802,14 @@ "@rushstack/node-core-library" "5.10.2" supports-color "~8.1.1" +"@rushstack/terminal@0.15.0": + version "0.15.0" + resolved "https://registry.yarnpkg.com/@rushstack/terminal/-/terminal-0.15.0.tgz#9599c6684ed2adc9e74b767a2d45159975bcddb8" + integrity sha512-vXQPRQ+vJJn4GVqxkwRe+UGgzNxdV8xuJZY2zem46Y0p3tlahucH9/hPmLGj2i9dQnUBFiRnoM9/KW7PYw8F4Q== + dependencies: + "@rushstack/node-core-library" "5.11.0" + supports-color "~8.1.1" + "@rushstack/ts-command-line@4.23.3": version "4.23.3" resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.23.3.tgz#a42fe413159c0f3f2c57afdceedf91a5b75c2d67" @@ -4014,6 +3820,16 @@ argparse "~1.0.9" string-argv "~0.3.1" +"@rushstack/ts-command-line@4.23.5": + version "4.23.5" + resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.23.5.tgz#523e0db8906d831a730f15acc15fbcf7906c650a" + integrity sha512-jg70HfoK44KfSP3MTiL5rxsZH7X1ktX3cZs9Sl8eDu1/LxJSbPsh0MOFRC710lIuYYSgxWjI5AjbCBAl7u3RxA== + dependencies: + "@rushstack/terminal" "0.15.0" + "@types/argparse" "1.0.38" + argparse "~1.0.9" + string-argv "~0.3.1" + "@schematics/angular@19.2.0-next.2": version "19.2.0-next.2" resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-19.2.0-next.2.tgz#092cbc9608acb933f61bee66beb834d17e648473" @@ -4023,53 +3839,53 @@ "@angular-devkit/schematics" "19.2.0-next.2" jsonc-parser "3.3.1" -"@shikijs/core@2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-2.1.0.tgz#e767dddf2034ae4504e36210bbd881a94525f321" - integrity sha512-v795KDmvs+4oV0XD05YLzfDMe9ISBgNjtFxP4PAEv5DqyeghO1/TwDqs9ca5/E6fuO95IcAcWqR6cCX9TnqLZA== +"@shikijs/core@2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-2.3.2.tgz#dcdc851e6963fe4196e2f1051302dcecce1a8706" + integrity sha512-s7vyL3LzUKm3Qwf36zRWlavX9BQMZTIq9B1almM63M5xBuSldnsTHCmsXzoF/Kyw4k7Xgas7yAyJz9VR/vcP1A== dependencies: - "@shikijs/engine-javascript" "2.1.0" - "@shikijs/engine-oniguruma" "2.1.0" - "@shikijs/types" "2.1.0" + "@shikijs/engine-javascript" "2.3.2" + "@shikijs/engine-oniguruma" "2.3.2" + "@shikijs/types" "2.3.2" "@shikijs/vscode-textmate" "^10.0.1" "@types/hast" "^3.0.4" hast-util-to-html "^9.0.4" -"@shikijs/engine-javascript@2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@shikijs/engine-javascript/-/engine-javascript-2.1.0.tgz#5645a04629cd85c433354b76d601ce7127eb502b" - integrity sha512-cgIUdAliOsoaa0rJz/z+jvhrpRd+fVAoixVFEVxUq5FA+tHgBZAIfVJSgJNVRj2hs/wZ1+4hMe82eKAThVh0nQ== +"@shikijs/engine-javascript@2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@shikijs/engine-javascript/-/engine-javascript-2.3.2.tgz#9be457bb1ce4c8650b3b46b0f5054d4afef48a6d" + integrity sha512-w3IEMu5HfL/OaJTsMbIfZ1HRPnWVYRANeDtmsdIIEgUOcLjzFJFQwlnkckGjKHekEzNqlMLbgB/twnfZ/EEAGg== dependencies: - "@shikijs/types" "2.1.0" + "@shikijs/types" "2.3.2" "@shikijs/vscode-textmate" "^10.0.1" - oniguruma-to-es "^2.3.0" + oniguruma-to-es "^3.1.0" -"@shikijs/engine-oniguruma@2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-2.1.0.tgz#0990713d9ce4796172db47321a9b32fa9036003c" - integrity sha512-Ujik33wEDqgqY2WpjRDUBECGcKPv3eGGkoXPujIXvokLaRmGky8NisSk8lHUGeSFxo/Cz5sgFej9sJmA9yeepg== +"@shikijs/engine-oniguruma@2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-2.3.2.tgz#42e64b7bbbaec5e903b12718dde1f1e1738a9c66" + integrity sha512-vikMY1TroyZXUHIXbMnvY/mjtOxMn+tavcfAeQPgWS9FHcgFSUoEtywF5B5sOLb9NXb8P2vb7odkh3nj15/00A== dependencies: - "@shikijs/types" "2.1.0" + "@shikijs/types" "2.3.2" "@shikijs/vscode-textmate" "^10.0.1" -"@shikijs/langs@2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@shikijs/langs/-/langs-2.1.0.tgz#fdc88584b3f174b3d8aec24a3a706eb897edf4ed" - integrity sha512-Jn0gS4rPgerMDPj1ydjgFzZr5fAIoMYz4k7ZT3LJxWWBWA6lokK0pumUwVtb+MzXtlpjxOaQejLprmLbvMZyww== +"@shikijs/langs@2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@shikijs/langs/-/langs-2.3.2.tgz#a716ac528dea9e927d7088102a132c153f8a161b" + integrity sha512-UqI6bSxFzhexIJficZLKeB1L2Sc3xoNiAV0yHpfbg5meck93du+EKQtsGbBv66Ki53XZPhnR/kYkOr85elIuFw== dependencies: - "@shikijs/types" "2.1.0" + "@shikijs/types" "2.3.2" -"@shikijs/themes@2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@shikijs/themes/-/themes-2.1.0.tgz#b482694577c4689746fabee8bac439a6a1d087a1" - integrity sha512-oS2mU6+bz+8TKutsjBxBA7Z3vrQk21RCmADLpnu8cy3tZD6Rw0FKqDyXNtwX52BuIDKHxZNmRlTdG3vtcYv3NQ== +"@shikijs/themes@2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@shikijs/themes/-/themes-2.3.2.tgz#c117d826ce22899dea802499a7ad5a99c2de0446" + integrity sha512-QAh7D/hhfYKHibkG2tti8vxNt3ekAH5EqkXJeJbTh7FGvTCWEI7BHqNCtMdjFvZ0vav5nvUgdvA7/HI7pfsB4w== dependencies: - "@shikijs/types" "2.1.0" + "@shikijs/types" "2.3.2" -"@shikijs/types@2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-2.1.0.tgz#38e3c241263de1b5c30cbd9b9d03eb34cebd842e" - integrity sha512-OFOdHA6VEVbiQvepJ8yqicC6VmBrKxFFhM2EsHHrZESqLVAXOSeRDiuSYV185lIgp15TVic5vYBYNhTsk1xHLg== +"@shikijs/types@2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-2.3.2.tgz#d273d19a7b0c23445e07c0370f127a66400d1eb8" + integrity sha512-CBaMY+a3pepyC4SETi7+bSzO0f6hxEQJUUuS4uD7zppzjmrN4ZRtBqxaT+wOan26CR9eeJ5iBhc4qvWEwn7Eeg== dependencies: "@shikijs/vscode-textmate" "^10.0.1" "@types/hast" "^3.0.4" @@ -4079,51 +3895,51 @@ resolved "https://registry.yarnpkg.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.1.tgz#d06d45b67ac5e9b0088e3f67ebd3f25c6c3d711a" integrity sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg== -"@sigstore/bundle@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-3.0.0.tgz#ffffc750436c6eb8330ead1ca65bc892f893a7c5" - integrity sha512-XDUYX56iMPAn/cdgh/DTJxz5RWmqKV4pwvUAEKEWJl+HzKdCd/24wUa9JYNMlDSCb7SUHAdtksxYX779Nne/Zg== +"@sigstore/bundle@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-3.1.0.tgz#74f8f3787148400ddd364be8a9a9212174c66646" + integrity sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag== dependencies: - "@sigstore/protobuf-specs" "^0.3.2" + "@sigstore/protobuf-specs" "^0.4.0" "@sigstore/core@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@sigstore/core/-/core-2.0.0.tgz#f888a8e4c8fdaa27848514a281920b6fd8eca955" integrity sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg== -"@sigstore/protobuf-specs@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.3.3.tgz#7dd46d68b76c322873a2ef7581ed955af6f4dcde" - integrity sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ== +"@sigstore/protobuf-specs@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.4.0.tgz#7524509d93efcb14e77d0bc34c43a1ae85f851c5" + integrity sha512-o09cLSIq9EKyRXwryWDOJagkml9XgQCoCSRjHOnHLnvsivaW7Qznzz6yjfV7PHJHhIvyp8OH7OX8w0Dc5bQK7A== -"@sigstore/sign@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@sigstore/sign/-/sign-3.0.0.tgz#70752aaa54dfeafa0b0fbe1f58ebe9fe3d621f8f" - integrity sha512-UjhDMQOkyDoktpXoc5YPJpJK6IooF2gayAr5LvXI4EL7O0vd58okgfRcxuaH+YTdhvb5aa1Q9f+WJ0c2sVuYIw== +"@sigstore/sign@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/sign/-/sign-3.1.0.tgz#5d098d4d2b59a279e9ac9b51c794104cda0c649e" + integrity sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw== dependencies: - "@sigstore/bundle" "^3.0.0" + "@sigstore/bundle" "^3.1.0" "@sigstore/core" "^2.0.0" - "@sigstore/protobuf-specs" "^0.3.2" - make-fetch-happen "^14.0.1" + "@sigstore/protobuf-specs" "^0.4.0" + make-fetch-happen "^14.0.2" proc-log "^5.0.0" promise-retry "^2.0.1" -"@sigstore/tuf@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@sigstore/tuf/-/tuf-3.0.0.tgz#5f657e3052e93cb09e1735ee7f52b7938351278d" - integrity sha512-9Xxy/8U5OFJu7s+OsHzI96IX/OzjF/zj0BSSaWhgJgTqtlBhQIV2xdrQI5qxLD7+CWWDepadnXAxzaZ3u9cvRw== +"@sigstore/tuf@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/tuf/-/tuf-3.1.0.tgz#f533ac8ac572c9f7e36f5e08f1effa6b2244f55a" + integrity sha512-suVMQEA+sKdOz5hwP9qNcEjX6B45R+hFFr4LAWzbRc5O+U2IInwvay/bpG5a4s+qR35P/JK/PiKiRGjfuLy1IA== dependencies: - "@sigstore/protobuf-specs" "^0.3.2" + "@sigstore/protobuf-specs" "^0.4.0" tuf-js "^3.0.1" -"@sigstore/verify@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sigstore/verify/-/verify-2.0.0.tgz#4ad96e9234b71b57622c3c446b63bad805351030" - integrity sha512-Ggtq2GsJuxFNUvQzLoXqRwS4ceRfLAJnrIHUDrzAD0GgnOhwujJkKkxM/s5Bako07c3WtAs/sZo5PJq7VHjeDg== +"@sigstore/verify@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/verify/-/verify-2.1.0.tgz#63e31dd69b678ed6d98cbfdc6d6c104b82d0905c" + integrity sha512-kAAM06ca4CzhvjIZdONAL9+MLppW3K48wOFy1TbuaWFW/OMfl8JuTgW0Bm02JB1WJGT/ET2eqav0KTEKmxqkIA== dependencies: - "@sigstore/bundle" "^3.0.0" + "@sigstore/bundle" "^3.1.0" "@sigstore/core" "^2.0.0" - "@sigstore/protobuf-specs" "^0.3.2" + "@sigstore/protobuf-specs" "^0.4.0" "@sindresorhus/is@^4.0.0", "@sindresorhus/is@^4.6.0": version "4.6.0" @@ -4463,9 +4279,9 @@ "@types/d3-color" "*" "@types/d3-path@*": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-3.1.0.tgz#2b907adce762a78e98828f0b438eaca339ae410a" - integrity sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ== + version "3.1.1" + resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-3.1.1.tgz#f632b380c3aca1dba8e34aa049bcd6a4af23df8a" + integrity sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg== "@types/d3-polygon@*": version "3.0.2" @@ -4488,9 +4304,9 @@ integrity sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ== "@types/d3-scale@*": - version "4.0.8" - resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.8.tgz#d409b5f9dcf63074464bf8ddfb8ee5a1f95945bb" - integrity sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ== + version "4.0.9" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.9.tgz#57a2f707242e6fe1de81ad7bfcccaaf606179afb" + integrity sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw== dependencies: "@types/d3-time" "*" @@ -4573,9 +4389,9 @@ "@types/d3-zoom" "*" "@types/diff@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@types/diff/-/diff-7.0.0.tgz#e9f6a33a72164b3a80b983114a1cef9a6f0c2165" - integrity sha512-sVpkpbnTJL9CYoDf4U+tHaQLe5HiTaHWY7m9FuYA7oMCHwC9ie0Vh9eIGapyzYrU3+pILlSY2fAc4elfw5m4dg== + version "7.0.1" + resolved "https://registry.yarnpkg.com/@types/diff/-/diff-7.0.1.tgz#acc505eb2e8337ca400503283a6ab44a59906d9f" + integrity sha512-R/BHQFripuhW6XPXy05hIvXJQdQ4540KnTvEFHSLjXfHYM41liOLKgIJEyYYiQe796xpaMHfe4Uj/p7Uvng2vA== "@types/dom-view-transitions@^1.0.1": version "1.0.5" @@ -4616,9 +4432,9 @@ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.5.tgz#f6a851c7fd512e5da087f6f20d29f44b162a6a95" - integrity sha512-GLZPrd9ckqEBFMcVM/qRFAP0Hg3qiVEojgEFsx/N/zKXsBzbGF6z5FBDpZ0+Xhp1xr+qRZYjfGr1cWHB9oFHSA== + version "5.0.6" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz#41fec4ea20e9c7b22f024ab88a95c6bb288f51b8" + integrity sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA== dependencies: "@types/node" "*" "@types/qs" "*" @@ -4713,9 +4529,9 @@ integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== "@types/http-proxy@^1.17.15", "@types/http-proxy@^1.17.8": - version "1.17.15" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.15.tgz#12118141ce9775a6499ecb4c01d02f90fc839d36" - integrity sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ== + version "1.17.16" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.16.tgz#dee360707b35b3cc85afcde89ffeebff7d7f9240" + integrity sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w== dependencies: "@types/node" "*" @@ -4735,9 +4551,9 @@ integrity sha512-kq6u6TuwcyxAMN8f9GHKmMFhDC3D7aLIMR6Va1KgTji9g64KUsAE6Xw+/flPtuU/o2EQpYpdlQjg6chdBOdVzQ== "@types/jasmine@*", "@types/jasmine@^5.0.0": - version "5.1.5" - resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-5.1.5.tgz#bba343c504f48e596837415f0558e10b8a0e5f7d" - integrity sha512-SaCZ3kM5NjOiJqMRYwHpLbTfUC2Dyk1KS3QanNFsUYPGTk70CWVK/J9ueun6zNhw/UkgV7xl8V4ZLQZNRbfnNw== + version "5.1.6" + resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-5.1.6.tgz#43400819398c1c13cbfa9716419128bd0b18fc52" + integrity sha512-JDwKwipGFDwf021BtRTuluYe1aMDNimtO72ygPrVXnZSC8Df2V22AHeIgGa84tbF4SLkRvN+dJnlV8aMwQjkVw== "@types/jasminewd2@^2.0.8": version "2.0.13" @@ -4809,9 +4625,9 @@ "@types/node" "*" "@types/node@*", "@types/node@>=10.0.0", "@types/node@>=13.7.0": - version "22.10.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.10.tgz#85fe89f8bf459dc57dfef1689bd5b52ad1af07e6" - integrity sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww== + version "22.13.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.4.tgz#3fe454d77cd4a2d73c214008b3e331bfaaf5038a" + integrity sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg== dependencies: undici-types "~6.20.0" @@ -4826,9 +4642,9 @@ integrity sha512-1RWYiq+5UfozGsU6MwJyFX6BtktcT10XRjvcAQmskCtMcW3tPske88lM/nHv7BQG1w9KBXI1zPGuu5PnNCX14g== "@types/node@^18.11.18", "@types/node@^18.19.21": - version "18.19.74" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.74.tgz#4d093acd2a558ebbc5f0efa4e20ce63791b0cc58" - integrity sha512-HMwEkkifei3L605gFdV+/UwtpxP6JSzM+xFk2Ia6DNFSwSVBRh9qp5Tgf4lNFOMfPVuU0WnkcWpXZpgn5ufO4A== + version "18.19.76" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.76.tgz#7991658e0ba41ad30cc8be01c9bbe580d58f2112" + integrity sha512-yvR7Q9LdPz2vGpmpJX5LolrgRdWvB67MJKDPSgIIzpFbaf9a1j/f5DnLp5VDyHGMR0QZHlTr1afsD87QCXFHKw== dependencies: undici-types "~5.26.4" @@ -5065,37 +4881,37 @@ dependencies: "@types/node" "*" -"@typescript-eslint/types@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" - integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== +"@typescript-eslint/types@8.24.0": + version "8.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.24.0.tgz#694e7fb18d70506c317b816de9521300b0f72c8e" + integrity sha512-VacJCBTyje7HGAw7xp11q439A+zeGG0p0/p2zsZwpnMzjPB5WteaWqt4g2iysgGFafrqvyLWqq6ZPZAOCoefCw== -"@typescript-eslint/typescript-estree@^7.6.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz#b5868d486c51ce8f312309ba79bdb9f331b37931" - integrity sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA== +"@typescript-eslint/typescript-estree@^8.23.0": + version "8.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.0.tgz#0487349be174097bb329a58273100a9629e03c6c" + integrity sha512-ITjYcP0+8kbsvT9bysygfIfb+hBj6koDsu37JZG7xrCiy3fPJyNmfVtaGsgTUSEuTzcvME5YI5uyL5LD1EV5ZQ== dependencies: - "@typescript-eslint/types" "7.18.0" - "@typescript-eslint/visitor-keys" "7.18.0" + "@typescript-eslint/types" "8.24.0" + "@typescript-eslint/visitor-keys" "8.24.0" debug "^4.3.4" - globby "^11.1.0" + fast-glob "^3.3.2" is-glob "^4.0.3" minimatch "^9.0.4" semver "^7.6.0" - ts-api-utils "^1.3.0" + ts-api-utils "^2.0.1" -"@typescript-eslint/visitor-keys@7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz#0564629b6124d67607378d0f0332a0495b25e7d7" - integrity sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg== +"@typescript-eslint/visitor-keys@8.24.0": + version "8.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.0.tgz#36ecf0b9b1d819ad88a3bd4157ab7d594cb797c9" + integrity sha512-kArLq83QxGLbuHrTMoOEWO+l2MwsNS2TGISEdx8xgqpkbytB07XmlQyQdNDrCc1ecSqx0cnmhGvpX+VBwqqSkg== dependencies: - "@typescript-eslint/types" "7.18.0" - eslint-visitor-keys "^3.4.3" + "@typescript-eslint/types" "8.24.0" + eslint-visitor-keys "^4.2.0" "@typescript/vfs@^1.5.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@typescript/vfs/-/vfs-1.6.0.tgz#9c90d8c43f7ac53cc77d5959e5c4c9b639f0959e" - integrity sha512-hvJUjNVeBMp77qPINuUvYXj4FyWeeMMKZkxEATEU3hqBAQ7qdTBCUFT7Sp0Zu0faeEtFf+ldXxMEDr/bk73ISg== + version "1.6.1" + resolved "https://registry.yarnpkg.com/@typescript/vfs/-/vfs-1.6.1.tgz#fe7087d5a43715754f7ea9bf6e0b905176c9eebd" + integrity sha512-JwoxboBh7Oz1v38tPbkrZ62ZXNHAk9bJ7c9x0eI5zBfBnBYGhURdbnh7Z4smN/MV48Y5OCcZb58n972UtbazsA== dependencies: debug "^4.1.1" @@ -5502,23 +5318,23 @@ ajv@~8.13.0: uri-js "^4.4.1" algoliasearch@^5.0.0: - version "5.20.0" - resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-5.20.0.tgz#15f4eb6428f258d083d1cbc47d04a8d66eecba5f" - integrity sha512-groO71Fvi5SWpxjI9Ia+chy0QBwT61mg6yxJV27f5YFf+Mw+STT75K6SHySpP8Co5LsCrtsbCH5dJZSRtkSKaQ== - dependencies: - "@algolia/client-abtesting" "5.20.0" - "@algolia/client-analytics" "5.20.0" - "@algolia/client-common" "5.20.0" - "@algolia/client-insights" "5.20.0" - "@algolia/client-personalization" "5.20.0" - "@algolia/client-query-suggestions" "5.20.0" - "@algolia/client-search" "5.20.0" - "@algolia/ingestion" "1.20.0" - "@algolia/monitoring" "1.20.0" - "@algolia/recommend" "5.20.0" - "@algolia/requester-browser-xhr" "5.20.0" - "@algolia/requester-fetch" "5.20.0" - "@algolia/requester-node-http" "5.20.0" + version "5.20.2" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-5.20.2.tgz#e1df37b02a4cf0f7031ff729ee9b35a7b43eeea6" + integrity sha512-8evxG++iWyWnhng3g5RP+kwn6j+2vKLfew8pVoekn87FcfsDm92zJXKwSrU6pl+m5eAbGFhFF/gCYEQiRdbPlA== + dependencies: + "@algolia/client-abtesting" "5.20.2" + "@algolia/client-analytics" "5.20.2" + "@algolia/client-common" "5.20.2" + "@algolia/client-insights" "5.20.2" + "@algolia/client-personalization" "5.20.2" + "@algolia/client-query-suggestions" "5.20.2" + "@algolia/client-search" "5.20.2" + "@algolia/ingestion" "1.20.2" + "@algolia/monitoring" "1.20.2" + "@algolia/recommend" "5.20.2" + "@algolia/requester-browser-xhr" "5.20.2" + "@algolia/requester-fetch" "5.20.2" + "@algolia/requester-node-http" "5.20.2" "angular-1.5@npm:angular@1.5": version "1.5.11" @@ -5808,11 +5624,6 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -array-flatten@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-3.0.0.tgz#6428ca2ee52c7b823192ec600fa3ed2f157cd541" - integrity sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA== - array-ify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" @@ -5830,11 +5641,6 @@ array-union@^1.0.1: dependencies: array-uniq "^1.0.1" -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" @@ -5890,10 +5696,10 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== -ast-module-types@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/ast-module-types/-/ast-module-types-6.0.0.tgz#ea6132bb44a115717299dfdac934d2d13e8ecd93" - integrity sha512-LFRg7178Fw5R4FAEwZxVqiRI8IxSM+Ay2UBrHoCerXNme+kMMMfz7T3xDGV/c2fer87hcrtgJGsnSOfUrPK6ng== +ast-module-types@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ast-module-types/-/ast-module-types-6.0.1.tgz#4b4ca0251c57b815bab62604dcb22f8c903e2523" + integrity sha512-WHw67kLXYbZuHTmcdbIrVArCq5wxo6NEuj3hiYAWr8mwJeC+C2mMCIBIWCiDoCye/OF/xelc+teJ1ERoWmnEIA== ast-types@^0.13.4: version "0.13.4" @@ -6080,9 +5886,9 @@ bare-path@^3.0.0: bare-os "^3.0.1" bare-stream@^2.0.0: - version "2.6.4" - resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.6.4.tgz#4226bc8ec7b3ff2c17087385326909978747b149" - integrity sha512-G6i3A74FjNq4nVrrSTUz5h3vgXzBJnjmWAVlBWaZETkgu+LgKd7AiyOml3EDJY1AHlIbBHKDXE+TUT53Ff8OaA== + version "2.6.5" + resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.6.5.tgz#bba8e879674c4c27f7e27805df005c15d7a2ca07" + integrity sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA== dependencies: streamx "^2.21.0" @@ -6109,7 +5915,7 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" -basic-auth-connect@^1.0.0: +basic-auth-connect@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/basic-auth-connect/-/basic-auth-connect-1.1.0.tgz#b44af37d5b3bd7561b56491e58cf26ae1578f0c7" integrity sha512-rKcWjfiRZ3p5WS9e5q6msXa07s6DaFAMXoyowV+mb2xQG+oYdw2QEUyKi0Xp95JvXzShlM+oGy5QuqSK6TfC1Q== @@ -6570,9 +6376,9 @@ cacheable-request@^7.0.2: responselike "^2.0.0" call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz#32e5892e6361b29b0b545ba6f7763378daca2840" - integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g== + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== dependencies: es-errors "^1.3.0" function-bind "^1.1.2" @@ -6624,9 +6430,9 @@ camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001688: - version "1.0.30001695" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz#39dfedd8f94851132795fdf9b79d29659ad9c4d4" - integrity sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw== + version "1.0.30001699" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz#a102cf330d153bf8c92bfb5be3cd44c0a89c8c12" + integrity sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w== canonical-path@1.0.0: version "1.0.0" @@ -6687,7 +6493,7 @@ chalk@^2.3.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^5.0.1, chalk@^5.3.0: +chalk@^5.0.1, chalk@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.4.1.tgz#1b48bf0963ec158dce2aacf69c093ae2dd2092d8" integrity sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w== @@ -6845,13 +6651,13 @@ chrome-trace-event@^1.0.2: resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== -chromium-bidi@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-1.1.0.tgz#45e7d050ef512393424b6faa32a0ba67b2194040" - integrity sha512-HislCEczCuamWm3+55Lig9XKmMF13K+BGKum9rwtDAzgUAHT4h5jNwhDmD4U20VoVUG8ujnv9UZ89qiIf5uF8w== +chromium-bidi@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-1.3.0.tgz#59051cae1532444f2642e612f917100ce720a90f" + integrity sha512-G3x1bkST13kmbL7+dT/oRkNH/7C4UqG+0YQpmySrzXspyOhYgDNc6lhSGpj3cuexvH25WTENhTYq2Tt9JRXtbw== dependencies: - mitt "3.0.1" - zod "3.24.1" + mitt "^3.0.1" + zod "^3.24.1" ci-info@^2.0.0: version "2.0.0" @@ -6941,7 +6747,7 @@ cli-spinners@^2.5.0: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== -cli-table3@^0.6.5: +cli-table3@0.6.5, cli-table3@^0.6.5: version "0.6.5" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.5.tgz#013b91351762739c16a9567c21a04632e449bf2f" integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ== @@ -6950,13 +6756,6 @@ cli-table3@^0.6.5: optionalDependencies: "@colors/colors" "1.5.0" -cli-table@0.3.11: - version "0.3.11" - resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.11.tgz#ac69cdecbe81dccdba4889b9a18b7da312a9d3ee" - integrity sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ== - dependencies: - colors "1.0.3" - cli-truncate@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" @@ -7091,11 +6890,6 @@ colorette@^2.0.10, colorette@^2.0.19, colorette@^2.0.20: resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== -colors@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" - integrity sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw== - colors@1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" @@ -7131,7 +6925,7 @@ commander@^10.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== -commander@^12.0.0, commander@^12.1.0: +commander@^12.1.0: version "12.1.0" resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== @@ -7223,9 +7017,9 @@ compressing@^1.10.0: yazl "^2.4.2" compression@^1.7.0, compression@^1.7.4: - version "1.7.5" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.5.tgz#fdd256c0a642e39e314c478f6c2cd654edd74c93" - integrity sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q== + version "1.8.0" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.8.0.tgz#09420efc96e11a0f44f3a558de59e321364180f7" + integrity sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA== dependencies: bytes "3.1.2" compressible "~2.0.18" @@ -7458,10 +7252,10 @@ cookie@0.7.1: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== -cookie@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-1.0.2.tgz#27360701532116bd3f1f9416929d176afe1e4610" - integrity sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA== +cookie@~0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" + integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== copy-anything@^2.0.1: version "2.0.6" @@ -8224,14 +8018,14 @@ depd@~1.1.2: integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== dependency-tree@^11.0.0: - version "11.0.1" - resolved "https://registry.yarnpkg.com/dependency-tree/-/dependency-tree-11.0.1.tgz#319c27652655f0ff63dc90809322156e90aa2a55" - integrity sha512-eCt7HSKIC9NxgIykG2DRq3Aewn9UhVS14MB3rEn6l/AsEI1FBg6ZGSlCU0SZ6Tjm2kkhj6/8c2pViinuyKELhg== + version "11.1.1" + resolved "https://registry.yarnpkg.com/dependency-tree/-/dependency-tree-11.1.1.tgz#5ab5fbb223fb32a9b03ed40952eb04bf09929ad6" + integrity sha512-pnkCd8VGOq70EVaEQxDC9mZCjCwYj4yG4j8h+PEJswuWp+rdE6p8zbtVvWk+yPwaVimOjlhNi782U9K5KOU9MQ== dependencies: - commander "^12.0.0" - filing-cabinet "^5.0.1" - precinct "^12.0.2" - typescript "^5.4.5" + commander "^12.1.0" + filing-cabinet "^5.0.3" + precinct "^12.2.0" + typescript "^5.7.3" deprecation@^2.0.0: version "2.3.1" @@ -8268,81 +8062,81 @@ detect-node@^2.0.4: resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== -detective-amd@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/detective-amd/-/detective-amd-6.0.0.tgz#29207f8309f3d2d130e3356d67f7fcd90e0c2cbf" - integrity sha512-NTqfYfwNsW7AQltKSEaWR66hGkTeD52Kz3eRQ+nfkA9ZFZt3iifRCWh+yZ/m6t3H42JFwVFTrml/D64R2PAIOA== +detective-amd@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/detective-amd/-/detective-amd-6.0.1.tgz#71eb13b5d9b17222d7b4de3fb89a8e684d8b9a23" + integrity sha512-TtyZ3OhwUoEEIhTFoc1C9IyJIud3y+xYkSRjmvCt65+ycQuc3VcBrPRTMWoO/AnuCyOB8T5gky+xf7Igxtjd3g== dependencies: - ast-module-types "^6.0.0" + ast-module-types "^6.0.1" escodegen "^2.1.0" - get-amd-module-type "^6.0.0" - node-source-walk "^7.0.0" + get-amd-module-type "^6.0.1" + node-source-walk "^7.0.1" -detective-cjs@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/detective-cjs/-/detective-cjs-6.0.0.tgz#65975719993fb4165a86e341a86784d7fcb4e3c8" - integrity sha512-R55jTS6Kkmy6ukdrbzY4x+I7KkXiuDPpFzUViFV/tm2PBGtTCjkh9ZmTuJc1SaziMHJOe636dtiZLEuzBL9drg== +detective-cjs@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/detective-cjs/-/detective-cjs-6.0.1.tgz#4fb81a67337630811409abb2148b2b622cacbdcd" + integrity sha512-tLTQsWvd2WMcmn/60T2inEJNhJoi7a//PQ7DwRKEj1yEeiQs4mrONgsUtEJKnZmrGWBBmE0kJ1vqOG/NAxwaJw== dependencies: - ast-module-types "^6.0.0" - node-source-walk "^7.0.0" + ast-module-types "^6.0.1" + node-source-walk "^7.0.1" -detective-es6@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/detective-es6/-/detective-es6-5.0.0.tgz#0dc90a946a0120d93b28901395ec99c4642990bd" - integrity sha512-NGTnzjvgeMW1khUSEXCzPDoraLenWbUjCFjwxReH+Ir+P6LGjYtaBbAvITWn2H0VSC+eM7/9LFOTAkrta6hNYg== +detective-es6@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/detective-es6/-/detective-es6-5.0.1.tgz#f0c026bc9b767a243e57ef282f4343fcf3b8ec4e" + integrity sha512-XusTPuewnSUdoxRSx8OOI6xIA/uld/wMQwYsouvFN2LAg7HgP06NF1lHRV3x6BZxyL2Kkoih4ewcq8hcbGtwew== dependencies: - node-source-walk "^7.0.0" + node-source-walk "^7.0.1" -detective-postcss@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/detective-postcss/-/detective-postcss-7.0.0.tgz#e9cff50836d67339a0bf4378f22dba4ed5809c01" - integrity sha512-pSXA6dyqmBPBuERpoOKKTUUjQCZwZPLRbd1VdsTbt6W+m/+6ROl4BbE87yQBUtLoK7yX8pvXHdKyM/xNIW9F7A== +detective-postcss@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/detective-postcss/-/detective-postcss-7.0.1.tgz#f5822d8988339fb56851fcdb079d51fbcff114db" + integrity sha512-bEOVpHU9picRZux5XnwGsmCN4+8oZo7vSW0O0/Enq/TO5R2pIAP2279NsszpJR7ocnQt4WXU0+nnh/0JuK4KHQ== dependencies: is-url "^1.2.4" postcss-values-parser "^6.0.2" -detective-sass@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/detective-sass/-/detective-sass-6.0.0.tgz#0585093840afe069ac2bdb55f662a1928c8f6d81" - integrity sha512-h5GCfFMkPm4ZUUfGHVPKNHKT8jV7cSmgK+s4dgQH4/dIUNh9/huR1fjEQrblOQNDalSU7k7g+tiW9LJ+nVEUhg== +detective-sass@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/detective-sass/-/detective-sass-6.0.1.tgz#fcf5aa51bebf7b721807be418418470ee2409f8a" + integrity sha512-jSGPO8QDy7K7pztUmGC6aiHkexBQT4GIH+mBAL9ZyBmnUIOFbkfZnO8wPRRJFP/QP83irObgsZHCoDHZ173tRw== dependencies: gonzales-pe "^4.3.0" - node-source-walk "^7.0.0" + node-source-walk "^7.0.1" -detective-scss@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/detective-scss/-/detective-scss-5.0.0.tgz#3603e967bfc541c28b5cc9ceccd21c36725d6d86" - integrity sha512-Y64HyMqntdsCh1qAH7ci95dk0nnpA29g319w/5d/oYcHolcGUVJbIhOirOFjfN1KnMAXAFm5FIkZ4l2EKFGgxg== +detective-scss@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/detective-scss/-/detective-scss-5.0.1.tgz#6a7f792dc9c0e8cfc0d252a50ba26a6df12596a7" + integrity sha512-MAyPYRgS6DCiS6n6AoSBJXLGVOydsr9huwXORUlJ37K3YLyiN0vYHpzs3AdJOgHobBfispokoqrEon9rbmKacg== dependencies: gonzales-pe "^4.3.0" - node-source-walk "^7.0.0" + node-source-walk "^7.0.1" -detective-stylus@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/detective-stylus/-/detective-stylus-5.0.0.tgz#11c0464350d0b1484d6a7e281547280500c8353f" - integrity sha512-KMHOsPY6aq3196WteVhkY5FF+6Nnc/r7q741E+Gq+Ax9mhE2iwj8Hlw8pl+749hPDRDBHZ2WlgOjP+twIG61vQ== +detective-stylus@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/detective-stylus/-/detective-stylus-5.0.1.tgz#57d54a0b405305ee16655e42008b38a827a9f179" + integrity sha512-Dgn0bUqdGbE3oZJ+WCKf8Dmu7VWLcmRJGc6RCzBgG31DLIyai9WAoEhYRgIHpt/BCRMrnXLbGWGPQuBUrnF0TA== -detective-typescript@^13.0.0: - version "13.0.0" - resolved "https://registry.yarnpkg.com/detective-typescript/-/detective-typescript-13.0.0.tgz#41b391e77721b2872d70c96cc4d98261f9032353" - integrity sha512-tcMYfiFWoUejSbvSblw90NDt76/4mNftYCX0SMnVRYzSXv8Fvo06hi4JOPdNvVNxRtCAKg3MJ3cBJh+ygEMH+A== +detective-typescript@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/detective-typescript/-/detective-typescript-14.0.0.tgz#3cf429652eb7d7d2be2c050ac47af957a559527d" + integrity sha512-pgN43/80MmWVSEi5LUuiVvO/0a9ss5V7fwVfrJ4QzAQRd3cwqU1SfWGXJFcNKUqoD5cS+uIovhw5t/0rSeC5Mw== dependencies: - "@typescript-eslint/typescript-estree" "^7.6.0" - ast-module-types "^6.0.0" - node-source-walk "^7.0.0" + "@typescript-eslint/typescript-estree" "^8.23.0" + ast-module-types "^6.0.1" + node-source-walk "^7.0.1" -detective-vue2@^2.0.3: - version "2.1.1" - resolved "https://registry.yarnpkg.com/detective-vue2/-/detective-vue2-2.1.1.tgz#96e8c1b08e18776f6a5f1acf9f5472b5236b4dbe" - integrity sha512-/TQ+cs4qmSyhgESjyBXxoUuh36XjS06+UhCItWcGGOpXmU3KBRGRknG+tDzv2dASn1+UJUm2rhpDFa9TWT0dFw== +detective-vue2@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/detective-vue2/-/detective-vue2-2.2.0.tgz#35fd1d39e261b064aca9fcaf20e136c76877482a" + integrity sha512-sVg/t6O2z1zna8a/UIV6xL5KUa2cMTQbdTIIvqNM0NIPswp52fe43Nwmbahzj3ww4D844u/vC2PYfiGLvD3zFA== dependencies: - "@dependents/detective-less" "^5.0.0" + "@dependents/detective-less" "^5.0.1" "@vue/compiler-sfc" "^3.5.13" - detective-es6 "^5.0.0" - detective-sass "^6.0.0" - detective-scss "^5.0.0" - detective-stylus "^5.0.0" - detective-typescript "^13.0.0" + detective-es6 "^5.0.1" + detective-sass "^6.0.1" + detective-scss "^5.0.1" + detective-stylus "^5.0.1" + detective-typescript "^14.0.0" dev-ip@^1.0.1: version "1.0.1" @@ -8356,10 +8150,10 @@ devlop@^1.0.0: dependencies: dequal "^2.0.0" -devtools-protocol@0.0.1380148: - version "0.0.1380148" - resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1380148.tgz#7dcdad06515135b244ff05878ca8019e041c1c55" - integrity sha512-1CJABgqLxbYxVI+uJY/UDUHJtJ0KZTSjNYJYKqd9FRoXT33WDakDHNxRapMEgzeJ/C3rcs01+avshMnPmKQbvA== +devtools-protocol@0.0.1402036: + version "0.0.1402036" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1402036.tgz#6f55044daed0ae5f0ec5c80c834b7b8edc822441" + integrity sha512-JwAYQgEvm3yD45CHB+RmF5kMbWtXBaOGwuxa87sZogHcLCv8c/IqnThaoQ1y60d7pXWjSKWQphPEc+1rAScVdg== devtools-protocol@0.0.818844: version "0.0.818844" @@ -8396,13 +8190,6 @@ diff@^7.0.0: resolved "https://registry.yarnpkg.com/diff/-/diff-7.0.0.tgz#3fb34d387cd76d803f6eebea67b921dab0182a9a" integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw== -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - discontinuous-range@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" @@ -8455,13 +8242,14 @@ domhandler@^5.0.2, domhandler@^5.0.3: domelementtype "^2.3.0" "domino@https://github.com/angular/domino.git#8f228f8862540c6ccd14f76b5a1d9bb5458618af": - version "2.1.6" + version "2.1.6+git" + uid "8f228f8862540c6ccd14f76b5a1d9bb5458618af" resolved "https://github.com/angular/domino.git#8f228f8862540c6ccd14f76b5a1d9bb5458618af" dompurify@^3.2.1: - version "3.2.3" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.2.3.tgz#05dd2175225324daabfca6603055a09b2382a4cd" - integrity sha512-U1U5Hzc2MO0oW3DF+G9qYN0aT7atAou4AgI0XjWz061nyBPbdxkfdhfy5uMgGn6+oLFCfn44ZGbdDqCzVmlOWA== + version "3.2.4" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.2.4.tgz#af5a5a11407524431456cf18836c55d13441cd8e" + integrity sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg== optionalDependencies: "@types/trusted-types" "^2.0.7" @@ -8579,9 +8367,9 @@ ee-first@1.1.1: integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.5.73: - version "1.5.87" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.87.tgz#3a89bec85e43a8b32445ec938228e4ec982e0f79" - integrity sha512-mPFwmEWmRivw2F8x3w3l2m6htAUN97Gy0kwpO++2m9iT1Gt8RCFVUfv9U/sIbHJ6rY4P6/ooqFL/eL7ock+pPg== + version "1.5.100" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.100.tgz#c99b7cfe49ec72c5e22237f036bb8b1d8b7f0621" + integrity sha512-u1z9VuzDXV86X2r3vAns0/5ojfXBue9o0+JDUDBKYqGLjxLkSqsSUoPU/6kW0gx76V44frHaf6Zo+QF74TQCMg== emoji-regex-xs@^1.0.0: version "1.0.0" @@ -8664,24 +8452,24 @@ engine.io-parser@~5.2.1: integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q== engine.io@~6.6.0: - version "6.6.3" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.6.3.tgz#a2ec69f72bf17c709ed832868bf17eb1a80a6470" - integrity sha512-2hkLItQMBkoYSagneiisupWGvsQlWXqzhSMvsjaM8GYbnfUsX7tzYQq9QARnate5LRedVTX+MbkSZAANAr3NtQ== + version "6.6.4" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.6.4.tgz#0a89a3e6b6c1d4b0c2a2a637495e7c149ec8d8ee" + integrity sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g== dependencies: "@types/cors" "^2.8.12" "@types/node" ">=10.0.0" accepts "~1.3.4" base64id "2.0.0" - cookie "~1.0.2" + cookie "~0.7.2" cors "~2.8.5" debug "~4.3.1" engine.io-parser "~5.2.1" ws "~8.17.1" -enhanced-resolve@^5.16.0, enhanced-resolve@^5.17.1: - version "5.18.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz#91eb1db193896b9801251eeff1c6980278b1e404" - integrity sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ== +enhanced-resolve@^5.17.1, enhanced-resolve@^5.18.0: + version "5.18.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz#728ab082f8b7b6836de51f1637aab5d3b9568faf" + integrity sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -8981,10 +8769,10 @@ eslint-scope@5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== +eslint-visitor-keys@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" + integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" @@ -9084,9 +8872,9 @@ exegesis-express@^4.0.0: exegesis "^4.1.0" exegesis@^4.1.0, exegesis@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/exegesis/-/exegesis-4.2.0.tgz#2d248542b3c58a3c51f33fe9f05be1da1d908b4a" - integrity sha512-MOzRyqhvl+hTA4+W4p0saWRIPlu0grIx4ykjMEYgGLiqr/z9NCIlwSq2jF0gyxNjPZD3xyHgmkW6BSaLVUdctg== + version "4.3.0" + resolved "https://registry.yarnpkg.com/exegesis/-/exegesis-4.3.0.tgz#3b5c45222f543f70ab89fa49eea3a564111a7324" + integrity sha512-V90IJQ4XYO1SfH5qdJTOijXkQTF3hSpSHHqlf7MstUMDKP22iAvi63gweFLtPZ4Gj3Wnh8RgJX5TGu0WiwTyDQ== dependencies: "@apidevtools/json-schema-ref-parser" "^9.0.3" ajv "^8.3.0" @@ -9101,7 +8889,6 @@ exegesis@^4.1.0, exegesis@^4.2.0: lodash "^4.17.11" openapi3-ts "^3.1.1" promise-breaker "^6.0.0" - pump "^3.0.0" qs "^6.6.0" raw-body "^2.3.3" semver "^7.0.0" @@ -9132,9 +8919,9 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: homedir-polyfill "^1.0.1" exponential-backoff@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" - integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== + version "3.1.2" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.2.tgz#a8f26adb96bf78e8cd8ad1037928d5e5c0679d91" + integrity sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA== express@^4.16.4, express@^4.21.2: version "4.21.2" @@ -9264,7 +9051,7 @@ fast-fifo@^1.2.0, fast-fifo@^1.3.2: resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== -fast-glob@3.3.3, fast-glob@^3.2.9, fast-glob@^3.3.2: +fast-glob@3.3.3, fast-glob@^3.3.2, fast-glob@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== @@ -9292,22 +9079,15 @@ fast-uri@^3.0.1: resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748" integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== -fast-url-parser@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" - integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== - dependencies: - punycode "^1.3.2" - fastest-levenshtein@^1.0.7: version "1.0.16" resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== fastq@^1.13.0, fastq@^1.6.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.18.0.tgz#d631d7e25faffea81887fe5ea8c9010e1b36fee0" - integrity sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw== + version "1.19.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.0.tgz#a82c6b7c2bb4e44766d865f07997785fecfdcb89" + integrity sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA== dependencies: reusify "^1.0.4" @@ -9364,22 +9144,22 @@ filesize@^6.1.0: resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.4.0.tgz#914f50471dd66fdca3cefe628bd0cde4ef769bcd" integrity sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ== -filing-cabinet@^5.0.1: - version "5.0.2" - resolved "https://registry.yarnpkg.com/filing-cabinet/-/filing-cabinet-5.0.2.tgz#5d35bce3216af258a7ce7d3561d68ed86fb37d6f" - integrity sha512-RZlFj8lzyu6jqtFBeXNqUjjNG6xm+gwXue3T70pRxw1W40kJwlgq0PSWAmh0nAnn5DHuBIecLXk9+1VKS9ICXA== +filing-cabinet@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/filing-cabinet/-/filing-cabinet-5.0.3.tgz#e5ab960958653ee7fe70d5d99b3b88c342ce7907" + integrity sha512-PlPcMwVWg60NQkhvfoxZs4wEHjhlOO/y7OAm4sKM60o1Z9nttRY4mcdQxp/iZ+kg/Vv6Hw1OAaTbYVM9DA9pYg== dependencies: app-module-path "^2.2.0" - commander "^12.0.0" - enhanced-resolve "^5.16.0" - module-definition "^6.0.0" - module-lookup-amd "^9.0.1" - resolve "^1.22.8" - resolve-dependency-path "^4.0.0" - sass-lookup "^6.0.1" - stylus-lookup "^6.0.0" + commander "^12.1.0" + enhanced-resolve "^5.18.0" + module-definition "^6.0.1" + module-lookup-amd "^9.0.3" + resolve "^1.22.10" + resolve-dependency-path "^4.0.1" + sass-lookup "^6.1.0" + stylus-lookup "^6.1.0" tsconfig-paths "^4.2.0" - typescript "^5.4.4" + typescript "^5.7.3" fill-range@^4.0.0: version "4.0.0" @@ -9508,11 +9288,11 @@ fined@^2.0.0: parse-filepath "^1.0.2" firebase-tools@^13.0.0: - version "13.29.2" - resolved "https://registry.yarnpkg.com/firebase-tools/-/firebase-tools-13.29.2.tgz#30e6a22da541448eb8182eb40e0e39a1e5e4bcdf" - integrity sha512-6P4PR4TcrATPI+ut0qhh7gW3GJ0HYaLC2Fr5lesAXkrdAYw7OvOGDzXaRFuORwkCS5grVQuCcJVSsVbjXKAkew== + version "13.31.1" + resolved "https://registry.yarnpkg.com/firebase-tools/-/firebase-tools-13.31.1.tgz#5bfabb3ea0417c61a23059e058d93a595d240bf2" + integrity sha512-CzQsIwa7sh/0/bNhmg0lYxf4xltMA8nRX665ATpFSuzSyb3j7m5iQjI1og/gjBSTgGfXU7e/ULWkr8wDdbFqoQ== dependencies: - "@electric-sql/pglite" "^0.2.0" + "@electric-sql/pglite" "^0.2.16" "@google-cloud/cloud-sql-connector" "^1.3.3" "@google-cloud/pubsub" "^4.5.0" abort-controller "^3.0.0" @@ -9523,7 +9303,7 @@ firebase-tools@^13.0.0: body-parser "^1.19.0" chokidar "^3.6.0" cjson "^0.3.1" - cli-table "0.3.11" + cli-table3 "0.6.5" colorette "^2.0.19" commander "^5.1.0" configstore "^5.0.1" @@ -9536,7 +9316,7 @@ firebase-tools@^13.0.0: exegesis-express "^4.0.0" express "^4.16.4" filesize "^6.1.0" - form-data "^4.0.0" + form-data "^4.0.1" fs-extra "^10.1.0" fuzzy "^0.1.3" gaxios "^6.7.0" @@ -9568,7 +9348,7 @@ firebase-tools@^13.0.0: sql-formatter "^15.3.0" stream-chain "^2.2.4" stream-json "^1.7.3" - superstatic "^9.1.0" + superstatic "^9.2.0" tar "^6.1.11" tcp-port-used "^1.0.2" tmp "^0.2.3" @@ -9612,9 +9392,9 @@ follow-redirects@^1.0.0: integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== for-each@^0.3.3: - version "0.3.4" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.4.tgz#814517ffc303d1399b2564d8165318e735d0341c" - integrity sha512-kKaIINnFpzW6ffJNDjjyjrk21BkDx38c0xa/klsT8VzLCaMEefv4ZTacrcVR4DmgTeBra++jMDAfS/tS799YDw== + version "0.3.5" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" + integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== dependencies: is-callable "^1.2.7" @@ -9652,13 +9432,14 @@ forever-agent@~0.6.1: integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== form-data@^2.5.0: - version "2.5.2" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.2.tgz#dc653743d1de2fcc340ceea38079daf6e9069fd2" - integrity sha512-GgwY0PS7DbXqajuGf4OYlsrIu3zgxD6Vvql43IBhm6MahqA5SK/7mwhtNj2AdH2z35YR34ujJ7BN+3fFC3jP5Q== + version "2.5.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.3.tgz#f9bcf87418ce748513c0c3494bb48ec270c97acc" + integrity sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ== dependencies: asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" + combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" + mime-types "^2.1.35" safe-buffer "^5.2.1" form-data@^4.0.0, form-data@^4.0.1: @@ -9748,6 +9529,15 @@ fs-extra@^9.0.0, fs-extra@^9.0.1: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@~11.3.0: + version "11.3.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.0.tgz#0daced136bbaf65a555a326719af931adc7a314d" + integrity sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@~7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" @@ -9849,11 +9639,12 @@ gaxios@^6.0.0, gaxios@^6.0.3, gaxios@^6.1.1, gaxios@^6.7.0: uuid "^9.0.1" gcp-metadata@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-6.1.0.tgz#9b0dd2b2445258e7597f2024332d20611cbd6b8c" - integrity sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg== + version "6.1.1" + resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-6.1.1.tgz#f65aa69f546bc56e116061d137d3f5f90bdec494" + integrity sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A== dependencies: - gaxios "^6.0.0" + gaxios "^6.1.1" + google-logging-utils "^0.0.2" json-bigint "^1.0.0" gensync@^1.0.0-beta.2: @@ -9861,13 +9652,13 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-amd-module-type@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/get-amd-module-type/-/get-amd-module-type-6.0.0.tgz#702ddcbe6cb8a41ab8f69ce5ea520bf3b0ede69a" - integrity sha512-hFM7oivtlgJ3d6XWD6G47l8Wyh/C6vFw5G24Kk1Tbq85yh5gcM8Fne5/lFhiuxB+RT6+SI7I1ThB9lG4FBh3jw== +get-amd-module-type@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-amd-module-type/-/get-amd-module-type-6.0.1.tgz#191f479ae8706c246b52bf402fbe1bb0965d9f1e" + integrity sha512-MtjsmYiCXcYDDrGqtNbeIYdAl85n+5mSv2r3FbzER/YV3ZILw4HNNIw34HuV5pyl0jzs6GFYU1VHVEefhgcNHQ== dependencies: - ast-module-types "^6.0.0" - node-source-walk "^7.0.0" + ast-module-types "^6.0.1" + node-source-walk "^7.0.1" get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" @@ -10115,10 +9906,10 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^15.13.0: - version "15.14.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-15.14.0.tgz#b8fd3a8941ff3b4d38f3319d433b61bbb482e73f" - integrity sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig== +globals@^15.14.0: + version "15.15.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-15.15.0.tgz#7c4761299d41c32b075715a4ce1ede7897ff72a8" + integrity sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg== globalthis@^1.0.1, globalthis@^1.0.4: version "1.0.4" @@ -10128,29 +9919,17 @@ globalthis@^1.0.1, globalthis@^1.0.4: define-properties "^1.2.1" gopd "^1.0.1" -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - 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" - globby@^14.0.0: - version "14.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-14.0.2.tgz#06554a54ccfe9264e5a9ff8eded46aa1e306482f" - integrity sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw== + version "14.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-14.1.0.tgz#138b78e77cf5a8d794e327b15dce80bf1fb0a73e" + integrity sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA== dependencies: "@sindresorhus/merge-streams" "^2.1.0" - fast-glob "^3.3.2" - ignore "^5.2.4" - path-type "^5.0.0" + fast-glob "^3.3.3" + ignore "^7.0.3" + path-type "^6.0.0" slash "^5.1.0" - unicorn-magic "^0.1.0" + unicorn-magic "^0.3.0" globby@^5.0.0: version "5.0.0" @@ -10208,6 +9987,11 @@ google-gax@4.4.1, google-gax@^4.3.3: retry-request "^7.0.0" uuid "^9.0.1" +google-logging-utils@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/google-logging-utils/-/google-logging-utils-0.0.2.tgz#5fd837e06fa334da450433b9e3e1870c1594466a" + integrity sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ== + google-protobuf@^3.6.1: version "3.21.4" resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.21.4.tgz#2f933e8b6e5e9f8edde66b7be0024b68f77da6c9" @@ -10773,10 +10557,10 @@ ignore-walk@^7.0.0: dependencies: minimatch "^9.0.0" -ignore@^5.2.0, ignore@^5.2.4: - version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== +ignore@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.3.tgz#397ef9315dfe0595671eefe8b633fec6943ab733" + integrity sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA== image-size@~0.5.0: version "0.5.5" @@ -10799,9 +10583,9 @@ immutable@^5.0.2: integrity sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw== import-fresh@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" @@ -11020,11 +10804,11 @@ is-binary-path@~2.1.0: binary-extensions "^2.0.0" is-boolean-object@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.1.tgz#c20d0c654be05da4fbc23c562635c019e93daf89" - integrity sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng== + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" + integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== dependencies: - call-bound "^1.0.2" + call-bound "^1.0.3" has-tostringtag "^1.0.2" is-buffer@^1.1.5: @@ -11313,7 +11097,7 @@ is-potential-custom-element-name@^1.0.1: resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== -is-promise@4.0.0: +is-promise@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== @@ -11431,11 +11215,11 @@ is-weakmap@^2.0.2: integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== is-weakref@^1.0.2, is-weakref@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.0.tgz#47e3472ae95a63fa9cf25660bcf0c181c39770ef" - integrity sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q== + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293" + integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== dependencies: - call-bound "^1.0.2" + call-bound "^1.0.3" is-weakset@^2.0.3: version "2.0.4" @@ -11620,21 +11404,16 @@ jasmine-core@^4.1.0: resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-4.6.1.tgz#5ebb8afa07282078f8d7b15871737a83b74e58f2" integrity sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ== -jasmine-core@^5.0.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-5.5.0.tgz#43564e4b41f73a37cff3aeb262e23bbd073576d8" - integrity sha512-NHOvoPO6o9gVR6pwqEACTEpbgcH+JJ6QDypyymGbSUIFIFsMMbBJ/xsFNud8MSClfnWclXd7RQlAZBz7yVo5TQ== +jasmine-core@^5.0.0, jasmine-core@~5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-5.6.0.tgz#4b979c254e7d9b1fe8e767ab00c5d2901c00bd4f" + integrity sha512-niVlkeYVRwKFpmfWg6suo6H9CrNnydfBLEqefM5UjibYS+UoTjZdmvPJSiuyrRLGnFj1eYRhFd/ch+5hSlsFVA== jasmine-core@~2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.8.0.tgz#bcc979ae1f9fd05701e45e52e65d3a5d63f1a24e" integrity sha512-SNkOkS+/jMZvLhuSx1fjhcNWUC/KG6oVyFUGkSBEr9n1axSNduWU8GlI7suaHXr4yxjet6KjrUZxUTE5WzzWwQ== -jasmine-core@~5.6.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-5.6.0.tgz#4b979c254e7d9b1fe8e767ab00c5d2901c00bd4f" - integrity sha512-niVlkeYVRwKFpmfWg6suo6H9CrNnydfBLEqefM5UjibYS+UoTjZdmvPJSiuyrRLGnFj1eYRhFd/ch+5hSlsFVA== - jasmine-reporters@~2.5.0: version "2.5.2" resolved "https://registry.yarnpkg.com/jasmine-reporters/-/jasmine-reporters-2.5.2.tgz#b5dfa1d9c40b8020c5225e0e1e2b9953d66a4d69" @@ -12315,13 +12094,13 @@ loader-utils@^2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" -local-pkg@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.5.1.tgz#69658638d2a95287534d4c2fff757980100dbb6d" - integrity sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ== +local-pkg@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-1.0.0.tgz#a8d14dd41e78884f199ecd8b3eedaf0d376e2167" + integrity sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg== dependencies: mlly "^1.7.3" - pkg-types "^1.2.1" + pkg-types "^1.3.0" locate-path@^5.0.0: version "5.0.0" @@ -12524,9 +12303,9 @@ long@^4.0.0: integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== long@^5.0.0: - version "5.2.4" - resolved "https://registry.yarnpkg.com/long/-/long-5.2.4.tgz#ee651d5c7c25901cfca5e67220ae9911695e99b2" - integrity sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg== + version "5.3.0" + resolved "https://registry.yarnpkg.com/long/-/long-5.3.0.tgz#3bab70330c40c2c1b5cb73c4254723c81f00e15c" + integrity sha512-5vvY5yF1zF/kXk+L94FRiTDa1Znom46UjPCH6/XbSvS8zBKMFBHTJk8KDMqJ+2J6QezQFi7k1k8v21ClJYHPaw== lower-case@^2.0.2: version "2.0.2" @@ -12654,7 +12433,7 @@ make-fetch-happen@^13.0.0: promise-retry "^2.0.1" ssri "^10.0.0" -make-fetch-happen@^14.0.0, make-fetch-happen@^14.0.1, make-fetch-happen@^14.0.3: +make-fetch-happen@^14.0.0, make-fetch-happen@^14.0.1, make-fetch-happen@^14.0.2, make-fetch-happen@^14.0.3: version "14.0.3" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz#d74c3ecb0028f08ab604011e0bc6baed483fcdcd" integrity sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ== @@ -12689,16 +12468,16 @@ map-visit@^1.0.0: object-visit "^1.0.0" marked-terminal@^7.0.0: - version "7.2.1" - resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-7.2.1.tgz#9c1ae073a245a03c6a13e3eeac6f586f29856068" - integrity sha512-rQ1MoMFXZICWNsKMiiHwP/Z+92PLKskTPXj+e7uwXmuMPkNn7iTqC+IvDekVm1MPeC9wYQeLxeFaOvudRR/XbQ== + version "7.3.0" + resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-7.3.0.tgz#7a86236565f3dd530f465ffce9c3f8b62ef270e8" + integrity sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw== dependencies: ansi-escapes "^7.0.0" ansi-regex "^6.1.0" - chalk "^5.3.0" + chalk "^5.4.1" cli-highlight "^2.1.11" cli-table3 "^0.6.5" - node-emoji "^2.1.3" + node-emoji "^2.2.0" supports-hyperlinks "^3.1.0" marked@^13.0.2: @@ -12707,9 +12486,9 @@ marked@^13.0.2: integrity sha512-rqRix3/TWzE9rIoFGIn8JmsVfhiuC8VIQ8IdX5TfzmeBucdY05/0UlzKaw0eVtpcN/OdVFpBk7CjKGo9iHJ/zA== marked@^15.0.0: - version "15.0.6" - resolved "https://registry.yarnpkg.com/marked/-/marked-15.0.6.tgz#8165f16afb6f4b30a35bdcee657c3b8415820a8f" - integrity sha512-Y07CUOE+HQXbVDCGl3LXggqJDbXDP2pArc2C1N1RRMN0ONiShoSsIInMd5Gsxupe7fKLpgimTV+HOJ9r7bA+pg== + version "15.0.7" + resolved "https://registry.yarnpkg.com/marked/-/marked-15.0.7.tgz#f67d7e34d202ce087e6b879107b5efb04e743314" + integrity sha512-dgLIeKGLx5FwziAnsk4ONoGwHwGPJzselimvlVskE9XLN4Orv9u2VA3GWw/lYUqjfA0rUT/6fqKwfZJapP9BEg== marky@^1.2.2: version "1.2.5" @@ -12786,7 +12565,7 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.3.0, merge2@^1.4.1: +merge2@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -13064,16 +12843,16 @@ minizlib@^3.0.1: minipass "^7.0.4" rimraf "^5.0.5" -mitt@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1" - integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== - mitt@^1.1.3: version "1.2.0" resolved "https://registry.yarnpkg.com/mitt/-/mitt-1.2.0.tgz#cb24e6569c806e31bd4e3995787fe38a04fdf90d" integrity sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw== +mitt@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1" + integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== + mixin-deep@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" @@ -13114,18 +12893,18 @@ mlly@^1.7.3, mlly@^1.7.4: pkg-types "^1.3.0" ufo "^1.5.4" -module-definition@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/module-definition/-/module-definition-6.0.0.tgz#724b4c57543f53f814d2892499857777c3859630" - integrity sha512-sEGP5nKEXU7fGSZUML/coJbrO+yQtxcppDAYWRE9ovWsTbFoUHB2qDUx564WUzDaBHXsD46JBbIK5WVTwCyu3w== +module-definition@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/module-definition/-/module-definition-6.0.1.tgz#47e73144cc5a9aa31f3380166fddf8e962ccb2e4" + integrity sha512-FeVc50FTfVVQnolk/WQT8MX+2WVcDnTGiq6Wo+/+lJ2ET1bRVi3HG3YlJUfqagNMc/kUlFSoR96AJkxGpKz13g== dependencies: - ast-module-types "^6.0.0" - node-source-walk "^7.0.0" + ast-module-types "^6.0.1" + node-source-walk "^7.0.1" -module-lookup-amd@^9.0.1: - version "9.0.2" - resolved "https://registry.yarnpkg.com/module-lookup-amd/-/module-lookup-amd-9.0.2.tgz#e132b11356a3690ed46ab0164dde2c1ddcd3a8a5" - integrity sha512-p7PzSVEWiW9fHRX9oM+V4aV5B2nCVddVNv4DZ/JB6t9GsXY4E+ZVhPpnwUX7bbJyGeeVZqhS8q/JZ/H77IqPFA== +module-lookup-amd@^9.0.3: + version "9.0.4" + resolved "https://registry.yarnpkg.com/module-lookup-amd/-/module-lookup-amd-9.0.4.tgz#328aff0913a47b25f02dd03c40efc9640d60f38c" + integrity sha512-DWJEuLVvjxh5b8wrvJC5wr2a7qo7pOWXIgdCBNazU416kcIyzO4drxvlqKhsHzYwxcC4cWuhoK+MiWCKCGnv7A== dependencies: commander "^12.1.0" glob "^7.2.3" @@ -13328,7 +13107,7 @@ node-addon-api@^7.0.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== -node-emoji@^2.1.3: +node-emoji@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-2.2.0.tgz#1d000e3c76e462577895be1b436f4aa2d6760eb0" integrity sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw== @@ -13374,9 +13153,9 @@ node-gyp@^10.2.0: which "^4.0.0" node-gyp@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-11.0.0.tgz#1e029056e8c040424ba380e1d5be54ad1757ae3c" - integrity sha512-zQS+9MTTeCMgY0F3cWPyJyRFAkVltQ1uXm+xXu/ES6KFgC6Czo1Seb9vQW2wNxSX2OrDTiqL0ojtkFxBQ0ypIw== + version "11.1.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-11.1.0.tgz#212a1d9c167c50d727d42659410780b40e07bbd3" + integrity sha512-/+7TuHKnBpnMvUQnsYEb0JOozDZqarQbfNuSGLXIjhStMT0fbw7IdSqWgopOP5xhRZE+lsbIvAHcekddruPZgQ== dependencies: env-paths "^2.2.0" exponential-backoff "^3.1.1" @@ -13394,12 +13173,12 @@ node-releases@^2.0.19: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== -node-source-walk@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/node-source-walk/-/node-source-walk-7.0.0.tgz#cd849f539939994868a0b2ba4e9758322b2fcee6" - integrity sha512-1uiY543L+N7Og4yswvlm5NCKgPKDEXd9AUR9Jh3gen6oOeBsesr6LqhXom1er3eRzSUcVRWXzhv8tSNrIfGHKw== +node-source-walk@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/node-source-walk/-/node-source-walk-7.0.1.tgz#3e4ab8d065377228fd038af7b2d4fb58f61defd3" + integrity sha512-3VW/8JpPqPvnJvseXowjZcirPisssnBuDikk6JIZ8jQzF7KJQX52iPFX4RYYxLycYH7IbMRSPUOga/esVjy5Yg== dependencies: - "@babel/parser" "^7.24.4" + "@babel/parser" "^7.26.7" nopt@^7.0.0: version "7.2.1" @@ -13472,7 +13251,7 @@ npm-normalize-package-bin@^4.0.0: resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz#df79e70cd0a113b77c02d1fe243c96b8e618acb1" integrity sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w== -npm-package-arg@12.0.2: +npm-package-arg@12.0.2, npm-package-arg@^12.0.0: version "12.0.2" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-12.0.2.tgz#3b1e04ebe651cc45028e298664e8c15ce9c0ca40" integrity sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA== @@ -13482,16 +13261,6 @@ npm-package-arg@12.0.2: semver "^7.3.5" validate-npm-package-name "^6.0.0" -npm-package-arg@^12.0.0: - version "12.0.1" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-12.0.1.tgz#eb05e797b2fbdf8acf7f1d15344e1e05904202d5" - integrity sha512-aDxjFfPV3Liw0WOBWlyZLMBqtbgbg03rmGvHDJa2Ttv7tIz+1oB5qWec4psCDFZcZi9b5XdGkPdQiJxOPzvQRQ== - dependencies: - hosted-git-info "^8.0.0" - proc-log "^5.0.0" - semver "^7.3.5" - validate-npm-package-name "^6.0.0" - npm-packlist@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-9.0.0.tgz#8e9b061bab940de639dd93d65adc95c34412c7d0" @@ -13560,9 +13329,9 @@ object-hash@^3.0.0: integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== object-inspect@^1.13.3: - version "1.13.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a" - integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== + version "1.13.4" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== object-keys@^1.1.1: version "1.1.1" @@ -13657,14 +13426,14 @@ onetime@^7.0.0: dependencies: mimic-function "^5.0.0" -oniguruma-to-es@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/oniguruma-to-es/-/oniguruma-to-es-2.3.0.tgz#35ea9104649b7c05f3963c6b3b474d964625028b" - integrity sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g== +oniguruma-to-es@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/oniguruma-to-es/-/oniguruma-to-es-3.1.0.tgz#6e74d9ef4e8e33a61ad28c1f564b7d0ce1d0b0d9" + integrity sha512-BJ3Jy22YlgejHSO7Fvmz1kKazlaPmRSUH+4adTDUS/dKQ4wLxI+gALZ8updbaux7/m7fIlpgOZ5fp/Inq5jUAw== dependencies: emoji-regex-xs "^1.0.0" - regex "^5.1.1" - regex-recursion "^5.1.1" + regex "^6.0.1" + regex-recursion "^6.0.2" open-in-idx@^0.1.1: version "0.1.1" @@ -13886,10 +13655,10 @@ package-json-from-dist@^1.0.0: resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== -package-manager-detector@^0.2.0: - version "0.2.8" - resolved "https://registry.yarnpkg.com/package-manager-detector/-/package-manager-detector-0.2.8.tgz#f5ace2dbd37666af54e5acec11bc37c8450f72d0" - integrity sha512-ts9KSdroZisdvKMWVAVCXiKqnqNfXz4+IbrBG8/BWx/TR5le+jfenvoBuIZ6UWM9nz47W7AbD9qYfAwfWMIwzA== +package-manager-detector@^0.2.8: + version "0.2.9" + resolved "https://registry.yarnpkg.com/package-manager-detector/-/package-manager-detector-0.2.9.tgz#20990785afa69d38b4520ccc83b34e9f69cb970f" + integrity sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q== pacote@20.0.0: version "20.0.0" @@ -14017,7 +13786,7 @@ parse5@^7.0.0, parse5@^7.1.2, parse5@^7.2.1: dependencies: entities "^4.5.0" -parseurl@~1.3.2, parseurl@~1.3.3: +parseurl@^1.3.3, parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== @@ -14133,7 +13902,7 @@ path-to-regexp@0.1.12: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== -path-to-regexp@^1.8.0: +path-to-regexp@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.9.0.tgz#5dc0753acbf8521ca2e0f137b4578b917b10cf24" integrity sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g== @@ -14145,20 +13914,15 @@ path-to-regexp@^8.0.0: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.2.0.tgz#73990cc29e57a3ff2a0d914095156df5db79e8b4" integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ== -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -path-type@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-5.0.0.tgz#14b01ed7aea7ddf9c7c3f46181d4d04f9c785bb8" - integrity sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg== +path-type@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-6.0.0.tgz#2f1bb6791a91ce99194caede5d6c5920ed81eb51" + integrity sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ== pathe@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.2.tgz#5ed86644376915b3c7ee4d00ac8c348d671da3a5" - integrity sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w== + version "2.0.3" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" + integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== pause-stream@0.0.11: version "0.0.11" @@ -14197,15 +13961,15 @@ pg-int8@1.0.1: resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== -pg-pool@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.7.0.tgz#d4d3c7ad640f8c6a2245adc369bafde4ebb8cbec" - integrity sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g== +pg-pool@^3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.7.1.tgz#d1aaf618618d8f878acf185e86084928b8cd5b3c" + integrity sha512-xIOsFoh7Vdhojas6q3596mXFsR8nwBQBXX5JiV7p9buEVAGqYL4yFzclON5P9vFrpu1u7Zwl2oriyDa89n0wbw== -pg-protocol@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.7.0.tgz#ec037c87c20515372692edac8b63cf4405448a93" - integrity sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ== +pg-protocol@^1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.7.1.tgz#aad61a6f927b51e89dcf721408b76c0e536d43dc" + integrity sha512-gjTHWGYWsEgy9MsY0Gp6ZJxV24IjDqdpTW7Eh0x+WfJLFsm/TJx1MzL6T0D88mBvkpxotCQ6TwW6N+Kko7lhgQ== pg-types@^2.1.0: version "2.2.0" @@ -14219,13 +13983,13 @@ pg-types@^2.1.0: postgres-interval "^1.1.0" pg@^8.11.3: - version "8.13.1" - resolved "https://registry.yarnpkg.com/pg/-/pg-8.13.1.tgz#6498d8b0a87ff76c2df7a32160309d3168c0c080" - integrity sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ== + version "8.13.3" + resolved "https://registry.yarnpkg.com/pg/-/pg-8.13.3.tgz#19cd021d1f9e9d26d860b80cd450f109a8652738" + integrity sha512-P6tPt9jXbL9HVu/SSRERNYaYG++MjnscnegFh9pPHihfoBSujsrka0hyuymMzeJKFWrcG8wvCKy8rCe8e5nDUQ== dependencies: pg-connection-string "^2.7.0" - pg-pool "^3.7.0" - pg-protocol "^1.7.0" + pg-pool "^3.7.1" + pg-protocol "^1.7.1" pg-types "^2.1.0" pgpass "1.x" optionalDependencies: @@ -14296,7 +14060,7 @@ pkg-dir@^7.0.0: dependencies: find-up "^6.3.0" -pkg-types@^1.2.1, pkg-types@^1.3.0: +pkg-types@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.3.1.tgz#bd7cc70881192777eef5326c19deb46e890917df" integrity sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ== @@ -14306,9 +14070,9 @@ pkg-types@^1.2.1, pkg-types@^1.3.0: pathe "^2.0.1" playwright-core@^1.41.2: - version "1.50.0" - resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.50.0.tgz#28dd6a1488211c193933695ed337a5b44d46867c" - integrity sha512-CXkSSlr4JaZs2tZHI40DsZUN/NIwgaUPsyLuOAaIZp2CyF2sN5MM5NJsyB188lFSSozFxQ5fPT4qM+f0tH/6wQ== + version "1.50.1" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.50.1.tgz#6a0484f1f1c939168f40f0ab3828c4a1592c4504" + integrity sha512-ra9fsNWayuYumt+NiM069M6OkcRb1FZSK8bgi66AtpFoWkg2+y0bJSNmkFrWhMbEBbVKC/EruAHH3g0zmtwGmQ== plugin-error@^2.0.0: version "2.0.1" @@ -14358,9 +14122,9 @@ posix-character-classes@^0.1.0: integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== possible-typed-array-names@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" - integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + version "1.1.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" + integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== postcss-loader@8.1.1: version "8.1.1" @@ -14405,9 +14169,9 @@ postcss-modules-values@^4.0.0: icss-utils "^5.0.0" postcss-selector-parser@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz#41bd8b56f177c093ca49435f65731befe25d6b9c" - integrity sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ== + version "7.1.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz#4d6af97eba65d73bc4d84bcb343e865d7dd16262" + integrity sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -14426,7 +14190,7 @@ postcss-values-parser@^6.0.2: is-url-superb "^4.0.0" quote-unquote "^1.0.0" -postcss@8.5.2, postcss@^8.5.1: +postcss@8.5.2, postcss@^8.2.14, postcss@^8.4.33, postcss@^8.4.48, postcss@^8.4.49, postcss@^8.5.1: version "8.5.2" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.2.tgz#e7b99cb9d2ec3e8dd424002e7c16517cb2b846bd" integrity sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA== @@ -14435,15 +14199,6 @@ postcss@8.5.2, postcss@^8.5.1: picocolors "^1.1.1" source-map-js "^1.2.1" -postcss@^8.2.14, postcss@^8.4.33, postcss@^8.4.40, postcss@^8.4.48, postcss@^8.4.49: - version "8.5.1" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.1.tgz#e2272a1f8a807fafa413218245630b5db10a3214" - integrity sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ== - dependencies: - nanoid "^3.3.8" - picocolors "^1.1.1" - source-map-js "^1.2.1" - postgres-array@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" @@ -14476,32 +14231,37 @@ preact@^10.17.1: resolved "https://registry.yarnpkg.com/preact/-/preact-10.25.4.tgz#c1d00bee9d7b9dcd06a2311d9951973b506ae8ac" integrity sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA== -precinct@^12.0.2: - version "12.1.2" - resolved "https://registry.yarnpkg.com/precinct/-/precinct-12.1.2.tgz#e6982e5fc90a0f1b6696f3a96acbd91cd6b3c841" - integrity sha512-x2qVN3oSOp3D05ihCd8XdkIPuEQsyte7PSxzLqiRgktu79S5Dr1I75/S+zAup8/0cwjoiJTQztE9h0/sWp9bJQ== +precinct@^12.2.0: + version "12.2.0" + resolved "https://registry.yarnpkg.com/precinct/-/precinct-12.2.0.tgz#6ab18f48034cc534f2c8fedb318f19a11bcd171b" + integrity sha512-NFBMuwIfaJ4SocE9YXPU/n4AcNSoFMVFjP72nvl3cx69j/ke61/hPOWFREVxLkFhhEGnA8ZuVfTqJBa+PK3b5w== dependencies: - "@dependents/detective-less" "^5.0.0" + "@dependents/detective-less" "^5.0.1" commander "^12.1.0" - detective-amd "^6.0.0" - detective-cjs "^6.0.0" - detective-es6 "^5.0.0" - detective-postcss "^7.0.0" - detective-sass "^6.0.0" - detective-scss "^5.0.0" - detective-stylus "^5.0.0" - detective-typescript "^13.0.0" - detective-vue2 "^2.0.3" - module-definition "^6.0.0" - node-source-walk "^7.0.0" - postcss "^8.4.40" - typescript "^5.5.4" - -prettier@3.4.2, prettier@^3.0.0: + detective-amd "^6.0.1" + detective-cjs "^6.0.1" + detective-es6 "^5.0.1" + detective-postcss "^7.0.1" + detective-sass "^6.0.1" + detective-scss "^5.0.1" + detective-stylus "^5.0.1" + detective-typescript "^14.0.0" + detective-vue2 "^2.2.0" + module-definition "^6.0.1" + node-source-walk "^7.0.1" + postcss "^8.5.1" + typescript "^5.7.3" + +prettier@3.4.2: version "3.4.2" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f" integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ== +prettier@^3.0.0: + version "3.5.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.5.1.tgz#22fac9d0b18c0b92055ac8fb619ac1c7bef02fb7" + integrity sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw== + pretty-ms@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-7.0.1.tgz#7d903eaab281f7d8e03c66f867e239dc32fb73e8" @@ -14696,7 +14456,7 @@ pumpify@^1.3.5: inherits "^2.0.3" pump "^2.0.0" -punycode@^1.3.2, punycode@^1.4.1: +punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== @@ -14713,15 +14473,15 @@ pupa@^2.1.1: dependencies: escape-goat "^2.0.0" -puppeteer-core@24.1.1: - version "24.1.1" - resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-24.1.1.tgz#cbf5a888168559e66319c0418f877a553c8ed2fa" - integrity sha512-7FF3gq6bpIsbq3I8mfbodXh3DCzXagoz3l2eGv1cXooYU4g0P4mcHQVHuBD4iSZPXNg8WjzlP5kmRwK9UvwF0A== +puppeteer-core@24.2.1: + version "24.2.1" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-24.2.1.tgz#a7a3a82902452094d746e483404767f0e16fed98" + integrity sha512-bCypUh3WXzETafv1TCFAjIUnI8BiQ/d+XvEfEXDLcIMm9CAvROqnBmbt79yBjwasoDZsgfXnUmIJU7Y27AalVQ== dependencies: - "@puppeteer/browsers" "2.7.0" - chromium-bidi "1.1.0" + "@puppeteer/browsers" "2.7.1" + chromium-bidi "1.3.0" debug "^4.4.0" - devtools-protocol "0.0.1380148" + devtools-protocol "0.0.1402036" typed-query-selector "^2.12.0" ws "^8.18.0" @@ -14744,15 +14504,15 @@ puppeteer-core@^5.1.0: ws "^7.2.3" puppeteer@*: - version "24.1.1" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-24.1.1.tgz#dadcfbe05b25a54aee7061325631145db568890b" - integrity sha512-fuhceZ5HZuDXVuaMIRxUuDHfCJLmK0pXh8FlzVQ0/+OApStevxZhU5kAVeYFOEqeCF5OoAyZjcWbdQK27xW/9A== + version "24.2.1" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-24.2.1.tgz#e2e0370d84b788a12dcfc1cff6a970ce37ecc2e8" + integrity sha512-Euno62ou0cd0dTkOYTNioSOsFF4VpSnz4ldD38hi9ov9xCNtr8DbhmoJRUx+V9OuPgecueZbKOohRrnrhkbg3Q== dependencies: - "@puppeteer/browsers" "2.7.0" - chromium-bidi "1.1.0" + "@puppeteer/browsers" "2.7.1" + chromium-bidi "1.3.0" cosmiconfig "^9.0.0" - devtools-protocol "0.0.1380148" - puppeteer-core "24.1.1" + devtools-protocol "0.0.1402036" + puppeteer-core "24.2.1" typed-query-selector "^2.12.0" q@1.4.1: @@ -14804,11 +14564,6 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -queue-tick@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/queue-tick/-/queue-tick-1.0.1.tgz#f6f07ac82c1fd60f82e098b417a80e52f1f4c142" - integrity sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag== - quick-lru@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" @@ -14943,9 +14698,9 @@ readdirp@^2.2.1: readable-stream "^2.0.2" readdirp@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.1.tgz#bd115327129672dc47f87408f05df9bd9ca3ef55" - integrity sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw== + version "4.1.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" + integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== readdirp@~3.6.0: version "3.6.0" @@ -15025,16 +14780,15 @@ regex-not@^1.0.0, regex-not@^1.0.2: safe-regex "^1.1.0" regex-parser@^2.2.11: - version "2.3.0" - resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.3.0.tgz#4bb61461b1a19b8b913f3960364bb57887f920ee" - integrity sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg== + version "2.3.1" + resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.3.1.tgz#ee3f70e50bdd81a221d505242cb9a9c275a2ad91" + integrity sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ== -regex-recursion@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/regex-recursion/-/regex-recursion-5.1.1.tgz#5a73772d18adbf00f57ad097bf54171b39d78f8b" - integrity sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w== +regex-recursion@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/regex-recursion/-/regex-recursion-6.0.2.tgz#a0b1977a74c87f073377b938dbedfab2ea582b33" + integrity sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg== dependencies: - regex "^5.1.1" regex-utilities "^2.3.0" regex-utilities@^2.3.0: @@ -15042,10 +14796,10 @@ regex-utilities@^2.3.0: resolved "https://registry.yarnpkg.com/regex-utilities/-/regex-utilities-2.3.0.tgz#87163512a15dce2908cf079c8960d5158ff43280" integrity sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng== -regex@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/regex/-/regex-5.1.1.tgz#cf798903f24d6fe6e531050a36686e082b29bd03" - integrity sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw== +regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/regex/-/regex-6.0.1.tgz#282fa4435d0c700b09c0eb0982b602e05ab6a34f" + integrity sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA== dependencies: regex-utilities "^2.3.0" @@ -15074,9 +14828,9 @@ regexpu-core@^6.2.0: unicode-match-property-value-ecmascript "^2.1.0" registry-auth-token@^5.0.1: - version "5.0.3" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.0.3.tgz#417d758c8164569de8cf5cabff16cc937902dcc6" - integrity sha512-1bpc9IyC+e+CNFRaWyn77tk4xGG4PPUyfakSmA6F6cvUDjrm58dfyJ3II+9yb10EDkHoy1LaPSmHaWLOH3m6HA== + version "5.1.0" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.1.0.tgz#3c659047ecd4caebd25bc1570a3aa979ae490eca" + integrity sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw== dependencies: "@pnpm/npm-conf" "^2.1.0" @@ -15188,10 +14942,10 @@ resolve-alpn@^1.0.0: resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== -resolve-dependency-path@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-dependency-path/-/resolve-dependency-path-4.0.0.tgz#ec0b2aa83ce8cd125c7db734a40b4809959bf688" - integrity sha512-hlY1SybBGm5aYN3PC4rp15MzsJLM1w+MEA/4KU3UBPfz4S0lL3FL6mgv7JgaA8a+ZTeEQAiF1a1BuN2nkqiIlg== +resolve-dependency-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/resolve-dependency-path/-/resolve-dependency-path-4.0.1.tgz#1b9d43e5b62384301e26d040b9fce61ee5db60bd" + integrity sha512-YQftIIC4vzO9UMhO/sCgXukNyiwVRCVaxiWskCBy7Zpqkplm8kTAISZ8O1MoKW1ca6xzgLUBjZTcDgypXvXxiQ== resolve-dir@^1.0.0, resolve-dir@^1.0.1: version "1.0.1" @@ -15234,7 +14988,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== -resolve@1.22.10, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.8, resolve@^1.3.2, resolve@~1.22.1, resolve@~1.22.2: +resolve@1.22.10, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.10, resolve@^1.3.2, resolve@~1.22.1, resolve@~1.22.2: version "1.22.10" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== @@ -15421,7 +15175,7 @@ rollup@4.30.1: "@rollup/rollup-win32-x64-msvc" "4.30.1" fsevents "~2.3.2" -rollup@4.34.6, rollup@^4.30.1: +rollup@4.34.6: version "4.34.6" resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.34.6.tgz#a07e4d2621759e29034d909655e7a32eee9195c9" integrity sha512-wc2cBWqJgkU3Iz5oztRkQbfVkbxoz5EhnCGOrnJvnLnQ7O0WhQUYyv18qQI79O8L7DdHrrlJNeCHd4VGpnaXKQ== @@ -15449,32 +15203,32 @@ rollup@4.34.6, rollup@^4.30.1: "@rollup/rollup-win32-x64-msvc" "4.34.6" fsevents "~2.3.2" -rollup@^4.23.0: - version "4.32.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.32.0.tgz#c405bf6fca494d1999d9088f7736d7f03e5cac5a" - integrity sha512-JmrhfQR31Q4AuNBjjAX4s+a/Pu/Q8Q9iwjWBsjRH1q52SPFE2NqRMK6fUZKKnvKO6id+h7JIRf0oYsph53eATg== +rollup@^4.23.0, rollup@^4.30.1: + version "4.34.7" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.34.7.tgz#e00d8550688a616a3481c6446bb688d4c753ba8f" + integrity sha512-8qhyN0oZ4x0H6wmBgfKxJtxM7qS98YJ0k0kNh5ECVtuchIJ7z9IVVvzpmtQyT10PXKMtBxYr1wQ5Apg8RS8kXQ== dependencies: "@types/estree" "1.0.6" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.32.0" - "@rollup/rollup-android-arm64" "4.32.0" - "@rollup/rollup-darwin-arm64" "4.32.0" - "@rollup/rollup-darwin-x64" "4.32.0" - "@rollup/rollup-freebsd-arm64" "4.32.0" - "@rollup/rollup-freebsd-x64" "4.32.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.32.0" - "@rollup/rollup-linux-arm-musleabihf" "4.32.0" - "@rollup/rollup-linux-arm64-gnu" "4.32.0" - "@rollup/rollup-linux-arm64-musl" "4.32.0" - "@rollup/rollup-linux-loongarch64-gnu" "4.32.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.32.0" - "@rollup/rollup-linux-riscv64-gnu" "4.32.0" - "@rollup/rollup-linux-s390x-gnu" "4.32.0" - "@rollup/rollup-linux-x64-gnu" "4.32.0" - "@rollup/rollup-linux-x64-musl" "4.32.0" - "@rollup/rollup-win32-arm64-msvc" "4.32.0" - "@rollup/rollup-win32-ia32-msvc" "4.32.0" - "@rollup/rollup-win32-x64-msvc" "4.32.0" + "@rollup/rollup-android-arm-eabi" "4.34.7" + "@rollup/rollup-android-arm64" "4.34.7" + "@rollup/rollup-darwin-arm64" "4.34.7" + "@rollup/rollup-darwin-x64" "4.34.7" + "@rollup/rollup-freebsd-arm64" "4.34.7" + "@rollup/rollup-freebsd-x64" "4.34.7" + "@rollup/rollup-linux-arm-gnueabihf" "4.34.7" + "@rollup/rollup-linux-arm-musleabihf" "4.34.7" + "@rollup/rollup-linux-arm64-gnu" "4.34.7" + "@rollup/rollup-linux-arm64-musl" "4.34.7" + "@rollup/rollup-linux-loongarch64-gnu" "4.34.7" + "@rollup/rollup-linux-powerpc64le-gnu" "4.34.7" + "@rollup/rollup-linux-riscv64-gnu" "4.34.7" + "@rollup/rollup-linux-s390x-gnu" "4.34.7" + "@rollup/rollup-linux-x64-gnu" "4.34.7" + "@rollup/rollup-linux-x64-musl" "4.34.7" + "@rollup/rollup-win32-arm64-msvc" "4.34.7" + "@rollup/rollup-win32-ia32-msvc" "4.34.7" + "@rollup/rollup-win32-x64-msvc" "4.34.7" fsevents "~2.3.2" rollup@~1.11.3: @@ -15504,17 +15258,13 @@ roughjs@^4.6.6: points-on-path "^0.2.1" router@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/router/-/router-2.0.0.tgz#8692720b95de83876870d7bc638dd3c7e1ae8a27" - integrity sha512-dIM5zVoG8xhC6rnSN8uoAgFARwTE7BQs8YwHEvK0VCmfxQXMaOuA1uiR1IPwsW7JyK5iTt7Od/TC9StasS2NPQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/router/-/router-2.1.0.tgz#f256ca2365afb4d386ba4f7a9ee0aa0827c962fa" + integrity sha512-/m/NSLxeYEgWNtyC+WtNHCF7jbGxOibVWKnn+1Psff4dJGOfoXP+MuC/f2CwSmyiHdOIzYnYFp4W6GxWfekaLA== dependencies: - array-flatten "3.0.0" - is-promise "4.0.0" - methods "~1.1.2" - parseurl "~1.3.3" + is-promise "^4.0.0" + parseurl "^1.3.3" path-to-regexp "^8.0.0" - setprototypeof "1.2.0" - utils-merge "1.0.1" rrweb-cssom@^0.8.0: version "0.8.0" @@ -15617,12 +15367,13 @@ sass-loader@16.0.4: dependencies: neo-async "^2.6.2" -sass-lookup@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/sass-lookup/-/sass-lookup-6.0.1.tgz#6f80a06d86b1d9590c49df425f542fdbb9f119cb" - integrity sha512-nl9Wxbj9RjEJA5SSV0hSDoU2zYGtE+ANaDS4OFUR7nYrquvBFvPKZZtQHe3lvnxCcylEDV00KUijjdMTUElcVQ== +sass-lookup@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/sass-lookup/-/sass-lookup-6.1.0.tgz#a13b1f31dd44d2b4bcd55ba8f72763db4d95bd7c" + integrity sha512-Zx+lVyoWqXZxHuYWlTA17Z5sczJ6braNT2C7rmClw+c4E7r/n911Zwss3h1uHI9reR5AgHZyNHF7c2+VIp5AUA== dependencies: - commander "^12.0.0" + commander "^12.1.0" + enhanced-resolve "^5.18.0" sass@1.83.1: version "1.83.1" @@ -15732,9 +15483,9 @@ selenium-webdriver@3.6.0, selenium-webdriver@^3.0.1: xml2js "^0.4.17" selenium-webdriver@^4.18.1: - version "4.27.0" - resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.27.0.tgz#f0f26ce453805e7dc77151040442c67e441dbe7a" - integrity sha512-LkTJrNz5socxpPnWPODQ2bQ65eYx9JK+DQMYNihpTjMCqHwgWGYQnQTCAAche2W3ZP87alA+1zYPvgS8tHNzMQ== + version "4.28.1" + resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.28.1.tgz#0f6cc4fbc83cee3fdf8b116257656892957b72da" + integrity sha512-TwbTpu/NUQkorBODGAkGowJ8sar63bvqi66/tjqhS05rBl34HkVp8DoRg1cOv2iSnNonVSbkxazS3wjbc+NRtg== dependencies: "@bazel/runfiles" "^6.3.1" jszip "^3.10.1" @@ -15780,12 +15531,12 @@ semver@5.6.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== -semver@7.6.3, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3: +semver@7.6.3: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== -semver@7.7.1: +semver@7.7.1, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.7.0: version "7.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== @@ -16031,16 +15782,16 @@ shelljs@^0.8.5: rechoir "^0.6.2" shiki@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-2.1.0.tgz#49b9d612e613342ec2db8f18a44a246db4c5e323" - integrity sha512-yvKPdNGLXZv7WC4bl7JBbU3CEcUxnBanvMez8MG3gZXKpClGL4bHqFyLhTx+2zUvbjClUANs/S22HXb7aeOgmA== - dependencies: - "@shikijs/core" "2.1.0" - "@shikijs/engine-javascript" "2.1.0" - "@shikijs/engine-oniguruma" "2.1.0" - "@shikijs/langs" "2.1.0" - "@shikijs/themes" "2.1.0" - "@shikijs/types" "2.1.0" + version "2.3.2" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-2.3.2.tgz#d13bae8403c8aec11907185b4d96746b317cf539" + integrity sha512-UZhz/gsUz7DHFbQBOJP7eXqvKyYvMGramxQiSDc83M/7OkWm6OdVHAReEc3vMLh6L6TRhgL9dvhXz9XDkCDaaw== + dependencies: + "@shikijs/core" "2.3.2" + "@shikijs/engine-javascript" "2.3.2" + "@shikijs/engine-oniguruma" "2.3.2" + "@shikijs/langs" "2.3.2" + "@shikijs/themes" "2.3.2" + "@shikijs/types" "2.3.2" "@shikijs/vscode-textmate" "^10.0.1" "@types/hast" "^3.0.4" @@ -16095,16 +15846,16 @@ signal-exit@^4.0.1, signal-exit@^4.1.0: integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== sigstore@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-3.0.0.tgz#d6eadcc6590185a7f1c16184078ce8a9ef6db937" - integrity sha512-PHMifhh3EN4loMcHCz6l3v/luzgT3za+9f8subGgeMNjbJjzH4Ij/YoX3Gvu+kaouJRIlVdTHHCREADYf+ZteA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-3.1.0.tgz#08dc6c0c425263e9fdab85ffdb6477550e2c511d" + integrity sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q== dependencies: - "@sigstore/bundle" "^3.0.0" + "@sigstore/bundle" "^3.1.0" "@sigstore/core" "^2.0.0" - "@sigstore/protobuf-specs" "^0.3.2" - "@sigstore/sign" "^3.0.0" - "@sigstore/tuf" "^3.0.0" - "@sigstore/verify" "^2.0.0" + "@sigstore/protobuf-specs" "^0.4.0" + "@sigstore/sign" "^3.1.0" + "@sigstore/tuf" "^3.1.0" + "@sigstore/verify" "^2.1.0" simple-swizzle@^0.2.2: version "0.2.2" @@ -16125,11 +15876,6 @@ slash@^2.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - slash@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/slash/-/slash-5.1.0.tgz#be3adddcdf09ac38eebe8dcdc7b1a57a75b095ce" @@ -16252,9 +15998,9 @@ socks-proxy-agent@^8.0.3, socks-proxy-agent@^8.0.5: socks "^2.8.3" socks@^2.8.3: - version "2.8.3" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" - integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== + version "2.8.4" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.4.tgz#07109755cdd4da03269bda4725baa061ab56d5cc" + integrity sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ== dependencies: ip-address "^9.0.5" smart-buffer "^4.2.0" @@ -16465,9 +16211,9 @@ sprintf-js@~1.0.2: integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== sql-formatter@^15.3.0: - version "15.4.9" - resolved "https://registry.yarnpkg.com/sql-formatter/-/sql-formatter-15.4.9.tgz#75722b497d39fd05d6d17d5e03c5f44658126c25" - integrity sha512-5vmt2HlCAVozxsBZuXWkAki/KGawaK+b5GG5x+BtXOFVpN/8cqppblFUxHl4jxdA0cvo14lABhM+KBnrUapOlw== + version "15.4.10" + resolved "https://registry.yarnpkg.com/sql-formatter/-/sql-formatter-15.4.10.tgz#f7f4745aa1b9fc3c8ce493bf882610ca6200dedf" + integrity sha512-zQfiuxU1F/C7TNu+880BdL+fuvJTd1Kj8R0wv48dfZ27NR3z1PWvQFkH8ai/HrIy+NyvXCaZBkJHp/EeZFXSOA== dependencies: argparse "^2.0.1" get-stdin "=8.0.0" @@ -16603,12 +16349,11 @@ streamroller@^3.1.5: fs-extra "^8.1.0" streamx@^2.12.0, streamx@^2.12.5, streamx@^2.13.2, streamx@^2.14.0, streamx@^2.15.0, streamx@^2.21.0: - version "2.21.1" - resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.21.1.tgz#f02979d8395b6b637d08a589fb514498bed55845" - integrity sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw== + version "2.22.0" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.22.0.tgz#cd7b5e57c95aaef0ff9b2aef7905afa62ec6e4a7" + integrity sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw== dependencies: fast-fifo "^1.3.2" - queue-tick "^1.0.1" text-decoder "^1.1.0" optionalDependencies: bare-events "^2.2.0" @@ -16776,28 +16521,27 @@ style-mod@^4.0.0, style-mod@^4.1.0: integrity sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw== stylis@^4.3.1: - version "4.3.5" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.5.tgz#432cc99c81e28d7062c88d979d2163891e860489" - integrity sha512-K7npNOKGRYuhAFFzkzMGfxFDpN6gDwf8hcMiE+uveTVbBgm93HrNP3ZDUpKqzZ4pG7TP6fmb+EMAQPjq9FqqvA== + version "4.3.6" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.6.tgz#7c7b97191cb4f195f03ecab7d52f7902ed378320" + integrity sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ== -stylus-lookup@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/stylus-lookup/-/stylus-lookup-6.0.0.tgz#a15ea3abc399a0b72127e95422b2e7bb4fee86bb" - integrity sha512-RaWKxAvPnIXrdby+UWCr1WRfa+lrPMSJPySte4Q6a+rWyjeJyFOLJxr5GrAVfcMCsfVlCuzTAJ/ysYT8p8do7Q== +stylus-lookup@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/stylus-lookup/-/stylus-lookup-6.1.0.tgz#f0fe88a885b830dc7520f51dd0a7e59e5d3307b4" + integrity sha512-5QSwgxAzXPMN+yugy61C60PhoANdItfdjSEZR8siFwz7yL9jTmV0UBKDCfn3K8GkGB4g0Y9py7vTCX8rFu4/pQ== dependencies: - commander "^12.0.0" + commander "^12.1.0" -superstatic@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/superstatic/-/superstatic-9.1.0.tgz#ef046c3bd4e8756e004168428a0c72f420491aba" - integrity sha512-1PcxGREb5My6iX/DL9x+3+XFY5lM2nOiPBQV45RwbpM5bHGsStz+Lduts7y8W+xo68pHa7F8atTF52+dwfwxcw== +superstatic@^9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/superstatic/-/superstatic-9.2.0.tgz#c3d338e87fb1b695670c79db5affb18288441c32" + integrity sha512-QrJAJIpAij0jJT1nEwYTB0SzDi4k0wYygu6GxK0ko8twiQgfgaOAZ7Hu99p02MTAsGho753zhzSvsw8We4PBEQ== dependencies: - basic-auth-connect "^1.0.0" + basic-auth-connect "^1.1.0" commander "^10.0.0" compression "^1.7.0" connect "^3.7.0" destroy "^1.0.4" - fast-url-parser "^1.1.3" glob-slasher "^1.0.1" is-url "^1.2.2" join-path "^1.1.1" @@ -16807,7 +16551,7 @@ superstatic@^9.1.0: morgan "^1.8.2" on-finished "^2.2.0" on-headers "^1.0.0" - path-to-regexp "^1.8.0" + path-to-regexp "^1.9.0" router "^2.0.0" update-notifier-cjs "^5.1.6" optionalDependencies: @@ -16845,9 +16589,9 @@ supports-color@^8.0.0, supports-color@~8.1.1: has-flag "^4.0.0" supports-hyperlinks@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz#b56150ff0173baacc15f21956450b61f2b18d3ac" - integrity sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A== + version "3.2.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz#b8e485b179681dea496a1e7abdf8985bd3145461" + integrity sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig== dependencies: has-flag "^4.0.0" supports-color "^7.0.0" @@ -16897,7 +16641,7 @@ tar-fs@^2.0.0: pump "^3.0.0" tar-stream "^2.1.4" -tar-fs@^3.0.6: +tar-fs@^3.0.8: version "3.0.8" resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.8.tgz#8f62012537d5ff89252d01e48690dc4ebed33ab7" integrity sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg== @@ -17013,9 +16757,9 @@ terser@5.38.2: source-map-support "~0.5.20" terser@^5.0.0, terser@^5.31.1, terser@^5.8.0: - version "5.37.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.37.0.tgz#38aa66d1cfc43d0638fab54e43ff8a4f72a21ba3" - integrity sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA== + version "5.39.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.39.0.tgz#0e82033ed57b3ddf1f96708d123cca717d86ca3a" + integrity sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -17087,22 +16831,22 @@ thunky@^1.0.2: resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== -tinyexec@^0.3.0: +tinyexec@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== -tldts-core@^6.1.74: - version "6.1.74" - resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-6.1.74.tgz#4c8628b3ceefaae9667316704376472592b3a463" - integrity sha512-gTwtY6L2GfuxiL4CWpLknv9JDYYqBvKCk/BT5uAaAvCA0s6pzX7lr2IrkQZSUlnSjRHIjTl8ZwKCVXJ7XNRWYw== +tldts-core@^6.1.77: + version "6.1.77" + resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-6.1.77.tgz#0fa4563163a7a61d72c4b05650fb66fc7e815500" + integrity sha512-bCaqm24FPk8OgBkM0u/SrEWJgHnhBWYqeBo6yUmcZJDCHt/IfyWBb+14CXdGi4RInMv4v7eUAin15W0DoA+Ytg== tldts@^6.1.32: - version "6.1.74" - resolved "https://registry.yarnpkg.com/tldts/-/tldts-6.1.74.tgz#ff7e55614c30795b07cc29a26be53693f167b31c" - integrity sha512-O5vTZ1UmmEmrLl/59U9igitnSMlprALLaLgbv//dEvjobPT9vyURhHXKMCDLEhn3qxZFIkb9PwAfNYV0Ol7RPQ== + version "6.1.77" + resolved "https://registry.yarnpkg.com/tldts/-/tldts-6.1.77.tgz#714e3d1989e562886f2ed97b65e95a8e9f9e92d9" + integrity sha512-lBpoWgy+kYmuXWQ83+R7LlJCnsd9YW8DGpZSHhrMl4b8Ly/1vzOie3OdtmUJDkKxcgRGOehDu5btKkty+JEe+g== dependencies: - tldts-core "^6.1.74" + tldts-core "^6.1.77" tmp@0.0.30: version "0.0.30" @@ -17183,9 +16927,9 @@ toidentifier@1.0.1: integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== tough-cookie@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-5.1.0.tgz#0667b0f2fbb5901fe6f226c3e0b710a9a4292f87" - integrity sha512-rvZUv+7MoBYTiDmFPBrhL7Ujx9Sk+q9wwm22x8c8T5IJaR+Wsyc7TNxbVxo84kZoRJZZMazowFLqpankBEQrGg== + version "5.1.1" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-5.1.1.tgz#4641c1fdbf024927e29c5532edb7b6e5377ea1f2" + integrity sha512-Ek7HndSVkp10hmHP9V4qZO1u+pn1RU5sI0Fw+jCU3lyvuMZcgqsNgc6CmJJZyByK4Vm/qotGRJlfgAX8q+4JiA== dependencies: tldts "^6.1.32" @@ -17255,10 +16999,10 @@ triple-beam@^1.3.0: resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf" integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q== -ts-api-utils@^1.3.0: - version "1.4.3" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.3.tgz#bfc2215fe6528fecab2b0fba570a2e8a4263b064" - integrity sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw== +ts-api-utils@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.0.1.tgz#660729385b625b939aaa58054f45c058f33f10cd" + integrity sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w== ts-dedent@^2.2.0: version "2.2.0" @@ -17430,9 +17174,9 @@ type-fest@^0.21.3: integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type-fest@^4.6.0, type-fest@^4.7.1: - version "4.33.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.33.0.tgz#2da0c135b9afa76cf8b18ecfd4f260ecd414a432" - integrity sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g== + version "4.34.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.34.1.tgz#406a9c573cc51c3fbfee3c85742cf85c52860076" + integrity sha512-6kSc32kT0rbwxD6QL1CYe8IqdzN/J/ILMrNK+HMQCKH3insCDRY/3ITb0vcBss0a3t72fzh2YSzj8ko1HgwT3g== type-is@~1.6.18: version "1.6.18" @@ -17538,7 +17282,7 @@ typescript@5.7.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6" integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== -typescript@5.7.3, typescript@^5.4.4, typescript@^5.4.5, typescript@^5.5.4: +typescript@5.7.3, typescript@^5.7.3: version "5.7.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.3.tgz#919b44a7dbb8583a9b856d162be24a54bf80073e" integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw== @@ -17583,7 +17327,7 @@ unbox-primitive@^1.1.0: has-symbols "^1.1.0" which-boxed-primitive "^1.1.1" -unbzip2-stream@^1.3.3, unbzip2-stream@^1.4.3: +unbzip2-stream@^1.3.3: version "1.4.3" resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== @@ -17671,6 +17415,11 @@ unicorn-magic@^0.1.0: resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.1.0.tgz#1bb9a51c823aaf9d73a8bfcd3d1a23dde94b0ce4" integrity sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ== +unicorn-magic@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.3.0.tgz#4efd45c85a69e0dd576d25532fbfa22aa5c8a104" + integrity sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA== + union-value@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" @@ -18376,15 +18125,7 @@ whatwg-mimetype@^4.0.0: resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz#bc1bf94a985dc50388d54a9258ac405c3ca2fc0a" integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg== -whatwg-url@^14.0.0: - version "14.1.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-14.1.0.tgz#fffebec86cc8e6c2a657e50dc606207b870f0ab3" - integrity sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w== - dependencies: - tr46 "^5.0.0" - webidl-conversions "^7.0.0" - -whatwg-url@^14.1.0: +whatwg-url@^14.0.0, whatwg-url@^14.1.0: version "14.1.1" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-14.1.1.tgz#ce71e240c61541315833b5cdafd139a479e47058" integrity sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ== @@ -18807,10 +18548,10 @@ zip-stream@^6.0.1: compress-commons "^6.0.2" readable-stream "^4.0.0" -zod@3.24.1: - version "3.24.1" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.24.1.tgz#27445c912738c8ad1e9de1bea0359fa44d9d35ee" - integrity sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A== +zod@^3.24.1: + version "3.24.2" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.24.2.tgz#8efa74126287c675e92f46871cfc8d15c34372b3" + integrity sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ== zwitch@^2.0.4: version "2.0.4" From c076b57986ed4fe37675f0c0df4a1b1870cf2270 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Tue, 4 Feb 2025 11:38:48 -0800 Subject: [PATCH 0082/1000] refactor(core): move LContainer manipulation logic to its own file (#59856) All the view in a container logic is in the packages/core/src/render3/view/container.ts file plus some other associated refactorings. PR Close #59856 --- packages/core/src/defer/rendering.ts | 8 +- .../core/src/linker/view_container_ref.ts | 7 +- packages/core/src/render3/component_ref.ts | 5 +- packages/core/src/render3/hmr.ts | 10 +- .../src/render3/instructions/control_flow.ts | 12 +- .../src/render3/instructions/projection.ts | 7 +- .../core/src/render3/instructions/shared.ts | 332 +----------------- .../core/src/render3/instructions/template.ts | 5 +- .../core/src/render3/node_manipulation.ts | 155 +------- .../core/src/render3/view/construction.ts | 295 +++++++++++++++- packages/core/src/render3/view/container.ts | 260 ++++++++++++++ .../core/src/render3/view_manipulation.ts | 80 +---- packages/core/src/render3/view_ref.ts | 9 +- .../bundling/defer/bundle.golden_symbols.json | 1 + .../hello_world/bundle.golden_symbols.json | 1 + .../hydration/bundle.golden_symbols.json | 1 + .../bundle.golden_symbols.json | 1 + packages/core/test/render3/di_spec.ts | 2 +- .../test/render3/instructions/shared_spec.ts | 2 +- packages/core/test/render3/matchers_spec.ts | 2 +- packages/core/test/render3/view_fixture.ts | 2 +- packages/core/test/render3/view_utils_spec.ts | 2 +- 22 files changed, 602 insertions(+), 597 deletions(-) create mode 100644 packages/core/src/render3/view/container.ts diff --git a/packages/core/src/defer/rendering.ts b/packages/core/src/defer/rendering.ts index b6a4c3939532..65d32d9ddc39 100644 --- a/packages/core/src/defer/rendering.ts +++ b/packages/core/src/defer/rendering.ts @@ -22,12 +22,7 @@ import {TContainerNode, TNode} from '../render3/interfaces/node'; import {isDestroyed} from '../render3/interfaces/type_checks'; import {HEADER_OFFSET, INJECTOR, LView, PARENT, TVIEW, TView} from '../render3/interfaces/view'; import {getConstant, getTNode} from '../render3/util/view_utils'; -import { - addLViewToLContainer, - createAndRenderEmbeddedLView, - removeLViewFromLContainer, - shouldAddViewToDom, -} from '../render3/view_manipulation'; +import {createAndRenderEmbeddedLView, shouldAddViewToDom} from '../render3/view_manipulation'; import {assertDefined} from '../util/assert'; import { @@ -58,6 +53,7 @@ import { } from './utils'; import {profiler} from '../render3/profiler'; import {ProfilerEvent} from '../render3/profiler_types'; +import {addLViewToLContainer, removeLViewFromLContainer} from '../render3/view/container'; /** * **INTERNAL**, avoid referencing it in application code. diff --git a/packages/core/src/linker/view_container_ref.ts b/packages/core/src/linker/view_container_ref.ts index fe53b6cc3507..5a9f74da421c 100644 --- a/packages/core/src/linker/view_container_ref.ts +++ b/packages/core/src/linker/view_container_ref.ts @@ -22,7 +22,6 @@ import {assertNodeInjector} from '../render3/assert'; import {ComponentFactory as R3ComponentFactory} from '../render3/component_ref'; import {getComponentDef} from '../render3/def_getters'; import {getParentInjectorLocation, NodeInjector} from '../render3/di'; -import {addToEndOfViewTree, createLContainer} from '../render3/instructions/shared'; import { CONTAINER_HEADER_OFFSET, DEHYDRATED_VIEWS, @@ -51,7 +50,7 @@ import { TVIEW, } from '../render3/interfaces/view'; import {assertTNodeType} from '../render3/node_assert'; -import {destroyLView, detachView} from '../render3/node_manipulation'; +import {destroyLView} from '../render3/node_manipulation'; import {nativeInsertBefore} from '../render3/dom_node_manipulation'; import {getCurrentTNode, getLView} from '../render3/state'; import { @@ -60,7 +59,7 @@ import { hasParentInjector, } from '../render3/util/injector_utils'; import {getNativeByTNode, unwrapRNode, viewAttachedToContainer} from '../render3/util/view_utils'; -import {addLViewToLContainer, shouldAddViewToDom} from '../render3/view_manipulation'; +import {shouldAddViewToDom} from '../render3/view_manipulation'; import {ViewRef as R3ViewRef} from '../render3/view_ref'; import {addToArray, removeFromArray} from '../util/array_utils'; import { @@ -76,6 +75,8 @@ import {createElementRef, ElementRef} from './element_ref'; import {NgModuleRef} from './ng_module_factory'; import {TemplateRef} from './template_ref'; import {EmbeddedViewRef, ViewRef} from './view_ref'; +import {addLViewToLContainer, createLContainer, detachView} from '../render3/view/container'; +import {addToEndOfViewTree} from '../render3/view/construction'; /** * Represents a container where one or more views can be attached to a component. diff --git a/packages/core/src/render3/component_ref.ts b/packages/core/src/render3/component_ref.ts index 188c2deaea97..9cd8703f3069 100644 --- a/packages/core/src/render3/component_ref.ts +++ b/packages/core/src/render3/component_ref.ts @@ -32,15 +32,11 @@ import {attachPatchData} from './context_discovery'; import {getComponentDef} from './def_getters'; import {depsTracker} from './deps_tracker/deps_tracker'; import {NodeInjector} from './di'; -import {registerPostOrderHooks} from './hooks'; import {reportUnknownPropertyError} from './instructions/element_validation'; import {markViewDirty} from './instructions/mark_view_dirty'; import {renderView} from './instructions/render'; import { createDirectivesInstances, - createLView, - createTView, - getInitialLViewFlagsFromDef, locateHostElement, setInputsForProperty, } from './instructions/shared'; @@ -82,6 +78,7 @@ import {debugStringifyTypeForError, stringifyForError} from './util/stringify_ut import {getComponentLViewByIndex, getTNode} from './util/view_utils'; import {elementEndFirstCreatePass, elementStartFirstCreatePass} from './view/elements'; import {ViewRef} from './view_ref'; +import {createLView, createTView, getInitialLViewFlagsFromDef} from './view/construction'; export class ComponentFactoryResolver extends AbstractComponentFactoryResolver { /** diff --git a/packages/core/src/render3/hmr.ts b/packages/core/src/render3/hmr.ts index 0ea140b35648..cc20246696f3 100644 --- a/packages/core/src/render3/hmr.ts +++ b/packages/core/src/render3/hmr.ts @@ -13,11 +13,6 @@ import {getComponentDef} from './def_getters'; import {assertComponentDef} from './errors'; import {refreshView} from './instructions/change_detection'; import {renderView} from './instructions/render'; -import { - createLView, - getInitialLViewFlagsFromDef, - getOrCreateComponentTView, -} from './instructions/shared'; import {CONTAINER_HEADER_OFFSET} from './interfaces/container'; import {ComponentDef} from './interfaces/definition'; import {getTrackedLViews} from './interfaces/lview_tracking'; @@ -44,6 +39,11 @@ import {RendererFactory} from './interfaces/renderer'; import {NgZone} from '../zone'; import {ViewEncapsulation} from '../metadata/view'; import {NG_COMP_DEF} from './fields'; +import { + createLView, + getInitialLViewFlagsFromDef, + getOrCreateComponentTView, +} from './view/construction'; /** Represents `import.meta` plus some information that's not in the built-in types. */ type ImportMetaExtended = ImportMeta & { diff --git a/packages/core/src/render3/instructions/control_flow.ts b/packages/core/src/render3/instructions/control_flow.ts index f2860b6d4e05..733280a8d412 100644 --- a/packages/core/src/render3/instructions/control_flow.ts +++ b/packages/core/src/render3/instructions/control_flow.ts @@ -29,19 +29,19 @@ import { TView, } from '../interfaces/view'; import {LiveCollection, reconcile} from '../list_reconciliation'; -import {destroyLView, detachView} from '../node_manipulation'; +import {destroyLView} from '../node_manipulation'; import {getLView, getSelectedIndex, getTView, nextBindingIndex} from '../state'; import {NO_CHANGE} from '../tokens'; import {getConstant, getTNode} from '../util/view_utils'; +import {createAndRenderEmbeddedLView, shouldAddViewToDom} from '../view_manipulation'; + +import {declareTemplate} from './template'; import { addLViewToLContainer, - createAndRenderEmbeddedLView, + detachView, getLViewFromLContainer, removeLViewFromLContainer, - shouldAddViewToDom, -} from '../view_manipulation'; - -import {declareTemplate} from './template'; +} from '../view/container'; /** * The conditional instruction represents the basic building block on the runtime side to support diff --git a/packages/core/src/render3/instructions/projection.ts b/packages/core/src/render3/instructions/projection.ts index 3c2e3fcfe208..848c56049a06 100644 --- a/packages/core/src/render3/instructions/projection.ts +++ b/packages/core/src/render3/instructions/projection.ts @@ -28,11 +28,8 @@ import { } from '../node_selector_matcher'; import {getLView, getTView, isInSkipHydrationBlock, setCurrentTNodeAsNotParent} from '../state'; import {getOrCreateTNode} from '../tnode_manipulation'; -import { - addLViewToLContainer, - createAndRenderEmbeddedLView, - shouldAddViewToDom, -} from '../view_manipulation'; +import {addLViewToLContainer} from '../view/container'; +import {createAndRenderEmbeddedLView, shouldAddViewToDom} from '../view_manipulation'; import {declareTemplate} from './template'; diff --git a/packages/core/src/render3/instructions/shared.ts b/packages/core/src/render3/instructions/shared.ts index fad9b141c122..a5f8fb988e66 100644 --- a/packages/core/src/render3/instructions/shared.ts +++ b/packages/core/src/render3/instructions/shared.ts @@ -8,42 +8,29 @@ import {Injector} from '../../di/injector'; import {ErrorHandler} from '../../error_handler'; -import {DehydratedView} from '../../hydration/interfaces'; import {hasSkipHydrationAttrOnRElement} from '../../hydration/skip_hydration'; import {PRESERVE_HOST_CONTENT, PRESERVE_HOST_CONTENT_DEFAULT} from '../../hydration/tokens'; import {processTextNodeMarkersBeforeHydration} from '../../hydration/utils'; -import {SchemaMetadata} from '../../metadata/schema'; import {ViewEncapsulation} from '../../metadata/view'; import { validateAgainstEventAttributes, validateAgainstEventProperties, } from '../../sanitization/sanitization'; -import {assertDefined, assertEqual, assertIndexInRange, assertNotSame} from '../../util/assert'; +import {assertIndexInRange, assertNotSame} from '../../util/assert'; import {escapeCommentText} from '../../util/dom'; import {normalizeDebugBindingName, normalizeDebugBindingValue} from '../../util/ng_reflect'; import {stringify} from '../../util/stringify'; -import {assertFirstCreatePass, assertLView, assertTNodeForLView} from '../assert'; +import {assertFirstCreatePass, assertLView} from '../assert'; import {attachPatchData} from '../context_discovery'; import {getNodeInjectable, getOrCreateNodeInjectorForNode} from '../di'; import {throwMultipleComponentError} from '../errors'; -import {CONTAINER_HEADER_OFFSET, LContainer} from '../interfaces/container'; -import { - ComponentDef, - ComponentTemplate, - DirectiveDef, - DirectiveDefListOrFactory, - PipeDefListOrFactory, - RenderFlags, - ViewQueriesFunction, -} from '../interfaces/definition'; +import {ComponentDef, ComponentTemplate, DirectiveDef, RenderFlags} from '../interfaces/definition'; import {InputFlags} from '../interfaces/input_flags'; -import {getUniqueLViewId} from '../interfaces/lview_tracking'; import { InitialInputData, InitialInputs, LocalRefExtractor, NodeInputBindings, - TConstantsOrFactory, TContainerNode, TDirectiveHostNode, TElementContainerNode, @@ -57,30 +44,15 @@ import {RComment, RElement} from '../interfaces/renderer_dom'; import {SanitizerFn} from '../interfaces/sanitization'; import {isComponentDef, isComponentHost} from '../interfaces/type_checks'; import { - CHILD_HEAD, - CHILD_TAIL, CONTEXT, - DECLARATION_COMPONENT_VIEW, - DECLARATION_VIEW, - EMBEDDED_VIEW_INJECTOR, - ENVIRONMENT, FLAGS, HEADER_OFFSET, - HOST, - HYDRATION, - ID, INJECTOR, LView, - LViewEnvironment, LViewFlags, - NEXT, - PARENT, RENDERER, - T_HOST, TData, - TVIEW, TView, - TViewType, } from '../interfaces/view'; import {assertTNodeType} from '../node_assert'; import {isNodeMatchingSelectorList} from '../node_selector_matcher'; @@ -97,71 +69,14 @@ import { import {NO_CHANGE} from '../tokens'; import {INTERPOLATION_DELIMITER} from '../util/misc_utils'; import {renderStringify} from '../util/stringify_utils'; -import { - getComponentLViewByIndex, - getNativeByTNode, - resetPreOrderHookFlags, - unwrapLView, -} from '../util/view_utils'; +import {getComponentLViewByIndex, getNativeByTNode, unwrapLView} from '../util/view_utils'; import {clearElementContents} from '../dom_node_manipulation'; +import {createComponentLView} from '../view/construction'; import {selectIndexInternal} from './advance'; import {handleUnknownPropertyError, isPropertyValid, matchingSchemas} from './element_validation'; import {writeToDirectiveInput} from './write_to_directive_input'; -export function createLView( - parentLView: LView | null, - tView: TView, - context: T | null, - flags: LViewFlags, - host: RElement | null, - tHostNode: TNode | null, - environment: LViewEnvironment | null, - renderer: Renderer | null, - injector: Injector | null, - embeddedViewInjector: Injector | null, - hydrationInfo: DehydratedView | null, -): LView { - const lView = tView.blueprint.slice() as LView; - lView[HOST] = host; - lView[FLAGS] = - flags | - LViewFlags.CreationMode | - LViewFlags.Attached | - LViewFlags.FirstLViewPass | - LViewFlags.Dirty | - LViewFlags.RefreshView; - if ( - embeddedViewInjector !== null || - (parentLView && parentLView[FLAGS] & LViewFlags.HasEmbeddedViewInjector) - ) { - lView[FLAGS] |= LViewFlags.HasEmbeddedViewInjector; - } - resetPreOrderHookFlags(lView); - ngDevMode && tView.declTNode && parentLView && assertTNodeForLView(tView.declTNode, parentLView); - lView[PARENT] = lView[DECLARATION_VIEW] = parentLView; - lView[CONTEXT] = context; - lView[ENVIRONMENT] = (environment || (parentLView && parentLView[ENVIRONMENT]))!; - ngDevMode && assertDefined(lView[ENVIRONMENT], 'LViewEnvironment is required'); - lView[RENDERER] = (renderer || (parentLView && parentLView[RENDERER]))!; - ngDevMode && assertDefined(lView[RENDERER], 'Renderer is required'); - lView[INJECTOR as any] = injector || (parentLView && parentLView[INJECTOR]) || null; - lView[T_HOST] = tHostNode; - lView[ID] = getUniqueLViewId(); - lView[HYDRATION] = hydrationInfo; - lView[EMBEDDED_VIEW_INJECTOR as any] = embeddedViewInjector; - - ngDevMode && - assertEqual( - tView.type == TViewType.Embedded ? parentLView !== null : true, - true, - 'Embedded views must have parentLView', - ); - lView[DECLARATION_COMPONENT_VIEW] = - tView.type == TViewType.Embedded ? parentLView![DECLARATION_COMPONENT_VIEW] : lView; - return lView as LView; -} - export function executeTemplate( tView: TView, lView: LView, @@ -243,126 +158,6 @@ export function saveResolvedLocalsInData( } } -/** - * Gets TView from a template function or creates a new TView - * if it doesn't already exist. - * - * @param def ComponentDef - * @returns TView - */ -export function getOrCreateComponentTView(def: ComponentDef): TView { - const tView = def.tView; - - // Create a TView if there isn't one, or recreate it if the first create pass didn't - // complete successfully since we can't know for sure whether it's in a usable shape. - if (tView === null || tView.incompleteFirstPass) { - // Declaration node here is null since this function is called when we dynamically create a - // component and hence there is no declaration. - const declTNode = null; - return (def.tView = createTView( - TViewType.Component, - declTNode, - def.template, - def.decls, - def.vars, - def.directiveDefs, - def.pipeDefs, - def.viewQuery, - def.schemas, - def.consts, - def.id, - )); - } - - return tView; -} - -/** - * Creates a TView instance - * - * @param type Type of `TView`. - * @param declTNode Declaration location of this `TView`. - * @param templateFn Template function - * @param decls The number of nodes, local refs, and pipes in this template - * @param directives Registry of directives for this view - * @param pipes Registry of pipes for this view - * @param viewQuery View queries for this view - * @param schemas Schemas for this view - * @param consts Constants for this view - */ -export function createTView( - type: TViewType, - declTNode: TNode | null, - templateFn: ComponentTemplate | null, - decls: number, - vars: number, - directives: DirectiveDefListOrFactory | null, - pipes: PipeDefListOrFactory | null, - viewQuery: ViewQueriesFunction | null, - schemas: SchemaMetadata[] | null, - constsOrFactory: TConstantsOrFactory | null, - ssrId: string | null, -): TView { - ngDevMode && ngDevMode.tView++; - const bindingStartIndex = HEADER_OFFSET + decls; - // This length does not yet contain host bindings from child directives because at this point, - // we don't know which directives are active on this template. As soon as a directive is matched - // that has a host binding, we will update the blueprint with that def's hostVars count. - const initialViewLength = bindingStartIndex + vars; - const blueprint = createViewBlueprint(bindingStartIndex, initialViewLength); - const consts = typeof constsOrFactory === 'function' ? constsOrFactory() : constsOrFactory; - const tView = (blueprint[TVIEW as any] = { - type: type, - blueprint: blueprint, - template: templateFn, - queries: null, - viewQuery: viewQuery, - declTNode: declTNode, - data: blueprint.slice().fill(null, bindingStartIndex), - bindingStartIndex: bindingStartIndex, - expandoStartIndex: initialViewLength, - hostBindingOpCodes: null, - firstCreatePass: true, - firstUpdatePass: true, - staticViewQueries: false, - staticContentQueries: false, - preOrderHooks: null, - preOrderCheckHooks: null, - contentHooks: null, - contentCheckHooks: null, - viewHooks: null, - viewCheckHooks: null, - destroyHooks: null, - cleanup: null, - contentQueries: null, - components: null, - directiveRegistry: typeof directives === 'function' ? directives() : directives, - pipeRegistry: typeof pipes === 'function' ? pipes() : pipes, - firstChild: null, - schemas: schemas, - consts: consts, - incompleteFirstPass: false, - ssrId, - }); - if (ngDevMode) { - // For performance reasons it is important that the tView retains the same shape during runtime. - // (To make sure that all of the code is monomorphic.) For this reason we seal the object to - // prevent class transitions. - Object.seal(tView); - } - return tView; -} - -function createViewBlueprint(bindingStartIndex: number, initialViewLength: number): LView { - const blueprint = []; - - for (let i = 0; i < initialViewLength; i++) { - blueprint.push(i < bindingStartIndex ? null : NO_CHANGE); - } - - return blueprint as LView; -} - /** * Locates the host native element, used for bootstrapping existing nodes into rendering pipeline. * @@ -672,53 +467,6 @@ export function findDirectiveDefMatches( return matches; } -/** - * Gets the initial set of LView flags based on the component definition that the LView represents. - * @param def Component definition from which to determine the flags. - */ -export function getInitialLViewFlagsFromDef(def: ComponentDef): LViewFlags { - let flags = LViewFlags.CheckAlways; - if (def.signals) { - flags = LViewFlags.SignalView; - } else if (def.onPush) { - flags = LViewFlags.Dirty; - } - return flags; -} - -function createComponentLView( - lView: LView, - hostTNode: TElementNode, - def: ComponentDef, -): LView { - const native = getNativeByTNode(hostTNode, lView) as RElement; - const tView = getOrCreateComponentTView(def); - - // Only component views should be added to the view tree directly. Embedded views are - // accessed through their containers because they may be removed / re-added later. - const rendererFactory = lView[ENVIRONMENT].rendererFactory; - const componentView = addToEndOfViewTree( - lView, - createLView( - lView, - tView, - null, - getInitialLViewFlagsFromDef(def), - native, - hostTNode as TElementNode, - null, - rendererFactory.createRenderer(native, def), - null, - null, - null, - ), - ); - - // Component view will always be created before any injected LContainers, - // so this is a regular element, wrap it with the component view - return (lView[hostTNode.index] = componentView); -} - export function elementAttributeInternal( tNode: TNode, lView: LView, @@ -797,76 +545,6 @@ function setInputsFromAttrs( } } -////////////////////////// -//// ViewContainer & View -////////////////////////// - -/** - * Creates a LContainer, either from a container instruction, or for a ViewContainerRef. - * - * @param hostNative The host element for the LContainer - * @param hostTNode The host TNode for the LContainer - * @param currentView The parent view of the LContainer - * @param native The native comment element - * @param isForViewContainerRef Optional a flag indicating the ViewContainerRef case - * @returns LContainer - */ -export function createLContainer( - hostNative: RElement | RComment | LView, - currentView: LView, - native: RComment, - tNode: TNode, -): LContainer { - ngDevMode && assertLView(currentView); - const lContainer: LContainer = [ - hostNative, // host native - true, // Boolean `true` in this position signifies that this is an `LContainer` - 0, // flags - currentView, // parent - null, // next - tNode, // t_host - null, // dehydrated views - native, // native, - null, // view refs - null, // moved views - ]; - ngDevMode && - assertEqual( - lContainer.length, - CONTAINER_HEADER_OFFSET, - 'Should allocate correct number of slots for LContainer header.', - ); - return lContainer; -} - -/** - * Adds LView or LContainer to the end of the current view tree. - * - * This structure will be used to traverse through nested views to remove listeners - * and call onDestroy callbacks. - * - * @param lView The view where LView or LContainer should be added - * @param adjustedHostIndex Index of the view's host node in LView[], adjusted for header - * @param lViewOrLContainer The LView or LContainer to add to the view tree - * @returns The state passed in - */ -export function addToEndOfViewTree( - lView: LView, - lViewOrLContainer: T, -): T { - // TODO(benlesh/misko): This implementation is incorrect, because it always adds the LContainer - // to the end of the queue, which means if the developer retrieves the LContainers from RNodes out - // of order, the change detection will run out of order, as the act of retrieving the the - // LContainer from the RNode is what adds it to the queue. - if (lView[CHILD_HEAD]) { - lView[CHILD_TAIL]![NEXT] = lViewOrLContainer; - } else { - lView[CHILD_HEAD] = lViewOrLContainer; - } - lView[CHILD_TAIL] = lViewOrLContainer; - return lViewOrLContainer; -} - /////////////////////////////// //// Bindings & interpolations /////////////////////////////// diff --git a/packages/core/src/render3/instructions/template.ts b/packages/core/src/render3/instructions/template.ts index eb942c0520c1..2e2082d6a000 100644 --- a/packages/core/src/render3/instructions/template.ts +++ b/packages/core/src/render3/instructions/template.ts @@ -38,13 +38,12 @@ import { import {getOrCreateTNode} from '../tnode_manipulation'; import {mergeHostAttrs} from '../util/attrs_utils'; import {getConstant} from '../util/view_utils'; +import {addToEndOfViewTree, createTView} from '../view/construction'; +import {createLContainer} from '../view/container'; import {resolveDirectives} from '../view/directives'; import { - addToEndOfViewTree, createDirectivesInstancesInInstruction, - createLContainer, - createTView, findDirectiveDefMatches, saveResolvedLocalsInData, } from './shared'; diff --git a/packages/core/src/render3/node_manipulation.ts b/packages/core/src/render3/node_manipulation.ts index f8d1b25f9c47..637adef065e5 100644 --- a/packages/core/src/render3/node_manipulation.ts +++ b/packages/core/src/render3/node_manipulation.ts @@ -12,32 +12,30 @@ import {NotificationSource} from '../change_detection/scheduling/zoneless_schedu import {hasInSkipHydrationBlockFlag} from '../hydration/skip_hydration'; import {ViewEncapsulation} from '../metadata/view'; import {RendererStyleFlags2} from '../render/api_flags'; -import {addToArray, removeFromArray} from '../util/array_utils'; import { assertDefined, assertEqual, assertFunction, assertNotReactive, assertNumber, - assertString, } from '../util/assert'; +import {isDetachedByI18n} from '../i18n/utils'; import { assertLContainer, - assertLView, assertParentView, assertProjectionSlots, assertTNodeForLView, } from './assert'; import {attachPatchData} from './context_discovery'; -import {icuContainerIterate} from './i18n/i18n_tree_shaking'; import { - CONTAINER_HEADER_OFFSET, - LContainer, - LContainerFlags, - MOVED_VIEWS, - NATIVE, -} from './interfaces/container'; + nativeAppendChild, + nativeAppendOrInsertBefore, + nativeInsertBefore, + nativeRemoveNode, +} from './dom_node_manipulation'; +import {icuContainerIterate} from './i18n/i18n_tree_shaking'; +import {CONTAINER_HEADER_OFFSET, LContainer, MOVED_VIEWS, NATIVE} from './interfaces/container'; import {ComponentDef} from './interfaces/definition'; import {NodeInjectorFactory} from './interfaces/injector'; import {unregisterLView} from './interfaces/lview_tracking'; @@ -80,19 +78,7 @@ import { import {assertTNodeType} from './node_assert'; import {profiler} from './profiler'; import {ProfilerEvent} from './profiler_types'; -import { - getLViewParent, - getNativeByTNode, - unwrapRNode, - updateAncestorTraversalFlagsOnAttach, -} from './util/view_utils'; -import { - nativeAppendChild, - nativeAppendOrInsertBefore, - nativeInsertBefore, - nativeRemoveNode, -} from './dom_node_manipulation'; -import {isDetachedByI18n} from '../i18n/utils'; +import {getLViewParent, getNativeByTNode, unwrapRNode} from './util/view_utils'; const enum WalkTNodeTreeAction { /** node create in the native environment. Run on initial creation. */ @@ -270,87 +256,6 @@ export function destroyViewTree(rootView: LView): void { } } -/** - * Inserts a view into a container. - * - * This adds the view to the container's array of active views in the correct - * position. It also adds the view's elements to the DOM if the container isn't a - * root node of another view (in that case, the view's elements will be added when - * the container's parent view is added later). - * - * @param tView The `TView' of the `LView` to insert - * @param lView The view to insert - * @param lContainer The container into which the view should be inserted - * @param index Which index in the container to insert the child view into - */ -export function insertView(tView: TView, lView: LView, lContainer: LContainer, index: number) { - ngDevMode && assertLView(lView); - ngDevMode && assertLContainer(lContainer); - const indexInContainer = CONTAINER_HEADER_OFFSET + index; - const containerLength = lContainer.length; - - if (index > 0) { - // This is a new view, we need to add it to the children. - lContainer[indexInContainer - 1][NEXT] = lView; - } - if (index < containerLength - CONTAINER_HEADER_OFFSET) { - lView[NEXT] = lContainer[indexInContainer]; - addToArray(lContainer, CONTAINER_HEADER_OFFSET + index, lView); - } else { - lContainer.push(lView); - lView[NEXT] = null; - } - - lView[PARENT] = lContainer; - - // track views where declaration and insertion points are different - const declarationLContainer = lView[DECLARATION_LCONTAINER]; - if (declarationLContainer !== null && lContainer !== declarationLContainer) { - trackMovedView(declarationLContainer, lView); - } - - // notify query that a new view has been added - const lQueries = lView[QUERIES]; - if (lQueries !== null) { - lQueries.insertView(tView); - } - - updateAncestorTraversalFlagsOnAttach(lView); - // Sets the attached flag - lView[FLAGS] |= LViewFlags.Attached; -} - -/** - * Track views created from the declaration container (TemplateRef) and inserted into a - * different LContainer or attached directly to ApplicationRef. - */ -export function trackMovedView(declarationContainer: LContainer, lView: LView) { - ngDevMode && assertDefined(lView, 'LView required'); - ngDevMode && assertLContainer(declarationContainer); - const movedViews = declarationContainer[MOVED_VIEWS]; - const parent = lView[PARENT]!; - ngDevMode && assertDefined(parent, 'missing parent'); - if (isLView(parent)) { - declarationContainer[FLAGS] |= LContainerFlags.HasTransplantedViews; - } else { - const insertedComponentLView = parent[PARENT]![DECLARATION_COMPONENT_VIEW]; - ngDevMode && assertDefined(insertedComponentLView, 'Missing insertedComponentLView'); - const declaredComponentLView = lView[DECLARATION_COMPONENT_VIEW]; - ngDevMode && assertDefined(declaredComponentLView, 'Missing declaredComponentLView'); - if (declaredComponentLView !== insertedComponentLView) { - // At this point the declaration-component is not same as insertion-component; this means that - // this is a transplanted view. Mark the declared lView as having transplanted views so that - // those views can participate in CD. - declarationContainer[FLAGS] |= LContainerFlags.HasTransplantedViews; - } - } - if (movedViews === null) { - declarationContainer[MOVED_VIEWS] = [lView]; - } else { - movedViews.push(lView); - } -} - export function detachMovedView(declarationContainer: LContainer, lView: LView) { ngDevMode && assertLContainer(declarationContainer); ngDevMode && @@ -363,48 +268,6 @@ export function detachMovedView(declarationContainer: LContainer, lView: LView) movedViews.splice(declarationViewIndex, 1); } -/** - * Detaches a view from a container. - * - * This method removes the view from the container's array of active views. It also - * removes the view's elements from the DOM. - * - * @param lContainer The container from which to detach a view - * @param removeIndex The index of the view to detach - * @returns Detached LView instance. - */ -export function detachView(lContainer: LContainer, removeIndex: number): LView | undefined { - if (lContainer.length <= CONTAINER_HEADER_OFFSET) return; - - const indexInContainer = CONTAINER_HEADER_OFFSET + removeIndex; - const viewToDetach = lContainer[indexInContainer]; - - if (viewToDetach) { - const declarationLContainer = viewToDetach[DECLARATION_LCONTAINER]; - if (declarationLContainer !== null && declarationLContainer !== lContainer) { - detachMovedView(declarationLContainer, viewToDetach); - } - - if (removeIndex > 0) { - lContainer[indexInContainer - 1][NEXT] = viewToDetach[NEXT] as LView; - } - const removedLView = removeFromArray(lContainer, CONTAINER_HEADER_OFFSET + removeIndex); - removeViewFromDOM(viewToDetach[TVIEW], viewToDetach); - - // notify query that a view has been removed - const lQueries = removedLView[QUERIES]; - if (lQueries !== null) { - lQueries.detachView(removedLView[TVIEW]); - } - - viewToDetach[PARENT] = null; - viewToDetach[NEXT] = null; - // Unsets the attached flag - viewToDetach[FLAGS] &= ~LViewFlags.Attached; - } - return viewToDetach; -} - /** * A standalone function which destroys an LView, * conducting clean up (e.g. removing listeners, calling onDestroys). diff --git a/packages/core/src/render3/view/construction.ts b/packages/core/src/render3/view/construction.ts index c865a5ea8513..9ab30484aeba 100644 --- a/packages/core/src/render3/view/construction.ts +++ b/packages/core/src/render3/view/construction.ts @@ -6,9 +6,270 @@ * found in the LICENSE file at https://angular.dev/license */ -import {type TView, type LView, TVIEW} from '../interfaces/view'; -import {assertFirstCreatePass, assertFirstUpdatePass} from '../assert'; -import {assertSame, assertEqual} from '../../util/assert'; +import { + TView, + TVIEW, + LViewFlags, + LViewEnvironment, + HOST, + FLAGS, + DECLARATION_VIEW, + PARENT, + CONTEXT, + ENVIRONMENT, + RENDERER, + INJECTOR, + T_HOST, + ID, + HYDRATION, + EMBEDDED_VIEW_INJECTOR, + TViewType, + DECLARATION_COMPONENT_VIEW, + HEADER_OFFSET, + CHILD_HEAD, + CHILD_TAIL, + NEXT, + LView, +} from '../interfaces/view'; +import {assertFirstCreatePass, assertFirstUpdatePass, assertTNodeForLView} from '../assert'; +import {assertSame, assertEqual, assertDefined} from '../../util/assert'; +import {RElement} from '../interfaces/renderer_dom'; +import {TConstantsOrFactory, TElementNode, TNode} from '../interfaces/node'; +import {Renderer} from '../interfaces/renderer'; +import {Injector} from '../../di'; +import {DehydratedView} from '../../hydration/interfaces'; +import {getNativeByTNode, resetPreOrderHookFlags} from '../util/view_utils'; +import {getUniqueLViewId} from '../interfaces/lview_tracking'; +import {NO_CHANGE} from '../tokens'; +import { + ComponentDef, + ComponentTemplate, + DirectiveDefListOrFactory, + PipeDefListOrFactory, + ViewQueriesFunction, +} from '../interfaces/definition'; +import {SchemaMetadata} from '../../metadata/schema'; +import {LContainer} from '../interfaces/container'; + +/** + * Creates a TView instance + * + * @param type Type of `TView`. + * @param declTNode Declaration location of this `TView`. + * @param templateFn Template function + * @param decls The number of nodes, local refs, and pipes in this template + * @param directives Registry of directives for this view + * @param pipes Registry of pipes for this view + * @param viewQuery View queries for this view + * @param schemas Schemas for this view + * @param consts Constants for this view + */ +export function createTView( + type: TViewType, + declTNode: TNode | null, + templateFn: ComponentTemplate | null, + decls: number, + vars: number, + directives: DirectiveDefListOrFactory | null, + pipes: PipeDefListOrFactory | null, + viewQuery: ViewQueriesFunction | null, + schemas: SchemaMetadata[] | null, + constsOrFactory: TConstantsOrFactory | null, + ssrId: string | null, +): TView { + ngDevMode && ngDevMode.tView++; + const bindingStartIndex = HEADER_OFFSET + decls; + // This length does not yet contain host bindings from child directives because at this point, + // we don't know which directives are active on this template. As soon as a directive is matched + // that has a host binding, we will update the blueprint with that def's hostVars count. + const initialViewLength = bindingStartIndex + vars; + const blueprint = createViewBlueprint(bindingStartIndex, initialViewLength); + const consts = typeof constsOrFactory === 'function' ? constsOrFactory() : constsOrFactory; + const tView = (blueprint[TVIEW as any] = { + type: type, + blueprint: blueprint, + template: templateFn, + queries: null, + viewQuery: viewQuery, + declTNode: declTNode, + data: blueprint.slice().fill(null, bindingStartIndex), + bindingStartIndex: bindingStartIndex, + expandoStartIndex: initialViewLength, + hostBindingOpCodes: null, + firstCreatePass: true, + firstUpdatePass: true, + staticViewQueries: false, + staticContentQueries: false, + preOrderHooks: null, + preOrderCheckHooks: null, + contentHooks: null, + contentCheckHooks: null, + viewHooks: null, + viewCheckHooks: null, + destroyHooks: null, + cleanup: null, + contentQueries: null, + components: null, + directiveRegistry: typeof directives === 'function' ? directives() : directives, + pipeRegistry: typeof pipes === 'function' ? pipes() : pipes, + firstChild: null, + schemas: schemas, + consts: consts, + incompleteFirstPass: false, + ssrId, + }); + if (ngDevMode) { + // For performance reasons it is important that the tView retains the same shape during runtime. + // (To make sure that all of the code is monomorphic.) For this reason we seal the object to + // prevent class transitions. + Object.seal(tView); + } + return tView; +} + +function createViewBlueprint(bindingStartIndex: number, initialViewLength: number): LView { + const blueprint = []; + + for (let i = 0; i < initialViewLength; i++) { + blueprint.push(i < bindingStartIndex ? null : NO_CHANGE); + } + + return blueprint as LView; +} + +/** + * Gets TView from a template function or creates a new TView + * if it doesn't already exist. + * + * @param def ComponentDef + * @returns TView + */ +export function getOrCreateComponentTView(def: ComponentDef): TView { + const tView = def.tView; + + // Create a TView if there isn't one, or recreate it if the first create pass didn't + // complete successfully since we can't know for sure whether it's in a usable shape. + if (tView === null || tView.incompleteFirstPass) { + // Declaration node here is null since this function is called when we dynamically create a + // component and hence there is no declaration. + const declTNode = null; + return (def.tView = createTView( + TViewType.Component, + declTNode, + def.template, + def.decls, + def.vars, + def.directiveDefs, + def.pipeDefs, + def.viewQuery, + def.schemas, + def.consts, + def.id, + )); + } + + return tView; +} + +export function createLView( + parentLView: LView | null, + tView: TView, + context: T | null, + flags: LViewFlags, + host: RElement | null, + tHostNode: TNode | null, + environment: LViewEnvironment | null, + renderer: Renderer | null, + injector: Injector | null, + embeddedViewInjector: Injector | null, + hydrationInfo: DehydratedView | null, +): LView { + const lView = tView.blueprint.slice() as LView; + lView[HOST] = host; + lView[FLAGS] = + flags | + LViewFlags.CreationMode | + LViewFlags.Attached | + LViewFlags.FirstLViewPass | + LViewFlags.Dirty | + LViewFlags.RefreshView; + if ( + embeddedViewInjector !== null || + (parentLView && parentLView[FLAGS] & LViewFlags.HasEmbeddedViewInjector) + ) { + lView[FLAGS] |= LViewFlags.HasEmbeddedViewInjector; + } + resetPreOrderHookFlags(lView); + ngDevMode && tView.declTNode && parentLView && assertTNodeForLView(tView.declTNode, parentLView); + lView[PARENT] = lView[DECLARATION_VIEW] = parentLView; + lView[CONTEXT] = context; + lView[ENVIRONMENT] = (environment || (parentLView && parentLView[ENVIRONMENT]))!; + ngDevMode && assertDefined(lView[ENVIRONMENT], 'LViewEnvironment is required'); + lView[RENDERER] = (renderer || (parentLView && parentLView[RENDERER]))!; + ngDevMode && assertDefined(lView[RENDERER], 'Renderer is required'); + lView[INJECTOR as any] = injector || (parentLView && parentLView[INJECTOR]) || null; + lView[T_HOST] = tHostNode; + lView[ID] = getUniqueLViewId(); + lView[HYDRATION] = hydrationInfo; + lView[EMBEDDED_VIEW_INJECTOR as any] = embeddedViewInjector; + + ngDevMode && + assertEqual( + tView.type == TViewType.Embedded ? parentLView !== null : true, + true, + 'Embedded views must have parentLView', + ); + lView[DECLARATION_COMPONENT_VIEW] = + tView.type == TViewType.Embedded ? parentLView![DECLARATION_COMPONENT_VIEW] : lView; + return lView as LView; +} + +export function createComponentLView( + lView: LView, + hostTNode: TElementNode, + def: ComponentDef, +): LView { + const native = getNativeByTNode(hostTNode, lView) as RElement; + const tView = getOrCreateComponentTView(def); + + // Only component views should be added to the view tree directly. Embedded views are + // accessed through their containers because they may be removed / re-added later. + const rendererFactory = lView[ENVIRONMENT].rendererFactory; + const componentView = addToEndOfViewTree( + lView, + createLView( + lView, + tView, + null, + getInitialLViewFlagsFromDef(def), + native, + hostTNode as TElementNode, + null, + rendererFactory.createRenderer(native, def), + null, + null, + null, + ), + ); + + // Component view will always be created before any injected LContainers, + // so this is a regular element, wrap it with the component view + return (lView[hostTNode.index] = componentView); +} + +/** + * Gets the initial set of LView flags based on the component definition that the LView represents. + * @param def Component definition from which to determine the flags. + */ +export function getInitialLViewFlagsFromDef(def: ComponentDef): LViewFlags { + let flags = LViewFlags.CheckAlways; + if (def.signals) { + flags = LViewFlags.SignalView; + } else if (def.onPush) { + flags = LViewFlags.Dirty; + } + return flags; +} /** * When elements are created dynamically after a view blueprint is created (e.g. through @@ -45,3 +306,31 @@ export function allocExpando( } return allocIdx; } + +/** + * Adds LView or LContainer to the end of the current view tree. + * + * This structure will be used to traverse through nested views to remove listeners + * and call onDestroy callbacks. + * + * @param lView The view where LView or LContainer should be added + * @param adjustedHostIndex Index of the view's host node in LView[], adjusted for header + * @param lViewOrLContainer The LView or LContainer to add to the view tree + * @returns The state passed in + */ +export function addToEndOfViewTree( + lView: LView, + lViewOrLContainer: T, +): T { + // TODO(benlesh/misko): This implementation is incorrect, because it always adds the LContainer + // to the end of the queue, which means if the developer retrieves the LContainers from RNodes out + // of order, the change detection will run out of order, as the act of retrieving the the + // LContainer from the RNode is what adds it to the queue. + if (lView[CHILD_HEAD]) { + lView[CHILD_TAIL]![NEXT] = lViewOrLContainer; + } else { + lView[CHILD_HEAD] = lViewOrLContainer; + } + lView[CHILD_TAIL] = lViewOrLContainer; + return lViewOrLContainer; +} diff --git a/packages/core/src/render3/view/container.ts b/packages/core/src/render3/view/container.ts new file mode 100644 index 000000000000..e8a9e70898f6 --- /dev/null +++ b/packages/core/src/render3/view/container.ts @@ -0,0 +1,260 @@ +/** + * @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.dev/license + */ + +import {addToArray, removeFromArray} from '../../util/array_utils'; +import {assertDefined, assertEqual} from '../../util/assert'; +import {assertLContainer, assertLView} from '../assert'; +import { + CONTAINER_HEADER_OFFSET, + LContainer, + LContainerFlags, + MOVED_VIEWS, + NATIVE, +} from '../interfaces/container'; +import {TNode} from '../interfaces/node'; +import {RComment, RElement} from '../interfaces/renderer_dom'; +import {isLView} from '../interfaces/type_checks'; +import { + DECLARATION_COMPONENT_VIEW, + DECLARATION_LCONTAINER, + FLAGS, + HYDRATION, + LView, + LViewFlags, + NEXT, + PARENT, + QUERIES, + RENDERER, + T_HOST, + TView, + TVIEW, +} from '../interfaces/view'; +import { + addViewToDOM, + destroyLView, + detachMovedView, + getBeforeNodeForView, + removeViewFromDOM, +} from '../node_manipulation'; +import {updateAncestorTraversalFlagsOnAttach} from '../util/view_utils'; + +/** + * Creates a LContainer, either from a container instruction, or for a ViewContainerRef. + * + * @param hostNative The host element for the LContainer + * @param hostTNode The host TNode for the LContainer + * @param currentView The parent view of the LContainer + * @param native The native comment element + * @param isForViewContainerRef Optional a flag indicating the ViewContainerRef case + * @returns LContainer + */ +export function createLContainer( + hostNative: RElement | RComment | LView, + currentView: LView, + native: RComment, + tNode: TNode, +): LContainer { + ngDevMode && assertLView(currentView); + const lContainer: LContainer = [ + hostNative, // host native + true, // Boolean `true` in this position signifies that this is an `LContainer` + 0, // flags + currentView, // parent + null, // next + tNode, // t_host + null, // dehydrated views + native, // native, + null, // view refs + null, // moved views + ]; + ngDevMode && + assertEqual( + lContainer.length, + CONTAINER_HEADER_OFFSET, + 'Should allocate correct number of slots for LContainer header.', + ); + return lContainer; +} + +export function getLViewFromLContainer( + lContainer: LContainer, + index: number, +): LView | undefined { + const adjustedIndex = CONTAINER_HEADER_OFFSET + index; + // avoid reading past the array boundaries + if (adjustedIndex < lContainer.length) { + const lView = lContainer[adjustedIndex]; + ngDevMode && assertLView(lView); + return lView as LView; + } + return undefined; +} + +export function addLViewToLContainer( + lContainer: LContainer, + lView: LView, + index: number, + addToDOM = true, +): void { + const tView = lView[TVIEW]; + + // Insert into the view tree so the new view can be change-detected + insertView(tView, lView, lContainer, index); + + // Insert elements that belong to this view into the DOM tree + if (addToDOM) { + const beforeNode = getBeforeNodeForView(index, lContainer); + const renderer = lView[RENDERER]; + const parentRNode = renderer.parentNode(lContainer[NATIVE] as RElement | RComment); + if (parentRNode !== null) { + addViewToDOM(tView, lContainer[T_HOST], renderer, lView, parentRNode, beforeNode); + } + } + + // When in hydration mode, reset the pointer to the first child in + // the dehydrated view. This indicates that the view was hydrated and + // further attaching/detaching should work with this view as normal. + const hydrationInfo = lView[HYDRATION]; + if (hydrationInfo !== null && hydrationInfo.firstChild !== null) { + hydrationInfo.firstChild = null; + } +} + +export function removeLViewFromLContainer( + lContainer: LContainer, + index: number, +): LView | undefined { + const lView = detachView(lContainer, index); + if (lView !== undefined) { + destroyLView(lView[TVIEW], lView); + } + return lView; +} + +/** + * Detaches a view from a container. + * + * This method removes the view from the container's array of active views. It also + * removes the view's elements from the DOM. + * + * @param lContainer The container from which to detach a view + * @param removeIndex The index of the view to detach + * @returns Detached LView instance. + */ +export function detachView(lContainer: LContainer, removeIndex: number): LView | undefined { + if (lContainer.length <= CONTAINER_HEADER_OFFSET) return; + + const indexInContainer = CONTAINER_HEADER_OFFSET + removeIndex; + const viewToDetach = lContainer[indexInContainer]; + + if (viewToDetach) { + const declarationLContainer = viewToDetach[DECLARATION_LCONTAINER]; + if (declarationLContainer !== null && declarationLContainer !== lContainer) { + detachMovedView(declarationLContainer, viewToDetach); + } + + if (removeIndex > 0) { + lContainer[indexInContainer - 1][NEXT] = viewToDetach[NEXT] as LView; + } + const removedLView = removeFromArray(lContainer, CONTAINER_HEADER_OFFSET + removeIndex); + removeViewFromDOM(viewToDetach[TVIEW], viewToDetach); + + // notify query that a view has been removed + const lQueries = removedLView[QUERIES]; + if (lQueries !== null) { + lQueries.detachView(removedLView[TVIEW]); + } + + viewToDetach[PARENT] = null; + viewToDetach[NEXT] = null; + // Unsets the attached flag + viewToDetach[FLAGS] &= ~LViewFlags.Attached; + } + return viewToDetach; +} + +/** + * Inserts a view into a container. + * + * This adds the view to the container's array of active views in the correct + * position. It also adds the view's elements to the DOM if the container isn't a + * root node of another view (in that case, the view's elements will be added when + * the container's parent view is added later). + * + * @param tView The `TView' of the `LView` to insert + * @param lView The view to insert + * @param lContainer The container into which the view should be inserted + * @param index Which index in the container to insert the child view into + */ +function insertView(tView: TView, lView: LView, lContainer: LContainer, index: number) { + ngDevMode && assertLView(lView); + ngDevMode && assertLContainer(lContainer); + const indexInContainer = CONTAINER_HEADER_OFFSET + index; + const containerLength = lContainer.length; + + if (index > 0) { + // This is a new view, we need to add it to the children. + lContainer[indexInContainer - 1][NEXT] = lView; + } + if (index < containerLength - CONTAINER_HEADER_OFFSET) { + lView[NEXT] = lContainer[indexInContainer]; + addToArray(lContainer, CONTAINER_HEADER_OFFSET + index, lView); + } else { + lContainer.push(lView); + lView[NEXT] = null; + } + + lView[PARENT] = lContainer; + + // track views where declaration and insertion points are different + const declarationLContainer = lView[DECLARATION_LCONTAINER]; + if (declarationLContainer !== null && lContainer !== declarationLContainer) { + trackMovedView(declarationLContainer, lView); + } + + // notify query that a new view has been added + const lQueries = lView[QUERIES]; + if (lQueries !== null) { + lQueries.insertView(tView); + } + + updateAncestorTraversalFlagsOnAttach(lView); + // Sets the attached flag + lView[FLAGS] |= LViewFlags.Attached; +} + +/** + * Track views created from the declaration container (TemplateRef) and inserted into a + * different LContainer or attached directly to ApplicationRef. + */ +export function trackMovedView(declarationContainer: LContainer, lView: LView) { + ngDevMode && assertDefined(lView, 'LView required'); + ngDevMode && assertLContainer(declarationContainer); + const movedViews = declarationContainer[MOVED_VIEWS]; + const parent = lView[PARENT]!; + ngDevMode && assertDefined(parent, 'missing parent'); + if (isLView(parent)) { + declarationContainer[FLAGS] |= LContainerFlags.HasTransplantedViews; + } else { + const insertedComponentLView = parent[PARENT]![DECLARATION_COMPONENT_VIEW]; + ngDevMode && assertDefined(insertedComponentLView, 'Missing insertedComponentLView'); + const declaredComponentLView = lView[DECLARATION_COMPONENT_VIEW]; + ngDevMode && assertDefined(declaredComponentLView, 'Missing declaredComponentLView'); + if (declaredComponentLView !== insertedComponentLView) { + // At this point the declaration-component is not same as insertion-component; this means that + // this is a transplanted view. Mark the declared lView as having transplanted views so that + // those views can participate in CD. + declarationContainer[FLAGS] |= LContainerFlags.HasTransplantedViews; + } + } + if (movedViews === null) { + declarationContainer[MOVED_VIEWS] = [lView]; + } else { + movedViews.push(lView); + } +} diff --git a/packages/core/src/render3/view_manipulation.ts b/packages/core/src/render3/view_manipulation.ts index a7cb29671ff2..c138f58a2c60 100644 --- a/packages/core/src/render3/view_manipulation.ts +++ b/packages/core/src/render3/view_manipulation.ts @@ -13,30 +13,11 @@ import {DehydratedContainerView} from '../hydration/interfaces'; import {hasInSkipHydrationBlockFlag} from '../hydration/skip_hydration'; import {assertDefined} from '../util/assert'; -import {assertLContainer, assertLView, assertTNodeForLView} from './assert'; +import {assertLContainer, assertTNodeForLView} from './assert'; import {renderView} from './instructions/render'; -import {createLView} from './instructions/shared'; -import {CONTAINER_HEADER_OFFSET, LContainer, NATIVE} from './interfaces/container'; import {TNode} from './interfaces/node'; -import {RComment, RElement} from './interfaces/renderer_dom'; -import { - DECLARATION_LCONTAINER, - FLAGS, - HYDRATION, - LView, - LViewFlags, - QUERIES, - RENDERER, - T_HOST, - TVIEW, -} from './interfaces/view'; -import { - addViewToDOM, - destroyLView, - detachView, - getBeforeNodeForView, - insertView, -} from './node_manipulation'; +import {DECLARATION_LCONTAINER, FLAGS, LView, LViewFlags, QUERIES} from './interfaces/view'; +import {createLView} from './view/construction'; export function createAndRenderEmbeddedLView( declarationLView: LView, @@ -89,20 +70,6 @@ export function createAndRenderEmbeddedLView( } } -export function getLViewFromLContainer( - lContainer: LContainer, - index: number, -): LView | undefined { - const adjustedIndex = CONTAINER_HEADER_OFFSET + index; - // avoid reading past the array boundaries - if (adjustedIndex < lContainer.length) { - const lView = lContainer[adjustedIndex]; - ngDevMode && assertLView(lView); - return lView as LView; - } - return undefined; -} - /** * Returns whether an elements that belong to a view should be * inserted into the DOM. For client-only cases, DOM elements are @@ -118,44 +85,3 @@ export function shouldAddViewToDom( !dehydratedView || dehydratedView.firstChild === null || hasInSkipHydrationBlockFlag(tNode) ); } - -export function addLViewToLContainer( - lContainer: LContainer, - lView: LView, - index: number, - addToDOM = true, -): void { - const tView = lView[TVIEW]; - - // Insert into the view tree so the new view can be change-detected - insertView(tView, lView, lContainer, index); - - // Insert elements that belong to this view into the DOM tree - if (addToDOM) { - const beforeNode = getBeforeNodeForView(index, lContainer); - const renderer = lView[RENDERER]; - const parentRNode = renderer.parentNode(lContainer[NATIVE] as RElement | RComment); - if (parentRNode !== null) { - addViewToDOM(tView, lContainer[T_HOST], renderer, lView, parentRNode, beforeNode); - } - } - - // When in hydration mode, reset the pointer to the first child in - // the dehydrated view. This indicates that the view was hydrated and - // further attaching/detaching should work with this view as normal. - const hydrationInfo = lView[HYDRATION]; - if (hydrationInfo !== null && hydrationInfo.firstChild !== null) { - hydrationInfo.firstChild = null; - } -} - -export function removeLViewFromLContainer( - lContainer: LContainer, - index: number, -): LView | undefined { - const lView = detachView(lContainer, index); - if (lView !== undefined) { - destroyLView(lView[TVIEW], lView); - } - return lView; -} diff --git a/packages/core/src/render3/view_ref.ts b/packages/core/src/render3/view_ref.ts index dafeffafb7fc..b3fde05ce829 100644 --- a/packages/core/src/render3/view_ref.ts +++ b/packages/core/src/render3/view_ref.ts @@ -29,19 +29,14 @@ import { REACTIVE_TEMPLATE_CONSUMER, TVIEW, } from './interfaces/view'; -import { - destroyLView, - detachMovedView, - detachView, - detachViewFromDOM, - trackMovedView, -} from './node_manipulation'; +import {destroyLView, detachMovedView, detachViewFromDOM} from './node_manipulation'; import {CheckNoChangesMode} from './state'; import { markViewForRefresh, storeLViewOnDestroy, updateAncestorTraversalFlagsOnAttach, } from './util/view_utils'; +import {detachView, trackMovedView} from './view/container'; // Needed due to tsickle downleveling where multiple `implements` with classes creates // multiple @extends in Closure annotations, which is illegal. This workaround fixes diff --git a/packages/core/test/bundling/defer/bundle.golden_symbols.json b/packages/core/test/bundling/defer/bundle.golden_symbols.json index 75abfc490187..ae194b59dfde 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -433,6 +433,7 @@ "init_constants", "init_construction", "init_container", + "init_container2", "init_context", "init_context_discovery", "init_contextual", diff --git a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json index 1b03b9c61a31..c9e2e91c0908 100644 --- a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json @@ -158,6 +158,7 @@ "consumerPollProducersForChange", "context", "convertToBitFlags", + "createDirectivesInstances", "createElementRef", "createErrorClass", "createInjector", diff --git a/packages/core/test/bundling/hydration/bundle.golden_symbols.json b/packages/core/test/bundling/hydration/bundle.golden_symbols.json index aa326f5d8c18..89769930dd1d 100644 --- a/packages/core/test/bundling/hydration/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hydration/bundle.golden_symbols.json @@ -211,6 +211,7 @@ "consumerPollProducersForChange", "context", "convertToBitFlags", + "createDirectivesInstances", "createElementNode", "createElementRef", "createErrorClass", diff --git a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json index 6a70156c0a74..093411e5ff35 100644 --- a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json +++ b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json @@ -184,6 +184,7 @@ "consumerPollProducersForChange", "context", "convertToBitFlags", + "createDirectivesInstances", "createElementRef", "createErrorClass", "createInjector", diff --git a/packages/core/test/render3/di_spec.ts b/packages/core/test/render3/di_spec.ts index 7edfbb6af3b2..d949a8307500 100644 --- a/packages/core/test/render3/di_spec.ts +++ b/packages/core/test/render3/di_spec.ts @@ -7,7 +7,6 @@ */ import {Component, Directive, Self} from '@angular/core'; -import {createLView, createTView} from '@angular/core/src/render3/instructions/shared'; import {NodeInjectorOffset} from '@angular/core/src/render3/interfaces/injector'; import {TestBed} from '@angular/core/testing'; @@ -21,6 +20,7 @@ import {TNodeType} from '../../src/render3/interfaces/node'; import {HEADER_OFFSET, LViewFlags, TVIEW, TViewType} from '../../src/render3/interfaces/view'; import {enterView, leaveView} from '../../src/render3/state'; import {getOrCreateTNode} from '@angular/core/src/render3/tnode_manipulation'; +import {createLView, createTView} from '@angular/core/src/render3/view/construction'; describe('di', () => { describe('directive injection', () => { diff --git a/packages/core/test/render3/instructions/shared_spec.ts b/packages/core/test/render3/instructions/shared_spec.ts index 828a219d8176..2b0e0aab7788 100644 --- a/packages/core/test/render3/instructions/shared_spec.ts +++ b/packages/core/test/render3/instructions/shared_spec.ts @@ -6,7 +6,6 @@ * found in the LICENSE file at https://angular.dev/license */ -import {createLView, createTView} from '@angular/core/src/render3/instructions/shared'; import {TNodeType} from '@angular/core/src/render3/interfaces/node'; import { HEADER_OFFSET, @@ -24,6 +23,7 @@ import { import {MockRendererFactory} from './mock_renderer_factory'; import {createTNode} from '@angular/core/src/render3/tnode_manipulation'; +import {createLView, createTView} from '@angular/core/src/render3/view/construction'; /** * Setups a simple `LView` so that it is possible to do unit tests on instructions. diff --git a/packages/core/test/render3/matchers_spec.ts b/packages/core/test/render3/matchers_spec.ts index f56d735766fb..6077bf5badd5 100644 --- a/packages/core/test/render3/matchers_spec.ts +++ b/packages/core/test/render3/matchers_spec.ts @@ -6,13 +6,13 @@ * found in the LICENSE file at https://angular.dev/license */ -import {createTView} from '@angular/core/src/render3/instructions/shared'; import {TNodeType} from '@angular/core/src/render3/interfaces/node'; import {TViewType} from '@angular/core/src/render3/interfaces/view'; import {isShapeOf, ShapeOf} from './is_shape_of'; import {matchDomElement, matchDomText, matchObjectShape, matchTNode, matchTView} from './matchers'; import {createTNode} from '@angular/core/src/render3/tnode_manipulation'; +import {createTView} from '@angular/core/src/render3/view/construction'; describe('render3 matchers', () => { const fakeMatcherUtil = {equals: (a: any, b: any) => a === b} as jasmine.MatchersUtil; diff --git a/packages/core/test/render3/view_fixture.ts b/packages/core/test/render3/view_fixture.ts index 5576dfb7e1ef..37d5398b216b 100644 --- a/packages/core/test/render3/view_fixture.ts +++ b/packages/core/test/render3/view_fixture.ts @@ -12,7 +12,6 @@ import {stringifyElement} from '@angular/platform-browser/testing/src/browser_ut import {extractDirectiveDef} from '../../src/render3/definition'; import {refreshView} from '../../src/render3/instructions/change_detection'; import {renderView} from '../../src/render3/instructions/render'; -import {createLView, createTView} from '../../src/render3/instructions/shared'; import { DirectiveDef, DirectiveDefList, @@ -35,6 +34,7 @@ import {noop} from '../../src/util/noop'; import {getRendererFactory2} from './imported_renderer2'; import {createTNode} from '@angular/core/src/render3/tnode_manipulation'; +import {createLView, createTView} from '@angular/core/src/render3/view/construction'; /** * Fixture useful for testing operations which need `LView` / `TView` diff --git a/packages/core/test/render3/view_utils_spec.ts b/packages/core/test/render3/view_utils_spec.ts index 4252bbc97a39..38e2b1abfbcf 100644 --- a/packages/core/test/render3/view_utils_spec.ts +++ b/packages/core/test/render3/view_utils_spec.ts @@ -6,10 +6,10 @@ * found in the LICENSE file at https://angular.dev/license */ -import {createLContainer} from '@angular/core/src/render3/instructions/shared'; import {isLContainer, isLView} from '@angular/core/src/render3/interfaces/type_checks'; import {ViewFixture} from './view_fixture'; import {createTNode} from '@angular/core/src/render3/tnode_manipulation'; +import {createLContainer} from '@angular/core/src/render3/view/container'; describe('view_utils', () => { it('should verify unwrap methods (isLView and isLContainer)', () => { From b6fa69f2c06f793f08ff3899421f48c8cb26bc2f Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Tue, 18 Feb 2025 16:30:04 +0000 Subject: [PATCH 0083/1000] build: update dependency shiki to v3 (#59986) See associated pull request for more information. PR Close #59986 --- adev/shared-docs/package.json | 2 +- package.json | 2 +- yarn.lock | 100 +++++++++++++++++----------------- 3 files changed, 51 insertions(+), 53 deletions(-) diff --git a/adev/shared-docs/package.json b/adev/shared-docs/package.json index dafd62122e54..1b944af3faaa 100644 --- a/adev/shared-docs/package.json +++ b/adev/shared-docs/package.json @@ -23,7 +23,7 @@ "jsdom": "~26.0.0", "marked": "~15.0.0", "mermaid": "^11.0.0", - "shiki": "^2.0.0" + "shiki": "^3.0.0" }, "exports": { "./styles/*": { diff --git a/package.json b/package.json index b9e468f6c45f..87fca5e15c17 100644 --- a/package.json +++ b/package.json @@ -220,7 +220,7 @@ "preact-render-to-string": "^6.2.1", "prettier": "^3.0.0", "semver": "^7.3.5", - "shiki": "^2.0.0", + "shiki": "^3.0.0", "tmp": "^0.2.3", "ts-node": "^10.9.1", "tsec": "0.2.8", diff --git a/yarn.lock b/yarn.lock index 27ac1a4ed7e5..2ec19862ba1d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3839,61 +3839,59 @@ "@angular-devkit/schematics" "19.2.0-next.2" jsonc-parser "3.3.1" -"@shikijs/core@2.3.2": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-2.3.2.tgz#dcdc851e6963fe4196e2f1051302dcecce1a8706" - integrity sha512-s7vyL3LzUKm3Qwf36zRWlavX9BQMZTIq9B1almM63M5xBuSldnsTHCmsXzoF/Kyw4k7Xgas7yAyJz9VR/vcP1A== +"@shikijs/core@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-3.0.0.tgz#b962c9b9b75371308218eaf9a9f426c696cc2c6e" + integrity sha512-gSm3JQf2J2psiUn5bWokmZwnu5N0jfBtRps4CQ1B+qrFvmZCRAkMVoaxgl9qZgAFK5KisLAS3//XaMFVytYHKw== dependencies: - "@shikijs/engine-javascript" "2.3.2" - "@shikijs/engine-oniguruma" "2.3.2" - "@shikijs/types" "2.3.2" - "@shikijs/vscode-textmate" "^10.0.1" + "@shikijs/types" "3.0.0" + "@shikijs/vscode-textmate" "^10.0.2" "@types/hast" "^3.0.4" hast-util-to-html "^9.0.4" -"@shikijs/engine-javascript@2.3.2": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@shikijs/engine-javascript/-/engine-javascript-2.3.2.tgz#9be457bb1ce4c8650b3b46b0f5054d4afef48a6d" - integrity sha512-w3IEMu5HfL/OaJTsMbIfZ1HRPnWVYRANeDtmsdIIEgUOcLjzFJFQwlnkckGjKHekEzNqlMLbgB/twnfZ/EEAGg== +"@shikijs/engine-javascript@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@shikijs/engine-javascript/-/engine-javascript-3.0.0.tgz#e55423e09e27d1a33365f3ea7742609e81e25333" + integrity sha512-zoB10hTfvk1iZk1ldt6VaF+0iucQL+4TtSvTdTu5MhOeLPLEf5nZ8Wz6uxlp99y627OLalYa2z4W0iTTwb6oyA== dependencies: - "@shikijs/types" "2.3.2" - "@shikijs/vscode-textmate" "^10.0.1" + "@shikijs/types" "3.0.0" + "@shikijs/vscode-textmate" "^10.0.2" oniguruma-to-es "^3.1.0" -"@shikijs/engine-oniguruma@2.3.2": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-2.3.2.tgz#42e64b7bbbaec5e903b12718dde1f1e1738a9c66" - integrity sha512-vikMY1TroyZXUHIXbMnvY/mjtOxMn+tavcfAeQPgWS9FHcgFSUoEtywF5B5sOLb9NXb8P2vb7odkh3nj15/00A== +"@shikijs/engine-oniguruma@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-3.0.0.tgz#fcdae70f4a3e8539f8970f40bb63d0b93c1e7f4d" + integrity sha512-uM9lqwMrlPHPVcdpAN/4pAzTJah1pY7mi9f1MxG887SDkjF/tdiQK+5200Y8N5Hg125sewdMQ1K2agoAo8hDiA== dependencies: - "@shikijs/types" "2.3.2" - "@shikijs/vscode-textmate" "^10.0.1" + "@shikijs/types" "3.0.0" + "@shikijs/vscode-textmate" "^10.0.2" -"@shikijs/langs@2.3.2": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@shikijs/langs/-/langs-2.3.2.tgz#a716ac528dea9e927d7088102a132c153f8a161b" - integrity sha512-UqI6bSxFzhexIJficZLKeB1L2Sc3xoNiAV0yHpfbg5meck93du+EKQtsGbBv66Ki53XZPhnR/kYkOr85elIuFw== +"@shikijs/langs@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@shikijs/langs/-/langs-3.0.0.tgz#77b57131c36c99e0f31b4dd63aa613df33c8bc37" + integrity sha512-HBsZAukiYz7k3hzttPWa0en3PABEwK3cpxcAcERRwvwuKc5pn0Y+yPxAIYZtN9cFdtNqrbFJNhfcEu/xbG1u/A== dependencies: - "@shikijs/types" "2.3.2" + "@shikijs/types" "3.0.0" -"@shikijs/themes@2.3.2": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@shikijs/themes/-/themes-2.3.2.tgz#c117d826ce22899dea802499a7ad5a99c2de0446" - integrity sha512-QAh7D/hhfYKHibkG2tti8vxNt3ekAH5EqkXJeJbTh7FGvTCWEI7BHqNCtMdjFvZ0vav5nvUgdvA7/HI7pfsB4w== +"@shikijs/themes@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@shikijs/themes/-/themes-3.0.0.tgz#678203802fc4ca763d4f46619c70f4f3f18636a5" + integrity sha512-mz63nyVB5nXWsv5H2hifDFIThZEJ/cJhMq1/+0JjMdOuuBq2H2D1Fn8UM5yzUtEvap/ipRltv381+hsHZFs4ug== dependencies: - "@shikijs/types" "2.3.2" + "@shikijs/types" "3.0.0" -"@shikijs/types@2.3.2": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-2.3.2.tgz#d273d19a7b0c23445e07c0370f127a66400d1eb8" - integrity sha512-CBaMY+a3pepyC4SETi7+bSzO0f6hxEQJUUuS4uD7zppzjmrN4ZRtBqxaT+wOan26CR9eeJ5iBhc4qvWEwn7Eeg== +"@shikijs/types@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-3.0.0.tgz#8ab7ed0510a2d2184db846811a37d617728913eb" + integrity sha512-kh/xgZHxI6m9trVvPw+C47jyVHx190r0F5gkF+VO5vYB54UtcoPJe66dzZmK7GbJbzmtGEGbOwct/jsoPjjUqg== dependencies: - "@shikijs/vscode-textmate" "^10.0.1" + "@shikijs/vscode-textmate" "^10.0.2" "@types/hast" "^3.0.4" -"@shikijs/vscode-textmate@^10.0.1": - version "10.0.1" - resolved "https://registry.yarnpkg.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.1.tgz#d06d45b67ac5e9b0088e3f67ebd3f25c6c3d711a" - integrity sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg== +"@shikijs/vscode-textmate@^10.0.2": + version "10.0.2" + resolved "https://registry.yarnpkg.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz#a90ab31d0cc1dfb54c66a69e515bf624fa7b2224" + integrity sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg== "@sigstore/bundle@^3.1.0": version "3.1.0" @@ -15781,18 +15779,18 @@ shelljs@^0.8.5: interpret "^1.0.0" rechoir "^0.6.2" -shiki@^2.0.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-2.3.2.tgz#d13bae8403c8aec11907185b4d96746b317cf539" - integrity sha512-UZhz/gsUz7DHFbQBOJP7eXqvKyYvMGramxQiSDc83M/7OkWm6OdVHAReEc3vMLh6L6TRhgL9dvhXz9XDkCDaaw== - dependencies: - "@shikijs/core" "2.3.2" - "@shikijs/engine-javascript" "2.3.2" - "@shikijs/engine-oniguruma" "2.3.2" - "@shikijs/langs" "2.3.2" - "@shikijs/themes" "2.3.2" - "@shikijs/types" "2.3.2" - "@shikijs/vscode-textmate" "^10.0.1" +shiki@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-3.0.0.tgz#3f9007a475da0aa92820c4f32ec59a7b8f0673a9" + integrity sha512-x6MMdYN9auPGx7kMFtyKbaj65eCdetfrfkvQZwqisZLnGMnAZsZxOpcWD0ElvLPFWHOSMukVyN9Opm7TxQjnZA== + dependencies: + "@shikijs/core" "3.0.0" + "@shikijs/engine-javascript" "3.0.0" + "@shikijs/engine-oniguruma" "3.0.0" + "@shikijs/langs" "3.0.0" + "@shikijs/themes" "3.0.0" + "@shikijs/types" "3.0.0" + "@shikijs/vscode-textmate" "^10.0.2" "@types/hast" "^3.0.4" side-channel-list@^1.0.0: From 1cd3a7db83e1d05a31d23324676420b614cdabe2 Mon Sep 17 00:00:00 2001 From: Enea Jahollari Date: Mon, 12 Aug 2024 02:27:41 +0200 Subject: [PATCH 0084/1000] feat(migrations): add migration to convert templates to use self-closing tags (#57342) This schematic helps developers to convert their templates to use self-closing tags mostly as a aesthetic change. PR Close #57342 --- adev/src/app/sub-navigation-data.ts | 5 + .../content/reference/migrations/overview.md | 3 + .../reference/migrations/self-closing-tags.md | 26 ++ packages/core/schematics/BUILD.bazel | 3 + packages/core/schematics/collection.json | 6 + .../output-migration/output-migration.ts | 1 - .../self-closing-tags-migration/BUILD.bazel | 48 +++ .../self-closing-tags-migration.spec.ts | 285 ++++++++++++++++++ .../self-closing-tags-migration.ts | 161 ++++++++++ .../to-self-closing-tags.ts | 131 ++++++++ .../self-closing-tags-migration/util.ts | 46 +++ .../self-closing-tags-migration/BUILD.bazel | 29 ++ .../self-closing-tags-migration/README.md | 30 ++ .../self-closing-tags-migration/index.ts | 113 +++++++ .../self-closing-tags-migration/schema.json | 14 + packages/core/schematics/test/BUILD.bazel | 1 + .../test/self_closing_tags_migration_spec.ts | 70 +++++ packages/core/schematics/utils/BUILD.bazel | 1 + .../schematics/utils/ng_component_template.ts | 33 +- 19 files changed, 984 insertions(+), 22 deletions(-) create mode 100644 adev/src/content/reference/migrations/self-closing-tags.md create mode 100644 packages/core/schematics/migrations/self-closing-tags-migration/BUILD.bazel create mode 100644 packages/core/schematics/migrations/self-closing-tags-migration/self-closing-tags-migration.spec.ts create mode 100644 packages/core/schematics/migrations/self-closing-tags-migration/self-closing-tags-migration.ts create mode 100644 packages/core/schematics/migrations/self-closing-tags-migration/to-self-closing-tags.ts create mode 100644 packages/core/schematics/migrations/self-closing-tags-migration/util.ts create mode 100644 packages/core/schematics/ng-generate/self-closing-tags-migration/BUILD.bazel create mode 100644 packages/core/schematics/ng-generate/self-closing-tags-migration/README.md create mode 100644 packages/core/schematics/ng-generate/self-closing-tags-migration/index.ts create mode 100644 packages/core/schematics/ng-generate/self-closing-tags-migration/schema.json create mode 100644 packages/core/schematics/test/self_closing_tags_migration_spec.ts diff --git a/adev/src/app/sub-navigation-data.ts b/adev/src/app/sub-navigation-data.ts index 2aa7db92b06f..cd6f56b79f11 100644 --- a/adev/src/app/sub-navigation-data.ts +++ b/adev/src/app/sub-navigation-data.ts @@ -1233,6 +1233,11 @@ const REFERENCE_SUB_NAVIGATION_DATA: NavigationItem[] = [ path: 'reference/migrations/cleanup-unused-imports', contentPath: 'reference/migrations/cleanup-unused-imports', }, + { + label: 'Self-closing tags', + path: 'reference/migrations/self-closing-tags', + contentPath: 'reference/migrations/self-closing-tags', + }, ], }, ]; diff --git a/adev/src/content/reference/migrations/overview.md b/adev/src/content/reference/migrations/overview.md index 1804aa60f795..847cc99d6b4a 100644 --- a/adev/src/content/reference/migrations/overview.md +++ b/adev/src/content/reference/migrations/overview.md @@ -27,4 +27,7 @@ Learn about how you can migrate your existing angular project to the latest feat Clean up unused imports in your project. + + Convert component templates to use self-closing tags where possible. + diff --git a/adev/src/content/reference/migrations/self-closing-tags.md b/adev/src/content/reference/migrations/self-closing-tags.md new file mode 100644 index 000000000000..d8a103007380 --- /dev/null +++ b/adev/src/content/reference/migrations/self-closing-tags.md @@ -0,0 +1,26 @@ +# Migration to self-closing tags + +Self-closing tags are supported in Angular templates since [v16](https://blog.angular.dev/angular-v16-is-here-4d7a28ec680d#7065). . + +This schematic migrates the templates in your application to use self-closing tags. + +Run the schematic using the following command: + + + +ng generate @angular/core:self-closing-tag + + + + +#### Before + + + + + + + + + + diff --git a/packages/core/schematics/BUILD.bazel b/packages/core/schematics/BUILD.bazel index 7180546febbc..645f73f1e912 100644 --- a/packages/core/schematics/BUILD.bazel +++ b/packages/core/schematics/BUILD.bazel @@ -18,6 +18,7 @@ pkg_npm( "//packages/core/schematics/ng-generate/inject-migration:static_files", "//packages/core/schematics/ng-generate/output-migration:static_files", "//packages/core/schematics/ng-generate/route-lazy-loading:static_files", + "//packages/core/schematics/ng-generate/self-closing-tags-migration:static_files", "//packages/core/schematics/ng-generate/signal-input-migration:static_files", "//packages/core/schematics/ng-generate/signal-queries-migration:static_files", "//packages/core/schematics/ng-generate/signals:static_files", @@ -43,6 +44,7 @@ rollup_bundle( "//packages/core/schematics/ng-generate/signal-input-migration:index.ts": "signal-input-migration", "//packages/core/schematics/ng-generate/signal-queries-migration:index.ts": "signal-queries-migration", "//packages/core/schematics/ng-generate/output-migration:index.ts": "output-migration", + "//packages/core/schematics/ng-generate/self-closing-tags-migration:index.ts": "self-closing-tags-migration", "//packages/core/schematics/migrations/explicit-standalone-flag:index.ts": "explicit-standalone-flag", "//packages/core/schematics/migrations/pending-tasks:index.ts": "pending-tasks", "//packages/core/schematics/migrations/provide-initializer:index.ts": "provide-initializer", @@ -63,6 +65,7 @@ rollup_bundle( "//packages/core/schematics/ng-generate/inject-migration", "//packages/core/schematics/ng-generate/output-migration", "//packages/core/schematics/ng-generate/route-lazy-loading", + "//packages/core/schematics/ng-generate/self-closing-tags-migration", "//packages/core/schematics/ng-generate/signal-input-migration", "//packages/core/schematics/ng-generate/signal-queries-migration", "//packages/core/schematics/ng-generate/signals", diff --git a/packages/core/schematics/collection.json b/packages/core/schematics/collection.json index 1225726a17ff..0a42953afcc8 100644 --- a/packages/core/schematics/collection.json +++ b/packages/core/schematics/collection.json @@ -51,6 +51,12 @@ "description": "Removes unused imports from standalone components.", "factory": "./bundles/cleanup-unused-imports#migrate", "schema": "./ng-generate/cleanup-unused-imports/schema.json" + }, + "self-closing-tags-migration": { + "description": "Updates the components templates to use self-closing tags where possible", + "factory": "./bundles/self-closing-tags-migration#migrate", + "schema": "./ng-generate/self-closing-tags-migration/schema.json", + "aliases": ["self-closing-tag"] } } } diff --git a/packages/core/schematics/migrations/output-migration/output-migration.ts b/packages/core/schematics/migrations/output-migration/output-migration.ts index 6b8daca34462..04522b30271f 100644 --- a/packages/core/schematics/migrations/output-migration/output-migration.ts +++ b/packages/core/schematics/migrations/output-migration/output-migration.ts @@ -7,7 +7,6 @@ */ import ts from 'typescript'; -import assert from 'assert'; import { confirmAsSerializable, MigrationStats, diff --git a/packages/core/schematics/migrations/self-closing-tags-migration/BUILD.bazel b/packages/core/schematics/migrations/self-closing-tags-migration/BUILD.bazel new file mode 100644 index 000000000000..25e7b07ff687 --- /dev/null +++ b/packages/core/schematics/migrations/self-closing-tags-migration/BUILD.bazel @@ -0,0 +1,48 @@ +load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") + +ts_library( + name = "migration", + srcs = glob( + ["**/*.ts"], + exclude = ["*.spec.ts"], + ), + visibility = [ + "//packages/core/schematics/ng-generate/self-closing-tags-migration:__pkg__", + "//packages/language-service/src/refactorings:__pkg__", + ], + deps = [ + "//packages/compiler", + "//packages/compiler-cli", + "//packages/compiler-cli/private", + "//packages/compiler-cli/src/ngtsc/annotations", + "//packages/compiler-cli/src/ngtsc/annotations/directive", + "//packages/compiler-cli/src/ngtsc/file_system", + "//packages/compiler-cli/src/ngtsc/imports", + "//packages/compiler-cli/src/ngtsc/metadata", + "//packages/compiler-cli/src/ngtsc/reflection", + "//packages/core/schematics/utils", + "//packages/core/schematics/utils/tsurge", + "@npm//@types/node", + "@npm//typescript", + ], +) + +ts_library( + name = "test_lib", + testonly = True, + srcs = glob( + ["**/*.spec.ts"], + ), + deps = [ + ":migration", + "//packages/compiler-cli", + "//packages/compiler-cli/src/ngtsc/file_system/testing", + "//packages/core/schematics/utils/tsurge", + ], +) + +jasmine_node_test( + name = "test", + srcs = [":test_lib"], + env = {"FORCE_COLOR": "3"}, +) diff --git a/packages/core/schematics/migrations/self-closing-tags-migration/self-closing-tags-migration.spec.ts b/packages/core/schematics/migrations/self-closing-tags-migration/self-closing-tags-migration.spec.ts new file mode 100644 index 000000000000..17e25e1b7fcb --- /dev/null +++ b/packages/core/schematics/migrations/self-closing-tags-migration/self-closing-tags-migration.spec.ts @@ -0,0 +1,285 @@ +/** + * @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.dev/license + */ + +import {initMockFileSystem} from '@angular/compiler-cli/src/ngtsc/file_system/testing'; +import {runTsurgeMigration, diffText} from '../../utils/tsurge/testing'; +import {absoluteFrom} from '@angular/compiler-cli'; +import {SelfClosingTagsMigration} from './self-closing-tags-migration'; + +describe('self-closing tags', () => { + beforeEach(() => { + initMockFileSystem('Native'); + }); + + describe('self-closing tags migration', () => { + it('should skip dom elements', async () => { + await verifyDeclarationNoChange(``); + }); + + it('should skip custom elements with content', async () => { + await verifyDeclarationNoChange(`1`); + }); + + it('should skip already self-closing custom elements', async () => { + await verifyDeclarationNoChange(` `); + }); + + it('should migrate custom elements', async () => { + await verifyDeclaration({ + before: ``, + after: ``, + }); + }); + + it('should migrate custom elements with attributes', async () => { + await verifyDeclaration({ + before: ``, + after: ``, + }); + }); + + it('should migrate multiple custom elements in the template', async () => { + await verifyDeclaration({ + before: ``, + after: ``, + }); + }); + + it('should migrate a template that contains directives, pipes, inputs, outputs, and events', async () => { + await verifyDeclaration({ + before: ` + + `, + after: ` + + `, + }); + }); + + it('should migrate multiple cases of spacing', async () => { + await verifyDeclaration({ + before: ` `, + after: ``, + }); + + await verifyDeclaration({ + before: ` + + + + `, + after: ``, + }); + + await verifyDeclarationNoChange(` + + 123 + + `); + + await verifyDeclaration({ + before: ` + + + + + `, + after: ` + + + + `, + }); + + await verifyDeclaration({ + before: ` + + + `, + after: ` + + `, + }); + }); + + it('should migrate the template with multiple nested elements', async () => { + await verifyDeclaration({ + before: ` + + + + + + + + + + + + + `, + after: ` + + + + + + + + + + + `, + }); + }); + + it('should migrate multiple components in a file', async () => { + await verify({ + before: ` + import {Component} from '@angular/core'; + @Component({ template: '' }) + export class Cmp1 {} + + @Component({ template: '' }) + export class Cmp2 {} + `, + after: ` + import {Component} from '@angular/core'; + @Component({ template: '' }) + export class Cmp1 {} + + @Component({ template: '' }) + export class Cmp2 {} + `, + }); + }); + + it('should migrate an external template file', async () => { + const templateFileContent = ` + + + + + + + + + + `; + + const templateFileExpected = ` + + + + + + + `; + + const tsFileContent = ` + import {Component} from '@angular/core'; + @Component({ templateUrl: 'app.component.html' }) + export class AppComponent {} + `; + + const {fs} = await runTsurgeMigration(new SelfClosingTagsMigration(), [ + { + name: absoluteFrom('/app.component.ts'), + isProgramRootFile: true, + contents: tsFileContent, + }, + { + name: absoluteFrom('/app.component.html'), + contents: templateFileContent, + }, + ]); + + const componentTsFile = fs.readFile(absoluteFrom('/app.component.ts')).trim(); + const actualComponentHtmlFile = fs.readFile(absoluteFrom('/app.component.html')).trim(); + const expectedTemplate = templateFileExpected.trim(); + + // no changes should be made to the component TS file + expect(componentTsFile).toEqual(tsFileContent.trim()); + + expect(actualComponentHtmlFile) + .withContext(diffText(expectedTemplate, actualComponentHtmlFile)) + .toEqual(expectedTemplate); + }); + }); +}); + +async function verifyDeclaration(testCase: {before: string; after: string}) { + await verify({ + before: populateDeclarationTestCase(testCase.before.trim()), + after: populateExpectedResult(testCase.after.trim()), + }); +} + +async function verifyDeclarationNoChange(beforeAndAfter: string) { + await verifyDeclaration({before: beforeAndAfter, after: beforeAndAfter}); +} + +async function verify(testCase: {before: string; after: string}) { + const {fs} = await runTsurgeMigration(new SelfClosingTagsMigration(), [ + { + name: absoluteFrom('/app.component.ts'), + isProgramRootFile: true, + contents: testCase.before, + }, + ]); + + const actual = fs.readFile(absoluteFrom('/app.component.ts')).trim(); + const expected = testCase.after.trim(); + + expect(actual).withContext(diffText(expected, actual)).toEqual(expected); +} + +function populateDeclarationTestCase(declaration: string): string { + return ` + import {Component} from '@angular/core'; + @Component({ template: \`${declaration}\` }) + export class AppComponent {} + `; +} + +function populateExpectedResult(declaration: string): string { + return ` + import {Component} from '@angular/core'; + @Component({ template: \`${declaration}\` }) + export class AppComponent {} + `; +} diff --git a/packages/core/schematics/migrations/self-closing-tags-migration/self-closing-tags-migration.ts b/packages/core/schematics/migrations/self-closing-tags-migration/self-closing-tags-migration.ts new file mode 100644 index 000000000000..cc36690f520b --- /dev/null +++ b/packages/core/schematics/migrations/self-closing-tags-migration/self-closing-tags-migration.ts @@ -0,0 +1,161 @@ +/** + * @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.dev/license + */ + +import ts from 'typescript'; +import { + confirmAsSerializable, + MigrationStats, + ProgramInfo, + projectFile, + ProjectFile, + Replacement, + Serializable, + TextUpdate, + TsurgeFunnelMigration, +} from '../../utils/tsurge'; +import {NgComponentTemplateVisitor} from '../../utils/ng_component_template'; +import {migrateTemplateToSelfClosingTags} from './to-self-closing-tags'; +import {AbsoluteFsPath} from '../../../../compiler-cli'; + +export interface MigrationConfig { + /** + * Whether to migrate this component template to self-closing tags. + */ + shouldMigrate?: (containingFile: ProjectFile) => boolean; +} + +export interface SelfClosingTagsMigrationData { + file: ProjectFile; + replacementCount: number; + replacements: Replacement[]; +} + +export interface SelfClosingTagsCompilationUnitData { + tagReplacements: Array; +} + +export class SelfClosingTagsMigration extends TsurgeFunnelMigration< + SelfClosingTagsCompilationUnitData, + SelfClosingTagsCompilationUnitData +> { + constructor(private readonly config: MigrationConfig = {}) { + super(); + } + + override async analyze( + info: ProgramInfo, + ): Promise> { + const {sourceFiles, program} = info; + const typeChecker = program.getTypeChecker(); + const tagReplacements: Array = []; + + for (const sf of sourceFiles) { + ts.forEachChild(sf, (node: ts.Node) => { + if (!ts.isClassDeclaration(node)) { + return; + } + + const file = projectFile(node.getSourceFile(), info); + + if (this.config.shouldMigrate && this.config.shouldMigrate(file) === false) { + return; + } + + const templateVisitor = new NgComponentTemplateVisitor(typeChecker); + + templateVisitor.visitNode(node); + + templateVisitor.resolvedTemplates.forEach((template) => { + const {migrated, changed, replacementCount} = migrateTemplateToSelfClosingTags( + template.content, + ); + + if (changed) { + const fileToMigrate = template.inline + ? file + : projectFile(template.filePath as AbsoluteFsPath, info); + const end = template.start + template.content.length; + + const replacements = [ + prepareTextReplacement(fileToMigrate, migrated, template.start, end), + ]; + + const fileReplacements = tagReplacements.find( + (tagReplacement) => tagReplacement.file === file, + ); + + if (fileReplacements) { + fileReplacements.replacements.push(...replacements); + fileReplacements.replacementCount += replacementCount; + } else { + tagReplacements.push({file, replacements, replacementCount}); + } + } + }); + }); + } + + return confirmAsSerializable({tagReplacements}); + } + + override async combine( + unitA: SelfClosingTagsCompilationUnitData, + unitB: SelfClosingTagsCompilationUnitData, + ): Promise> { + return confirmAsSerializable({ + tagReplacements: unitA.tagReplacements.concat(unitB.tagReplacements), + }); + } + + override async globalMeta( + combinedData: SelfClosingTagsCompilationUnitData, + ): Promise> { + const globalMeta: SelfClosingTagsCompilationUnitData = { + tagReplacements: combinedData.tagReplacements, + }; + + return confirmAsSerializable(globalMeta); + } + + override async stats( + globalMetadata: SelfClosingTagsCompilationUnitData, + ): Promise { + const touchedFilesCount = globalMetadata.tagReplacements.length; + const replacementCount = globalMetadata.tagReplacements.reduce( + (acc, cur) => acc + cur.replacementCount, + 0, + ); + + return { + counters: { + touchedFilesCount, + replacementCount, + }, + }; + } + + override async migrate(globalData: SelfClosingTagsCompilationUnitData) { + return {replacements: globalData.tagReplacements.flatMap(({replacements}) => replacements)}; + } +} + +function prepareTextReplacement( + file: ProjectFile, + replacement: string, + start: number, + end: number, +): Replacement { + return new Replacement( + file, + new TextUpdate({ + position: start, + end: end, + toInsert: replacement, + }), + ); +} diff --git a/packages/core/schematics/migrations/self-closing-tags-migration/to-self-closing-tags.ts b/packages/core/schematics/migrations/self-closing-tags-migration/to-self-closing-tags.ts new file mode 100644 index 000000000000..868bb5af5601 --- /dev/null +++ b/packages/core/schematics/migrations/self-closing-tags-migration/to-self-closing-tags.ts @@ -0,0 +1,131 @@ +/** + * @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.dev/license + */ + +import { + DomElementSchemaRegistry, + Element, + RecursiveVisitor, + Text, + visitAll, +} from '@angular/compiler'; +import {parseTemplate} from './util'; + +export function migrateTemplateToSelfClosingTags(template: string): { + replacementCount: number; + migrated: string; + changed: boolean; +} { + let parsed = parseTemplate(template); + if (parsed.tree === undefined) { + return {migrated: template, changed: false, replacementCount: 0}; + } + + const visitor = new AngularElementCollector(); + visitAll(visitor, parsed.tree.rootNodes); + + let newTemplate = template; + let changedOffset = 0; + let replacementCount = 0; + + for (let element of visitor.elements) { + const {start, end, tagName} = element; + + const currentLength = newTemplate.length; + const templatePart = newTemplate.slice(start + changedOffset, end + changedOffset); + + const convertedTemplate = replaceWithSelfClosingTag(templatePart, tagName); + + // if the template has changed, replace the original template with the new one + if (convertedTemplate.length !== templatePart.length) { + newTemplate = replaceTemplate(newTemplate, convertedTemplate, start, end, changedOffset); + changedOffset += newTemplate.length - currentLength; + replacementCount++; + } + } + + return {migrated: newTemplate, changed: changedOffset !== 0, replacementCount}; +} + +function replaceWithSelfClosingTag(html: string, tagName: string) { + const pattern = new RegExp( + `<\\s*${tagName}\\s*([^>]*?(?:"[^"]*"|'[^']*'|[^'">])*)\\s*>([\\s\\S]*?)<\\s*/\\s*${tagName}\\s*>`, + 'gi', + ); + return html.replace(pattern, (_, content) => `<${tagName}${content ? ` ${content}` : ''} />`); +} + +/** + * Replace the value in the template with the new value based on the start and end position + offset + */ +function replaceTemplate( + template: string, + replaceValue: string, + start: number, + end: number, + offset: number, +) { + return template.slice(0, start + offset) + replaceValue + template.slice(end + offset); +} + +interface ElementToMigrate { + tagName: string; + start: number; + end: number; +} + +const ALL_HTML_TAGS = new DomElementSchemaRegistry().allKnownElementNames(); + +export class AngularElementCollector extends RecursiveVisitor { + readonly elements: ElementToMigrate[] = []; + + constructor() { + super(); + } + + override visitElement(element: Element) { + const isHtmlTag = ALL_HTML_TAGS.includes(element.name); + if (isHtmlTag) { + return; + } + + const hasNoContent = this.elementHasNoContent(element); + const hasNoClosingTag = this.elementHasNoClosingTag(element); + + if (hasNoContent && !hasNoClosingTag) { + this.elements.push({ + tagName: element.name, + start: element.sourceSpan.start.offset, + end: element.sourceSpan.end.offset, + }); + } + + return super.visitElement(element, null); + } + + private elementHasNoContent(element: Element) { + if (!element.children?.length) { + return true; + } + if (element.children.length === 1) { + const child = element.children[0]; + return child instanceof Text && /^\s*$/.test(child.value); + } + return false; + } + + private elementHasNoClosingTag(element: Element) { + const {startSourceSpan, endSourceSpan} = element; + if (!endSourceSpan) { + return true; + } + return ( + startSourceSpan.start.offset === endSourceSpan.start.offset && + startSourceSpan.end.offset === endSourceSpan.end.offset + ); + } +} diff --git a/packages/core/schematics/migrations/self-closing-tags-migration/util.ts b/packages/core/schematics/migrations/self-closing-tags-migration/util.ts new file mode 100644 index 000000000000..0bed1977e0c4 --- /dev/null +++ b/packages/core/schematics/migrations/self-closing-tags-migration/util.ts @@ -0,0 +1,46 @@ +/** + * @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.dev/license + */ + +import {HtmlParser, ParseTreeResult} from '@angular/compiler'; + +type MigrateError = { + type: string; + error: unknown; +}; + +interface ParseResult { + tree: ParseTreeResult | undefined; + errors: MigrateError[]; +} + +export function parseTemplate(template: string): ParseResult { + let parsed: ParseTreeResult; + try { + // Note: we use the HtmlParser here, instead of the `parseTemplate` function, because the + // latter returns an Ivy AST, not an HTML AST. The HTML AST has the advantage of preserving + // interpolated text as text nodes containing a mixture of interpolation tokens and text tokens, + // rather than turning them into `BoundText` nodes like the Ivy AST does. This allows us to + // easily get the text-only ranges without having to reconstruct the original text. + parsed = new HtmlParser().parse(template, '', { + // Allows for ICUs to be parsed. + tokenizeExpansionForms: true, + // Explicitly disable blocks so that their characters are treated as plain text. + tokenizeBlocks: true, + preserveLineEndings: true, + }); + + // Don't migrate invalid templates. + if (parsed.errors && parsed.errors.length > 0) { + const errors = parsed.errors.map((e) => ({type: 'parse', error: e})); + return {tree: undefined, errors}; + } + } catch (e: any) { + return {tree: undefined, errors: [{type: 'parse', error: e}]}; + } + return {tree: parsed, errors: []}; +} diff --git a/packages/core/schematics/ng-generate/self-closing-tags-migration/BUILD.bazel b/packages/core/schematics/ng-generate/self-closing-tags-migration/BUILD.bazel new file mode 100644 index 000000000000..88ed0defa647 --- /dev/null +++ b/packages/core/schematics/ng-generate/self-closing-tags-migration/BUILD.bazel @@ -0,0 +1,29 @@ +load("//tools:defaults.bzl", "ts_library") + +package( + default_visibility = [ + "//packages/core/schematics:__pkg__", + "//packages/core/schematics/migrations/google3:__pkg__", + "//packages/core/schematics/test:__pkg__", + ], +) + +filegroup( + name = "static_files", + srcs = ["schema.json"], +) + +ts_library( + name = "self-closing-tags-migration", + srcs = glob(["**/*.ts"]), + tsconfig = "//packages/core/schematics:tsconfig.json", + deps = [ + "//packages/compiler-cli/src/ngtsc/file_system", + "//packages/core/schematics/migrations/self-closing-tags-migration:migration", + "//packages/core/schematics/utils", + "//packages/core/schematics/utils/tsurge", + "//packages/core/schematics/utils/tsurge/helpers/angular_devkit", + "@npm//@angular-devkit/schematics", + "@npm//@types/node", + ], +) diff --git a/packages/core/schematics/ng-generate/self-closing-tags-migration/README.md b/packages/core/schematics/ng-generate/self-closing-tags-migration/README.md new file mode 100644 index 000000000000..c6b3669c3f02 --- /dev/null +++ b/packages/core/schematics/ng-generate/self-closing-tags-migration/README.md @@ -0,0 +1,30 @@ +# Self-closing tags migration +This schematic helps developers to convert component selectors in the templates to self-closing tags. +This is a purely aesthetic change and does not affect the behavior of the application. + +## How to run this migration? +The migration can be run using the following command: + +```bash +ng generate @angular/core:self-closing-tag +``` + +By default, the migration will go over the entire application. If you want to apply this migration to a subset of the files, you can pass the path argument as shown below: + +```bash +ng generate @angular/core:self-closing-tag --path src/app/sub-component +``` + +### How does it work? +The schematic will attempt to find all the places in the templates where the component selectors are used. And check if they can be converted to self-closing tags. + +Example: + +```html + + + + + +``` + diff --git a/packages/core/schematics/ng-generate/self-closing-tags-migration/index.ts b/packages/core/schematics/ng-generate/self-closing-tags-migration/index.ts new file mode 100644 index 000000000000..6b308e03a3c9 --- /dev/null +++ b/packages/core/schematics/ng-generate/self-closing-tags-migration/index.ts @@ -0,0 +1,113 @@ +/** + * @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.dev/license + */ + +import {Rule, SchematicsException} from '@angular-devkit/schematics'; + +import {getProjectTsConfigPaths} from '../../utils/project_tsconfig_paths'; +import {DevkitMigrationFilesystem} from '../../utils/tsurge/helpers/angular_devkit/devkit_filesystem'; +import {groupReplacementsByFile} from '../../utils/tsurge/helpers/group_replacements'; +import {setFileSystem} from '@angular/compiler-cli/src/ngtsc/file_system'; +import {ProjectRootRelativePath, TextUpdate} from '../../utils/tsurge'; +import {synchronouslyCombineUnitData} from '../../utils/tsurge/helpers/combine_units'; +import { + SelfClosingTagsCompilationUnitData, + SelfClosingTagsMigration, +} from '../../migrations/self-closing-tags-migration/self-closing-tags-migration'; + +interface Options { + path: string; + analysisDir: string; +} + +export function migrate(options: Options): Rule { + return async (tree, context) => { + const {buildPaths, testPaths} = await getProjectTsConfigPaths(tree); + + if (!buildPaths.length && !testPaths.length) { + throw new SchematicsException( + 'Could not find any tsconfig file. Cannot run self-closing tags migration.', + ); + } + + const fs = new DevkitMigrationFilesystem(tree); + setFileSystem(fs); + + const migration = new SelfClosingTagsMigration({ + shouldMigrate: (file) => { + return ( + file.rootRelativePath.startsWith(fs.normalize(options.path)) && + !/(^|\/)node_modules\//.test(file.rootRelativePath) + ); + }, + }); + + const unitResults: SelfClosingTagsCompilationUnitData[] = []; + const programInfos = [...buildPaths, ...testPaths].map((tsconfigPath) => { + context.logger.info(`Preparing analysis for: ${tsconfigPath}..`); + + const baseInfo = migration.createProgram(tsconfigPath, fs); + const info = migration.prepareProgram(baseInfo); + + return {info, tsconfigPath}; + }); + + // Analyze phase. Treat all projects as compilation units as + // this allows us to support references between those. + for (const {info, tsconfigPath} of programInfos) { + context.logger.info(`Scanning for component tags: ${tsconfigPath}..`); + unitResults.push(await migration.analyze(info)); + } + + context.logger.info(``); + context.logger.info(`Processing analysis data between targets..`); + context.logger.info(``); + + const combined = await synchronouslyCombineUnitData(migration, unitResults); + if (combined === null) { + context.logger.error('Migration failed unexpectedly with no analysis data'); + return; + } + + const globalMeta = await migration.globalMeta(combined); + const replacementsPerFile: Map = new Map(); + + for (const {tsconfigPath} of programInfos) { + context.logger.info(`Migrating: ${tsconfigPath}..`); + + const {replacements} = await migration.migrate(globalMeta); + const changesPerFile = groupReplacementsByFile(replacements); + + for (const [file, changes] of changesPerFile) { + if (!replacementsPerFile.has(file)) { + replacementsPerFile.set(file, changes); + } + } + } + + context.logger.info(`Applying changes..`); + for (const [file, changes] of replacementsPerFile) { + const recorder = tree.beginUpdate(file); + for (const c of changes) { + recorder + .remove(c.data.position, c.data.end - c.data.position) + .insertLeft(c.data.position, c.data.toInsert); + } + tree.commitUpdate(recorder); + } + + const { + counters: {touchedFilesCount, replacementCount}, + } = await migration.stats(globalMeta); + + context.logger.info(''); + context.logger.info(`Successfully migrated to self-closing tags 🎉`); + context.logger.info( + ` -> Migrated ${replacementCount} components to self-closing tags in ${touchedFilesCount} component files.`, + ); + }; +} diff --git a/packages/core/schematics/ng-generate/self-closing-tags-migration/schema.json b/packages/core/schematics/ng-generate/self-closing-tags-migration/schema.json new file mode 100644 index 000000000000..ac9107cf9070 --- /dev/null +++ b/packages/core/schematics/ng-generate/self-closing-tags-migration/schema.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "AngularSelfClosingTagMigration", + "title": "Angular Self Closing Tag Migration Schema", + "type": "object", + "properties": { + "path": { + "type": "string", + "description": "Path to the directory where all templates should be migrated.", + "x-prompt": "Which directory do you want to migrate?", + "default": "./" + } + } +} diff --git a/packages/core/schematics/test/BUILD.bazel b/packages/core/schematics/test/BUILD.bazel index c84f22e44092..44f3df0a8be0 100644 --- a/packages/core/schematics/test/BUILD.bazel +++ b/packages/core/schematics/test/BUILD.bazel @@ -26,6 +26,7 @@ jasmine_node_test( "//packages/core/schematics/ng-generate/inject-migration:static_files", "//packages/core/schematics/ng-generate/output-migration:static_files", "//packages/core/schematics/ng-generate/route-lazy-loading:static_files", + "//packages/core/schematics/ng-generate/self-closing-tags-migration:static_files", "//packages/core/schematics/ng-generate/signal-input-migration:static_files", "//packages/core/schematics/ng-generate/signal-queries-migration:static_files", "//packages/core/schematics/ng-generate/signals:static_files", diff --git a/packages/core/schematics/test/self_closing_tags_migration_spec.ts b/packages/core/schematics/test/self_closing_tags_migration_spec.ts new file mode 100644 index 000000000000..931dc501387c --- /dev/null +++ b/packages/core/schematics/test/self_closing_tags_migration_spec.ts @@ -0,0 +1,70 @@ +/** + * @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.dev/license + */ + +import {getSystemPath, normalize, virtualFs} from '@angular-devkit/core'; +import {TempScopedNodeJsSyncHost} from '@angular-devkit/core/node/testing'; +import {HostTree} from '@angular-devkit/schematics'; +import {SchematicTestRunner, UnitTestTree} from '@angular-devkit/schematics/testing'; +import {runfiles} from '@bazel/runfiles'; +import shx from 'shelljs'; + +describe('self-closing-tags migration', () => { + let runner: SchematicTestRunner; + let host: TempScopedNodeJsSyncHost; + let tree: UnitTestTree; + let tmpDirPath: string; + let previousWorkingDir: string; + + function writeFile(filePath: string, contents: string) { + host.sync.write(normalize(filePath), virtualFs.stringToFileBuffer(contents)); + } + + function runMigration(options?: {path?: string}) { + return runner.runSchematic('self-closing-tag', options, tree); + } + + beforeEach(() => { + runner = new SchematicTestRunner('test', runfiles.resolvePackageRelative('../collection.json')); + host = new TempScopedNodeJsSyncHost(); + tree = new UnitTestTree(new HostTree(host)); + + writeFile('/tsconfig.json', '{}'); + writeFile( + '/angular.json', + JSON.stringify({ + version: 1, + projects: {t: {root: '', architect: {build: {options: {tsConfig: './tsconfig.json'}}}}}, + }), + ); + + previousWorkingDir = shx.pwd(); + tmpDirPath = getSystemPath(host.root); + shx.cd(tmpDirPath); + }); + + afterEach(() => { + shx.cd(previousWorkingDir); + shx.rm('-r', tmpDirPath); + }); + + it('should work', async () => { + writeFile( + '/app.component.ts', + ` + import {Component} from '@angular/core'; + @Component({ template: '' }) + export class Cmp {} + `, + ); + + await runMigration(); + + const content = tree.readContent('/app.component.ts').replace(/\s+/g, ' '); + expect(content).toContain(''); + }); +}); diff --git a/packages/core/schematics/utils/BUILD.bazel b/packages/core/schematics/utils/BUILD.bazel index 00a86bc306e8..6df9eeb2f747 100644 --- a/packages/core/schematics/utils/BUILD.bazel +++ b/packages/core/schematics/utils/BUILD.bazel @@ -8,6 +8,7 @@ ts_library( deps = [ "//packages/compiler", "//packages/compiler-cli/private", + "//packages/compiler-cli/src/ngtsc/file_system", "@npm//@angular-devkit/core", "@npm//@angular-devkit/schematics", "@npm//@types/node", diff --git a/packages/core/schematics/utils/ng_component_template.ts b/packages/core/schematics/utils/ng_component_template.ts index 1322679091aa..c22847a8abb2 100644 --- a/packages/core/schematics/utils/ng_component_template.ts +++ b/packages/core/schematics/utils/ng_component_template.ts @@ -6,13 +6,12 @@ * found in the LICENSE file at https://angular.dev/license */ -import {Tree} from '@angular-devkit/schematics'; -import {dirname, relative, resolve} from 'path'; import ts from 'typescript'; import {extractAngularClassMetadata} from './extract_metadata'; import {computeLineStartsMap, getLineAndCharacterFromPosition} from './line_mappings'; import {getPropertyNameText} from './typescript/property_name'; +import {AbsoluteFsPath, getFileSystem} from '@angular/compiler-cli/src/ngtsc/file_system'; export interface ResolvedTemplate { /** Class declaration that contains this template. */ @@ -24,7 +23,7 @@ export interface ResolvedTemplate { /** Whether the given template is inline or not. */ inline: boolean; /** Path to the file that contains this template. */ - filePath: string; + filePath: string | AbsoluteFsPath; /** * Gets the character and line of a given position index in the template. * If the template is declared inline within a TypeScript source file, the line and @@ -43,11 +42,9 @@ export interface ResolvedTemplate { export class NgComponentTemplateVisitor { resolvedTemplates: ResolvedTemplate[] = []; - constructor( - public typeChecker: ts.TypeChecker, - private _basePath: string, - private _tree: Tree, - ) {} + private fs = getFileSystem(); + + constructor(public typeChecker: ts.TypeChecker) {} visitNode(node: ts.Node) { if (node.kind === ts.SyntaxKind.ClassDeclaration) { @@ -100,25 +97,19 @@ export class NgComponentTemplateVisitor { }); } if (propertyName === 'templateUrl' && ts.isStringLiteralLike(property.initializer)) { - const templateDiskPath = resolve(dirname(sourceFileName), property.initializer.text); - // TODO(devversion): Remove this when the TypeScript compiler host is fully virtual - // relying on the devkit virtual tree and not dealing with disk paths. This is blocked on - // providing common utilities for schematics/migrations, given this is done in the - // Angular CDK already: - // https://github.com/angular/components/blob/3704400ee67e0190c9783e16367587489c803ebc/src/cdk/schematics/update-tool/utils/virtual-host.ts. - const templateDevkitPath = relative(this._basePath, templateDiskPath); - - // In case the template does not exist in the file system, skip this - // external template. - if (!this._tree.exists(templateDevkitPath)) { + const absolutePath = this.fs.resolve( + this.fs.dirname(sourceFileName), + property.initializer.text, + ); + if (!this.fs.exists(absolutePath)) { return; } - const fileContent = this._tree.read(templateDevkitPath)!.toString(); + const fileContent = this.fs.readFile(absolutePath); const lineStartsMap = computeLineStartsMap(fileContent); this.resolvedTemplates.push({ - filePath: templateDiskPath, + filePath: absolutePath, container: node, content: fileContent, inline: false, From b8ad4c21170cbf956c94069b03cbc762bba584b6 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Fri, 14 Feb 2025 12:32:27 +0100 Subject: [PATCH 0085/1000] refactor(core): simplify how inputs are stored in the directive definition (#59980) Currently the values in `DirectiveDef.inputs` are either strings or arrays, depending if there are flags. This makes it a bit hard to work with, because each time it's read, the consumer needs to account for both cases. These changes rework it so the values are always an arrays. PR Close #59980 --- packages/core/src/render3/component_ref.ts | 71 ++++++++----------- packages/core/src/render3/definition.ts | 47 ++++++------ .../core/src/render3/interfaces/definition.ts | 2 +- .../core/src/render3/util/discovery_utils.ts | 23 ++---- packages/core/src/render3/view/directives.ts | 3 +- packages/core/test/render3/ivy/jit_spec.ts | 5 +- .../render3/jit/declare_component_spec.ts | 4 +- .../render3/jit/declare_directive_spec.ts | 5 +- 8 files changed, 68 insertions(+), 92 deletions(-) diff --git a/packages/core/src/render3/component_ref.ts b/packages/core/src/render3/component_ref.ts index 9cd8703f3069..093461dafb56 100644 --- a/packages/core/src/render3/component_ref.ts +++ b/packages/core/src/render3/component_ref.ts @@ -95,51 +95,40 @@ export class ComponentFactoryResolver extends AbstractComponentFactoryResolver { } } -function toRefArray( - map: DirectiveDef['inputs'], - isInputMap: true, -): ComponentFactory['inputs']; -function toRefArray( - map: DirectiveDef['outputs'], - isInput: false, -): ComponentFactory['outputs']; - -function toRefArray< - T, - IsInputMap extends boolean, - Return extends IsInputMap extends true - ? ComponentFactory['inputs'] - : ComponentFactory['outputs'], ->(map: DirectiveDef['inputs'] | DirectiveDef['outputs'], isInputMap: IsInputMap): Return { - const array: Return = [] as unknown as Return; +function toInputRefArray(map: DirectiveDef['inputs']): ComponentFactory['inputs'] { + const result: ComponentFactory['inputs'] = []; for (const publicName in map) { - if (!map.hasOwnProperty(publicName)) { - continue; - } + if (map.hasOwnProperty(publicName)) { + const value = map[publicName]; - const value = map[publicName]; - if (value === undefined) { - continue; - } + if (value !== undefined) { + const [propName, flags] = value; - const isArray = Array.isArray(value); - const propName: string = isArray ? value[0] : value; - const flags: InputFlags = isArray ? value[1] : InputFlags.None; + result.push({ + propName: propName, + templateName: publicName, + isSignal: (flags & InputFlags.SignalBased) !== 0, + }); + } + } + } + return result; +} - if (isInputMap) { - (array as ComponentFactory['inputs']).push({ - propName: propName, - templateName: publicName, - isSignal: (flags & InputFlags.SignalBased) !== 0, - }); - } else { - (array as ComponentFactory['outputs']).push({ - propName: propName, - templateName: publicName, - }); +function toOutputRefArray(map: DirectiveDef['outputs']): ComponentFactory['outputs'] { + const result: ComponentFactory['outputs'] = []; + for (const publicName in map) { + if (map.hasOwnProperty(publicName)) { + const value = map[publicName]; + if (value !== undefined) { + result.push({ + propName: value, + templateName: publicName, + }); + } } } - return array; + return result; } function verifyNotAnOrphanComponent(componentDef: ComponentDef) { @@ -229,7 +218,7 @@ export class ComponentFactory extends AbstractComponentFactory { }[] { const componentDef = this.componentDef; const inputTransforms = componentDef.inputTransforms; - const refArray = toRefArray(componentDef.inputs, true); + const refArray = toInputRefArray(componentDef.inputs); if (inputTransforms !== null) { for (const input of refArray) { @@ -243,7 +232,7 @@ export class ComponentFactory extends AbstractComponentFactory { } override get outputs(): {propName: string; templateName: string}[] { - return toRefArray(this.componentDef.outputs, false); + return toOutputRefArray(this.componentDef.outputs); } /** diff --git a/packages/core/src/render3/definition.ts b/packages/core/src/render3/definition.ts index 1314a902a253..6706f57ee272 100644 --- a/packages/core/src/render3/definition.ts +++ b/packages/core/src/render3/definition.ts @@ -508,26 +508,18 @@ export function ɵɵdefineNgModule(def: { * */ -function parseAndConvertBindingsForDefinition( - obj: DirectiveDefinition['outputs'] | undefined, -): Record; -function parseAndConvertBindingsForDefinition( - obj: DirectiveInputs | undefined, +function parseAndConvertInputsForDefinition( + obj: DirectiveDefinition['inputs'], declaredInputs: Record, -): Record; - -function parseAndConvertBindingsForDefinition( - obj: undefined | DirectiveInputs | DirectiveDefinition['outputs'], - declaredInputs?: Record, -): Record { +): Record { if (obj == null) return EMPTY_OBJ as any; - const newLookup: any = {}; + const newLookup: Record = {}; for (const minifiedKey in obj) { if (obj.hasOwnProperty(minifiedKey)) { const value = obj[minifiedKey]!; let publicName: string; let declaredName: string; - let inputFlags = InputFlags.None; + let inputFlags: InputFlags; if (Array.isArray(value)) { inputFlags = value[0]; @@ -536,17 +528,24 @@ function parseAndConvertBindingsForDefinition( } else { publicName = value; declaredName = value; + inputFlags = InputFlags.None; } - // For inputs, capture the declared name, or if some flags are set. - if (declaredInputs) { - // Perf note: An array is only allocated for the input if there are flags. - newLookup[publicName] = - inputFlags !== InputFlags.None ? [minifiedKey, inputFlags] : minifiedKey; - declaredInputs[publicName] = declaredName as string; - } else { - newLookup[publicName] = minifiedKey; - } + newLookup[publicName] = [minifiedKey, inputFlags]; + declaredInputs[publicName] = declaredName as string; + } + } + return newLookup; +} + +function parseAndConvertOutputsForDefinition( + obj: DirectiveDefinition['outputs'], +): Record { + if (obj == null) return EMPTY_OBJ as any; + const newLookup: any = {}; + for (const minifiedKey in obj) { + if (obj.hasOwnProperty(minifiedKey)) { + newLookup[obj[minifiedKey]!] = minifiedKey; } } return newLookup; @@ -643,8 +642,8 @@ function getNgDirectiveDef(directiveDefinition: DirectiveDefinition): Dire setInput: null, findHostDirectiveDefs: null, hostDirectives: null, - inputs: parseAndConvertBindingsForDefinition(directiveDefinition.inputs, declaredInputs), - outputs: parseAndConvertBindingsForDefinition(directiveDefinition.outputs), + inputs: parseAndConvertInputsForDefinition(directiveDefinition.inputs, declaredInputs), + outputs: parseAndConvertOutputsForDefinition(directiveDefinition.outputs), debugInfo: null, }; } diff --git a/packages/core/src/render3/interfaces/definition.ts b/packages/core/src/render3/interfaces/definition.ts index 0828b51a0292..5c17e4a051e0 100644 --- a/packages/core/src/render3/interfaces/definition.ts +++ b/packages/core/src/render3/interfaces/definition.ts @@ -110,7 +110,7 @@ export interface DirectiveDef { * A dictionary mapping the inputs' public name to their minified property names * (along with flags if there are any). */ - readonly inputs: {[P in keyof T]?: string | [minifiedName: string, flags: InputFlags]}; + readonly inputs: {[P in keyof T]?: [minifiedName: string, flags: InputFlags]}; /** * A dictionary mapping the private names of inputs to their transformation functions. diff --git a/packages/core/src/render3/util/discovery_utils.ts b/packages/core/src/render3/util/discovery_utils.ts index 99f397fc5cbb..031bf1bf7c6f 100644 --- a/packages/core/src/render3/util/discovery_utils.ts +++ b/packages/core/src/render3/util/discovery_utils.ts @@ -481,26 +481,13 @@ function extractInputDebugMetadata(inputs: DirectiveDef['inputs']) { const res: DirectiveDebugMetadata['inputs'] = {}; for (const key in inputs) { - if (!inputs.hasOwnProperty(key)) { - continue; - } - - const value = inputs[key]; - if (value === undefined) { - continue; - } + if (inputs.hasOwnProperty(key)) { + const value = inputs[key]; - let minifiedName: string; - - if (Array.isArray(value)) { - minifiedName = value[0]; - // flags are not used for now. - // TODO: Consider exposing flag information in discovery. - } else { - minifiedName = value; + if (value !== undefined) { + res[key] = value[0]; + } } - - res[key] = minifiedName; } return res; diff --git a/packages/core/src/render3/view/directives.ts b/packages/core/src/render3/view/directives.ts index 440300a1b493..14adeb5d3b4f 100644 --- a/packages/core/src/render3/view/directives.ts +++ b/packages/core/src/render3/view/directives.ts @@ -361,8 +361,7 @@ function captureNodeBindings( let internalName: string; let inputFlags = InputFlags.None; - // For inputs, the value might be an array capturing additional - // input flags. + // For inputs, the value is an array. For outputs it's a string. if (Array.isArray(value)) { internalName = value[0]; inputFlags = value[1]; diff --git a/packages/core/test/render3/ivy/jit_spec.ts b/packages/core/test/render3/ivy/jit_spec.ts index a3c34bc5c1cb..79fb263b5fe4 100644 --- a/packages/core/test/render3/ivy/jit_spec.ts +++ b/packages/core/test/render3/ivy/jit_spec.ts @@ -30,6 +30,7 @@ import {setCurrentInjector, ɵɵinject} from '@angular/core/src/di/injector_comp import {ɵɵdefineInjectable, ɵɵInjectorDef} from '@angular/core/src/di/interface/defs'; import {FactoryFn} from '@angular/core/src/render3/definition_factory'; import {ComponentDef, PipeDef} from '@angular/core/src/render3/interfaces/definition'; +import {InputFlags} from '@angular/core/src/render3/interfaces/input_flags'; describe('render3 jit', () => { let injector: any; @@ -379,7 +380,7 @@ describe('render3 jit', () => { } const InputCompAny = InputComp as any; - expect(InputCompAny.ɵcmp.inputs).toEqual({publicName: 'privateName'}); + expect(InputCompAny.ɵcmp.inputs).toEqual({publicName: ['privateName', InputFlags.None, null]}); expect(InputCompAny.ɵcmp.declaredInputs).toEqual({publicName: 'privateName'}); }); @@ -393,7 +394,7 @@ describe('render3 jit', () => { } const InputDirAny = InputDir as any; - expect(InputDirAny.ɵdir.inputs).toEqual({publicName: 'privateName'}); + expect(InputDirAny.ɵdir.inputs).toEqual({publicName: ['privateName', InputFlags.None, null]}); expect(InputDirAny.ɵdir.declaredInputs).toEqual({publicName: 'privateName'}); }); diff --git a/packages/core/test/render3/jit/declare_component_spec.ts b/packages/core/test/render3/jit/declare_component_spec.ts index 02c11fb10354..51e6fbaa1c54 100644 --- a/packages/core/test/render3/jit/declare_component_spec.ts +++ b/packages/core/test/render3/jit/declare_component_spec.ts @@ -71,8 +71,8 @@ describe('component declaration jit compilation', () => { expectComponentDef(def, { inputs: { - 'property': 'minifiedProperty', - 'bindingName': 'minifiedClassProperty', + 'property': ['minifiedProperty', InputFlags.None], + 'bindingName': ['minifiedClassProperty', InputFlags.None], }, declaredInputs: { 'property': 'property', diff --git a/packages/core/test/render3/jit/declare_directive_spec.ts b/packages/core/test/render3/jit/declare_directive_spec.ts index a8f291bd413e..63b6b3aea589 100644 --- a/packages/core/test/render3/jit/declare_directive_spec.ts +++ b/packages/core/test/render3/jit/declare_directive_spec.ts @@ -16,6 +16,7 @@ import { } from '../../../src/render3'; import {functionContaining} from './matcher'; +import {InputFlags} from '@angular/core/src/render3/interfaces/input_flags'; describe('directive declaration jit compilation', () => { it('should compile a minimal directive declaration', () => { @@ -54,8 +55,8 @@ describe('directive declaration jit compilation', () => { expectDirectiveDef(def, { inputs: { - 'property': 'minifiedProperty', - 'bindingName': 'minifiedClassProperty', + 'property': ['minifiedProperty', InputFlags.None], + 'bindingName': ['minifiedClassProperty', InputFlags.None], }, declaredInputs: { 'property': 'property', From 86086604f426a24ffa1c500a509283209e9224eb Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Mon, 17 Feb 2025 10:42:04 +0100 Subject: [PATCH 0086/1000] refactor(core): remove inputTransforms from definition (#59980) Removes the `inputTransform` from the directive definition since this information is already available on the `inputs`. PR Close #59980 --- packages/core/src/render3/component_ref.ts | 27 +++++++------------ packages/core/src/render3/definition.ts | 13 ++++++--- .../features/inherit_definition_feature.ts | 23 +++------------- .../features/input_transforms_feature.ts | 19 ++----------- .../instructions/write_to_directive_input.ts | 15 ++++++++--- .../core/src/render3/interfaces/definition.ts | 17 ++++-------- .../render3/jit/declare_component_spec.ts | 18 +++++-------- .../render3/jit/declare_directive_spec.ts | 4 +-- 8 files changed, 50 insertions(+), 86 deletions(-) diff --git a/packages/core/src/render3/component_ref.ts b/packages/core/src/render3/component_ref.ts index 093461dafb56..991877d653b1 100644 --- a/packages/core/src/render3/component_ref.ts +++ b/packages/core/src/render3/component_ref.ts @@ -102,13 +102,18 @@ function toInputRefArray(map: DirectiveDef['inputs']): ComponentFactory const value = map[publicName]; if (value !== undefined) { - const [propName, flags] = value; - - result.push({ + const [propName, flags, transform] = value; + const inputData: ComponentFactory['inputs'][0] = { propName: propName, templateName: publicName, isSignal: (flags & InputFlags.SignalBased) !== 0, - }); + }; + + if (transform) { + inputData.transform = transform; + } + + result.push(inputData); } } } @@ -216,19 +221,7 @@ export class ComponentFactory extends AbstractComponentFactory { isSignal: boolean; transform?: (value: any) => any; }[] { - const componentDef = this.componentDef; - const inputTransforms = componentDef.inputTransforms; - const refArray = toInputRefArray(componentDef.inputs); - - if (inputTransforms !== null) { - for (const input of refArray) { - if (inputTransforms.hasOwnProperty(input.propName)) { - input.transform = inputTransforms[input.propName]; - } - } - } - - return refArray; + return toInputRefArray(this.componentDef.inputs); } override get outputs(): {propName: string; templateName: string}[] { diff --git a/packages/core/src/render3/definition.ts b/packages/core/src/render3/definition.ts index 6706f57ee272..fb10faadffed 100644 --- a/packages/core/src/render3/definition.ts +++ b/packages/core/src/render3/definition.ts @@ -511,27 +511,33 @@ export function ɵɵdefineNgModule(def: { function parseAndConvertInputsForDefinition( obj: DirectiveDefinition['inputs'], declaredInputs: Record, -): Record { +) { if (obj == null) return EMPTY_OBJ as any; - const newLookup: Record = {}; + const newLookup: Record< + string, + [minifiedName: string, flags: InputFlags, transform: InputTransformFunction | null] + > = {}; for (const minifiedKey in obj) { if (obj.hasOwnProperty(minifiedKey)) { const value = obj[minifiedKey]!; let publicName: string; let declaredName: string; let inputFlags: InputFlags; + let transform: InputTransformFunction | null; if (Array.isArray(value)) { inputFlags = value[0]; publicName = value[1]; declaredName = value[2] ?? publicName; // declared name might not be set to save bytes. + transform = value[3] || null; } else { publicName = value; declaredName = value; inputFlags = InputFlags.None; + transform = null; } - newLookup[publicName] = [minifiedKey, inputFlags]; + newLookup[publicName] = [minifiedKey, inputFlags, transform]; declaredInputs[publicName] = declaredName as string; } } @@ -631,7 +637,6 @@ function getNgDirectiveDef(directiveDefinition: DirectiveDefinition): Dire hostAttrs: directiveDefinition.hostAttrs || null, contentQueries: directiveDefinition.contentQueries || null, declaredInputs: declaredInputs, - inputTransforms: null, inputConfig: directiveDefinition.inputs || EMPTY_OBJ, exportAs: directiveDefinition.exportAs || null, standalone: directiveDefinition.standalone ?? true, diff --git a/packages/core/src/render3/features/inherit_definition_feature.ts b/packages/core/src/render3/features/inherit_definition_feature.ts index 78a14ebb74a7..968546850dee 100644 --- a/packages/core/src/render3/features/inherit_definition_feature.ts +++ b/packages/core/src/render3/features/inherit_definition_feature.ts @@ -71,7 +71,6 @@ export function ɵɵInheritDefinitionFeature( // would've justified object creation. Unwrap them if necessary. const writeableDef = definition as WritableDef; writeableDef.inputs = maybeUnwrapEmpty(definition.inputs); - writeableDef.inputTransforms = maybeUnwrapEmpty(definition.inputTransforms); writeableDef.declaredInputs = maybeUnwrapEmpty(definition.declaredInputs); writeableDef.outputs = maybeUnwrapEmpty(definition.outputs); @@ -134,26 +133,12 @@ function mergeInputsWithTransforms(target: WritableDef, source: DirectiveDef< if (target.inputs.hasOwnProperty(key)) { continue; } + const value = source.inputs[key]; - if (value === undefined) { - continue; - } - target.inputs[key] = value; - target.declaredInputs[key] = source.declaredInputs[key]; - - // If the input is inherited, and we have a transform for it, we also inherit it. - // Note that transforms should not be inherited if the input has its own metadata - // in the `source` directive itself already (i.e. the input is re-declared/overridden). - if (source.inputTransforms !== null) { - // Note: transforms are stored with their minified names. - // Perf: only access the minified name when there are source transforms. - const minifiedName = Array.isArray(value) ? value[0] : value; - if (!source.inputTransforms.hasOwnProperty(minifiedName)) { - continue; - } - target.inputTransforms ??= {}; - target.inputTransforms[minifiedName] = source.inputTransforms[minifiedName]; + if (value !== undefined) { + target.inputs[key] = value; + target.declaredInputs[key] = source.declaredInputs[key]; } } } diff --git a/packages/core/src/render3/features/input_transforms_feature.ts b/packages/core/src/render3/features/input_transforms_feature.ts index 76aea41f1d18..bc859f84103c 100644 --- a/packages/core/src/render3/features/input_transforms_feature.ts +++ b/packages/core/src/render3/features/input_transforms_feature.ts @@ -6,8 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -import {Writable} from '../../interface/type'; -import {DirectiveDef, InputTransformFunction} from '../interfaces/definition'; +import {DirectiveDef} from '../interfaces/definition'; /** * Decorates the directive definition with support for input transform functions. @@ -18,19 +17,5 @@ import {DirectiveDef, InputTransformFunction} from '../interfaces/definition'; * @codeGenApi */ export function ɵɵInputTransformsFeature(definition: DirectiveDef): void { - const inputs = definition.inputConfig; - const inputTransforms: Record = {}; - - for (const minifiedKey in inputs) { - if (inputs.hasOwnProperty(minifiedKey)) { - // Note: the private names are used for the keys, rather than the public ones, because public - // names can be re-aliased in host directives which would invalidate the lookup. - const value = inputs[minifiedKey]; - if (Array.isArray(value) && value[3]) { - inputTransforms[minifiedKey] = value[3]; - } - } - } - - (definition as Writable>).inputTransforms = inputTransforms; + // TODO(crisbeto): remove this from the compilation } diff --git a/packages/core/src/render3/instructions/write_to_directive_input.ts b/packages/core/src/render3/instructions/write_to_directive_input.ts index c896004b6b1f..f93a20e787ef 100644 --- a/packages/core/src/render3/instructions/write_to_directive_input.ts +++ b/packages/core/src/render3/instructions/write_to_directive_input.ts @@ -24,6 +24,14 @@ export function writeToDirectiveInput( ) { const prevConsumer = setActiveConsumer(null); try { + if (ngDevMode && !def.inputs.hasOwnProperty(publicName)) { + throw new Error( + `ASSERTION ERROR: Directive ${def.type.name} does not have an input with a public name of "${publicName}"`, + ); + } + + const [privateName, flags, transform] = def.inputs[publicName]; + // If we know we are dealing with a signal input, we cache its reference // in a tree-shakable way. The input signal node can then be used for // value transform execution or actual value updates without introducing @@ -38,10 +46,9 @@ export function writeToDirectiveInput( // delegating to features like `NgOnChanges`. if (inputSignalNode !== null && inputSignalNode.transformFn !== undefined) { value = inputSignalNode.transformFn(value); - } - // If there is a decorator input transform, run it. - if ((flags & InputFlags.HasDecoratorInputTransform) !== 0) { - value = def.inputTransforms![privateName]!.call(instance, value); + } else if (transform !== null) { + // If there is a decorator input transform, run it. + value = transform.call(instance, value); } if (def.setInput !== null) { diff --git a/packages/core/src/render3/interfaces/definition.ts b/packages/core/src/render3/interfaces/definition.ts index 5c17e4a051e0..e2da569dd552 100644 --- a/packages/core/src/render3/interfaces/definition.ts +++ b/packages/core/src/render3/interfaces/definition.ts @@ -110,17 +110,10 @@ export interface DirectiveDef { * A dictionary mapping the inputs' public name to their minified property names * (along with flags if there are any). */ - readonly inputs: {[P in keyof T]?: [minifiedName: string, flags: InputFlags]}; - - /** - * A dictionary mapping the private names of inputs to their transformation functions. - * Note: the private names are used for the keys, rather than the public ones, because public - * names can be re-aliased in host directives which would invalidate the lookup. - * - * Note: Signal inputs will not have transforms captured here. This is because their - * transform function is already integrated into the `InputSignal`. - */ - readonly inputTransforms: {[classPropertyName: string]: InputTransformFunction} | null; + readonly inputs: Record< + string, + [minifiedName: string, flags: InputFlags, transform: InputTransformFunction | null] + >; /** * Contains the raw input information produced by the compiler. Can be @@ -141,7 +134,7 @@ export interface DirectiveDef { * are their aliases if any, or their original unminified property names * (as in `@Output('alias') propertyName: any;`). */ - readonly outputs: {[P in keyof T]?: string}; + readonly outputs: Record; /** * Function to create and refresh content queries associated with a given directive. diff --git a/packages/core/test/render3/jit/declare_component_spec.ts b/packages/core/test/render3/jit/declare_component_spec.ts index 51e6fbaa1c54..5123d3173789 100644 --- a/packages/core/test/render3/jit/declare_component_spec.ts +++ b/packages/core/test/render3/jit/declare_component_spec.ts @@ -71,8 +71,8 @@ describe('component declaration jit compilation', () => { expectComponentDef(def, { inputs: { - 'property': ['minifiedProperty', InputFlags.None], - 'bindingName': ['minifiedClassProperty', InputFlags.None], + 'property': ['minifiedProperty', InputFlags.None, null], + 'bindingName': ['minifiedClassProperty', InputFlags.None, null], }, declaredInputs: { 'property': 'property', @@ -97,10 +97,11 @@ describe('component declaration jit compilation', () => { expectComponentDef(def, { inputs: { - 'bindingName': ['minifiedClassProperty', InputFlags.HasDecoratorInputTransform], - }, - inputTransforms: { - 'minifiedClassProperty': transformFn, + 'bindingName': [ + 'minifiedClassProperty', + InputFlags.HasDecoratorInputTransform, + transformFn, + ], }, declaredInputs: { 'bindingName': 'classProperty', @@ -587,7 +588,6 @@ type ComponentDefExpectations = jasmine.Expected< | 'onPush' | 'styles' | 'data' - | 'inputTransforms' > > & { directives: Type[] | null; @@ -608,7 +608,6 @@ function expectComponentDef( template: jasmine.any(Function), inputs: {}, declaredInputs: {}, - inputTransforms: null, outputs: {}, features: null, hostAttrs: null, @@ -634,9 +633,6 @@ function expectComponentDef( expect(actual.template).withContext('template').toEqual(expectation.template); expect(actual.inputs).withContext('inputs').toEqual(expectation.inputs); expect(actual.declaredInputs).withContext('declaredInputs').toEqual(expectation.declaredInputs); - expect(actual.inputTransforms) - .withContext('inputTransforms') - .toEqual(expectation.inputTransforms); expect(actual.outputs).withContext('outputs').toEqual(expectation.outputs); expect(actual.features).withContext('features').toEqual(expectation.features); expect(actual.hostAttrs).withContext('hostAttrs').toEqual(expectation.hostAttrs); diff --git a/packages/core/test/render3/jit/declare_directive_spec.ts b/packages/core/test/render3/jit/declare_directive_spec.ts index 63b6b3aea589..45d36518f390 100644 --- a/packages/core/test/render3/jit/declare_directive_spec.ts +++ b/packages/core/test/render3/jit/declare_directive_spec.ts @@ -55,8 +55,8 @@ describe('directive declaration jit compilation', () => { expectDirectiveDef(def, { inputs: { - 'property': ['minifiedProperty', InputFlags.None], - 'bindingName': ['minifiedClassProperty', InputFlags.None], + 'property': ['minifiedProperty', InputFlags.None, null], + 'bindingName': ['minifiedClassProperty', InputFlags.None, null], }, declaredInputs: { 'property': 'property', From db530856a86d7a9e958ee3489e4a83103d0a61ea Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Mon, 17 Feb 2025 10:52:25 +0100 Subject: [PATCH 0087/1000] refactor(compiler): remove input transforms feature (#59980) An earlier refactor made the `InputTransformsFeature` a no-op so these changes remove the code that was generating it. PR Close #59980 --- .../input_transform_definition.js | 3 +- .../signal_inputs/mixed_input_types.js | 4 +- .../compiler-cli/test/ngtsc/ngtsc_spec.ts | 40 ------------------- .../compiler/src/render3/r3_identifiers.ts | 5 --- .../compiler/src/render3/view/compiler.ts | 7 ---- .../core/src/core_render3_private_export.ts | 1 - .../features/input_transforms_feature.ts | 21 ---------- packages/core/src/render3/index.ts | 2 - packages/core/src/render3/jit/environment.ts | 1 - .../router/bundle.golden_symbols.json | 1 - .../render3/jit/declare_component_spec.ts | 2 - 11 files changed, 3 insertions(+), 84 deletions(-) delete mode 100644 packages/core/src/render3/features/input_transforms_feature.ts diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_input_outputs/input_transform_definition.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_input_outputs/input_transform_definition.js index 05cdaa533f81..03db26e98d42 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_input_outputs/input_transform_definition.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_input_outputs/input_transform_definition.js @@ -4,6 +4,5 @@ MyDirective.ɵdir = /*@__PURE__*/ $r3$.ɵɵdefineDirective({ functionDeclarationInput: [2, "functionDeclarationInput", "functionDeclarationInput", toNumber], inlineFunctionInput: [2, "inlineFunctionInput", "inlineFunctionInput", (value, _) => value ? 1 : 0] }, - standalone: false, - features: [$r3$.ɵɵInputTransformsFeature]… + … }); diff --git a/packages/compiler-cli/test/compliance/test_cases/signal_inputs/mixed_input_types.js b/packages/compiler-cli/test/compliance/test_cases/signal_inputs/mixed_input_types.js index 7742cba47436..65d84a9877c8 100644 --- a/packages/compiler-cli/test/compliance/test_cases/signal_inputs/mixed_input_types.js +++ b/packages/compiler-cli/test/compliance/test_cases/signal_inputs/mixed_input_types.js @@ -7,6 +7,6 @@ TestDir.ɵdir = /* @__PURE__ */ $r3$.ɵɵdefineDirective({ decoratorInput: "decoratorInput", decoratorInputWithAlias: [0, "publicNameDecorator", "decoratorInputWithAlias"], decoratorInputWithTransformAndAlias: [2, "publicNameDecorator2", "decoratorInputWithTransformAndAlias", convertToBoolean] - }, + } … -}); \ No newline at end of file +}); diff --git a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts index 150598fe6760..349efb927ba1 100644 --- a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts +++ b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts @@ -10482,7 +10482,6 @@ runInEachFileSystem((os: string) => { const dtsContents = env.getContents('test.d.ts'); expect(jsContents).toContain('inputs: { value: [2, "value", "value", toNumber] }'); - expect(jsContents).toContain('features: [i0.ɵɵInputTransformsFeature]'); expect(dtsContents).toContain('static ngAcceptInputType_value: boolean | string;'); }); @@ -10507,7 +10506,6 @@ runInEachFileSystem((os: string) => { const dtsContents = env.getContents('test.d.ts'); expect(jsContents).toContain('inputs: { value: [2, "value", "value", toNumber] }'); - expect(jsContents).toContain('features: [i0.ɵɵInputTransformsFeature]'); expect(dtsContents).toContain('static ngAcceptInputType_value: boolean | string;'); }); @@ -10541,7 +10539,6 @@ runInEachFileSystem((os: string) => { const dtsContents = env.getContents('test.d.ts'); expect(jsContents).toContain('inputs: { value: [2, "value", "value", toNumber] }'); - expect(jsContents).toContain('features: [i0.ɵɵInputTransformsFeature]'); expect(dtsContents).toContain('import * as i1 from "./types"'); expect(dtsContents).toContain( 'static ngAcceptInputType_value: boolean | string | i1.GenericWrapper;', @@ -10588,7 +10585,6 @@ runInEachFileSystem((os: string) => { const dtsContents = env.getContents('test.d.ts'); expect(jsContents).toContain('inputs: { value: [2, "value", "value", toNumber] }'); - expect(jsContents).toContain('features: [i0.ɵɵInputTransformsFeature]'); expect(dtsContents).toContain('import * as i1 from "./types"'); expect(dtsContents).toContain('import * as i2 from "./other-types"'); expect(dtsContents).toContain( @@ -10630,7 +10626,6 @@ runInEachFileSystem((os: string) => { expect(jsContents).toContain(`import { externalToNumber } from 'external';`); expect(jsContents).toContain('inputs: { value: [2, "value", "value", externalToNumber] }'); - expect(jsContents).toContain('features: [i0.ɵɵInputTransformsFeature]'); expect(dtsContents).toContain('import * as i1 from "external";'); expect(dtsContents).toContain('static ngAcceptInputType_value: i1.ExternalToNumberType;'); }); @@ -10668,7 +10663,6 @@ runInEachFileSystem((os: string) => { expect(jsContents).toContain( 'inputs: { value: [2, "value", "value", (value) => value ? 1 : 0] }', ); - expect(jsContents).toContain('features: [i0.ɵɵInputTransformsFeature]'); expect(dtsContents).toContain('import * as i1 from "external";'); expect(dtsContents).toContain('static ngAcceptInputType_value: i1.ExternalToNumberType;'); }); @@ -10701,7 +10695,6 @@ runInEachFileSystem((os: string) => { const dtsContents = env.getContents('test.d.ts'); expect(jsContents).toContain('inputs: { value: [2, "value", "value", toBoolean] }'); - expect(jsContents).toContain('features: [i0.ɵɵInputTransformsFeature]'); expect(dtsContents).toContain( `static ngAcceptInputType_value: boolean | "" | "true" | "false";`, ); @@ -10728,7 +10721,6 @@ runInEachFileSystem((os: string) => { const dtsContents = env.getContents('test.d.ts'); expect(jsContents).toContain('inputs: { value: [2, "value", "value", toNumber] }'); - expect(jsContents).toContain('features: [i0.ɵɵInputTransformsFeature]'); expect(dtsContents).toContain('static ngAcceptInputType_value: boolean | string;'); }); @@ -10753,40 +10745,9 @@ runInEachFileSystem((os: string) => { const dtsContents = env.getContents('test.d.ts'); expect(jsContents).toContain('inputs: { value: [2, "value", "value", toNumber] }'); - expect(jsContents).toContain('features: [i0.ɵɵInputTransformsFeature]'); expect(dtsContents).toContain('static ngAcceptInputType_value: unknown;'); }); - it('should insert the InputTransformsFeature before the InheritDefinitionFeature', () => { - env.write( - '/test.ts', - ` - import {Directive, Input} from '@angular/core'; - - function toNumber(value: boolean | string) { return 1; } - - @Directive() - export class ParentDir {} - - @Directive() - export class Dir extends ParentDir { - @Input({transform: toNumber}) value!: number; - } - `, - ); - - env.driveMain(); - - const jsContents = env.getContents('test.js'); - const dtsContents = env.getContents('test.d.ts'); - - expect(jsContents).toContain('inputs: { value: [2, "value", "value", toNumber] }'); - expect(jsContents).toContain( - 'features: [i0.ɵɵInputTransformsFeature, i0.ɵɵInheritDefinitionFeature]', - ); - expect(dtsContents).toContain('static ngAcceptInputType_value: boolean | string;'); - }); - it('should compile an input with using an ambient type in the transform function', () => { env.write( 'node_modules/external/index.d.ts', @@ -10818,7 +10779,6 @@ runInEachFileSystem((os: string) => { expect(jsContents).toContain( 'inputs: { element: [2, "element", "element", coerceElement] }', ); - expect(jsContents).toContain('features: [i0.ɵɵInputTransformsFeature]'); expect(dtsContents).toContain( 'static ngAcceptInputType_element: HTMLElement | i0.ElementRef;', ); diff --git a/packages/compiler/src/render3/r3_identifiers.ts b/packages/compiler/src/render3/r3_identifiers.ts index 21972cd6e79e..58e806b15916 100644 --- a/packages/compiler/src/render3/r3_identifiers.ts +++ b/packages/compiler/src/render3/r3_identifiers.ts @@ -551,11 +551,6 @@ export class Identifiers { moduleName: CORE, }; - static InputTransformsFeatureFeature: o.ExternalReference = { - name: 'ɵɵInputTransformsFeature', - moduleName: CORE, - }; - static ExternalStylesFeature: o.ExternalReference = { name: 'ɵɵExternalStylesFeature', moduleName: CORE, diff --git a/packages/compiler/src/render3/view/compiler.ts b/packages/compiler/src/render3/view/compiler.ts index 2a7c4a5806ee..092c0d7d5ffe 100644 --- a/packages/compiler/src/render3/view/compiler.ts +++ b/packages/compiler/src/render3/view/compiler.ts @@ -114,7 +114,6 @@ function addFeatures( const providers = meta.providers; const viewProviders = (meta as R3ComponentMetadata).viewProviders; - const inputKeys = Object.keys(meta.inputs); if (providers || viewProviders) { const args = [providers || new o.LiteralArrayExpr([])]; @@ -123,12 +122,6 @@ function addFeatures( } features.push(o.importExpr(R3.ProvidersFeature).callFn(args)); } - for (const key of inputKeys) { - if (meta.inputs[key].transformFunction !== null) { - features.push(o.importExpr(R3.InputTransformsFeatureFeature)); - break; - } - } // Note: host directives feature needs to be inserted before the // inheritance feature to ensure the correct execution order. if (meta.hostDirectives?.length) { diff --git a/packages/core/src/core_render3_private_export.ts b/packages/core/src/core_render3_private_export.ts index 3f153e2e0fd2..13931f653329 100644 --- a/packages/core/src/core_render3_private_export.ts +++ b/packages/core/src/core_render3_private_export.ts @@ -116,7 +116,6 @@ export { ɵɵi18nPostprocess, ɵɵi18nStart, ɵɵInheritDefinitionFeature, - ɵɵInputTransformsFeature, ɵɵinjectAttribute, ɵɵInjectorDeclaration, ɵɵinvalidFactory, diff --git a/packages/core/src/render3/features/input_transforms_feature.ts b/packages/core/src/render3/features/input_transforms_feature.ts deleted file mode 100644 index bc859f84103c..000000000000 --- a/packages/core/src/render3/features/input_transforms_feature.ts +++ /dev/null @@ -1,21 +0,0 @@ -/** - * @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.dev/license - */ - -import {DirectiveDef} from '../interfaces/definition'; - -/** - * Decorates the directive definition with support for input transform functions. - * - * If the directive uses inheritance, the feature should be included before the - * `InheritDefinitionFeature` to ensure that the `inputTransforms` field is populated. - * - * @codeGenApi - */ -export function ɵɵInputTransformsFeature(definition: DirectiveDef): void { - // TODO(crisbeto): remove this from the compilation -} diff --git a/packages/core/src/render3/index.ts b/packages/core/src/render3/index.ts index 5e5841bc23ac..2f67313fa04f 100644 --- a/packages/core/src/render3/index.ts +++ b/packages/core/src/render3/index.ts @@ -9,7 +9,6 @@ import {ɵɵdefineComponent, ɵɵdefineDirective, ɵɵdefineNgModule, ɵɵdefine import {ɵɵCopyDefinitionFeature} from './features/copy_definition_feature'; import {ɵɵHostDirectivesFeature} from './features/host_directives_feature'; import {ɵɵInheritDefinitionFeature} from './features/inherit_definition_feature'; -import {ɵɵInputTransformsFeature} from './features/input_transforms_feature'; import {ɵɵNgOnChangesFeature} from './features/ng_onchanges_feature'; import {ɵɵProvidersFeature} from './features/providers_feature'; import {ɵɵExternalStylesFeature} from './features/external_styles_feature'; @@ -246,7 +245,6 @@ export { ɵɵHostDirectivesFeature, ɵɵInheritDefinitionFeature, ɵɵInjectorDeclaration, - ɵɵInputTransformsFeature, ɵɵNgModuleDeclaration, ɵɵNgOnChangesFeature, ɵɵPipeDeclaration, diff --git a/packages/core/src/render3/jit/environment.ts b/packages/core/src/render3/jit/environment.ts index 9f5ef0eccbd0..5c0a8120465c 100644 --- a/packages/core/src/render3/jit/environment.ts +++ b/packages/core/src/render3/jit/environment.ts @@ -49,7 +49,6 @@ export const angularCoreEnv: {[name: string]: unknown} = (() => ({ 'ɵɵProvidersFeature': r3.ɵɵProvidersFeature, 'ɵɵCopyDefinitionFeature': r3.ɵɵCopyDefinitionFeature, 'ɵɵInheritDefinitionFeature': r3.ɵɵInheritDefinitionFeature, - 'ɵɵInputTransformsFeature': r3.ɵɵInputTransformsFeature, 'ɵɵExternalStylesFeature': r3.ɵɵExternalStylesFeature, 'ɵɵnextContext': r3.ɵɵnextContext, 'ɵɵnamespaceHTML': r3.ɵɵnamespaceHTML, diff --git a/packages/core/test/bundling/router/bundle.golden_symbols.json b/packages/core/test/bundling/router/bundle.golden_symbols.json index 4c29fe53c30f..ba26417aede3 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -728,7 +728,6 @@ "{isArray:isArray2}", "{isArray:isArray}", "ɵEmptyOutletComponent", - "ɵɵInputTransformsFeature", "ɵɵNgOnChangesFeature", "ɵɵattribute", "ɵɵdefineComponent", diff --git a/packages/core/test/render3/jit/declare_component_spec.ts b/packages/core/test/render3/jit/declare_component_spec.ts index 5123d3173789..d0278a9bed6a 100644 --- a/packages/core/test/render3/jit/declare_component_spec.ts +++ b/packages/core/test/render3/jit/declare_component_spec.ts @@ -23,7 +23,6 @@ import { AttributeMarker, ComponentDef, ɵɵInheritDefinitionFeature, - ɵɵInputTransformsFeature, ɵɵNgOnChangesFeature, } from '../../../src/render3'; @@ -106,7 +105,6 @@ describe('component declaration jit compilation', () => { declaredInputs: { 'bindingName': 'classProperty', }, - features: [ɵɵInputTransformsFeature], }); }); From 5acdc6bd59f5fd4c71f11c4cc642a29ecbe94438 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Mon, 17 Feb 2025 11:27:46 +0100 Subject: [PATCH 0088/1000] refactor(core): remove flags from TNode.inputs (#59980) The input flags are already available on the definition so we don't need to store them on `TNode.inputs`. PR Close #59980 --- .../core/src/render3/instructions/shared.ts | 28 ++++++------ .../instructions/write_to_directive_input.ts | 2 - packages/core/src/render3/interfaces/node.ts | 7 ++- packages/core/src/render3/view/directives.ts | 45 +++---------------- 4 files changed, 24 insertions(+), 58 deletions(-) diff --git a/packages/core/src/render3/instructions/shared.ts b/packages/core/src/render3/instructions/shared.ts index a5f8fb988e66..f848149e6382 100644 --- a/packages/core/src/render3/instructions/shared.ts +++ b/packages/core/src/render3/instructions/shared.ts @@ -25,7 +25,6 @@ import {attachPatchData} from '../context_discovery'; import {getNodeInjectable, getOrCreateNodeInjectorForNode} from '../di'; import {throwMultipleComponentError} from '../errors'; import {ComponentDef, ComponentTemplate, DirectiveDef, RenderFlags} from '../interfaces/definition'; -import {InputFlags} from '../interfaces/input_flags'; import { InitialInputData, InitialInputs, @@ -76,6 +75,7 @@ import {createComponentLView} from '../view/construction'; import {selectIndexInternal} from './advance'; import {handleUnknownPropertyError, isPropertyValid, matchingSchemas} from './element_validation'; import {writeToDirectiveInput} from './write_to_directive_input'; +import {InputFlags} from '../interfaces/input_flags'; export function executeTemplate( tView: TView, @@ -270,7 +270,7 @@ export function elementPropertyInternal( setInputsForProperty(tView, lView, dataValue, propName, value); if (isComponentHost(tNode)) markDirtyIfOnPush(lView, tNode.index); if (ngDevMode) { - setNgReflectProperties(lView, element, tNode.type, dataValue, value); + setNgReflectProperties(lView, tView, element, tNode.type, dataValue, value); } } else if (tNode.type & TNodeType.AnyRNode) { propName = mapPropName(propName); @@ -331,6 +331,7 @@ function setNgReflectProperty( export function setNgReflectProperties( lView: LView, + tView: TView, element: RElement | RComment, type: TNodeType, dataValue: NodeInputBindings[string], @@ -342,11 +343,14 @@ export function setNgReflectProperties( * i+0: directive instance index * i+1: privateName * - * e.g. [0, 'change', 'change-minified'] + * e.g. [0, 'change'] * we want to set the reflected property with the privateName: dataValue[i+1] */ - for (let i = 0; i < dataValue.length; i += 3) { - setNgReflectProperty(lView, element, type, dataValue[i + 1] as string, value); + for (let i = 0; i < dataValue.length; i += 2) { + const index = dataValue[i] as number; + const lookupName = dataValue[i + 1] as string; + const def = tView.data[index] as DirectiveDef; + setNgReflectProperty(lView, element, type, def.inputs[lookupName][0], value); } } } @@ -535,7 +539,7 @@ function setInputsFromAttrs( const flags = initialInputs[i++] as InputFlags; const value = initialInputs[i++] as string; - writeToDirectiveInput(def, instance, publicName, privateName, flags, value); + writeToDirectiveInput(def, instance, privateName, value); if (ngDevMode) { const nativeElement = getNativeByTNode(tNode, lView) as RElement; @@ -638,14 +642,12 @@ export function setInputsForProperty( publicName: string, value: unknown, ): void { - for (let i = 0; i < inputs.length; ) { - const index = inputs[i++] as number; - const privateName = inputs[i++] as string; - const flags = inputs[i++] as InputFlags; - const instance = lView[index]; + for (let i = 0; i < inputs.length; i += 2) { + const index = inputs[i] as number; ngDevMode && assertIndexInRange(lView, index); + const privateName = inputs[i + 1] as string; + const instance = lView[index]; const def = tView.data[index] as DirectiveDef; - - writeToDirectiveInput(def, instance, publicName, privateName, flags, value); + writeToDirectiveInput(def, instance, privateName, value); } } diff --git a/packages/core/src/render3/instructions/write_to_directive_input.ts b/packages/core/src/render3/instructions/write_to_directive_input.ts index f93a20e787ef..1151183f1894 100644 --- a/packages/core/src/render3/instructions/write_to_directive_input.ts +++ b/packages/core/src/render3/instructions/write_to_directive_input.ts @@ -18,8 +18,6 @@ export function writeToDirectiveInput( def: DirectiveDef, instance: T, publicName: string, - privateName: string, - flags: InputFlags, value: unknown, ) { const prevConsumer = setActiveConsumer(null); diff --git a/packages/core/src/render3/interfaces/node.ts b/packages/core/src/render3/interfaces/node.ts index b106d0627038..8371d40feb57 100644 --- a/packages/core/src/render3/interfaces/node.ts +++ b/packages/core/src/render3/interfaces/node.ts @@ -9,8 +9,8 @@ import {KeyValueArray} from '../../util/array_utils'; import {TStylingRange} from '../interfaces/styling'; import {AttributeMarker} from './attribute_marker'; -import {InputFlags} from './input_flags'; import {TIcu} from './i18n'; +import {InputFlags} from './input_flags'; import {CssSelector} from './projection'; import {RNode} from './renderer_dom'; import type {LView, TView} from './view'; @@ -793,16 +793,15 @@ export type NodeOutputBindings = Record; * * i+0: directive instance index * i+1: privateName - * i+2: input flags * * e.g. * ``` * { - * "publicName": [0, 'change-minified', ] + * "publicName": [0, 'change-minified'] * } * ``` */ -export type NodeInputBindings = Record; +export type NodeInputBindings = Record; /** * This array contains information about input properties that diff --git a/packages/core/src/render3/view/directives.ts b/packages/core/src/render3/view/directives.ts index 14adeb5d3b4f..0210e76c96b3 100644 --- a/packages/core/src/render3/view/directives.ts +++ b/packages/core/src/render3/view/directives.ts @@ -27,7 +27,6 @@ import type { HostDirectiveDefs, } from '../interfaces/definition'; import {NodeInjectorFactory} from '../interfaces/injector'; -import {InputFlags} from '../interfaces/input_flags'; import { InitialInputData, InitialInputs, @@ -46,6 +45,7 @@ import {isInlineTemplate} from '../node_selector_matcher'; import {NO_CHANGE} from '../tokens'; import {mergeHostAttrs} from '../util/attrs_utils'; import {allocExpando} from './construction'; +import {InputFlags} from '../interfaces/input_flags'; export type DirectiveMatcherStrategy = ( tView: TView, @@ -358,17 +358,6 @@ function captureNodeBindings( bindingsResult ??= {}; - let internalName: string; - let inputFlags = InputFlags.None; - - // For inputs, the value is an array. For outputs it's a string. - if (Array.isArray(value)) { - internalName = value[0]; - inputFlags = value[1]; - } else { - internalName = value; - } - // If there are no host directive mappings, we want to remap using the alias map from the // definition itself. If there is an alias map, it has two functions: // 1. It serves as an allowlist of bindings that are exposed by the host directives. Only the @@ -390,52 +379,30 @@ function captureNodeBindings( bindingsResult as NodeInputBindings, directiveIndex, finalPublicName, - internalName, - inputFlags, + publicName, ); } else { addPropertyBinding( bindingsResult as NodeOutputBindings, directiveIndex, finalPublicName, - internalName, + value as string, ); } } return bindingsResult; } -function addPropertyBinding( - bindings: NodeInputBindings, - directiveIndex: number, - publicName: string, - internalName: string, - inputFlags: InputFlags, -): void; -function addPropertyBinding( - bindings: NodeOutputBindings, - directiveIndex: number, - publicName: string, - internalName: string, -): void; - function addPropertyBinding( bindings: NodeInputBindings | NodeOutputBindings, directiveIndex: number, publicName: string, - internalName: string, - inputFlags?: InputFlags, + lookupName: string, ) { - let values: (typeof bindings)[typeof publicName]; - if (bindings.hasOwnProperty(publicName)) { - (values = bindings[publicName]).push(directiveIndex, internalName); + bindings[publicName].push(directiveIndex, lookupName); } else { - values = bindings[publicName] = [directiveIndex, internalName]; - } - - if (inputFlags !== undefined) { - (values as NodeInputBindings[typeof publicName]).push(inputFlags); + bindings[publicName] = [directiveIndex, lookupName]; } } From 6a7fd11386c604465846b19a2524d6c3de10eaf3 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Mon, 17 Feb 2025 16:23:49 +0100 Subject: [PATCH 0089/1000] refactor(core): simplify InitialInputs data structure (#59980) Reworks the `InitialInputs` data structure to only store a public name and initial value, resulting in less memory usage and making it easier to work with. PR Close #59980 --- packages/core/src/render3/instructions/shared.ts | 12 +++++------- packages/core/src/render3/interfaces/node.ts | 7 +++---- packages/core/src/render3/view/directives.ts | 12 +++--------- 3 files changed, 11 insertions(+), 20 deletions(-) diff --git a/packages/core/src/render3/instructions/shared.ts b/packages/core/src/render3/instructions/shared.ts index f848149e6382..b67b684ca1ad 100644 --- a/packages/core/src/render3/instructions/shared.ts +++ b/packages/core/src/render3/instructions/shared.ts @@ -533,17 +533,15 @@ function setInputsFromAttrs( ): void { const initialInputs: InitialInputs | null = initialInputData![directiveIndex]; if (initialInputs !== null) { - for (let i = 0; i < initialInputs.length; ) { - const publicName = initialInputs[i++] as string; - const privateName = initialInputs[i++] as string; - const flags = initialInputs[i++] as InputFlags; - const value = initialInputs[i++] as string; + for (let i = 0; i < initialInputs.length; i += 2) { + const lookupName = initialInputs[i]; + const value = initialInputs[i + 1]; - writeToDirectiveInput(def, instance, privateName, value); + writeToDirectiveInput(def, instance, lookupName, value); if (ngDevMode) { const nativeElement = getNativeByTNode(tNode, lView) as RElement; - setNgReflectProperty(lView, nativeElement, tNode.type, privateName, value); + setNgReflectProperty(lView, nativeElement, tNode.type, lookupName, value); } } } diff --git a/packages/core/src/render3/interfaces/node.ts b/packages/core/src/render3/interfaces/node.ts index 8371d40feb57..ccdf62315adb 100644 --- a/packages/core/src/render3/interfaces/node.ts +++ b/packages/core/src/render3/interfaces/node.ts @@ -811,9 +811,8 @@ export type NodeInputBindings = Record; * * Within each sub-array: * - * i+0: attribute name - * i+1: minified/internal input name - * i+2: initial value + * i+0: public name + * i+1: initial value * * If a directive on a node does not have any input properties * that should be set from attributes, its index is set to null @@ -834,7 +833,7 @@ export type InitialInputData = (InitialInputs | null)[]; * * e.g. ['role-min', 'minified-input', 'button'] */ -export type InitialInputs = (string | InputFlags)[]; +export type InitialInputs = string[]; /** * Type representing a set of TNodes that can have local refs (`#foo`) placed on them. diff --git a/packages/core/src/render3/view/directives.ts b/packages/core/src/render3/view/directives.ts index 0210e76c96b3..d126782d8ead 100644 --- a/packages/core/src/render3/view/directives.ts +++ b/packages/core/src/render3/view/directives.ts @@ -444,20 +444,14 @@ function generateInitialInputs( if (typeof attrName === 'number') break; if (inputs.hasOwnProperty(attrName as string)) { - if (inputsToStore === null) inputsToStore = []; - // Find the input's public name from the input store. Note that we can be found easier // through the directive def, but we want to do it using the inputs store so that it can // account for host directive aliases. const inputConfig = inputs[attrName as string]; - for (let j = 0; j < inputConfig.length; j += 3) { + for (let j = 0; j < inputConfig.length; j += 2) { if (inputConfig[j] === directiveIndex) { - inputsToStore.push( - attrName as string, - inputConfig[j + 1] as string, - inputConfig[j + 2] as InputFlags, - attrs[i + 1] as string, - ); + inputsToStore ??= []; + inputsToStore.push(inputConfig[j + 1] as string, attrs[i + 1] as string); // A directive can't have multiple inputs with the same name so we can break here. break; } From 1b0fdc7eb1872ca33729280a693c2ffabf833879 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Mon, 17 Feb 2025 15:42:59 +0100 Subject: [PATCH 0090/1000] refactor(core): avoid unnecessary lookup when writing inputs (#59980) Currently we resolve the DOM node when writing inputs up-front, because it's necessary for the `ng-reflect-` attributes. Since the attributes are dev-mode-only, we can move the resolution into the function that writes them so we can avoid the resolution when it's not used. PR Close #59980 --- .../core/src/render3/instructions/shared.ts | 42 +++++++------------ 1 file changed, 14 insertions(+), 28 deletions(-) diff --git a/packages/core/src/render3/instructions/shared.ts b/packages/core/src/render3/instructions/shared.ts index b67b684ca1ad..bc3be21ea458 100644 --- a/packages/core/src/render3/instructions/shared.ts +++ b/packages/core/src/render3/instructions/shared.ts @@ -263,16 +263,16 @@ export function elementPropertyInternal( nativeOnly: boolean, ): void { ngDevMode && assertNotSame(value, NO_CHANGE as any, 'Incoming value should never be NO_CHANGE.'); - const element = getNativeByTNode(tNode, lView) as RElement | RComment; let inputData = tNode.inputs; let dataValue: NodeInputBindings[typeof propName] | undefined; if (!nativeOnly && inputData != null && (dataValue = inputData[propName])) { setInputsForProperty(tView, lView, dataValue, propName, value); if (isComponentHost(tNode)) markDirtyIfOnPush(lView, tNode.index); if (ngDevMode) { - setNgReflectProperties(lView, tView, element, tNode.type, dataValue, value); + setNgReflectProperties(lView, tView, tNode, dataValue, value); } } else if (tNode.type & TNodeType.AnyRNode) { + const element = getNativeByTNode(tNode, lView) as RElement | RComment; propName = mapPropName(propName); if (ngDevMode) { @@ -305,17 +305,12 @@ export function markDirtyIfOnPush(lView: LView, viewIndex: number): void { } } -function setNgReflectProperty( - lView: LView, - element: RElement | RComment, - type: TNodeType, - attrName: string, - value: any, -) { +function setNgReflectProperty(lView: LView, tNode: TNode, attrName: string, value: any) { + const element = getNativeByTNode(tNode, lView) as RElement | RComment; const renderer = lView[RENDERER]; attrName = normalizeDebugBindingName(attrName); const debugValue = normalizeDebugBindingValue(value); - if (type & TNodeType.AnyRNode) { + if (tNode.type & TNodeType.AnyRNode) { if (value == null) { renderer.removeAttribute(element as RElement, attrName); } else { @@ -332,25 +327,17 @@ function setNgReflectProperty( export function setNgReflectProperties( lView: LView, tView: TView, - element: RElement | RComment, - type: TNodeType, - dataValue: NodeInputBindings[string], + tNode: TNode, + inputConfig: NodeInputBindings[string], value: any, ) { - if (type & (TNodeType.AnyRNode | TNodeType.Container)) { - /** - * dataValue is an array containing runtime input or output names for the directives: - * i+0: directive instance index - * i+1: privateName - * - * e.g. [0, 'change'] - * we want to set the reflected property with the privateName: dataValue[i+1] - */ - for (let i = 0; i < dataValue.length; i += 2) { - const index = dataValue[i] as number; - const lookupName = dataValue[i + 1] as string; + if (tNode.type & (TNodeType.AnyRNode | TNodeType.Container)) { + // Note: we set the private name of the input as the reflected property, not the public one. + for (let i = 0; i < inputConfig.length; i += 2) { + const index = inputConfig[i] as number; + const lookupName = inputConfig[i + 1] as string; const def = tView.data[index] as DirectiveDef; - setNgReflectProperty(lView, element, type, def.inputs[lookupName][0], value); + setNgReflectProperty(lView, tNode, def.inputs[lookupName][0], value); } } } @@ -540,8 +527,7 @@ function setInputsFromAttrs( writeToDirectiveInput(def, instance, lookupName, value); if (ngDevMode) { - const nativeElement = getNativeByTNode(tNode, lView) as RElement; - setNgReflectProperty(lView, nativeElement, tNode.type, lookupName, value); + setNgReflectProperty(lView, tNode, def.inputs[lookupName][0], value); } } } From 9c6a0e5f017b15617e4656473abeb7d94d916459 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Mon, 17 Feb 2025 15:49:54 +0100 Subject: [PATCH 0091/1000] refactor(core): add assertion to avoid writes to directive factories (#59980) Attempting to write to directive inputs before the directive is created can lead to subtle issues that won't necessarily trigger errors. These changes add an assertion to catch such issues earlier. PR Close #59980 --- .../instructions/write_to_directive_input.ts | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/packages/core/src/render3/instructions/write_to_directive_input.ts b/packages/core/src/render3/instructions/write_to_directive_input.ts index 1151183f1894..8e9101c53a05 100644 --- a/packages/core/src/render3/instructions/write_to_directive_input.ts +++ b/packages/core/src/render3/instructions/write_to_directive_input.ts @@ -13,6 +13,7 @@ import {InputSignalNode} from '../../authoring/input/input_signal_node'; import {applyValueToInputField} from '../apply_value_input_field'; import {DirectiveDef} from '../interfaces/definition'; import {InputFlags} from '../interfaces/input_flags'; +import {isFactory} from '../interfaces/injector'; export function writeToDirectiveInput( def: DirectiveDef, @@ -22,10 +23,21 @@ export function writeToDirectiveInput( ) { const prevConsumer = setActiveConsumer(null); try { - if (ngDevMode && !def.inputs.hasOwnProperty(publicName)) { - throw new Error( - `ASSERTION ERROR: Directive ${def.type.name} does not have an input with a public name of "${publicName}"`, - ); + if (ngDevMode) { + if (!def.inputs.hasOwnProperty(publicName)) { + throw new Error( + `ASSERTION ERROR: Directive ${def.type.name} does not have an input with a public name of "${publicName}"`, + ); + } + + // Usually we resolve the directive instance using `LView[someIndex]` before writing to an + // input, however if the read happens to early, the `LView[someIndex]` might actually be a + // `NodeInjectorFactory`. Check for this specific case here since it can break in subtle ways. + if (isFactory(instance)) { + throw new Error( + `ASSERTION ERROR: Cannot write input to factory for type ${def.type.name}. Directive has not been created yet.`, + ); + } } const [privateName, flags, transform] = def.inputs[publicName]; From 86610f7bad11e8062f1c4e6c54ec74830091c4a8 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Mon, 17 Feb 2025 16:32:29 +0100 Subject: [PATCH 0092/1000] build: update bundle goldens (#59980) Updates the bundle goldens to account for the latest changes. PR Close #59980 --- .../animations-standalone/bundle.golden_symbols.json | 4 ++-- .../core/test/bundling/animations/bundle.golden_symbols.json | 4 ++-- .../test/bundling/cyclic_import/bundle.golden_symbols.json | 4 ++-- packages/core/test/bundling/defer/bundle.golden_symbols.json | 5 ++--- .../test/bundling/forms_reactive/bundle.golden_symbols.json | 4 ++-- .../forms_template_driven/bundle.golden_symbols.json | 4 ++-- .../test/bundling/hello_world/bundle.golden_symbols.json | 1 - .../core/test/bundling/hydration/bundle.golden_symbols.json | 4 ++-- .../core/test/bundling/router/bundle.golden_symbols.json | 4 ++-- .../bundling/standalone_bootstrap/bundle.golden_symbols.json | 4 ++-- packages/core/test/bundling/todo/bundle.golden_symbols.json | 4 ++-- 11 files changed, 20 insertions(+), 22 deletions(-) diff --git a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json index b71bc1acb0d3..3278bee674e3 100644 --- a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json @@ -423,7 +423,8 @@ "onEnter", "onLeave", "optimizeGroupPlayer", - "parseAndConvertBindingsForDefinition", + "parseAndConvertInputsForDefinition", + "parseAndConvertOutputsForDefinition", "parseTimelineCommand", "performanceMarkFeature", "processInjectorTypesWithProviders", @@ -476,7 +477,6 @@ "style", "throwProviderNotFoundError", "timeoutProvider", - "toRefArray", "transition", "uniqueIdCounter", "unregisterLView", diff --git a/packages/core/test/bundling/animations/bundle.golden_symbols.json b/packages/core/test/bundling/animations/bundle.golden_symbols.json index d6543d5d1d7f..010c8351028d 100644 --- a/packages/core/test/bundling/animations/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations/bundle.golden_symbols.json @@ -448,7 +448,8 @@ "onLeave", "optimizeGroupPlayer", "optionsReducer", - "parseAndConvertBindingsForDefinition", + "parseAndConvertInputsForDefinition", + "parseAndConvertOutputsForDefinition", "parseTimelineCommand", "platformBrowser", "platformCore", @@ -502,7 +503,6 @@ "style", "throwProviderNotFoundError", "timeoutProvider", - "toRefArray", "transition", "uniqueIdCounter", "unregisterLView", diff --git a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json index 0d0b59d20915..0938daf6c0c9 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -363,7 +363,8 @@ "onEnter", "onLeave", "optionsReducer", - "parseAndConvertBindingsForDefinition", + "parseAndConvertInputsForDefinition", + "parseAndConvertOutputsForDefinition", "platformBrowser", "platformCore", "processInjectorTypesWithProviders", @@ -408,7 +409,6 @@ "stringifyCSSSelector", "throwProviderNotFoundError", "timeoutProvider", - "toRefArray", "uniqueIdCounter", "unregisterLView", "unwrapRNode", diff --git a/packages/core/test/bundling/defer/bundle.golden_symbols.json b/packages/core/test/bundling/defer/bundle.golden_symbols.json index ae194b59dfde..0f3258d1eb68 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -562,7 +562,6 @@ "init_input_flags", "init_input_signal", "init_input_signal_node", - "init_input_transforms_feature", "init_instructions", "init_interfaces", "init_interfaces2", @@ -821,7 +820,8 @@ "observable", "onEnter", "onLeave", - "parseAndConvertBindingsForDefinition", + "parseAndConvertInputsForDefinition", + "parseAndConvertOutputsForDefinition", "performanceMarkFeature", "populateDehydratedViewsInLContainer", "processInjectorTypesWithProviders", @@ -876,7 +876,6 @@ "stringifyCSSSelector", "throwProviderNotFoundError", "timeoutProvider", - "toRefArray", "trackMovedView", "triggerDeferBlock", "uniqueIdCounter", diff --git a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json index 1271c8ea5569..1cd2cf7fa946 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -538,7 +538,8 @@ "onLeave", "operate", "optionsReducer", - "parseAndConvertBindingsForDefinition", + "parseAndConvertInputsForDefinition", + "parseAndConvertOutputsForDefinition", "performanceMarkFeature", "pickAsyncValidators", "pickValidators", @@ -615,7 +616,6 @@ "throwProviderNotFoundError", "timeoutProvider", "toObservable", - "toRefArray", "toTStylingRange", "trackByIdentity", "trackMovedView", diff --git a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json index 0f671d56cf11..f740eb959b50 100644 --- a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json @@ -527,7 +527,8 @@ "onLeave", "operate", "optionsReducer", - "parseAndConvertBindingsForDefinition", + "parseAndConvertInputsForDefinition", + "parseAndConvertOutputsForDefinition", "performanceMarkFeature", "pickAsyncValidators", "pickValidators", @@ -608,7 +609,6 @@ "throwProviderNotFoundError", "timeoutProvider", "toObservable", - "toRefArray", "toTStylingRange", "trackByIdentity", "trackMovedView", diff --git a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json index c9e2e91c0908..4953bf3df1d9 100644 --- a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json @@ -329,7 +329,6 @@ "stringifyCSSSelector", "throwProviderNotFoundError", "timeoutProvider", - "toRefArray", "uniqueIdCounter", "unregisterLView", "unwrapRNode", diff --git a/packages/core/test/bundling/hydration/bundle.golden_symbols.json b/packages/core/test/bundling/hydration/bundle.golden_symbols.json index 89769930dd1d..6eb935e5d63d 100644 --- a/packages/core/test/bundling/hydration/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hydration/bundle.golden_symbols.json @@ -387,7 +387,8 @@ "onEnter", "onLeave", "operate", - "parseAndConvertBindingsForDefinition", + "parseAndConvertInputsForDefinition", + "parseAndConvertOutputsForDefinition", "performanceMarkFeature", "populateDehydratedViewsInLContainerImpl", "processInjectorTypesWithProviders", @@ -440,7 +441,6 @@ "subscribeOn", "throwProviderNotFoundError", "timeoutProvider", - "toRefArray", "transferCacheInterceptorFn", "uniqueIdCounter", "unregisterLView", diff --git a/packages/core/test/bundling/router/bundle.golden_symbols.json b/packages/core/test/bundling/router/bundle.golden_symbols.json index ba26417aede3..accd406f8f70 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -620,7 +620,8 @@ "onLeave", "operate", "paramCompareMap", - "parseAndConvertBindingsForDefinition", + "parseAndConvertInputsForDefinition", + "parseAndConvertOutputsForDefinition", "pathCompareMap", "pipeFromArray", "policy", @@ -704,7 +705,6 @@ "throwInvalidWriteToSignalErrorFn", "throwProviderNotFoundError", "timeoutProvider", - "toRefArray", "trackMovedView", "tree", "trustedScriptURLFromStringBypass", diff --git a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json index 093411e5ff35..8e83a787b862 100644 --- a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json +++ b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json @@ -325,7 +325,8 @@ "observable", "onEnter", "onLeave", - "parseAndConvertBindingsForDefinition", + "parseAndConvertInputsForDefinition", + "parseAndConvertOutputsForDefinition", "processInjectorTypesWithProviders", "producerMarkClean", "producerRemoveLiveConsumerAtIndex", @@ -365,7 +366,6 @@ "stringifyCSSSelector", "throwProviderNotFoundError", "timeoutProvider", - "toRefArray", "uniqueIdCounter", "unregisterLView", "unwrapRNode", diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index aa1e72fa09a2..59bd110a7e98 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -434,7 +434,8 @@ "onEnter", "onLeave", "optionsReducer", - "parseAndConvertBindingsForDefinition", + "parseAndConvertInputsForDefinition", + "parseAndConvertOutputsForDefinition", "platformBrowser", "platformCore", "processInjectorTypesWithProviders", @@ -488,7 +489,6 @@ "stringifyCSSSelector", "throwProviderNotFoundError", "timeoutProvider", - "toRefArray", "toTStylingRange", "trackByIdentity", "trackMovedView", From f41437e6f5e5ad445e7b9e46e60cf3c6f41f0b74 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Tue, 18 Feb 2025 18:03:10 +0100 Subject: [PATCH 0093/1000] refactor(core): simplify serialization of inputs and outputs (#59980) Simplifies the functions that serialize inputs/outputs for the `ComponentFactory` type. PR Close #59980 --- packages/core/src/render3/component_ref.ts | 46 ++++++---------------- 1 file changed, 12 insertions(+), 34 deletions(-) diff --git a/packages/core/src/render3/component_ref.ts b/packages/core/src/render3/component_ref.ts index 991877d653b1..88bcd36dcc48 100644 --- a/packages/core/src/render3/component_ref.ts +++ b/packages/core/src/render3/component_ref.ts @@ -96,44 +96,22 @@ export class ComponentFactoryResolver extends AbstractComponentFactoryResolver { } function toInputRefArray(map: DirectiveDef['inputs']): ComponentFactory['inputs'] { - const result: ComponentFactory['inputs'] = []; - for (const publicName in map) { - if (map.hasOwnProperty(publicName)) { - const value = map[publicName]; - - if (value !== undefined) { - const [propName, flags, transform] = value; - const inputData: ComponentFactory['inputs'][0] = { - propName: propName, - templateName: publicName, - isSignal: (flags & InputFlags.SignalBased) !== 0, - }; - - if (transform) { - inputData.transform = transform; - } - - result.push(inputData); - } + return Object.keys(map).map((name) => { + const [propName, flags, transform] = map[name]; + const inputData: ComponentFactory['inputs'][0] = { + propName: propName, + templateName: name, + isSignal: (flags & InputFlags.SignalBased) !== 0, + }; + if (transform) { + inputData.transform = transform; } - } - return result; + return inputData; + }); } function toOutputRefArray(map: DirectiveDef['outputs']): ComponentFactory['outputs'] { - const result: ComponentFactory['outputs'] = []; - for (const publicName in map) { - if (map.hasOwnProperty(publicName)) { - const value = map[publicName]; - if (value !== undefined) { - result.push({ - propName: value, - templateName: publicName, - }); - } - } - } - return result; + return Object.keys(map).map((name) => ({propName: map[name], templateName: name})); } function verifyNotAnOrphanComponent(componentDef: ComponentDef) { From cf36951f8327d461a3ad4bf65d12bb16cf9a9e4b Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Tue, 18 Feb 2025 12:42:48 +0100 Subject: [PATCH 0094/1000] fix(forms): Fix typing on `FormRecord`. (#59993) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Priori to this change, `ɵRawValue` of a `FormRecord` returned a `Partial`. This commit fixes it. fixes #59985 PR Close #59993 --- goldens/public-api/forms/index.api.md | 2 +- packages/forms/src/model/form_group.ts | 2 +- packages/forms/test/typed_integration_spec.ts | 39 +++++++++++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/goldens/public-api/forms/index.api.md b/goldens/public-api/forms/index.api.md index 4c54cd86d0f2..52d149b932fa 100644 --- a/goldens/public-api/forms/index.api.md +++ b/goldens/public-api/forms/index.api.md @@ -556,7 +556,7 @@ export interface FormRecord { emitEvent?: boolean; }): void; setValue(value: { - [key: string]: ɵValue; + [key: string]: ɵRawValue; }, options?: { onlySelf?: boolean; emitEvent?: boolean; diff --git a/packages/forms/src/model/form_group.ts b/packages/forms/src/model/form_group.ts index 9841893df00e..2d6e1885c42f 100644 --- a/packages/forms/src/model/form_group.ts +++ b/packages/forms/src/model/form_group.ts @@ -769,7 +769,7 @@ export interface FormRecord { * See `FormGroup#setValue` for additional information. */ setValue( - value: {[key: string]: ɵValue}, + value: {[key: string]: ɵRawValue}, options?: { onlySelf?: boolean; emitEvent?: boolean; diff --git a/packages/forms/test/typed_integration_spec.ts b/packages/forms/test/typed_integration_spec.ts index c66f220a8412..fc515b4cb493 100644 --- a/packages/forms/test/typed_integration_spec.ts +++ b/packages/forms/test/typed_integration_spec.ts @@ -9,6 +9,7 @@ // These tests mainly check the types of strongly typed form controls, which is generally enforced // at compile time. +import {ɵRawValue} from '@angular/forms'; import {FormBuilder, NonNullableFormBuilder, UntypedFormBuilder} from '../src/form_builder'; import { AbstractControl, @@ -728,6 +729,44 @@ describe('Typed Class', () => { c.reset({c: 42, d: 0}); c.removeControl('c'); }); + + it('should only accept non-partial values', () => { + const fr = new FormRecord; bar: FormControl}>>({ + group1: new FormGroup({ + foo: new FormControl(42, {nonNullable: true}), + bar: new FormControl(42, {nonNullable: true}), + }), + }); + + type ValueParam = Parameters[0]; + + // This should error if the typing allows partial values + const value: ValueParam = { + // @ts-expect-error + group1: { + foo: 42, + // bar value is missing + }, + }; + + type RecordRawValue = ɵRawValue; + const rawValue: RecordRawValue = { + // @ts-expect-error + group1: { + foo: 42, + // bar value is missing + }, + }; + + expect(() => + fr.setValue({ + // @ts-expect-error + group1: { + foo: 42, + }, + }), + ).toThrowError(/NG01002: Must supply a value for form control/); + }); }); describe('FormArray', () => { From 5a2cc6c3907547657463be1eebbf860278e5fdc6 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Tue, 18 Feb 2025 20:11:49 +0000 Subject: [PATCH 0095/1000] build: update actions/cache digest to 0c907a7 (#60002) See associated pull request for more information. PR Close #60002 --- .github/actions/yarn-install/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/yarn-install/action.yml b/.github/actions/yarn-install/action.yml index 3dd8d7ed6595..aa61149af1ac 100644 --- a/.github/actions/yarn-install/action.yml +++ b/.github/actions/yarn-install/action.yml @@ -4,7 +4,7 @@ description: 'Installs the dependencies using Yarn' runs: using: 'composite' steps: - - uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4 + - uses: actions/cache@0c907a75c2c80ebcb7f088228285e798b750cf8f # v4 with: path: | ./node_modules/ From c056fb9df9a444fc0e4cc233717075d00c968a3f Mon Sep 17 00:00:00 2001 From: Miles Malerba Date: Tue, 18 Feb 2025 23:25:06 +0000 Subject: [PATCH 0096/1000] ci: add mmalerba to pullapprove (#60005) Add mmalerba to pullapprove config PR Close #60005 --- .pullapprove.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.pullapprove.yml b/.pullapprove.yml index bd5e0bb8e865..49869975dcd3 100644 --- a/.pullapprove.yml +++ b/.pullapprove.yml @@ -133,6 +133,7 @@ groups: - devversion - kirjs - JoostK + - mmalerba # ========================================================= # Framework: General (most code in our packages) @@ -175,6 +176,7 @@ groups: - ~jelbourn - thePunderWoman - pkozlowski-opensource + - mmalerba # ========================================================= # Framework: Security-sensitive files which require extra review @@ -285,6 +287,7 @@ groups: - mgechev - MarkTechson - kirjs + - mmalerba # ========================================================= # Angular DevTools @@ -391,6 +394,7 @@ groups: - thePunderWoman - pkozlowski-opensource - kirjs + - mmalerba - ~iteriani - ~tbondwilkinson - ~rahatarmanahmed @@ -420,6 +424,7 @@ groups: - ~jelbourn - thePunderWoman - pkozlowski-opensource + - mmalerba reviews: request: 2 # Request reviews from 2 people required: 1 # Require that 1 person approve From 4298bf199b4329044eebe4c00fc419f46762d190 Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Fri, 20 Dec 2024 00:40:58 +0100 Subject: [PATCH 0097/1000] docs(docs-infra): remove unused examples (#59252) PR Close #59252 --- .../examples/router/e2e/src/app.e2e-spec.ts | 191 ------------------ .../admin-dashboard.component.1.html | 1 - .../admin-dashboard.component.1.ts | 28 --- .../admin-dashboard.component.css | 0 .../admin-dashboard.component.html | 10 - .../admin-dashboard.component.ts | 36 ---- .../src/app/admin/admin-routing.module.1.ts | 35 ---- .../src/app/admin/admin-routing.module.2.ts | 40 ---- .../src/app/admin/admin-routing.module.3.ts | 38 ---- .../src/app/admin/admin-routing.module.ts | 37 ---- .../router/src/app/admin/admin.module.ts | 21 -- .../src/app/admin/admin/admin.component.css | 22 -- .../src/app/admin/admin/admin.component.html | 8 - .../src/app/admin/admin/admin.component.ts | 10 - .../manage-crises/manage-crises.component.css | 0 .../manage-crises.component.html | 1 - .../manage-crises/manage-crises.component.ts | 10 - .../manage-heroes/manage-heroes.component.css | 0 .../manage-heroes.component.html | 1 - .../manage-heroes/manage-heroes.component.ts | 10 - .../examples/router/src/app/animations.ts | 24 --- .../router/src/app/app-routing.module.1.ts | 27 --- .../router/src/app/app-routing.module.10.ts | 51 ----- .../router/src/app/app-routing.module.11.ts | 30 --- .../router/src/app/app-routing.module.2.ts | 31 --- .../router/src/app/app-routing.module.3.ts | 34 ---- .../router/src/app/app-routing.module.4.ts | 28 --- .../router/src/app/app-routing.module.5.ts | 39 ---- .../router/src/app/app-routing.module.6.ts | 53 ----- .../router/src/app/app-routing.module.7.ts | 11 - .../router/src/app/app-routing.module.8.ts | 21 -- .../router/src/app/app-routing.module.9.ts | 28 --- .../router/src/app/app-routing.module.ts | 44 ---- .../router/src/app/app.component.1.ts | 10 - .../router/src/app/app.component.2.html | 9 - .../router/src/app/app.component.2.ts | 24 --- .../router/src/app/app.component.3.ts | 43 ---- .../router/src/app/app.component.4.html | 15 -- .../router/src/app/app.component.4.ts | 15 -- .../router/src/app/app.component.5.html | 12 -- .../router/src/app/app.component.6.html | 13 -- .../router/src/app/app.component.7.html | 10 - .../router/src/app/app.component.8.html | 26 --- .../examples/router/src/app/app.component.css | 3 - .../router/src/app/app.component.html | 15 -- .../examples/router/src/app/app.component.ts | 20 -- .../examples/router/src/app/app.module.0.ts | 41 ---- .../examples/router/src/app/app.module.1.ts | 48 ----- .../examples/router/src/app/app.module.2.ts | 17 -- .../examples/router/src/app/app.module.3.ts | 37 ---- .../examples/router/src/app/app.module.4.ts | 41 ---- .../examples/router/src/app/app.module.5.ts | 30 --- .../examples/router/src/app/app.module.6.ts | 22 -- .../examples/router/src/app/app.module.7.ts | 38 ---- .../examples/router/src/app/app.module.8.ts | 15 -- .../examples/router/src/app/app.module.ts | 51 ----- .../src/app/auth/auth-routing.module.ts | 14 -- .../router/src/app/auth/auth.guard.1.ts | 7 - .../router/src/app/auth/auth.guard.2.ts | 19 -- .../router/src/app/auth/auth.guard.3.ts | 15 -- .../router/src/app/auth/auth.guard.4.ts | 27 --- .../router/src/app/auth/auth.guard.ts | 26 --- .../router/src/app/auth/auth.module.ts | 12 -- .../router/src/app/auth/auth.service.ts | 26 --- .../src/app/auth/login/login.component.1.ts | 46 ----- .../src/app/auth/login/login.component.css | 0 .../src/app/auth/login/login.component.html | 6 - .../src/app/auth/login/login.component.ts | 55 ----- .../router/src/app/can-deactivate.guard.1.ts | 25 --- .../router/src/app/can-deactivate.guard.ts | 11 - .../compose-message.component.css | 6 - .../compose-message.component.html | 17 -- .../compose-message.component.ts | 42 ---- .../crisis-center-home.component.css | 0 .../crisis-center-home.component.html | 1 - .../crisis-center-home.component.ts | 10 - .../crisis-center-routing.module.1.ts | 41 ---- .../crisis-center-routing.module.2.ts | 43 ---- .../crisis-center-routing.module.3.ts | 39 ---- .../crisis-center-routing.module.4.ts | 46 ----- .../crisis-center-routing.module.ts | 46 ----- .../app/crisis-center/crisis-center.module.ts | 22 -- .../crisis-center/crisis-center.component.css | 0 .../crisis-center.component.html | 2 - .../crisis-center/crisis-center.component.ts | 10 - .../crisis-center/crisis-detail-resolver.1.ts | 3 - .../crisis-center/crisis-detail-resolver.ts | 26 --- .../crisis-detail.component.1.ts | 68 ------- .../crisis-detail/crisis-detail.component.css | 8 - .../crisis-detail.component.html | 10 - .../crisis-detail/crisis-detail.component.ts | 69 ------- .../crisis-list/crisis-list.component.1.ts | 32 --- .../crisis-list/crisis-list.component.css | 64 ------ .../crisis-list/crisis-list.component.html | 9 - .../crisis-list/crisis-list.component.ts | 32 --- .../src/app/crisis-center/crisis.service.ts | 38 ---- .../router/src/app/crisis-center/crisis.ts | 4 - .../src/app/crisis-center/mock-crises.ts | 9 - .../crisis-list/crisis-list.component.1.css | 0 .../crisis-list/crisis-list.component.1.html | 2 - .../crisis-list/crisis-list.component.1.ts | 11 - .../examples/router/src/app/dialog.service.ts | 23 --- .../app/hero-list/hero-list.component.1.css | 0 .../app/hero-list/hero-list.component.1.html | 6 - .../app/hero-list/hero-list.component.1.ts | 10 - .../hero-detail/hero-detail.component.1.ts | 39 ---- .../hero-detail/hero-detail.component.2.ts | 36 ---- .../hero-detail/hero-detail.component.3.ts | 47 ----- .../hero-detail/hero-detail.component.4.ts | 38 ---- .../hero-detail/hero-detail.component.css | 8 - .../hero-detail/hero-detail.component.html | 8 - .../hero-detail/hero-detail.component.ts | 41 ---- .../hero-list/hero-list.component.1.html | 14 -- .../heroes/hero-list/hero-list.component.1.ts | 22 -- .../heroes/hero-list/hero-list.component.css | 55 ----- .../heroes/hero-list/hero-list.component.html | 10 - .../heroes/hero-list/hero-list.component.ts | 43 ---- .../router/src/app/heroes/hero.service.ts | 29 --- .../examples/router/src/app/heroes/hero.ts | 4 - .../src/app/heroes/heroes-routing.module.1.ts | 20 -- .../src/app/heroes/heroes-routing.module.2.ts | 18 -- .../src/app/heroes/heroes-routing.module.ts | 20 -- .../router/src/app/heroes/heroes.module.ts | 14 -- .../router/src/app/heroes/mock-heroes.ts | 13 -- .../router/src/app/message.service.ts | 16 -- .../page-not-found.component.css | 0 .../page-not-found.component.html | 1 - .../page-not-found.component.ts | 9 - .../selective-preloading-strategy.service.ts | 25 --- 129 files changed, 3043 deletions(-) delete mode 100644 adev/src/content/examples/router/e2e/src/app.e2e-spec.ts delete mode 100644 adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.1.html delete mode 100644 adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.1.ts delete mode 100644 adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.css delete mode 100644 adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.html delete mode 100644 adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.ts delete mode 100644 adev/src/content/examples/router/src/app/admin/admin-routing.module.1.ts delete mode 100644 adev/src/content/examples/router/src/app/admin/admin-routing.module.2.ts delete mode 100644 adev/src/content/examples/router/src/app/admin/admin-routing.module.3.ts delete mode 100644 adev/src/content/examples/router/src/app/admin/admin-routing.module.ts delete mode 100644 adev/src/content/examples/router/src/app/admin/admin.module.ts delete mode 100644 adev/src/content/examples/router/src/app/admin/admin/admin.component.css delete mode 100644 adev/src/content/examples/router/src/app/admin/admin/admin.component.html delete mode 100644 adev/src/content/examples/router/src/app/admin/admin/admin.component.ts delete mode 100644 adev/src/content/examples/router/src/app/admin/manage-crises/manage-crises.component.css delete mode 100644 adev/src/content/examples/router/src/app/admin/manage-crises/manage-crises.component.html delete mode 100644 adev/src/content/examples/router/src/app/admin/manage-crises/manage-crises.component.ts delete mode 100644 adev/src/content/examples/router/src/app/admin/manage-heroes/manage-heroes.component.css delete mode 100644 adev/src/content/examples/router/src/app/admin/manage-heroes/manage-heroes.component.html delete mode 100644 adev/src/content/examples/router/src/app/admin/manage-heroes/manage-heroes.component.ts delete mode 100644 adev/src/content/examples/router/src/app/animations.ts delete mode 100644 adev/src/content/examples/router/src/app/app-routing.module.1.ts delete mode 100644 adev/src/content/examples/router/src/app/app-routing.module.10.ts delete mode 100644 adev/src/content/examples/router/src/app/app-routing.module.11.ts delete mode 100644 adev/src/content/examples/router/src/app/app-routing.module.2.ts delete mode 100644 adev/src/content/examples/router/src/app/app-routing.module.3.ts delete mode 100644 adev/src/content/examples/router/src/app/app-routing.module.4.ts delete mode 100644 adev/src/content/examples/router/src/app/app-routing.module.5.ts delete mode 100644 adev/src/content/examples/router/src/app/app-routing.module.6.ts delete mode 100644 adev/src/content/examples/router/src/app/app-routing.module.7.ts delete mode 100644 adev/src/content/examples/router/src/app/app-routing.module.8.ts delete mode 100644 adev/src/content/examples/router/src/app/app-routing.module.9.ts delete mode 100644 adev/src/content/examples/router/src/app/app-routing.module.ts delete mode 100644 adev/src/content/examples/router/src/app/app.component.1.ts delete mode 100644 adev/src/content/examples/router/src/app/app.component.2.html delete mode 100644 adev/src/content/examples/router/src/app/app.component.2.ts delete mode 100644 adev/src/content/examples/router/src/app/app.component.3.ts delete mode 100644 adev/src/content/examples/router/src/app/app.component.4.html delete mode 100644 adev/src/content/examples/router/src/app/app.component.4.ts delete mode 100644 adev/src/content/examples/router/src/app/app.component.5.html delete mode 100644 adev/src/content/examples/router/src/app/app.component.6.html delete mode 100644 adev/src/content/examples/router/src/app/app.component.7.html delete mode 100644 adev/src/content/examples/router/src/app/app.component.8.html delete mode 100644 adev/src/content/examples/router/src/app/app.component.css delete mode 100644 adev/src/content/examples/router/src/app/app.component.html delete mode 100644 adev/src/content/examples/router/src/app/app.component.ts delete mode 100644 adev/src/content/examples/router/src/app/app.module.0.ts delete mode 100644 adev/src/content/examples/router/src/app/app.module.1.ts delete mode 100644 adev/src/content/examples/router/src/app/app.module.2.ts delete mode 100644 adev/src/content/examples/router/src/app/app.module.3.ts delete mode 100644 adev/src/content/examples/router/src/app/app.module.4.ts delete mode 100644 adev/src/content/examples/router/src/app/app.module.5.ts delete mode 100644 adev/src/content/examples/router/src/app/app.module.6.ts delete mode 100644 adev/src/content/examples/router/src/app/app.module.7.ts delete mode 100644 adev/src/content/examples/router/src/app/app.module.8.ts delete mode 100644 adev/src/content/examples/router/src/app/app.module.ts delete mode 100644 adev/src/content/examples/router/src/app/auth/auth-routing.module.ts delete mode 100644 adev/src/content/examples/router/src/app/auth/auth.guard.1.ts delete mode 100644 adev/src/content/examples/router/src/app/auth/auth.guard.2.ts delete mode 100644 adev/src/content/examples/router/src/app/auth/auth.guard.3.ts delete mode 100644 adev/src/content/examples/router/src/app/auth/auth.guard.4.ts delete mode 100644 adev/src/content/examples/router/src/app/auth/auth.guard.ts delete mode 100644 adev/src/content/examples/router/src/app/auth/auth.module.ts delete mode 100644 adev/src/content/examples/router/src/app/auth/auth.service.ts delete mode 100644 adev/src/content/examples/router/src/app/auth/login/login.component.1.ts delete mode 100644 adev/src/content/examples/router/src/app/auth/login/login.component.css delete mode 100644 adev/src/content/examples/router/src/app/auth/login/login.component.html delete mode 100644 adev/src/content/examples/router/src/app/auth/login/login.component.ts delete mode 100644 adev/src/content/examples/router/src/app/can-deactivate.guard.1.ts delete mode 100644 adev/src/content/examples/router/src/app/can-deactivate.guard.ts delete mode 100644 adev/src/content/examples/router/src/app/compose-message/compose-message.component.css delete mode 100644 adev/src/content/examples/router/src/app/compose-message/compose-message.component.html delete mode 100644 adev/src/content/examples/router/src/app/compose-message/compose-message.component.ts delete mode 100644 adev/src/content/examples/router/src/app/crisis-center/crisis-center-home/crisis-center-home.component.css delete mode 100644 adev/src/content/examples/router/src/app/crisis-center/crisis-center-home/crisis-center-home.component.html delete mode 100644 adev/src/content/examples/router/src/app/crisis-center/crisis-center-home/crisis-center-home.component.ts delete mode 100644 adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.1.ts delete mode 100644 adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.2.ts delete mode 100644 adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.3.ts delete mode 100644 adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.4.ts delete mode 100644 adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.ts delete mode 100644 adev/src/content/examples/router/src/app/crisis-center/crisis-center.module.ts delete mode 100644 adev/src/content/examples/router/src/app/crisis-center/crisis-center/crisis-center.component.css delete mode 100644 adev/src/content/examples/router/src/app/crisis-center/crisis-center/crisis-center.component.html delete mode 100644 adev/src/content/examples/router/src/app/crisis-center/crisis-center/crisis-center.component.ts delete mode 100644 adev/src/content/examples/router/src/app/crisis-center/crisis-detail-resolver.1.ts delete mode 100644 adev/src/content/examples/router/src/app/crisis-center/crisis-detail-resolver.ts delete mode 100644 adev/src/content/examples/router/src/app/crisis-center/crisis-detail/crisis-detail.component.1.ts delete mode 100644 adev/src/content/examples/router/src/app/crisis-center/crisis-detail/crisis-detail.component.css delete mode 100644 adev/src/content/examples/router/src/app/crisis-center/crisis-detail/crisis-detail.component.html delete mode 100644 adev/src/content/examples/router/src/app/crisis-center/crisis-detail/crisis-detail.component.ts delete mode 100644 adev/src/content/examples/router/src/app/crisis-center/crisis-list/crisis-list.component.1.ts delete mode 100644 adev/src/content/examples/router/src/app/crisis-center/crisis-list/crisis-list.component.css delete mode 100644 adev/src/content/examples/router/src/app/crisis-center/crisis-list/crisis-list.component.html delete mode 100644 adev/src/content/examples/router/src/app/crisis-center/crisis-list/crisis-list.component.ts delete mode 100644 adev/src/content/examples/router/src/app/crisis-center/crisis.service.ts delete mode 100644 adev/src/content/examples/router/src/app/crisis-center/crisis.ts delete mode 100644 adev/src/content/examples/router/src/app/crisis-center/mock-crises.ts delete mode 100644 adev/src/content/examples/router/src/app/crisis-list/crisis-list.component.1.css delete mode 100644 adev/src/content/examples/router/src/app/crisis-list/crisis-list.component.1.html delete mode 100644 adev/src/content/examples/router/src/app/crisis-list/crisis-list.component.1.ts delete mode 100644 adev/src/content/examples/router/src/app/dialog.service.ts delete mode 100644 adev/src/content/examples/router/src/app/hero-list/hero-list.component.1.css delete mode 100644 adev/src/content/examples/router/src/app/hero-list/hero-list.component.1.html delete mode 100644 adev/src/content/examples/router/src/app/hero-list/hero-list.component.1.ts delete mode 100644 adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.1.ts delete mode 100644 adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.2.ts delete mode 100644 adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.3.ts delete mode 100644 adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.4.ts delete mode 100644 adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.css delete mode 100644 adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.html delete mode 100644 adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.ts delete mode 100644 adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.1.html delete mode 100644 adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.1.ts delete mode 100644 adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.css delete mode 100644 adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.html delete mode 100644 adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.ts delete mode 100644 adev/src/content/examples/router/src/app/heroes/hero.service.ts delete mode 100644 adev/src/content/examples/router/src/app/heroes/hero.ts delete mode 100644 adev/src/content/examples/router/src/app/heroes/heroes-routing.module.1.ts delete mode 100644 adev/src/content/examples/router/src/app/heroes/heroes-routing.module.2.ts delete mode 100644 adev/src/content/examples/router/src/app/heroes/heroes-routing.module.ts delete mode 100644 adev/src/content/examples/router/src/app/heroes/heroes.module.ts delete mode 100644 adev/src/content/examples/router/src/app/heroes/mock-heroes.ts delete mode 100644 adev/src/content/examples/router/src/app/message.service.ts delete mode 100644 adev/src/content/examples/router/src/app/page-not-found/page-not-found.component.css delete mode 100644 adev/src/content/examples/router/src/app/page-not-found/page-not-found.component.html delete mode 100644 adev/src/content/examples/router/src/app/page-not-found/page-not-found.component.ts delete mode 100644 adev/src/content/examples/router/src/app/selective-preloading-strategy.service.ts diff --git a/adev/src/content/examples/router/e2e/src/app.e2e-spec.ts b/adev/src/content/examples/router/e2e/src/app.e2e-spec.ts deleted file mode 100644 index ee6f1f8003ab..000000000000 --- a/adev/src/content/examples/router/e2e/src/app.e2e-spec.ts +++ /dev/null @@ -1,191 +0,0 @@ -import {browser, element, by, ExpectedConditions as EC} from 'protractor'; - -const numDashboardTabs = 5; -const numCrises = 4; -const numHeroes = 9; - -describe('Router', () => { - beforeAll(() => browser.get('')); - - function getPageStruct() { - const hrefEles = element.all(by.css('nav a')); - const crisisDetail = element - .all(by.css('app-crisis-center > app-crisis-list > app-crisis-detail > div')) - .first(); - const heroDetail = element(by.css('app-hero-detail')); - - return { - hrefs: hrefEles, - activeHref: element(by.css('nav a.active')), - - crisisHref: hrefEles.get(0), - crisisList: element.all(by.css('app-crisis-center app-crisis-list li')), - crisisDetail, - crisisDetailTitle: crisisDetail.element(by.xpath('*[1]')), - - heroesHref: hrefEles.get(1), - heroesList: element.all(by.css('app-hero-list li')), - heroDetail, - heroDetailTitle: heroDetail.element(by.xpath('*[2]')), - - adminHref: hrefEles.get(2), - adminPage: element(by.css('app-admin')), - adminPreloadList: element.all(by.css('app-admin > app-admin-dashboard > ul > li')), - - loginHref: hrefEles.get(3), - loginButton: element.all(by.css('app-login > p > button')), - - contactHref: hrefEles.get(4), - contactCancelButton: element.all(by.buttonText('Cancel')), - - primaryOutlet: element.all(by.css('app-hero-list')), - secondaryOutlet: element.all(by.css('app-compose-message')), - }; - } - - it('has expected dashboard tabs', async () => { - const page = getPageStruct(); - expect(await page.hrefs.count()).toEqual(numDashboardTabs, 'dashboard tab count'); - expect(await page.crisisHref.getText()).toEqual('Crisis Center'); - expect(await page.heroesHref.getText()).toEqual('Heroes'); - expect(await page.adminHref.getText()).toEqual('Admin'); - expect(await page.loginHref.getText()).toEqual('Login'); - expect(await page.contactHref.getText()).toEqual('Contact'); - }); - - it('has heroes selected as opening tab', async () => { - const page = getPageStruct(); - expect(await page.activeHref.getText()).toEqual('Heroes'); - }); - - it('has crises center items', async () => { - const page = getPageStruct(); - await page.crisisHref.click(); - expect(await page.activeHref.getText()).toEqual('Crisis Center'); - expect(await page.crisisList.count()).toBe(numCrises, 'crisis list count'); - }); - - it('has hero items', async () => { - const page = getPageStruct(); - await page.heroesHref.click(); - expect(await page.activeHref.getText()).toEqual('Heroes'); - expect(await page.heroesList.count()).toBe(numHeroes, 'hero list count'); - }); - - it('toggles views', async () => { - const page = getPageStruct(); - await page.crisisHref.click(); - expect(await page.activeHref.getText()).toEqual('Crisis Center'); - expect(await page.crisisList.count()).toBe(numCrises, 'crisis list count'); - await page.heroesHref.click(); - expect(await page.activeHref.getText()).toEqual('Heroes'); - expect(await page.heroesList.count()).toBe(numHeroes, 'hero list count'); - }); - - it('saves changed crisis details', async () => { - const page = getPageStruct(); - await page.crisisHref.click(); - await crisisCenterEdit(2, true); - }); - - // TODO: Figure out why this test is failing now - xit('can cancel changed crisis details', async () => { - const page = getPageStruct(); - await page.crisisHref.click(); - await crisisCenterEdit(3, false); - }); - - it('saves changed hero details', async () => { - const page = getPageStruct(); - await page.heroesHref.click(); - await browser.sleep(600); - const heroEle = page.heroesList.get(4); - const text = await heroEle.getText(); - expect(text.length).toBeGreaterThan(0, 'hero item text length'); - // remove leading id from text - const heroText = text.slice(text.indexOf(' ')).trim(); - - await heroEle.click(); - await browser.sleep(600); - expect(await page.heroesList.count()).toBe(0, 'hero list count'); - expect(await page.heroDetail.isPresent()).toBe(true, 'hero detail'); - expect(await page.heroDetailTitle.getText()).toContain(heroText); - const inputEle = page.heroDetail.element(by.css('input')); - await inputEle.sendKeys('-foo'); - expect(await page.heroDetailTitle.getText()).toContain(heroText + '-foo'); - - const buttonEle = page.heroDetail.element(by.css('button')); - await buttonEle.click(); - await browser.sleep(600); - expect(await heroEle.getText()).toContain(heroText + '-foo'); - }); - - it('sees preloaded modules', async () => { - const page = getPageStruct(); - await page.loginHref.click(); - await page.loginButton.click(); - const list = page.adminPreloadList; - expect(await list.count()).toBe(1, 'preloaded module'); - expect(await list.first().getText()).toBe('crisis-center', 'first preloaded module'); - }); - - it('sees the secondary route', async () => { - const page = getPageStruct(); - await page.heroesHref.click(); - await page.contactHref.click(); - expect(await page.primaryOutlet.count()).toBe(1, 'primary outlet'); - expect(await page.secondaryOutlet.count()).toBe(1, 'secondary outlet'); - }); - - it('should redirect with secondary route', async () => { - const page = getPageStruct(); - - // go to login page and login - await browser.get(''); - await page.loginHref.click(); - await page.loginButton.click(); - - // open secondary outlet - await page.contactHref.click(); - - // go to login page and logout - await page.loginHref.click(); - await page.loginButton.click(); - - // attempt to go to admin page, redirects to login with secondary outlet open - await page.adminHref.click(); - - // login, get redirected back to admin with outlet still open - await page.loginButton.click(); - - expect(await page.adminPage.isDisplayed()).toBeTruthy(); - expect(await page.secondaryOutlet.count()).toBeTruthy(); - }); - - async function crisisCenterEdit(index: number, save: boolean) { - const page = getPageStruct(); - await page.crisisHref.click(); - let crisisEle = page.crisisList.get(index); - const text = await crisisEle.getText(); - expect(text.length).toBeGreaterThan(0, 'crisis item text length'); - // remove leading id from text - const crisisText = text.slice(text.indexOf(' ')).trim(); - - await crisisEle.click(); - expect(await page.crisisDetail.isPresent()).toBe(true, 'crisis detail present'); - expect(await page.crisisDetailTitle.getText()).toContain(crisisText); - const inputEle = page.crisisDetail.element(by.css('input')); - await inputEle.sendKeys('-foo'); - - const buttonEle = page.crisisDetail.element(by.buttonText(save ? 'Save' : 'Cancel')); - await buttonEle.click(); - crisisEle = page.crisisList.get(index); - if (save) { - expect(await crisisEle.getText()).toContain(crisisText + '-foo'); - } else { - await browser.wait(EC.alertIsPresent(), 4000); - await browser.switchTo().alert().accept(); - expect(await crisisEle.getText()).toContain(crisisText); - } - } -}); diff --git a/adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.1.html b/adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.1.html deleted file mode 100644 index 02a0be66a646..000000000000 --- a/adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.1.html +++ /dev/null @@ -1 +0,0 @@ -

Dashboard

diff --git a/adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.1.ts b/adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.1.ts deleted file mode 100644 index 86b8f7a61640..000000000000 --- a/adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.1.ts +++ /dev/null @@ -1,28 +0,0 @@ -// #docregion -import {Component, OnInit} from '@angular/core'; -import {ActivatedRoute} from '@angular/router'; -import {Observable} from 'rxjs'; -import {map} from 'rxjs/operators'; - -@Component({ - selector: 'app-admin-dashboard', - templateUrl: './admin-dashboard.component.html', - styleUrls: ['./admin-dashboard.component.css'], - standalone: false, -}) -export class AdminDashboardComponent implements OnInit { - sessionId!: Observable; - token!: Observable; - - constructor(private route: ActivatedRoute) {} - - ngOnInit() { - // Capture the session ID if available - this.sessionId = this.route.queryParamMap.pipe( - map((params) => params.get('session_id') || 'None'), - ); - - // Capture the fragment if available - this.token = this.route.fragment.pipe(map((fragment) => fragment || 'None')); - } -} diff --git a/adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.css b/adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.css deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.html b/adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.html deleted file mode 100644 index 04ff184a5f4e..000000000000 --- a/adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.html +++ /dev/null @@ -1,10 +0,0 @@ -

Dashboard

- -

Session ID: {{ sessionId | async }}

-
-

Token: {{ token | async }}

- -Preloaded Modules -
    -
  • {{ module }}
  • -
diff --git a/adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.ts b/adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.ts deleted file mode 100644 index e40c8aa15b45..000000000000 --- a/adev/src/content/examples/router/src/app/admin/admin-dashboard/admin-dashboard.component.ts +++ /dev/null @@ -1,36 +0,0 @@ -// #docregion -import {Component, OnInit} from '@angular/core'; -import {ActivatedRoute} from '@angular/router'; -import {Observable} from 'rxjs'; -import {map} from 'rxjs/operators'; - -import {SelectivePreloadingStrategyService} from '../../selective-preloading-strategy.service'; - -@Component({ - selector: 'app-admin-dashboard', - templateUrl: './admin-dashboard.component.html', - styleUrls: ['./admin-dashboard.component.css'], - standalone: false, -}) -export class AdminDashboardComponent implements OnInit { - sessionId!: Observable; - token!: Observable; - modules: string[] = []; - - constructor( - private route: ActivatedRoute, - preloadStrategy: SelectivePreloadingStrategyService, - ) { - this.modules = preloadStrategy.preloadedModules; - } - - ngOnInit() { - // Capture the session ID if available - this.sessionId = this.route.queryParamMap.pipe( - map((params) => params.get('session_id') || 'None'), - ); - - // Capture the fragment if available - this.token = this.route.fragment.pipe(map((fragment) => fragment || 'None')); - } -} diff --git a/adev/src/content/examples/router/src/app/admin/admin-routing.module.1.ts b/adev/src/content/examples/router/src/app/admin/admin-routing.module.1.ts deleted file mode 100644 index b7435f613adc..000000000000 --- a/adev/src/content/examples/router/src/app/admin/admin-routing.module.1.ts +++ /dev/null @@ -1,35 +0,0 @@ -// #docplaster -// #docregion -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {AdminComponent} from './admin/admin.component'; -import {AdminDashboardComponent} from './admin-dashboard/admin-dashboard.component'; -import {ManageCrisesComponent} from './manage-crises/manage-crises.component'; -import {ManageHeroesComponent} from './manage-heroes/manage-heroes.component'; - -// #docregion admin-routes -const adminRoutes: Routes = [ - { - path: 'admin', - component: AdminComponent, - children: [ - { - path: '', - children: [ - {path: 'crises', component: ManageCrisesComponent}, - {path: 'heroes', component: ManageHeroesComponent}, - {path: '', component: AdminDashboardComponent}, - ], - }, - ], - }, -]; - -@NgModule({ - imports: [RouterModule.forChild(adminRoutes)], - exports: [RouterModule], -}) -export class AdminRoutingModule {} -// #enddocregion admin-routes -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/admin/admin-routing.module.2.ts b/adev/src/content/examples/router/src/app/admin/admin-routing.module.2.ts deleted file mode 100644 index 00e10d1057da..000000000000 --- a/adev/src/content/examples/router/src/app/admin/admin-routing.module.2.ts +++ /dev/null @@ -1,40 +0,0 @@ -// #docplaster -// #docregion -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -// #docregion admin-route -import {authGuard} from '../auth/auth.guard'; - -import {AdminDashboardComponent} from './admin-dashboard/admin-dashboard.component'; -import {AdminComponent} from './admin/admin.component'; -import {ManageCrisesComponent} from './manage-crises/manage-crises.component'; -import {ManageHeroesComponent} from './manage-heroes/manage-heroes.component'; - -const adminRoutes: Routes = [ - { - path: 'admin', - component: AdminComponent, - canActivate: [authGuard], - - // #enddocregion admin-route - // #docregion admin-route - children: [ - { - path: '', - children: [ - {path: 'crises', component: ManageCrisesComponent}, - {path: 'heroes', component: ManageHeroesComponent}, - {path: '', component: AdminDashboardComponent}, - ], - // #enddocregion admin-route - canActivateChild: [authGuard], - // #docregion admin-route - }, - ], - }, -]; - -@NgModule({imports: [RouterModule.forChild(adminRoutes)], exports: [RouterModule]}) -export class AdminRoutingModule {} -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/admin/admin-routing.module.3.ts b/adev/src/content/examples/router/src/app/admin/admin-routing.module.3.ts deleted file mode 100644 index c0ec61f09b44..000000000000 --- a/adev/src/content/examples/router/src/app/admin/admin-routing.module.3.ts +++ /dev/null @@ -1,38 +0,0 @@ -// #docplaster -// #docregion -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {AdminComponent} from './admin/admin.component'; -import {AdminDashboardComponent} from './admin-dashboard/admin-dashboard.component'; -import {ManageCrisesComponent} from './manage-crises/manage-crises.component'; -import {ManageHeroesComponent} from './manage-heroes/manage-heroes.component'; - -import {authGuard} from '../auth/auth.guard'; - -// #docregion can-activate-child -const adminRoutes: Routes = [ - { - path: 'admin', - component: AdminComponent, - canActivate: [authGuard], - children: [ - { - path: '', - canActivateChild: [authGuard], - children: [ - {path: 'crises', component: ManageCrisesComponent}, - {path: 'heroes', component: ManageHeroesComponent}, - {path: '', component: AdminDashboardComponent}, - ], - }, - ], - }, -]; - -@NgModule({ - imports: [RouterModule.forChild(adminRoutes)], - exports: [RouterModule], -}) -export class AdminRoutingModule {} -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/admin/admin-routing.module.ts b/adev/src/content/examples/router/src/app/admin/admin-routing.module.ts deleted file mode 100644 index 244d09bab4c7..000000000000 --- a/adev/src/content/examples/router/src/app/admin/admin-routing.module.ts +++ /dev/null @@ -1,37 +0,0 @@ -// #docplaster -// #docregion -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {AdminComponent} from './admin/admin.component'; -import {AdminDashboardComponent} from './admin-dashboard/admin-dashboard.component'; -import {ManageCrisesComponent} from './manage-crises/manage-crises.component'; -import {ManageHeroesComponent} from './manage-heroes/manage-heroes.component'; - -import {authGuard} from '../auth/auth.guard'; - -const adminRoutes: Routes = [ - { - path: '', - component: AdminComponent, - canActivate: [authGuard], - children: [ - { - path: '', - canActivateChild: [authGuard], - children: [ - {path: 'crises', component: ManageCrisesComponent}, - {path: 'heroes', component: ManageHeroesComponent}, - {path: '', component: AdminDashboardComponent}, - ], - }, - ], - }, -]; - -@NgModule({ - imports: [RouterModule.forChild(adminRoutes)], - exports: [RouterModule], -}) -export class AdminRoutingModule {} -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/admin/admin.module.ts b/adev/src/content/examples/router/src/app/admin/admin.module.ts deleted file mode 100644 index bab83e6e7962..000000000000 --- a/adev/src/content/examples/router/src/app/admin/admin.module.ts +++ /dev/null @@ -1,21 +0,0 @@ -// #docregion -import {NgModule} from '@angular/core'; -import {CommonModule} from '@angular/common'; - -import {AdminComponent} from './admin/admin.component'; -import {AdminDashboardComponent} from './admin-dashboard/admin-dashboard.component'; -import {ManageCrisesComponent} from './manage-crises/manage-crises.component'; -import {ManageHeroesComponent} from './manage-heroes/manage-heroes.component'; - -import {AdminRoutingModule} from './admin-routing.module'; - -@NgModule({ - imports: [CommonModule, AdminRoutingModule], - declarations: [ - AdminComponent, - AdminDashboardComponent, - ManageCrisesComponent, - ManageHeroesComponent, - ], -}) -export class AdminModule {} diff --git a/adev/src/content/examples/router/src/app/admin/admin/admin.component.css b/adev/src/content/examples/router/src/app/admin/admin/admin.component.css deleted file mode 100644 index dadbe07a579b..000000000000 --- a/adev/src/content/examples/router/src/app/admin/admin/admin.component.css +++ /dev/null @@ -1,22 +0,0 @@ -nav a { - padding: 1rem; - font-size: 1rem; - background-color: #e8e8e8; - color: #3d3d3d; -} - -@media (min-width: 400px) { - nav a { - font-size: 1.2rem; - } -} - -nav a:hover { - color: white; - background-color: #42545C; - } - -nav a.active { - background-color: black; - color: white; -} diff --git a/adev/src/content/examples/router/src/app/admin/admin/admin.component.html b/adev/src/content/examples/router/src/app/admin/admin/admin.component.html deleted file mode 100644 index a04a451ad0ec..000000000000 --- a/adev/src/content/examples/router/src/app/admin/admin/admin.component.html +++ /dev/null @@ -1,8 +0,0 @@ -

Admin

- - diff --git a/adev/src/content/examples/router/src/app/admin/admin/admin.component.ts b/adev/src/content/examples/router/src/app/admin/admin/admin.component.ts deleted file mode 100644 index 786cb396a308..000000000000 --- a/adev/src/content/examples/router/src/app/admin/admin/admin.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -// #docregion -import {Component} from '@angular/core'; - -@Component({ - selector: 'app-admin', - templateUrl: './admin.component.html', - styleUrls: ['./admin.component.css'], - standalone: false, -}) -export class AdminComponent {} diff --git a/adev/src/content/examples/router/src/app/admin/manage-crises/manage-crises.component.css b/adev/src/content/examples/router/src/app/admin/manage-crises/manage-crises.component.css deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/adev/src/content/examples/router/src/app/admin/manage-crises/manage-crises.component.html b/adev/src/content/examples/router/src/app/admin/manage-crises/manage-crises.component.html deleted file mode 100644 index 4edfa721335a..000000000000 --- a/adev/src/content/examples/router/src/app/admin/manage-crises/manage-crises.component.html +++ /dev/null @@ -1 +0,0 @@ -

Manage your crises here

\ No newline at end of file diff --git a/adev/src/content/examples/router/src/app/admin/manage-crises/manage-crises.component.ts b/adev/src/content/examples/router/src/app/admin/manage-crises/manage-crises.component.ts deleted file mode 100644 index cbd11a05f141..000000000000 --- a/adev/src/content/examples/router/src/app/admin/manage-crises/manage-crises.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -// #docregion -import {Component} from '@angular/core'; - -@Component({ - selector: 'app-manage-crises', - templateUrl: './manage-crises.component.html', - styleUrls: ['./manage-crises.component.css'], - standalone: false, -}) -export class ManageCrisesComponent {} diff --git a/adev/src/content/examples/router/src/app/admin/manage-heroes/manage-heroes.component.css b/adev/src/content/examples/router/src/app/admin/manage-heroes/manage-heroes.component.css deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/adev/src/content/examples/router/src/app/admin/manage-heroes/manage-heroes.component.html b/adev/src/content/examples/router/src/app/admin/manage-heroes/manage-heroes.component.html deleted file mode 100644 index 3e5256527d8d..000000000000 --- a/adev/src/content/examples/router/src/app/admin/manage-heroes/manage-heroes.component.html +++ /dev/null @@ -1 +0,0 @@ -

Manage your heroes here

\ No newline at end of file diff --git a/adev/src/content/examples/router/src/app/admin/manage-heroes/manage-heroes.component.ts b/adev/src/content/examples/router/src/app/admin/manage-heroes/manage-heroes.component.ts deleted file mode 100644 index 0ec9a34f9984..000000000000 --- a/adev/src/content/examples/router/src/app/admin/manage-heroes/manage-heroes.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -// #docregion -import {Component} from '@angular/core'; - -@Component({ - selector: 'app-manage-heroes', - templateUrl: './manage-heroes.component.html', - styleUrls: ['./manage-heroes.component.css'], - standalone: false, -}) -export class ManageHeroesComponent {} diff --git a/adev/src/content/examples/router/src/app/animations.ts b/adev/src/content/examples/router/src/app/animations.ts deleted file mode 100644 index 35c068e420c3..000000000000 --- a/adev/src/content/examples/router/src/app/animations.ts +++ /dev/null @@ -1,24 +0,0 @@ -// #docregion -import {trigger, animateChild, group, transition, animate, style, query} from '@angular/animations'; - -// Routable animations -export const slideInAnimation = trigger('routeAnimation', [ - transition('heroes <=> hero', [ - style({position: 'relative'}), - query(':enter, :leave', [ - style({ - position: 'absolute', - top: 0, - left: 0, - width: '100%', - }), - ]), - query(':enter', [style({left: '-100%'})]), - query(':leave', animateChild()), - group([ - query(':leave', [animate('300ms ease-out', style({left: '100%'}))]), - query(':enter', [animate('300ms ease-out', style({left: '0%'}))]), - ]), - query(':enter', animateChild()), - ]), -]); diff --git a/adev/src/content/examples/router/src/app/app-routing.module.1.ts b/adev/src/content/examples/router/src/app/app-routing.module.1.ts deleted file mode 100644 index 6640b785d0c3..000000000000 --- a/adev/src/content/examples/router/src/app/app-routing.module.1.ts +++ /dev/null @@ -1,27 +0,0 @@ -// #docregion -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {CrisisListComponent} from './crisis-list/crisis-list.component'; -import {HeroListComponent} from './hero-list/hero-list.component'; -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; - -// #docregion appRoutes -const appRoutes: Routes = [ - {path: 'crisis-center', component: CrisisListComponent}, - {path: 'heroes', component: HeroListComponent}, - {path: '', redirectTo: '/heroes', pathMatch: 'full'}, - {path: '**', component: PageNotFoundComponent}, -]; -// #enddocregion appRoutes - -@NgModule({ - imports: [ - RouterModule.forRoot( - appRoutes, - {enableTracing: true}, // <-- debugging purposes only - ), - ], - exports: [RouterModule], -}) -export class AppRoutingModule {} diff --git a/adev/src/content/examples/router/src/app/app-routing.module.10.ts b/adev/src/content/examples/router/src/app/app-routing.module.10.ts deleted file mode 100644 index a30bfc8517c3..000000000000 --- a/adev/src/content/examples/router/src/app/app-routing.module.10.ts +++ /dev/null @@ -1,51 +0,0 @@ -// #docplaster -import {Injectable, NgModule} from '@angular/core'; -import {Title} from '@angular/platform-browser'; -import {ResolveFn, RouterModule, RouterStateSnapshot, Routes, TitleStrategy} from '@angular/router'; // CLI imports router - -// #docregion page-title -const routes: Routes = [ - { - path: 'first-component', - title: 'First component', - component: FirstComponent, // this is the component with the in the template - children: [ - { - path: 'child-a', // child route path - title: resolvedChildATitle, - component: ChildAComponent, // child route component that the router renders - }, - { - path: 'child-b', - title: 'child b', - component: ChildBComponent, // another child route component that the router renders - }, - ], - }, -]; - -const resolvedChildATitle: ResolveFn = () => Promise.resolve('child a'); -// #enddocregion page-title - -// #docregion custom-page-title -@Injectable({providedIn: 'root'}) -export class TemplatePageTitleStrategy extends TitleStrategy { - constructor(private readonly title: Title) { - super(); - } - - override updateTitle(routerState: RouterStateSnapshot) { - const title = this.buildTitle(routerState); - if (title !== undefined) { - this.title.setTitle(`My Application | ${title}`); - } - } -} - -@NgModule({ - imports: [RouterModule.forRoot(routes)], - exports: [RouterModule], - providers: [{provide: TitleStrategy, useClass: TemplatePageTitleStrategy}], -}) -export class AppRoutingModule {} -// #enddocregion custom-page-title diff --git a/adev/src/content/examples/router/src/app/app-routing.module.11.ts b/adev/src/content/examples/router/src/app/app-routing.module.11.ts deleted file mode 100644 index 6db507a863e1..000000000000 --- a/adev/src/content/examples/router/src/app/app-routing.module.11.ts +++ /dev/null @@ -1,30 +0,0 @@ -import {NgModule} from '@angular/core'; -import {provideRouter, Routes, withComponentInputBinding} from '@angular/router'; - -import {authGuard} from './auth/auth.guard'; -import {ComposeMessageComponent} from './compose-message/compose-message.component'; -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; - -const appRoutes: Routes = [ - {path: 'compose', component: ComposeMessageComponent, outlet: 'popup'}, - { - path: 'admin', - loadChildren: () => import('./admin/admin.module').then((m) => m.AdminModule), - canMatch: [authGuard], - }, - { - path: 'crisis-center', - loadChildren: () => - import('./crisis-center/crisis-center.module').then((m) => m.CrisisCenterModule), - data: {preload: true}, - }, - {path: '', redirectTo: '/superheroes', pathMatch: 'full'}, - {path: '**', component: PageNotFoundComponent}, -]; - -@NgModule({ - // #docregion withComponentInputBinding - providers: [provideRouter(appRoutes, withComponentInputBinding())], - // #enddocregion withComponentInputBinding -}) -export class AppRoutingModule {} diff --git a/adev/src/content/examples/router/src/app/app-routing.module.2.ts b/adev/src/content/examples/router/src/app/app-routing.module.2.ts deleted file mode 100644 index e3856e22df26..000000000000 --- a/adev/src/content/examples/router/src/app/app-routing.module.2.ts +++ /dev/null @@ -1,31 +0,0 @@ -// #docregion -// #docregion milestone3 -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {CrisisListComponent} from './crisis-list/crisis-list.component'; -// #enddocregion milestone3 -// import { HeroListComponent } from './hero-list/hero-list.component'; // <-- delete this line -// #docregion milestone3 -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; - -const appRoutes: Routes = [ - {path: 'crisis-center', component: CrisisListComponent}, - // #enddocregion milestone3 - // { path: 'heroes', component: HeroListComponent }, // <-- delete this line - // #docregion milestone3 - {path: '', redirectTo: '/heroes', pathMatch: 'full'}, - {path: '**', component: PageNotFoundComponent}, -]; - -@NgModule({ - imports: [ - RouterModule.forRoot( - appRoutes, - {enableTracing: true}, // <-- debugging purposes only - ), - ], - exports: [RouterModule], -}) -export class AppRoutingModule {} -// #enddocregion milestone3 diff --git a/adev/src/content/examples/router/src/app/app-routing.module.3.ts b/adev/src/content/examples/router/src/app/app-routing.module.3.ts deleted file mode 100644 index 2d72c6a0c8c6..000000000000 --- a/adev/src/content/examples/router/src/app/app-routing.module.3.ts +++ /dev/null @@ -1,34 +0,0 @@ -// #docplaster -// #docregion , v3 -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -// #enddocregion v3 -import {ComposeMessageComponent} from './compose-message/compose-message.component'; -// #docregion v3 -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; - -const appRoutes: Routes = [ - // #enddocregion v3 - // #docregion compose - { - path: 'compose', - component: ComposeMessageComponent, - outlet: 'popup', - }, - // #enddocregion compose - // #docregion v3 - {path: '', redirectTo: '/heroes', pathMatch: 'full'}, - {path: '**', component: PageNotFoundComponent}, -]; - -@NgModule({ - imports: [ - RouterModule.forRoot( - appRoutes, - {enableTracing: true}, // <-- debugging purposes only - ), - ], - exports: [RouterModule], -}) -export class AppRoutingModule {} diff --git a/adev/src/content/examples/router/src/app/app-routing.module.4.ts b/adev/src/content/examples/router/src/app/app-routing.module.4.ts deleted file mode 100644 index 80fed6a59357..000000000000 --- a/adev/src/content/examples/router/src/app/app-routing.module.4.ts +++ /dev/null @@ -1,28 +0,0 @@ -// #docregion -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {ComposeMessageComponent} from './compose-message/compose-message.component'; -import {CanDeactivateGuard} from './can-deactivate.guard'; -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; - -const appRoutes: Routes = [ - { - path: 'compose', - component: ComposeMessageComponent, - outlet: 'popup', - }, - {path: '', redirectTo: '/heroes', pathMatch: 'full'}, - {path: '**', component: PageNotFoundComponent}, -]; - -@NgModule({ - imports: [ - RouterModule.forRoot( - appRoutes, - {enableTracing: true}, // <-- debugging purposes only - ), - ], - exports: [RouterModule], -}) -export class AppRoutingModule {} diff --git a/adev/src/content/examples/router/src/app/app-routing.module.5.ts b/adev/src/content/examples/router/src/app/app-routing.module.5.ts deleted file mode 100644 index 1e8d81c9ac6c..000000000000 --- a/adev/src/content/examples/router/src/app/app-routing.module.5.ts +++ /dev/null @@ -1,39 +0,0 @@ -// #docplaster -// #docregion -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {ComposeMessageComponent} from './compose-message/compose-message.component'; -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; - -import {authGuard} from './auth/auth.guard'; - -const appRoutes: Routes = [ - { - path: 'compose', - component: ComposeMessageComponent, - outlet: 'popup', - }, - // #docregion admin, admin-1 - { - path: 'admin', - loadChildren: () => import('./admin/admin.module').then((m) => m.AdminModule), - // #enddocregion admin-1 - canMatch: [authGuard], - // #docregion admin-1 - }, - // #enddocregion admin, admin-1 - {path: '', redirectTo: '/heroes', pathMatch: 'full'}, - {path: '**', component: PageNotFoundComponent}, -]; - -@NgModule({ - imports: [ - RouterModule.forRoot( - appRoutes, - {enableTracing: true}, // <-- debugging purposes only - ), - ], - exports: [RouterModule], -}) -export class AppRoutingModule {} diff --git a/adev/src/content/examples/router/src/app/app-routing.module.6.ts b/adev/src/content/examples/router/src/app/app-routing.module.6.ts deleted file mode 100644 index b8a383e32cef..000000000000 --- a/adev/src/content/examples/router/src/app/app-routing.module.6.ts +++ /dev/null @@ -1,53 +0,0 @@ -// #docplaster -// #docregion, preload-v1 -import {NgModule} from '@angular/core'; -import { - RouterModule, - Routes, - // #enddocregion preload-v1 - PreloadAllModules, - // #docregion preload-v1 -} from '@angular/router'; - -import {ComposeMessageComponent} from './compose-message/compose-message.component'; -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; - -import {authGuard} from './auth/auth.guard'; - -const appRoutes: Routes = [ - { - path: 'compose', - component: ComposeMessageComponent, - outlet: 'popup', - }, - { - path: 'admin', - loadChildren: () => import('./admin/admin.module').then((m) => m.AdminModule), - canMatch: [authGuard], - }, - { - path: 'crisis-center', - loadChildren: () => - import('./crisis-center/crisis-center.module').then((m) => m.CrisisCenterModule), - }, - {path: '', redirectTo: '/heroes', pathMatch: 'full'}, - {path: '**', component: PageNotFoundComponent}, -]; - -@NgModule({ - imports: [ - // #docregion forRoot - RouterModule.forRoot( - appRoutes, - // #enddocregion preload-v1 - { - enableTracing: true, // <-- debugging purposes only - preloadingStrategy: PreloadAllModules, - }, - // #docregion preload-v1 - ), - // #enddocregion forRoot - ], - exports: [RouterModule], -}) -export class AppRoutingModule {} diff --git a/adev/src/content/examples/router/src/app/app-routing.module.7.ts b/adev/src/content/examples/router/src/app/app-routing.module.7.ts deleted file mode 100644 index 6e67de845b97..000000000000 --- a/adev/src/content/examples/router/src/app/app-routing.module.7.ts +++ /dev/null @@ -1,11 +0,0 @@ -import {NgModule} from '@angular/core'; -import {Routes, RouterModule} from '@angular/router'; // CLI imports router - -const routes: Routes = []; // sets up routes constant where you define your routes - -// configures NgModule imports and exports -@NgModule({ - imports: [RouterModule.forRoot(routes)], - exports: [RouterModule], -}) -export class AppRoutingModule {} diff --git a/adev/src/content/examples/router/src/app/app-routing.module.8.ts b/adev/src/content/examples/router/src/app/app-routing.module.8.ts deleted file mode 100644 index 5cfc2c020faa..000000000000 --- a/adev/src/content/examples/router/src/app/app-routing.module.8.ts +++ /dev/null @@ -1,21 +0,0 @@ -// #docplaster -import {NgModule} from '@angular/core'; -import {Routes, RouterModule} from '@angular/router'; // CLI imports router - -// #docregion routes, routes-with-wildcard, redirect -const routes: Routes = [ - {path: 'first-component', component: FirstComponent}, - {path: 'second-component', component: SecondComponent}, - // #enddocregion routes, routes-with-wildcard - {path: '', redirectTo: '/first-component', pathMatch: 'full'}, // redirect to `first-component` - // #docregion routes-with-wildcard - {path: '**', component: PageNotFoundComponent}, // Wildcard route for a 404 page - // #docregion routes -]; -// #enddocregion routes, routes-with-wildcard, redirect - -@NgModule({ - imports: [RouterModule.forRoot(routes)], - exports: [RouterModule], -}) -export class AppRoutingModule {} diff --git a/adev/src/content/examples/router/src/app/app-routing.module.9.ts b/adev/src/content/examples/router/src/app/app-routing.module.9.ts deleted file mode 100644 index 37a7106e59a0..000000000000 --- a/adev/src/content/examples/router/src/app/app-routing.module.9.ts +++ /dev/null @@ -1,28 +0,0 @@ -// #docplaster -import {NgModule} from '@angular/core'; -import {Routes, RouterModule} from '@angular/router'; // CLI imports router - -// #docregion child-routes -const routes: Routes = [ - { - path: 'first-component', - component: FirstComponent, // this is the component with the in the template - children: [ - { - path: 'child-a', // child route path - component: ChildAComponent, // child route component that the router renders - }, - { - path: 'child-b', - component: ChildBComponent, // another child route component that the router renders - }, - ], - }, -]; -// #enddocregion child-routes - -@NgModule({ - imports: [RouterModule.forRoot(routes)], - exports: [RouterModule], -}) -export class AppRoutingModule {} diff --git a/adev/src/content/examples/router/src/app/app-routing.module.ts b/adev/src/content/examples/router/src/app/app-routing.module.ts deleted file mode 100644 index b50dae98f6aa..000000000000 --- a/adev/src/content/examples/router/src/app/app-routing.module.ts +++ /dev/null @@ -1,44 +0,0 @@ -// #docplaster -// #docregion -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {ComposeMessageComponent} from './compose-message/compose-message.component'; -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; - -import {authGuard} from './auth/auth.guard'; -import {SelectivePreloadingStrategyService} from './selective-preloading-strategy.service'; - -const appRoutes: Routes = [ - { - path: 'compose', - component: ComposeMessageComponent, - outlet: 'popup', - }, - { - path: 'admin', - loadChildren: () => import('./admin/admin.module').then((m) => m.AdminModule), - canMatch: [authGuard], - }, - // #docregion preload-v2 - { - path: 'crisis-center', - loadChildren: () => - import('./crisis-center/crisis-center.module').then((m) => m.CrisisCenterModule), - data: {preload: true}, - }, - // #enddocregion preload-v2 - {path: '', redirectTo: '/superheroes', pathMatch: 'full'}, - {path: '**', component: PageNotFoundComponent}, -]; - -@NgModule({ - imports: [ - RouterModule.forRoot(appRoutes, { - enableTracing: false, // <-- debugging purposes only - preloadingStrategy: SelectivePreloadingStrategyService, - }), - ], - exports: [RouterModule], -}) -export class AppRoutingModule {} diff --git a/adev/src/content/examples/router/src/app/app.component.1.ts b/adev/src/content/examples/router/src/app/app.component.1.ts deleted file mode 100644 index d804af7704ea..000000000000 --- a/adev/src/content/examples/router/src/app/app.component.1.ts +++ /dev/null @@ -1,10 +0,0 @@ -// #docregion -import {Component} from '@angular/core'; - -@Component({ - selector: 'app-root', - templateUrl: 'app.component.html', - styleUrls: ['app.component.css'], - standalone: false, -}) -export class AppComponent {} diff --git a/adev/src/content/examples/router/src/app/app.component.2.html b/adev/src/content/examples/router/src/app/app.component.2.html deleted file mode 100644 index eb6c268e146b..000000000000 --- a/adev/src/content/examples/router/src/app/app.component.2.html +++ /dev/null @@ -1,9 +0,0 @@ - -

Angular Router

- -
- -
\ No newline at end of file diff --git a/adev/src/content/examples/router/src/app/app.component.2.ts b/adev/src/content/examples/router/src/app/app.component.2.ts deleted file mode 100644 index fb62c585e923..000000000000 --- a/adev/src/content/examples/router/src/app/app.component.2.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* Second Heroes version */ -// #docregion -import {Component} from '@angular/core'; -// #docregion animation-imports -import {ChildrenOutletContexts} from '@angular/router'; -import {slideInAnimation} from './animations'; - -@Component({ - selector: 'app-root', - templateUrl: 'app.component.html', - styleUrls: ['app.component.css'], - animations: [slideInAnimation], - standalone: false, -}) -// #enddocregion animation-imports -// #docregion function-binding -export class AppComponent { - constructor(private contexts: ChildrenOutletContexts) {} - - getAnimationData() { - return this.contexts.getContext('primary')?.route?.snapshot?.data?.['animation']; - } -} -// #enddocregion function-binding diff --git a/adev/src/content/examples/router/src/app/app.component.3.ts b/adev/src/content/examples/router/src/app/app.component.3.ts deleted file mode 100644 index b9264329a957..000000000000 --- a/adev/src/content/examples/router/src/app/app.component.3.ts +++ /dev/null @@ -1,43 +0,0 @@ -// #docplaster -import {Component} from '@angular/core'; -import {Router} from '@angular/router'; - -@Component({ - selector: 'app-root', - /* Typical link - // #docregion h-anchor - Heroes - // #enddocregion h-anchor - */ - /* Incomplete Crisis Center link when CC lacks a default - // The link now fails with a "non-terminal link" error - // #docregion cc-anchor-w-default - Crisis Center - // #enddocregion cc-anchor-w-default - */ - /* Crisis Center link when CC lacks a default - Crisis Center - */ - /* Crisis Center Detail link - // #docregion Dragon-anchor - Dragon Crisis - // #enddocregion Dragon-anchor - */ - /* Crisis Center link with optional query params - // #docregion cc-query-params - Crisis Center - // #enddocregion cc-query-params - */ - // #docregion template - template: ` -

Angular Router

- - - `, - standalone: false, -}) -export class AppComponent {} diff --git a/adev/src/content/examples/router/src/app/app.component.4.html b/adev/src/content/examples/router/src/app/app.component.4.html deleted file mode 100644 index 77cd0fd3faa1..000000000000 --- a/adev/src/content/examples/router/src/app/app.component.4.html +++ /dev/null @@ -1,15 +0,0 @@ - -

Angular Router

- - -
- -
- - \ No newline at end of file diff --git a/adev/src/content/examples/router/src/app/app.component.4.ts b/adev/src/content/examples/router/src/app/app.component.4.ts deleted file mode 100644 index 2aea69f352ea..000000000000 --- a/adev/src/content/examples/router/src/app/app.component.4.ts +++ /dev/null @@ -1,15 +0,0 @@ -import {Component} from '@angular/core'; - -@Component({ - selector: 'app-root', - templateUrl: 'app.component.html', - styleUrls: ['app.component.css'], - standalone: false, -}) -export class AppComponent { - // #docregion relative-to - goToItems() { - this.router.navigate(['items'], {relativeTo: this.route}); - } - // #enddocregion relative-to -} diff --git a/adev/src/content/examples/router/src/app/app.component.5.html b/adev/src/content/examples/router/src/app/app.component.5.html deleted file mode 100644 index 36019eb639ba..000000000000 --- a/adev/src/content/examples/router/src/app/app.component.5.html +++ /dev/null @@ -1,12 +0,0 @@ - -

Angular Router

- -
- -
- \ No newline at end of file diff --git a/adev/src/content/examples/router/src/app/app.component.6.html b/adev/src/content/examples/router/src/app/app.component.6.html deleted file mode 100644 index 9ff4b20c9f58..000000000000 --- a/adev/src/content/examples/router/src/app/app.component.6.html +++ /dev/null @@ -1,13 +0,0 @@ - -

Angular Router

- -
- -
- \ No newline at end of file diff --git a/adev/src/content/examples/router/src/app/app.component.7.html b/adev/src/content/examples/router/src/app/app.component.7.html deleted file mode 100644 index 7ba23f652a90..000000000000 --- a/adev/src/content/examples/router/src/app/app.component.7.html +++ /dev/null @@ -1,10 +0,0 @@ -

Angular Router App

- - - - diff --git a/adev/src/content/examples/router/src/app/app.component.8.html b/adev/src/content/examples/router/src/app/app.component.8.html deleted file mode 100644 index 74791aa9cd58..000000000000 --- a/adev/src/content/examples/router/src/app/app.component.8.html +++ /dev/null @@ -1,26 +0,0 @@ - -

First Component

- - - - - - - - - -

First Component

- - - - - diff --git a/adev/src/content/examples/router/src/app/app.component.css b/adev/src/content/examples/router/src/app/app.component.css deleted file mode 100644 index 0befc361b918..000000000000 --- a/adev/src/content/examples/router/src/app/app.component.css +++ /dev/null @@ -1,3 +0,0 @@ -nav a { - padding: 1rem; -} diff --git a/adev/src/content/examples/router/src/app/app.component.html b/adev/src/content/examples/router/src/app/app.component.html deleted file mode 100644 index 2183b0fb0beb..000000000000 --- a/adev/src/content/examples/router/src/app/app.component.html +++ /dev/null @@ -1,15 +0,0 @@ - -
-

Angular Router

- -
- -
- -
diff --git a/adev/src/content/examples/router/src/app/app.component.ts b/adev/src/content/examples/router/src/app/app.component.ts deleted file mode 100644 index c22cc108fa63..000000000000 --- a/adev/src/content/examples/router/src/app/app.component.ts +++ /dev/null @@ -1,20 +0,0 @@ -// #docplaster -// #docregion -import {Component} from '@angular/core'; -import {ChildrenOutletContexts} from '@angular/router'; -import {slideInAnimation} from './animations'; - -@Component({ - selector: 'app-root', - templateUrl: 'app.component.html', - styleUrls: ['app.component.css'], - animations: [slideInAnimation], - standalone: false, -}) -export class AppComponent { - constructor(private contexts: ChildrenOutletContexts) {} - - getRouteAnimationData() { - return this.contexts.getContext('primary')?.route?.snapshot?.data?.['animation']; - } -} diff --git a/adev/src/content/examples/router/src/app/app.module.0.ts b/adev/src/content/examples/router/src/app/app.module.0.ts deleted file mode 100644 index a814ba49ed5d..000000000000 --- a/adev/src/content/examples/router/src/app/app.module.0.ts +++ /dev/null @@ -1,41 +0,0 @@ -// NEVER USED. For docs only. Should compile though -// #docplaster -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {HeroListComponent} from './hero-list/hero-list.component'; -import {CrisisListComponent} from './crisis-list/crisis-list.component'; -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; -import {PageNotFoundComponent as HeroDetailComponent} from './page-not-found/page-not-found.component'; - -// #docregion -const appRoutes: Routes = [ - {path: 'crisis-center', component: CrisisListComponent}, - {path: 'hero/:id', component: HeroDetailComponent}, - { - path: 'heroes', - component: HeroListComponent, - data: {title: 'Heroes List'}, - }, - {path: '', redirectTo: '/heroes', pathMatch: 'full'}, - {path: '**', component: PageNotFoundComponent}, -]; - -@NgModule({ - imports: [ - RouterModule.forRoot( - appRoutes, - {enableTracing: true}, // <-- debugging purposes only - ), - // other imports here - ], - // #enddocregion - /* -// #docregion - ... -}) -export class AppModule { } -// #enddocregion -*/ -}) -export class AppModule0 {} diff --git a/adev/src/content/examples/router/src/app/app.module.1.ts b/adev/src/content/examples/router/src/app/app.module.1.ts deleted file mode 100644 index 5a4c46d4a7e9..000000000000 --- a/adev/src/content/examples/router/src/app/app.module.1.ts +++ /dev/null @@ -1,48 +0,0 @@ -// #docplaster -// #docregion -// #docregion first-config -import {NgModule} from '@angular/core'; -import {FormsModule} from '@angular/forms'; -import {BrowserModule} from '@angular/platform-browser'; -import {RouterModule, Routes} from '@angular/router'; - -import {AppComponent} from './app.component'; -import {CrisisListComponent} from './crisis-list/crisis-list.component'; -import {HeroListComponent} from './hero-list/hero-list.component'; -// #enddocregion first-config -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; - -// #docregion first-config - -const appRoutes: Routes = [ - {path: 'crisis-center', component: CrisisListComponent}, - {path: 'heroes', component: HeroListComponent}, - // #enddocregion first-config - - {path: '', redirectTo: '/heroes', pathMatch: 'full'}, - // #docregion wildcard - {path: '**', component: PageNotFoundComponent}, // #enddocregion wildcard - // #docregion first-config -]; - -@NgModule({ - imports: [ - BrowserModule, - FormsModule, - RouterModule.forRoot( - appRoutes, - {enableTracing: true}, // <-- debugging purposes only - ), - ], - declarations: [ - AppComponent, - HeroListComponent, - CrisisListComponent, - // #enddocregion first-config - PageNotFoundComponent, - // #docregion first-config - ], - bootstrap: [AppComponent], -}) -export class AppModule {} -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/app.module.2.ts b/adev/src/content/examples/router/src/app/app.module.2.ts deleted file mode 100644 index 4a529679e6b7..000000000000 --- a/adev/src/content/examples/router/src/app/app.module.2.ts +++ /dev/null @@ -1,17 +0,0 @@ -import {NgModule} from '@angular/core'; -import {BrowserModule} from '@angular/platform-browser'; -import {FormsModule} from '@angular/forms'; - -import {AppComponent} from './app.component'; -import {AppRoutingModule} from './app-routing.module'; - -import {CrisisListComponent} from './crisis-list/crisis-list.component'; -import {HeroListComponent} from './hero-list/hero-list.component'; -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; - -@NgModule({ - imports: [BrowserModule, FormsModule, AppRoutingModule], - declarations: [AppComponent, HeroListComponent, CrisisListComponent, PageNotFoundComponent], - bootstrap: [AppComponent], -}) -export class AppModule {} diff --git a/adev/src/content/examples/router/src/app/app.module.3.ts b/adev/src/content/examples/router/src/app/app.module.3.ts deleted file mode 100644 index 2bb3f1bb141c..000000000000 --- a/adev/src/content/examples/router/src/app/app.module.3.ts +++ /dev/null @@ -1,37 +0,0 @@ -// #docplaster -// #docregion -// #docregion remove-heroes -import {NgModule} from '@angular/core'; -import {BrowserModule} from '@angular/platform-browser'; -import {FormsModule} from '@angular/forms'; -// #enddocregion remove-heroes -import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; - -// #docregion remove-heroes -import {AppComponent} from './app.component'; -import {AppRoutingModule} from './app-routing.module'; -import {HeroesModule} from './heroes/heroes.module'; - -import {CrisisListComponent} from './crisis-list/crisis-list.component'; -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; - -@NgModule({ - // #docregion module-imports - imports: [ - BrowserModule, - // #enddocregion module-imports - // #enddocregion remove-heroes - BrowserAnimationsModule, - // #docregion remove-heroes - // #docregion module-imports - FormsModule, - HeroesModule, - AppRoutingModule, - ], - // #enddocregion module-imports - declarations: [AppComponent, CrisisListComponent, PageNotFoundComponent], - bootstrap: [AppComponent], -}) -export class AppModule {} -// #enddocregion remove-heroes -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/app.module.4.ts b/adev/src/content/examples/router/src/app/app.module.4.ts deleted file mode 100644 index 4dc6c547da84..000000000000 --- a/adev/src/content/examples/router/src/app/app.module.4.ts +++ /dev/null @@ -1,41 +0,0 @@ -// #docplaster -// #docregion -// #docregion crisis-center-module, admin-module -import {NgModule} from '@angular/core'; -import {CommonModule} from '@angular/common'; -import {FormsModule} from '@angular/forms'; - -import {AppComponent} from './app.component'; -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; -import {ComposeMessageComponent} from './compose-message/compose-message.component'; - -import {AppRoutingModule} from './app-routing.module'; -import {HeroesModule} from './heroes/heroes.module'; -import {CrisisCenterModule} from './crisis-center/crisis-center.module'; -// #enddocregion crisis-center-module - -import {AdminModule} from './admin/admin.module'; -// #docregion crisis-center-module - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - HeroesModule, - CrisisCenterModule, - // #enddocregion crisis-center-module - AdminModule, - // #docregion crisis-center-module - AppRoutingModule, - ], - declarations: [ - AppComponent, - // #enddocregion crisis-center-module - ComposeMessageComponent, - // #docregion crisis-center-module - PageNotFoundComponent, - ], - bootstrap: [AppComponent], -}) -export class AppModule {} -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/app.module.5.ts b/adev/src/content/examples/router/src/app/app.module.5.ts deleted file mode 100644 index dc9d82c3220b..000000000000 --- a/adev/src/content/examples/router/src/app/app.module.5.ts +++ /dev/null @@ -1,30 +0,0 @@ -// #docplaster -// #docregion -import {NgModule} from '@angular/core'; -import {CommonModule} from '@angular/common'; -import {FormsModule} from '@angular/forms'; - -import {AppComponent} from './app.component'; -import {AppRoutingModule} from './app-routing.module'; - -import {HeroesModule} from './heroes/heroes.module'; -import {CrisisCenterModule} from './crisis-center/crisis-center.module'; - -import {ComposeMessageComponent} from './compose-message/compose-message.component'; -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; - -import {AdminModule} from './admin/admin.module'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - HeroesModule, - CrisisCenterModule, - AdminModule, - AppRoutingModule, - ], - declarations: [AppComponent, ComposeMessageComponent, PageNotFoundComponent], - bootstrap: [AppComponent], -}) -export class AppModule {} diff --git a/adev/src/content/examples/router/src/app/app.module.6.ts b/adev/src/content/examples/router/src/app/app.module.6.ts deleted file mode 100644 index fd80e1100d2b..000000000000 --- a/adev/src/content/examples/router/src/app/app.module.6.ts +++ /dev/null @@ -1,22 +0,0 @@ -// #docregion -import {NgModule} from '@angular/core'; -import {BrowserModule} from '@angular/platform-browser'; -import {FormsModule} from '@angular/forms'; -import {Routes, RouterModule} from '@angular/router'; - -import {AppComponent} from './app.component'; -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; - -const routes: Routes = []; - -@NgModule({ - imports: [ - BrowserModule, - FormsModule, - RouterModule.forRoot(routes, {useHash: true}), // .../#/crisis-center/ - ], - declarations: [AppComponent, PageNotFoundComponent], - providers: [], - bootstrap: [AppComponent], -}) -export class AppModule {} diff --git a/adev/src/content/examples/router/src/app/app.module.7.ts b/adev/src/content/examples/router/src/app/app.module.7.ts deleted file mode 100644 index e7bdcdbc2fc5..000000000000 --- a/adev/src/content/examples/router/src/app/app.module.7.ts +++ /dev/null @@ -1,38 +0,0 @@ -// #docregion -import {NgModule} from '@angular/core'; -import {BrowserModule} from '@angular/platform-browser'; -import {FormsModule} from '@angular/forms'; -import {Router} from '@angular/router'; - -import {AppComponent} from './app.component'; -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; -import {ComposeMessageComponent} from './compose-message/compose-message.component'; - -import {AppRoutingModule} from './app-routing.module'; -import {HeroesModule} from './heroes/heroes.module'; -import {CrisisCenterModule} from './crisis-center/crisis-center.module'; -import {AuthModule} from './auth/auth.module'; - -@NgModule({ - imports: [ - BrowserModule, - FormsModule, - HeroesModule, - CrisisCenterModule, - AuthModule, - AppRoutingModule, - ], - declarations: [AppComponent, ComposeMessageComponent, PageNotFoundComponent], - bootstrap: [AppComponent], -}) -// #docregion inspect-config -export class AppModule { - // Diagnostic only: inspect router configuration - constructor(router: Router) { - // Use a custom replacer to display function names in the route configs - const replacer = (key, value) => (typeof value === 'function' ? value.name : value); - - console.log('Routes: ', JSON.stringify(router.config, replacer, 2)); - } -} -// #enddocregion inspect-config diff --git a/adev/src/content/examples/router/src/app/app.module.8.ts b/adev/src/content/examples/router/src/app/app.module.8.ts deleted file mode 100644 index 22e79fc69e4e..000000000000 --- a/adev/src/content/examples/router/src/app/app.module.8.ts +++ /dev/null @@ -1,15 +0,0 @@ -import {BrowserModule} from '@angular/platform-browser'; -import {NgModule} from '@angular/core'; -import {AppRoutingModule} from './app-routing.module'; // CLI imports AppRoutingModule -import {AppComponent} from './app.component'; - -@NgModule({ - declarations: [AppComponent], - imports: [ - BrowserModule, - AppRoutingModule, // CLI adds AppRoutingModule to the AppModule's imports array - ], - providers: [], - bootstrap: [AppComponent], -}) -export class AppModule {} diff --git a/adev/src/content/examples/router/src/app/app.module.ts b/adev/src/content/examples/router/src/app/app.module.ts deleted file mode 100644 index 30c3f36f2adf..000000000000 --- a/adev/src/content/examples/router/src/app/app.module.ts +++ /dev/null @@ -1,51 +0,0 @@ -// #docplaster -// #docregion auth, preload -import {NgModule} from '@angular/core'; -import {BrowserModule} from '@angular/platform-browser'; -import {FormsModule} from '@angular/forms'; -// #docregion animations-module -import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; - -// #enddocregion auth, animations-module -import {Router} from '@angular/router'; - -// #docregion auth -import {AppComponent} from './app.component'; -import {PageNotFoundComponent} from './page-not-found/page-not-found.component'; -import {ComposeMessageComponent} from './compose-message/compose-message.component'; - -import {AppRoutingModule} from './app-routing.module'; -import {HeroesModule} from './heroes/heroes.module'; -import {AuthModule} from './auth/auth.module'; - -// #docregion animations-module -@NgModule({ - imports: [ - // #enddocregion animations-module - BrowserModule, - // #docregion animations-module - BrowserAnimationsModule, - // #enddocregion animations-module - FormsModule, - HeroesModule, - AuthModule, - AppRoutingModule, - // #docregion animations-module - ], - // #enddocregion animations-module - declarations: [AppComponent, ComposeMessageComponent, PageNotFoundComponent], - bootstrap: [AppComponent], - // #docregion animations-module -}) -// #enddocregion animations-module -export class AppModule { - // #enddocregion preload, auth - // Diagnostic only: inspect router configuration - constructor(router: Router) { - // Use a custom replacer to display function names in the route configs - // const replacer = (key, value) => (typeof value === 'function') ? value.name : value; - // console.log('Routes: ', JSON.stringify(router.config, replacer, 2)); - } - // #docregion preload, auth -} -// #enddocregion preload, auth diff --git a/adev/src/content/examples/router/src/app/auth/auth-routing.module.ts b/adev/src/content/examples/router/src/app/auth/auth-routing.module.ts deleted file mode 100644 index d7d960da5140..000000000000 --- a/adev/src/content/examples/router/src/app/auth/auth-routing.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -// #docregion -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; -import {authGuard} from './auth.guard'; -import {AuthService} from './auth.service'; -import {LoginComponent} from './login/login.component'; - -const authRoutes: Routes = [{path: 'login', component: LoginComponent}]; - -@NgModule({ - imports: [RouterModule.forChild(authRoutes)], - exports: [RouterModule], -}) -export class AuthRoutingModule {} diff --git a/adev/src/content/examples/router/src/app/auth/auth.guard.1.ts b/adev/src/content/examples/router/src/app/auth/auth.guard.1.ts deleted file mode 100644 index f8385d42d1e9..000000000000 --- a/adev/src/content/examples/router/src/app/auth/auth.guard.1.ts +++ /dev/null @@ -1,7 +0,0 @@ -// #docregion - -export const authGuard = () => { - console.log('authGuard#canActivate called'); - return true; -}; -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/auth/auth.guard.2.ts b/adev/src/content/examples/router/src/app/auth/auth.guard.2.ts deleted file mode 100644 index 124a66f4e380..000000000000 --- a/adev/src/content/examples/router/src/app/auth/auth.guard.2.ts +++ /dev/null @@ -1,19 +0,0 @@ -// #docregion -import {inject} from '@angular/core'; -import {Router} from '@angular/router'; - -import {AuthService} from './auth.service'; - -export const authGuard = () => { - const authService = inject(AuthService); - const router = inject(Router); - - if (authService.isLoggedIn) { - return true; - } - - // Redirect to the login page - return router.parseUrl('/login'); -}; - -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/auth/auth.guard.3.ts b/adev/src/content/examples/router/src/app/auth/auth.guard.3.ts deleted file mode 100644 index 981738d3d850..000000000000 --- a/adev/src/content/examples/router/src/app/auth/auth.guard.3.ts +++ /dev/null @@ -1,15 +0,0 @@ -import {inject} from '@angular/core'; -import {Router} from '@angular/router'; -import {AuthService} from './auth.service'; - -export const authGuard = () => { - const authService = inject(AuthService); - const router = inject(Router); - - if (authService.isLoggedIn) { - return true; - } - - // Redirect to the login page - return router.parseUrl('/login'); -}; diff --git a/adev/src/content/examples/router/src/app/auth/auth.guard.4.ts b/adev/src/content/examples/router/src/app/auth/auth.guard.4.ts deleted file mode 100644 index 6ad729821bda..000000000000 --- a/adev/src/content/examples/router/src/app/auth/auth.guard.4.ts +++ /dev/null @@ -1,27 +0,0 @@ -// #docplaster -// #docregion -import {inject} from '@angular/core'; -import {Router, NavigationExtras} from '@angular/router'; -import {AuthService} from './auth.service'; - -export const authGuard = () => { - const authService = inject(AuthService); - const router = inject(Router); - - if (authService.isLoggedIn) { - return true; - } - - // Create a dummy session id - const sessionId = 123456789; - - // Set our navigation extras object - // that contains our global query params and fragment - const navigationExtras: NavigationExtras = { - queryParams: {session_id: sessionId}, - fragment: 'anchor', - }; - - // Redirect to the login page with extras - return router.createUrlTree(['/login'], navigationExtras); -}; diff --git a/adev/src/content/examples/router/src/app/auth/auth.guard.ts b/adev/src/content/examples/router/src/app/auth/auth.guard.ts deleted file mode 100644 index 6e0bc6dfd1e0..000000000000 --- a/adev/src/content/examples/router/src/app/auth/auth.guard.ts +++ /dev/null @@ -1,26 +0,0 @@ -// #docplaster -import {inject} from '@angular/core'; -import {Router, NavigationExtras} from '@angular/router'; -import {AuthService} from './auth.service'; - -export const authGuard = () => { - const router = inject(Router); - const authService = inject(AuthService); - - if (authService.isLoggedIn) { - return true; - } - - // Create a dummy session id - const sessionId = 123456789; - - // Set our navigation extras object - // that contains our global query params and fragment - const navigationExtras: NavigationExtras = { - queryParams: {session_id: sessionId}, - fragment: 'anchor', - }; - - // Navigate to the login page with extras - return router.createUrlTree(['/login'], navigationExtras); -}; diff --git a/adev/src/content/examples/router/src/app/auth/auth.module.ts b/adev/src/content/examples/router/src/app/auth/auth.module.ts deleted file mode 100644 index b1ca22a44e4f..000000000000 --- a/adev/src/content/examples/router/src/app/auth/auth.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import {NgModule} from '@angular/core'; -import {CommonModule} from '@angular/common'; -import {FormsModule} from '@angular/forms'; - -import {LoginComponent} from './login/login.component'; -import {AuthRoutingModule} from './auth-routing.module'; - -@NgModule({ - imports: [CommonModule, FormsModule, AuthRoutingModule], - declarations: [LoginComponent], -}) -export class AuthModule {} diff --git a/adev/src/content/examples/router/src/app/auth/auth.service.ts b/adev/src/content/examples/router/src/app/auth/auth.service.ts deleted file mode 100644 index 812cfc1ce260..000000000000 --- a/adev/src/content/examples/router/src/app/auth/auth.service.ts +++ /dev/null @@ -1,26 +0,0 @@ -// #docregion -import {Injectable} from '@angular/core'; - -import {Observable, of} from 'rxjs'; -import {tap, delay} from 'rxjs/operators'; - -@Injectable({ - providedIn: 'root', -}) -export class AuthService { - isLoggedIn = false; - - // store the URL so we can redirect after logging in - redirectUrl: string | null = null; - - login(): Observable { - return of(true).pipe( - delay(1000), - tap(() => (this.isLoggedIn = true)), - ); - } - - logout(): void { - this.isLoggedIn = false; - } -} diff --git a/adev/src/content/examples/router/src/app/auth/login/login.component.1.ts b/adev/src/content/examples/router/src/app/auth/login/login.component.1.ts deleted file mode 100644 index cc903e7cb173..000000000000 --- a/adev/src/content/examples/router/src/app/auth/login/login.component.1.ts +++ /dev/null @@ -1,46 +0,0 @@ -// #docregion -import {Component} from '@angular/core'; -import {Router} from '@angular/router'; -import {AuthService} from '../auth.service'; - -@Component({ - selector: 'app-login', - templateUrl: './login.component.html', - styleUrls: ['./login.component.css'], - standalone: false, -}) -export class LoginComponent { - message: string; - - constructor( - public authService: AuthService, - public router: Router, - ) { - this.message = this.getMessage(); - } - - getMessage() { - return 'Logged ' + (this.authService.isLoggedIn ? 'in' : 'out'); - } - - login() { - this.message = 'Trying to log in ...'; - - this.authService.login().subscribe(() => { - this.message = this.getMessage(); - if (this.authService.isLoggedIn) { - // Usually you would use the redirect URL from the auth service. - // However to keep the example simple, we will always redirect to `/admin`. - const redirectUrl = '/admin'; - - // Redirect the user - this.router.navigate([redirectUrl]); - } - }); - } - - logout() { - this.authService.logout(); - this.message = this.getMessage(); - } -} diff --git a/adev/src/content/examples/router/src/app/auth/login/login.component.css b/adev/src/content/examples/router/src/app/auth/login/login.component.css deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/adev/src/content/examples/router/src/app/auth/login/login.component.html b/adev/src/content/examples/router/src/app/auth/login/login.component.html deleted file mode 100644 index e6de16fbf025..000000000000 --- a/adev/src/content/examples/router/src/app/auth/login/login.component.html +++ /dev/null @@ -1,6 +0,0 @@ -

Login

-

{{ message }}

-

- - -

diff --git a/adev/src/content/examples/router/src/app/auth/login/login.component.ts b/adev/src/content/examples/router/src/app/auth/login/login.component.ts deleted file mode 100644 index b6e2568054fc..000000000000 --- a/adev/src/content/examples/router/src/app/auth/login/login.component.ts +++ /dev/null @@ -1,55 +0,0 @@ -// #docregion -import {Component} from '@angular/core'; -import {NavigationExtras, Router} from '@angular/router'; -import {AuthService} from '../auth.service'; - -@Component({ - selector: 'app-login', - templateUrl: './login.component.html', - styleUrls: ['./login.component.css'], - standalone: false, -}) -export class LoginComponent { - message: string; - - constructor( - public authService: AuthService, - public router: Router, - ) { - this.message = this.getMessage(); - } - - getMessage() { - return 'Logged ' + (this.authService.isLoggedIn ? 'in' : 'out'); - } - - login() { - this.message = 'Trying to log in ...'; - - this.authService.login().subscribe(() => { - this.message = this.getMessage(); - if (this.authService.isLoggedIn) { - // Usually you would use the redirect URL from the auth service. - // However to keep the example simple, we will always redirect to `/admin`. - const redirectUrl = '/admin'; - - // #docregion preserve - // Set our navigation extras object - // that passes on our global query params and fragment - const navigationExtras: NavigationExtras = { - queryParamsHandling: 'preserve', - preserveFragment: true, - }; - - // Redirect the user - this.router.navigate([redirectUrl], navigationExtras); - // #enddocregion preserve - } - }); - } - - logout() { - this.authService.logout(); - this.message = this.getMessage(); - } -} diff --git a/adev/src/content/examples/router/src/app/can-deactivate.guard.1.ts b/adev/src/content/examples/router/src/app/can-deactivate.guard.1.ts deleted file mode 100644 index bda85bfa8f3b..000000000000 --- a/adev/src/content/examples/router/src/app/can-deactivate.guard.1.ts +++ /dev/null @@ -1,25 +0,0 @@ -// #docregion -import {Observable} from 'rxjs'; -import {CanDeactivateFn, ActivatedRouteSnapshot, RouterStateSnapshot} from '@angular/router'; - -import {CrisisDetailComponent} from './crisis-center/crisis-detail/crisis-detail.component'; - -export const canDeactivateGuard: CanDeactivateFn = ( - component: CrisisDetailComponent, - route: ActivatedRouteSnapshot, - state: RouterStateSnapshot, -): Observable | boolean => { - // Get the Crisis Center ID - console.log(route.paramMap.get('id')); - - // Get the current URL - console.log(state.url); - - // Allow synchronous navigation (`true`) if no crisis or the crisis is unchanged - if (!component.crisis || component.crisis.name === component.editName) { - return true; - } - // Otherwise ask the user with the dialog service and return its - // observable which resolves to true or false when the user decides - return component.dialogService.confirm('Discard changes?'); -}; diff --git a/adev/src/content/examples/router/src/app/can-deactivate.guard.ts b/adev/src/content/examples/router/src/app/can-deactivate.guard.ts deleted file mode 100644 index 44cd7c3b78df..000000000000 --- a/adev/src/content/examples/router/src/app/can-deactivate.guard.ts +++ /dev/null @@ -1,11 +0,0 @@ -// #docregion -import {CanDeactivateFn} from '@angular/router'; -import {Observable} from 'rxjs'; - -export interface CanComponentDeactivate { - canDeactivate?: () => Observable | Promise | boolean; -} - -export const canDeactivateGuard: CanDeactivateFn = ( - component: CanComponentDeactivate, -) => (component.canDeactivate ? component.canDeactivate() : true); diff --git a/adev/src/content/examples/router/src/app/compose-message/compose-message.component.css b/adev/src/content/examples/router/src/app/compose-message/compose-message.component.css deleted file mode 100644 index c7db9a077e1e..000000000000 --- a/adev/src/content/examples/router/src/app/compose-message/compose-message.component.css +++ /dev/null @@ -1,6 +0,0 @@ -textarea { - width: 100%; - margin-top: 1rem; - font-size: 1.2rem; - box-sizing: border-box; -} diff --git a/adev/src/content/examples/router/src/app/compose-message/compose-message.component.html b/adev/src/content/examples/router/src/app/compose-message/compose-message.component.html deleted file mode 100644 index cf8e9fdd8d09..000000000000 --- a/adev/src/content/examples/router/src/app/compose-message/compose-message.component.html +++ /dev/null @@ -1,17 +0,0 @@ - -

Contact Crisis Center

-
- {{ details }} -
-
-
- -
-
- -
-
-

- - -

diff --git a/adev/src/content/examples/router/src/app/compose-message/compose-message.component.ts b/adev/src/content/examples/router/src/app/compose-message/compose-message.component.ts deleted file mode 100644 index 5de0eb73a7bd..000000000000 --- a/adev/src/content/examples/router/src/app/compose-message/compose-message.component.ts +++ /dev/null @@ -1,42 +0,0 @@ -// #docregion -import {Component} from '@angular/core'; -import {ActivatedRoute, Router} from '@angular/router'; - -@Component({ - selector: 'app-compose-message', - templateUrl: './compose-message.component.html', - styleUrls: ['./compose-message.component.css'], - standalone: false, -}) -export class ComposeMessageComponent { - details = ''; - message = ''; - sending = false; - - constructor( - private router: Router, - private route: ActivatedRoute, - ) {} - - send() { - this.sending = true; - this.details = 'Sending Message...'; - - setTimeout(() => { - this.sending = false; - this.closePopup(); - }, 1000); - } - - cancel() { - this.closePopup(); - } - - // #docregion closePopup - closePopup() { - // Providing a `null` value to the named outlet - // clears the contents of the named outlet - this.router.navigate([{outlets: {popup: null}}], {relativeTo: this.route.parent}); - } - // #enddocregion closePopup -} diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-center-home/crisis-center-home.component.css b/adev/src/content/examples/router/src/app/crisis-center/crisis-center-home/crisis-center-home.component.css deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-center-home/crisis-center-home.component.html b/adev/src/content/examples/router/src/app/crisis-center/crisis-center-home/crisis-center-home.component.html deleted file mode 100644 index 430dd849421b..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-center-home/crisis-center-home.component.html +++ /dev/null @@ -1 +0,0 @@ -

Welcome to the Crisis Center

diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-center-home/crisis-center-home.component.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis-center-home/crisis-center-home.component.ts deleted file mode 100644 index a16093be3bff..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-center-home/crisis-center-home.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -// #docregion -import {Component} from '@angular/core'; - -@Component({ - selector: 'app-crisis-center-home', - templateUrl: './crisis-center-home.component.html', - styleUrls: ['./crisis-center-home.component.css'], - standalone: false, -}) -export class CrisisCenterHomeComponent {} diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.1.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.1.ts deleted file mode 100644 index 3f95c482395f..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.1.ts +++ /dev/null @@ -1,41 +0,0 @@ -// #docplaster -// #docregion -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {CrisisCenterHomeComponent} from './crisis-center-home/crisis-center-home.component'; -import {CrisisListComponent} from './crisis-list/crisis-list.component'; -import {CrisisCenterComponent} from './crisis-center/crisis-center.component'; -import {CrisisDetailComponent} from './crisis-detail/crisis-detail.component'; - -// #docregion routes -const crisisCenterRoutes: Routes = [ - { - path: 'crisis-center', - component: CrisisCenterComponent, - children: [ - { - path: '', - component: CrisisListComponent, - children: [ - { - path: ':id', - component: CrisisDetailComponent, - }, - { - path: '', - component: CrisisCenterHomeComponent, - }, - ], - }, - ], - }, -]; -// #enddocregion routes - -@NgModule({ - imports: [RouterModule.forChild(crisisCenterRoutes)], - exports: [RouterModule], -}) -export class CrisisCenterRoutingModule {} -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.2.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.2.ts deleted file mode 100644 index a3e798fe058b..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.2.ts +++ /dev/null @@ -1,43 +0,0 @@ -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {CrisisCenterHomeComponent} from './crisis-center-home/crisis-center-home.component'; -import {CrisisListComponent} from './crisis-list/crisis-list.component'; -import {CrisisCenterComponent} from './crisis-center/crisis-center.component'; -import {CrisisDetailComponent} from './crisis-detail/crisis-detail.component'; - -import {canDeactivateGuard} from '../can-deactivate.guard'; -import {crisisDetailResolver} from './crisis-detail-resolver'; - -const crisisCenterRoutes: Routes = [ - { - path: 'crisis-center', - component: CrisisCenterComponent, - children: [ - { - path: '', - component: CrisisListComponent, - children: [ - { - path: ':id', - component: CrisisDetailComponent, - canDeactivate: [canDeactivateGuard], - resolve: { - crisis: crisisDetailResolver, - }, - }, - { - path: '', - component: CrisisCenterHomeComponent, - }, - ], - }, - ], - }, -]; - -@NgModule({ - imports: [RouterModule.forChild(crisisCenterRoutes)], - exports: [RouterModule], -}) -export class CrisisCenterRoutingModule {} diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.3.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.3.ts deleted file mode 100644 index 330fe90524f7..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.3.ts +++ /dev/null @@ -1,39 +0,0 @@ -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {CrisisCenterHomeComponent} from './crisis-center-home/crisis-center-home.component'; -import {CrisisListComponent} from './crisis-list/crisis-list.component'; -import {CrisisCenterComponent} from './crisis-center/crisis-center.component'; -import {CrisisDetailComponent} from './crisis-detail/crisis-detail.component'; - -import {canDeactivateGuard} from '../can-deactivate.guard'; - -const crisisCenterRoutes: Routes = [ - { - path: 'crisis-center', - component: CrisisCenterComponent, - children: [ - { - path: '', - component: CrisisListComponent, - children: [ - { - path: ':id', - component: CrisisDetailComponent, - canDeactivate: [canDeactivateGuard], - }, - { - path: '', - component: CrisisCenterHomeComponent, - }, - ], - }, - ], - }, -]; - -@NgModule({ - imports: [RouterModule.forChild(crisisCenterRoutes)], - exports: [RouterModule], -}) -export class CrisisCenterRoutingModule {} diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.4.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.4.ts deleted file mode 100644 index 659238786a71..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.4.ts +++ /dev/null @@ -1,46 +0,0 @@ -// #docplaster -// #docregion -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {CrisisCenterHomeComponent} from './crisis-center-home/crisis-center-home.component'; -import {CrisisListComponent} from './crisis-list/crisis-list.component'; -import {CrisisCenterComponent} from './crisis-center/crisis-center.component'; -import {CrisisDetailComponent} from './crisis-detail/crisis-detail.component'; - -import {canDeactivateGuard} from '../can-deactivate.guard'; -import {crisisDetailResolver} from './crisis-detail-resolver'; - -const crisisCenterRoutes: Routes = [ - { - path: 'crisis-center', - component: CrisisCenterComponent, - children: [ - { - path: '', - component: CrisisListComponent, - children: [ - { - path: ':id', - component: CrisisDetailComponent, - canDeactivate: [canDeactivateGuard], - resolve: { - crisis: crisisDetailResolver, - }, - }, - { - path: '', - component: CrisisCenterHomeComponent, - }, - ], - }, - ], - }, -]; - -@NgModule({ - imports: [RouterModule.forChild(crisisCenterRoutes)], - exports: [RouterModule], -}) -export class CrisisCenterRoutingModule {} -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.ts deleted file mode 100644 index 4012954c594a..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-center-routing.module.ts +++ /dev/null @@ -1,46 +0,0 @@ -// #docplaster -// #docregion -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {CrisisCenterHomeComponent} from './crisis-center-home/crisis-center-home.component'; -import {CrisisListComponent} from './crisis-list/crisis-list.component'; -import {CrisisCenterComponent} from './crisis-center/crisis-center.component'; -import {CrisisDetailComponent} from './crisis-detail/crisis-detail.component'; - -import {canDeactivateGuard} from '../can-deactivate.guard'; -import {crisisDetailResolver} from './crisis-detail-resolver'; - -const crisisCenterRoutes: Routes = [ - { - path: '', - component: CrisisCenterComponent, - children: [ - { - path: '', - component: CrisisListComponent, - children: [ - { - path: ':id', - component: CrisisDetailComponent, - canDeactivate: [canDeactivateGuard], - resolve: { - crisis: crisisDetailResolver, - }, - }, - { - path: '', - component: CrisisCenterHomeComponent, - }, - ], - }, - ], - }, -]; - -@NgModule({ - imports: [RouterModule.forChild(crisisCenterRoutes)], - exports: [RouterModule], -}) -export class CrisisCenterRoutingModule {} -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-center.module.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis-center.module.ts deleted file mode 100644 index ec2ce678f890..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-center.module.ts +++ /dev/null @@ -1,22 +0,0 @@ -// #docregion -import {NgModule} from '@angular/core'; -import {FormsModule} from '@angular/forms'; -import {CommonModule} from '@angular/common'; - -import {CrisisCenterHomeComponent} from './crisis-center-home/crisis-center-home.component'; -import {CrisisListComponent} from './crisis-list/crisis-list.component'; -import {CrisisCenterComponent} from './crisis-center/crisis-center.component'; -import {CrisisDetailComponent} from './crisis-detail/crisis-detail.component'; - -import {CrisisCenterRoutingModule} from './crisis-center-routing.module'; - -@NgModule({ - imports: [CommonModule, FormsModule, CrisisCenterRoutingModule], - declarations: [ - CrisisCenterComponent, - CrisisListComponent, - CrisisCenterHomeComponent, - CrisisDetailComponent, - ], -}) -export class CrisisCenterModule {} diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-center/crisis-center.component.css b/adev/src/content/examples/router/src/app/crisis-center/crisis-center/crisis-center.component.css deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-center/crisis-center.component.html b/adev/src/content/examples/router/src/app/crisis-center/crisis-center/crisis-center.component.html deleted file mode 100644 index 5aace465b544..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-center/crisis-center.component.html +++ /dev/null @@ -1,2 +0,0 @@ -

Crisis Center

- diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-center/crisis-center.component.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis-center/crisis-center.component.ts deleted file mode 100644 index 6986363d5b49..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-center/crisis-center.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -// #docregion -import {Component} from '@angular/core'; - -@Component({ - selector: 'app-crisis-center', - templateUrl: './crisis-center.component.html', - styleUrls: ['./crisis-center.component.css'], - standalone: false, -}) -export class CrisisCenterComponent {} diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-detail-resolver.1.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis-detail-resolver.1.ts deleted file mode 100644 index 9d4fe02e319b..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-detail-resolver.1.ts +++ /dev/null @@ -1,3 +0,0 @@ -// #docregion - -export function crisisDetailResolver() {} diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-detail-resolver.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis-detail-resolver.ts deleted file mode 100644 index cc505380f414..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-detail-resolver.ts +++ /dev/null @@ -1,26 +0,0 @@ -// #docregion -import {inject} from '@angular/core'; -import {ActivatedRouteSnapshot, ResolveFn, Router} from '@angular/router'; -import {EMPTY, of} from 'rxjs'; -import {mergeMap} from 'rxjs/operators'; - -import {Crisis} from './crisis'; -import {CrisisService} from './crisis.service'; - -export const crisisDetailResolver: ResolveFn = (route: ActivatedRouteSnapshot) => { - const router = inject(Router); - const cs = inject(CrisisService); - const id = route.paramMap.get('id')!; - - return cs.getCrisis(id).pipe( - mergeMap((crisis) => { - if (crisis) { - return of(crisis); - } else { - // id not found - router.navigate(['/crisis-center']); - return EMPTY; - } - }), - ); -}; diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-detail/crisis-detail.component.1.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis-detail/crisis-detail.component.1.ts deleted file mode 100644 index d33a043848bf..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-detail/crisis-detail.component.1.ts +++ /dev/null @@ -1,68 +0,0 @@ -import {Component, OnInit} from '@angular/core'; -import {ActivatedRoute, Router, ParamMap} from '@angular/router'; -import {Observable} from 'rxjs'; -import {switchMap} from 'rxjs/operators'; - -import {CrisisService} from '../crisis.service'; -import {Crisis} from '../crisis'; -import {DialogService} from '../../dialog.service'; - -@Component({ - selector: 'app-crisis-detail', - templateUrl: './crisis-detail.component.html', - styleUrls: ['./crisis-detail.component.css'], - standalone: false, -}) -export class CrisisDetailComponent implements OnInit { - crisis!: Crisis; - editName = ''; - - constructor( - private service: CrisisService, - private router: Router, - private route: ActivatedRoute, - public dialogService: DialogService, - ) {} - - ngOnInit() { - this.route.paramMap - .pipe(switchMap((params: ParamMap) => this.service.getCrisis(params.get('id')!))) - .subscribe((crisis: Crisis) => { - if (crisis) { - this.editName = crisis.name; - this.crisis = crisis; - } else { - // id not found - this.gotoCrises(); - } - }); - } - - cancel() { - this.gotoCrises(); - } - - save() { - this.crisis.name = this.editName; - this.gotoCrises(); - } - - canDeactivate(): Observable | boolean { - // Allow synchronous navigation (`true`) if no crisis or the crisis is unchanged - if (!this.crisis || this.crisis.name === this.editName) { - return true; - } - // Otherwise ask the user with the dialog service and return its - // observable which resolves to true or false when the user decides - return this.dialogService.confirm('Discard changes?'); - } - - gotoCrises() { - const crisisId = this.crisis ? this.crisis.id : null; - // Pass along the crisis id if available - // so that the CrisisListComponent can select that crisis. - // Add a totally useless `foo` parameter for kicks. - // Relative navigation back to the crises - this.router.navigate(['../', {id: crisisId, foo: 'foo'}], {relativeTo: this.route}); - } -} diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-detail/crisis-detail.component.css b/adev/src/content/examples/router/src/app/crisis-center/crisis-detail/crisis-detail.component.css deleted file mode 100644 index 226dbc122391..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-detail/crisis-detail.component.css +++ /dev/null @@ -1,8 +0,0 @@ -h2 { - font-size: 1.5rem; -} - -input { - font-size: 1rem; - margin-top: 1rem; -} diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-detail/crisis-detail.component.html b/adev/src/content/examples/router/src/app/crisis-center/crisis-detail/crisis-detail.component.html deleted file mode 100644 index fdf83841d579..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-detail/crisis-detail.component.html +++ /dev/null @@ -1,10 +0,0 @@ -
-

{{ editName }}

-

Id: {{ crisis.id }}

- - -
- - -
-
diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-detail/crisis-detail.component.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis-detail/crisis-detail.component.ts deleted file mode 100644 index a1d99871873c..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-detail/crisis-detail.component.ts +++ /dev/null @@ -1,69 +0,0 @@ -// #docplaster -// #docregion -import {Component, OnInit} from '@angular/core'; -import {ActivatedRoute, Router} from '@angular/router'; -import {Observable} from 'rxjs'; - -import {Crisis} from '../crisis'; -import {DialogService} from '../../dialog.service'; - -@Component({ - selector: 'app-crisis-detail', - templateUrl: './crisis-detail.component.html', - styleUrls: ['./crisis-detail.component.css'], - standalone: false, -}) -export class CrisisDetailComponent implements OnInit { - crisis!: Crisis; - editName = ''; - - constructor( - private route: ActivatedRoute, - private router: Router, - public dialogService: DialogService, - ) {} - - // #docregion ngOnInit - ngOnInit() { - this.route.data.subscribe((data) => { - const crisis: Crisis = data['crisis']; - this.editName = crisis.name; - this.crisis = crisis; - }); - } - // #enddocregion ngOnInit - - // #docregion cancel-save - cancel() { - this.gotoCrises(); - } - - save() { - this.crisis.name = this.editName; - this.gotoCrises(); - } - // #enddocregion cancel-save - - // #docregion canDeactivate - canDeactivate(): Observable | boolean { - // Allow synchronous navigation (`true`) if no crisis or the crisis is unchanged - if (!this.crisis || this.crisis.name === this.editName) { - return true; - } - // Otherwise ask the user with the dialog service and return its - // observable which resolves to true or false when the user decides - return this.dialogService.confirm('Discard changes?'); - } - // #enddocregion canDeactivate - - gotoCrises() { - const crisisId = this.crisis ? this.crisis.id : null; - // Pass along the crisis id if available - // so that the CrisisListComponent can select that crisis. - // Add a totally useless `foo` parameter for kicks. - // #docregion gotoCrises-navigate - // Relative navigation back to the crises - this.router.navigate(['../', {id: crisisId, foo: 'foo'}], {relativeTo: this.route}); - // #enddocregion gotoCrises-navigate - } -} diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-list/crisis-list.component.1.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis-list/crisis-list.component.1.ts deleted file mode 100644 index ae1f54e5ea9e..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-list/crisis-list.component.1.ts +++ /dev/null @@ -1,32 +0,0 @@ -import {Component, OnInit} from '@angular/core'; -import {ActivatedRoute, ParamMap} from '@angular/router'; - -import {CrisisService} from '../crisis.service'; -import {Crisis} from '../crisis'; -import {Observable} from 'rxjs'; -import {switchMap} from 'rxjs/operators'; - -@Component({ - selector: 'app-crisis-list', - templateUrl: './crisis-list.component.html', - styleUrls: ['./crisis-list.component.css'], - standalone: false, -}) -export class CrisisListComponent implements OnInit { - crises$!: Observable; - selectedId = 0; - - constructor( - private service: CrisisService, - private route: ActivatedRoute, - ) {} - - ngOnInit() { - this.crises$ = this.route.paramMap.pipe( - switchMap((params: ParamMap) => { - this.selectedId = parseInt(params.get('id')!, 10); - return this.service.getCrises(); - }), - ); - } -} diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-list/crisis-list.component.css b/adev/src/content/examples/router/src/app/crisis-center/crisis-list/crisis-list.component.css deleted file mode 100644 index ac8af4cf1485..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-list/crisis-list.component.css +++ /dev/null @@ -1,64 +0,0 @@ -/* CrisisListComponent's private CSS styles */ -.crises { - margin: 0 0 2em 0; - list-style-type: none; - padding: 0; -} - -.crises li { - position: relative; - cursor: pointer; -} - -.crises li:hover { - left: 0.1em; -} - -.crises a { - color: black; - text-decoration: none; - display: block; - background-color: #eee; - margin: 0.5em 0; - border-radius: 4px; - line-height: 2rem; -} - -@media (min-width: 600px) { - .crises a { - font-size: 1.2rem; - padding: 0.5em 0; - line-height: 1.4rem; - } -} - -.crises a:hover { - color: #2c3a41; - background-color: #e6e6e6; - left: 0.1em; -} - -.crises .selected a { - background: #d6e6f7; -} - -.crises .selected a:hover { - background-color: #bdd7f5; -} - -.heroes .selected a { - background-color: #d6e6f7; -} - -.heroes .selected a:hover { - background-color: #bdd7f5; -} - -.crises .badge { - padding: 0.5em 0.6em; - color: white; - background-color: #435b60; - min-width: 16px; - margin-right: 0.8em; - border-radius: 4px 0 0 4px; -} diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-list/crisis-list.component.html b/adev/src/content/examples/router/src/app/crisis-center/crisis-list/crisis-list.component.html deleted file mode 100644 index 4a45de6b2e17..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-list/crisis-list.component.html +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis-list/crisis-list.component.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis-list/crisis-list.component.ts deleted file mode 100644 index 4ce0117e56a7..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis-list/crisis-list.component.ts +++ /dev/null @@ -1,32 +0,0 @@ -import {Component, OnInit} from '@angular/core'; -import {ActivatedRoute} from '@angular/router'; - -import {CrisisService} from '../crisis.service'; -import {Crisis} from '../crisis'; -import {Observable} from 'rxjs'; -import {switchMap} from 'rxjs/operators'; - -@Component({ - selector: 'app-crisis-list', - templateUrl: './crisis-list.component.html', - styleUrls: ['./crisis-list.component.css'], - standalone: false, -}) -export class CrisisListComponent implements OnInit { - crises$?: Observable; - selectedId = 0; - - constructor( - private service: CrisisService, - private route: ActivatedRoute, - ) {} - - ngOnInit() { - this.crises$ = this.route.firstChild?.paramMap.pipe( - switchMap((params) => { - this.selectedId = parseInt(params.get('id')!, 10); - return this.service.getCrises(); - }), - ); - } -} diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis.service.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis.service.ts deleted file mode 100644 index 27d1a20fb7c2..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis.service.ts +++ /dev/null @@ -1,38 +0,0 @@ -// #docplaster -// #docregion -import {BehaviorSubject} from 'rxjs'; -import {map} from 'rxjs/operators'; - -import {Injectable} from '@angular/core'; -import {MessageService} from '../message.service'; -import {Crisis} from './crisis'; -import {CRISES} from './mock-crises'; - -@Injectable({ - providedIn: 'root', -}) -export class CrisisService { - static nextCrisisId = 100; - private crises$: BehaviorSubject = new BehaviorSubject(CRISES); - - constructor(private messageService: MessageService) {} - - getCrises() { - return this.crises$; - } - - getCrisis(id: number | string) { - return this.getCrises().pipe(map((crises) => crises.find((crisis) => crisis.id === +id)!)); - } - - // #enddocregion - addCrisis(name: string) { - name = name.trim(); - if (name) { - const crisis = {id: CrisisService.nextCrisisId++, name}; - CRISES.push(crisis); - this.crises$.next(CRISES); - } - } - // #docregion -} diff --git a/adev/src/content/examples/router/src/app/crisis-center/crisis.ts b/adev/src/content/examples/router/src/app/crisis-center/crisis.ts deleted file mode 100644 index c7fc032be471..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/crisis.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface Crisis { - id: number; - name: string; -} diff --git a/adev/src/content/examples/router/src/app/crisis-center/mock-crises.ts b/adev/src/content/examples/router/src/app/crisis-center/mock-crises.ts deleted file mode 100644 index 52c5574bc3b0..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-center/mock-crises.ts +++ /dev/null @@ -1,9 +0,0 @@ -// #docregion -import {Crisis} from './crisis'; - -export const CRISES: Crisis[] = [ - {id: 1, name: 'Dragon Burning Cities'}, - {id: 2, name: 'Sky Rains Great White Sharks'}, - {id: 3, name: 'Giant Asteroid Heading For Earth'}, - {id: 4, name: 'Procrastinators Meeting Delayed Again'}, -]; diff --git a/adev/src/content/examples/router/src/app/crisis-list/crisis-list.component.1.css b/adev/src/content/examples/router/src/app/crisis-list/crisis-list.component.1.css deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/adev/src/content/examples/router/src/app/crisis-list/crisis-list.component.1.html b/adev/src/content/examples/router/src/app/crisis-list/crisis-list.component.1.html deleted file mode 100644 index aabd2a641e79..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-list/crisis-list.component.1.html +++ /dev/null @@ -1,2 +0,0 @@ -

CRISIS CENTER

-

Get your crisis here

diff --git a/adev/src/content/examples/router/src/app/crisis-list/crisis-list.component.1.ts b/adev/src/content/examples/router/src/app/crisis-list/crisis-list.component.1.ts deleted file mode 100644 index b12ec3394932..000000000000 --- a/adev/src/content/examples/router/src/app/crisis-list/crisis-list.component.1.ts +++ /dev/null @@ -1,11 +0,0 @@ -// Initial empty version -// #docregion -import {Component} from '@angular/core'; - -@Component({ - selector: 'app-crisis-list', - templateUrl: './crisis-list.component.1.html', - styleUrls: ['./crisis-list.component.1.css'], - standalone: false, -}) -export class CrisisListComponent {} diff --git a/adev/src/content/examples/router/src/app/dialog.service.ts b/adev/src/content/examples/router/src/app/dialog.service.ts deleted file mode 100644 index 9152f3ae419f..000000000000 --- a/adev/src/content/examples/router/src/app/dialog.service.ts +++ /dev/null @@ -1,23 +0,0 @@ -// #docregion -import {Injectable} from '@angular/core'; -import {Observable, of} from 'rxjs'; - -/** - * Async modal dialog service - * DialogService makes this app easier to test by faking this service. - * TODO: better modal implementation that doesn't use window.confirm - */ -@Injectable({ - providedIn: 'root', -}) -export class DialogService { - /** - * Ask user to confirm an action. `message` explains the action and choices. - * Returns observable resolving to `true`=confirm or `false`=cancel - */ - confirm(message?: string): Observable { - const confirmation = window.confirm(message || 'Is it OK?'); - - return of(confirmation); - } -} diff --git a/adev/src/content/examples/router/src/app/hero-list/hero-list.component.1.css b/adev/src/content/examples/router/src/app/hero-list/hero-list.component.1.css deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/adev/src/content/examples/router/src/app/hero-list/hero-list.component.1.html b/adev/src/content/examples/router/src/app/hero-list/hero-list.component.1.html deleted file mode 100644 index f1d912d5a945..000000000000 --- a/adev/src/content/examples/router/src/app/hero-list/hero-list.component.1.html +++ /dev/null @@ -1,6 +0,0 @@ - -

HEROES

-

Get your heroes here

- - - diff --git a/adev/src/content/examples/router/src/app/hero-list/hero-list.component.1.ts b/adev/src/content/examples/router/src/app/hero-list/hero-list.component.1.ts deleted file mode 100644 index cc9c678b54bc..000000000000 --- a/adev/src/content/examples/router/src/app/hero-list/hero-list.component.1.ts +++ /dev/null @@ -1,10 +0,0 @@ -// #docregion -import {Component} from '@angular/core'; - -@Component({ - selector: 'app-hero-list', - templateUrl: './hero-list.component.1.html', - styleUrls: ['./hero-list.component.1.css'], - standalone: false, -}) -export class HeroListComponent {} diff --git a/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.1.ts b/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.1.ts deleted file mode 100644 index 70540a02dd8f..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.1.ts +++ /dev/null @@ -1,39 +0,0 @@ -// #docplaster -// #docregion -import {switchMap} from 'rxjs/operators'; -import {Component, OnInit} from '@angular/core'; -import {Observable} from 'rxjs'; -// #docregion imports -import {Router, ActivatedRoute, ParamMap} from '@angular/router'; -// #enddocregion imports - -import {HeroService} from '../hero.service'; -import {Hero} from '../hero'; - -@Component({ - selector: 'app-hero-detail', - templateUrl: './hero-detail.component.html', - styleUrls: ['./hero-detail.component.css'], - standalone: false, -}) -export class HeroDetailComponent implements OnInit { - hero$!: Observable; - - constructor( - private route: ActivatedRoute, - private router: Router, - private service: HeroService, - ) {} - - ngOnInit() { - this.hero$ = this.route.paramMap.pipe( - switchMap((params: ParamMap) => this.service.getHero(params.get('id')!)), - ); - } - - // #docregion gotoHeroes - gotoHeroes() { - this.router.navigate(['/heroes']); - } - // #enddocregion gotoHeroes -} diff --git a/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.2.ts b/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.2.ts deleted file mode 100644 index 86a844fb907c..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.2.ts +++ /dev/null @@ -1,36 +0,0 @@ -// Snapshot version -// #docregion -import {Component, OnInit} from '@angular/core'; -import {ActivatedRoute, Router} from '@angular/router'; -import {Observable} from 'rxjs'; - -import {HeroService} from '../hero.service'; -import {Hero} from '../hero'; - -@Component({ - selector: 'app-hero-detail', - templateUrl: './hero-detail.component.html', - styleUrls: ['./hero-detail.component.css'], - standalone: false, -}) -export class HeroDetailComponent implements OnInit { - hero$!: Observable; - - constructor( - private route: ActivatedRoute, - private router: Router, - private service: HeroService, - ) {} - - // #docregion snapshot - ngOnInit() { - const id = this.route.snapshot.paramMap.get('id')!; - - this.hero$ = this.service.getHero(id); - } - // #enddocregion snapshot - - gotoHeroes() { - this.router.navigate(['/heroes']); - } -} diff --git a/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.3.ts b/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.3.ts deleted file mode 100644 index 20a40ec6318f..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.3.ts +++ /dev/null @@ -1,47 +0,0 @@ -// #docplaster -// #docregion -// #docregion rxjs-operator-import -import {switchMap} from 'rxjs/operators'; -// #enddocregion rxjs-operator-import -import {Component, OnInit} from '@angular/core'; -import {Router, ActivatedRoute, ParamMap} from '@angular/router'; -import {Observable} from 'rxjs'; - -import {HeroService} from '../hero.service'; -import {Hero} from '../hero'; - -@Component({ - selector: 'app-hero-detail', - templateUrl: './hero-detail.component.html', - styleUrls: ['./hero-detail.component.css'], - standalone: false, -}) -export class HeroDetailComponent implements OnInit { - hero$!: Observable; - - // #docregion ctor - constructor( - private route: ActivatedRoute, - private router: Router, - private service: HeroService, - ) {} - // #enddocregion ctor - - // #docregion ngOnInit - ngOnInit() { - this.hero$ = this.route.paramMap.pipe( - switchMap((params: ParamMap) => this.service.getHero(params.get('id')!)), - ); - } - // #enddocregion ngOnInit - - // #docregion gotoHeroes - gotoHeroes(hero: Hero) { - const heroId = hero ? hero.id : null; - // Pass along the hero id if available - // so that the HeroList component can select that hero. - // Include a junk 'foo' property for fun. - this.router.navigate(['/heroes', {id: heroId, foo: 'foo'}]); - } - // #enddocregion gotoHeroes -} diff --git a/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.4.ts b/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.4.ts deleted file mode 100644 index b965f14a3c85..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.4.ts +++ /dev/null @@ -1,38 +0,0 @@ -// #docplaster -// #docregion -import {Component, Input, OnInit} from '@angular/core'; -import {Router} from '@angular/router'; -import {Observable} from 'rxjs'; - -import {Hero} from '../hero'; -import {HeroService} from '../hero.service'; - -@Component({ - selector: 'app-hero-detail', - templateUrl: './hero-detail.component.html', - styleUrls: ['./hero-detail.component.css'], - standalone: false, -}) -export class HeroDetailComponent { - hero$!: Observable; - - constructor( - private router: Router, - private service: HeroService, - ) {} - - // #docregion id-input - @Input() - set id(heroId: string) { - this.hero$ = this.service.getHero(heroId); - } - // #enddocregion id-input - - gotoHeroes(hero: Hero) { - const heroId = hero ? hero.id : null; - // Pass along the hero id if available - // so that the HeroList component can select that hero. - // Include a junk 'foo' property for fun. - this.router.navigate(['/superheroes', {id: heroId, foo: 'foo'}]); - } -} diff --git a/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.css b/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.css deleted file mode 100644 index 8f1e21cbe3b7..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.css +++ /dev/null @@ -1,8 +0,0 @@ -button { - margin-top: 1rem; -} - -label { - display: block; - margin-bottom: .5rem; -} diff --git a/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.html b/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.html deleted file mode 100644 index c57347518309..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.html +++ /dev/null @@ -1,8 +0,0 @@ -

Heroes

-
-

{{ hero.name }}

-

Id: {{ hero.id }}

- - - -
diff --git a/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.ts b/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.ts deleted file mode 100644 index d9a33bde4164..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/hero-detail/hero-detail.component.ts +++ /dev/null @@ -1,41 +0,0 @@ -// #docplaster -// #docregion -import {Component, OnInit} from '@angular/core'; -import {ActivatedRoute, ParamMap, Router} from '@angular/router'; -import {Observable} from 'rxjs'; -import {switchMap} from 'rxjs/operators'; - -import {Hero} from '../hero'; -import {HeroService} from '../hero.service'; - -@Component({ - selector: 'app-hero-detail', - templateUrl: './hero-detail.component.html', - styleUrls: ['./hero-detail.component.css'], - standalone: false, -}) -export class HeroDetailComponent implements OnInit { - hero$!: Observable; - - constructor( - private route: ActivatedRoute, - private router: Router, - private service: HeroService, - ) {} - - ngOnInit() { - this.hero$ = this.route.paramMap.pipe( - switchMap((params: ParamMap) => this.service.getHero(params.get('id')!)), - ); - } - - // #docregion redirect - gotoHeroes(hero: Hero) { - const heroId = hero ? hero.id : null; - // Pass along the hero id if available - // so that the HeroList component can select that hero. - // Include a junk 'foo' property for fun. - this.router.navigate(['/superheroes', {id: heroId, foo: 'foo'}]); - } - // #enddocregion redirect -} diff --git a/adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.1.html b/adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.1.html deleted file mode 100644 index afee4814ff65..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.1.html +++ /dev/null @@ -1,14 +0,0 @@ -

Heroes

- - - diff --git a/adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.1.ts b/adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.1.ts deleted file mode 100644 index dd550a372821..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.1.ts +++ /dev/null @@ -1,22 +0,0 @@ -// TODO: Feature Componentized like HeroCenter -import {Component, OnInit} from '@angular/core'; -import {Observable} from 'rxjs'; - -import {HeroService} from '../hero.service'; -import {Hero} from '../hero'; - -@Component({ - selector: 'app-hero-list', - templateUrl: './hero-list.component.1.html', - styleUrls: ['./hero-list.component.css'], - standalone: false, -}) -export class HeroListComponent implements OnInit { - heroes$!: Observable; - - constructor(private service: HeroService) {} - - ngOnInit() { - this.heroes$ = this.service.getHeroes(); - } -} diff --git a/adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.css b/adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.css deleted file mode 100644 index 606deceae537..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.css +++ /dev/null @@ -1,55 +0,0 @@ -/* HeroListComponent's private CSS styles */ -.heroes { - margin: 0 0 2em 0; - list-style-type: none; - padding: 0; - width: 100%; -} -.heroes li { - position: relative; - cursor: pointer; -} - -.heroes li:hover { - left: .1em; -} - -.heroes a { - color: black; - text-decoration: none; - display: block; - font-size: 1.2rem; - background-color: #eee; - margin: .5rem .5rem .5rem 0; - padding: .5rem 0; - border-radius: 4px; -} - -.heroes a:hover { - color: #2c3a41; - background-color: #e6e6e6; -} - -.heroes a:active { - background-color: #525252; - color: #fafafa; -} - -/* #docregion selected */ -.heroes .selected a { - background-color: #d6e6f7; -} - -.heroes .selected a:hover { - background-color: #bdd7f5; -} -/* #enddocregion selected */ - -.heroes .badge { - padding: .5em .6em; - color: white; - background-color: #435b60; - min-width: 16px; - margin-right: .8em; - border-radius: 4px 0 0 4px; -} diff --git a/adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.html b/adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.html deleted file mode 100644 index ebaa0ef826d8..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.html +++ /dev/null @@ -1,10 +0,0 @@ -

Heroes

- - - diff --git a/adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.ts b/adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.ts deleted file mode 100644 index 5efb2940b34d..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/hero-list/hero-list.component.ts +++ /dev/null @@ -1,43 +0,0 @@ -// #docplaster -// #docregion -// TODO: Feature Componentized like CrisisCenter -// #docregion rxjs-imports -import {Observable} from 'rxjs'; -import {switchMap} from 'rxjs/operators'; -// #enddocregion rxjs-imports -import {Component, OnInit} from '@angular/core'; -// #docregion import-router -import {ActivatedRoute} from '@angular/router'; -// #enddocregion import-router - -import {HeroService} from '../hero.service'; -import {Hero} from '../hero'; - -@Component({ - selector: 'app-hero-list', - templateUrl: './hero-list.component.html', - styleUrls: ['./hero-list.component.css'], - standalone: false, -}) -// #docregion ctor -export class HeroListComponent implements OnInit { - heroes$!: Observable; - selectedId = 0; - - constructor( - private service: HeroService, - private route: ActivatedRoute, - ) {} - - ngOnInit() { - this.heroes$ = this.route.paramMap.pipe( - switchMap((params) => { - this.selectedId = parseInt(params.get('id')!, 10); - return this.service.getHeroes(); - }), - ); - } - // #enddocregion ctor - // #docregion ctor -} -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/heroes/hero.service.ts b/adev/src/content/examples/router/src/app/heroes/hero.service.ts deleted file mode 100644 index 42de800487d7..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/hero.service.ts +++ /dev/null @@ -1,29 +0,0 @@ -// #docregion -import {Injectable} from '@angular/core'; - -import {Observable, of} from 'rxjs'; -import {map} from 'rxjs/operators'; - -import {Hero} from './hero'; -import {HEROES} from './mock-heroes'; -import {MessageService} from '../message.service'; - -@Injectable({ - providedIn: 'root', -}) -export class HeroService { - constructor(private messageService: MessageService) {} - - getHeroes(): Observable { - // TODO: send the message _after_ fetching the heroes - this.messageService.add('HeroService: fetched heroes'); - return of(HEROES); - } - - getHero(id: number | string) { - return this.getHeroes().pipe( - // (+) before `id` turns the string into a number - map((heroes: Hero[]) => heroes.find((hero) => hero.id === +id)!), - ); - } -} diff --git a/adev/src/content/examples/router/src/app/heroes/hero.ts b/adev/src/content/examples/router/src/app/heroes/hero.ts deleted file mode 100644 index a61b497759b7..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/hero.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface Hero { - id: number; - name: string; -} diff --git a/adev/src/content/examples/router/src/app/heroes/heroes-routing.module.1.ts b/adev/src/content/examples/router/src/app/heroes/heroes-routing.module.1.ts deleted file mode 100644 index d461936f6480..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/heroes-routing.module.1.ts +++ /dev/null @@ -1,20 +0,0 @@ -// #docregion -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {HeroListComponent} from './hero-list/hero-list.component'; -import {HeroDetailComponent} from './hero-detail/hero-detail.component'; - -const heroesRoutes: Routes = [ - {path: 'heroes', component: HeroListComponent}, - // #docregion hero-detail-route - {path: 'hero/:id', component: HeroDetailComponent}, - // #enddocregion hero-detail-route -]; - -@NgModule({ - imports: [RouterModule.forChild(heroesRoutes)], - exports: [RouterModule], -}) -export class HeroesRoutingModule {} -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/heroes/heroes-routing.module.2.ts b/adev/src/content/examples/router/src/app/heroes/heroes-routing.module.2.ts deleted file mode 100644 index 48c2eba9a7d5..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/heroes-routing.module.2.ts +++ /dev/null @@ -1,18 +0,0 @@ -// #docregion -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {HeroListComponent} from './hero-list/hero-list.component'; -import {HeroDetailComponent} from './hero-detail/hero-detail.component'; - -const heroesRoutes: Routes = [ - {path: 'heroes', component: HeroListComponent, data: {animation: 'heroes'}}, - {path: 'hero/:id', component: HeroDetailComponent, data: {animation: 'hero'}}, -]; - -@NgModule({ - imports: [RouterModule.forChild(heroesRoutes)], - exports: [RouterModule], -}) -export class HeroesRoutingModule {} -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/heroes/heroes-routing.module.ts b/adev/src/content/examples/router/src/app/heroes/heroes-routing.module.ts deleted file mode 100644 index 98483828dd1a..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/heroes-routing.module.ts +++ /dev/null @@ -1,20 +0,0 @@ -// #docregion -import {NgModule} from '@angular/core'; -import {RouterModule, Routes} from '@angular/router'; - -import {HeroListComponent} from './hero-list/hero-list.component'; -import {HeroDetailComponent} from './hero-detail/hero-detail.component'; - -const heroesRoutes: Routes = [ - {path: 'heroes', redirectTo: '/superheroes'}, - {path: 'hero/:id', redirectTo: '/superhero/:id'}, - {path: 'superheroes', component: HeroListComponent, data: {animation: 'heroes'}}, - {path: 'superhero/:id', component: HeroDetailComponent, data: {animation: 'hero'}}, -]; - -@NgModule({ - imports: [RouterModule.forChild(heroesRoutes)], - exports: [RouterModule], -}) -export class HeroesRoutingModule {} -// #enddocregion diff --git a/adev/src/content/examples/router/src/app/heroes/heroes.module.ts b/adev/src/content/examples/router/src/app/heroes/heroes.module.ts deleted file mode 100644 index 310a6f571615..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/heroes.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import {NgModule} from '@angular/core'; -import {CommonModule} from '@angular/common'; -import {FormsModule} from '@angular/forms'; - -import {HeroListComponent} from './hero-list/hero-list.component'; -import {HeroDetailComponent} from './hero-detail/hero-detail.component'; - -import {HeroesRoutingModule} from './heroes-routing.module'; - -@NgModule({ - imports: [CommonModule, FormsModule, HeroesRoutingModule], - declarations: [HeroListComponent, HeroDetailComponent], -}) -export class HeroesModule {} diff --git a/adev/src/content/examples/router/src/app/heroes/mock-heroes.ts b/adev/src/content/examples/router/src/app/heroes/mock-heroes.ts deleted file mode 100644 index 8761b672e728..000000000000 --- a/adev/src/content/examples/router/src/app/heroes/mock-heroes.ts +++ /dev/null @@ -1,13 +0,0 @@ -import {Hero} from './hero'; - -export const HEROES: Hero[] = [ - {id: 12, name: 'Dr. Nice'}, - {id: 13, name: 'Bombasto'}, - {id: 14, name: 'Celeritas'}, - {id: 15, name: 'Magneta'}, - {id: 16, name: 'RubberMan'}, - {id: 17, name: 'Dynama'}, - {id: 18, name: 'Dr. IQ'}, - {id: 19, name: 'Magma'}, - {id: 20, name: 'Tornado'}, -]; diff --git a/adev/src/content/examples/router/src/app/message.service.ts b/adev/src/content/examples/router/src/app/message.service.ts deleted file mode 100644 index 63f8dcfd8eb5..000000000000 --- a/adev/src/content/examples/router/src/app/message.service.ts +++ /dev/null @@ -1,16 +0,0 @@ -import {Injectable} from '@angular/core'; - -@Injectable({ - providedIn: 'root', -}) -export class MessageService { - messages: string[] = []; - - add(message: string) { - this.messages.push(message); - } - - clear() { - this.messages = []; - } -} diff --git a/adev/src/content/examples/router/src/app/page-not-found/page-not-found.component.css b/adev/src/content/examples/router/src/app/page-not-found/page-not-found.component.css deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/adev/src/content/examples/router/src/app/page-not-found/page-not-found.component.html b/adev/src/content/examples/router/src/app/page-not-found/page-not-found.component.html deleted file mode 100644 index 6c581c4fc8ee..000000000000 --- a/adev/src/content/examples/router/src/app/page-not-found/page-not-found.component.html +++ /dev/null @@ -1 +0,0 @@ -

Page not found

\ No newline at end of file diff --git a/adev/src/content/examples/router/src/app/page-not-found/page-not-found.component.ts b/adev/src/content/examples/router/src/app/page-not-found/page-not-found.component.ts deleted file mode 100644 index 72bee1fb645e..000000000000 --- a/adev/src/content/examples/router/src/app/page-not-found/page-not-found.component.ts +++ /dev/null @@ -1,9 +0,0 @@ -import {Component} from '@angular/core'; - -@Component({ - selector: 'app-page-not-found', - templateUrl: './page-not-found.component.html', - styleUrls: ['./page-not-found.component.css'], - standalone: false, -}) -export class PageNotFoundComponent {} diff --git a/adev/src/content/examples/router/src/app/selective-preloading-strategy.service.ts b/adev/src/content/examples/router/src/app/selective-preloading-strategy.service.ts deleted file mode 100644 index 71c9254a0ae1..000000000000 --- a/adev/src/content/examples/router/src/app/selective-preloading-strategy.service.ts +++ /dev/null @@ -1,25 +0,0 @@ -// #docregion -import {Injectable} from '@angular/core'; -import {PreloadingStrategy, Route} from '@angular/router'; -import {Observable, of} from 'rxjs'; - -@Injectable({ - providedIn: 'root', -}) -export class SelectivePreloadingStrategyService implements PreloadingStrategy { - preloadedModules: string[] = []; - - preload(route: Route, load: () => Observable): Observable { - if (route.canMatch === undefined && route.data?.['preload'] && route.path != null) { - // add the route path to the preloaded module array - this.preloadedModules.push(route.path); - - // log the route path to the console - console.log('Preloaded: ' + route.path); - - return load(); - } else { - return of(null); - } - } -} From 5283c2b080cfb156c011ee2b2edde9bca5d7b5e5 Mon Sep 17 00:00:00 2001 From: Vlad Boisa <60569670+vladboisa@users.noreply.github.com> Date: Sat, 15 Feb 2025 00:42:49 +0000 Subject: [PATCH 0098/1000] docs: add serve section to Service-worker (#59972) Add the section which mention way to enable service-worker during local development Fixes #59949 PR Close #59972 --- .../service-workers/getting-started.md | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/adev/src/content/ecosystem/service-workers/getting-started.md b/adev/src/content/ecosystem/service-workers/getting-started.md index bd8394928677..ec89a81aae2e 100644 --- a/adev/src/content/ecosystem/service-workers/getting-started.md +++ b/adev/src/content/ecosystem/service-workers/getting-started.md @@ -37,7 +37,24 @@ The CLI project is now set up to use the Angular service worker. ## Service worker in action: a tour This section demonstrates a service worker in action, -using an example application. +using an example application. To enable service worker support during local development, use the production configuration with the following command: + + + +ng serve --prod + + + +Alternatively, you can use the [`http-server package`](https://www.npmjs.com/package/http-server) from +npm, which supports service worker applications. Run it without installation using: + + + +npx http-server -p 8080 -c-1 dist/<project-name>/browser + + + +This will serve your application with service worker support at http://localhost:8080. ### Initial load From 967488247eb94c75b1beac510ddfe03c97102f2e Mon Sep 17 00:00:00 2001 From: arturovt Date: Sun, 26 Jan 2025 16:12:11 +0200 Subject: [PATCH 0099/1000] refactor(common): simplify `stripTrailingSlash` (#59746) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The new version of the function is smaller, eliminating extra bytes. The refactor improves both code size and readability while optimizing the implementation. Benchmark results for the old and new implementations are as follows: ``` stripTrailingSlash_old x 15,446,602 ops/sec ±0.89% (66 runs sampled) stripTrailingSlash_new x 19,694,523 ops/sec ±1.10% (61 runs sampled) ``` Thus, the new implementation is both smaller and faster. PR Close #59746 --- .../common/src/location/hash_location_strategy.ts | 14 ++++++-------- packages/common/src/location/util.ts | 13 ++++++++----- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/packages/common/src/location/hash_location_strategy.ts b/packages/common/src/location/hash_location_strategy.ts index 482a6a822112..b69b76dd8613 100644 --- a/packages/common/src/location/hash_location_strategy.ts +++ b/packages/common/src/location/hash_location_strategy.ts @@ -77,18 +77,16 @@ export class HashLocationStrategy extends LocationStrategy implements OnDestroy } override pushState(state: any, title: string, path: string, queryParams: string) { - let url: string | null = this.prepareExternalUrl(path + normalizeQueryParams(queryParams)); - if (url.length == 0) { - url = this._platformLocation.pathname; - } + const url = + this.prepareExternalUrl(path + normalizeQueryParams(queryParams)) || + this._platformLocation.pathname; this._platformLocation.pushState(state, title, url); } override replaceState(state: any, title: string, path: string, queryParams: string) { - let url = this.prepareExternalUrl(path + normalizeQueryParams(queryParams)); - if (url.length == 0) { - url = this._platformLocation.pathname; - } + const url = + this.prepareExternalUrl(path + normalizeQueryParams(queryParams)) || + this._platformLocation.pathname; this._platformLocation.replaceState(state, title, url); } diff --git a/packages/common/src/location/util.ts b/packages/common/src/location/util.ts index b5c8f7e11187..c009de02c42e 100644 --- a/packages/common/src/location/util.ts +++ b/packages/common/src/location/util.ts @@ -38,10 +38,13 @@ export function joinWithSlash(start: string, end: string) { * @returns The URL string, modified if needed. */ export function stripTrailingSlash(url: string): string { - const match = url.match(/#|\?|$/); - const pathEndIdx = (match && match.index) || url.length; - const droppedSlashIdx = pathEndIdx - (url[pathEndIdx - 1] === '/' ? 1 : 0); - return url.slice(0, droppedSlashIdx) + url.slice(pathEndIdx); + // Find the index of the first occurrence of `#`, `?`, or the end of the string. + // This marks the start of the query string, fragment, or the end of the URL path. + const pathEndIdx = url.search(/#|\?|$/); + // Check if the character before `pathEndIdx` is a trailing slash. + // If it is, remove the trailing slash and return the modified URL. + // Otherwise, return the URL as is. + return url[pathEndIdx - 1] === '/' ? url.slice(0, pathEndIdx - 1) + url.slice(pathEndIdx) : url; } /** @@ -52,5 +55,5 @@ export function stripTrailingSlash(url: string): string { * @returns The normalized URL parameters string. */ export function normalizeQueryParams(params: string): string { - return params && params[0] !== '?' ? '?' + params : params; + return params && params[0] !== '?' ? `?${params}` : params; } From cf3a5073ece9eb313bb4832b3f78aa1bfeca09c6 Mon Sep 17 00:00:00 2001 From: arturovt Date: Sat, 25 Jan 2025 00:56:56 +0200 Subject: [PATCH 0100/1000] refactor(core): improve `stringify` (#59745) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In this commit, we improve branching in the `stringify` function, which is widely used by the framework, and add additional comments for clarification. Benchmark results of the old and new implementations (using `slice` makes it slightly faster) are as follows: ``` stringify (old version) x 117,945,419 ops/sec ±5.25% (55 runs sampled) stringify (new version) x 136,692,820 ops/sec ±4.82% (56 runs sampled) ``` PR Close #59745 --- packages/core/src/util/stringify.ts | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/packages/core/src/util/stringify.ts b/packages/core/src/util/stringify.ts index 916ddeaeb490..64cca9475a0f 100644 --- a/packages/core/src/util/stringify.ts +++ b/packages/core/src/util/stringify.ts @@ -12,29 +12,26 @@ export function stringify(token: any): string { } if (Array.isArray(token)) { - return '[' + token.map(stringify).join(', ') + ']'; + return `[${token.map(stringify).join(', ')}]`; } if (token == null) { return '' + token; } - if (token.overriddenName) { - return `${token.overriddenName}`; + const name = token.overriddenName || token.name; + if (name) { + return `${name}`; } - if (token.name) { - return `${token.name}`; - } - - const res = token.toString(); + const result = token.toString(); - if (res == null) { - return '' + res; + if (result == null) { + return '' + result; } - const newLineIndex = res.indexOf('\n'); - return newLineIndex === -1 ? res : res.substring(0, newLineIndex); + const newLineIndex = result.indexOf('\n'); + return newLineIndex >= 0 ? result.slice(0, newLineIndex) : result; } /** From b2947e83f738e9b3778a6619f9798fb79c53671d Mon Sep 17 00:00:00 2001 From: arturovt Date: Mon, 27 Jan 2025 22:44:21 +0200 Subject: [PATCH 0101/1000] refactor(forms): remove `_checkFormPresent` and move directly to `ngOnChanges` (#59741) In this commit, we remove `_checkFormPresent` because it is a no-op in production. We move its body directly into `ngOnChanges` to eliminate the redundant method from the prototype. Previously, `_checkFormPresent` was being called with no body in production each time `ngOnChanges` was executed. PR Close #59741 --- .../reactive_directives/form_group_directive.ts | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/packages/forms/src/directives/reactive_directives/form_group_directive.ts b/packages/forms/src/directives/reactive_directives/form_group_directive.ts index 5143f0659e35..02955eee3dcb 100644 --- a/packages/forms/src/directives/reactive_directives/form_group_directive.ts +++ b/packages/forms/src/directives/reactive_directives/form_group_directive.ts @@ -149,7 +149,10 @@ export class FormGroupDirective extends ControlContainer implements Form, OnChan /** @nodoc */ ngOnChanges(changes: SimpleChanges): void { - this._checkFormPresent(); + if ((typeof ngDevMode === 'undefined' || ngDevMode) && !this.form) { + throw missingFormException(); + } + if (changes.hasOwnProperty('form')) { this._updateValidators(); this._updateDomValue(); @@ -405,10 +408,4 @@ export class FormGroupDirective extends ControlContainer implements Form, OnChan cleanUpValidators(this._oldForm, this); } } - - private _checkFormPresent() { - if (!this.form && (typeof ngDevMode === 'undefined' || ngDevMode)) { - throw missingFormException(); - } - } } From 40dc99da9c609a3ae3dc70d2f278354f577a0c75 Mon Sep 17 00:00:00 2001 From: arturovt Date: Thu, 23 Jan 2025 19:52:25 +0200 Subject: [PATCH 0102/1000] refactor(common): inline supports check in `slice` pipe (#59684) The refactored version improves the original code by removing the `supports` method from the prototype and inlining the logic directly into the `transform` method. This reduces indirection and simplifies the class, especially since `supports` is not reused elsewhere. ESBuild can directly inline the condition into the `if` statement by removing the variable: `if (!("string" == typeof e || Array.isArray(e))) throw i(s, e);`. PR Close #59684 --- packages/common/src/pipes/slice_pipe.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/common/src/pipes/slice_pipe.ts b/packages/common/src/pipes/slice_pipe.ts index 038364dd1155..567f5fc12ef9 100644 --- a/packages/common/src/pipes/slice_pipe.ts +++ b/packages/common/src/pipes/slice_pipe.ts @@ -81,14 +81,12 @@ export class SlicePipe implements PipeTransform { ): Array | string | null { if (value == null) return null; - if (!this.supports(value)) { + const supports = typeof value === 'string' || Array.isArray(value); + + if (!supports) { throw invalidPipeArgumentError(SlicePipe, value); } return value.slice(start, end); } - - private supports(obj: any): boolean { - return typeof obj === 'string' || Array.isArray(obj); - } } From 497028cc52c59e5ae8dd4066c35b14a28002f2e2 Mon Sep 17 00:00:00 2001 From: Jessica Janiuk Date: Wed, 19 Feb 2025 18:44:29 +0000 Subject: [PATCH 0103/1000] docs: release notes for the v19.1.7 release --- CHANGELOG.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ce61d94c0e4..0b80fb3bfa33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,20 @@ + +# 19.1.7 (2025-02-19) +### common +| Commit | Type | Description | +| -- | -- | -- | +| [e9f10eb4c9](https://github.com/angular/angular/commit/e9f10eb4c950692992098619b9628ecefd1b36ce) | fix | clean up `urlChanges` subscribers when root scope is destroyed ([#59703](https://github.com/angular/angular/pull/59703)) | +### compiler-cli +| Commit | Type | Description | +| -- | -- | -- | +| [16fc074689](https://github.com/angular/angular/commit/16fc074689d31ef6886c49525b020bc6c1529d0e) | fix | avoid crash in isolated transform operations ([#59869](https://github.com/angular/angular/pull/59869)) | +### forms +| Commit | Type | Description | +| -- | -- | -- | +| [ec1e4c3d94](https://github.com/angular/angular/commit/ec1e4c3d9430f5ea4380252098d2b4b71d8a950f) | fix | Fix typing on `FormRecord`. ([#59993](https://github.com/angular/angular/pull/59993)) | + + + # 19.2.0-next.3 (2025-02-13) ### compiler From 58482bb24bc29c4c35550261149ceb150e75ce05 Mon Sep 17 00:00:00 2001 From: Jessica Janiuk Date: Wed, 19 Feb 2025 19:04:06 +0000 Subject: [PATCH 0104/1000] release: bump the next branch to v19.3.0-next.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 87fca5e15c17..23b8d7bc9e46 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "angular-srcs", - "version": "19.2.0-next.3", + "version": "19.3.0-next.0", "private": true, "description": "Angular - a web framework for modern web apps", "homepage": "https://github.com/angular/angular", From 8c1b196ecda5b5cc9716b2c04a531823f56c7b2d Mon Sep 17 00:00:00 2001 From: Jessica Janiuk Date: Wed, 19 Feb 2025 19:04:06 +0000 Subject: [PATCH 0105/1000] docs: release notes for the v19.2.0-rc.0 release --- CHANGELOG.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b80fb3bfa33..27dfb9960085 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,33 @@ + +# 19.2.0-rc.0 (2025-02-19) +### common +| Commit | Type | Description | +| -- | -- | -- | +| [3e39da593a](https://github.com/angular/angular/commit/3e39da593a0a0c047a2a03b8d5fcabf9dbace40f) | feat | introduce experimental `httpResource` ([#59876](https://github.com/angular/angular/pull/59876)) | +| [7bd4be0fa5](https://github.com/angular/angular/commit/7bd4be0fa585fda8a09d27683ade77b383500768) | fix | clean up `urlChanges` subscribers when root scope is destroyed ([#59703](https://github.com/angular/angular/pull/59703)) | +### compiler +| Commit | Type | Description | +| -- | -- | -- | +| [5b20bab96d](https://github.com/angular/angular/commit/5b20bab96d20fe89b5cc4b4af28edbaae2604da1) | feat | Add Skip Hydration diagnostic. ([#59576](https://github.com/angular/angular/pull/59576)) | +### compiler-cli +| Commit | Type | Description | +| -- | -- | -- | +| [973033abd2](https://github.com/angular/angular/commit/973033abd2d9580cec79948c9c38f977fef2de87) | fix | avoid crash in isolated transform operations ([#59869](https://github.com/angular/angular/pull/59869)) | +### core +| Commit | Type | Description | +| -- | -- | -- | +| [2588985f43](https://github.com/angular/angular/commit/2588985f433b20a6a5a8d239347291f5d6fb2451) | feat | pass signal node to throwInvalidWriteToSignalErrorFn ([#59600](https://github.com/angular/angular/pull/59600)) | +### forms +| Commit | Type | Description | +| -- | -- | -- | +| [cf36951f83](https://github.com/angular/angular/commit/cf36951f8327d461a3ad4bf65d12bb16cf9a9e4b) | fix | Fix typing on `FormRecord`. ([#59993](https://github.com/angular/angular/pull/59993)) | +### migrations +| Commit | Type | Description | +| -- | -- | -- | +| [1cd3a7db83](https://github.com/angular/angular/commit/1cd3a7db83e1d05a31d23324676420b614cdabe2) | feat | add migration to convert templates to use self-closing tags ([#57342](https://github.com/angular/angular/pull/57342)) | + + + # 19.1.7 (2025-02-19) ### common From 8657a0e4cc45bb91827bfb1e2e79ae191b5e0804 Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Wed, 5 Feb 2025 11:28:54 -0800 Subject: [PATCH 0106/1000] refactor(core): Add fake navigation to primitives for code sharing (#59857) This moves the `FakeNavigation` implementation to the primitives folder so its implementation can be shared with Wiz. This class was initially copied directly from the Wiz implementation, with some small modifications. There will still need to be some work done to align the implementations and fix anything internally that needs adjusting. PR Close #59857 --- packages/common/BUILD.bazel | 1 + .../common/src/navigation/navigation_types.ts | 181 ---- .../src/navigation/platform_navigation.ts | 25 +- packages/common/testing/BUILD.bazel | 1 + .../testing/src/navigation/fake_navigation.ts | 970 +---------------- .../provide_fake_platform_navigation.ts | 8 +- packages/common/testing/src/private_export.ts | 1 + packages/core/BUILD.bazel | 1 + .../primitives/dom-navigation/BUILD.bazel | 32 + .../core/primitives/dom-navigation/index.ts | 9 + .../dom-navigation/src}/navigation_types.ts | 2 + .../dom-navigation/testing/BUILD.bazel | 34 + .../dom-navigation/testing/fake_navigation.ts | 990 ++++++++++++++++++ .../dom-navigation/testing/index.ts | 9 + .../dom-navigation/testing/test/BUILD.bazel | 30 + .../test}/fake_platform_navigation.spec.ts | 5 +- packages/core/src/core_private_export.ts | 15 + packages/core/testing/BUILD.bazel | 1 + packages/core/testing/public_api.ts | 1 + .../testing/src/testing_private_export.ts | 9 + 20 files changed, 1158 insertions(+), 1167 deletions(-) delete mode 100644 packages/common/src/navigation/navigation_types.ts create mode 100644 packages/core/primitives/dom-navigation/BUILD.bazel create mode 100644 packages/core/primitives/dom-navigation/index.ts rename packages/{common/testing/src/navigation => core/primitives/dom-navigation/src}/navigation_types.ts (98%) create mode 100644 packages/core/primitives/dom-navigation/testing/BUILD.bazel create mode 100644 packages/core/primitives/dom-navigation/testing/fake_navigation.ts create mode 100644 packages/core/primitives/dom-navigation/testing/index.ts create mode 100644 packages/core/primitives/dom-navigation/testing/test/BUILD.bazel rename packages/{common/test/navigation => core/primitives/dom-navigation/testing/test}/fake_platform_navigation.spec.ts (99%) create mode 100644 packages/core/testing/src/testing_private_export.ts diff --git a/packages/common/BUILD.bazel b/packages/common/BUILD.bazel index 225d3f7699fb..e00ee26fdfcf 100644 --- a/packages/common/BUILD.bazel +++ b/packages/common/BUILD.bazel @@ -30,6 +30,7 @@ ng_module( ), deps = [ "//packages/core", + "//packages/core/primitives/dom-navigation", "@npm//rxjs", ], ) diff --git a/packages/common/src/navigation/navigation_types.ts b/packages/common/src/navigation/navigation_types.ts deleted file mode 100644 index 37b101482aad..000000000000 --- a/packages/common/src/navigation/navigation_types.ts +++ /dev/null @@ -1,181 +0,0 @@ -/** - * @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.dev/license - */ - -export interface NavigationEventMap { - navigate: NavigateEvent; - navigatesuccess: Event; - navigateerror: ErrorEvent; - currententrychange: NavigationCurrentEntryChangeEvent; -} - -export interface NavigationResult { - committed: Promise; - finished: Promise; -} - -export declare class Navigation extends EventTarget { - entries(): NavigationHistoryEntry[]; - readonly currentEntry: NavigationHistoryEntry | null; - updateCurrentEntry(options: NavigationUpdateCurrentEntryOptions): void; - readonly transition: NavigationTransition | null; - - readonly canGoBack: boolean; - readonly canGoForward: boolean; - - navigate(url: string, options?: NavigationNavigateOptions): NavigationResult; - reload(options?: NavigationReloadOptions): NavigationResult; - - traverseTo(key: string, options?: NavigationOptions): NavigationResult; - back(options?: NavigationOptions): NavigationResult; - forward(options?: NavigationOptions): NavigationResult; - - onnavigate: ((this: Navigation, ev: NavigateEvent) => any) | null; - onnavigatesuccess: ((this: Navigation, ev: Event) => any) | null; - onnavigateerror: ((this: Navigation, ev: ErrorEvent) => any) | null; - oncurrententrychange: ((this: Navigation, ev: NavigationCurrentEntryChangeEvent) => any) | null; - - addEventListener( - type: K, - listener: (this: Navigation, ev: NavigationEventMap[K]) => any, - options?: boolean | AddEventListenerOptions, - ): void; - addEventListener( - type: string, - listener: EventListenerOrEventListenerObject, - options?: boolean | AddEventListenerOptions, - ): void; - removeEventListener( - type: K, - listener: (this: Navigation, ev: NavigationEventMap[K]) => any, - options?: boolean | EventListenerOptions, - ): void; - removeEventListener( - type: string, - listener: EventListenerOrEventListenerObject, - options?: boolean | EventListenerOptions, - ): void; -} - -export declare class NavigationTransition { - readonly navigationType: NavigationTypeString; - readonly from: NavigationHistoryEntry; - readonly finished: Promise; -} - -export interface NavigationHistoryEntryEventMap { - dispose: Event; -} - -export declare class NavigationHistoryEntry extends EventTarget { - readonly key: string; - readonly id: string; - readonly url: string | null; - readonly index: number; - readonly sameDocument: boolean; - - getState(): unknown; - - ondispose: ((this: NavigationHistoryEntry, ev: Event) => any) | null; - - addEventListener( - type: K, - listener: (this: NavigationHistoryEntry, ev: NavigationHistoryEntryEventMap[K]) => any, - options?: boolean | AddEventListenerOptions, - ): void; - addEventListener( - type: string, - listener: EventListenerOrEventListenerObject, - options?: boolean | AddEventListenerOptions, - ): void; - removeEventListener( - type: K, - listener: (this: NavigationHistoryEntry, ev: NavigationHistoryEntryEventMap[K]) => any, - options?: boolean | EventListenerOptions, - ): void; - removeEventListener( - type: string, - listener: EventListenerOrEventListenerObject, - options?: boolean | EventListenerOptions, - ): void; -} - -type NavigationTypeString = 'reload' | 'push' | 'replace' | 'traverse'; - -export interface NavigationUpdateCurrentEntryOptions { - state: unknown; -} - -export interface NavigationOptions { - info?: unknown; -} - -export interface NavigationNavigateOptions extends NavigationOptions { - state?: unknown; - history?: 'auto' | 'push' | 'replace'; -} - -export interface NavigationReloadOptions extends NavigationOptions { - state?: unknown; -} - -export declare class NavigationCurrentEntryChangeEvent extends Event { - constructor(type: string, eventInit?: NavigationCurrentEntryChangeEventInit); - - readonly navigationType: NavigationTypeString | null; - readonly from: NavigationHistoryEntry; -} - -export interface NavigationCurrentEntryChangeEventInit extends EventInit { - navigationType?: NavigationTypeString | null; - from: NavigationHistoryEntry; -} - -export declare class NavigateEvent extends Event { - constructor(type: string, eventInit?: NavigateEventInit); - - readonly navigationType: NavigationTypeString; - readonly canIntercept: boolean; - readonly userInitiated: boolean; - readonly hashChange: boolean; - readonly destination: NavigationDestination; - readonly signal: AbortSignal; - readonly formData: FormData | null; - readonly downloadRequest: string | null; - readonly info?: unknown; - - intercept(options?: NavigationInterceptOptions): void; - scroll(): void; -} - -export interface NavigateEventInit extends EventInit { - navigationType?: NavigationTypeString; - canIntercept?: boolean; - userInitiated?: boolean; - hashChange?: boolean; - destination: NavigationDestination; - signal: AbortSignal; - formData?: FormData | null; - downloadRequest?: string | null; - info?: unknown; -} - -export interface NavigationInterceptOptions { - handler?: () => Promise; - focusReset?: 'after-transition' | 'manual'; - scroll?: 'after-transition' | 'manual'; -} - -export declare class NavigationDestination { - readonly url: string; - readonly key: string | null; - readonly id: string | null; - readonly index: number; - readonly sameDocument: boolean; - - getState(): unknown; -} diff --git a/packages/common/src/navigation/platform_navigation.ts b/packages/common/src/navigation/platform_navigation.ts index 551f7e0d3a7d..bcc08d4539bd 100644 --- a/packages/common/src/navigation/platform_navigation.ts +++ b/packages/common/src/navigation/platform_navigation.ts @@ -6,20 +6,19 @@ * found in the LICENSE file at https://angular.dev/license */ -import {Injectable} from '@angular/core'; - import { - NavigateEvent, - Navigation, - NavigationCurrentEntryChangeEvent, - NavigationHistoryEntry, - NavigationNavigateOptions, - NavigationOptions, - NavigationReloadOptions, - NavigationResult, - NavigationTransition, - NavigationUpdateCurrentEntryOptions, -} from './navigation_types'; + Injectable, + ɵNavigateEvent as NavigateEvent, + ɵNavigation as Navigation, + ɵNavigationCurrentEntryChangeEvent as NavigationCurrentEntryChangeEvent, + ɵNavigationHistoryEntry as NavigationHistoryEntry, + ɵNavigationNavigateOptions as NavigationNavigateOptions, + ɵNavigationOptions as NavigationOptions, + ɵNavigationReloadOptions as NavigationReloadOptions, + ɵNavigationResult as NavigationResult, + ɵNavigationTransition as NavigationTransition, + ɵNavigationUpdateCurrentEntryOptions as NavigationUpdateCurrentEntryOptions, +} from '@angular/core'; /** * This class wraps the platform Navigation API which allows server-specific and test diff --git a/packages/common/testing/BUILD.bazel b/packages/common/testing/BUILD.bazel index 781151bb3a53..6df726b48bb4 100644 --- a/packages/common/testing/BUILD.bazel +++ b/packages/common/testing/BUILD.bazel @@ -10,6 +10,7 @@ ng_module( deps = [ "//packages/common", "//packages/core", + "//packages/core/testing", "@npm//rxjs", ], ) diff --git a/packages/common/testing/src/navigation/fake_navigation.ts b/packages/common/testing/src/navigation/fake_navigation.ts index b84b85b96b85..c4f190f79fe4 100644 --- a/packages/common/testing/src/navigation/fake_navigation.ts +++ b/packages/common/testing/src/navigation/fake_navigation.ts @@ -6,972 +6,4 @@ * found in the LICENSE file at https://angular.dev/license */ -import { - NavigateEvent, - Navigation, - NavigationCurrentEntryChangeEvent, - NavigationDestination, - NavigationHistoryEntry, - NavigationInterceptOptions, - NavigationNavigateOptions, - NavigationOptions, - NavigationReloadOptions, - NavigationResult, - NavigationTransition, - NavigationTypeString, - NavigationUpdateCurrentEntryOptions, -} from './navigation_types'; - -/** - * Fake implementation of user agent history and navigation behavior. This is a - * high-fidelity implementation of browser behavior that attempts to emulate - * things like traversal delay. - */ -export class FakeNavigation implements Navigation { - /** - * The fake implementation of an entries array. Only same-document entries - * allowed. - */ - private readonly entriesArr: FakeNavigationHistoryEntry[] = []; - - /** - * The current active entry index into `entriesArr`. - */ - private currentEntryIndex = 0; - - /** - * The current navigate event. - */ - private navigateEvent: InternalFakeNavigateEvent | undefined = undefined; - - /** - * A Map of pending traversals, so that traversals to the same entry can be - * re-used. - */ - private readonly traversalQueue = new Map(); - - /** - * A Promise that resolves when the previous traversals have finished. Used to - * simulate the cross-process communication necessary for traversals. - */ - private nextTraversal = Promise.resolve(); - - /** - * A prospective current active entry index, which includes unresolved - * traversals. Used by `go` to determine where navigations are intended to go. - */ - private prospectiveEntryIndex = 0; - - /** - * A test-only option to make traversals synchronous, rather than emulate - * cross-process communication. - */ - private synchronousTraversals = false; - - /** Whether to allow a call to setInitialEntryForTesting. */ - private canSetInitialEntry = true; - - /** `EventTarget` to dispatch events. */ - private eventTarget: EventTarget; - - /** The next unique id for created entries. Replace recreates this id. */ - private nextId = 0; - - /** The next unique key for created entries. Replace inherits this id. */ - private nextKey = 0; - - /** Whether this fake is disposed. */ - private disposed = false; - - /** Equivalent to `navigation.currentEntry`. */ - get currentEntry(): FakeNavigationHistoryEntry { - return this.entriesArr[this.currentEntryIndex]; - } - - get canGoBack(): boolean { - return this.currentEntryIndex > 0; - } - - get canGoForward(): boolean { - return this.currentEntryIndex < this.entriesArr.length - 1; - } - - constructor( - private readonly window: Window, - startURL: `http${string}`, - ) { - this.eventTarget = this.window.document.createElement('div'); - // First entry. - this.setInitialEntryForTesting(startURL); - } - - /** - * Sets the initial entry. - */ - private setInitialEntryForTesting( - url: `http${string}`, - options: {historyState: unknown; state?: unknown} = {historyState: null}, - ) { - if (!this.canSetInitialEntry) { - throw new Error( - 'setInitialEntryForTesting can only be called before any ' + 'navigation has occurred', - ); - } - const currentInitialEntry = this.entriesArr[0]; - this.entriesArr[0] = new FakeNavigationHistoryEntry(new URL(url).toString(), { - index: 0, - key: currentInitialEntry?.key ?? String(this.nextKey++), - id: currentInitialEntry?.id ?? String(this.nextId++), - sameDocument: true, - historyState: options?.historyState, - state: options.state, - }); - } - - /** Returns whether the initial entry is still eligible to be set. */ - canSetInitialEntryForTesting(): boolean { - return this.canSetInitialEntry; - } - - /** - * Sets whether to emulate traversals as synchronous rather than - * asynchronous. - */ - setSynchronousTraversalsForTesting(synchronousTraversals: boolean) { - this.synchronousTraversals = synchronousTraversals; - } - - /** Equivalent to `navigation.entries()`. */ - entries(): FakeNavigationHistoryEntry[] { - return this.entriesArr.slice(); - } - - /** Equivalent to `navigation.navigate()`. */ - navigate(url: string, options?: NavigationNavigateOptions): FakeNavigationResult { - const fromUrl = new URL(this.currentEntry.url!); - const toUrl = new URL(url, this.currentEntry.url!); - - let navigationType: NavigationTypeString; - if (!options?.history || options.history === 'auto') { - // Auto defaults to push, but if the URLs are the same, is a replace. - if (fromUrl.toString() === toUrl.toString()) { - navigationType = 'replace'; - } else { - navigationType = 'push'; - } - } else { - navigationType = options.history; - } - - const hashChange = isHashChange(fromUrl, toUrl); - - const destination = new FakeNavigationDestination({ - url: toUrl.toString(), - state: options?.state, - sameDocument: hashChange, - historyState: null, - }); - const result = new InternalNavigationResult(); - - this.userAgentNavigate(destination, result, { - navigationType, - cancelable: true, - canIntercept: true, - // Always false for navigate(). - userInitiated: false, - hashChange, - info: options?.info, - }); - - return { - committed: result.committed, - finished: result.finished, - }; - } - - /** Equivalent to `history.pushState()`. */ - pushState(data: unknown, title: string, url?: string): void { - this.pushOrReplaceState('push', data, title, url); - } - - /** Equivalent to `history.replaceState()`. */ - replaceState(data: unknown, title: string, url?: string): void { - this.pushOrReplaceState('replace', data, title, url); - } - - private pushOrReplaceState( - navigationType: NavigationTypeString, - data: unknown, - _title: string, - url?: string, - ): void { - const fromUrl = new URL(this.currentEntry.url!); - const toUrl = url ? new URL(url, this.currentEntry.url!) : fromUrl; - - const hashChange = isHashChange(fromUrl, toUrl); - - const destination = new FakeNavigationDestination({ - url: toUrl.toString(), - sameDocument: true, - historyState: data, - }); - const result = new InternalNavigationResult(); - - this.userAgentNavigate(destination, result, { - navigationType, - cancelable: true, - canIntercept: true, - // Always false for pushState() or replaceState(). - userInitiated: false, - hashChange, - skipPopState: true, - }); - } - - /** Equivalent to `navigation.traverseTo()`. */ - traverseTo(key: string, options?: NavigationOptions): FakeNavigationResult { - const fromUrl = new URL(this.currentEntry.url!); - const entry = this.findEntry(key); - if (!entry) { - const domException = new DOMException('Invalid key', 'InvalidStateError'); - const committed = Promise.reject(domException); - const finished = Promise.reject(domException); - committed.catch(() => {}); - finished.catch(() => {}); - return { - committed, - finished, - }; - } - if (entry === this.currentEntry) { - return { - committed: Promise.resolve(this.currentEntry), - finished: Promise.resolve(this.currentEntry), - }; - } - if (this.traversalQueue.has(entry.key)) { - const existingResult = this.traversalQueue.get(entry.key)!; - return { - committed: existingResult.committed, - finished: existingResult.finished, - }; - } - - const hashChange = isHashChange(fromUrl, new URL(entry.url!, this.currentEntry.url!)); - const destination = new FakeNavigationDestination({ - url: entry.url!, - state: entry.getState(), - historyState: entry.getHistoryState(), - key: entry.key, - id: entry.id, - index: entry.index, - sameDocument: entry.sameDocument, - }); - this.prospectiveEntryIndex = entry.index; - const result = new InternalNavigationResult(); - this.traversalQueue.set(entry.key, result); - this.runTraversal(() => { - this.traversalQueue.delete(entry.key); - this.userAgentNavigate(destination, result, { - navigationType: 'traverse', - cancelable: true, - canIntercept: true, - // Always false for traverseTo(). - userInitiated: false, - hashChange, - info: options?.info, - }); - }); - return { - committed: result.committed, - finished: result.finished, - }; - } - - /** Equivalent to `navigation.back()`. */ - back(options?: NavigationOptions): FakeNavigationResult { - if (this.currentEntryIndex === 0) { - const domException = new DOMException('Cannot go back', 'InvalidStateError'); - const committed = Promise.reject(domException); - const finished = Promise.reject(domException); - committed.catch(() => {}); - finished.catch(() => {}); - return { - committed, - finished, - }; - } - const entry = this.entriesArr[this.currentEntryIndex - 1]; - return this.traverseTo(entry.key, options); - } - - /** Equivalent to `navigation.forward()`. */ - forward(options?: NavigationOptions): FakeNavigationResult { - if (this.currentEntryIndex === this.entriesArr.length - 1) { - const domException = new DOMException('Cannot go forward', 'InvalidStateError'); - const committed = Promise.reject(domException); - const finished = Promise.reject(domException); - committed.catch(() => {}); - finished.catch(() => {}); - return { - committed, - finished, - }; - } - const entry = this.entriesArr[this.currentEntryIndex + 1]; - return this.traverseTo(entry.key, options); - } - - /** - * Equivalent to `history.go()`. - * Note that this method does not actually work precisely to how Chrome - * does, instead choosing a simpler model with less unexpected behavior. - * Chrome has a few edge case optimizations, for instance with repeated - * `back(); forward()` chains it collapses certain traversals. - */ - go(direction: number): void { - const targetIndex = this.prospectiveEntryIndex + direction; - if (targetIndex >= this.entriesArr.length || targetIndex < 0) { - return; - } - this.prospectiveEntryIndex = targetIndex; - this.runTraversal(() => { - // Check again that destination is in the entries array. - if (targetIndex >= this.entriesArr.length || targetIndex < 0) { - return; - } - const fromUrl = new URL(this.currentEntry.url!); - const entry = this.entriesArr[targetIndex]; - const hashChange = isHashChange(fromUrl, new URL(entry.url!, this.currentEntry.url!)); - const destination = new FakeNavigationDestination({ - url: entry.url!, - state: entry.getState(), - historyState: entry.getHistoryState(), - key: entry.key, - id: entry.id, - index: entry.index, - sameDocument: entry.sameDocument, - }); - const result = new InternalNavigationResult(); - this.userAgentNavigate(destination, result, { - navigationType: 'traverse', - cancelable: true, - canIntercept: true, - // Always false for go(). - userInitiated: false, - hashChange, - }); - }); - } - - /** Runs a traversal synchronously or asynchronously */ - private runTraversal(traversal: () => void) { - if (this.synchronousTraversals) { - traversal(); - return; - } - - // Each traversal occupies a single timeout resolution. - // This means that Promises added to commit and finish should resolve - // before the next traversal. - this.nextTraversal = this.nextTraversal.then(() => { - return new Promise((resolve) => { - setTimeout(() => { - resolve(); - traversal(); - }); - }); - }); - } - - /** Equivalent to `navigation.addEventListener()`. */ - addEventListener( - type: string, - callback: EventListenerOrEventListenerObject, - options?: AddEventListenerOptions | boolean, - ) { - this.eventTarget.addEventListener(type, callback, options); - } - - /** Equivalent to `navigation.removeEventListener()`. */ - removeEventListener( - type: string, - callback: EventListenerOrEventListenerObject, - options?: EventListenerOptions | boolean, - ) { - this.eventTarget.removeEventListener(type, callback, options); - } - - /** Equivalent to `navigation.dispatchEvent()` */ - dispatchEvent(event: Event): boolean { - return this.eventTarget.dispatchEvent(event); - } - - /** Cleans up resources. */ - dispose() { - // Recreate eventTarget to release current listeners. - // `document.createElement` because NodeJS `EventTarget` is incompatible with Domino's `Event`. - this.eventTarget = this.window.document.createElement('div'); - this.disposed = true; - } - - /** Returns whether this fake is disposed. */ - isDisposed() { - return this.disposed; - } - - /** Implementation for all navigations and traversals. */ - private userAgentNavigate( - destination: FakeNavigationDestination, - result: InternalNavigationResult, - options: InternalNavigateOptions, - ) { - // The first navigation should disallow any future calls to set the initial - // entry. - this.canSetInitialEntry = false; - if (this.navigateEvent) { - this.navigateEvent.cancel(new DOMException('Navigation was aborted', 'AbortError')); - this.navigateEvent = undefined; - } - - const navigateEvent = createFakeNavigateEvent({ - navigationType: options.navigationType, - cancelable: options.cancelable, - canIntercept: options.canIntercept, - userInitiated: options.userInitiated, - hashChange: options.hashChange, - signal: result.signal, - destination, - info: options.info, - sameDocument: destination.sameDocument, - skipPopState: options.skipPopState, - result, - userAgentCommit: () => { - this.userAgentCommit(); - }, - }); - - this.navigateEvent = navigateEvent; - this.eventTarget.dispatchEvent(navigateEvent); - navigateEvent.dispatchedNavigateEvent(); - if (navigateEvent.commitOption === 'immediate') { - navigateEvent.commit(/* internal= */ true); - } - } - - /** Implementation to commit a navigation. */ - private userAgentCommit() { - if (!this.navigateEvent) { - return; - } - const from = this.currentEntry; - if (!this.navigateEvent.sameDocument) { - const error = new Error('Cannot navigate to a non-same-document URL.'); - this.navigateEvent.cancel(error); - throw error; - } - if ( - this.navigateEvent.navigationType === 'push' || - this.navigateEvent.navigationType === 'replace' - ) { - this.userAgentPushOrReplace(this.navigateEvent.destination, { - navigationType: this.navigateEvent.navigationType, - }); - } else if (this.navigateEvent.navigationType === 'traverse') { - this.userAgentTraverse(this.navigateEvent.destination); - } - this.navigateEvent.userAgentNavigated(this.currentEntry); - const currentEntryChangeEvent = createFakeNavigationCurrentEntryChangeEvent({ - from, - navigationType: this.navigateEvent.navigationType, - }); - this.eventTarget.dispatchEvent(currentEntryChangeEvent); - if (!this.navigateEvent.skipPopState) { - const popStateEvent = createPopStateEvent({ - state: this.navigateEvent.destination.getHistoryState(), - }); - this.window.dispatchEvent(popStateEvent); - } - } - - /** Implementation for a push or replace navigation. */ - private userAgentPushOrReplace( - destination: FakeNavigationDestination, - {navigationType}: {navigationType: NavigationTypeString}, - ) { - if (navigationType === 'push') { - this.currentEntryIndex++; - this.prospectiveEntryIndex = this.currentEntryIndex; - } - const index = this.currentEntryIndex; - const key = navigationType === 'push' ? String(this.nextKey++) : this.currentEntry.key; - const entry = new FakeNavigationHistoryEntry(destination.url, { - id: String(this.nextId++), - key, - index, - sameDocument: true, - state: destination.getState(), - historyState: destination.getHistoryState(), - }); - if (navigationType === 'push') { - this.entriesArr.splice(index, Infinity, entry); - } else { - this.entriesArr[index] = entry; - } - } - - /** Implementation for a traverse navigation. */ - private userAgentTraverse(destination: FakeNavigationDestination) { - this.currentEntryIndex = destination.index; - } - - /** Utility method for finding entries with the given `key`. */ - private findEntry(key: string) { - for (const entry of this.entriesArr) { - if (entry.key === key) return entry; - } - return undefined; - } - - set onnavigate(_handler: ((this: Navigation, ev: NavigateEvent) => any) | null) { - throw new Error('unimplemented'); - } - - get onnavigate(): ((this: Navigation, ev: NavigateEvent) => any) | null { - throw new Error('unimplemented'); - } - - set oncurrententrychange( - _handler: ((this: Navigation, ev: NavigationCurrentEntryChangeEvent) => any) | null, - ) { - throw new Error('unimplemented'); - } - - get oncurrententrychange(): - | ((this: Navigation, ev: NavigationCurrentEntryChangeEvent) => any) - | null { - throw new Error('unimplemented'); - } - - set onnavigatesuccess(_handler: ((this: Navigation, ev: Event) => any) | null) { - throw new Error('unimplemented'); - } - - get onnavigatesuccess(): ((this: Navigation, ev: Event) => any) | null { - throw new Error('unimplemented'); - } - - set onnavigateerror(_handler: ((this: Navigation, ev: ErrorEvent) => any) | null) { - throw new Error('unimplemented'); - } - - get onnavigateerror(): ((this: Navigation, ev: ErrorEvent) => any) | null { - throw new Error('unimplemented'); - } - - get transition(): NavigationTransition | null { - throw new Error('unimplemented'); - } - - updateCurrentEntry(_options: NavigationUpdateCurrentEntryOptions): void { - throw new Error('unimplemented'); - } - - reload(_options?: NavigationReloadOptions): NavigationResult { - throw new Error('unimplemented'); - } -} - -/** - * Fake equivalent of the `NavigationResult` interface with - * `FakeNavigationHistoryEntry`. - */ -interface FakeNavigationResult extends NavigationResult { - readonly committed: Promise; - readonly finished: Promise; -} - -/** - * Fake equivalent of `NavigationHistoryEntry`. - */ -export class FakeNavigationHistoryEntry implements NavigationHistoryEntry { - readonly sameDocument; - - readonly id: string; - readonly key: string; - readonly index: number; - private readonly state: unknown; - private readonly historyState: unknown; - - ondispose: ((this: NavigationHistoryEntry, ev: Event) => any) | null = null; - - constructor( - readonly url: string | null, - { - id, - key, - index, - sameDocument, - state, - historyState, - }: { - id: string; - key: string; - index: number; - sameDocument: boolean; - historyState: unknown; - state?: unknown; - }, - ) { - this.id = id; - this.key = key; - this.index = index; - this.sameDocument = sameDocument; - this.state = state; - this.historyState = historyState; - } - - getState(): unknown { - // Budget copy. - return this.state ? JSON.parse(JSON.stringify(this.state)) : this.state; - } - - getHistoryState(): unknown { - // Budget copy. - return this.historyState ? JSON.parse(JSON.stringify(this.historyState)) : this.historyState; - } - - addEventListener( - type: string, - callback: EventListenerOrEventListenerObject, - options?: AddEventListenerOptions | boolean, - ) { - throw new Error('unimplemented'); - } - - removeEventListener( - type: string, - callback: EventListenerOrEventListenerObject, - options?: EventListenerOptions | boolean, - ) { - throw new Error('unimplemented'); - } - - dispatchEvent(event: Event): boolean { - throw new Error('unimplemented'); - } -} - -/** `NavigationInterceptOptions` with experimental commit option. */ -export interface ExperimentalNavigationInterceptOptions extends NavigationInterceptOptions { - commit?: 'immediate' | 'after-transition'; -} - -/** `NavigateEvent` with experimental commit function. */ -export interface ExperimentalNavigateEvent extends NavigateEvent { - intercept(options?: ExperimentalNavigationInterceptOptions): void; - - commit(): void; -} - -/** - * Fake equivalent of `NavigateEvent`. - */ -export interface FakeNavigateEvent extends ExperimentalNavigateEvent { - readonly destination: FakeNavigationDestination; -} - -interface InternalFakeNavigateEvent extends FakeNavigateEvent { - readonly sameDocument: boolean; - readonly skipPopState?: boolean; - readonly commitOption: 'after-transition' | 'immediate'; - readonly result: InternalNavigationResult; - - commit(internal?: boolean): void; - cancel(reason: Error): void; - dispatchedNavigateEvent(): void; - userAgentNavigated(entry: FakeNavigationHistoryEntry): void; -} - -/** - * Create a fake equivalent of `NavigateEvent`. This is not a class because ES5 - * transpiled JavaScript cannot extend native Event. - */ -function createFakeNavigateEvent({ - cancelable, - canIntercept, - userInitiated, - hashChange, - navigationType, - signal, - destination, - info, - sameDocument, - skipPopState, - result, - userAgentCommit, -}: { - cancelable: boolean; - canIntercept: boolean; - userInitiated: boolean; - hashChange: boolean; - navigationType: NavigationTypeString; - signal: AbortSignal; - destination: FakeNavigationDestination; - info: unknown; - sameDocument: boolean; - skipPopState?: boolean; - result: InternalNavigationResult; - userAgentCommit: () => void; -}) { - const event = new Event('navigate', {bubbles: false, cancelable}) as { - -readonly [P in keyof InternalFakeNavigateEvent]: InternalFakeNavigateEvent[P]; - }; - event.canIntercept = canIntercept; - event.userInitiated = userInitiated; - event.hashChange = hashChange; - event.navigationType = navigationType; - event.signal = signal; - event.destination = destination; - event.info = info; - event.downloadRequest = null; - event.formData = null; - - event.sameDocument = sameDocument; - event.skipPopState = skipPopState; - event.commitOption = 'immediate'; - - let handlerFinished: Promise | undefined = undefined; - let interceptCalled = false; - let dispatchedNavigateEvent = false; - let commitCalled = false; - - event.intercept = function ( - this: InternalFakeNavigateEvent, - options?: ExperimentalNavigationInterceptOptions, - ): void { - interceptCalled = true; - event.sameDocument = true; - const handler = options?.handler; - if (handler) { - handlerFinished = handler(); - } - if (options?.commit) { - event.commitOption = options.commit; - } - if (options?.focusReset !== undefined || options?.scroll !== undefined) { - throw new Error('unimplemented'); - } - }; - - event.scroll = function (this: InternalFakeNavigateEvent): void { - throw new Error('unimplemented'); - }; - - event.commit = function (this: InternalFakeNavigateEvent, internal = false) { - if (!internal && !interceptCalled) { - throw new DOMException( - `Failed to execute 'commit' on 'NavigateEvent': intercept() must be ` + - `called before commit().`, - 'InvalidStateError', - ); - } - if (!dispatchedNavigateEvent) { - throw new DOMException( - `Failed to execute 'commit' on 'NavigateEvent': commit() may not be ` + - `called during event dispatch.`, - 'InvalidStateError', - ); - } - if (commitCalled) { - throw new DOMException( - `Failed to execute 'commit' on 'NavigateEvent': commit() already ` + `called.`, - 'InvalidStateError', - ); - } - commitCalled = true; - - userAgentCommit(); - }; - - // Internal only. - event.cancel = function (this: InternalFakeNavigateEvent, reason: Error) { - result.committedReject(reason); - result.finishedReject(reason); - }; - - // Internal only. - event.dispatchedNavigateEvent = function (this: InternalFakeNavigateEvent) { - dispatchedNavigateEvent = true; - if (event.commitOption === 'after-transition') { - // If handler finishes before commit, call commit. - handlerFinished?.then( - () => { - if (!commitCalled) { - event.commit(/* internal */ true); - } - }, - () => {}, - ); - } - Promise.all([result.committed, handlerFinished]).then( - ([entry]) => { - result.finishedResolve(entry); - }, - (reason) => { - result.finishedReject(reason); - }, - ); - }; - - // Internal only. - event.userAgentNavigated = function ( - this: InternalFakeNavigateEvent, - entry: FakeNavigationHistoryEntry, - ) { - result.committedResolve(entry); - }; - - return event as InternalFakeNavigateEvent; -} - -/** Fake equivalent of `NavigationCurrentEntryChangeEvent`. */ -export interface FakeNavigationCurrentEntryChangeEvent extends NavigationCurrentEntryChangeEvent { - readonly from: FakeNavigationHistoryEntry; -} - -/** - * Create a fake equivalent of `NavigationCurrentEntryChange`. This does not use - * a class because ES5 transpiled JavaScript cannot extend native Event. - */ -function createFakeNavigationCurrentEntryChangeEvent({ - from, - navigationType, -}: { - from: FakeNavigationHistoryEntry; - navigationType: NavigationTypeString; -}) { - const event = new Event('currententrychange', { - bubbles: false, - cancelable: false, - }) as { - -readonly [P in keyof NavigationCurrentEntryChangeEvent]: NavigationCurrentEntryChangeEvent[P]; - }; - event.from = from; - event.navigationType = navigationType; - return event as FakeNavigationCurrentEntryChangeEvent; -} - -/** - * Create a fake equivalent of `PopStateEvent`. This does not use a class - * because ES5 transpiled JavaScript cannot extend native Event. - */ -function createPopStateEvent({state}: {state: unknown}) { - const event = new Event('popstate', { - bubbles: false, - cancelable: false, - }) as {-readonly [P in keyof PopStateEvent]: PopStateEvent[P]}; - event.state = state; - return event as PopStateEvent; -} - -/** - * Fake equivalent of `NavigationDestination`. - */ -export class FakeNavigationDestination implements NavigationDestination { - readonly url: string; - readonly sameDocument: boolean; - readonly key: string | null; - readonly id: string | null; - readonly index: number; - - private readonly state?: unknown; - private readonly historyState: unknown; - - constructor({ - url, - sameDocument, - historyState, - state, - key = null, - id = null, - index = -1, - }: { - url: string; - sameDocument: boolean; - historyState: unknown; - state?: unknown; - key?: string | null; - id?: string | null; - index?: number; - }) { - this.url = url; - this.sameDocument = sameDocument; - this.state = state; - this.historyState = historyState; - this.key = key; - this.id = id; - this.index = index; - } - - getState(): unknown { - return this.state; - } - - getHistoryState(): unknown { - return this.historyState; - } -} - -/** Utility function to determine whether two UrlLike have the same hash. */ -function isHashChange(from: URL, to: URL): boolean { - return ( - to.hash !== from.hash && - to.hostname === from.hostname && - to.pathname === from.pathname && - to.search === from.search - ); -} - -/** Internal utility class for representing the result of a navigation. */ -class InternalNavigationResult { - committedResolve!: (entry: FakeNavigationHistoryEntry) => void; - committedReject!: (reason: Error) => void; - finishedResolve!: (entry: FakeNavigationHistoryEntry) => void; - finishedReject!: (reason: Error) => void; - readonly committed: Promise; - readonly finished: Promise; - get signal(): AbortSignal { - return this.abortController.signal; - } - private readonly abortController = new AbortController(); - - constructor() { - this.committed = new Promise((resolve, reject) => { - this.committedResolve = resolve; - this.committedReject = reject; - }); - - this.finished = new Promise(async (resolve, reject) => { - this.finishedResolve = resolve; - this.finishedReject = (reason: Error) => { - reject(reason); - this.abortController.abort(reason); - }; - }); - // All rejections are handled. - this.committed.catch(() => {}); - this.finished.catch(() => {}); - } -} - -/** Internal options for performing a navigate. */ -interface InternalNavigateOptions { - navigationType: NavigationTypeString; - cancelable: boolean; - canIntercept: boolean; - userInitiated: boolean; - hashChange: boolean; - info?: unknown; - skipPopState?: boolean; -} +export {ɵFakeNavigation as FakeNavigation} from '@angular/core/testing'; diff --git a/packages/common/testing/src/navigation/provide_fake_platform_navigation.ts b/packages/common/testing/src/navigation/provide_fake_platform_navigation.ts index 0ddb4fdfb8c4..b790809b8d33 100644 --- a/packages/common/testing/src/navigation/provide_fake_platform_navigation.ts +++ b/packages/common/testing/src/navigation/provide_fake_platform_navigation.ts @@ -6,11 +6,13 @@ * found in the LICENSE file at https://angular.dev/license */ -import {DOCUMENT, PlatformLocation} from '@angular/common'; +import { + DOCUMENT, + PlatformLocation, + ɵPlatformNavigation as PlatformNavigation, +} from '@angular/common'; import {inject, Provider} from '@angular/core'; -// @ng_package: ignore-cross-repo-import -import {PlatformNavigation} from '../../../src/navigation/platform_navigation'; import { FakeNavigationPlatformLocation, MOCK_PLATFORM_LOCATION_CONFIG, diff --git a/packages/common/testing/src/private_export.ts b/packages/common/testing/src/private_export.ts index 749e39149e1f..b1f4c6537758 100644 --- a/packages/common/testing/src/private_export.ts +++ b/packages/common/testing/src/private_export.ts @@ -7,3 +7,4 @@ */ export {provideFakePlatformNavigation as ɵprovideFakePlatformNavigation} from './navigation/provide_fake_platform_navigation'; +export {FakeNavigation as ɵFakeNavigation} from './navigation/fake_navigation'; diff --git a/packages/core/BUILD.bazel b/packages/core/BUILD.bazel index db4b2d2a6be0..10c4d732956e 100644 --- a/packages/core/BUILD.bazel +++ b/packages/core/BUILD.bazel @@ -30,6 +30,7 @@ ng_module( ), deps = [ "//packages:types", + "//packages/core/primitives/dom-navigation", "//packages/core/primitives/event-dispatch", "//packages/core/primitives/signals", "//packages/core/src/compiler", diff --git a/packages/core/primitives/dom-navigation/BUILD.bazel b/packages/core/primitives/dom-navigation/BUILD.bazel new file mode 100644 index 000000000000..f2c034c851f3 --- /dev/null +++ b/packages/core/primitives/dom-navigation/BUILD.bazel @@ -0,0 +1,32 @@ +load("//tools:defaults.bzl", "ts_library", "tsec_test") + +package(default_visibility = [ + "//packages:__pkg__", + "//packages/common:__subpackages__", + "//packages/core:__subpackages__", + "//tools/public_api_guard:__pkg__", +]) + +ts_library( + name = "dom-navigation", + srcs = glob( + [ + "*.ts", + "src/**/*.ts", + ], + ), +) + +tsec_test( + name = "tsec_test", + target = "dom-navigation", + tsconfig = "//packages:tsec_config", +) + +filegroup( + name = "files_for_docgen", + srcs = glob([ + "*.ts", + "src/**/*.ts", + ]), +) diff --git a/packages/core/primitives/dom-navigation/index.ts b/packages/core/primitives/dom-navigation/index.ts new file mode 100644 index 000000000000..3e6d512a0113 --- /dev/null +++ b/packages/core/primitives/dom-navigation/index.ts @@ -0,0 +1,9 @@ +/** + * @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.dev/license + */ + +export * from './src/navigation_types'; diff --git a/packages/common/testing/src/navigation/navigation_types.ts b/packages/core/primitives/dom-navigation/src/navigation_types.ts similarity index 98% rename from packages/common/testing/src/navigation/navigation_types.ts rename to packages/core/primitives/dom-navigation/src/navigation_types.ts index 0dafd4efe732..7e0d50c2d54f 100644 --- a/packages/common/testing/src/navigation/navigation_types.ts +++ b/packages/core/primitives/dom-navigation/src/navigation_types.ts @@ -6,6 +6,8 @@ * found in the LICENSE file at https://angular.dev/license */ +// TODO: Figure out how to use the types from NPM in the public API + export interface NavigationEventMap { navigate: NavigateEvent; navigatesuccess: Event; diff --git a/packages/core/primitives/dom-navigation/testing/BUILD.bazel b/packages/core/primitives/dom-navigation/testing/BUILD.bazel new file mode 100644 index 000000000000..b1a7413f47b4 --- /dev/null +++ b/packages/core/primitives/dom-navigation/testing/BUILD.bazel @@ -0,0 +1,34 @@ +load("//tools:defaults.bzl", "ts_library", "tsec_test") + +package(default_visibility = [ + "//packages:__pkg__", + "//packages/common:__subpackages__", + "//packages/core/primitives/dom-navigation/testing:__subpackages__", + "//packages/core/testing:__subpackages__", + "//tools/public_api_guard:__pkg__", +]) + +ts_library( + name = "testing", + srcs = glob( + [ + "**/*.ts", + ], + ), + deps = [ + "//packages/core/primitives/dom-navigation", + ], +) + +tsec_test( + name = "tsec_test", + target = "testing", + tsconfig = "//packages:tsec_config", +) + +filegroup( + name = "files_for_docgen", + srcs = glob([ + "*.ts", + ]), +) diff --git a/packages/core/primitives/dom-navigation/testing/fake_navigation.ts b/packages/core/primitives/dom-navigation/testing/fake_navigation.ts new file mode 100644 index 000000000000..bb00cfe17c0b --- /dev/null +++ b/packages/core/primitives/dom-navigation/testing/fake_navigation.ts @@ -0,0 +1,990 @@ +/** + * @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.dev/license + */ + +import { + NavigationNavigateOptions, + NavigationTypeString, + NavigationOptions, + NavigateEvent, + NavigationCurrentEntryChangeEvent, + NavigationTransition, + NavigationUpdateCurrentEntryOptions, + NavigationReloadOptions, + NavigationResult, + NavigationHistoryEntry, + NavigationInterceptOptions, + NavigationDestination, + Navigation, +} from '../src/navigation_types'; + +/** + * Fake implementation of user agent history and navigation behavior. This is a + * high-fidelity implementation of browser behavior that attempts to emulate + * things like traversal delay. + */ +export class FakeNavigation implements Navigation { + /** + * The fake implementation of an entries array. Only same-document entries + * allowed. + */ + private readonly entriesArr: FakeNavigationHistoryEntry[] = []; + + /** + * The current active entry index into `entriesArr`. + */ + private currentEntryIndex = 0; + + /** + * The current navigate event. + */ + private navigateEvent: InternalFakeNavigateEvent | undefined = undefined; + + /** + * A Map of pending traversals, so that traversals to the same entry can be + * re-used. + */ + private readonly traversalQueue = new Map(); + + /** + * A Promise that resolves when the previous traversals have finished. Used to + * simulate the cross-process communication necessary for traversals. + */ + private nextTraversal = Promise.resolve(); + + /** + * A prospective current active entry index, which includes unresolved + * traversals. Used by `go` to determine where navigations are intended to go. + */ + private prospectiveEntryIndex = 0; + + /** + * A test-only option to make traversals synchronous, rather than emulate + * cross-process communication. + */ + private synchronousTraversals = false; + + /** Whether to allow a call to setInitialEntryForTesting. */ + private canSetInitialEntry = true; + + /** `EventTarget` to dispatch events. */ + private eventTarget: EventTarget; + + /** The next unique id for created entries. Replace recreates this id. */ + private nextId = 0; + + /** The next unique key for created entries. Replace inherits this id. */ + private nextKey = 0; + + /** Whether this fake is disposed. */ + private disposed = false; + + /** Equivalent to `navigation.currentEntry`. */ + get currentEntry(): FakeNavigationHistoryEntry { + return this.entriesArr[this.currentEntryIndex]; + } + + get canGoBack(): boolean { + return this.currentEntryIndex > 0; + } + + get canGoForward(): boolean { + return this.currentEntryIndex < this.entriesArr.length - 1; + } + + constructor( + private readonly window: Window, + startURL: `http${string}`, + ) { + this.eventTarget = this.window.document.createElement('div'); + // First entry. + this.setInitialEntryForTesting(startURL); + } + + /** + * Sets the initial entry. + */ + setInitialEntryForTesting( + url: `http${string}`, + options: {historyState: unknown; state?: unknown} = {historyState: null}, + ): void { + if (!this.canSetInitialEntry) { + throw new Error( + 'setInitialEntryForTesting can only be called before any ' + 'navigation has occurred', + ); + } + const currentInitialEntry = this.entriesArr[0]; + this.entriesArr[0] = new FakeNavigationHistoryEntry(new URL(url).toString(), { + index: 0, + key: currentInitialEntry?.key ?? String(this.nextKey++), + id: currentInitialEntry?.id ?? String(this.nextId++), + sameDocument: true, + historyState: options?.historyState, + state: options.state, + }); + } + + /** Returns whether the initial entry is still eligible to be set. */ + canSetInitialEntryForTesting(): boolean { + return this.canSetInitialEntry; + } + + /** + * Sets whether to emulate traversals as synchronous rather than + * asynchronous. + */ + setSynchronousTraversalsForTesting(synchronousTraversals: boolean): void { + this.synchronousTraversals = synchronousTraversals; + } + + /** Equivalent to `navigation.entries()`. */ + entries(): FakeNavigationHistoryEntry[] { + return this.entriesArr.slice(); + } + + /** Equivalent to `navigation.navigate()`. */ + navigate(url: string, options?: NavigationNavigateOptions): FakeNavigationResult { + const fromUrl = new URL(this.currentEntry.url!); + const toUrl = new URL(url, this.currentEntry.url!); + + let navigationType: NavigationTypeString; + if (!options?.history || options.history === 'auto') { + // Auto defaults to push, but if the URLs are the same, is a replace. + if (fromUrl.toString() === toUrl.toString()) { + navigationType = 'replace'; + } else { + navigationType = 'push'; + } + } else { + navigationType = options.history; + } + + const hashChange = isHashChange(fromUrl, toUrl); + + const destination = new FakeNavigationDestination({ + url: toUrl.toString(), + state: options?.state, + sameDocument: hashChange, + historyState: null, + }); + const result = new InternalNavigationResult(); + + this.userAgentNavigate(destination, result, { + navigationType, + cancelable: true, + canIntercept: true, + // Always false for navigate(). + userInitiated: false, + hashChange, + info: options?.info, + }); + + return { + committed: result.committed, + finished: result.finished, + }; + } + + /** Equivalent to `history.pushState()`. */ + pushState(data: unknown, title: string, url?: string): void { + this.pushOrReplaceState('push', data, title, url); + } + + /** Equivalent to `history.replaceState()`. */ + replaceState(data: unknown, title: string, url?: string): void { + this.pushOrReplaceState('replace', data, title, url); + } + + private pushOrReplaceState( + navigationType: NavigationTypeString, + data: unknown, + _title: string, + url?: string, + ): void { + const fromUrl = new URL(this.currentEntry.url!); + const toUrl = url ? new URL(url, this.currentEntry.url!) : fromUrl; + + const hashChange = isHashChange(fromUrl, toUrl); + + const destination = new FakeNavigationDestination({ + url: toUrl.toString(), + sameDocument: true, + historyState: data, + }); + const result = new InternalNavigationResult(); + + this.userAgentNavigate(destination, result, { + navigationType, + cancelable: true, + canIntercept: true, + // Always false for pushState() or replaceState(). + userInitiated: false, + hashChange, + skipPopState: true, + }); + } + + /** Equivalent to `navigation.traverseTo()`. */ + traverseTo(key: string, options?: NavigationOptions): FakeNavigationResult { + const fromUrl = new URL(this.currentEntry.url!); + const entry = this.findEntry(key); + if (!entry) { + const domException = new DOMException('Invalid key', 'InvalidStateError'); + const committed = Promise.reject(domException); + const finished = Promise.reject(domException); + committed.catch(() => {}); + finished.catch(() => {}); + return { + committed, + finished, + }; + } + if (entry === this.currentEntry) { + return { + committed: Promise.resolve(this.currentEntry), + finished: Promise.resolve(this.currentEntry), + }; + } + if (this.traversalQueue.has(entry.key)) { + const existingResult = this.traversalQueue.get(entry.key)!; + return { + committed: existingResult.committed, + finished: existingResult.finished, + }; + } + + const hashChange = isHashChange(fromUrl, new URL(entry.url!, this.currentEntry.url!)); + const destination = new FakeNavigationDestination({ + url: entry.url!, + state: entry.getState(), + historyState: entry.getHistoryState(), + key: entry.key, + id: entry.id, + index: entry.index, + sameDocument: entry.sameDocument, + }); + this.prospectiveEntryIndex = entry.index; + const result = new InternalNavigationResult(); + this.traversalQueue.set(entry.key, result); + this.runTraversal(() => { + this.traversalQueue.delete(entry.key); + this.userAgentNavigate(destination, result, { + navigationType: 'traverse', + cancelable: true, + canIntercept: true, + // Always false for traverseTo(). + userInitiated: false, + hashChange, + info: options?.info, + }); + }); + return { + committed: result.committed, + finished: result.finished, + }; + } + + /** Equivalent to `navigation.back()`. */ + back(options?: NavigationOptions): FakeNavigationResult { + if (this.currentEntryIndex === 0) { + const domException = new DOMException('Cannot go back', 'InvalidStateError'); + const committed = Promise.reject(domException); + const finished = Promise.reject(domException); + committed.catch(() => {}); + finished.catch(() => {}); + return { + committed, + finished, + }; + } + const entry = this.entriesArr[this.currentEntryIndex - 1]; + return this.traverseTo(entry.key, options); + } + + /** Equivalent to `navigation.forward()`. */ + forward(options?: NavigationOptions): FakeNavigationResult { + if (this.currentEntryIndex === this.entriesArr.length - 1) { + const domException = new DOMException('Cannot go forward', 'InvalidStateError'); + const committed = Promise.reject(domException); + const finished = Promise.reject(domException); + committed.catch(() => {}); + finished.catch(() => {}); + return { + committed, + finished, + }; + } + const entry = this.entriesArr[this.currentEntryIndex + 1]; + return this.traverseTo(entry.key, options); + } + + /** + * Equivalent to `history.go()`. + * Note that this method does not actually work precisely to how Chrome + * does, instead choosing a simpler model with less unexpected behavior. + * Chrome has a few edge case optimizations, for instance with repeated + * `back(); forward()` chains it collapses certain traversals. + */ + go(direction: number): void { + const targetIndex = this.prospectiveEntryIndex + direction; + if (targetIndex >= this.entriesArr.length || targetIndex < 0) { + return; + } + this.prospectiveEntryIndex = targetIndex; + this.runTraversal(() => { + // Check again that destination is in the entries array. + if (targetIndex >= this.entriesArr.length || targetIndex < 0) { + return; + } + const fromUrl = new URL(this.currentEntry.url!); + const entry = this.entriesArr[targetIndex]; + const hashChange = isHashChange(fromUrl, new URL(entry.url!, this.currentEntry.url!)); + const destination = new FakeNavigationDestination({ + url: entry.url!, + state: entry.getState(), + historyState: entry.getHistoryState(), + key: entry.key, + id: entry.id, + index: entry.index, + sameDocument: entry.sameDocument, + }); + const result = new InternalNavigationResult(); + this.userAgentNavigate(destination, result, { + navigationType: 'traverse', + cancelable: true, + canIntercept: true, + // Always false for go(). + userInitiated: false, + hashChange, + }); + }); + } + + /** Runs a traversal synchronously or asynchronously */ + private runTraversal(traversal: () => void) { + if (this.synchronousTraversals) { + traversal(); + return; + } + + // Each traversal occupies a single timeout resolution. + // This means that Promises added to commit and finish should resolve + // before the next traversal. + this.nextTraversal = this.nextTraversal.then(() => { + return new Promise((resolve) => { + setTimeout(() => { + resolve(); + traversal(); + }); + }); + }); + } + + /** Equivalent to `navigation.addEventListener()`. */ + addEventListener( + type: string, + callback: EventListenerOrEventListenerObject, + options?: AddEventListenerOptions | boolean, + ): void { + this.eventTarget.addEventListener(type, callback, options); + } + + /** Equivalent to `navigation.removeEventListener()`. */ + removeEventListener( + type: string, + callback: EventListenerOrEventListenerObject, + options?: EventListenerOptions | boolean, + ): void { + this.eventTarget.removeEventListener(type, callback, options); + } + + /** Equivalent to `navigation.dispatchEvent()` */ + dispatchEvent(event: Event): boolean { + return this.eventTarget.dispatchEvent(event); + } + + /** Cleans up resources. */ + dispose(): void { + // Recreate eventTarget to release current listeners. + // `document.createElement` because NodeJS `EventTarget` is incompatible with Domino's `Event`. + this.eventTarget = this.window.document.createElement('div'); + this.disposed = true; + } + + /** Returns whether this fake is disposed. */ + isDisposed(): boolean { + return this.disposed; + } + + /** Implementation for all navigations and traversals. */ + private userAgentNavigate( + destination: FakeNavigationDestination, + result: InternalNavigationResult, + options: InternalNavigateOptions, + ) { + // The first navigation should disallow any future calls to set the initial + // entry. + this.canSetInitialEntry = false; + if (this.navigateEvent) { + this.navigateEvent.cancel(new DOMException('Navigation was aborted', 'AbortError')); + this.navigateEvent = undefined; + } + + const navigateEvent = createFakeNavigateEvent({ + navigationType: options.navigationType, + cancelable: options.cancelable, + canIntercept: options.canIntercept, + userInitiated: options.userInitiated, + hashChange: options.hashChange, + signal: result.signal, + destination, + info: options.info, + sameDocument: destination.sameDocument, + skipPopState: options.skipPopState, + result, + userAgentCommit: () => { + this.userAgentCommit(); + }, + }); + + this.navigateEvent = navigateEvent; + this.eventTarget.dispatchEvent(navigateEvent); + navigateEvent.dispatchedNavigateEvent(); + if (navigateEvent.commitOption === 'immediate') { + navigateEvent.commit(/* internal= */ true); + } + } + + /** Implementation to commit a navigation. */ + private userAgentCommit() { + if (!this.navigateEvent) { + return; + } + const from = this.currentEntry; + if (!this.navigateEvent.sameDocument) { + const error = new Error('Cannot navigate to a non-same-document URL.'); + this.navigateEvent.cancel(error); + throw error; + } + if ( + this.navigateEvent.navigationType === 'push' || + this.navigateEvent.navigationType === 'replace' + ) { + this.userAgentPushOrReplace(this.navigateEvent.destination, { + navigationType: this.navigateEvent.navigationType, + }); + } else if (this.navigateEvent.navigationType === 'traverse') { + this.userAgentTraverse(this.navigateEvent.destination); + } + this.navigateEvent.userAgentNavigated(this.currentEntry); + const currentEntryChangeEvent = createFakeNavigationCurrentEntryChangeEvent({ + from, + navigationType: this.navigateEvent.navigationType, + }); + this.eventTarget.dispatchEvent(currentEntryChangeEvent); + if (!this.navigateEvent.skipPopState) { + const popStateEvent = createPopStateEvent({ + state: this.navigateEvent.destination.getHistoryState(), + }); + this.window.dispatchEvent(popStateEvent); + } + } + + /** Implementation for a push or replace navigation. */ + private userAgentPushOrReplace( + destination: FakeNavigationDestination, + {navigationType}: {navigationType: NavigationTypeString}, + ) { + if (navigationType === 'push') { + this.currentEntryIndex++; + this.prospectiveEntryIndex = this.currentEntryIndex; + } + const index = this.currentEntryIndex; + const key = navigationType === 'push' ? String(this.nextKey++) : this.currentEntry.key; + const entry = new FakeNavigationHistoryEntry(destination.url, { + id: String(this.nextId++), + key, + index, + sameDocument: true, + state: destination.getState(), + historyState: destination.getHistoryState(), + }); + if (navigationType === 'push') { + this.entriesArr.splice(index, Infinity, entry); + } else { + this.entriesArr[index] = entry; + } + } + + /** Implementation for a traverse navigation. */ + private userAgentTraverse(destination: FakeNavigationDestination) { + this.currentEntryIndex = destination.index; + } + + /** Utility method for finding entries with the given `key`. */ + private findEntry(key: string) { + for (const entry of this.entriesArr) { + if (entry.key === key) return entry; + } + return undefined; + } + + set onnavigate( + // tslint:disable-next-line:no-any + _handler: ((this: Navigation, ev: NavigateEvent) => any) | null, + ) { + throw new Error('unimplemented'); + } + + // tslint:disable-next-line:no-any + get onnavigate(): ((this: Navigation, ev: NavigateEvent) => any) | null { + throw new Error('unimplemented'); + } + + set oncurrententrychange( + _handler: // tslint:disable-next-line:no-any + ((this: Navigation, ev: NavigationCurrentEntryChangeEvent) => any) | null, + ) { + throw new Error('unimplemented'); + } + + get oncurrententrychange(): // tslint:disable-next-line:no-any + ((this: Navigation, ev: NavigationCurrentEntryChangeEvent) => any) | null { + throw new Error('unimplemented'); + } + + set onnavigatesuccess( + // tslint:disable-next-line:no-any + _handler: ((this: Navigation, ev: Event) => any) | null, + ) { + throw new Error('unimplemented'); + } + + // tslint:disable-next-line:no-any + get onnavigatesuccess(): ((this: Navigation, ev: Event) => any) | null { + throw new Error('unimplemented'); + } + + set onnavigateerror( + // tslint:disable-next-line:no-any + _handler: ((this: Navigation, ev: ErrorEvent) => any) | null, + ) { + throw new Error('unimplemented'); + } + + // tslint:disable-next-line:no-any + get onnavigateerror(): ((this: Navigation, ev: ErrorEvent) => any) | null { + throw new Error('unimplemented'); + } + + get transition(): NavigationTransition | null { + throw new Error('unimplemented'); + } + + updateCurrentEntry(_options: NavigationUpdateCurrentEntryOptions): void { + throw new Error('unimplemented'); + } + + reload(_options?: NavigationReloadOptions): NavigationResult { + throw new Error('unimplemented'); + } +} + +/** + * Fake equivalent of the `NavigationResult` interface with + * `FakeNavigationHistoryEntry`. + */ +interface FakeNavigationResult extends NavigationResult { + readonly committed: Promise; + readonly finished: Promise; +} + +/** + * Fake equivalent of `NavigationHistoryEntry`. + */ +export class FakeNavigationHistoryEntry implements NavigationHistoryEntry { + readonly sameDocument: boolean; + + readonly id: string; + readonly key: string; + readonly index: number; + private readonly state: unknown; + private readonly historyState: unknown; + + // tslint:disable-next-line:no-any + ondispose: ((this: NavigationHistoryEntry, ev: Event) => any) | null = null; + + constructor( + readonly url: string | null, + { + id, + key, + index, + sameDocument, + state, + historyState, + }: { + id: string; + key: string; + index: number; + sameDocument: boolean; + historyState: unknown; + state?: unknown; + }, + ) { + this.id = id; + this.key = key; + this.index = index; + this.sameDocument = sameDocument; + this.state = state; + this.historyState = historyState; + } + + getState(): unknown { + // Budget copy. + return this.state ? (JSON.parse(JSON.stringify(this.state)) as unknown) : this.state; + } + + getHistoryState(): unknown { + // Budget copy. + return this.historyState + ? (JSON.parse(JSON.stringify(this.historyState)) as unknown) + : this.historyState; + } + + addEventListener( + type: string, + callback: EventListenerOrEventListenerObject, + options?: AddEventListenerOptions | boolean, + ): void { + throw new Error('unimplemented'); + } + + removeEventListener( + type: string, + callback: EventListenerOrEventListenerObject, + options?: EventListenerOptions | boolean, + ): void { + throw new Error('unimplemented'); + } + + dispatchEvent(event: Event): boolean { + throw new Error('unimplemented'); + } +} + +/** `NavigationInterceptOptions` with experimental commit option. */ +export interface ExperimentalNavigationInterceptOptions extends NavigationInterceptOptions { + commit?: 'immediate' | 'after-transition'; +} + +/** `NavigateEvent` with experimental commit function. */ +export interface ExperimentalNavigateEvent extends NavigateEvent { + intercept(options?: ExperimentalNavigationInterceptOptions): void; + + commit(): void; +} + +/** + * Fake equivalent of `NavigateEvent`. + */ +export interface FakeNavigateEvent extends ExperimentalNavigateEvent { + readonly destination: FakeNavigationDestination; +} + +interface InternalFakeNavigateEvent extends FakeNavigateEvent { + readonly sameDocument: boolean; + readonly skipPopState?: boolean; + readonly commitOption: 'after-transition' | 'immediate'; + readonly result: InternalNavigationResult; + + commit(internal?: boolean): void; + cancel(reason: Error): void; + dispatchedNavigateEvent(): void; + userAgentNavigated(entry: FakeNavigationHistoryEntry): void; +} + +/** + * Create a fake equivalent of `NavigateEvent`. This is not a class because ES5 + * transpiled JavaScript cannot extend native Event. + */ +function createFakeNavigateEvent({ + cancelable, + canIntercept, + userInitiated, + hashChange, + navigationType, + signal, + destination, + info, + sameDocument, + skipPopState, + result, + userAgentCommit, +}: { + cancelable: boolean; + canIntercept: boolean; + userInitiated: boolean; + hashChange: boolean; + navigationType: NavigationTypeString; + signal: AbortSignal; + destination: FakeNavigationDestination; + info: unknown; + sameDocument: boolean; + skipPopState?: boolean; + result: InternalNavigationResult; + userAgentCommit: () => void; +}) { + const event = new Event('navigate', {bubbles: false, cancelable}) as { + -readonly [P in keyof InternalFakeNavigateEvent]: InternalFakeNavigateEvent[P]; + }; + event.canIntercept = canIntercept; + event.userInitiated = userInitiated; + event.hashChange = hashChange; + event.navigationType = navigationType; + event.signal = signal; + event.destination = destination; + event.info = info; + event.downloadRequest = null; + event.formData = null; + + event.sameDocument = sameDocument; + event.skipPopState = skipPopState; + event.commitOption = 'immediate'; + + let handlerFinished: Promise | undefined = undefined; + let interceptCalled = false; + let dispatchedNavigateEvent = false; + let commitCalled = false; + + event.intercept = function ( + this: InternalFakeNavigateEvent, + options?: ExperimentalNavigationInterceptOptions, + ): void { + interceptCalled = true; + event.sameDocument = true; + const handler = options?.handler; + if (handler) { + handlerFinished = handler(); + } + if (options?.commit) { + event.commitOption = options.commit; + } + // TODO: handle focus reset and scroll? + }; + + event.scroll = function (this: InternalFakeNavigateEvent): void { + // TODO: handle scroll? + }; + + event.commit = function (this: InternalFakeNavigateEvent, internal = false) { + if (!internal && !interceptCalled) { + throw new DOMException( + `Failed to execute 'commit' on 'NavigateEvent': intercept() must be ` + + `called before commit().`, + 'InvalidStateError', + ); + } + if (!dispatchedNavigateEvent) { + throw new DOMException( + `Failed to execute 'commit' on 'NavigateEvent': commit() may not be ` + + `called during event dispatch.`, + 'InvalidStateError', + ); + } + if (commitCalled) { + throw new DOMException( + `Failed to execute 'commit' on 'NavigateEvent': commit() already ` + `called.`, + 'InvalidStateError', + ); + } + commitCalled = true; + + userAgentCommit(); + }; + + // Internal only. + event.cancel = function (this: InternalFakeNavigateEvent, reason: Error) { + result.committedReject(reason); + result.finishedReject(reason); + }; + + // Internal only. + event.dispatchedNavigateEvent = function (this: InternalFakeNavigateEvent) { + dispatchedNavigateEvent = true; + if (event.commitOption === 'after-transition') { + // If handler finishes before commit, call commit. + handlerFinished?.then( + () => { + if (!commitCalled) { + event.commit(/* internal */ true); + } + }, + () => {}, + ); + } + Promise.all([result.committed, handlerFinished]).then( + ([entry]) => { + result.finishedResolve(entry); + }, + (reason) => { + result.finishedReject(reason); + }, + ); + }; + + // Internal only. + event.userAgentNavigated = function ( + this: InternalFakeNavigateEvent, + entry: FakeNavigationHistoryEntry, + ) { + result.committedResolve(entry); + }; + + return event as InternalFakeNavigateEvent; +} + +/** Fake equivalent of `NavigationCurrentEntryChangeEvent`. */ +export interface FakeNavigationCurrentEntryChangeEvent extends NavigationCurrentEntryChangeEvent { + readonly from: FakeNavigationHistoryEntry; +} + +/** + * Create a fake equivalent of `NavigationCurrentEntryChange`. This does not use + * a class because ES5 transpiled JavaScript cannot extend native Event. + */ +function createFakeNavigationCurrentEntryChangeEvent({ + from, + navigationType, +}: { + from: FakeNavigationHistoryEntry; + navigationType: NavigationTypeString; +}) { + const event = new Event('currententrychange', { + bubbles: false, + cancelable: false, + }) as { + -readonly [P in keyof NavigationCurrentEntryChangeEvent]: NavigationCurrentEntryChangeEvent[P]; + }; + event.from = from; + event.navigationType = navigationType; + return event as FakeNavigationCurrentEntryChangeEvent; +} + +/** + * Create a fake equivalent of `PopStateEvent`. This does not use a class + * because ES5 transpiled JavaScript cannot extend native Event. + */ +function createPopStateEvent({state}: {state: unknown}) { + const event = new Event('popstate', { + bubbles: false, + cancelable: false, + }) as {-readonly [P in keyof PopStateEvent]: PopStateEvent[P]}; + event.state = state; + return event as PopStateEvent; +} + +/** + * Fake equivalent of `NavigationDestination`. + */ +export class FakeNavigationDestination implements NavigationDestination { + readonly url: string; + readonly sameDocument: boolean; + readonly key: string | null; + readonly id: string | null; + readonly index: number; + + private readonly state?: unknown; + private readonly historyState: unknown; + + constructor({ + url, + sameDocument, + historyState, + state, + key = null, + id = null, + index = -1, + }: { + url: string; + sameDocument: boolean; + historyState: unknown; + state?: unknown; + key?: string | null; + id?: string | null; + index?: number; + }) { + this.url = url; + this.sameDocument = sameDocument; + this.state = state; + this.historyState = historyState; + this.key = key; + this.id = id; + this.index = index; + } + + getState(): unknown { + return this.state; + } + + getHistoryState(): unknown { + return this.historyState; + } +} + +/** Utility function to determine whether two UrlLike have the same hash. */ +function isHashChange(from: URL, to: URL): boolean { + return ( + to.hash !== from.hash && + to.hostname === from.hostname && + to.pathname === from.pathname && + to.search === from.search + ); +} + +/** Internal utility class for representing the result of a navigation. */ +class InternalNavigationResult { + committedResolve!: (entry: FakeNavigationHistoryEntry) => void; + committedReject!: (reason: Error) => void; + finishedResolve!: (entry: FakeNavigationHistoryEntry) => void; + finishedReject!: (reason: Error) => void; + readonly committed: Promise; + readonly finished: Promise; + get signal(): AbortSignal { + return this.abortController.signal; + } + private readonly abortController = new AbortController(); + + constructor() { + this.committed = new Promise((resolve, reject) => { + this.committedResolve = resolve; + this.committedReject = reject; + }); + + this.finished = new Promise(async (resolve, reject) => { + this.finishedResolve = resolve; + this.finishedReject = (reason: Error) => { + reject(reason); + this.abortController.abort(reason); + }; + }); + // All rejections are handled. + this.committed.catch(() => {}); + this.finished.catch(() => {}); + } +} + +/** Internal options for performing a navigate. */ +interface InternalNavigateOptions { + navigationType: NavigationTypeString; + cancelable: boolean; + canIntercept: boolean; + userInitiated: boolean; + hashChange: boolean; + info?: unknown; + skipPopState?: boolean; +} diff --git a/packages/core/primitives/dom-navigation/testing/index.ts b/packages/core/primitives/dom-navigation/testing/index.ts new file mode 100644 index 000000000000..6d537170b6fb --- /dev/null +++ b/packages/core/primitives/dom-navigation/testing/index.ts @@ -0,0 +1,9 @@ +/** + * @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.dev/license + */ + +export * from './fake_navigation'; diff --git a/packages/core/primitives/dom-navigation/testing/test/BUILD.bazel b/packages/core/primitives/dom-navigation/testing/test/BUILD.bazel new file mode 100644 index 000000000000..ff18b1754929 --- /dev/null +++ b/packages/core/primitives/dom-navigation/testing/test/BUILD.bazel @@ -0,0 +1,30 @@ +load("//tools:defaults.bzl", "jasmine_node_test", "karma_web_test_suite", "ts_library") + +ts_library( + name = "test_lib", + testonly = True, + srcs = glob( + ["**/*.ts"], + ), + # Visible to //:saucelabs_unit_tests_poc target + visibility = ["//:__pkg__"], + deps = [ + "//packages/core/primitives/dom-navigation/testing", + "//packages/private/testing", + ], +) + +jasmine_node_test( + name = "test", + bootstrap = ["//tools/testing:node"], + deps = [ + ":test_lib", + ], +) + +karma_web_test_suite( + name = "test_web", + deps = [ + ":test_lib", + ], +) diff --git a/packages/common/test/navigation/fake_platform_navigation.spec.ts b/packages/core/primitives/dom-navigation/testing/test/fake_platform_navigation.spec.ts similarity index 99% rename from packages/common/test/navigation/fake_platform_navigation.spec.ts rename to packages/core/primitives/dom-navigation/testing/test/fake_platform_navigation.spec.ts index b69d4556949d..2397159729dc 100644 --- a/packages/common/test/navigation/fake_platform_navigation.spec.ts +++ b/packages/core/primitives/dom-navigation/testing/test/fake_platform_navigation.spec.ts @@ -11,7 +11,10 @@ import { FakeNavigateEvent, FakeNavigation, FakeNavigationCurrentEntryChangeEvent, -} from '../../testing/src/navigation/fake_navigation'; +} from '../fake_navigation'; +import {ensureDocument} from '@angular/private/testing'; + +ensureDocument(); interface Locals { navigation: FakeNavigation; diff --git a/packages/core/src/core_private_export.ts b/packages/core/src/core_private_export.ts index 00442e53ec57..f4cd15a65112 100644 --- a/packages/core/src/core_private_export.ts +++ b/packages/core/src/core_private_export.ts @@ -6,6 +6,21 @@ * found in the LICENSE file at https://angular.dev/license */ +export { + type NavigateEvent as ɵNavigateEvent, + type Navigation as ɵNavigation, + type NavigationCurrentEntryChangeEvent as ɵNavigationCurrentEntryChangeEvent, + type NavigationHistoryEntry as ɵNavigationHistoryEntry, + type NavigationNavigateOptions as ɵNavigationNavigateOptions, + type NavigationOptions as ɵNavigationOptions, + type NavigationReloadOptions as ɵNavigationReloadOptions, + type NavigationResult as ɵNavigationResult, + type NavigationTransition as ɵNavigationTransition, + type NavigationUpdateCurrentEntryOptions as ɵNavigationUpdateCurrentEntryOptions, + type NavigationTypeString as ɵNavigationTypeString, + type NavigationInterceptOptions as ɵNavigationInterceptOptions, + type NavigationDestination as ɵNavigationDestination, +} from '../primitives/dom-navigation'; export {setAlternateWeakRefImpl as ɵsetAlternateWeakRefImpl} from '../primitives/signals'; export {detectChangesInViewIfRequired as ɵdetectChangesInViewIfRequired} from './application/application_ref'; export {INTERNAL_APPLICATION_ERROR_HANDLER as ɵINTERNAL_APPLICATION_ERROR_HANDLER} from './error_handler'; diff --git a/packages/core/testing/BUILD.bazel b/packages/core/testing/BUILD.bazel index 3be96e7e52ba..5366d7e6fd1c 100644 --- a/packages/core/testing/BUILD.bazel +++ b/packages/core/testing/BUILD.bazel @@ -13,6 +13,7 @@ ng_module( "//packages:types", "//packages/compiler", "//packages/core", + "//packages/core/primitives/dom-navigation/testing", "//packages/localize", "//packages/zone.js/lib:zone_d_ts", "@npm//@types/jasmine", diff --git a/packages/core/testing/public_api.ts b/packages/core/testing/public_api.ts index 7dfefb9c2203..2efde47bb3ad 100644 --- a/packages/core/testing/public_api.ts +++ b/packages/core/testing/public_api.ts @@ -14,5 +14,6 @@ * Entry point for all public APIs of this package. */ export * from './src/testing'; +export * from './src/testing_private_export'; // This file only reexports content of the `src` folder. Keep it that way. diff --git a/packages/core/testing/src/testing_private_export.ts b/packages/core/testing/src/testing_private_export.ts new file mode 100644 index 000000000000..5a34ee894f70 --- /dev/null +++ b/packages/core/testing/src/testing_private_export.ts @@ -0,0 +1,9 @@ +/** + * @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.dev/license + */ + +export {FakeNavigation as ɵFakeNavigation} from '../../primitives/dom-navigation/testing'; From d87097ba7c93b287d28849b9fffc2217695d6e7a Mon Sep 17 00:00:00 2001 From: Miles Malerba Date: Wed, 19 Feb 2025 20:02:06 +0000 Subject: [PATCH 0107/1000] build: update to latest @angular/ng-dev version (#60021) Update to the latest version to gain circular deps updates. PR Close #60021 --- package.json | 2 +- yarn.lock | 29 +++++++++++++---------------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 23b8d7bc9e46..f9a5f14890ca 100644 --- a/package.json +++ b/package.json @@ -163,7 +163,7 @@ "@angular/animations": "^19.2.0-next", "@angular/build-tooling": "https://github.com/angular/dev-infra-private-build-tooling-builds.git#ce04ec6cf7604014191821a637e60964a1a3bb4a", "@angular/core": "^19.2.0-next", - "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#e29eb33d02c473598361716df343c13016a6c943", + "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#252589f7bc8fe6ca13b31e02d506ec52e826cdd2", "@bazel/bazelisk": "^1.7.5", "@bazel/buildifier": "^8.0.0", "@bazel/ibazel": "0.16.2", diff --git a/yarn.lock b/yarn.lock index 2ec19862ba1d..a7d5b72b862d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -325,7 +325,6 @@ "@angular/build-tooling@https://github.com/angular/dev-infra-private-build-tooling-builds.git#ce04ec6cf7604014191821a637e60964a1a3bb4a": version "0.0.0-2670abf637fa155971cdd1f7e570a7f234922a65" - uid ce04ec6cf7604014191821a637e60964a1a3bb4a resolved "https://github.com/angular/dev-infra-private-build-tooling-builds.git#ce04ec6cf7604014191821a637e60964a1a3bb4a" dependencies: "@angular/benchpress" "0.3.0" @@ -480,13 +479,12 @@ dependencies: tslib "^2.3.0" -"@angular/ng-dev@https://github.com/angular/dev-infra-private-ng-dev-builds.git#e29eb33d02c473598361716df343c13016a6c943": - version "0.0.0-002a34e9875f55bf1850fb57d34261b33b2fd492" - uid e29eb33d02c473598361716df343c13016a6c943 - resolved "https://github.com/angular/dev-infra-private-ng-dev-builds.git#e29eb33d02c473598361716df343c13016a6c943" +"@angular/ng-dev@https://github.com/angular/dev-infra-private-ng-dev-builds.git#252589f7bc8fe6ca13b31e02d506ec52e826cdd2": + version "0.0.0-0ad6a370f70638e785d6ef1f90dc6ede34684a47" + resolved "https://github.com/angular/dev-infra-private-ng-dev-builds.git#252589f7bc8fe6ca13b31e02d506ec52e826cdd2" dependencies: "@google-cloud/spanner" "7.18.1" - "@octokit/rest" "21.1.0" + "@octokit/rest" "21.1.1" "@types/semver" "^7.3.6" "@types/supports-color" "^10.0.0" "@yarnpkg/lockfile" "^1.1.0" @@ -3063,7 +3061,7 @@ before-after-hook "^2.2.0" universal-user-agent "^6.0.0" -"@octokit/core@^6.1.3": +"@octokit/core@^6.1.4": version "6.1.4" resolved "https://registry.yarnpkg.com/@octokit/core/-/core-6.1.4.tgz#f5ccf911cc95b1ce9daf6de425d1664392f867db" integrity sha512-lAS9k7d6I0MPN+gb9bKDt7X8SdxknYqAMh44S5L+lNqIN2NuV8nvv3g8rPp7MuRxcOpxpUIATWprO0C34a8Qmg== @@ -3120,7 +3118,7 @@ resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-23.0.1.tgz#3721646ecd36b596ddb12650e0e89d3ebb2dd50e" integrity sha512-izFjMJ1sir0jn0ldEKhZ7xegCTj/ObmEDlEfpFrx4k/JyZSMRHbO3/rBwgE7f3m2DHt+RrNGIVw4wSmwnm3t/g== -"@octokit/plugin-paginate-rest@^11.4.0": +"@octokit/plugin-paginate-rest@^11.4.2": version "11.4.2" resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.4.2.tgz#8f46a1de74c35e016c86701ef4ea0e8ef25a06e0" integrity sha512-BXJ7XPCTDXFF+wxcg/zscfgw2O/iDPtNSkwwR1W1W5c4Mb3zav/M2XvxQ23nVmKj7jpweB4g8viMeCQdm7LMVA== @@ -3190,13 +3188,13 @@ fast-content-type-parse "^2.0.0" universal-user-agent "^7.0.2" -"@octokit/rest@21.1.0": - version "21.1.0" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-21.1.0.tgz#adbd3eca32a686e3d24e7840a58270e030267a1f" - integrity sha512-93iLxcKDJboUpmnUyeJ6cRIi7z7cqTZT1K7kRK4LobGxwTwpsa+2tQQbRQNGy7IFDEAmrtkf4F4wBj3D5rVlJQ== +"@octokit/rest@21.1.1": + version "21.1.1" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-21.1.1.tgz#7a70455ca451b1d253e5b706f35178ceefb74de2" + integrity sha512-sTQV7va0IUVZcntzy1q3QqPm/r8rWtDCqpRAmb8eXXnKkjoQEtFe3Nt5GTVsHft+R6jJoHeSiVLcgcvhtue/rg== dependencies: - "@octokit/core" "^6.1.3" - "@octokit/plugin-paginate-rest" "^11.4.0" + "@octokit/core" "^6.1.4" + "@octokit/plugin-paginate-rest" "^11.4.2" "@octokit/plugin-request-log" "^5.3.1" "@octokit/plugin-rest-endpoint-methods" "^13.3.0" @@ -8240,8 +8238,7 @@ domhandler@^5.0.2, domhandler@^5.0.3: domelementtype "^2.3.0" "domino@https://github.com/angular/domino.git#8f228f8862540c6ccd14f76b5a1d9bb5458618af": - version "2.1.6+git" - uid "8f228f8862540c6ccd14f76b5a1d9bb5458618af" + version "2.1.6" resolved "https://github.com/angular/domino.git#8f228f8862540c6ccd14f76b5a1d9bb5458618af" dompurify@^3.2.1: From f2d51c9ba2c24073863dd8af78971b6d5d560041 Mon Sep 17 00:00:00 2001 From: Miles Malerba Date: Wed, 19 Feb 2025 20:03:43 +0000 Subject: [PATCH 0108/1000] build: remove circular deps goldens (#60021) Removes the circular dependencies golden file and cleans up the associated pullapprove group. All circular dependencies have been removed and no new ones may be added. PR Close #60021 --- .pullapprove.yml | 23 ----------------------- goldens/README.md | 13 ------------- goldens/circular-deps/packages.json | 1 - package.json | 1 - packages/circular-deps-test.conf.js | 3 --- 5 files changed, 41 deletions(-) delete mode 100644 goldens/circular-deps/packages.json diff --git a/.pullapprove.yml b/.pullapprove.yml index 49869975dcd3..e1c994e987ff 100644 --- a/.pullapprove.yml +++ b/.pullapprove.yml @@ -144,7 +144,6 @@ groups: - > contains_any_globs(files.exclude('packages/core/primitives/*'), [ 'contributing-docs/public-api-surface.md', - 'goldens/circular-deps/packages.json', 'integration/**/{*,.*}', 'modules/**/{*,.*}', 'packages/animations/**/{*,.*}', @@ -430,28 +429,6 @@ groups: required: 1 # Require that 1 person approve reviewed_for: required - # ================================================ - # Circular dependencies - # ================================================ - circular-dependencies: - <<: *defaults - conditions: - - *no-groups-above-this-pending - - *no-groups-above-this-rejected - - > - contains_any_globs(files, [ - 'goldens/circular-deps/packages.json' - ]) - reviewers: - users: - - alxhub - - AndrewKushnir - - atscott - - ~jelbourn - - thePunderWoman - - pkozlowski-opensource - - kirjs - #################################################################################### # Special Cases #################################################################################### diff --git a/goldens/README.md b/goldens/README.md index c2a44e126c79..b32b4e18d863 100644 --- a/goldens/README.md +++ b/goldens/README.md @@ -10,16 +10,3 @@ yarn public-api:check yarn public-api:update ``` -### *`packages-circular-deps.json`* - -This golden file contains a list of all circular dependencies in the project. As part of the -lint CI job we compare the current circular dependencies against this golden to ensure that -we don't add more cycles. If cycles have been fixed, this file is also updated so that we can -slowly burn down the number of cycles in the project. - -To check or update the golden, run the following commands: - -```bash -yarn ts-circular-deps:check -yarn ts-circular-deps:approve -``` diff --git a/goldens/circular-deps/packages.json b/goldens/circular-deps/packages.json deleted file mode 100644 index 0637a088a01e..000000000000 --- a/goldens/circular-deps/packages.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/package.json b/package.json index f9a5f14890ca..d65b9535be3a 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,6 @@ "symbol-extractor:check": "node tools/symbol-extractor/run_all_symbols_extractor_tests.js test", "symbol-extractor:update": "node tools/symbol-extractor/run_all_symbols_extractor_tests.js accept", "ts-circular-deps:check": "yarn -s ng-dev ts-circular-deps check --config ./packages/circular-deps-test.conf.js", - "ts-circular-deps:approve": "yarn -s ng-dev ts-circular-deps approve --config ./packages/circular-deps-test.conf.js", "check-tooling-setup": "yarn tsc --project .ng-dev/tsconfig.json && yarn tsc --project scripts/tsconfig.json", "devtools:devserver": "ibazel run //devtools/src:devserver", "devtools:devserver:demo-standalone": "ibazel run //devtools/projects/demo-standalone/src:devserver", diff --git a/packages/circular-deps-test.conf.js b/packages/circular-deps-test.conf.js index ed6ca9f43b2d..c4dd5d798f2e 100644 --- a/packages/circular-deps-test.conf.js +++ b/packages/circular-deps-test.conf.js @@ -10,10 +10,7 @@ const path = require('path'); module.exports = { baseDir: '../', - goldenFile: '../goldens/circular-deps/packages.json', glob: `./**/*.ts`, - // Command that will be displayed if the golden needs to be updated. - approveCommand: 'yarn ts-circular-deps:approve', resolveModule: resolveModule, ignoreTypeOnlyChecks: true, }; From b7dd5a1ef2aa2f53cbccd6d5f71d4b87318bce64 Mon Sep 17 00:00:00 2001 From: Joey Perrott Date: Wed, 19 Feb 2025 20:40:28 +0000 Subject: [PATCH 0109/1000] ci: update deploy doc site script (#60021) Update the checked in version of the deploy script PR Close #60021 --- .github/actions/deploy-docs-site/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/deploy-docs-site/main.js b/.github/actions/deploy-docs-site/main.js index d3ccf7be8b8a..2498aa70f5cc 100644 --- a/.github/actions/deploy-docs-site/main.js +++ b/.github/actions/deploy-docs-site/main.js @@ -29830,7 +29830,7 @@ function legacyRestEndpointMethods(octokit) { legacyRestEndpointMethods.VERSION = VERSION9; // -var VERSION10 = "21.1.0"; +var VERSION10 = "21.1.1"; // var Octokit2 = Octokit.plugin(requestLog, legacyRestEndpointMethods, paginateRest).defaults( From af5155f19763714d8b7949a0beff9d4b6a5a78f5 Mon Sep 17 00:00:00 2001 From: muhammadali1658 Date: Thu, 20 Feb 2025 12:22:32 +0000 Subject: [PATCH 0110/1000] docs: Fix typo ')' in banner-initial.component.spec.ts (#60032) PR Close #60032 --- .../testing/src/app/banner/banner-initial.component.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adev/src/content/examples/testing/src/app/banner/banner-initial.component.spec.ts b/adev/src/content/examples/testing/src/app/banner/banner-initial.component.spec.ts index b55febd2784c..1d9c687b8a62 100755 --- a/adev/src/content/examples/testing/src/app/banner/banner-initial.component.spec.ts +++ b/adev/src/content/examples/testing/src/app/banner/banner-initial.component.spec.ts @@ -90,7 +90,7 @@ describe('BannerComponent (with beforeEach)', () => { // #enddocregion v4-test-3 // #docregion v4-test-4 - it('should find the

with fixture.debugElement.nativeElement)', () => { + it('should find the

with fixture.debugElement.nativeElement', () => { // #docregion debugElement-nativeElement const bannerDe: DebugElement = fixture.debugElement; const bannerEl: HTMLElement = bannerDe.nativeElement; From 7a8e8f37c0923bb4d33d635ccfa21ae0d2aafc8a Mon Sep 17 00:00:00 2001 From: Trevor Florence Date: Wed, 19 Feb 2025 14:26:59 -0700 Subject: [PATCH 0111/1000] fix(benchpress): Ensure future-proof correct initialization order (#60025) Future changes to initialization order can cause this previously OK code to start having compiler erroring like: `TS2729: Property 'foo' is used before its initialization.` PR Close #60025 --- packages/benchpress/src/reporter/json_file_reporter.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/benchpress/src/reporter/json_file_reporter.ts b/packages/benchpress/src/reporter/json_file_reporter.ts index 01a24e4c7f91..20e9b2a66b69 100644 --- a/packages/benchpress/src/reporter/json_file_reporter.ts +++ b/packages/benchpress/src/reporter/json_file_reporter.ts @@ -46,9 +46,11 @@ export class JsonFileReporter extends Reporter { @Inject(Options.NOW) private _now: Function, ) { super(); + + this.textReporter = new TextReporterBase(this._columnWidth, this._description); } - private textReporter = new TextReporterBase(this._columnWidth, this._description); + private textReporter: TextReporterBase; override reportMeasureValues(measureValues: MeasureValues): Promise { return Promise.resolve(null); From c513e5dc2bcdb54e33af0ddcbf623e510e352ef0 Mon Sep 17 00:00:00 2001 From: hawkgs Date: Tue, 18 Feb 2025 14:04:15 +0200 Subject: [PATCH 0112/1000] refactor(devtools): fix component inspector highlighting (#59995) Use `position: absolute` instead of `position: fixed`. This fixes the odd behavior that can be reproduced when scrolling. PR Close #59995 --- .../projects/ng-devtools-backend/src/lib/highlighter.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/devtools/projects/ng-devtools-backend/src/lib/highlighter.ts b/devtools/projects/ng-devtools-backend/src/lib/highlighter.ts index da58d347a5d0..b0d4dac35c54 100644 --- a/devtools/projects/ng-devtools-backend/src/lib/highlighter.ts +++ b/devtools/projects/ng-devtools-backend/src/lib/highlighter.ts @@ -39,7 +39,7 @@ function createOverlay(color: RgbColor): {overlay: HTMLElement; overlayContent: const overlay = document.createElement('div'); overlay.className = 'ng-devtools-overlay'; overlay.style.backgroundColor = toCSSColor(...color, 0.35); - overlay.style.position = 'fixed'; + overlay.style.position = 'absolute'; overlay.style.zIndex = '2147483647'; overlay.style.pointerEvents = 'none'; overlay.style.display = 'flex'; @@ -196,8 +196,8 @@ function showOverlay( const {width, height, top, left} = dimensions; overlay.style.width = ~~width + 'px'; overlay.style.height = ~~height + 'px'; - overlay.style.top = ~~top + 'px'; - overlay.style.left = ~~left + 'px'; + overlay.style.top = ~~top + window.scrollY + 'px'; + overlay.style.left = ~~left + window.scrollX + 'px'; positionOverlayContent(overlayContent, dimensions, labelPosition); overlayContent.replaceChildren(); From 35e25f690ccf2c8b46e0e75d99e7136c1c8a9663 Mon Sep 17 00:00:00 2001 From: arturovt Date: Thu, 30 Jan 2025 23:48:26 +0200 Subject: [PATCH 0113/1000] refactor(core): drop platform check in `ImagePerformanceWarning` (#59809) Replaces `PLATFORM_ID` checks with `ngServerMode`. PR Close #59809 --- packages/core/src/image_performance_warning.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/core/src/image_performance_warning.ts b/packages/core/src/image_performance_warning.ts index cc3c66119833..cbdb8502b2ea 100644 --- a/packages/core/src/image_performance_warning.ts +++ b/packages/core/src/image_performance_warning.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -import {IMAGE_CONFIG, ImageConfig, PLATFORM_ID} from './application/application_tokens'; +import {IMAGE_CONFIG, ImageConfig} from './application/application_tokens'; import {Injectable} from './di'; import {inject} from './di/injector_compatibility'; import {formatRuntimeError, RuntimeErrorCode} from './errors'; @@ -27,12 +27,11 @@ export class ImagePerformanceWarning implements OnDestroy { private window: Window | null = null; private observer: PerformanceObserver | null = null; private options: ImageConfig = inject(IMAGE_CONFIG); - private readonly isBrowser = inject(PLATFORM_ID) === 'browser'; private lcpImageUrl?: string; public start() { if ( - !this.isBrowser || + (typeof ngServerMode !== 'undefined' && ngServerMode) || typeof PerformanceObserver === 'undefined' || (this.options?.disableImageSizeWarning && this.options?.disableImageLazyLoadWarning) ) { @@ -41,7 +40,7 @@ export class ImagePerformanceWarning implements OnDestroy { this.observer = this.initPerformanceObserver(); const doc = getDocument(); const win = doc.defaultView; - if (typeof win !== 'undefined') { + if (win) { this.window = win; // Wait to avoid race conditions where LCP image triggers // load event before it's recorded by the performance observer From 6e1ead6f93b8771dddb128b6c65da07a39a2d075 Mon Sep 17 00:00:00 2001 From: Jessica Janiuk Date: Mon, 27 Jan 2025 15:09:37 -0500 Subject: [PATCH 0114/1000] refactor(core): clean up when blocks fail to fetch or hydrate (#59740) There are cases where resources fail to fetch or the DOM has changed due to an if block. This should clean up the remaining promises and any registry references to those blocks in that case. PR Close #59740 --- packages/core/src/defer/rendering.ts | 36 ++-- packages/core/src/defer/triggering.ts | 111 ++++++++--- packages/core/src/hydration/cleanup.ts | 12 ++ .../test/incremental_hydration_spec.ts | 174 ++++++++++++++++++ 4 files changed, 291 insertions(+), 42 deletions(-) diff --git a/packages/core/src/defer/rendering.ts b/packages/core/src/defer/rendering.ts index 65d32d9ddc39..37b751055775 100644 --- a/packages/core/src/defer/rendering.ts +++ b/packages/core/src/defer/rendering.ts @@ -222,13 +222,14 @@ export function renderDeferBlockState( function findMatchingDehydratedViewForDeferBlock( lContainer: LContainer, lDetails: LDeferBlockDetails, -): DehydratedContainerView | null { - // Find matching view based on serialized defer block state. - return ( - lContainer[DEHYDRATED_VIEWS]?.find( +): {dehydratedView: DehydratedContainerView | null; dehydratedViewIx: number} { + const dehydratedViewIx = + lContainer[DEHYDRATED_VIEWS]?.findIndex( (view: any) => view.data[SERIALIZED_DEFER_BLOCK_STATE] === lDetails[DEFER_BLOCK_STATE], - ) ?? null - ); + ) ?? -1; + const dehydratedView = + dehydratedViewIx > -1 ? lContainer[DEHYDRATED_VIEWS]![dehydratedViewIx] : null; + return {dehydratedView, dehydratedViewIx}; } /** @@ -273,10 +274,10 @@ function applyDeferBlockState( injector = createDeferBlockInjector(hostLView[INJECTOR], tDetails, providers); } } - const dehydratedView = findMatchingDehydratedViewForDeferBlock(lContainer, lDetails); - // Erase dehydrated view info, so that it's not removed later - // by post-hydration cleanup process. - lContainer[DEHYDRATED_VIEWS] = null; + const {dehydratedView, dehydratedViewIx} = findMatchingDehydratedViewForDeferBlock( + lContainer, + lDetails, + ); const embeddedLView = createAndRenderEmbeddedLView(hostLView, activeBlockTNode, null, { injector, @@ -290,11 +291,16 @@ function applyDeferBlockState( ); markViewDirty(embeddedLView, NotificationSource.DeferBlockStateUpdate); - // TODO(incremental-hydration): - // - what if we had some views in `lContainer[DEHYDRATED_VIEWS]`, but - // we didn't find a view that matches the expected state? - // - for example, handle a situation when a block was in the "completed" state - // on the server, but the loading failing on the client. How do we reconcile and cleanup? + if (dehydratedViewIx > -1) { + // Erase dehydrated view info in a given LContainer, so that the view is not + // removed later by post-hydration cleanup process (which iterates over all + // dehydrated views in component tree). This clears only the dehydrated view + // that was found for this render, which in most cases will be the only view. + // In the case that there was control flow that changed, there may be either + // more than one or the views would not match up due to the server rendered + // content being a different branch of the control flow. + lContainer[DEHYDRATED_VIEWS]?.splice(dehydratedViewIx, 1); + } if ( (newState === DeferBlockState.Complete || newState === DeferBlockState.Error) && diff --git a/packages/core/src/defer/triggering.ts b/packages/core/src/defer/triggering.ts index 636250f78c90..677ec1aada2c 100644 --- a/packages/core/src/defer/triggering.ts +++ b/packages/core/src/defer/triggering.ts @@ -10,7 +10,11 @@ import {afterNextRender} from '../render3/after_render/hooks'; import {Injector} from '../di'; import {internalImportProvidersFrom} from '../di/provider_collection'; import {RuntimeError, RuntimeErrorCode} from '../errors'; -import {cleanupHydratedDeferBlocks} from '../hydration/cleanup'; +import { + cleanupHydratedDeferBlocks, + cleanupLContainer, + removeDehydratedViewList, +} from '../hydration/cleanup'; import {BlockSummary, ElementTrigger, NUM_ROOT_NODES} from '../hydration/interfaces'; import { assertSsrIdDefined, @@ -35,10 +39,12 @@ import { import {onViewport} from './dom_triggers'; import {onIdle} from './idle_scheduler'; import { + DEFER_BLOCK_STATE, DeferBlockBehavior, DeferBlockState, DeferBlockTrigger, DeferDependenciesLoadingState, + DehydratedDeferBlock, HydrateTriggerDetails, LDeferBlockDetails, ON_COMPLETE_FNS, @@ -64,6 +70,7 @@ import { getTDeferBlockDetails, } from './utils'; import {ApplicationRef} from '../application/application_ref'; +import {DEHYDRATED_VIEWS} from '../render3/interfaces/container'; /** * Schedules triggering of a defer block for `on idle` and `on timer` conditions. @@ -400,17 +407,40 @@ export async function triggerHydrationFromBlockName( } // Actually do the triggering and hydration of the queue of blocks - for (const dehydratedBlockId of hydrationQueue) { - await triggerResourceLoadingForHydration(dehydratedBlockId, dehydratedBlockRegistry); - await nextRender(injector); - // TODO(incremental-hydration): assert (in dev mode) that a defer block is present in the dehydrated registry - // at this point. If not - it means that the block has not been hydrated, for example due to different - // `@if` conditions on the client and the server. If we detect this case, we should also do the cleanup - // of all child block (promises, registry state, etc). - // TODO(incremental-hydration): call `rejectFn` when lDetails[DEFER_BLOCK_STATE] is `DeferBlockState.Error`. - blocksBeingHydrated.get(dehydratedBlockId)!.resolve(); - - // TODO(incremental-hydration): consider adding a wait for stability here + for (let blockQueueIdx = 0; blockQueueIdx < hydrationQueue.length; blockQueueIdx++) { + const dehydratedBlockId = hydrationQueue[blockQueueIdx]; + const dehydratedDeferBlock = dehydratedBlockRegistry.get(dehydratedBlockId); + + if (dehydratedDeferBlock != null) { + // trigger the block resources and await next render for hydration. This should result + // in the next block ɵɵdefer instruction being called and that block being added to the dehydrated registry. + await triggerResourceLoadingForHydration(dehydratedDeferBlock); + await nextRender(injector); + + // if the content has changed since server rendering, we need to check for the expected block + // being in the registry or if errors occurred. In that case, we need to clean up the remaining expected + // content that won't be rendered or fetched. + if (deferBlockHasErrored(dehydratedDeferBlock)) { + // Either the expected block has not yet had its ɵɵdefer instruction called or the block errored out when fetching + // resources. In the former case, either we're hydrating too soon or the client and server differ. In both cases, + // we need to clean up child content and promises. + removeDehydratedViewList(dehydratedDeferBlock); + cleanupRemainingHydrationQueue( + hydrationQueue.slice(blockQueueIdx), + dehydratedBlockRegistry, + ); + break; + } + // The defer block has not errored and we've finished fetching resources and rendering. + // At this point it is safe to resolve the hydration promise. + blocksBeingHydrated.get(dehydratedBlockId)!.resolve(); + } else { + // The expected block has not yet had its ɵɵdefer instruction called. This is likely due to content changing between + // client and server. We need to clean up the dehydrated DOM in the container since it no longer is valid. + cleanupParentContainer(blockQueueIdx, hydrationQueue, dehydratedBlockRegistry); + cleanupRemainingHydrationQueue(hydrationQueue.slice(blockQueueIdx), dehydratedBlockRegistry); + break; + } } // Await hydration completion for the requested block. @@ -433,6 +463,46 @@ export async function triggerHydrationFromBlockName( ); } +export function deferBlockHasErrored(deferBlock: DehydratedDeferBlock): boolean { + return ( + getLDeferBlockDetails(deferBlock.lView, deferBlock.tNode)[DEFER_BLOCK_STATE] === + DeferBlockState.Error + ); +} + +/** + * Clean up the parent container of a block where content changed between server and client. + * The parent of a block going through `triggerHydrationFromBlockName` will contain the + * dehydrated content that needs to be cleaned up. So we have to do the clean up from that location + * in the tree. + */ +function cleanupParentContainer( + currentBlockIdx: number, + hydrationQueue: string[], + dehydratedBlockRegistry: DehydratedBlockRegistry, +) { + // If a parent block exists, it's in the hydration queue in front of the current block. + const parentDeferBlockIdx = currentBlockIdx - 1; + const parentDeferBlock = + parentDeferBlockIdx > -1 + ? dehydratedBlockRegistry.get(hydrationQueue[parentDeferBlockIdx]) + : null; + if (parentDeferBlock) { + cleanupLContainer(parentDeferBlock.lContainer); + } +} + +function cleanupRemainingHydrationQueue( + hydrationQueue: string[], + dehydratedBlockRegistry: DehydratedBlockRegistry, +) { + const blocksBeingHydrated = dehydratedBlockRegistry.hydrating; + for (const dehydratedBlockId in hydrationQueue) { + blocksBeingHydrated.get(dehydratedBlockId)?.reject(); + } + dehydratedBlockRegistry.cleanup(hydrationQueue); +} + /** * Generates a new promise for every defer block in the hydrating queue */ @@ -448,22 +518,9 @@ function nextRender(injector: Injector): Promise { } async function triggerResourceLoadingForHydration( - dehydratedBlockId: string, - dehydratedBlockRegistry: DehydratedBlockRegistry, + dehydratedBlock: DehydratedDeferBlock, ): Promise { - const deferBlock = dehydratedBlockRegistry.get(dehydratedBlockId); - // Since we trigger hydration for nested defer blocks in a sequence (parent -> child), - // there is a chance that a defer block may not be present at hydration time. For example, - // when a nested block was in an `@if` condition, which has changed. - if (deferBlock === null) { - // TODO(incremental-hydration): handle the cleanup for cases when - // defer block is no longer present during hydration (e.g. `@if` condition - // has changed during hydration/rendering). - - return; - } - - const {tNode, lView} = deferBlock; + const {tNode, lView} = dehydratedBlock; const lDetails = getLDeferBlockDetails(lView, tNode); return new Promise((resolve) => { diff --git a/packages/core/src/hydration/cleanup.ts b/packages/core/src/hydration/cleanup.ts index 7444e5b9d1cd..861c58791ef8 100644 --- a/packages/core/src/hydration/cleanup.ts +++ b/packages/core/src/hydration/cleanup.ts @@ -53,6 +53,18 @@ export function removeDehydratedViews(lContainer: LContainer) { lContainer[DEHYDRATED_VIEWS] = retainedViews; } +export function removeDehydratedViewList(deferBlock: DehydratedDeferBlock) { + const {lContainer} = deferBlock; + const dehydratedViews = lContainer[DEHYDRATED_VIEWS]; + if (dehydratedViews === null) return; + const parentLView = lContainer[PARENT]; + const renderer = parentLView[RENDERER]; + for (const view of dehydratedViews) { + removeDehydratedView(view, renderer); + ngDevMode && ngDevMode.dehydratedViewsRemoved++; + } +} + /** * Helper function to remove all nodes from a dehydrated view. */ diff --git a/packages/platform-server/test/incremental_hydration_spec.ts b/packages/platform-server/test/incremental_hydration_spec.ts index f570780f8821..869dbeaf8fa6 100644 --- a/packages/platform-server/test/incremental_hydration_spec.ts +++ b/packages/platform-server/test/incremental_hydration_spec.ts @@ -12,10 +12,13 @@ import { Component, destroyPlatform, inject, + Input, NgZone, PLATFORM_ID, Provider, + QueryList, signal, + ViewChildren, ɵDEFER_BLOCK_DEPENDENCY_INTERCEPTOR, } from '@angular/core'; @@ -61,6 +64,15 @@ function dynamicImportOf(type: T, timeout = 0): Promise { }); } +/** + * Emulates a failed dynamic import promise. + */ +function failedDynamicImport(): Promise { + return new Promise((_, reject) => { + setTimeout(() => reject()); + }); +} + /** * Helper function to await all pending dynamic imports * emulated using `dynamicImportOf` function. @@ -1952,6 +1964,168 @@ describe('platform-server partial hydration integration', () => { expect(appHostNode.outerHTML).not.toContain('Outer block placeholder'); expect(registry.cleanup).toHaveBeenCalledTimes(1); }); + + it('should handle hydration and cleanup when if then condition changes', async () => { + @Component({ + selector: 'app', + template: ` +

+ @defer (on interaction; hydrate on interaction) { +
+

Main defer block rendered!

+ @if (isServer) { + @defer (on interaction; hydrate on interaction) { +
+ nested defer block rendered! +
+ } @placeholder { + Outer block placeholder + } + } @else { +

client side

+ } +
+ } @placeholder { + Outer block placeholder + } +
+ `, + }) + class SimpleComponent { + value = signal('start'); + isServer = isPlatformServer(inject(PLATFORM_ID)); + fnA() {} + fnB() { + this.value.set('end'); + } + } + + const appId = 'custom-app-id'; + const providers = [{provide: APP_ID, useValue: appId}]; + const hydrationFeatures = () => [withIncrementalHydration()]; + + const html = await ssr(SimpleComponent, {envProviders: providers, hydrationFeatures}); + const ssrContents = getAppContents(html); + + expect(ssrContents).toContain('
client transition in this test. + resetTViewsFor(SimpleComponent); + + //////////////////////////////// + const doc = getDocument(); + const appRef = await prepareEnvironmentAndHydrate(doc, html, SimpleComponent, { + envProviders: [...providers, {provide: PLATFORM_ID, useValue: 'browser'}], + hydrationFeatures, + }); + const compRef = getComponentRef(appRef); + appRef.tick(); + await appRef.whenStable(); + + const appHostNode = compRef.location.nativeElement; + expect(appHostNode.outerHTML).toContain('nested defer block rendered'); + + const article = doc.getElementById('item')!; + const clickEvent = new CustomEvent('click', {bubbles: true}); + article.dispatchEvent(clickEvent); + await allPendingDynamicImports(); + + appRef.tick(); + + expect(appHostNode.outerHTML).not.toContain('nested defer block rendered'); + expect(appHostNode.outerHTML).toContain('

client side

'); + + // Emit an event inside of a defer block, which should result + // in triggering the defer block (start loading deps, etc) and + // subsequent hydration. + expect(appHostNode.outerHTML).not.toContain('Outer block placeholder'); + }); + + it('should render an error block when loading fails and cleanup the original content', async () => { + @Component({ + selector: 'nested-cmp', + standalone: true, + template: 'Rendering {{ block }} block.', + }) + class NestedCmp { + @Input() block!: string; + } + + @Component({ + standalone: true, + selector: 'app', + imports: [NestedCmp], + template: ` +
+ @defer (on interaction; hydrate on interaction) { +
+ +
+ } @placeholder { + Outer block placeholder + } @error { +

Failed to load dependencies :(

+ + } +
+ `, + }) + class SimpleComponent { + @ViewChildren(NestedCmp) cmps!: QueryList; + value = signal('start'); + fnA() {} + fnB() { + this.value.set('end'); + } + } + + const deferDepsInterceptor = { + intercept() { + return () => [failedDynamicImport()]; + }, + }; + + const appId = 'custom-app-id'; + const providers = [{provide: APP_ID, useValue: appId}]; + const hydrationFeatures = () => [withIncrementalHydration()]; + + const html = await ssr(SimpleComponent, {envProviders: providers, hydrationFeatures}); + const ssrContents = getAppContents(html); + + expect(ssrContents).toContain('
client transition in this test. + resetTViewsFor(SimpleComponent); + + //////////////////////////////// + const doc = getDocument(); + const appRef = await prepareEnvironmentAndHydrate(doc, html, SimpleComponent, { + envProviders: [ + ...providers, + {provide: PLATFORM_ID, useValue: 'browser'}, + {provide: ɵDEFER_BLOCK_DEPENDENCY_INTERCEPTOR, useValue: deferDepsInterceptor}, + ], + hydrationFeatures, + }); + const compRef = getComponentRef(appRef); + appRef.tick(); + await appRef.whenStable(); + + const appHostNode = compRef.location.nativeElement; + expect(appHostNode.outerHTML).toContain('Rendering primary block'); + + const article = doc.getElementById('item')!; + const clickEvent = new CustomEvent('click', {bubbles: true}); + article.dispatchEvent(clickEvent); + await allPendingDynamicImports(); + + appRef.tick(); + + expect(appHostNode.outerHTML).not.toContain('Rendering primary block'); + expect(appHostNode.outerHTML).toContain('Rendering error block'); + }); }); describe('cleanup', () => { From 5b7a936aff6537cc94d262533579422f82351a9d Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Fri, 21 Feb 2025 10:28:22 +0100 Subject: [PATCH 0115/1000] refactor(core): remove duplicated checks for ngNonBindable (#60048) This refactoring consolidates logic around detecting ngNonBindable mode - previously those checks were done in two separate places. By doing the check in one place we can simplify the directive resolution logic. PR Close #60048 --- packages/core/src/render3/instructions/element.ts | 9 ++++----- .../src/render3/instructions/element_container.ts | 12 ++++++------ packages/core/src/render3/instructions/shared.ts | 14 -------------- packages/core/src/render3/instructions/template.ts | 4 ++-- .../bundle.golden_symbols.json | 1 - .../bundling/animations/bundle.golden_symbols.json | 1 - .../cyclic_import/bundle.golden_symbols.json | 1 - .../test/bundling/defer/bundle.golden_symbols.json | 1 - .../forms_reactive/bundle.golden_symbols.json | 1 - .../bundle.golden_symbols.json | 1 - .../bundling/router/bundle.golden_symbols.json | 1 - .../test/bundling/todo/bundle.golden_symbols.json | 1 - 12 files changed, 12 insertions(+), 35 deletions(-) diff --git a/packages/core/src/render3/instructions/element.ts b/packages/core/src/render3/instructions/element.ts index caf36b54ebe7..839342e133a2 100644 --- a/packages/core/src/render3/instructions/element.ts +++ b/packages/core/src/render3/instructions/element.ts @@ -32,11 +32,10 @@ import { createElementNode, setupStaticAttributes, } from '../dom_node_manipulation'; -import {registerPostOrderHooks} from '../hooks'; import {hasClassInput, hasStyleInput, TElementNode, TNode, TNodeType} from '../interfaces/node'; import {Renderer} from '../interfaces/renderer'; import {RElement} from '../interfaces/renderer_dom'; -import {isComponentHost, isContentQueryHost, isDirectiveHost} from '../interfaces/type_checks'; +import {isComponentHost, isDirectiveHost} from '../interfaces/type_checks'; import {HEADER_OFFSET, HYDRATION, LView, RENDERER, TView} from '../interfaces/view'; import {assertTNodeType} from '../node_assert'; import {appendChild} from '../node_manipulation'; @@ -66,7 +65,7 @@ import {elementEndFirstCreatePass, elementStartFirstCreatePass} from '../view/el import {validateElementIsKnown} from './element_validation'; import {setDirectiveInputsWhichShadowsStyling} from './property'; import { - createDirectivesInstancesInInstruction, + createDirectivesInstances, findDirectiveDefMatches, saveResolvedLocalsInData, } from './shared'; @@ -139,13 +138,13 @@ export function ɵɵelementStart( // any immediate children of a component or template container must be pre-emptively // monkey-patched with the component view data so that the element can be inspected // later on using any element discovery utility methods (see `element_discovery.ts`) - if (getElementDepthCount() === 0) { + if (getElementDepthCount() === 0 || hasDirectives) { attachPatchData(native, lView); } increaseElementDepthCount(); if (hasDirectives) { - createDirectivesInstancesInInstruction(tView, lView, tNode); + createDirectivesInstances(tView, lView, tNode); executeContentQueries(tView, tNode, lView); } if (localRefsIndex !== null) { diff --git a/packages/core/src/render3/instructions/element_container.ts b/packages/core/src/render3/instructions/element_container.ts index 443df005e6b5..db43d8a1a5cf 100644 --- a/packages/core/src/render3/instructions/element_container.ts +++ b/packages/core/src/render3/instructions/element_container.ts @@ -17,15 +17,15 @@ import {isDetachedByI18n} from '../../i18n/utils'; import {assertEqual, assertIndexInRange, assertNumber} from '../../util/assert'; import {assertHasParent} from '../assert'; import {attachPatchData} from '../context_discovery'; +import {createCommentNode} from '../dom_node_manipulation'; import {registerPostOrderHooks} from '../hooks'; import {TAttributes, TElementContainerNode, TNode, TNodeType} from '../interfaces/node'; import {RComment} from '../interfaces/renderer_dom'; import {isContentQueryHost, isDirectiveHost} from '../interfaces/type_checks'; import {HEADER_OFFSET, HYDRATION, LView, RENDERER, TView} from '../interfaces/view'; import {assertTNodeType} from '../node_assert'; -import {executeContentQueries} from '../queries/query_execution'; import {appendChild} from '../node_manipulation'; -import {createCommentNode} from '../dom_node_manipulation'; +import {executeContentQueries} from '../queries/query_execution'; import { getBindingIndex, getBindingsEnabled, @@ -43,13 +43,13 @@ import {computeStaticStyling} from '../styling/static_styling'; import {mergeHostAttrs} from '../util/attrs_utils'; import {getConstant} from '../util/view_utils'; +import {getOrCreateTNode} from '../tnode_manipulation'; +import {resolveDirectives} from '../view/directives'; import { - createDirectivesInstancesInInstruction, + createDirectivesInstances, findDirectiveDefMatches, saveResolvedLocalsInData, } from './shared'; -import {getOrCreateTNode} from '../tnode_manipulation'; -import {resolveDirectives} from '../view/directives'; function elementContainerStartFirstCreatePass( index: number, @@ -131,7 +131,7 @@ export function ɵɵelementContainerStart( attachPatchData(comment, lView); if (isDirectiveHost(tNode)) { - createDirectivesInstancesInInstruction(tView, lView, tNode); + createDirectivesInstances(tView, lView, tNode); executeContentQueries(tView, tNode, lView); } diff --git a/packages/core/src/render3/instructions/shared.ts b/packages/core/src/render3/instructions/shared.ts index bc3be21ea458..94fab8057999 100644 --- a/packages/core/src/render3/instructions/shared.ts +++ b/packages/core/src/render3/instructions/shared.ts @@ -75,7 +75,6 @@ import {createComponentLView} from '../view/construction'; import {selectIndexInternal} from './advance'; import {handleUnknownPropertyError, isPropertyValid, matchingSchemas} from './element_validation'; import {writeToDirectiveInput} from './write_to_directive_input'; -import {InputFlags} from '../interfaces/input_flags'; export function executeTemplate( tView: TView, @@ -109,19 +108,6 @@ export function executeTemplate( } } -/** - * Creates directive instances. - */ -export function createDirectivesInstancesInInstruction( - tView: TView, - lView: LView, - tNode: TDirectiveHostNode, -) { - if (!getBindingsEnabled()) return; - attachPatchData(getNativeByTNode(tNode, lView), lView); - createDirectivesInstances(tView, lView, tNode); -} - /** * Creates directive instances. */ diff --git a/packages/core/src/render3/instructions/template.ts b/packages/core/src/render3/instructions/template.ts index 2e2082d6a000..f4f456ea7977 100644 --- a/packages/core/src/render3/instructions/template.ts +++ b/packages/core/src/render3/instructions/template.ts @@ -43,7 +43,7 @@ import {createLContainer} from '../view/container'; import {resolveDirectives} from '../view/directives'; import { - createDirectivesInstancesInInstruction, + createDirectivesInstances, findDirectiveDefMatches, saveResolvedLocalsInData, } from './shared'; @@ -168,7 +168,7 @@ export function declareTemplate( populateDehydratedViewsInLContainer(lContainer, tNode, declarationLView); if (isDirectiveHost(tNode)) { - createDirectivesInstancesInInstruction(declarationTView, declarationLView, tNode); + createDirectivesInstances(declarationTView, declarationLView, tNode); } if (localRefsIndex != null) { diff --git a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json index 3278bee674e3..243a55e88a4f 100644 --- a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json @@ -298,7 +298,6 @@ "forwardRef", "freeConsumers", "generateInitialInputs", - "getBindingsEnabled", "getClosureSafeProperty", "getComponentDef", "getComponentLViewByIndex", diff --git a/packages/core/test/bundling/animations/bundle.golden_symbols.json b/packages/core/test/bundling/animations/bundle.golden_symbols.json index 010c8351028d..8db74d95a2a8 100644 --- a/packages/core/test/bundling/animations/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations/bundle.golden_symbols.json @@ -319,7 +319,6 @@ "forwardRef", "freeConsumers", "generateInitialInputs", - "getBindingsEnabled", "getClosureSafeProperty", "getComponentDef", "getComponentLViewByIndex", diff --git a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json index 0938daf6c0c9..47ffedea999b 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -247,7 +247,6 @@ "forwardRef", "freeConsumers", "generateInitialInputs", - "getBindingsEnabled", "getClosureSafeProperty", "getComponentDef", "getComponentLViewByIndex", diff --git a/packages/core/test/bundling/defer/bundle.golden_symbols.json b/packages/core/test/bundling/defer/bundle.golden_symbols.json index 0f3258d1eb68..22c73b232aac 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -247,7 +247,6 @@ "convertToBitFlags", "createContainerAnchorImpl", "createDirectivesInstances", - "createDirectivesInstancesInInstruction", "createElementNode", "createElementRef", "createEnvironmentInjector", diff --git a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json index 1cd2cf7fa946..a239732a0d37 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -295,7 +295,6 @@ "controlPath", "convertToBitFlags", "createDirectivesInstances", - "createDirectivesInstancesInInstruction", "createElementNode", "createElementRef", "createErrorClass", diff --git a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json index f740eb959b50..0bd72003ebe8 100644 --- a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json @@ -283,7 +283,6 @@ "controlPath", "convertToBitFlags", "createDirectivesInstances", - "createDirectivesInstancesInInstruction", "createElementNode", "createElementRef", "createErrorClass", diff --git a/packages/core/test/bundling/router/bundle.golden_symbols.json b/packages/core/test/bundling/router/bundle.golden_symbols.json index accd406f8f70..0f89ce41367b 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -425,7 +425,6 @@ "generateInitialInputs", "getAllRouteGuards", "getBeforeNodeForView", - "getBindingsEnabled", "getBootstrapListener", "getChildRouteGuards", "getClosestRouteInjector", diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index 59bd110a7e98..5cfb8d3bb652 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -240,7 +240,6 @@ "context", "convertToBitFlags", "createDirectivesInstances", - "createDirectivesInstancesInInstruction", "createElementNode", "createElementRef", "createErrorClass", From aa583392e3652f12676438f75c1e4299b0815005 Mon Sep 17 00:00:00 2001 From: Jessica Janiuk Date: Thu, 20 Feb 2025 17:39:26 -0500 Subject: [PATCH 0116/1000] docs: remove todo from jsdoc (#60042) This removes TODO from a JSDoc block that made it show up on adev. PR Close #60042 --- packages/forms/src/model/abstract_model.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/forms/src/model/abstract_model.ts b/packages/forms/src/model/abstract_model.ts index f5624933c1fd..71521f5fa052 100644 --- a/packages/forms/src/model/abstract_model.ts +++ b/packages/forms/src/model/abstract_model.ts @@ -759,8 +759,6 @@ export abstract class AbstractControl; @@ -770,8 +768,6 @@ export abstract class AbstractControl; @@ -1626,6 +1622,7 @@ export abstract class AbstractControl).valueChanges = new EventEmitter(); (this as Writable).statusChanges = new EventEmitter(); } From 0cac2a22c0b44c36b76d93d513651c162b82bcee Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Wed, 19 Feb 2025 17:47:27 +0100 Subject: [PATCH 0117/1000] refactor(core): rework how inputs/outputs are initialized (#60036) Reworks the functions that create the `initialInputs`, `inputs` and `outputs` structures to initilize them within the function, instead of returning them to be initialized later. This will simplify future refactors where they'll produce more than one piece of information. PR Close #60036 --- packages/core/src/render3/interfaces/node.ts | 2 +- .../core/src/render3/tnode_manipulation.ts | 2 +- packages/core/src/render3/view/directives.ts | 117 ++++++------------ .../bundle.golden_symbols.json | 4 +- .../animations/bundle.golden_symbols.json | 4 +- .../cyclic_import/bundle.golden_symbols.json | 4 +- .../bundling/defer/bundle.golden_symbols.json | 4 +- .../forms_reactive/bundle.golden_symbols.json | 4 +- .../bundle.golden_symbols.json | 4 +- .../hello_world/bundle.golden_symbols.json | 5 +- .../hydration/bundle.golden_symbols.json | 5 +- .../router/bundle.golden_symbols.json | 4 +- .../bundle.golden_symbols.json | 5 +- .../bundling/todo/bundle.golden_symbols.json | 4 +- 14 files changed, 61 insertions(+), 107 deletions(-) diff --git a/packages/core/src/render3/interfaces/node.ts b/packages/core/src/render3/interfaces/node.ts index ccdf62315adb..3ba07b832385 100644 --- a/packages/core/src/render3/interfaces/node.ts +++ b/packages/core/src/render3/interfaces/node.ts @@ -417,7 +417,7 @@ export interface TNode { localNames: (string | number)[] | null; /** Information about input properties that need to be set once from attribute data. */ - initialInputs: InitialInputData | null | undefined; + initialInputs: InitialInputData | null; /** * Input data for all directives on this node. `null` means that there are no directives with diff --git a/packages/core/src/render3/tnode_manipulation.ts b/packages/core/src/render3/tnode_manipulation.ts index e1b5886bb0ac..67c496904df0 100644 --- a/packages/core/src/render3/tnode_manipulation.ts +++ b/packages/core/src/render3/tnode_manipulation.ts @@ -291,7 +291,7 @@ export function createTNode( attrs: attrs, mergedAttrs: null, localNames: null, - initialInputs: undefined, + initialInputs: null, inputs: null, outputs: null, tView: null, diff --git a/packages/core/src/render3/view/directives.ts b/packages/core/src/render3/view/directives.ts index d126782d8ead..53b1d5950041 100644 --- a/packages/core/src/render3/view/directives.ts +++ b/packages/core/src/render3/view/directives.ts @@ -28,11 +28,9 @@ import type { } from '../interfaces/definition'; import {NodeInjectorFactory} from '../interfaces/injector'; import { - InitialInputData, InitialInputs, NodeInputBindings, NodeOutputBindings, - TAttributes, TNodeFlags, type TContainerNode, type TElementContainerNode, @@ -45,7 +43,6 @@ import {isInlineTemplate} from '../node_selector_matcher'; import {NO_CHANGE} from '../tokens'; import {mergeHostAttrs} from '../util/attrs_utils'; import {allocExpando} from './construction'; -import {InputFlags} from '../interfaces/input_flags'; export type DirectiveMatcherStrategy = ( tView: TView, @@ -161,7 +158,7 @@ function markAsComponentHost(tView: TView, hostTNode: TNode, componentOffset: nu } /** Initializes the data structures necessary for a list of directives to be instantiated. */ -export function initializeDirectives( +function initializeDirectives( tView: TView, lView: LView, tNode: TElementNode | TContainerNode | TElementContainerNode, @@ -252,11 +249,6 @@ function initializeInputAndOutputAliases( const end = tNode.directiveEnd; const tViewData = tView.data; - const tNodeAttrs = tNode.attrs; - const inputsFromAttrs: InitialInputData = []; - let inputsStore: NodeInputBindings | null = null; - let outputsStore: NodeOutputBindings | null = null; - for (let directiveIndex = start; directiveIndex < end; directiveIndex++) { const directiveDef = tViewData[directiveIndex] as DirectiveDef; const aliasData = hostDirectiveDefinitionMap @@ -265,41 +257,33 @@ function initializeInputAndOutputAliases( const aliasedInputs = aliasData ? aliasData.inputs : null; const aliasedOutputs = aliasData ? aliasData.outputs : null; - inputsStore = captureNodeBindings( + setupBindings( CaptureNodeBindingMode.Inputs, - directiveDef.inputs, + tNode, + directiveDef, directiveIndex, - inputsStore, aliasedInputs, ); - outputsStore = captureNodeBindings( + setupBindings( CaptureNodeBindingMode.Outputs, - directiveDef.outputs, + tNode, + directiveDef, directiveIndex, - outputsStore, aliasedOutputs, ); // Do not use unbound attributes as inputs to structural directives, since structural // directive inputs can only be set using microsyntax (e.g. `
`). - const initialInputs = - inputsStore !== null && tNodeAttrs !== null && !isInlineTemplate(tNode) - ? generateInitialInputs(inputsStore, directiveIndex, tNodeAttrs) - : null; - inputsFromAttrs.push(initialInputs); + setupInitialInputs(tNode, directiveIndex); } - if (inputsStore !== null) { - if (inputsStore.hasOwnProperty('class')) { + if (tNode.inputs !== null) { + if (tNode.inputs.hasOwnProperty('class')) { tNode.flags |= TNodeFlags.hasClassInput; } - if (inputsStore.hasOwnProperty('style')) { + if (tNode.inputs.hasOwnProperty('style')) { tNode.flags |= TNodeFlags.hasStyleInput; } } - - tNode.initialInputs = inputsFromAttrs; - tNode.inputs = inputsStore; - tNode.outputs = outputsStore; } /** Mode for capturing node bindings. */ @@ -309,43 +293,22 @@ const enum CaptureNodeBindingMode { } /** - * Captures node input bindings for the given directive based on the inputs metadata. - * This will be called multiple times to combine inputs from various directives on a node. - * - * The host binding alias map is used to alias and filter out properties for host directives. - * If the mapping is provided, it'll act as an allowlist, as well as a mapping of what public - * name inputs/outputs should be exposed under. - */ -function captureNodeBindings( - mode: CaptureNodeBindingMode.Inputs, - inputs: DirectiveDef['inputs'], - directiveIndex: number, - bindingsResult: NodeInputBindings | null, - hostDirectiveAliasMap: HostDirectiveBindingMap | null, -): NodeInputBindings | null; -/** - * Captures node output bindings for the given directive based on the output metadata. - * This will be called multiple times to combine inputs from various directives on a node. + * Sets up input/input bindings on a node for the given directive based on the definition metadata. + * This will be called multiple times to combine bindings from various directives on a node. * * The host binding alias map is used to alias and filter out properties for host directives. * If the mapping is provided, it'll act as an allowlist, as well as a mapping of what public * name inputs/outputs should be exposed under. */ -function captureNodeBindings( - mode: CaptureNodeBindingMode.Outputs, - outputs: DirectiveDef['outputs'], - directiveIndex: number, - bindingsResult: NodeOutputBindings | null, - hostDirectiveAliasMap: HostDirectiveBindingMap | null, -): NodeOutputBindings | null; - -function captureNodeBindings( +function setupBindings( mode: CaptureNodeBindingMode, - aliasMap: DirectiveDef['inputs'] | DirectiveDef['outputs'], + tNode: TNode, + def: DirectiveDef, directiveIndex: number, - bindingsResult: NodeInputBindings | NodeOutputBindings | null, hostDirectiveAliasMap: HostDirectiveBindingMap | null, -): NodeInputBindings | NodeOutputBindings | null { +): void { + const aliasMap = mode === CaptureNodeBindingMode.Inputs ? def.inputs : def.outputs; + for (let publicName in aliasMap) { if (!aliasMap.hasOwnProperty(publicName)) { continue; @@ -356,8 +319,6 @@ function captureNodeBindings( continue; } - bindingsResult ??= {}; - // If there are no host directive mappings, we want to remap using the alias map from the // definition itself. If there is an alias map, it has two functions: // 1. It serves as an allowlist of bindings that are exposed by the host directives. Only the @@ -375,22 +336,13 @@ function captureNodeBindings( } if (mode === CaptureNodeBindingMode.Inputs) { - addPropertyBinding( - bindingsResult as NodeInputBindings, - directiveIndex, - finalPublicName, - publicName, - ); + tNode.inputs ??= {}; + addPropertyBinding(tNode.inputs, directiveIndex, finalPublicName, publicName); } else { - addPropertyBinding( - bindingsResult as NodeOutputBindings, - directiveIndex, - finalPublicName, - value as string, - ); + tNode.outputs ??= {}; + addPropertyBinding(tNode.outputs, directiveIndex, finalPublicName, value as string); } } - return bindingsResult; } function addPropertyBinding( @@ -407,7 +359,7 @@ function addPropertyBinding( } /** - * Generates initialInputData for a node and stores it in the template's static storage + * Sets up the initialInputData for a node and stores it in the template's static storage * so subsequent template invocations don't have to recalculate it. * * initialInputData is an array containing values that need to be set as input properties @@ -417,15 +369,18 @@ function addPropertyBinding( * * * - * @param inputs Input alias map that was generated from the directive def inputs. + * @param tNode TNode on which to set up the initial inputs. * @param directiveIndex Index of the directive that is currently being processed. - * @param attrs Static attrs on this node. */ -function generateInitialInputs( - inputs: NodeInputBindings, - directiveIndex: number, - attrs: TAttributes, -): InitialInputs | null { +function setupInitialInputs(tNode: TNode, directiveIndex: number): void { + const {attrs, inputs} = tNode; + + if (attrs === null || inputs === null || isInlineTemplate(tNode)) { + tNode.initialInputs ??= []; + tNode.initialInputs.push(null); + return; + } + let inputsToStore: InitialInputs | null = null; let i = 0; while (i < attrs.length) { @@ -460,7 +415,9 @@ function generateInitialInputs( i += 2; } - return inputsToStore; + + tNode.initialInputs ??= []; + tNode.initialInputs.push(inputsToStore); } /** diff --git a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json index 243a55e88a4f..aa976739ff6f 100644 --- a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json @@ -227,7 +227,6 @@ "callHook", "callHookInternal", "callHooks", - "captureNodeBindings", "checkStable", "classIndexOf", "cleanUpView", @@ -297,7 +296,6 @@ "forEachSingleProvider", "forwardRef", "freeConsumers", - "generateInitialInputs", "getClosureSafeProperty", "getComponentDef", "getComponentLViewByIndex", @@ -467,6 +465,8 @@ "setIsRefreshingViews", "setSelectedIndex", "setStyles", + "setupBindings", + "setupInitialInputs", "setupStaticAttributes", "shimStylesContent", "shouldSearchParent", diff --git a/packages/core/test/bundling/animations/bundle.golden_symbols.json b/packages/core/test/bundling/animations/bundle.golden_symbols.json index 8db74d95a2a8..d8a9786ff678 100644 --- a/packages/core/test/bundling/animations/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations/bundle.golden_symbols.json @@ -246,7 +246,6 @@ "callHook", "callHookInternal", "callHooks", - "captureNodeBindings", "checkStable", "classIndexOf", "cleanUpView", @@ -318,7 +317,6 @@ "forEachSingleProvider", "forwardRef", "freeConsumers", - "generateInitialInputs", "getClosureSafeProperty", "getComponentDef", "getComponentLViewByIndex", @@ -493,6 +491,8 @@ "setIsRefreshingViews", "setSelectedIndex", "setStyles", + "setupBindings", + "setupInitialInputs", "setupStaticAttributes", "shimStylesContent", "shouldSearchParent", diff --git a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json index 47ffedea999b..57504b6f49d1 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -186,7 +186,6 @@ "callHook", "callHookInternal", "callHooks", - "captureNodeBindings", "checkStable", "classIndexOf", "cleanUpView", @@ -246,7 +245,6 @@ "forEachSingleProvider", "forwardRef", "freeConsumers", - "generateInitialInputs", "getClosureSafeProperty", "getComponentDef", "getComponentLViewByIndex", @@ -400,6 +398,8 @@ "setInputsFromAttrs", "setIsRefreshingViews", "setSelectedIndex", + "setupBindings", + "setupInitialInputs", "setupStaticAttributes", "shimStylesContent", "shouldSearchParent", diff --git a/packages/core/test/bundling/defer/bundle.golden_symbols.json b/packages/core/test/bundling/defer/bundle.golden_symbols.json index 22c73b232aac..d71297c2cc05 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -229,7 +229,6 @@ "callHook", "callHookInternal", "callHooks", - "captureNodeBindings", "checkStable", "classIndexOf", "cleanUpView", @@ -295,7 +294,6 @@ "forEachSingleProvider", "forwardRef", "freeConsumers", - "generateInitialInputs", "getBeforeNodeForView", "getBindingsEnabled", "getCleanupFnKeyByType", @@ -866,6 +864,8 @@ "setInputsFromAttrs", "setIsRefreshingViews", "setSelectedIndex", + "setupBindings", + "setupInitialInputs", "setupStaticAttributes", "shimStylesContent", "shouldAttachRegularTrigger", diff --git a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json index a239732a0d37..868a826b4b76 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -265,7 +265,6 @@ "callHook", "callHookInternal", "callHooks", - "captureNodeBindings", "checkStable", "classIndexOf", "cleanUpControl", @@ -357,7 +356,6 @@ "forwardRef", "freeConsumers", "fromAsyncIterable", - "generateInitialInputs", "getBeforeNodeForView", "getBindingsEnabled", "getClosureSafeProperty", @@ -600,6 +598,8 @@ "setTStylingRangePrevDuplicate", "setUpControl", "setUpValidators", + "setupBindings", + "setupInitialInputs", "setupStaticAttributes", "shimStylesContent", "shouldAddViewToDom", diff --git a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json index 0bd72003ebe8..ca70bc407399 100644 --- a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json @@ -258,7 +258,6 @@ "callHook", "callHookInternal", "callHooks", - "captureNodeBindings", "checkStable", "classIndexOf", "cleanUpView", @@ -345,7 +344,6 @@ "forwardRef", "freeConsumers", "fromAsyncIterable", - "generateInitialInputs", "getBeforeNodeForView", "getBindingsEnabled", "getClosureSafeProperty", @@ -593,6 +591,8 @@ "setTStylingRangePrevDuplicate", "setUpControl", "setUpValidators", + "setupBindings", + "setupInitialInputs", "setupStaticAttributes", "shimStylesContent", "shouldAddViewToDom", diff --git a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json index 4953bf3df1d9..79ef1dd1598f 100644 --- a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json @@ -143,7 +143,6 @@ "callHook", "callHookInternal", "callHooks", - "captureNodeBindings", "checkStable", "cleanUpView", "collectNativeNodes", @@ -192,7 +191,6 @@ "forEachSingleProvider", "forwardRef", "freeConsumers", - "generateInitialInputs", "getClosureSafeProperty", "getComponentDef", "getComponentLViewByIndex", @@ -256,7 +254,6 @@ "isDetachedByI18n", "isEnvironmentProviders", "isFunction", - "isInlineTemplate", "isLContainer", "isLView", "isPositive", @@ -323,6 +320,8 @@ "setInputsFromAttrs", "setIsRefreshingViews", "setSelectedIndex", + "setupBindings", + "setupInitialInputs", "shouldSearchParent", "storeLViewOnDestroy", "stringify", diff --git a/packages/core/test/bundling/hydration/bundle.golden_symbols.json b/packages/core/test/bundling/hydration/bundle.golden_symbols.json index 6eb935e5d63d..c5edbd0c811a 100644 --- a/packages/core/test/bundling/hydration/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hydration/bundle.golden_symbols.json @@ -192,7 +192,6 @@ "callHook", "callHookInternal", "callHooks", - "captureNodeBindings", "checkStable", "cleanUpView", "cleanupDehydratedIcuData", @@ -253,7 +252,6 @@ "forwardRef", "freeConsumers", "fromAsyncIterable", - "generateInitialInputs", "getClosureSafeProperty", "getComponentDef", "getComponentLViewByIndex", @@ -335,7 +333,6 @@ "isFunction", "isHydrationSupportEnabled", "isInSkipHydrationBlock", - "isInlineTemplate", "isInteropObservable", "isIterable", "isLContainer", @@ -431,6 +428,8 @@ "setIsRefreshingViews", "setSegmentHead", "setSelectedIndex", + "setupBindings", + "setupInitialInputs", "shimStylesContent", "shouldSearchParent", "siblingAfter", diff --git a/packages/core/test/bundling/router/bundle.golden_symbols.json b/packages/core/test/bundling/router/bundle.golden_symbols.json index 0f89ce41367b..e481362171ae 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -306,7 +306,6 @@ "callHook", "callHookInternal", "callHooks", - "captureNodeBindings", "catchError", "checkStable", "classIndexOf", @@ -422,7 +421,6 @@ "freeConsumers", "from", "fromAsyncIterable", - "generateInitialInputs", "getAllRouteGuards", "getBeforeNodeForView", "getBootstrapListener", @@ -678,6 +676,8 @@ "setIsRefreshingViews", "setRouterState", "setSelectedIndex", + "setupBindings", + "setupInitialInputs", "setupStaticAttributes", "shallowEqual", "shimStylesContent", diff --git a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json index 8e83a787b862..01a404213c2e 100644 --- a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json +++ b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json @@ -169,7 +169,6 @@ "callHook", "callHookInternal", "callHooks", - "captureNodeBindings", "checkStable", "cleanUpView", "collectNativeNodes", @@ -220,7 +219,6 @@ "forEachSingleProvider", "forwardRef", "freeConsumers", - "generateInitialInputs", "getClosureSafeProperty", "getComponentDef", "getComponentLViewByIndex", @@ -285,7 +283,6 @@ "isDetachedByI18n", "isEnvironmentProviders", "isFunction", - "isInlineTemplate", "isLContainer", "isLView", "isPlatformServer", @@ -359,6 +356,8 @@ "setInputsFromAttrs", "setIsRefreshingViews", "setSelectedIndex", + "setupBindings", + "setupInitialInputs", "shimStylesContent", "shouldSearchParent", "storeLViewOnDestroy", diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index 5cfb8d3bb652..ba1bcc3893f1 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -221,7 +221,6 @@ "callHook", "callHookInternal", "callHooks", - "captureNodeBindings", "checkStable", "classIndexOf", "cleanUpView", @@ -289,7 +288,6 @@ "forEachSingleProvider", "forwardRef", "freeConsumers", - "generateInitialInputs", "getBeforeNodeForView", "getBindingsEnabled", "getClosureSafeProperty", @@ -479,6 +477,8 @@ "setTStylingRangeNext", "setTStylingRangeNextDuplicate", "setTStylingRangePrevDuplicate", + "setupBindings", + "setupInitialInputs", "setupStaticAttributes", "shimStylesContent", "shouldAddViewToDom", From 9f44b410534284efc116d16882342a6a934c1286 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Thu, 20 Feb 2025 16:58:51 +0100 Subject: [PATCH 0118/1000] refactor(core): separate host directive inputs from selector-matched ones (#60036) Currently `TNode.inputs`/`TNode.outputs` store all of the available bindings on that node, no matter if they came from a directive that the user applied directly or from a host directive. This has a couple of drawbacks: 1. We need to store more information that necessary. For example, the only reason we have strings in the arrays is to facilitate host directive aliasing. 2. It doesn't allow us to distinguish which host directives belong to which selector-matched directives. These changes are a step towards resolving both issues by storing the host directive binding information in separate data structures. PR Close #60036 --- packages/core/src/render3/component_ref.ts | 53 ++--- .../core/src/render3/instructions/listener.ts | 66 ++++-- .../core/src/render3/instructions/property.ts | 4 +- .../core/src/render3/instructions/shared.ts | 90 +++++--- packages/core/src/render3/interfaces/node.ts | 30 +++ .../core/src/render3/tnode_manipulation.ts | 2 + packages/core/src/render3/view/directives.ts | 197 +++++++++--------- .../bundle.golden_symbols.json | 5 +- .../animations/bundle.golden_symbols.json | 5 +- .../cyclic_import/bundle.golden_symbols.json | 5 +- .../bundling/defer/bundle.golden_symbols.json | 5 +- .../forms_reactive/bundle.golden_symbols.json | 6 +- .../bundle.golden_symbols.json | 6 +- .../hello_world/bundle.golden_symbols.json | 5 +- .../hydration/bundle.golden_symbols.json | 5 +- .../router/bundle.golden_symbols.json | 6 +- .../bundle.golden_symbols.json | 5 +- .../bundling/todo/bundle.golden_symbols.json | 6 +- packages/core/test/render3/is_shape_of.ts | 2 + 19 files changed, 304 insertions(+), 199 deletions(-) diff --git a/packages/core/src/render3/component_ref.ts b/packages/core/src/render3/component_ref.ts index 88bcd36dcc48..86157b1d682d 100644 --- a/packages/core/src/render3/component_ref.ts +++ b/packages/core/src/render3/component_ref.ts @@ -42,13 +42,7 @@ import { } from './instructions/shared'; import {ComponentDef, DirectiveDef} from './interfaces/definition'; import {InputFlags} from './interfaces/input_flags'; -import { - NodeInputBindings, - TContainerNode, - TElementContainerNode, - TElementNode, - TNode, -} from './interfaces/node'; +import {TContainerNode, TElementContainerNode, TElementNode, TNode} from './interfaces/node'; import {RElement, RNode} from './interfaces/renderer_dom'; import { CONTEXT, @@ -386,31 +380,28 @@ export class ComponentRef extends AbstractComponentRef { } override setInput(name: string, value: unknown): void { - const inputData = this._tNode.inputs; - let dataValue: NodeInputBindings[typeof name] | undefined; - if (inputData !== null && (dataValue = inputData[name])) { - this.previousInputValues ??= new Map(); - // Do not set the input if it is the same as the last value - // This behavior matches `bindingUpdated` when binding inputs in templates. - if ( - this.previousInputValues.has(name) && - Object.is(this.previousInputValues.get(name), value) - ) { - return; - } + const tNode = this._tNode; + this.previousInputValues ??= new Map(); + // Do not set the input if it is the same as the last value + // This behavior matches `bindingUpdated` when binding inputs in templates. + if ( + this.previousInputValues.has(name) && + Object.is(this.previousInputValues.get(name), value) + ) { + return; + } - const lView = this._rootLView; - setInputsForProperty(lView[TVIEW], lView, dataValue, name, value); - this.previousInputValues.set(name, value); - const childComponentLView = getComponentLViewByIndex(this._tNode.index, lView); - markViewDirty(childComponentLView, NotificationSource.SetInput); - } else { - if (ngDevMode) { - const cmpNameForError = stringifyForError(this.componentType); - let message = `Can't set value of the '${name}' input on the '${cmpNameForError}' component. `; - message += `Make sure that the '${name}' property is annotated with @Input() or a mapped @Input('${name}') exists.`; - reportUnknownPropertyError(message); - } + const lView = this._rootLView; + const hasSetInput = setInputsForProperty(tNode, lView[TVIEW], lView, name, value); + this.previousInputValues.set(name, value); + const childComponentLView = getComponentLViewByIndex(tNode.index, lView); + markViewDirty(childComponentLView, NotificationSource.SetInput); + + if (ngDevMode && !hasSetInput) { + const cmpNameForError = stringifyForError(this.componentType); + let message = `Can't set value of the '${name}' input on the '${cmpNameForError}' component. `; + message += `Make sure that the '${name}' property is annotated with @Input() or a mapped @Input('${name}') exists.`; + reportUnknownPropertyError(message); } } diff --git a/packages/core/src/render3/instructions/listener.ts b/packages/core/src/render3/instructions/listener.ts index d54c4e511ce8..e88980629236 100644 --- a/packages/core/src/render3/instructions/listener.ts +++ b/packages/core/src/render3/instructions/listener.ts @@ -29,6 +29,7 @@ import { import {markViewDirty} from './mark_view_dirty'; import {handleError, loadComponentRenderer} from './shared'; +import {DirectiveDef} from '../interfaces/definition'; /** * Contains a reference to a function that disables event replay feature @@ -159,7 +160,7 @@ export function listenerInternal( ): void { const isTNodeDirectiveHost = isDirectiveHost(tNode); const firstCreatePass = tView.firstCreatePass; - const tCleanup: false | any[] = firstCreatePass && getOrCreateTViewCleanup(tView); + const tCleanup = firstCreatePass ? getOrCreateTViewCleanup(tView) : null; const context = lView[CONTEXT]; // When the ɵɵlistener instruction was generated and is executed we know that there is either a @@ -230,34 +231,55 @@ export function listenerInternal( listenerFn = wrapListener(tNode, lView, context, listenerFn); } - // subscribe to directive outputs - const outputs = tNode.outputs; - let props: NodeOutputBindings[keyof NodeOutputBindings] | undefined; - if (processOutputs && outputs !== null && (props = outputs[eventName])) { - const propsLength = props.length; - if (propsLength) { - for (let i = 0; i < propsLength; i += 2) { - const index = props[i] as number; - ngDevMode && assertIndexInRange(lView, index); - const minifiedName = props[i + 1]; - const directiveInstance = lView[index]; - const output = directiveInstance[minifiedName]; + if (processOutputs) { + const outputConfig = tNode.outputs?.[eventName]; + const hostDirectiveOutputConfig = tNode.hostDirectiveOutputs?.[eventName]; - if (ngDevMode && !isOutputSubscribable(output)) { - throw new Error( - `@Output ${minifiedName} not initialized in '${directiveInstance.constructor.name}'.`, - ); - } + if (hostDirectiveOutputConfig && hostDirectiveOutputConfig.length) { + for (let i = 0; i < hostDirectiveOutputConfig.length; i += 2) { + const index = hostDirectiveOutputConfig[i] as number; + ngDevMode && assertIndexInRange(lView, index); + const instance = lView[index]; + const lookupName = hostDirectiveOutputConfig[i + 1] as string; + const def = tView.data[index] as DirectiveDef; + const minifiedName = def.outputs[lookupName]; + listenToOutput(tNode, instance, eventName, minifiedName, listenerFn, lCleanup, tCleanup); + } + } - const subscription = (output as SubscribableOutput).subscribe(listenerFn); - const idx = lCleanup.length; - lCleanup.push(listenerFn, subscription); - tCleanup && tCleanup.push(eventName, tNode.index, idx, -(idx + 1)); + if (outputConfig && outputConfig.length) { + for (let i = 0; i < outputConfig.length; i += 2) { + const index = outputConfig[i] as number; + ngDevMode && assertIndexInRange(lView, index); + const instance = lView[index]; + const minifiedName = outputConfig[i + 1] as string; + listenToOutput(tNode, instance, eventName, minifiedName, listenerFn, lCleanup, tCleanup); } } } } +function listenToOutput( + tNode: TNode, + instance: any, + eventName: string, + propertyName: string, + listenerFn: (e?: any) => any, + lCleanup: any[], + tCleanup: any[] | null, +) { + const output = instance[propertyName]; + + if (ngDevMode && !isOutputSubscribable(output)) { + throw new Error(`@Output ${propertyName} not initialized in '${instance.constructor.name}'.`); + } + + const subscription = (output as SubscribableOutput).subscribe(listenerFn); + const idx = lCleanup.length; + lCleanup.push(listenerFn, subscription); + tCleanup && tCleanup.push(eventName, tNode.index, idx, -(idx + 1)); +} + function executeListenerWithErrorHandling( lView: LView, context: {} | null, diff --git a/packages/core/src/render3/instructions/property.ts b/packages/core/src/render3/instructions/property.ts index b8280968ec19..70c6f65fdee6 100644 --- a/packages/core/src/render3/instructions/property.ts +++ b/packages/core/src/render3/instructions/property.ts @@ -71,8 +71,6 @@ export function setDirectiveInputsWhichShadowsStyling( value: any, isClassBased: boolean, ) { - const inputs = tNode.inputs!; - const property = isClassBased ? 'class' : 'style'; // We support both 'class' and `className` hence the fallback. - setInputsForProperty(tView, lView, inputs[property], property, value); + setInputsForProperty(tNode, tView, lView, isClassBased ? 'class' : 'style', value); } diff --git a/packages/core/src/render3/instructions/shared.ts b/packages/core/src/render3/instructions/shared.ts index 94fab8057999..4a0efa4efeea 100644 --- a/packages/core/src/render3/instructions/shared.ts +++ b/packages/core/src/render3/instructions/shared.ts @@ -249,15 +249,18 @@ export function elementPropertyInternal( nativeOnly: boolean, ): void { ngDevMode && assertNotSame(value, NO_CHANGE as any, 'Incoming value should never be NO_CHANGE.'); - let inputData = tNode.inputs; - let dataValue: NodeInputBindings[typeof propName] | undefined; - if (!nativeOnly && inputData != null && (dataValue = inputData[propName])) { - setInputsForProperty(tView, lView, dataValue, propName, value); - if (isComponentHost(tNode)) markDirtyIfOnPush(lView, tNode.index); - if (ngDevMode) { - setNgReflectProperties(lView, tView, tNode, dataValue, value); + + if (!nativeOnly) { + const hasSetInput = setInputsForProperty(tNode, tView, lView, propName, value); + + if (hasSetInput) { + isComponentHost(tNode) && markDirtyIfOnPush(lView, tNode.index); + ngDevMode && setNgReflectProperties(lView, tView, tNode, propName, value); + return; // Stop propcessing if we've matched at least one input. } - } else if (tNode.type & TNodeType.AnyRNode) { + } + + if (tNode.type & TNodeType.AnyRNode) { const element = getNativeByTNode(tNode, lView) as RElement | RComment; propName = mapPropName(propName); @@ -310,15 +313,33 @@ function setNgReflectProperty(lView: LView, tNode: TNode, attrName: string, valu } } -export function setNgReflectProperties( +function setNgReflectProperties( lView: LView, tView: TView, tNode: TNode, - inputConfig: NodeInputBindings[string], + publicName: string, value: any, ) { - if (tNode.type & (TNodeType.AnyRNode | TNodeType.Container)) { - // Note: we set the private name of the input as the reflected property, not the public one. + if (!(tNode.type & (TNodeType.AnyRNode | TNodeType.Container))) { + return; + } + + // TODO: this is identical to the block below, but will diverge in a future refactor. + // Figure out if we still can't consolidate them somehow. + const inputConfig = tNode.inputs?.[publicName]; + const hostInputConfig = tNode.hostDirectiveInputs?.[publicName]; + + if (hostInputConfig) { + for (let i = 0; i < hostInputConfig.length; i += 2) { + const index = hostInputConfig[i] as number; + const publicName = hostInputConfig[i + 1] as string; + const def = tView.data[index] as DirectiveDef; + setNgReflectProperty(lView, tNode, def.inputs[publicName][0], value); + } + } + + // Note: we set the private name of the input as the reflected property, not the public one. + if (inputConfig) { for (let i = 0; i < inputConfig.length; i += 2) { const index = inputConfig[i] as number; const lookupName = inputConfig[i + 1] as string; @@ -555,7 +576,7 @@ export function storePropertyBindingMetadata( // Since we don't have a concept of the "first update pass" we need to check for presence of the // binding meta-data to decide if one should be stored (or if was stored already). if (tData[bindingIndex] === null) { - if (tNode.inputs == null || !tNode.inputs[propertyName]) { + if (!tNode.inputs?.[propertyName] && !tNode.hostDirectiveInputs?.[propertyName]) { const propBindingIdxs = tNode.propertyBindings || (tNode.propertyBindings = []); propBindingIdxs.push(bindingIndex); let bindingMetadata = propertyName; @@ -599,25 +620,46 @@ export function handleError(lView: LView, error: any): void { /** * Set the inputs of directives at the current node to corresponding value. * + * @param tNode TNode on which the input is being set. * @param tView The current TView * @param lView the `LView` which contains the directives. - * @param inputs mapping between the public "input" name and privately-known, - * possibly minified, property names to write to. * @param value Value to set. */ export function setInputsForProperty( + tNode: TNode, tView: TView, lView: LView, - inputs: NodeInputBindings[typeof publicName], publicName: string, value: unknown, -): void { - for (let i = 0; i < inputs.length; i += 2) { - const index = inputs[i] as number; - ngDevMode && assertIndexInRange(lView, index); - const privateName = inputs[i + 1] as string; - const instance = lView[index]; - const def = tView.data[index] as DirectiveDef; - writeToDirectiveInput(def, instance, privateName, value); +): boolean { + const inputs = tNode.inputs?.[publicName]; + const hostDirectiveInputs = tNode.hostDirectiveInputs?.[publicName]; + let hasMatch = false; + + // TODO: this is identical to the block below, but will diverge in a future refactor. + // Figure out if we still can't consolidate them somehow. + if (hostDirectiveInputs) { + for (let i = 0; i < hostDirectiveInputs.length; i += 2) { + const index = hostDirectiveInputs[i] as number; + ngDevMode && assertIndexInRange(lView, index); + const publicName = hostDirectiveInputs[i + 1] as string; + const def = tView.data[index] as DirectiveDef; + writeToDirectiveInput(def, lView[index], publicName, value); + hasMatch = true; + } } + + if (inputs) { + for (let i = 0; i < inputs.length; i += 2) { + const index = inputs[i] as number; + ngDevMode && assertIndexInRange(lView, index); + const privateName = inputs[i + 1] as string; + const instance = lView[index]; + const def = tView.data[index] as DirectiveDef; + writeToDirectiveInput(def, instance, privateName, value); + hasMatch = true; + } + } + + return hasMatch; } diff --git a/packages/core/src/render3/interfaces/node.ts b/packages/core/src/render3/interfaces/node.ts index 3ba07b832385..ff931c60270e 100644 --- a/packages/core/src/render3/interfaces/node.ts +++ b/packages/core/src/render3/interfaces/node.ts @@ -425,12 +425,22 @@ export interface TNode { */ inputs: NodeInputBindings | null; + /** + * Input data for host directives applied to the node. + */ + hostDirectiveInputs: HostDirectiveInputs | null; + /** * Output data for all directives on this node. `null` means that there are no directives with * outputs on this node. */ outputs: NodeOutputBindings | null; + /** + * Input data for host directives applied to the node. + */ + hostDirectiveOutputs: HostDirectiveOutputs | null; + /** * The TView attached to this node. * @@ -835,6 +845,26 @@ export type InitialInputData = (InitialInputs | null)[]; */ export type InitialInputs = string[]; +/** + * Represents inputs coming from a host directive and exposed on a TNode. + * + * - The key is the public name of an input as it is exposed on the specific node. + * - The value is an array where: + * - i+0: Index of the host directive that should be written to. + * - i+1: Public name of the input as it was defined on the host directive before aliasing. + */ +export type HostDirectiveInputs = Record; + +/** + * Represents outputs coming from a host directive and exposed on a TNode. + * + * - The key is the public name of an output as it is exposed on the specific node. + * - The value is an array where: + * - i+0: Index of the host directive on which the output is defined.. + * - i+1: Public name of the output as it was defined on the host directive before aliasing. + */ +export type HostDirectiveOutputs = Record; + /** * Type representing a set of TNodes that can have local refs (`#foo`) placed on them. */ diff --git a/packages/core/src/render3/tnode_manipulation.ts b/packages/core/src/render3/tnode_manipulation.ts index 67c496904df0..7ed185f053d7 100644 --- a/packages/core/src/render3/tnode_manipulation.ts +++ b/packages/core/src/render3/tnode_manipulation.ts @@ -293,7 +293,9 @@ export function createTNode( localNames: null, initialInputs: null, inputs: null, + hostDirectiveInputs: null, outputs: null, + hostDirectiveOutputs: null, tView: null, next: null, prev: null, diff --git a/packages/core/src/render3/view/directives.ts b/packages/core/src/render3/view/directives.ts index 53b1d5950041..332ca15bfb83 100644 --- a/packages/core/src/render3/view/directives.ts +++ b/packages/core/src/render3/view/directives.ts @@ -23,11 +23,13 @@ import {AttributeMarker} from '../interfaces/attribute_marker'; import type { ComponentDef, DirectiveDef, - HostDirectiveBindingMap, + HostDirectiveDef, HostDirectiveDefs, } from '../interfaces/definition'; import {NodeInjectorFactory} from '../interfaces/injector'; import { + HostDirectiveInputs, + HostDirectiveOutputs, InitialInputs, NodeInputBindings, NodeOutputBindings, @@ -72,6 +74,7 @@ export function resolveDirectives( tNode, matchedDirectiveDefs, ); + initializeDirectives(tView, lView, tNode, directiveDefs, exportsMap, hostDirectiveDefs); } if (exportsMap !== null && localRefs !== null) { @@ -241,120 +244,104 @@ function initializeDirectives( function initializeInputAndOutputAliases( tView: TView, tNode: TNode, - hostDirectiveDefinitionMap: HostDirectiveDefs | null, + hostDirectiveDefs: HostDirectiveDefs | null, ): void { ngDevMode && assertFirstCreatePass(tView); - const start = tNode.directiveStart; - const end = tNode.directiveEnd; - const tViewData = tView.data; - - for (let directiveIndex = start; directiveIndex < end; directiveIndex++) { - const directiveDef = tViewData[directiveIndex] as DirectiveDef; - const aliasData = hostDirectiveDefinitionMap - ? hostDirectiveDefinitionMap.get(directiveDef) - : null; - const aliasedInputs = aliasData ? aliasData.inputs : null; - const aliasedOutputs = aliasData ? aliasData.outputs : null; - - setupBindings( - CaptureNodeBindingMode.Inputs, - tNode, - directiveDef, - directiveIndex, - aliasedInputs, - ); - setupBindings( - CaptureNodeBindingMode.Outputs, - tNode, - directiveDef, - directiveIndex, - aliasedOutputs, - ); - // Do not use unbound attributes as inputs to structural directives, since structural - // directive inputs can only be set using microsyntax (e.g. `
`). - setupInitialInputs(tNode, directiveIndex); - } + for (let index = tNode.directiveStart; index < tNode.directiveEnd; index++) { + const directiveDef = tView.data[index] as DirectiveDef; - if (tNode.inputs !== null) { - if (tNode.inputs.hasOwnProperty('class')) { - tNode.flags |= TNodeFlags.hasClassInput; - } - if (tNode.inputs.hasOwnProperty('style')) { - tNode.flags |= TNodeFlags.hasStyleInput; + if (hostDirectiveDefs === null || !hostDirectiveDefs.has(directiveDef)) { + setupSelectorMatchedInputsOrOutputs(BindingType.Inputs, tNode, directiveDef, index); + setupSelectorMatchedInputsOrOutputs(BindingType.Outputs, tNode, directiveDef, index); + setupInitialInputs(tNode, index, false); + } else { + const hostDirectiveDef = hostDirectiveDefs.get(directiveDef)!; + setupHostDirectiveInputsOrOutputs(BindingType.Inputs, tNode, hostDirectiveDef, index); + setupHostDirectiveInputsOrOutputs(BindingType.Outputs, tNode, hostDirectiveDef, index); + setupInitialInputs(tNode, index, true); } } } -/** Mode for capturing node bindings. */ -const enum CaptureNodeBindingMode { +/** Types of bindings that can be exposed by a directive. */ +const enum BindingType { Inputs, Outputs, } /** - * Sets up input/input bindings on a node for the given directive based on the definition metadata. - * This will be called multiple times to combine bindings from various directives on a node. + * Sets up the input/output bindings for a directive that was matched in the template through its + * selector. This method is called repeatedly to build up all of the available inputs on a node. * - * The host binding alias map is used to alias and filter out properties for host directives. - * If the mapping is provided, it'll act as an allowlist, as well as a mapping of what public - * name inputs/outputs should be exposed under. + * @param mode Whether inputs or outputs are being contructed. + * @param tNode Node on which the bindings are being set up. + * @param def Directive definition for which the bindings are being set up. + * @param directiveIndex Index at which the directive instance will be stored in the LView. */ -function setupBindings( - mode: CaptureNodeBindingMode, +function setupSelectorMatchedInputsOrOutputs( + mode: BindingType, tNode: TNode, def: DirectiveDef, directiveIndex: number, - hostDirectiveAliasMap: HostDirectiveBindingMap | null, ): void { - const aliasMap = mode === CaptureNodeBindingMode.Inputs ? def.inputs : def.outputs; - - for (let publicName in aliasMap) { - if (!aliasMap.hasOwnProperty(publicName)) { - continue; - } - - const value = aliasMap[publicName]; - if (value === undefined) { - continue; - } - - // If there are no host directive mappings, we want to remap using the alias map from the - // definition itself. If there is an alias map, it has two functions: - // 1. It serves as an allowlist of bindings that are exposed by the host directives. Only the - // ones inside the host directive map will be exposed on the host. - // 2. The public name of the property is aliased using the host directive alias map, rather - // than the alias map from the definition. - let finalPublicName: string = publicName; - if (hostDirectiveAliasMap !== null) { - // If there is no mapping, it's not part of the allowlist and this input/output - // is not captured and should be ignored. - if (!hostDirectiveAliasMap.hasOwnProperty(publicName)) { - continue; + const aliasMap = mode === BindingType.Inputs ? def.inputs : def.outputs; + + for (const publicName in aliasMap) { + if (aliasMap.hasOwnProperty(publicName)) { + const value = aliasMap[publicName]; + let bindings: NodeInputBindings | NodeOutputBindings; + let privateName: string; + if (mode === BindingType.Inputs) { + bindings = tNode.inputs ??= {}; + privateName = publicName; + } else { + bindings = tNode.outputs ??= {}; + privateName = value as string; } - finalPublicName = hostDirectiveAliasMap[publicName]; + bindings[publicName] ??= []; + bindings[publicName].push(directiveIndex, privateName); + setShadowStylingInputFlags(tNode, publicName); } + } +} - if (mode === CaptureNodeBindingMode.Inputs) { - tNode.inputs ??= {}; - addPropertyBinding(tNode.inputs, directiveIndex, finalPublicName, publicName); - } else { - tNode.outputs ??= {}; - addPropertyBinding(tNode.outputs, directiveIndex, finalPublicName, value as string); +/** + * Sets up input/output bindings that were defined through host directives on a specific node. + * @param mode Whether inputs or outputs are being contructed. + * @param tNode Node on which the bindings are being set up. + * @param config Host directive definition that is being set up. + * @param directiveIndex Index at which the directive instance will be stored in the LView. + */ +function setupHostDirectiveInputsOrOutputs( + mode: BindingType, + tNode: TNode, + config: HostDirectiveDef, + directiveIndex: number, +): void { + const aliasMap = mode === BindingType.Inputs ? config.inputs : config.outputs; + + for (const initialName in aliasMap) { + if (aliasMap.hasOwnProperty(initialName)) { + const publicName = aliasMap[initialName]; + let bindings: HostDirectiveInputs | HostDirectiveOutputs; + if (mode === BindingType.Inputs) { + bindings = tNode.hostDirectiveInputs ??= {}; + } else { + bindings = tNode.hostDirectiveOutputs ??= {}; + } + bindings[publicName] ??= []; + bindings[publicName].push(directiveIndex, initialName); + setShadowStylingInputFlags(tNode, publicName); } } } -function addPropertyBinding( - bindings: NodeInputBindings | NodeOutputBindings, - directiveIndex: number, - publicName: string, - lookupName: string, -) { - if (bindings.hasOwnProperty(publicName)) { - bindings[publicName].push(directiveIndex, lookupName); - } else { - bindings[publicName] = [directiveIndex, lookupName]; +function setShadowStylingInputFlags(tNode: TNode, publicName: string): void { + if (publicName === 'class') { + tNode.flags |= TNodeFlags.hasClassInput; + } else if (publicName === 'style') { + tNode.flags |= TNodeFlags.hasStyleInput; } } @@ -372,10 +359,17 @@ function addPropertyBinding( * @param tNode TNode on which to set up the initial inputs. * @param directiveIndex Index of the directive that is currently being processed. */ -function setupInitialInputs(tNode: TNode, directiveIndex: number): void { - const {attrs, inputs} = tNode; +function setupInitialInputs(tNode: TNode, directiveIndex: number, isHostDirective: boolean): void { + const {attrs, inputs, hostDirectiveInputs} = tNode; - if (attrs === null || inputs === null || isInlineTemplate(tNode)) { + if ( + attrs === null || + (!isHostDirective && inputs === null) || + (isHostDirective && hostDirectiveInputs === null) || + // Do not use unbound attributes as inputs to structural directives, since structural + // directive inputs can only be set using microsyntax (e.g. `
`). + isInlineTemplate(tNode) + ) { tNode.initialInputs ??= []; tNode.initialInputs.push(null); return; @@ -393,16 +387,16 @@ function setupInitialInputs(tNode: TNode, directiveIndex: number): void { // Skip over the `ngProjectAs` value. i += 2; continue; + } else if (typeof attrName === 'number') { + // If we hit any other attribute markers, we're done anyway. None of those are valid inputs. + break; } - // If we hit any other attribute markers, we're done anyway. None of those are valid inputs. - if (typeof attrName === 'number') break; - - if (inputs.hasOwnProperty(attrName as string)) { + if (!isHostDirective && inputs!.hasOwnProperty(attrName as string)) { // Find the input's public name from the input store. Note that we can be found easier // through the directive def, but we want to do it using the inputs store so that it can // account for host directive aliases. - const inputConfig = inputs[attrName as string]; + const inputConfig = inputs![attrName as string]; for (let j = 0; j < inputConfig.length; j += 2) { if (inputConfig[j] === directiveIndex) { inputsToStore ??= []; @@ -411,6 +405,15 @@ function setupInitialInputs(tNode: TNode, directiveIndex: number): void { break; } } + } else if (isHostDirective && hostDirectiveInputs!.hasOwnProperty(attrName as string)) { + const config = hostDirectiveInputs![attrName as string]; + for (let j = 0; j < config.length; j += 2) { + if (config[j] === directiveIndex) { + inputsToStore ??= []; + inputsToStore.push(config[j + 1] as string, attrs[i + 1] as string); + break; + } + } } i += 2; diff --git a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json index aa976739ff6f..5306bf6b6a00 100644 --- a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json @@ -200,7 +200,6 @@ "activeConsumer", "addAfterRenderSequencesForView", "addClass", - "addPropertyBinding", "allocExpando", "allocLFrame", "angularZoneInstanceIdProperty", @@ -464,9 +463,11 @@ "setInputsFromAttrs", "setIsRefreshingViews", "setSelectedIndex", + "setShadowStylingInputFlags", "setStyles", - "setupBindings", + "setupHostDirectiveInputsOrOutputs", "setupInitialInputs", + "setupSelectorMatchedInputsOrOutputs", "setupStaticAttributes", "shimStylesContent", "shouldSearchParent", diff --git a/packages/core/test/bundling/animations/bundle.golden_symbols.json b/packages/core/test/bundling/animations/bundle.golden_symbols.json index d8a9786ff678..acf05d862a05 100644 --- a/packages/core/test/bundling/animations/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations/bundle.golden_symbols.json @@ -219,7 +219,6 @@ "activeConsumer", "addAfterRenderSequencesForView", "addClass", - "addPropertyBinding", "allocExpando", "allocLFrame", "angularZoneInstanceIdProperty", @@ -490,9 +489,11 @@ "setInputsFromAttrs", "setIsRefreshingViews", "setSelectedIndex", + "setShadowStylingInputFlags", "setStyles", - "setupBindings", + "setupHostDirectiveInputsOrOutputs", "setupInitialInputs", + "setupSelectorMatchedInputsOrOutputs", "setupStaticAttributes", "shimStylesContent", "shouldSearchParent", diff --git a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json index 57504b6f49d1..2220670fbb4d 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -165,7 +165,6 @@ "_wasLastNodeCreated", "activeConsumer", "addAfterRenderSequencesForView", - "addPropertyBinding", "allocExpando", "allocLFrame", "angularZoneInstanceIdProperty", @@ -398,8 +397,10 @@ "setInputsFromAttrs", "setIsRefreshingViews", "setSelectedIndex", - "setupBindings", + "setShadowStylingInputFlags", + "setupHostDirectiveInputsOrOutputs", "setupInitialInputs", + "setupSelectorMatchedInputsOrOutputs", "setupStaticAttributes", "shimStylesContent", "shouldSearchParent", diff --git a/packages/core/test/bundling/defer/bundle.golden_symbols.json b/packages/core/test/bundling/defer/bundle.golden_symbols.json index d71297c2cc05..16e1e7e07d73 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -205,7 +205,6 @@ "activeConsumer", "addAfterRenderSequencesForView", "addDepsToRegistry", - "addPropertyBinding", "addToEndOfViewTree", "allocExpando", "allocLFrame", @@ -864,8 +863,10 @@ "setInputsFromAttrs", "setIsRefreshingViews", "setSelectedIndex", - "setupBindings", + "setShadowStylingInputFlags", + "setupHostDirectiveInputsOrOutputs", "setupInitialInputs", + "setupSelectorMatchedInputsOrOutputs", "setupStaticAttributes", "shimStylesContent", "shouldAttachRegularTrigger", diff --git a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json index 868a826b4b76..2f89d313ed48 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -235,7 +235,6 @@ "_wasLastNodeCreated", "activeConsumer", "addAfterRenderSequencesForView", - "addPropertyBinding", "addToArray", "addToEndOfViewTree", "addValidators", @@ -494,6 +493,7 @@ "leaveView", "leaveViewLight", "lengthOrSize", + "listenToOutput", "lookupTokenUsingModuleInjector", "lookupTokenUsingNodeInjector", "makeParamDecorator", @@ -593,13 +593,15 @@ "setInputsFromAttrs", "setIsRefreshingViews", "setSelectedIndex", + "setShadowStylingInputFlags", "setTStylingRangeNext", "setTStylingRangeNextDuplicate", "setTStylingRangePrevDuplicate", "setUpControl", "setUpValidators", - "setupBindings", + "setupHostDirectiveInputsOrOutputs", "setupInitialInputs", + "setupSelectorMatchedInputsOrOutputs", "setupStaticAttributes", "shimStylesContent", "shouldAddViewToDom", diff --git a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json index ca70bc407399..97aa17c1aea4 100644 --- a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json @@ -229,7 +229,6 @@ "_wasLastNodeCreated", "activeConsumer", "addAfterRenderSequencesForView", - "addPropertyBinding", "addToArray", "addToEndOfViewTree", "addValidators", @@ -480,6 +479,7 @@ "leaveDI", "leaveView", "leaveViewLight", + "listenToOutput", "listenerInternal", "lookupTokenUsingModuleInjector", "lookupTokenUsingNodeInjector", @@ -586,13 +586,15 @@ "setInputsFromAttrs", "setIsRefreshingViews", "setSelectedIndex", + "setShadowStylingInputFlags", "setTStylingRangeNext", "setTStylingRangeNextDuplicate", "setTStylingRangePrevDuplicate", "setUpControl", "setUpValidators", - "setupBindings", + "setupHostDirectiveInputsOrOutputs", "setupInitialInputs", + "setupSelectorMatchedInputsOrOutputs", "setupStaticAttributes", "shimStylesContent", "shouldAddViewToDom", diff --git a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json index 79ef1dd1598f..0333c4426448 100644 --- a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json @@ -123,7 +123,6 @@ "_platformInjector", "activeConsumer", "addAfterRenderSequencesForView", - "addPropertyBinding", "allocExpando", "allocLFrame", "angularZoneInstanceIdProperty", @@ -320,8 +319,10 @@ "setInputsFromAttrs", "setIsRefreshingViews", "setSelectedIndex", - "setupBindings", + "setShadowStylingInputFlags", + "setupHostDirectiveInputsOrOutputs", "setupInitialInputs", + "setupSelectorMatchedInputsOrOutputs", "shouldSearchParent", "storeLViewOnDestroy", "stringify", diff --git a/packages/core/test/bundling/hydration/bundle.golden_symbols.json b/packages/core/test/bundling/hydration/bundle.golden_symbols.json index c5edbd0c811a..0385799bcde5 100644 --- a/packages/core/test/bundling/hydration/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hydration/bundle.golden_symbols.json @@ -169,7 +169,6 @@ "_wasLastNodeCreated", "activeConsumer", "addAfterRenderSequencesForView", - "addPropertyBinding", "allocExpando", "allocLFrame", "angularZoneInstanceIdProperty", @@ -428,8 +427,10 @@ "setIsRefreshingViews", "setSegmentHead", "setSelectedIndex", - "setupBindings", + "setShadowStylingInputFlags", + "setupHostDirectiveInputsOrOutputs", "setupInitialInputs", + "setupSelectorMatchedInputsOrOutputs", "shimStylesContent", "shouldSearchParent", "siblingAfter", diff --git a/packages/core/test/bundling/router/bundle.golden_symbols.json b/packages/core/test/bundling/router/bundle.golden_symbols.json index e481362171ae..80db49c418d7 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -278,7 +278,6 @@ "activeConsumer", "addAfterRenderSequencesForView", "addEmptyPathsToChildrenIfNeeded", - "addPropertyBinding", "addToArray", "addToEndOfViewTree", "advanceActivatedRoute", @@ -569,6 +568,7 @@ "leaveDI", "leaveView", "leaveViewLight", + "listenToOutput", "locateDirectiveOrProvider", "lookupTokenUsingModuleInjector", "lookupTokenUsingNodeInjector", @@ -676,8 +676,10 @@ "setIsRefreshingViews", "setRouterState", "setSelectedIndex", - "setupBindings", + "setShadowStylingInputFlags", + "setupHostDirectiveInputsOrOutputs", "setupInitialInputs", + "setupSelectorMatchedInputsOrOutputs", "setupStaticAttributes", "shallowEqual", "shimStylesContent", diff --git a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json index 01a404213c2e..beeb7755654e 100644 --- a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json +++ b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json @@ -148,7 +148,6 @@ "_wasLastNodeCreated", "activeConsumer", "addAfterRenderSequencesForView", - "addPropertyBinding", "allocExpando", "allocLFrame", "angularZoneInstanceIdProperty", @@ -356,8 +355,10 @@ "setInputsFromAttrs", "setIsRefreshingViews", "setSelectedIndex", - "setupBindings", + "setShadowStylingInputFlags", + "setupHostDirectiveInputsOrOutputs", "setupInitialInputs", + "setupSelectorMatchedInputsOrOutputs", "shimStylesContent", "shouldSearchParent", "storeLViewOnDestroy", diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index ba1bcc3893f1..60eafa91b81f 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -194,7 +194,6 @@ "_wasLastNodeCreated", "activeConsumer", "addAfterRenderSequencesForView", - "addPropertyBinding", "addToArray", "addToEndOfViewTree", "allocExpando", @@ -401,6 +400,7 @@ "leaveDI", "leaveView", "leaveViewLight", + "listenToOutput", "lookupTokenUsingModuleInjector", "lookupTokenUsingNodeInjector", "makeParamDecorator", @@ -474,11 +474,13 @@ "setInputsFromAttrs", "setIsRefreshingViews", "setSelectedIndex", + "setShadowStylingInputFlags", "setTStylingRangeNext", "setTStylingRangeNextDuplicate", "setTStylingRangePrevDuplicate", - "setupBindings", + "setupHostDirectiveInputsOrOutputs", "setupInitialInputs", + "setupSelectorMatchedInputsOrOutputs", "setupStaticAttributes", "shimStylesContent", "shouldAddViewToDom", diff --git a/packages/core/test/render3/is_shape_of.ts b/packages/core/test/render3/is_shape_of.ts index c30449671049..3d51c092adf7 100644 --- a/packages/core/test/render3/is_shape_of.ts +++ b/packages/core/test/render3/is_shape_of.ts @@ -163,7 +163,9 @@ const ShapeOfTNode: ShapeOf = { localNames: true, initialInputs: true, inputs: true, + hostDirectiveInputs: true, outputs: true, + hostDirectiveOutputs: true, tView: true, next: true, prev: true, From 628ab4033bd3d165f235806632484895bb1f056f Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Thu, 20 Feb 2025 17:38:09 +0100 Subject: [PATCH 0119/1000] refactor(core): do not store input/output public names (#60036) Reworks the `TNode.inputs` and `TNode.outputs` to not store the public names of bindings. The only reason they were stored was for host directive re-aliasing which is handled through a different data structure now. PR Close #60036 --- .../core/src/render3/instructions/listener.ts | 46 +++++++++++++------ .../core/src/render3/instructions/shared.ts | 16 ++----- packages/core/src/render3/interfaces/node.ts | 26 ++++------- packages/core/src/render3/view/directives.ts | 13 ++---- 4 files changed, 50 insertions(+), 51 deletions(-) diff --git a/packages/core/src/render3/instructions/listener.ts b/packages/core/src/render3/instructions/listener.ts index e88980629236..7ad1869b5481 100644 --- a/packages/core/src/render3/instructions/listener.ts +++ b/packages/core/src/render3/instructions/listener.ts @@ -10,7 +10,7 @@ import {setActiveConsumer} from '@angular/core/primitives/signals'; import {NotificationSource} from '../../change_detection/scheduling/zoneless_scheduling'; import {assertIndexInRange} from '../../util/assert'; -import {NodeOutputBindings, TNode, TNodeType} from '../interfaces/node'; +import {TNode, TNodeType} from '../interfaces/node'; import {GlobalTargetResolver, Renderer} from '../interfaces/renderer'; import {RElement} from '../interfaces/renderer_dom'; import {isComponentHost, isDirectiveHost} from '../interfaces/type_checks'; @@ -238,22 +238,34 @@ export function listenerInternal( if (hostDirectiveOutputConfig && hostDirectiveOutputConfig.length) { for (let i = 0; i < hostDirectiveOutputConfig.length; i += 2) { const index = hostDirectiveOutputConfig[i] as number; - ngDevMode && assertIndexInRange(lView, index); - const instance = lView[index]; const lookupName = hostDirectiveOutputConfig[i + 1] as string; - const def = tView.data[index] as DirectiveDef; - const minifiedName = def.outputs[lookupName]; - listenToOutput(tNode, instance, eventName, minifiedName, listenerFn, lCleanup, tCleanup); + listenToOutput( + tNode, + tView, + lView, + index, + lookupName, + eventName, + listenerFn, + lCleanup, + tCleanup, + ); } } if (outputConfig && outputConfig.length) { - for (let i = 0; i < outputConfig.length; i += 2) { - const index = outputConfig[i] as number; - ngDevMode && assertIndexInRange(lView, index); - const instance = lView[index]; - const minifiedName = outputConfig[i + 1] as string; - listenToOutput(tNode, instance, eventName, minifiedName, listenerFn, lCleanup, tCleanup); + for (const index of outputConfig) { + listenToOutput( + tNode, + tView, + lView, + index, + eventName, + eventName, + listenerFn, + lCleanup, + tCleanup, + ); } } } @@ -261,13 +273,19 @@ export function listenerInternal( function listenToOutput( tNode: TNode, - instance: any, + tView: TView, + lView: LView, + index: number, + lookupName: string, eventName: string, - propertyName: string, listenerFn: (e?: any) => any, lCleanup: any[], tCleanup: any[] | null, ) { + ngDevMode && assertIndexInRange(lView, index); + const instance = lView[index]; + const def = tView.data[index] as DirectiveDef; + const propertyName = def.outputs[lookupName]; const output = instance[propertyName]; if (ngDevMode && !isOutputSubscribable(output)) { diff --git a/packages/core/src/render3/instructions/shared.ts b/packages/core/src/render3/instructions/shared.ts index 4a0efa4efeea..2d810c937b72 100644 --- a/packages/core/src/render3/instructions/shared.ts +++ b/packages/core/src/render3/instructions/shared.ts @@ -324,8 +324,6 @@ function setNgReflectProperties( return; } - // TODO: this is identical to the block below, but will diverge in a future refactor. - // Figure out if we still can't consolidate them somehow. const inputConfig = tNode.inputs?.[publicName]; const hostInputConfig = tNode.hostDirectiveInputs?.[publicName]; @@ -340,11 +338,9 @@ function setNgReflectProperties( // Note: we set the private name of the input as the reflected property, not the public one. if (inputConfig) { - for (let i = 0; i < inputConfig.length; i += 2) { - const index = inputConfig[i] as number; - const lookupName = inputConfig[i + 1] as string; + for (const index of inputConfig) { const def = tView.data[index] as DirectiveDef; - setNgReflectProperty(lView, tNode, def.inputs[lookupName][0], value); + setNgReflectProperty(lView, tNode, def.inputs[publicName][0], value); } } } @@ -636,8 +632,6 @@ export function setInputsForProperty( const hostDirectiveInputs = tNode.hostDirectiveInputs?.[publicName]; let hasMatch = false; - // TODO: this is identical to the block below, but will diverge in a future refactor. - // Figure out if we still can't consolidate them somehow. if (hostDirectiveInputs) { for (let i = 0; i < hostDirectiveInputs.length; i += 2) { const index = hostDirectiveInputs[i] as number; @@ -650,13 +644,11 @@ export function setInputsForProperty( } if (inputs) { - for (let i = 0; i < inputs.length; i += 2) { - const index = inputs[i] as number; + for (const index of inputs) { ngDevMode && assertIndexInRange(lView, index); - const privateName = inputs[i + 1] as string; const instance = lView[index]; const def = tView.data[index] as DirectiveDef; - writeToDirectiveInput(def, instance, privateName, value); + writeToDirectiveInput(def, instance, publicName, value); hasMatch = true; } } diff --git a/packages/core/src/render3/interfaces/node.ts b/packages/core/src/render3/interfaces/node.ts index ff931c60270e..0bac9123d7e4 100644 --- a/packages/core/src/render3/interfaces/node.ts +++ b/packages/core/src/render3/interfaces/node.ts @@ -782,36 +782,28 @@ export interface TLetDeclarationNode extends TNode { export type TDirectiveHostNode = TElementNode | TContainerNode | TElementContainerNode; /** - * Store the runtime output names for all the directives. + * Maps the public names of outputs available on a specific node to the index + * of the directive instance that defines the output, for example: * - * i+0: directive instance index - * i+1: privateName - * - * e.g. * ``` * { - * "publicName": [0, 'change-minified'] + * "publicName": [0, 5] * } + * ``` */ -export type NodeOutputBindings = Record; +export type NodeOutputBindings = Record; /** - * Store the runtime input for all directives applied to a node. - * - * This allows efficiently setting the same input on a directive that - * might apply to multiple directives. - * - * i+0: directive instance index - * i+1: privateName + * Maps the public names of inputs applied to a specific node to the index of the + * directive instance to which the input value should be written, for example: * - * e.g. * ``` * { - * "publicName": [0, 'change-minified'] + * "publicName": [0, 5] * } * ``` */ -export type NodeInputBindings = Record; +export type NodeInputBindings = Record; /** * This array contains information about input properties that diff --git a/packages/core/src/render3/view/directives.ts b/packages/core/src/render3/view/directives.ts index 332ca15bfb83..3635c69debba 100644 --- a/packages/core/src/render3/view/directives.ts +++ b/packages/core/src/render3/view/directives.ts @@ -289,18 +289,14 @@ function setupSelectorMatchedInputsOrOutputs( for (const publicName in aliasMap) { if (aliasMap.hasOwnProperty(publicName)) { - const value = aliasMap[publicName]; let bindings: NodeInputBindings | NodeOutputBindings; - let privateName: string; if (mode === BindingType.Inputs) { bindings = tNode.inputs ??= {}; - privateName = publicName; } else { bindings = tNode.outputs ??= {}; - privateName = value as string; } bindings[publicName] ??= []; - bindings[publicName].push(directiveIndex, privateName); + bindings[publicName].push(directiveIndex); setShadowStylingInputFlags(tNode, publicName); } } @@ -397,10 +393,11 @@ function setupInitialInputs(tNode: TNode, directiveIndex: number, isHostDirectiv // through the directive def, but we want to do it using the inputs store so that it can // account for host directive aliases. const inputConfig = inputs![attrName as string]; - for (let j = 0; j < inputConfig.length; j += 2) { - if (inputConfig[j] === directiveIndex) { + + for (const index of inputConfig) { + if (index === directiveIndex) { inputsToStore ??= []; - inputsToStore.push(inputConfig[j + 1] as string, attrs[i + 1] as string); + inputsToStore.push(attrName as string, attrs[i + 1] as string); // A directive can't have multiple inputs with the same name so we can break here. break; } From 17c84e5a0345a1e36d75f1399fd6c15d165c250d Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Thu, 20 Feb 2025 23:09:08 -0500 Subject: [PATCH 0120/1000] docs: use `@angular/build` directly in example/tutorial projects (#60046) By using the `@angular/build` package directly within projects for each example and tutorial, the total install size can be reduced. This lowers the amount of time required to be spent setting up the dependencies in browser before the example is displayed. The `@angular/build@19.2.0-next.2` package currently has a total unpacked size of ~115 MB. The `@angular-devkit/build-angular@19.2.0-next.2` package currently has a total unpacked size of ~291 MB. This also removes the now unneeded `NG_BUILD_PARALLEL_TS=0` environment variable usage. PR Close #60046 --- .../pipeline/examples/template/angular.json | 8 +- .../examples/template/package.json.template | 2 +- .../pipeline/tutorials/common/angular.json | 6 +- .../tutorials/common/package-lock.json | 15176 +++++----------- .../tutorials/common/package.json.template | 8 +- .../deferrable-views/common/package.json | 2 +- .../tutorials/first-app/common/package.json | 2 +- .../content/tutorials/homepage/package.json | 2 +- .../learn-angular/common/package.json | 2 +- .../tutorials/playground/common/package.json | 2 +- 10 files changed, 4885 insertions(+), 10325 deletions(-) diff --git a/adev/shared-docs/pipeline/examples/template/angular.json b/adev/shared-docs/pipeline/examples/template/angular.json index 55f72afc3f92..a12c1fd33fc1 100644 --- a/adev/shared-docs/pipeline/examples/template/angular.json +++ b/adev/shared-docs/pipeline/examples/template/angular.json @@ -21,7 +21,7 @@ "prefix": "app", "architect": { "build": { - "builder": "@angular-devkit/build-angular:application", + "builder": "@angular/build:application", "options": { "outputPath": "dist/example-app", "index": "src/index.html", @@ -66,7 +66,7 @@ "defaultConfiguration": "production" }, "serve": { - "builder": "@angular-devkit/build-angular:dev-server", + "builder": "@angular/build:dev-server", "configurations": { "production": { "browserTarget": "example-app:build:production" @@ -78,13 +78,13 @@ "defaultConfiguration": "development" }, "extract-i18n": { - "builder": "@angular-devkit/build-angular:extract-i18n", + "builder": "@angular/build:extract-i18n", "options": { "browserTarget": "example-app:build" } }, "test": { - "builder": "@angular-devkit/build-angular:karma", + "builder": "@angular/build:karma", "options": { "main": "src/test.ts", "polyfills": ["zone.js", "zone.js/testing"], diff --git a/adev/shared-docs/pipeline/examples/template/package.json.template b/adev/shared-docs/pipeline/examples/template/package.json.template index 9f121c88e926..040601bf5322 100644 --- a/adev/shared-docs/pipeline/examples/template/package.json.template +++ b/adev/shared-docs/pipeline/examples/template/package.json.template @@ -23,7 +23,7 @@ "zone.js": "~0.13.0" }, "devDependencies": { - "@angular-devkit/build-angular": "^19.0.0", + "@angular/build": "^19.0.0", "@angular/cli": "^19.0.0", "@angular/compiler-cli": "^19.0.0", "@types/jasmine": "~3.10.0", diff --git a/adev/shared-docs/pipeline/tutorials/common/angular.json b/adev/shared-docs/pipeline/tutorials/common/angular.json index b9d216be0bd3..e541511cb960 100644 --- a/adev/shared-docs/pipeline/tutorials/common/angular.json +++ b/adev/shared-docs/pipeline/tutorials/common/angular.json @@ -39,7 +39,7 @@ "prefix": "app", "architect": { "build": { - "builder": "@angular-devkit/build-angular:application", + "builder": "@angular/build:application", "options": { "outputPath": "dist/first-app", "index": "src/index.html", @@ -76,7 +76,7 @@ "defaultConfiguration": "production" }, "serve": { - "builder": "@angular-devkit/build-angular:dev-server", + "builder": "@angular/build:dev-server", "configurations": { "production": { "buildTarget": "first-app:build:production" @@ -88,7 +88,7 @@ "defaultConfiguration": "development" }, "extract-i18n": { - "builder": "@angular-devkit/build-angular:extract-i18n", + "builder": "@angular/build:extract-i18n", "options": { "buildTarget": "first-app:build" } diff --git a/adev/shared-docs/pipeline/tutorials/common/package-lock.json b/adev/shared-docs/pipeline/tutorials/common/package-lock.json index a7ddd37c4f8b..8769b175cb74 100644 --- a/adev/shared-docs/pipeline/tutorials/common/package-lock.json +++ b/adev/shared-docs/pipeline/tutorials/common/package-lock.json @@ -8,140 +8,152 @@ "name": "angular.dev", "version": "0.0.0", "dependencies": { - "@angular/common": "^17.0.0-rc.1", - "@angular/compiler": "^17.0.0-rc.1", - "@angular/core": "^17.0.0-rc.1", - "@angular/platform-browser": "^17.0.0-rc.1", + "@angular/common": "^19.0.0", + "@angular/compiler": "^19.0.0", + "@angular/core": "^19.0.0", + "@angular/platform-browser": "^19.0.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", - "zone.js": "~0.14.0" + "zone.js": "~0.15.0" }, "devDependencies": { - "@angular-devkit/build-angular": "^17.0.0-rc.2", - "@angular/cli": "^17.0.0-rc.2", - "@angular/compiler-cli": "^17.0.0-rc.1", - "typescript": "~5.2.0" + "@angular/build": "^19.0.0", + "@angular/cli": "^19.0.0", + "@angular/compiler-cli": "^19.0.0", + "typescript": "~5.7.3" } }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.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.1700.0-rc.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1700.0-rc.2.tgz", - "integrity": "sha512-+1GpG59fHgHNdqnDxXDa801vunrxSHDQohtS2s9ltuWDrl29vptdHLXCAWpP7OD+MD7+gab5jQqIDNCXats8gw==", + "version": "0.1901.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.8.tgz", + "integrity": "sha512-DzvlL1Zg+zOnVmMN3CjE5KzjZAltRZwOwwcso72iWenBPvl/trKzPDlA6ySmpRonm+AR9i9JrdLEUlwczW6/bQ==", "dev": true, + "license": "MIT", "dependencies": { - "@angular-devkit/core": "17.0.0-rc.2", + "@angular-devkit/core": "19.1.8", "rxjs": "7.8.1" }, "engines": { - "node": ">=18.13.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/core": { + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.8.tgz", + "integrity": "sha512-j1zHKvOsGwu5YwAZGuzi835R9vcW7PkfxmSRIJeVl+vawgk31K3zFb4UPH8AY/NPWYqXIAnwpka3HC1+JrWLWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "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": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } } }, - "node_modules/@angular-devkit/build-angular": { - "version": "17.0.0-rc.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.0.0-rc.2.tgz", - "integrity": "sha512-lRWtwbZtk1VQ0XhJ97M0ijzLld5aAlx/CyxK1CBveP05i3FjdhQ4sH0MFf/bqkDr7kDc9WhDikryKEIdpcKE5w==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1700.0-rc.2", - "@angular-devkit/build-webpack": "0.1700.0-rc.2", - "@angular-devkit/core": "17.0.0-rc.2", - "@babel/core": "7.23.2", - "@babel/generator": "7.23.0", - "@babel/helper-annotate-as-pure": "7.22.5", - "@babel/helper-split-export-declaration": "7.22.6", - "@babel/plugin-transform-async-generator-functions": "7.23.2", - "@babel/plugin-transform-async-to-generator": "7.22.5", - "@babel/plugin-transform-runtime": "7.23.2", - "@babel/preset-env": "7.23.2", - "@babel/runtime": "7.23.2", - "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "17.0.0-rc.2", - "@vitejs/plugin-basic-ssl": "1.0.1", - "ansi-colors": "4.1.3", - "autoprefixer": "10.4.16", - "babel-loader": "9.1.3", - "babel-plugin-istanbul": "6.1.1", - "browser-sync": "2.29.3", - "browserslist": "^4.21.5", - "chokidar": "3.5.3", - "copy-webpack-plugin": "11.0.0", - "critters": "0.0.20", - "css-loader": "6.8.1", - "esbuild-wasm": "0.19.5", - "fast-glob": "3.3.1", - "http-proxy-middleware": "2.0.6", - "https-proxy-agent": "7.0.2", - "inquirer": "9.2.11", - "jsonc-parser": "3.2.0", - "karma-source-map-support": "1.4.0", - "less": "4.2.0", - "less-loader": "11.1.0", - "license-webpack-plugin": "4.0.2", - "loader-utils": "3.2.1", - "magic-string": "0.30.5", - "mini-css-extract-plugin": "2.7.6", - "mrmime": "1.0.1", - "open": "8.4.2", + "node_modules/@angular-devkit/schematics": { + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.8.tgz", + "integrity": "sha512-2JGUMD3zjfY8G4RYpypm2/1YEO+O4DtFycUvptIpsBYyULgnEbJ3tlp2oRiXI2vp9tC8IyWqa/swlA8DTI6ZYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "19.1.8", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "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" + } + }, + "node_modules/@angular/build": { + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.8.tgz", + "integrity": "sha512-DAnnmbqPmtlY5JOitqWUgXi/yKj8eAcrP0T7hYZwLmcRsb+HsHYWsAQoFaTDw0p9WC5BKPqDBCMIivcuIV/izQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.1901.8", + "@angular-devkit/core": "19.1.8", + "@babel/core": "7.26.0", + "@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.1", + "@vitejs/plugin-basic-ssl": "1.2.0", + "beasties": "0.2.0", + "browserslist": "^4.23.0", + "esbuild": "0.24.2", + "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.0", "parse5-html-rewriting-stream": "7.0.0", - "picomatch": "2.3.1", - "piscina": "4.1.0", - "postcss": "8.4.31", - "postcss-loader": "7.3.3", - "resolve-url-loader": "5.0.0", - "rxjs": "7.8.1", - "sass": "1.69.5", - "sass-loader": "13.3.2", - "semver": "7.5.4", - "source-map-loader": "4.0.1", - "source-map-support": "0.5.21", - "terser": "5.22.0", - "text-table": "0.2.0", - "tree-kill": "1.2.2", - "tslib": "2.6.2", - "vite": "4.5.0", - "webpack": "5.89.0", - "webpack-dev-middleware": "6.1.1", - "webpack-dev-server": "4.15.1", - "webpack-merge": "5.10.0", - "webpack-subresource-integrity": "5.1.0" - }, - "engines": { - "node": ">=18.13.0", + "picomatch": "4.0.2", + "piscina": "4.8.0", + "rollup": "4.30.1", + "sass": "1.83.1", + "semver": "7.6.3", + "vite": "6.0.11", + "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": { - "esbuild": "0.19.5" + "lmdb": "3.2.2" }, "peerDependencies": { - "@angular/compiler-cli": "^17.0.0 || ^17.0.0-next.0", - "@angular/localize": "^17.0.0 || ^17.0.0-next.0", - "@angular/platform-server": "^17.0.0 || ^17.0.0-next.0", - "@angular/service-worker": "^17.0.0 || ^17.0.0-next.0", - "jest": "^29.5.0", - "jest-environment-jsdom": "^29.5.0", - "karma": "^6.3.0", - "ng-packagr": "^17.0.0 || ^17.0.0-next.1", - "protractor": "^7.0.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.2 <5.3" + "@angular/compiler": "^19.0.0", + "@angular/compiler-cli": "^19.0.0", + "@angular/localize": "^19.0.0", + "@angular/platform-server": "^19.0.0", + "@angular/service-worker": "^19.0.0", + "@angular/ssr": "^19.1.8", + "less": "^4.2.0", + "ng-packagr": "^19.0.0", + "postcss": "^8.4.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "typescript": ">=5.5 <5.8" }, "peerDependenciesMeta": { "@angular/localize": { @@ -153,19 +165,16 @@ "@angular/service-worker": { "optional": true }, - "jest": { - "optional": true - }, - "jest-environment-jsdom": { + "@angular/ssr": { "optional": true }, - "karma": { + "less": { "optional": true }, "ng-packagr": { "optional": true }, - "protractor": { + "postcss": { "optional": true }, "tailwindcss": { @@ -173,92 +182,28 @@ } } }, - "node_modules/@angular-devkit/build-webpack": { - "version": "0.1700.0-rc.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1700.0-rc.2.tgz", - "integrity": "sha512-yOI3cXXpkLnTlqMqXik1ATFWCgPZdR7Rv3eG67mD8QaMIShubFb82HQLKcb34SQJxf6HntYw7X6d5xnKbHwnvQ==", - "dev": true, - "dependencies": { - "@angular-devkit/architect": "0.1700.0-rc.2", - "rxjs": "7.8.1" - }, - "engines": { - "node": ">=18.13.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" - } - }, - "node_modules/@angular-devkit/core": { - "version": "17.0.0-rc.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.0.0-rc.2.tgz", - "integrity": "sha512-z68Y+JhcDsTv9TVOX5tmuR7bRrTMLCP/3AxUeJ9kZW4UdCeZA77ya0k7F1XpkyCb2JTM/5+yYXTigxMh6Jhr8g==", - "dev": true, - "dependencies": { - "ajv": "8.12.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.0", - "picomatch": "2.3.1", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, - "engines": { - "node": ">=18.13.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/schematics": { - "version": "17.0.0-rc.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.0.0-rc.2.tgz", - "integrity": "sha512-WW4mQdCGZ2YA6g2r10571hKxCMwkiVEoOF69GjBzLfIr4YBF6bcXcczqgGyeOtbTT3xy7FbTcdNZ7/l9K4XLDQ==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "17.0.0-rc.2", - "jsonc-parser": "3.2.0", - "magic-string": "0.30.5", - "ora": "5.4.1", - "rxjs": "7.8.1" - }, - "engines": { - "node": ">=18.13.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, "node_modules/@angular/cli": { - "version": "17.0.0-rc.2", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.0.0-rc.2.tgz", - "integrity": "sha512-2Xl2e5PzD3MyNpf3Urbs1esHBqY5faPcqsRwFvHC2yo+X0M1n64D6uuKQ5+gbPnEbUc5KKi04QiFEsCbPIW/mw==", - "dev": true, - "dependencies": { - "@angular-devkit/architect": "0.1700.0-rc.2", - "@angular-devkit/core": "17.0.0-rc.2", - "@angular-devkit/schematics": "17.0.0-rc.2", - "@schematics/angular": "17.0.0-rc.2", + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.8.tgz", + "integrity": "sha512-JmdLj8110DNWaxL03K7I06+nLyBfXgiIqYyrQx5QO9AodGkKHK5rE+7VD8MjZhUymua57HToD0oHaQgThJwTJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/architect": "0.1901.8", + "@angular-devkit/core": "19.1.8", + "@angular-devkit/schematics": "19.1.8", + "@inquirer/prompts": "7.2.1", + "@listr2/prompt-adapter-inquirer": "2.0.18", + "@schematics/angular": "19.1.8", "@yarnpkg/lockfile": "1.1.0", - "ansi-colors": "4.1.3", - "ini": "4.1.1", - "inquirer": "9.2.11", - "jsonc-parser": "3.2.0", - "npm-package-arg": "11.0.1", - "npm-pick-manifest": "9.0.0", - "open": "8.4.2", - "ora": "5.4.1", - "pacote": "17.0.4", - "resolve": "1.22.8", - "semver": "7.5.4", + "ini": "5.0.0", + "jsonc-parser": "3.3.1", + "listr2": "8.2.5", + "npm-package-arg": "12.0.1", + "npm-pick-manifest": "10.0.0", + "pacote": "20.0.0", + "resolve": "1.22.10", + "semver": "7.6.3", "symbol-observable": "4.0.0", "yargs": "17.7.2" }, @@ -266,38 +211,40 @@ "ng": "bin/ng.js" }, "engines": { - "node": ">=18.13.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": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.0.0-rc.1.tgz", - "integrity": "sha512-E51n8DdHY6WvP2OCBK9saIeGOjqCsekTxJ9Dx52kD/ZSI5JyQHUmxnCiGbp6rbxPBSli/0CS/6OabX7tVYq2Mg==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.7.tgz", + "integrity": "sha512-MXfUGfWeesTQ12HXgeoVIXsS+r1jZxT2FkLQtqS+NRsRD4T1vlyvD7kTI+Ku1NAjdt3mB8TJ0cZHubvmml8I+Q==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": ">=18.13.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "17.0.0-rc.1", + "@angular/core": "19.1.7", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.0.0-rc.1.tgz", - "integrity": "sha512-h1HNvTNbroMo2YUtn6K/i0LKQUlAPQJb/Bq+nz1TyxnDI5nYGbRJ8WycQyGwRVrfvLkghkkCGzQqIHEUmZ3rSw==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.7.tgz", + "integrity": "sha512-Q3eqqIhMEzrnmFJtUO0K+WPpCfP/JTl9lJXZKe0zgNPdRFUufjSUcPHGzd7OjN2gPpiAvS1yBvENvqs+g/MejQ==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": ">=18.13.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "17.0.0-rc.1" + "@angular/core": "19.1.7" }, "peerDependenciesMeta": { "@angular/core": { @@ -306,16 +253,17 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.0.0-rc.1.tgz", - "integrity": "sha512-qGom6m5NXj8mB2laXm/xv5th2Vo5iwR0eSOW5VbvU7mCAhwx6WwlWd/jNaf58w1GygrU9p0ay8CHOv4yIK26Kw==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.7.tgz", + "integrity": "sha512-Uu/TxfIcE1lStlCLmOPbghG1Y5o83odES89sr7bYNJz2mcG7TEonatf6GTOMzbJNil9FBJt6qnJkDkSjn4nUKw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/core": "7.23.2", + "@babel/core": "7.26.0", "@jridgewell/sourcemap-codec": "^1.4.14", - "chokidar": "^3.0.0", + "chokidar": "^4.0.0", "convert-source-map": "^1.5.1", - "reflect-metadata": "^0.1.2", + "reflect-metadata": "^0.2.0", "semver": "^7.0.0", "tslib": "^2.3.0", "yargs": "^17.2.1" @@ -326,42 +274,44 @@ "ngcc": "bundles/ngcc/index.js" }, "engines": { - "node": ">=18.13.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "17.0.0-rc.1", - "typescript": ">=5.2 <5.3" + "@angular/compiler": "19.1.7", + "typescript": ">=5.5 <5.8" } }, "node_modules/@angular/core": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.0.0-rc.1.tgz", - "integrity": "sha512-qz5Xjye2XkmBp+4vSxpPVM6yXs/36oXx/FUQa6PDP/DrW9wrCxSELf2g9PHT84xDgq6BhBqca0a4fq+QFURTqg==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.7.tgz", + "integrity": "sha512-P+e4ekJYWMFhWSzJav0R51bFAfUhIOmnqmG9mlI/ZONu2qcTTmyIG9AW5x1qhrMHEH42RaeK60RkKyqgcHaGDg==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": ">=18.13.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.14.0" + "zone.js": "~0.15.0" } }, "node_modules/@angular/platform-browser": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.0.0-rc.1.tgz", - "integrity": "sha512-y1YzN36AmvWMKNjJ0P8OVcnymCuc16xt/hHmEgDDu7ky5TfBO5OTm26DVySdGVuJdkz0M1sTbyyRuGDrhxRu7A==", + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.7.tgz", + "integrity": "sha512-QKakWl+CeVVwn22yjRHBXm6BvDsHoo+9u1pJGGk2smKSYjHW6qAly28+P7FUfVXUQI7rg++M66JwzNOFfYMDQA==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": ">=18.13.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "17.0.0-rc.1", - "@angular/common": "17.0.0-rc.1", - "@angular/core": "17.0.0-rc.1" + "@angular/animations": "19.1.7", + "@angular/common": "19.1.7", + "@angular/core": "19.1.7" }, "peerDependenciesMeta": { "@angular/animations": { @@ -369,50 +319,48 @@ } } }, - "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.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" + "@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.23.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", - "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", - "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.0", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -431,65 +379,59 @@ "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 + "dev": true, + "license": "MIT" }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", + "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "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/types": "^7.22.15" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -502,51 +444,35 @@ "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-class-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", - "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "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, - "bin": { - "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "node_modules/@babel/helper-module-transforms": { + "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==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -555,8195 +481,2595 @@ "@babel/core": "^7.0.0" } }, - "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==", + "node_modules/@babel/helper-plugin-utils": { + "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, - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", - "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", + "node_modules/@babel/helper-split-export-declaration": { + "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/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" + "@babel/types": "^7.24.7" }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "node_modules/@babel/helper-string-parser": { + "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "node_modules/@babel/helpers": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", + "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.23.0" + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "node_modules/@babel/parser": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", + "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.26.9" + }, + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=6.9.0" + "node": ">=6.0.0" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", - "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", + "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-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "node_modules/@babel/template": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, + "node_modules/@babel/traverse": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", + "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "node_modules/@babel/types": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", + "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" - }, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=18" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "node_modules/@esbuild/android-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "node_modules/@esbuild/android-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "node_modules/@esbuild/android-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" - }, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helpers": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", - "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "node_modules/@esbuild/linux-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "cpu": [ + "ia32" + ], "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.15", - "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.22.15.tgz", - "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "cpu": [ + "loong64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=18" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", - "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "cpu": [ + "mips64el" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.15" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "cpu": [ + "ppc64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "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/@esbuild/linux-riscv64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "cpu": [ + "riscv64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "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/@esbuild/linux-s390x": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "cpu": [ + "s390x" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "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/@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "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/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "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/@esbuild/netbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", - "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", - "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" } }, - "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/@esbuild/win32-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "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/@esbuild/win32-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "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/@esbuild/win32-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "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/@inquirer/checkbox": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.2.tgz", + "integrity": "sha512-PL9ixC5YsPXzXhAZFUPmkXGxfgjkdfZdPEPPmt4kFwQ4LBMDG9n/nHXYRGGZSKZJs+d1sGKWgS2GiPzVRKUdtQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@inquirer/core": "^10.1.7", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "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/@inquirer/confirm": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.1.tgz", + "integrity": "sha512-vVLSbGci+IKQvDOtzpPTCOiEJCNidHcAq9JYVoWTW0svb5FiwSLotkM+JXNXejfjnzVYV9n0DTBythl9+XgTxg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@inquirer/core": "^10.1.2", + "@inquirer/type": "^3.0.2" + }, + "engines": { + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/node": ">=18" } }, - "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/@inquirer/core": { + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.7.tgz", + "integrity": "sha512-AA9CQhlrt6ZgiSy6qoAigiA1izOa751ugX6ioSjqgJ+/Gd+tEN/TORk5sUYNjXuHWfW0r1n/a6ak4u/NqHHrtA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", + "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": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "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/@inquirer/editor": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.7.tgz", + "integrity": "sha512-gktCSQtnSZHaBytkJKMKEuswSk2cDBuXX5rxGFv306mwHfBPjg5UAldw9zWGoEyvA9KpRDkeM4jfrx0rXn0GyA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4", + "external-editor": "^3.1.0" + }, + "engines": { + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "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/@inquirer/expand": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.9.tgz", + "integrity": "sha512-Xxt6nhomWTAmuSX61kVgglLjMEFGa+7+F6UUtdEUeg7fg4r9vaFttUUKrtkViYYrQBA5Ia1tkOJj2koP9BuLig==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "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/@inquirer/figures": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.10.tgz", + "integrity": "sha512-Ey6176gZmeqZuY/W/nZiUyvmb1/qInjcpiZjXWi6nON+nxJpD1bxtSoBxNliGISae32n6OwbY+TSXPZ1CfS4bw==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "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==", + "node_modules/@inquirer/input": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.6.tgz", + "integrity": "sha512-1f5AIsZuVjPT4ecA8AwaxDFNHny/tSershP/cTvTDxLdiIGTeILNcKozB0LaYt6mojJLUbOYhpIxicaYf7UKIQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", - "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "node_modules/@inquirer/number": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.9.tgz", + "integrity": "sha512-iN2xZvH3tyIYXLXBvlVh0npk1q/aVuKXZo5hj+K3W3D4ngAEq/DkLpofRzx6oebTUhBvOgryZ+rMV0yImKnG3w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz", - "integrity": "sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==", + "node_modules/@inquirer/password": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.9.tgz", + "integrity": "sha512-xBEoOw1XKb0rIN208YU7wM7oJEHhIYkfG7LpTJAEW913GZeaoQerzf5U/LSHI45EVvjAdgNXmXgH51cUXKZcJQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4", + "ansi-escapes": "^4.3.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", - "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" + "@types/node": ">=18" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", - "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "node_modules/@inquirer/prompts": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.2.1.tgz", + "integrity": "sha512-v2JSGri6/HXSfoGIwuKEn8sNCQK6nsB2BNpy2lSX6QH9bsECrMv93QHnj5+f+1ZWpF/VNioIV2B/PDox8EvGuQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@inquirer/checkbox": "^4.0.4", + "@inquirer/confirm": "^5.1.1", + "@inquirer/editor": "^4.2.1", + "@inquirer/expand": "^4.0.4", + "@inquirer/input": "^4.1.1", + "@inquirer/number": "^3.0.4", + "@inquirer/password": "^4.0.4", + "@inquirer/rawlist": "^4.0.4", + "@inquirer/search": "^3.0.4", + "@inquirer/select": "^4.0.4" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/node": ">=18" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz", - "integrity": "sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==", + "node_modules/@inquirer/rawlist": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.9.tgz", + "integrity": "sha512-+5t6ebehKqgoxV8fXwE49HkSF2Rc9ijNiVGEQZwvbMI61/Q5RcD+jWD6Gs1tKdz5lkI8GRBL31iO0HjGK1bv+A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", - "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" + "@types/node": ">=18" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", - "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", + "node_modules/@inquirer/search": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.9.tgz", + "integrity": "sha512-DWmKztkYo9CvldGBaRMr0ETUHgR86zE6sPDVOHsqz4ISe9o1LuiWfgJk+2r75acFclA93J/lqzhT0dTjCzHuoA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "@inquirer/core": "^10.1.7", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", - "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" + "@types/node": ">=18" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", - "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "node_modules/@inquirer/select": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.9.tgz", + "integrity": "sha512-BpJyJe7Dkhv2kz7yG7bPSbJLQuu/rqyNlF1CfiiFeFwouegfH+zh13KDyt6+d9DwucKo7hqM3wKLLyJxZMO+Xg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.5" + "@inquirer/core": "^10.1.7", + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz", - "integrity": "sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" + "@types/node": ">=18" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", - "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "node_modules/@inquirer/type": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.4.tgz", + "integrity": "sha512-2MNFrDY8jkFYc9Il9DgLsHhMzuHnOYM1+CUYVWbzu9oT0hC7V7EcYvdCKeoll/Fcci04A+ERZ9wcc7cQ8lTkIA==", "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", - "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@types/node": ">=18" }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", - "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", + "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": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "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": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=12" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", - "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "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, - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", - "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", + "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "license": "MIT" }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", - "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", + "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": { - "@babel/helper-plugin-utils": "^7.22.5" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", - "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "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": { - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", - "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", + "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": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "minipass": "^7.0.4" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18.0.0" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", - "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=8" } }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", - "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", + "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==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", - "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "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==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz", - "integrity": "sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==", + "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==", "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz", - "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==", + "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==", "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "license": "MIT" }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz", - "integrity": "sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==", + "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==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", - "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "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": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@inquirer/type": "^1.5.5" }, "engines": { - "node": ">=6.9.0" + "node": ">=18.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@inquirer/prompts": ">= 3 < 8" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "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": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "mute-stream": "^1.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", - "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "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": { - "@babel/helper-plugin-utils": "^7.22.5" - }, + "license": "ISC", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", - "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.2.tgz", + "integrity": "sha512-WBSJT9Z7DTol5viq+DZD2TapeWOw7mlwXxiSBHgAzqVwsaVb0h/ekMD9iu/jDD8MUA20tO9N0WEdnT06fsUp+g==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", - "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.2.tgz", + "integrity": "sha512-4S13kUtR7c/j/MzkTIBJCXv52hQ41LG2ukeaqw4Eng9K0pNKLFjo1sDSz96/yKhwykxrWDb13ddJ/ZqD3rAhUA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", - "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.2.tgz", + "integrity": "sha512-uW31JmfuPAaLUYW7NsEU8gzwgDAzpGPwjvkxnKlcWd8iDutoPKDJi8Wk9lFmPEZRxVSB0j1/wDQ7N2qliR9UFA==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", - "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", - "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz", - "integrity": "sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", - "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", - "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", - "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", - "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", - "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", - "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.2.tgz", - "integrity": "sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", - "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", - "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", - "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", - "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", - "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", - "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", - "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", - "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", - "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.2.tgz", - "integrity": "sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.23.2", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@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.22.5", - "@babel/plugin-syntax-import-attributes": "^7.22.5", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@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-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.23.2", - "@babel/plugin-transform-async-to-generator": "^7.22.5", - "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.23.0", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.11", - "@babel/plugin-transform-classes": "^7.22.15", - "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.23.0", - "@babel/plugin-transform-dotall-regex": "^7.22.5", - "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.11", - "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.11", - "@babel/plugin-transform-for-of": "^7.22.15", - "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.11", - "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", - "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.23.0", - "@babel/plugin-transform-modules-commonjs": "^7.23.0", - "@babel/plugin-transform-modules-systemjs": "^7.23.0", - "@babel/plugin-transform-modules-umd": "^7.22.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", - "@babel/plugin-transform-numeric-separator": "^7.22.11", - "@babel/plugin-transform-object-rest-spread": "^7.22.15", - "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.11", - "@babel/plugin-transform-optional-chaining": "^7.23.0", - "@babel/plugin-transform-parameters": "^7.22.15", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.10", - "@babel/plugin-transform-reserved-words": "^7.22.5", - "@babel/plugin-transform-shorthand-properties": "^7.22.5", - "@babel/plugin-transform-spread": "^7.22.5", - "@babel/plugin-transform-sticky-regex": "^7.22.5", - "@babel/plugin-transform-template-literals": "^7.22.5", - "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.10", - "@babel/plugin-transform-unicode-property-regex": "^7.22.5", - "@babel/plugin-transform-unicode-regex": "^7.22.5", - "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "@babel/types": "^7.23.0", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/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, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "node_modules/@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.5.tgz", - "integrity": "sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz", - "integrity": "sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.5.tgz", - "integrity": "sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz", - "integrity": "sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz", - "integrity": "sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz", - "integrity": "sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz", - "integrity": "sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz", - "integrity": "sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz", - "integrity": "sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz", - "integrity": "sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz", - "integrity": "sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz", - "integrity": "sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz", - "integrity": "sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz", - "integrity": "sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz", - "integrity": "sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz", - "integrity": "sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz", - "integrity": "sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz", - "integrity": "sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz", - "integrity": "sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz", - "integrity": "sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz", - "integrity": "sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.5.tgz", - "integrity": "sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@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==", - "dev": true, - "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" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "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/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "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==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "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/@ljharb/through": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.11.tgz", - "integrity": "sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/@ngtools/webpack": { - "version": "17.0.0-rc.2", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.0.0-rc.2.tgz", - "integrity": "sha512-V/FEtXh0tnoUQsdY9Q7QrkjSF9tvKFhm5mTC/qj2WMq+e53cT/HbeAcUvZMyKsNmr/1SWm6xv4BhIwPHPIq7yg==", - "dev": true, - "engines": { - "node": ">=18.13.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "@angular/compiler-cli": "^17.0.0 || ^17.0.0-next.0", - "typescript": ">=5.2 <5.3", - "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==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "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==", - "dev": true, - "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==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@npmcli/agent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.0.tgz", - "integrity": "sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q==", - "dev": true, - "dependencies": { - "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.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/agent/node_modules/http-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@npmcli/agent/node_modules/lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/@npmcli/agent/node_modules/socks-proxy-agent": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", - "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "socks": "^2.7.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.3.tgz", - "integrity": "sha512-UZp9NwK+AynTrKvHn5k3KviW/hA5eENmFsu3iAPe7sWRt0lFUdsY/wXIYjpDFe7cdSNwOIzbObfwgt6eL5/2zw==", - "dev": true, - "dependencies": { - "@npmcli/promise-spawn": "^7.0.0", - "lru-cache": "^10.0.1", - "npm-pick-manifest": "^9.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/@npmcli/installed-package-contents": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", - "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", - "dev": true, - "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "bin": { - "installed-package-contents": "lib/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/node-gyp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", - "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/promise-spawn": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.0.tgz", - "integrity": "sha512-wBqcGsMELZna0jDblGd7UXgOby45TQaMWmbFwWX+SEotk4HV6zG2t6rT9siyLhPk4P6YYqgfL1UO8nMWDBVJXQ==", - "dev": true, - "dependencies": { - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/run-script": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-7.0.1.tgz", - "integrity": "sha512-Od/JMrgkjZ8alyBE0IzeqZDiF1jgMez9Gkc/OYrCkHHiXNwM0wc6s7+h+xM7kYDZkS0tAoOLr9VvygyE5+2F7g==", - "dev": true, - "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^7.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^3.0.0", - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@schematics/angular": { - "version": "17.0.0-rc.2", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.0.0-rc.2.tgz", - "integrity": "sha512-ZkQiiz2r8onJJEZlxJl9j2X12Tm7ZJaZlnxmbSryT8vkHX8g6xtB9RgLfSAoojrHj0n/io314fFnu9C0tBWsRQ==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "17.0.0-rc.2", - "@angular-devkit/schematics": "17.0.0-rc.2", - "jsonc-parser": "3.2.0" - }, - "engines": { - "node": ">=18.13.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@sigstore/bundle": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.1.0.tgz", - "integrity": "sha512-89uOo6yh/oxaU8AeOUnVrTdVMcGk9Q1hJa7Hkvalc6G3Z3CupWk4Xe9djSgJm9fMkH69s0P0cVHUoKSOemLdng==", - "dev": true, - "dependencies": { - "@sigstore/protobuf-specs": "^0.2.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/protobuf-specs": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", - "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/sign": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.1.0.tgz", - "integrity": "sha512-4VRpfJxs+8eLqzLVrZngVNExVA/zAhVbi4UT4zmtLi4xRd7vz5qie834OgkrGsLlLB1B2nz/3wUxT1XAUBe8gw==", - "dev": true, - "dependencies": { - "@sigstore/bundle": "^2.1.0", - "@sigstore/protobuf-specs": "^0.2.1", - "make-fetch-happen": "^13.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/sign/node_modules/make-fetch-happen": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", - "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", - "dev": true, - "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/tuf": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.2.0.tgz", - "integrity": "sha512-KKATZ5orWfqd9ZG6MN8PtCIx4eevWSuGRKQvofnWXRpyMyUEpmrzg5M5BrCpjM+NfZ0RbNGOh5tCz/P2uoRqOA==", - "dev": true, - "dependencies": { - "@sigstore/protobuf-specs": "^0.2.1", - "tuf-js": "^2.1.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.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/@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, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.0.tgz", - "integrity": "sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg==", - "dev": true, - "dependencies": { - "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.3" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.4", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.4.tgz", - "integrity": "sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.12.tgz", - "integrity": "sha512-ky0kWSqXVxSqgqJvPIkgFkcn4C8MnRog308Ou8xBBIVo39OmUFy+jqNe0nPwLCDFxUpmT9EvT91YzOJgkDRcFg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.37", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.37.tgz", - "integrity": "sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.2.tgz", - "integrity": "sha512-gX2j9x+NzSh4zOhnRPSdPPmTepS4DfxES0AvIFv3jGv5QyeAJf6u6dY5/BAoAJU9Qq1uTvwOku8SSC2GnCRl6Q==", - "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.15", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.15.tgz", - "integrity": "sha512-n91JxbNLD8eQIuXDIChAN1tCKNWCEgpceU9b7ZMbFA+P+Q4yIeh80jizFLEvolRPc1ES0VdwFlGv+kJTSirogw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "8.44.6", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.6.tgz", - "integrity": "sha512-P6bY56TVmX8y9J87jHNgQh43h6VVU+6H7oN7hgvivV81K2XY8qJZ5vqPy/HdUoVIelii2kChYVzQanlswPWVFw==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.6", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.6.tgz", - "integrity": "sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.3.tgz", - "integrity": "sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==", - "dev": true - }, - "node_modules/@types/express": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.20.tgz", - "integrity": "sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw==", - "dev": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.39", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.39.tgz", - "integrity": "sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.3.tgz", - "integrity": "sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA==", - "dev": true - }, - "node_modules/@types/http-proxy": { - "version": "1.17.13", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.13.tgz", - "integrity": "sha512-GkhdWcMNiR5QSQRYnJ+/oXzu0+7JJEPC8vkWXK351BkhjraZF+1W13CUYARUvX9+NqIU2n6YHA4iwywsc/M6Sw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", - "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", - "dev": true - }, - "node_modules/@types/mime": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.4.tgz", - "integrity": "sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.8.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.7.tgz", - "integrity": "sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==", - "dev": true, - "dependencies": { - "undici-types": "~5.25.1" - } - }, - "node_modules/@types/node-forge": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.8.tgz", - "integrity": "sha512-vGXshY9vim9CJjrpcS5raqSjEfKlJcWy2HNdgUasR66fAnVEYarrf1ULV4nfvpC1nZq/moA9qyqBcu83x+Jlrg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/qs": { - "version": "6.9.9", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.9.tgz", - "integrity": "sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==", - "dev": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.6.tgz", - "integrity": "sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA==", - "dev": true - }, - "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/send": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.3.tgz", - "integrity": "sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug==", - "dev": true, - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.3.tgz", - "integrity": "sha512-4KG+yMEuvDPRrYq5fyVm/I2uqAJSAwZK9VSa+Zf+zUq9/oxSSvy3kkIqyL+jjStv6UCVi8/Aho0NHtB1Fwosrg==", - "dev": true, - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.4.tgz", - "integrity": "sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw==", - "dev": true, - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.35", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.35.tgz", - "integrity": "sha512-tIF57KB+ZvOBpAQwSaACfEu7htponHXaFzP7RfKYgsOS0NoYnn+9+jzp7bbq4fWerizI3dTB4NfAZoyeQKWJLw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/ws": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.8.tgz", - "integrity": "sha512-flUksGIQCnJd6sZ1l5dqCEG/ksaoAg/eUwiLAGTJQcfgvZJKF++Ta4bJA6A5aPSJmsr+xlseHn4KLgVlNnvPTg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz", - "integrity": "sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==", - "dev": true, - "engines": { - "node": ">=14.6.0" - }, - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dev": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "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/@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/@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/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/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/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, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "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, - "dependencies": { - "loader-utils": "^2.0.0", - "regex-parser": "^2.2.11" - }, - "engines": { - "node": ">=8.9" - } - }, - "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, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", - "dev": true, - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "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==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "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" - } - }, - "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, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "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, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "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, - "engines": { - "node": ">=6" - } - }, - "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, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "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, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "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==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "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/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/async-each-series": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", - "integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", - "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" - } - ], - "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", - "dev": true, - "dependencies": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5" - } - }, - "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==", - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", - "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.3", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "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, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.5.tgz", - "integrity": "sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.3", - "core-js-compat": "^3.32.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", - "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.3" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.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==", - "dev": true - }, - "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, - "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==", - "dev": true, - "engines": { - "node": "^4.5.0 || >= 5.9" - } - }, - "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==", - "dev": true, - "engines": { - "node": "*" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "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==", - "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" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "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/body-parser/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, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/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==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/bonjour-service": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", - "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", - "dev": true, - "dependencies": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "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==", - "dev": true, - "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==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-sync": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.29.3.tgz", - "integrity": "sha512-NiM38O6XU84+MN+gzspVmXV2fTOoe+jBqIBx3IBdhZrdeURr6ZgznJr/p+hQ+KzkKEiGH/GcC4SQFSL0jV49bg==", - "dev": true, - "dependencies": { - "browser-sync-client": "^2.29.3", - "browser-sync-ui": "^2.29.3", - "bs-recipes": "1.3.4", - "chalk": "4.1.2", - "chokidar": "^3.5.1", - "connect": "3.6.6", - "connect-history-api-fallback": "^1", - "dev-ip": "^1.0.1", - "easy-extender": "^2.3.4", - "eazy-logger": "^4.0.1", - "etag": "^1.8.1", - "fresh": "^0.5.2", - "fs-extra": "3.0.1", - "http-proxy": "^1.18.1", - "immutable": "^3", - "localtunnel": "^2.0.1", - "micromatch": "^4.0.2", - "opn": "5.3.0", - "portscanner": "2.2.0", - "raw-body": "^2.3.2", - "resp-modifier": "6.0.2", - "rx": "4.1.0", - "send": "0.16.2", - "serve-index": "1.9.1", - "serve-static": "1.13.2", - "server-destroy": "1.0.1", - "socket.io": "^4.4.1", - "ua-parser-js": "^1.0.33", - "yargs": "^17.3.1" - }, - "bin": { - "browser-sync": "dist/bin.js" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/browser-sync-client": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.29.3.tgz", - "integrity": "sha512-4tK5JKCl7v/3aLbmCBMzpufiYLsB1+UI+7tUXCCp5qF0AllHy/jAqYu6k7hUF3hYtlClKpxExWaR+rH+ny07wQ==", - "dev": true, - "dependencies": { - "etag": "1.8.1", - "fresh": "0.5.2", - "mitt": "^1.1.3" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/browser-sync-ui": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.29.3.tgz", - "integrity": "sha512-kBYOIQjU/D/3kYtUIJtj82e797Egk1FB2broqItkr3i4eF1qiHbFCG6srksu9gWhfmuM/TNG76jMfzAdxEPakg==", - "dev": true, - "dependencies": { - "async-each-series": "0.1.1", - "chalk": "4.1.2", - "connect-history-api-fallback": "^1", - "immutable": "^3", - "server-destroy": "1.0.1", - "socket.io-client": "^4.4.1", - "stream-throttle": "^0.1.3" - } - }, - "node_modules/browser-sync-ui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/browser-sync-ui/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/browser-sync-ui/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/browser-sync-ui/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/browser-sync-ui/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-sync-ui/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-sync/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/browser-sync/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/browser-sync/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/browser-sync/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/browser-sync/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-sync/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-recipes": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", - "integrity": "sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==", - "dev": true - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "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/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacache": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.0.tgz", - "integrity": "sha512-I7mVOPl3PUCeRub1U8YoGz2Lqv9WOBpobZ8RyWFXmReuILz+3OAyTa5oH3QPdtKZD7N0Yk00aLfzn0qvp8dZ1w==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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/caniuse-lite": { - "version": "1.0.30001551", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001551.tgz", - "integrity": "sha512-vtBAez47BoGMMzlbYhfXrMV1kvRF2WP/lqiMuDu1Sb4EE4LKEgjopFDSRtZfdVnslNRpOqV/woE+Xgrwj6VQlg==", - "dev": true, - "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" - } - ] - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "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/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "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" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "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, - "engines": { - "node": ">=6.0" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.1.tgz", - "integrity": "sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, - "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==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cliui/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/cliui/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/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==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "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, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "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==", - "dev": true, - "bin": { - "color-support": "bin.js" - } - }, - "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 - }, - "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/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 - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "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, - "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" - } - }, - "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/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, - "dependencies": { - "ms": "2.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.6.6", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", - "integrity": "sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.0", - "parseurl": "~1.3.2", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "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, - "dependencies": { - "ms": "2.0.0" - } - }, - "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==", - "dev": true, - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "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, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "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==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "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==", - "dev": true, - "dependencies": { - "is-what": "^3.14.1" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "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==", - "dev": true, - "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" - } - }, - "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==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/core-js-compat": { - "version": "3.33.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.0.tgz", - "integrity": "sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw==", - "dev": true, - "dependencies": { - "browserslist": "^4.22.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "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/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, - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/cosmiconfig/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/cosmiconfig/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/critters": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz", - "integrity": "sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "css-select": "^5.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.2", - "htmlparser2": "^8.0.2", - "postcss": "^8.4.23", - "pretty-bytes": "^5.3.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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "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==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/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==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cross-spawn/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/cross-spawn/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, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-loader": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", - "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", - "dev": true, - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.21", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.3", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "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, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/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, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "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==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "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==", - "dev": true, - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "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, - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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/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, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==", - "dev": true - }, - "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/dev-ip": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", - "integrity": "sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==", - "dev": true, - "bin": { - "dev-ip": "lib/dev-ip.js" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "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==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "dev": true, - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "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, - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "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" - } - ] - }, - "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, - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dev": true, - "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/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/easy-extender": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", - "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", - "dev": true, - "dependencies": { - "lodash": "^4.17.10" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/eazy-logger": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-4.0.1.tgz", - "integrity": "sha512-2GSFtnnC6U4IEKhEI7+PvdxrmjJ04mdsj3wHZTFiw0tUtG4HCWzTr13ZYTk8XOGnA1xQMaDljoBOYlk3D/MMSw==", - "dev": true, - "dependencies": { - "chalk": "4.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/eazy-logger/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eazy-logger/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eazy-logger/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eazy-logger/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/eazy-logger/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eazy-logger/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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.559", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.559.tgz", - "integrity": "sha512-iS7KhLYCSJbdo3rUSkhDTVuFNCV34RKs2UaB9Ecr7VlqzjjWW//0nfsFF5dtDmyXlZQaDYYtID5fjtC/6lpRug==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "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, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/engine.io": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.3.tgz", - "integrity": "sha512-IML/R4eG/pUS5w7OfcDE0jKrljWS9nwnEfsxWCIJF5eO6AHo6+Hlv+lQbdlAYsiJPHzUthLm1RUjnBzWOs45cw==", - "dev": true, - "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.2.1", - "ws": "~8.11.0" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/engine.io-client": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.2.tgz", - "integrity": "sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg==", - "dev": true, - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.11.0", - "xmlhttprequest-ssl": "~2.0.0" - } - }, - "node_modules/engine.io-parser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", - "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "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==", - "dev": true, - "optional": true, - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, - "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, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-module-lexer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", - "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.5.tgz", - "integrity": "sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.19.5", - "@esbuild/android-arm64": "0.19.5", - "@esbuild/android-x64": "0.19.5", - "@esbuild/darwin-arm64": "0.19.5", - "@esbuild/darwin-x64": "0.19.5", - "@esbuild/freebsd-arm64": "0.19.5", - "@esbuild/freebsd-x64": "0.19.5", - "@esbuild/linux-arm": "0.19.5", - "@esbuild/linux-arm64": "0.19.5", - "@esbuild/linux-ia32": "0.19.5", - "@esbuild/linux-loong64": "0.19.5", - "@esbuild/linux-mips64el": "0.19.5", - "@esbuild/linux-ppc64": "0.19.5", - "@esbuild/linux-riscv64": "0.19.5", - "@esbuild/linux-s390x": "0.19.5", - "@esbuild/linux-x64": "0.19.5", - "@esbuild/netbsd-x64": "0.19.5", - "@esbuild/openbsd-x64": "0.19.5", - "@esbuild/sunos-x64": "0.19.5", - "@esbuild/win32-arm64": "0.19.5", - "@esbuild/win32-ia32": "0.19.5", - "@esbuild/win32-x64": "0.19.5" - } - }, - "node_modules/esbuild-wasm": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.19.5.tgz", - "integrity": "sha512-7zmLLn2QCj93XfMmHtzrDJ1UBuOHB2CZz1ghoCEZiRajxjUvHsF40PnbzFIY/pmesqPRaEtEWii0uzsTbnAgrA==", - "dev": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "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, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "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==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "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, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/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, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "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, - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "engines": { - "node": ">= 0.6" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "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" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/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/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "dev": true - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dev": true, - "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" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "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/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, - "engines": { - "node": ">= 0.6" - } - }, - "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, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "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, - "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" - }, - "engines": { - "node": ">= 0.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/express/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, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/express/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/express/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==", - "dev": true, - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "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, - "engines": { - "node": ">= 0.8" - } - }, - "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, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "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.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.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/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "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, - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/figures": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", - "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^5.0.0", - "is-unicode-supported": "^1.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.1", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.3.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "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, - "dependencies": { - "ms": "2.0.0" - } - }, - "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 - }, - "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, - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "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, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", - "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^3.0.0", - "universalify": "^0.1.0" - } - }, - "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, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", - "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==", - "dev": true - }, - "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, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "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, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "dev": true, - "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" - } - }, - "node_modules/gauge/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/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==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "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==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/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, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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, - "dependencies": { - "is-glob": "^4.0.1" - }, - "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==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "dev": true, - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "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" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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 - }, - "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": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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==", - "dev": true, - "dependencies": { - "@assemblyscript/loader": "^0.10.1", - "base64-js": "^1.2.0", - "pako": "^1.0.3" - } - }, - "node_modules/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 - }, - "node_modules/hosted-git-info": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", - "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", - "dev": true, - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "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_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, - "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 - }, - "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, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/html-entities": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", - "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ] - }, - "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "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 - }, - "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, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "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, - "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 - }, - "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, - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-agent": { - "version": "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, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-agent/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==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "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==", - "dev": true, - "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/https-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "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==", - "dev": true, - "dependencies": { - "ms": "^2.0.0" - } - }, - "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, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "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, - "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/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-walk": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz", - "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==", - "dev": true, - "dependencies": { - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "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, - "optional": true, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/immutable": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", - "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/inquirer": { - "version": "9.2.11", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.11.tgz", - "integrity": "sha512-B2LafrnnhbRzCWfAdOXisUzL89Kg8cVJlYmhqoi3flSiV/TveO+nsXwgKr9h9PIo+J1hz7nBSk6gegRIMBBf7g==", - "dev": true, - "dependencies": { - "@ljharb/through": "^2.3.9", - "ansi-escapes": "^4.3.2", - "chalk": "^5.3.0", - "cli-cursor": "^3.1.0", - "cli-width": "^4.1.0", - "external-editor": "^3.1.0", - "figures": "^5.0.0", - "lodash": "^4.17.21", - "mute-stream": "1.0.0", - "ora": "^5.4.1", - "run-async": "^3.0.0", - "rxjs": "^7.8.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "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.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", - "dev": true, - "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 - }, - "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, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "engines": { - "node": ">=8" - } - }, - "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-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-like": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", - "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", - "dev": true, - "dependencies": { - "lodash.isfinite": "^3.3.2" - } - }, - "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, - "engines": { - "node": ">=10" - }, - "funding": { - "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==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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/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, - "engines": { - "node": ">=16" - } - }, - "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, - "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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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, - "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/istanbul-lib-instrument/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, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "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, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jiti": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", - "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", - "dev": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "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==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=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/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "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, - "dependencies": { - "source-map-support": "^0.5.5" - } - }, - "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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/launch-editor": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", - "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", - "dev": true, - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, - "node_modules/less": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", - "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", - "dev": true, - "dependencies": { - "copy-anything": "^2.0.1", - "parse-node-version": "^1.0.1", - "tslib": "^2.3.0" - }, - "bin": { - "lessc": "bin/lessc" - }, - "engines": { - "node": ">=6" - }, - "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/less-loader": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", - "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", - "dev": true, - "dependencies": { - "klona": "^2.0.4" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "less": "^3.5.0 || ^4.0.0", - "webpack": "^5.0.0" - } - }, - "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, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "dependencies": { - "webpack-sources": "^3.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-sources": { - "optional": true - } - } - }, - "node_modules/limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", - "dev": true - }, - "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==", - "dev": true, - "engines": { - "node": ">=6.11.5" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/localtunnel": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz", - "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==", - "dev": true, - "dependencies": { - "axios": "0.21.4", - "debug": "4.3.2", - "openurl": "1.1.1", - "yargs": "17.1.1" - }, - "bin": { - "lt": "bin/lt.js" - }, - "engines": { - "node": ">=8.3.0" - } - }, - "node_modules/localtunnel/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/localtunnel/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, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/localtunnel/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/localtunnel/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/localtunnel/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/localtunnel/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, - "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/localtunnel/node_modules/yargs": { - "version": "17.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", - "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", - "dev": true, - "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" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/localtunnel/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, - "engines": { - "node": ">=10" - } - }, - "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, - "dependencies": { - "p-locate": "^4.1.0" - }, - "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.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.isfinite": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", - "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", - "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==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "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/@lmdb/lmdb-linux-arm64": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.2.tgz", + "integrity": "sha512-4hdgZtWI1idQlWRp+eleWXD9KLvObgboRaVoBj2POdPEYvsKANllvMW0El8tEQwtw74yB9NT6P8ENBB5UJf5+g==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "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/@lmdb/lmdb-linux-x64": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.2.tgz", + "integrity": "sha512-A0zjf4a2vM4B4GAx78ncuOTZ8Ka1DbTaG1Axf1e00Sa7f5coqlWiLg1PX7Gxvyibc2YqtqB+8tg1KKrE8guZVw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "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/@lmdb/lmdb-win32-x64": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.2.tgz", + "integrity": "sha512-Y0qoSCAja+xZE7QQ0LCHoYAuyI1n9ZqukQJa8lv9X3yCvWahFF7OYHAgVH1ejp43XWstj3U89/PAAzcowgF/uQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.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 + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "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/@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, - "engines": { - "node": ">=8" - } + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "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/@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, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "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==", + "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, - "dependencies": { - "yallist": "^3.0.2" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "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": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "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/@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, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } + "os": [ + "linux" + ] }, - "node_modules/make-dir/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "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, - "bin": { - "semver": "bin/semver" - } + "os": [ + "win32" + ] }, - "node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "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, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "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": "^10.0.0" - }, + "license": "MIT", + "optional": true, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/make-fetch-happen/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==", - "dev": true, - "dependencies": { - "debug": "4" + "node": ">= 10" }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/cacache": { - "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^7.7.1", - "minipass": "^7.0.3", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" + "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": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 10" } }, - "node_modules/make-fetch-happen/node_modules/cacache/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "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, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">= 10" } }, - "node_modules/make-fetch-happen/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/@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": { - "agent-base": "6", - "debug": "4" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 6" + "node": ">= 10" } }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "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, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=12" + "node": ">= 10" } }, - "node_modules/make-fetch-happen/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "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": ">=8" + "node": ">= 10" } }, - "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/@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, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.6" + "node": ">= 10" } }, - "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "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": { - "fs-monkey": "^1.0.4" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 4.0.0" + "node": ">= 10" } }, - "node_modules/merge-descriptors": { + "node_modules/@napi-rs/nice-linux-arm64-musl": { "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 - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "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, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": ">= 10" } }, - "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/@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, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.6" + "node": ">= 10" } }, - "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/@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, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8.6" + "node": ">= 10" } }, - "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/@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, - "bin": { - "mime": "cli.js" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4" + "node": ">= 10" } }, - "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/@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, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.6" + "node": ">= 10" } }, - "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/@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, - "dependencies": { - "mime-db": "1.52.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.6" + "node": ">= 10" } }, - "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/@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": ">=6" + "node": ">= 10" } }, - "node_modules/mini-css-extract-plugin": { - "version": "2.7.6", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", - "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", + "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, - "dependencies": { - "schema-utils": "^4.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" + "node": ">= 10" } }, - "node_modules/minimalistic-assert": { + "node_modules/@napi-rs/nice-win32-x64-msvc": { "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 + "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/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "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==", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 8" } }, - "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "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==", "dev": true, + "license": "MIT", "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">= 8" } }, - "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/@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==", "dev": true, + "license": "MIT", "dependencies": { - "minipass": "^3.0.0" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { "node": ">= 8" } }, - "node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "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": { - "yallist": "^4.0.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": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/minipass-collect/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 - }, - "node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "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, - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } + "license": "ISC" }, - "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/@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": { - "minipass": "^3.0.0" + "semver": "^7.3.5" }, "engines": { - "node": ">= 8" + "node": "^18.17.0 || >=20.5.0" } }, - "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==", + "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": { - "yallist": "^4.0.0" + "@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": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "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 - }, - "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/@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, - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } + "license": "ISC" }, - "node_modules/minipass-json-stream/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "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, + "license": "ISC", "dependencies": { - "yallist": "^4.0.0" + "npm-bundled": "^4.0.0", + "npm-normalize-package-bin": "^4.0.0" + }, + "bin": { + "installed-package-contents": "bin/index.js" }, "engines": { - "node": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/minipass-json-stream/node_modules/yallist": { + "node_modules/@npmcli/node-gyp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "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": "^18.17.0 || >=20.5.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/@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": { - "minipass": "^3.0.0" + "@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": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "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==", + "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": { - "yallist": "^4.0.0" + "which": "^5.0.0" }, "engines": { - "node": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "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 + "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, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } }, - "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/@npmcli/run-script": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.0.2.tgz", + "integrity": "sha512-cJXiUlycdizQwvqE1iaAb4VRUM3RX09/8q46zjvy+ct9GhfZRWd7jXYVc1tn/CfRlGPVkX/u4sstRlepsm7hfw==", "dev": true, + "license": "ISC", "dependencies": { - "minipass": "^3.0.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" }, "engines": { - "node": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "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==", + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, "dependencies": { - "yallist": "^4.0.0" + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/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 - }, - "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/@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, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 8" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "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==", + "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, - "dependencies": { - "yallist": "^4.0.0" + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=8" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/minizlib/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 + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/mitt": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", - "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", - "dev": true + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "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, - "bin": { - "mkdirp": "bin/cmd.js" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "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==", - "dev": true + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/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/@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, - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" }, - "bin": { - "multicast-dns": "cli.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "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==", + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "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, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/needle": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", - "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", + "node_modules/@parcel/watcher/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", "dev": true, + "license": "Apache-2.0", "optional": true, - "dependencies": { - "debug": "^3.2.6", - "iconv-lite": "^0.6.3", - "sax": "^1.2.4" - }, "bin": { - "needle": "bin/needle" + "detect-libc": "bin/detect-libc.js" }, "engines": { - "node": ">= 4.4.x" + "node": ">=0.10" } }, - "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==", + "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, - "optional": true, - "dependencies": { - "ms": "^2.1.1" - } + "license": "MIT", + "optional": true }, - "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/@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, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=14" } }, - "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/@rollup/rollup-android-arm-eabi": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz", + "integrity": "sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==", + "cpu": [ + "arm" + ], "dev": true, - "engines": { - "node": ">= 0.6" - } + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, - "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/@rollup/rollup-android-arm64": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz", + "integrity": "sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, - "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/@rollup/rollup-darwin-arm64": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz", + "integrity": "sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==", + "cpu": [ + "arm64" + ], "dev": true, - "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ - "!win32" + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz", + "integrity": "sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==", + "cpu": [ + "x64" ], - "dependencies": { - "node-addon-api": "^3.0.0", - "node-gyp-build": "^4.2.2" - } + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "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==", + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz", + "integrity": "sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==", + "cpu": [ + "arm64" + ], "dev": true, - "optional": true + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] }, - "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/@rollup/rollup-freebsd-x64": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz", + "integrity": "sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==", + "cpu": [ + "x64" + ], "dev": true, - "engines": { - "node": ">= 6.13.0" - } + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/node-gyp": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", - "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz", + "integrity": "sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^11.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" - }, - "engines": { - "node": "^12.13 || ^14.13 || >=16" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/node-gyp-build": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz", - "integrity": "sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==", + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz", + "integrity": "sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==", + "cpu": [ + "arm" + ], "dev": true, + "license": "MIT", "optional": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } + "os": [ + "linux" + ] }, - "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/@rollup/rollup-linux-arm64-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz", + "integrity": "sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "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/@rollup/rollup-linux-arm64-musl": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz", + "integrity": "sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==", + "cpu": [ + "arm64" + ], "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" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/node-gyp/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/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz", + "integrity": "sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "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/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz", + "integrity": "sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/node-gyp/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/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz", + "integrity": "sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==", + "cpu": [ + "riscv64" + ], "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz", + "integrity": "sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "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/@rollup/rollup-linux-x64-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz", + "integrity": "sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/normalize-package-data": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", - "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz", + "integrity": "sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "hosted-git-info": "^7.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "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==", + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz", + "integrity": "sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==", + "cpu": [ + "arm64" + ], "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz", + "integrity": "sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "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/@rollup/rollup-win32-x64-msvc": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz", + "integrity": "sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==", + "cpu": [ + "x64" + ], "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/npm-bundled": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", - "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", + "node_modules/@schematics/angular": { + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.8.tgz", + "integrity": "sha512-ytgClbMPn+i+w1S3QukR/Vdge+sfU9aX49ao+XRwoWdOssHUjmVjQcCEdzu0ucSrNPZnhm34bdDPzADLhln60w==", "dev": true, + "license": "MIT", "dependencies": { - "npm-normalize-package-bin": "^3.0.0" + "@angular-devkit/core": "19.1.8", + "@angular-devkit/schematics": "19.1.8", + "jsonc-parser": "3.3.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.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/npm-install-checks": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", - "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", + "node_modules/@sigstore/bundle": { + "version": "3.1.0", + "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": { - "semver": "^7.1.1" + "@sigstore/protobuf-specs": "^0.4.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "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": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm-package-arg": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", - "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", + "node_modules/@sigstore/protobuf-specs": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.0.tgz", + "integrity": "sha512-o09cLSIq9EKyRXwryWDOJagkml9XgQCoCSRjHOnHLnvsivaW7Qznzz6yjfV7PHJHhIvyp8OH7OX8w0Dc5bQK7A==", "dev": true, - "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, + "license": "Apache-2.0", "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm-packlist": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.0.tgz", - "integrity": "sha512-ErAGFB5kJUciPy1mmx/C2YFbvxoJ0QJ9uwkCZOeR6CqLLISPZBOiFModAbSXnjjlwW5lOhuhXva+fURsSGJqyw==", + "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": { - "ignore-walk": "^6.0.0" + "@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": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm-pick-manifest": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.0.0.tgz", - "integrity": "sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==", + "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": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^11.0.0", - "semver": "^7.3.5" + "@sigstore/protobuf-specs": "^0.4.0", + "tuf-js": "^3.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm-registry-fetch": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-16.1.0.tgz", - "integrity": "sha512-PQCELXKt8Azvxnt5Y85GseQDJJlglTFM9L9U9gkv2y4e9s0k3GVDdOx3YoB6gm2Do0hlkzC39iCGXby+Wve1Bw==", + "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": { - "make-fetch-happen": "^13.0.0", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^11.0.0", - "proc-log": "^3.0.0" + "@sigstore/bundle": "^3.1.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.4.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", - "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", + "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, - "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" - }, + "license": "MIT", "engines": { "node": "^16.14.0 || >=18.0.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/@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": { - "path-key": "^3.0.0" + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.5" }, "engines": { - "node": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "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/@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, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "license": "MIT" }, - "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/@types/node": { + "version": "22.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", + "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" + "undici-types": "~6.20.0" } }, - "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/@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/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "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, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true + "license": "BSD-2-Clause" }, - "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==", + "node_modules/abbrev": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz", + "integrity": "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==", "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, + "license": "ISC", "engines": { - "node": ">= 0.8" + "node": "^18.17.0 || >=20.5.0" } }, - "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/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": ">= 0.8" + "node": ">= 14" } }, - "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==", + "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": { - "wrappy": "1" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "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, + "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" + "ajv": "^8.0.0" }, - "engines": { - "node": ">=6" + "peerDependencies": { + "ajv": "^8.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "node_modules/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, + "license": "MIT", "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" + "type-fest": "^0.21.3" }, "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/openurl": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", - "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==", - "dev": true - }, - "node_modules/opn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", - "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", - "dev": true, - "dependencies": { - "is-wsl": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/opn/node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, - "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" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/ora/node_modules/ansi-styles": { + "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -8754,3453 +3080,3634 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=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/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/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, + "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/beasties": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.2.0.tgz", + "integrity": "sha512-Ljqskqx/tbZagIglYoJIMzH5zgssyp+in9+9sAyh15N22AornBeIDnb8EZ6Rk+6ShfMxd92uO3gfpT0NtZbpow==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "htmlparser2": "^9.1.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.49", + "postcss-media-query-parser": "^0.2.3" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=14.0.0" } }, - "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/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": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.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/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, + "license": "ISC" }, - "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/brace-expansion": { + "version": "2.0.1", + "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" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, "engines": { "node": ">=8" } }, - "node_modules/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/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "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": ">=8" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "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/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, - "engines": { - "node": ">=0.10.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": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "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/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": { - "p-try": "^2.0.0" + "@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": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^18.17.0 || >=20.5.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/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, - "dependencies": { - "p-limit": "^2.2.0" - }, + "license": "BlueOak-1.0.0", "engines": { - "node": ">=8" + "node": ">=18" } }, - "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/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, - "dependencies": { - "aggregate-error": "^3.0.0" + "license": "ISC" + }, + "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, + "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/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "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": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" + "@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": ">=8" + "node": ">=18" } }, - "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/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": ">= 4" + "node": ">=18" } }, - "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/caniuse-lite": { + "version": "1.0.30001700", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001700.tgz", + "integrity": "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==", "dev": true, - "engines": { - "node": ">=6" - } + "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/pacote": { - "version": "17.0.4", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-17.0.4.tgz", - "integrity": "sha512-eGdLHrV/g5b5MtD5cTPyss+JxOlaOloSMG3UwPMAvL8ywaLJ6beONPF40K4KKl/UI6q5hTKCJq5rCu8tkF+7Dg==", + "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": { - "@npmcli/git": "^5.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^7.0.0", - "@npmcli/run-script": "^7.0.0", - "cacache": "^18.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^7.0.2", - "npm-package-arg": "^11.0.0", - "npm-packlist": "^8.0.0", - "npm-pick-manifest": "^9.0.0", - "npm-registry-fetch": "^16.0.0", - "proc-log": "^3.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^7.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^2.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "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/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "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/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, + "license": "MIT", "dependencies": { - "callsites": "^3.0.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">=6" + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "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": ">=10" } }, - "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/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": { - "@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" + "restore-cursor": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" }, "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/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.10" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "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": { - "entities": "^4.4.0" + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" }, "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "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, - "dependencies": { - "entities": "^4.3.0", - "parse5": "^7.0.0", - "parse5-sax-parser": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "license": "ISC", + "engines": { + "node": ">= 12" } }, - "node_modules/parse5-sax-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", - "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", + "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==", "dev": true, + "license": "ISC", "dependencies": { - "parse5": "^7.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "engines": { + "node": ">=12" } }, - "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/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==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "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/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==", + "dev": true, + "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==", "dev": true, + "license": "MIT", "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/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==", "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.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/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==", "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { "node": ">=8" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "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==", "dev": true, + "license": "MIT", "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "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": "14 || >=16.14" + "node": ">=0.8" } }, - "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/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=8" + "node": ">=7.0.0" } }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } + "license": "MIT" }, - "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/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true, - "optional": true, - "engines": { - "node": ">=6" - } + "license": "MIT" }, - "node_modules/piscina": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.1.0.tgz", - "integrity": "sha512-sjbLMi3sokkie+qmtZpkfMCUJTpbxJm/wvaPzU28vmYSsTSW8xk9JcFUsbqGJdtPpIQ9tuj+iDcTtgZjwnOSig==", + "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": { - "eventemitter-asyncresource": "^1.0.0", - "hdr-histogram-js": "^2.0.1", - "hdr-histogram-percentiles-obj": "^3.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, - "optionalDependencies": { - "nice-napi": "^1.0.2" + "engines": { + "node": ">= 8" } }, - "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==", + "node_modules/cross-spawn/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/cross-spawn/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, + "license": "ISC", "dependencies": { - "find-up": "^6.3.0" + "isexe": "^2.0.0" }, - "engines": { - "node": ">=14.16" + "bin": { + "node-which": "bin/node-which" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 8" } }, - "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==", + "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": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "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/sindresorhus" + "url": "https://github.com/sponsors/fb55" } }, - "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==", + "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": { - "p-locate": "^6.0.0" - }, + "license": "BSD-2-Clause", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/fb55" } }, - "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==", + "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==", "dev": true, + "license": "MIT", "dependencies": { - "yocto-queue": "^1.0.0" + "ms": "^2.1.3" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "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==", + "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": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "clone": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "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": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=8" } }, - "node_modules/portscanner": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", - "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", + "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": { - "async": "^2.6.0", - "is-number-like": "^1.0.3" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, - "engines": { - "node": ">=0.4", - "npm": ">=1.0.0" + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "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": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, { "type": "github", - "url": "https://github.com/sponsors/ai" + "url": "https://github.com/sponsors/fb55" } ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } + "license": "BSD-2-Clause" }, - "node_modules/postcss-loader": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz", - "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==", + "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": { - "cosmiconfig": "^8.2.0", - "jiti": "^1.18.2", - "semver": "^7.3.8" + "domelementtype": "^2.3.0" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "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/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": "^10 || ^12 || >= 14" + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" }, - "peerDependencies": { - "postcss": "^8.1.0" + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", - "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", + "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, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.102", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.102.tgz", + "integrity": "sha512-eHhqaja8tE/FNpIiBrvBjFV/SSKpyWHLvxuR9dPTdo+3V9ppdLmFB7ZZQ98qNovcngPLYIz0oOBF9P0FfZef5Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" + }, + "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": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "iconv-lite": "^0.6.2" } }, - "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/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": { - "postcss-selector-parser": "^6.0.4" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">=0.10.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/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, - "dependencies": { - "icss-utils": "^5.0.0" - }, + "license": "BSD-2-Clause", "engines": { - "node": "^10 || ^12 || >= 14" + "node": ">=0.12" }, - "peerDependencies": { - "postcss": "^8.1.0" + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "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": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=6" } }, - "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/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/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "node_modules/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": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "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 + "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==", + "node_modules/esbuild": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "dev": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=10" + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" } }, - "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/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, + "license": "MIT", "engines": { - "node": ">= 0.10" + "node": ">=6" } }, - "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/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "dev": true, - "engines": { - "node": ">= 0.10" - } + "license": "MIT" }, - "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/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, - "optional": true + "license": "Apache-2.0" }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "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": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "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/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==", "dev": true, + "license": "MIT", "dependencies": { - "side-channel": "^1.0.4" + "@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": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8.6.0" } }, - "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==", + "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, "funding": [ { "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "url": "https://github.com/sponsors/fastify" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "opencollective", + "url": "https://opencollective.com/fastify" } - ] + ], + "license": "BSD-3-Clause" }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/fastq": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", + "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", "dev": true, + "license": "ISC", "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "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, - "engines": { - "node": ">= 0.6" + "reusify": "^1.0.4" } }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/read-package-json": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-7.0.0.tgz", - "integrity": "sha512-uL4Z10OKV4p6vbdvIXB+OzhInYtIozl/VxUBPgNkBuUi2DeRonnuspmaVAMcrkmfjKGNmRndyQAbE7/AmzGwFg==", + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", "dev": true, + "license": "ISC", "dependencies": { - "glob": "^10.2.2", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0" + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/read-package-json-fast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", - "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "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": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" + "minipass": "^7.0.3" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "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": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/read-package-json/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "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, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/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==", "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, + "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=6.9.0" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "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==", "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, + "license": "ISC", "engines": { - "node": ">=8.10.0" + "node": "6.* || 8.* || >= 10.*" } }, - "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==", - "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 - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "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": { - "regenerate": "^1.4.2" - }, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "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": { - "@babel/runtime": "^7.8.4" + "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": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "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": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=4" + "node": ">= 6" } }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "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, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } + "license": "BSD-2-Clause" }, - "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/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, - "bin": { - "jsesc": "bin/jsesc" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "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/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": ">=0.10.0" - } + "license": "ISC" }, - "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/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": ">=0.10.0" + "node": ">=8" } }, - "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.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "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": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "function-bind": "^1.1.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "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/hosted-git-info": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.2.tgz", + "integrity": "sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==", "dev": true, + "license": "ISC", "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" + "lru-cache": "^10.0.1" }, "engines": { - "node": ">=12" + "node": "^18.17.0 || >=20.5.0" } }, - "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/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/htmlparser2": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" } }, - "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/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, - "engines": { - "node": ">=0.10.0" - } + "license": "BSD-2-Clause" }, - "node_modules/resp-modifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", - "integrity": "sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw==", + "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": { - "debug": "^2.2.0", - "minimatch": "^3.0.2" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 14" } }, - "node_modules/resp-modifier/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/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, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/resp-modifier/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/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": { - "ms": "2.0.0" + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/resp-modifier/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/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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": "BSD-3-Clause" + }, + "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": { - "brace-expansion": "^1.1.7" + "minimatch": "^9.0.0" }, "engines": { - "node": "*" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/resp-modifier/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/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/immutable": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", + "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, + "license": "MIT" + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.8.19" } }, - "node_modules/restore-cursor/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/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" }, - "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/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": ">= 4" + "node": "^18.17.0 || >=20.5.0" } }, - "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/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": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">= 12" } }, - "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/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": { - "glob": "^7.1.3" + "hasown": "^2.0.2" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "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/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": { - "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": "*" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "is-extglob": "^2.1.1" }, "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "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, - "bin": { - "rollup": "dist/bin/rollup" - }, + "license": "MIT", "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=8" } }, - "node_modules/run-async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", - "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.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/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, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rx": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", - "integrity": "sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==", - "dev": true - }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dependencies": { - "tslib": "^2.1.0" + "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/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==", + "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, - "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 + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } }, - "node_modules/sass": { - "version": "1.69.5", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.5.tgz", - "integrity": "sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==", + "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": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" + "@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": ">=14.0.0" + "node": ">=10" } }, - "node_modules/sass-loader": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz", - "integrity": "sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==", + "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": { - "neo-async": "^2.6.2" - }, - "engines": { - "node": ">= 14.15.0" + "@isaacs/cliui": "^8.0.2" }, "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 || ^8.0.0 || ^9.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" + "url": "https://github.com/sponsors/isaacs" }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - } + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/sass/node_modules/immutable": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", - "dev": true + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" }, - "node_modules/sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "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, - "optional": true + "license": "MIT" }, - "node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" }, "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">=6" } }, - "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.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "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, - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "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, - "dependencies": { - "lru-cache": "^6.0.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==", + "dev": true, + "license": "MIT", "bin": { - "semver": "bin/semver.js" + "json5": "lib/cli.js" }, "engines": { - "node": ">=10" + "node": ">=6" } }, - "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/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, + "license": "MIT" + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "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": { - "yallist": "^4.0.0" + "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": ">=10" + "node": ">=18.0.0" } }, - "node_modules/semver/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 + "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, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "node_modules/send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "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": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "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/lmdb": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.2.2.tgz", + "integrity": "sha512-LriG93la4PbmPMwI7Hbv8W+0ncLK7549w4sbZSi4QGDjnnxnmNMgxUkaQTEMzH8TpwsfFvgEjpLX7V8B/I9e3g==", "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, "dependencies": { - "ms": "2.0.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" + }, + "bin": { + "download-lmdb-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@lmdb/lmdb-darwin-arm64": "3.2.2", + "@lmdb/lmdb-darwin-x64": "3.2.2", + "@lmdb/lmdb-linux-arm": "3.2.2", + "@lmdb/lmdb-linux-arm64": "3.2.2", + "@lmdb/lmdb-linux-x64": "3.2.2", + "@lmdb/lmdb-win32-x64": "3.2.2" } }, - "node_modules/send/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/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": ">= 0.6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/send/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/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": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "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": ">= 0.6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/send/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/send/node_modules/mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "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, - "bin": { - "mime": "cli.js" + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/send/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/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/send/node_modules/statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "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, + "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "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": { - "randombytes": "^2.1.0" + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/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": { - "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" + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "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/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": { - "ms": "2.0.0" - } - }, - "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, + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "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/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==", "dev": true, + "license": "ISC", "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" + "yallist": "^3.0.2" } }, - "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/serve-index/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==", + "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": ">= 0.6" + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" } }, - "node_modules/serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "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": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" + "@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": ">= 0.8.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/server-destroy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", - "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", - "dev": true - }, - "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/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, - "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">= 8" } }, - "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/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { - "kind-of": "^6.0.2" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=8" + "node": ">=8.6" } }, - "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/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "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/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": ">=8" + "node": ">=6" } }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "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": ">=18" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "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/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": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "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==", + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, + "license": "ISC", "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/sigstore": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.1.0.tgz", - "integrity": "sha512-kPIj+ZLkyI3QaM0qX8V/nSsweYND3W448pwkDgS6CQ74MfhEkIR8ToK5Iyx46KJYRjseVcD3Rp9zAmUAj6ZjPw==", + "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": { - "@sigstore/bundle": "^2.1.0", - "@sigstore/protobuf-specs": "^0.2.1", - "@sigstore/sign": "^2.1.0", - "@sigstore/tuf": "^2.1.0" + "minipass": "^7.0.3" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/slash": { + "node_modules/minipass-fetch": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.0.tgz", + "integrity": "sha512-2v6aXUXwLP1Epd/gc32HAMIWoczx+fZwEPRHm/VwtrJzRGwR1qGZXEYV3Zp8ZjjbwaZhMrM6uHV4KVkk+XCc2w==", "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^3.0.1" + }, "engines": { - "node": ">=12" + "node": "^18.17.0 || >=20.5.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "encoding": "^0.1.13" } }, - "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/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": ">= 6.0.0", - "npm": ">= 3.0.0" + "node": ">= 8" } }, - "node_modules/socket.io": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.2.tgz", - "integrity": "sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw==", + "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, + "license": "ISC", "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "cors": "~2.8.5", - "debug": "~4.3.2", - "engine.io": "~6.5.2", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.4" + "yallist": "^4.0.0" }, "engines": { - "node": ">=10.2.0" + "node": ">=8" } }, - "node_modules/socket.io-adapter": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", - "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "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, - "dependencies": { - "ws": "~8.11.0" - } + "license": "ISC" }, - "node_modules/socket.io-client": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.2.tgz", - "integrity": "sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==", + "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": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.2", - "engine.io-client": "~6.5.2", - "socket.io-parser": "~4.2.4" + "minipass": "^3.0.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=8" } }, - "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==", + "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": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" + "yallist": "^4.0.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=8" } }, - "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/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/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": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "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/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": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" + "node": ">=8" } }, - "node_modules/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==", + "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.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", + "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", "dev": true, + "license": "MIT", "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" + "minipass": "^7.0.4", + "rimraf": "^5.0.5" }, "engines": { - "node": ">= 10" + "node": ">= 18" } }, - "node_modules/socks-proxy-agent/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/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, - "dependencies": { - "debug": "4" + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" }, "engines": { - "node": ">= 6.0.0" + "node": ">=10" } }, - "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/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=10" } }, - "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/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, - "engines": { - "node": ">=0.10.0" + "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, + "license": "MIT", + "optional": true, + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" } }, - "node_modules/source-map-loader": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.1.tgz", - "integrity": "sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==", + "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": { - "abab": "^2.0.6", - "iconv-lite": "^0.6.3", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": ">= 14.15.0" + "node-gyp-build-optional-packages": "5.2.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" }, - "peerDependencies": { - "webpack": "^5.72.1" + "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/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/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, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, + "license": "ISC", "engines": { - "node": ">=0.10.0" + "node": "^18.17.0 || >=20.5.0" } }, - "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/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "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/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "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==", + "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, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "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 + "license": "MIT", + "optional": 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/node-gyp": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.1.0.tgz", + "integrity": "sha512-/+7TuHKnBpnMvUQnsYEb0JOozDZqarQbfNuSGLXIjhStMT0fbw7IdSqWgopOP5xhRZE+lsbIvAHcekddruPZgQ==", "dev": true, + "license": "MIT", "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "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", + "which": "^5.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", - "dev": true - }, - "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/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": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" + "detect-libc": "^2.0.1" }, - "engines": { - "node": ">=6.0.0" + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" } }, - "node_modules/spdy-transport": { + "node_modules/node-gyp/node_modules/chownr": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, - "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" + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" } }, - "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/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, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "node_modules/ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "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": { - "minipass": "^7.0.3" + "@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": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=18" } }, - "node_modules/statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==", + "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": ">= 0.6" + "node": ">=18" } }, - "node_modules/stream-throttle": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", - "integrity": "sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==", + "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==", + "dev": true, + "license": "MIT" + }, + "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": { - "commander": "^2.2.0", - "limiter": "^1.0.5" + "abbrev": "^3.0.0" }, "bin": { - "throttleproxy": "bin/throttleproxy.js" + "nopt": "bin/nopt.js" }, "engines": { - "node": ">= 0.10.0" + "node": "^18.17.0 || >=20.5.0" } }, - "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/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, + "license": "ISC", "dependencies": { - "safe-buffer": "~5.2.0" + "npm-normalize-package-bin": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.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==", + "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": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "semver": "^7.1.1" }, "engines": { - "node": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "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==", + "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": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-package-arg": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.1.tgz", + "integrity": "sha512-aDxjFfPV3Liw0WOBWlyZLMBqtbgbg03rmGvHDJa2Ttv7tIz+1oB5qWec4psCDFZcZi9b5XdGkPdQiJxOPzvQRQ==", "dev": true, + "license": "ISC", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" }, "engines": { - "node": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "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==", + "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": { - "ansi-regex": "^5.0.1" + "ignore-walk": "^7.0.0" }, "engines": { - "node": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "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==", + "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": { - "ansi-regex": "^5.0.1" + "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": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "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/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": { + "@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": ">=6" + "node": "^18.17.0 || >=20.5.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/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": { - "has-flag": "^3.0.0" + "boolbase": "^1.0.0" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "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": { + "mimic-function": "^5.0.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/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": { + "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": ">=0.10" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "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": ">=6" + "node": ">=8" } }, - "node_modules/tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "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": { + "restore-cursor": "^3.1.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "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==", + "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": { - "minipass": "^3.0.0" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">= 8" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "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": { - "yallist": "^4.0.0" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { "node": ">=8" } }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "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, + "license": "ISC" + }, + "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": { + "ansi-regex": "^5.0.1" + }, "engines": { "node": ">=8" } }, - "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 + "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/terser": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.22.0.tgz", - "integrity": "sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==", + "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": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "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, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" - }, + "license": "MIT", "engines": { - "node": ">= 10.13.0" + "node": ">=18" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "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" }, - "peerDependencies": { - "webpack": "^5.1.0" + "bin": { + "pacote": "bin/index.js" }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "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/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", "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" + "entities": "^4.5.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "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/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, - "peerDependencies": { - "ajv": "^6.9.1" + "license": "MIT", + "dependencies": { + "entities": "^4.3.0", + "parse5": "^7.0.0", + "parse5-sax-parser": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "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/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "node_modules/parse5-sax-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", + "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", "dev": true, + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" + "parse5": "^7.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "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/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": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, + "license": "MIT", "engines": { "node": ">=8" } }, - "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/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, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "license": "MIT" }, - "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/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": { - "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" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "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/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": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "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 + "license": "ISC" }, - "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/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "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": { - "os-tmpdir": "~1.0.2" - }, + "license": "MIT", "engines": { - "node": ">=0.6.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "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==", + "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, - "engines": { - "node": ">=4" + "license": "MIT", + "optionalDependencies": { + "@napi-rs/nice": "^1.0.1" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/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": { - "is-number": "^7.0.0" + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">=8.0" + "node": "^10 || ^12 || >=14" } }, - "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==", + "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, - "engines": { - "node": ">=0.6" - } + "license": "MIT" }, - "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/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, - "bin": { - "tree-kill": "cli.js" + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/tuf-js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.1.0.tgz", - "integrity": "sha512-eD7YPPjVlMzdggrOeE8zwoegUaG/rt6Bt3jwoQPunRiNVzgcCE009UDFJKJjG+Gk9wFu6W/Vi+P5d/5QpdD9jA==", + "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": { - "@tufjs/models": "2.0.0", - "debug": "^4.3.4", - "make-fetch-happen": "^13.0.0" + "err-code": "^2.0.2", + "retry": "^0.12.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=10" } }, - "node_modules/tuf-js/node_modules/make-fetch-happen": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", - "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", + "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" + } + ], + "license": "MIT" + }, + "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": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">= 6" } }, - "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/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "node": ">= 14.18.0" }, - "engines": { - "node": ">= 0.6" + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "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/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "dev": true, + "license": "Apache-2.0" }, - "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "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==", "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, + "license": "MIT", "engines": { - "node": ">=14.17" + "node": ">=0.10.0" } }, - "node_modules/ua-parser-js": { - "version": "1.0.36", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.36.tgz", - "integrity": "sha512-znuyCIXzl8ciS3+y3fHJI/2OhQIXbXw9MWC/o3qwyR+RGppjZHrM27CGFSKCJXi2Kctiz537iOu2KnXs1lMQhw==", + "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, - "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", "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/undici-types": { - "version": "5.25.3", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", - "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==", - "dev": true - }, - "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/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-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/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": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" }, "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 4" } }, - "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/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", "dev": true, + "license": "ISC", "dependencies": { - "unique-slug": "^4.0.0" + "glob": "^10.3.7" }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "node_modules/rollup": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.30.1.tgz", + "integrity": "sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==", "dev": true, + "license": "MIT", "dependencies": { - "imurmurhash": "^0.1.4" + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.30.1", + "@rollup/rollup-android-arm64": "4.30.1", + "@rollup/rollup-darwin-arm64": "4.30.1", + "@rollup/rollup-darwin-x64": "4.30.1", + "@rollup/rollup-freebsd-arm64": "4.30.1", + "@rollup/rollup-freebsd-x64": "4.30.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.30.1", + "@rollup/rollup-linux-arm-musleabihf": "4.30.1", + "@rollup/rollup-linux-arm64-gnu": "4.30.1", + "@rollup/rollup-linux-arm64-musl": "4.30.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.30.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.30.1", + "@rollup/rollup-linux-riscv64-gnu": "4.30.1", + "@rollup/rollup-linux-s390x-gnu": "4.30.1", + "@rollup/rollup-linux-x64-gnu": "4.30.1", + "@rollup/rollup-linux-x64-musl": "4.30.1", + "@rollup/rollup-win32-arm64-msvc": "4.30.1", + "@rollup/rollup-win32-ia32-msvc": "4.30.1", + "@rollup/rollup-win32-x64-msvc": "4.30.1", + "fsevents": "~2.3.2" } }, - "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==", + "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==", "dev": true, - "engines": { - "node": ">= 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": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" } }, - "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, - "engines": { - "node": ">= 0.8" + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" } }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "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": "opencollective", - "url": "https://opencollective.com/browserslist" + "type": "github", + "url": "https://github.com/sponsors/feross" }, { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" + "type": "patreon", + "url": "https://www.patreon.com/feross" }, { - "type": "github", - "url": "https://github.com/sponsors/ai" + "type": "consulting", + "url": "https://feross.org/support" } ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } + "license": "MIT" }, - "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/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "license": "MIT" }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "node_modules/sass": { + "version": "1.83.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.1.tgz", + "integrity": "sha512-EVJbDaEs4Rr3F0glJzFSOvtg2/oy2V/YrGFPqPY24UqcLDWcI9ZY5sN+qyO3c/QCZwzgfirvhXvINiJCE/OLcA==", "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, "engines": { - "node": ">= 0.4.0" + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, - "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/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, + "license": "ISC", "bin": { - "uuid": "dist/bin/uuid" + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "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/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": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/validate-npm-package-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", - "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "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, - "dependencies": { - "builtins": "^5.0.0" - }, + "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=8" } }, - "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/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, + "license": "ISC", "engines": { - "node": ">= 0.8" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/vite": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", - "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", + "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": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" - }, - "bin": { - "vite": "bin/vite.js" + "@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": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], + "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, - "optional": true, - "os": [ - "android" - ], + "license": "MIT", "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], + "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, - "optional": true, - "os": [ - "android" - ], + "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 6.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], + "node_modules/socks": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", + "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", "dev": true, - "optional": true, - "os": [ - "android" - ], + "license": "MIT", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, "engines": { - "node": ">=12" + "node": ">= 10.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], + "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, - "optional": true, - "os": [ - "darwin" - ], + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, "engines": { - "node": ">=12" + "node": ">= 14" } }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], + "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, - "optional": true, - "os": [ - "darwin" - ], + "license": "BSD-3-Clause", "engines": { - "node": ">=12" + "node": ">= 8" } }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], + "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, - "optional": true, - "os": [ - "freebsd" - ], + "license": "BSD-3-Clause", "engines": { - "node": ">=12" + "node": ">=0.10.0" } }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], + "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, - "optional": true, - "os": [ - "freebsd" - ], + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "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, + "license": "CC0-1.0" + }, + "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, + "license": "BSD-3-Clause" + }, + "node_modules/ssri": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", + "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, "engines": { - "node": ">=12" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], + "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, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, "engines": { - "node": ">=12" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], + "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, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], + "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, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], + "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, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], + "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, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], + "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, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], + "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, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], + "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, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], + "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, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], + "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, - "optional": true, - "os": [ - "netbsd" - ], + "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], + "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, - "optional": true, - "os": [ - "openbsd" - ], + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=0.10" } }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], + "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, - "optional": true, - "os": [ - "sunos" - ], + "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": ">=12" + "node": ">=10" } }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], + "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, - "optional": true, - "os": [ - "win32" - ], + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, "engines": { - "node": ">=12" + "node": ">= 8" } }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], + "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, - "optional": true, - "os": [ - "win32" - ], + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], + "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, - "optional": true, - "os": [ - "win32" - ], + "license": "ISC", "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "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, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" }, "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" + "node": ">= 8" } }, - "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==", + "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, + "license": "ISC", "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" + "yallist": "^4.0.0" }, "engines": { - "node": ">=10.13.0" + "node": ">=8" } }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "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, - "dependencies": { - "minimalistic-assert": "^1.0.0" - } + "license": "ISC" }, - "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/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, + "license": "MIT", "dependencies": { - "defaults": "^1.0.3" + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" } }, - "node_modules/webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", - "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", - "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.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" }, "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } + "node": ">=8.0" } }, - "node_modules/webpack-dev-middleware": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.1.tgz", - "integrity": "sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==", + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tuf-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-3.0.1.tgz", + "integrity": "sha512-+68OP1ZzSF84rTckf3FA95vJ1Zlx/uaXyiiKyPd1pA4rZNkpEvDAKmsu1xUSmbF/chCRYgZ6UZkDwC7PmzmAyA==", "dev": true, + "license": "MIT", "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.12", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" + "@tufjs/models": "3.0.1", + "debug": "^4.3.6", + "make-fetch-happen": "^14.0.1" }, "engines": { - "node": ">= 14.15.0" + "node": "^18.17.0 || >=20.5.0" + } + }, + "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, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/webpack-dev-server": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", - "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", - "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.5", - "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", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.13.0" - }, + "node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "dev": true, + "license": "Apache-2.0", "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } + "node": ">=14.17" } }, - "node_modules/webpack-dev-server/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/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "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, + "license": "ISC", + "dependencies": { + "unique-slug": "^5.0.0" + }, "engines": { - "node": ">=0.8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/webpack-dev-server/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/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, + "license": "ISC", "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" + "imurmurhash": "^0.1.4" }, "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", - "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "node_modules/update-browserslist-db": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" }, - "utf-8-validate": { - "optional": true + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "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" } }, - "node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "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, + "license": "MIT" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "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==", + "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, + "license": "ISC", "engines": { - "node": ">=10.13.0" + "node": "^18.17.0 || >=20.5.0" } }, - "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/vite": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz", + "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==", "dev": true, + "license": "MIT", "dependencies": { - "typed-assert": "^1.0.8" + "esbuild": "^0.24.2", + "postcss": "^8.4.49", + "rollup": "^4.23.0" + }, + "bin": { + "vite": "bin/vite.js" }, "engines": { - "node": ">= 12" + "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": { - "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", - "webpack": "^5.12.0" + "@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": { - "html-webpack-plugin": { + "@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/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==", - "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" - } - }, - "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==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "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/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "node_modules/watchpack": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">=10.13.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/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, + "license": "MIT", "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" + "defaults": "^1.0.3" } }, - "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/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, - "engines": { - "node": ">=0.8.0" - } + "license": "MIT", + "optional": true }, "node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "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" }, @@ -12208,29 +6715,15 @@ "node-which": "bin/which.js" }, "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "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==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" + "node": "^18.17.0 || >=20.5.0" } }, - "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 - }, "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, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -12246,6 +6739,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -12258,106 +6752,114 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "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, - "dependencies": { - "color-convert": "^2.0.1" - }, + "license": "MIT", "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "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, - "dependencies": { - "color-name": "~1.1.4" - }, + "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": ">=7.0.0" + "node": ">=8" } }, - "node_modules/wrap-ansi-cjs/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/wrap-ansi/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/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": { - "color-convert": "^2.0.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "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": { - "color-name": "~1.1.4" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "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/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "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/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/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": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "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" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "engines": { + "node": ">=8" } }, - "node_modules/xmlhttprequest-ssl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", - "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", + "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": ">=0.4.0" + "node": ">=8" } }, "node_modules/y18n": { @@ -12365,6 +6867,7 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -12373,13 +6876,15 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "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==", "dev": true, + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -12398,29 +6903,84 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, - "node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "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/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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": ">=12.20" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/zone.js": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.0.tgz", - "integrity": "sha512-Sz0G0TjMuyApIcuTJeK742+xLLKEPjYtkdBEazBlYePHkICVp9DPKqI/4dJt3LCtQBd52sCxz23uAFJ2OJa6Ow==", - "dependencies": { - "tslib": "^2.3.0" - } + "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/adev/shared-docs/pipeline/tutorials/common/package.json.template b/adev/shared-docs/pipeline/tutorials/common/package.json.template index 5ace0cd70b44..c75fe428919b 100644 --- a/adev/shared-docs/pipeline/tutorials/common/package.json.template +++ b/adev/shared-docs/pipeline/tutorials/common/package.json.template @@ -3,7 +3,7 @@ "version": "0.0.0", "scripts": { "ng": "ng", - "start": "NG_BUILD_PARALLEL_TS=0 ng serve", + "start": "ng serve", "build": "ng build", "watch": "ng build --watch --configuration development" }, @@ -15,12 +15,12 @@ "@angular/platform-browser": "^19.0.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", - "zone.js": "~0.14.0" + "zone.js": "~0.15.0" }, "devDependencies": { - "@angular-devkit/build-angular": "^19.0.0", + "@angular/build": "^19.0.0", "@angular/cli": "^19.0.0", "@angular/compiler-cli": "^19.0.0", - "typescript": "~5.6.3" + "typescript": "~5.7.3" } } diff --git a/adev/src/content/tutorials/deferrable-views/common/package.json b/adev/src/content/tutorials/deferrable-views/common/package.json index e44f62195c54..433b21a3ed6e 100644 --- a/adev/src/content/tutorials/deferrable-views/common/package.json +++ b/adev/src/content/tutorials/deferrable-views/common/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "scripts": { "ng": "ng", - "start": "NG_BUILD_PARALLEL_TS=0 ng serve", + "start": "ng serve", "build": "ng build", "watch": "ng build --watch --configuration development" }, diff --git a/adev/src/content/tutorials/first-app/common/package.json b/adev/src/content/tutorials/first-app/common/package.json index 74623d8d3bac..e22e4fdc50d6 100644 --- a/adev/src/content/tutorials/first-app/common/package.json +++ b/adev/src/content/tutorials/first-app/common/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "scripts": { "ng": "ng", - "start": "NG_BUILD_PARALLEL_TS=0 ng serve", + "start": "ng serve", "build": "ng build", "watch": "ng build --watch --configuration development" }, diff --git a/adev/src/content/tutorials/homepage/package.json b/adev/src/content/tutorials/homepage/package.json index c232d328d8fc..893078626990 100644 --- a/adev/src/content/tutorials/homepage/package.json +++ b/adev/src/content/tutorials/homepage/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "scripts": { "ng": "ng", - "start": "NG_BUILD_PARALLEL_TS=0 ng serve", + "start": "ng serve", "build": "ng build", "watch": "ng build --watch --configuration development" }, diff --git a/adev/src/content/tutorials/learn-angular/common/package.json b/adev/src/content/tutorials/learn-angular/common/package.json index e44f62195c54..433b21a3ed6e 100644 --- a/adev/src/content/tutorials/learn-angular/common/package.json +++ b/adev/src/content/tutorials/learn-angular/common/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "scripts": { "ng": "ng", - "start": "NG_BUILD_PARALLEL_TS=0 ng serve", + "start": "ng serve", "build": "ng build", "watch": "ng build --watch --configuration development" }, diff --git a/adev/src/content/tutorials/playground/common/package.json b/adev/src/content/tutorials/playground/common/package.json index c4b60bf1edd9..764147551e3b 100644 --- a/adev/src/content/tutorials/playground/common/package.json +++ b/adev/src/content/tutorials/playground/common/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "scripts": { "ng": "ng", - "start": "NG_BUILD_PARALLEL_TS=0 ng serve", + "start": "ng serve", "build": "ng build", "watch": "ng build --watch --configuration development" }, From 8145b6e7a47e644f160a6a6fab670ac485b7ce9c Mon Sep 17 00:00:00 2001 From: hawkgs Date: Wed, 19 Feb 2025 16:55:39 +0200 Subject: [PATCH 0121/1000] docs(docs-infra): fix the top position of the search dialog (#60012) Instead of centering the dialog, fix the top position in such way that when the results container is full, the dialog looks centered. This prevents the dialog from "jumping" when you type and the results change. PR Close #60012 --- .../components/search-dialog/search-dialog.component.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/adev/shared-docs/components/search-dialog/search-dialog.component.scss b/adev/shared-docs/components/search-dialog/search-dialog.component.scss index a2ef86d3d032..995d880ad1dd 100644 --- a/adev/shared-docs/components/search-dialog/search-dialog.component.scss +++ b/adev/shared-docs/components/search-dialog/search-dialog.component.scss @@ -2,6 +2,8 @@ dialog { background-color: transparent; border: none; padding-block-end: 3rem; + margin: 0 auto; + top: 15vh; &::backdrop { backdrop-filter: blur(5px); From 669fb6722fa8e849fcee2f08931dd3030b58baa2 Mon Sep 17 00:00:00 2001 From: Evgeniy Aksyonov Date: Fri, 21 Feb 2025 19:41:11 +0100 Subject: [PATCH 0122/1000] docs: fix typo in outputs.md for migrations section (#60055) PR Close #60055 --- adev/src/content/reference/migrations/outputs.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/adev/src/content/reference/migrations/outputs.md b/adev/src/content/reference/migrations/outputs.md index 9ca85a3262a3..bc662f8ad015 100644 --- a/adev/src/content/reference/migrations/outputs.md +++ b/adev/src/content/reference/migrations/outputs.md @@ -80,7 +80,7 @@ ng generate @angular/core:output-migration --path src/app/sub-folder ## Exceptions In some cases, the migration will not touch the code. -One of these excpetions is the case where the event is used with a `pipe()` method. +One of these exceptions is the case where the event is used with a `pipe()` method. The following code won't be migrated: ```typescript @@ -93,4 +93,4 @@ export class MyDialogComponent { this.close.pipe(); } } -``` \ No newline at end of file +``` From 16185954737fc80c88f61a1346fb2978b0381249 Mon Sep 17 00:00:00 2001 From: hawkgs Date: Fri, 21 Feb 2025 16:27:44 +0200 Subject: [PATCH 0123/1000] refactor(devtools): drop @ from inputs and outputs label (#60053) Drop '@' from inputs and outputs label to fit in with the new signal-based API. PR Close #60053 --- devtools/cypress/integration/view-component-metadata.e2e.js | 4 ++-- .../property-view/property-view-body.component.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/devtools/cypress/integration/view-component-metadata.e2e.js b/devtools/cypress/integration/view-component-metadata.e2e.js index 401ac4f70f00..e61c2382f596 100644 --- a/devtools/cypress/integration/view-component-metadata.e2e.js +++ b/devtools/cypress/integration/view-component-metadata.e2e.js @@ -44,13 +44,13 @@ describe('Viewing component metadata', () => { }); it('should display correct set of inputs', () => { - cy.contains('.cy-inputs', '@Inputs'); + cy.contains('.cy-inputs', 'Inputs'); cy.contains('.cy-inputs mat-tree-node:first span:first', 'inputOne'); cy.contains('.cy-inputs mat-tree-node:last span:first', 'inputTwo'); }); it('should display correct set of outputs', () => { - cy.contains('.cy-outputs', '@Outputs'); + cy.contains('.cy-outputs', 'Outputs'); cy.contains('.cy-outputs mat-tree-node:first span:first', 'outputOne'); cy.contains('.cy-outputs mat-tree-node:last span:first', 'outputTwo'); }); diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-body.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-body.component.ts index 0a4282577b07..37b70c3dd071 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-body.component.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-body.component.ts @@ -57,14 +57,14 @@ export class PropertyViewBodyComponent { >(() => { return [ { - title: '@Inputs', + title: 'Inputs', hidden: this.directiveInputControls().dataSource.data.length === 0, controls: this.directiveInputControls(), documentation: 'https://angular.dev/api/core/input', class: 'cy-inputs', }, { - title: '@Outputs', + title: 'Outputs', hidden: this.directiveOutputControls().dataSource.data.length === 0, controls: this.directiveOutputControls(), documentation: 'https://angular.dev/api/core/output', From 4853129a7de032da0f2f0332daa97e509da4ab24 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Sat, 22 Feb 2025 09:02:44 +0100 Subject: [PATCH 0124/1000] test(core): clean up explicit standalone flags from tests (#60062) Now that standalone is the default, we don't need to specify it in tests anymore. PR Close #60062 --- .../rxjs-interop/test/to_observable_spec.ts | 1 - .../test/acceptance/after_render_hook_spec.ts | 9 +- .../acceptance/authoring/model_inputs_spec.ts | 56 ++-- .../authoring/output_function_spec.ts | 20 -- .../authoring/signal_inputs_spec.ts | 23 +- .../authoring/signal_queries_spec.ts | 33 +- .../core/test/acceptance/bootstrap_spec.ts | 6 +- .../change_detection_signals_in_zones_spec.ts | 46 +-- .../test/acceptance/change_detection_spec.ts | 6 +- ...change_detection_transplanted_view_spec.ts | 10 - .../core/test/acceptance/component_spec.ts | 12 - packages/core/test/acceptance/content_spec.ts | 39 +-- .../test/acceptance/control_flow_for_spec.ts | 42 +-- .../test/acceptance/control_flow_if_spec.ts | 55 +--- .../acceptance/control_flow_switch_spec.ts | 12 +- packages/core/test/acceptance/csp_spec.ts | 9 +- packages/core/test/acceptance/defer_spec.ts | 131 +------- .../core/test/acceptance/destroy_ref_spec.ts | 11 - packages/core/test/acceptance/di_spec.ts | 65 +--- .../core/test/acceptance/directive_spec.ts | 2 +- .../env_injector_standalone_spec.ts | 8 +- .../acceptance/environment_injector_spec.ts | 1 - packages/core/test/acceptance/hmr_spec.ts | 92 +----- .../test/acceptance/host_directives_spec.ts | 283 ++++++++---------- packages/core/test/acceptance/i18n_spec.ts | 1 - .../inherit_definition_feature_spec.ts | 4 - .../test/acceptance/injector_profiler_spec.ts | 24 +- .../core/test/acceptance/integration_spec.ts | 1 - .../core/test/acceptance/internal_spec.ts | 11 - packages/core/test/acceptance/let_spec.ts | 21 +- .../core/test/acceptance/listener_spec.ts | 12 +- .../core/test/acceptance/ng_module_spec.ts | 7 - packages/core/test/acceptance/pipe_spec.ts | 3 +- packages/core/test/acceptance/query_spec.ts | 74 ++--- .../test/acceptance/renderer_factory_spec.ts | 5 - .../core/test/acceptance/security_spec.ts | 41 --- .../acceptance/standalone_injector_spec.ts | 2 - .../core/test/acceptance/standalone_spec.ts | 69 +---- packages/core/test/acceptance/styling_spec.ts | 9 - packages/core/test/application_ref_spec.ts | 1 - .../test/change_detection_scheduler_spec.ts | 61 ++-- packages/core/test/component_fixture_spec.ts | 13 +- packages/core/test/defer_fixture_spec.ts | 15 - .../test/render3/change_detection_spec.ts | 1 - .../core/test/render3/component_ref_spec.ts | 5 - .../core/test/render3/deps_tracker_spec.ts | 80 +++-- packages/core/test/render3/di_spec.ts | 5 +- .../core/test/render3/instructions_spec.ts | 2 - .../core/test/render3/integration_spec.ts | 25 -- .../test/render3/microtask_effect_spec.ts | 27 -- packages/core/test/render3/providers_spec.ts | 5 - packages/core/test/render3/query_spec.ts | 5 - .../core/test/render3/reactive_safety_spec.ts | 8 - packages/core/test/render3/reactivity_spec.ts | 40 +-- packages/core/test/test_bed_effect_spec.ts | 5 - packages/core/test/test_bed_spec.ts | 36 +-- packages/core/test/zone/ng_zone_spec.ts | 1 - 57 files changed, 317 insertions(+), 1274 deletions(-) diff --git a/packages/core/rxjs-interop/test/to_observable_spec.ts b/packages/core/rxjs-interop/test/to_observable_spec.ts index 4c2d5334d75c..3a0ee839411a 100644 --- a/packages/core/rxjs-interop/test/to_observable_spec.ts +++ b/packages/core/rxjs-interop/test/to_observable_spec.ts @@ -25,7 +25,6 @@ describe('toObservable()', () => { @Component({ template: '', - standalone: true, }) class Cmp {} diff --git a/packages/core/test/acceptance/after_render_hook_spec.ts b/packages/core/test/acceptance/after_render_hook_spec.ts index 0ab9ebb9089c..2d39e8b7eeb4 100644 --- a/packages/core/test/acceptance/after_render_hook_spec.ts +++ b/packages/core/test/acceptance/after_render_hook_spec.ts @@ -239,7 +239,6 @@ describe('after render hooks', () => { let log: string[] = []; @Component({ - standalone: true, template: ``, }) class MyComp { @@ -852,12 +851,12 @@ describe('after render hooks', () => { const appRef = TestBed.inject(ApplicationRef); const counter = signal(0); - @Component({standalone: true, template: '{{counter()}}'}) + @Component({template: '{{counter()}}'}) class Reader { counter = counter; } - @Component({standalone: true, template: ''}) + @Component({template: ''}) class Writer { ngAfterViewInit(): void { counter.set(1); @@ -1364,7 +1363,6 @@ describe('after render hooks', () => { @Component({ selector: 'test-component', - standalone: true, template: ` {{counter()}} `, }) class TestCmp { @@ -1393,7 +1391,6 @@ describe('after render hooks', () => { it('allows updating state and calling markForCheck in afterRender', async () => { @Component({ selector: 'test-component', - standalone: true, template: ` {{counter}} `, }) class TestCmp { @@ -1425,7 +1422,6 @@ describe('after render hooks', () => { const counter = signal(0); @Component({ selector: 'test-component', - standalone: true, template: `{{counter()}}`, }) class TestCmp { @@ -1467,7 +1463,6 @@ describe('after render hooks', () => { @Component({ selector: 'test-component', - standalone: true, template: ` {{counter()}} `, }) class TestCmp { diff --git a/packages/core/test/acceptance/authoring/model_inputs_spec.ts b/packages/core/test/acceptance/authoring/model_inputs_spec.ts index f7129d6354b4..e26daf95056f 100644 --- a/packages/core/test/acceptance/authoring/model_inputs_spec.ts +++ b/packages/core/test/acceptance/authoring/model_inputs_spec.ts @@ -24,14 +24,13 @@ import {TestBed} from '@angular/core/testing'; describe('model inputs', () => { it('should support two-way binding to a signal', () => { - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { value = model(0); } @Component({ template: '
', - standalone: true, imports: [Dir], }) class App { @@ -60,14 +59,13 @@ describe('model inputs', () => { }); it('should support two-way binding to a non-signal value', () => { - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { value = model(0); } @Component({ template: '
', - standalone: true, imports: [Dir], }) class App { @@ -96,7 +94,7 @@ describe('model inputs', () => { }); it('should support two-way binding a signal to a non-model input/output pair', () => { - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { @Input() value = 0; @Output() valueChange = new EventEmitter(); @@ -104,7 +102,6 @@ describe('model inputs', () => { @Component({ template: '
', - standalone: true, imports: [Dir], }) class App { @@ -135,14 +132,13 @@ describe('model inputs', () => { }); it('should support a one-way property binding to a model', () => { - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { value = model(0); } @Component({ template: '
', - standalone: true, imports: [Dir], }) class App { @@ -174,14 +170,13 @@ describe('model inputs', () => { it('should emit to the change output when the model changes', () => { const emittedValues: number[] = []; - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { value = model(0); } @Component({ template: '
', - standalone: true, imports: [Dir], }) class App { @@ -215,14 +210,13 @@ describe('model inputs', () => { it('should not emit to the change event when then property binding changes', () => { const emittedValues: number[] = []; - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { value = model(0); } @Component({ template: '
', - standalone: true, imports: [Dir], }) class App { @@ -247,14 +241,13 @@ describe('model inputs', () => { it('should support binding to the model input and output separately', () => { const emittedValues: number[] = []; - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { value = model(0); } @Component({ template: '
', - standalone: true, imports: [Dir], }) class App { @@ -288,14 +281,13 @@ describe('model inputs', () => { }); it('should support two-way binding to a model with an alias', () => { - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { value = model(0, {alias: 'alias'}); } @Component({ template: '
', - standalone: true, imports: [Dir], }) class App { @@ -327,14 +319,13 @@ describe('model inputs', () => { it('should support binding to an aliased model input and output separately', () => { const emittedValues: number[] = []; - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { value = model(0, {alias: 'alias'}); } @Component({ template: '
', - standalone: true, imports: [Dir], }) class App { @@ -368,7 +359,7 @@ describe('model inputs', () => { }); it('should throw if a required model input is accessed too early', () => { - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { value = model.required(); @@ -379,7 +370,6 @@ describe('model inputs', () => { @Component({ template: '
', - standalone: true, imports: [Dir], }) class App { @@ -392,7 +382,7 @@ describe('model inputs', () => { }); it('should throw if a required model input is updated too early', () => { - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { value = model.required(); @@ -403,7 +393,6 @@ describe('model inputs', () => { @Component({ template: '
', - standalone: true, imports: [Dir], }) class App { @@ -418,14 +407,13 @@ describe('model inputs', () => { it('should stop emitting to the output on destroy', () => { let emittedEvents = 0; - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { value = model(0); } @Component({ template: '
', - standalone: true, imports: [Dir], }) class App { @@ -457,12 +445,11 @@ describe('model inputs', () => { value = model(0); } - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir extends BaseDir {} @Component({ template: '
', - standalone: true, imports: [Dir], }) class App { @@ -494,7 +481,6 @@ describe('model inputs', () => { it('should reflect changes to a two-way-bound signal in the DOM', () => { @Directive({ selector: '[dir]', - standalone: true, host: { '(click)': 'increment()', }, @@ -509,7 +495,6 @@ describe('model inputs', () => { @Component({ template: ' Current value: {{value()}}', - standalone: true, imports: [Dir], }) class App { @@ -532,7 +517,7 @@ describe('model inputs', () => { it('should support ngOnChanges for two-way model bindings', () => { const changes: SimpleChange[] = []; - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir implements OnChanges { value = model(0); @@ -545,7 +530,6 @@ describe('model inputs', () => { @Component({ template: '
', - standalone: true, imports: [Dir], }) class App { @@ -582,7 +566,7 @@ describe('model inputs', () => { }); it('should not throw for mixed model and output subscriptions', () => { - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { model = model(0); @Output() output = new EventEmitter(); @@ -594,7 +578,6 @@ describe('model inputs', () => { template: `
`, - standalone: true, imports: [Dir], }) class App { @@ -607,7 +590,7 @@ describe('model inputs', () => { }); it('should support two-way binding to a signal @for loop variable', () => { - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { value = model(0); } @@ -618,7 +601,6 @@ describe('model inputs', () => {
} `, - standalone: true, imports: [Dir], }) class App { @@ -647,14 +629,13 @@ describe('model inputs', () => { }); it('should assign a debugName to the underlying watcher node when a debugName is provided', () => { - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { value = model(0, {debugName: 'TEST_DEBUG_NAME'}); } @Component({ template: '
', - standalone: true, imports: [Dir], }) class App { @@ -670,14 +651,13 @@ describe('model inputs', () => { }); it('should assign a debugName to the underlying watcher node when a debugName is provided to a required model', () => { - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { value = model.required({debugName: 'TEST_DEBUG_NAME'}); } @Component({ template: '
', - standalone: true, imports: [Dir], }) class App { diff --git a/packages/core/test/acceptance/authoring/output_function_spec.ts b/packages/core/test/acceptance/authoring/output_function_spec.ts index 2962b3941f0c..7fc7d7e8396d 100644 --- a/packages/core/test/acceptance/authoring/output_function_spec.ts +++ b/packages/core/test/acceptance/authoring/output_function_spec.ts @@ -30,7 +30,6 @@ describe('output() function', () => { it('should support emitting values', () => { @Directive({ selector: '[dir]', - standalone: true, }) class Dir { onBla = output(); @@ -38,7 +37,6 @@ describe('output() function', () => { @Component({ template: '
', - standalone: true, imports: [Dir], }) class App { @@ -60,7 +58,6 @@ describe('output() function', () => { it('should support emitting void values', () => { @Directive({ selector: '[dir]', - standalone: true, }) class Dir { onBla = output(); @@ -68,7 +65,6 @@ describe('output() function', () => { @Component({ template: '
', - standalone: true, imports: [Dir], }) class App { @@ -90,7 +86,6 @@ describe('output() function', () => { it('should error when emitting to a destroyed output', () => { @Directive({ selector: '[dir]', - standalone: true, }) class Dir { onBla = output(); @@ -102,7 +97,6 @@ describe('output() function', () => {
} `, - standalone: true, imports: [Dir], }) class App { @@ -128,7 +122,6 @@ describe('output() function', () => { it('should error when subscribing to a destroyed output', () => { @Directive({ selector: '[dir]', - standalone: true, }) class Dir { onBla = output(); @@ -140,7 +133,6 @@ describe('output() function', () => {
} `, - standalone: true, imports: [Dir], }) class App { @@ -168,7 +160,6 @@ describe('output() function', () => { it('should run listeners outside of `emit` reactive context', () => { @Directive({ selector: '[dir]', - standalone: true, }) class Dir { onBla = output(); @@ -184,7 +175,6 @@ describe('output() function', () => { @Component({ template: '
', - standalone: true, imports: [Dir], }) class App { @@ -212,7 +202,6 @@ describe('output() function', () => { it('should support using a `Subject` as source', () => { @Directive({ selector: '[dir]', - standalone: true, }) class Dir { onBla$ = new Subject(); @@ -221,7 +210,6 @@ describe('output() function', () => { @Component({ template: '
', - standalone: true, imports: [Dir], }) class App { @@ -243,7 +231,6 @@ describe('output() function', () => { it('should support using a `BehaviorSubject` as source', () => { @Directive({ selector: '[dir]', - standalone: true, }) class Dir { onBla$ = new BehaviorSubject(1); @@ -252,7 +239,6 @@ describe('output() function', () => { @Component({ template: '
', - standalone: true, imports: [Dir], }) class App { @@ -274,7 +260,6 @@ describe('output() function', () => { it('should support using an `EventEmitter` as source', () => { @Directive({ selector: '[dir]', - standalone: true, }) class Dir { onBla$ = new EventEmitter(); @@ -283,7 +268,6 @@ describe('output() function', () => { @Component({ template: '
', - standalone: true, imports: [Dir], }) class App { @@ -305,7 +289,6 @@ describe('output() function', () => { it('should support lazily creating an observer upon subscription', () => { @Directive({ selector: '[dir]', - standalone: true, }) class Dir { streamStarted = false; @@ -322,7 +305,6 @@ describe('output() function', () => {
`, - standalone: true, imports: [Dir], }) class App {} @@ -340,7 +322,6 @@ describe('output() function', () => { it('should report subscription listener errors to `ErrorHandler` and continue', () => { @Directive({ selector: '[dir]', - standalone: true, }) class Dir { onBla = output(); @@ -350,7 +331,6 @@ describe('output() function', () => { template: `
`, - standalone: true, imports: [Dir], }) class App {} diff --git a/packages/core/test/acceptance/authoring/signal_inputs_spec.ts b/packages/core/test/acceptance/authoring/signal_inputs_spec.ts index d35460ea0c76..8d99b62680bb 100644 --- a/packages/core/test/acceptance/authoring/signal_inputs_spec.ts +++ b/packages/core/test/acceptance/authoring/signal_inputs_spec.ts @@ -36,7 +36,6 @@ describe('signal inputs', () => { it('should be possible to bind to an input', () => { @Component({ selector: 'input-comp', - standalone: true, template: 'input:{{input()}}', }) class InputComp { @@ -44,7 +43,6 @@ describe('signal inputs', () => { } @Component({ - standalone: true, template: ``, imports: [InputComp], }) @@ -66,7 +64,6 @@ describe('signal inputs', () => { it('should be possible to use an input in a computed expression', () => { @Component({ selector: 'input-comp', - standalone: true, template: 'changed:{{changed()}}', }) class InputComp { @@ -75,7 +72,6 @@ describe('signal inputs', () => { } @Component({ - standalone: true, template: ``, imports: [InputComp], }) @@ -99,7 +95,6 @@ describe('signal inputs', () => { @Component({ selector: 'input-comp', - standalone: true, template: '', }) class InputComp { @@ -113,7 +108,6 @@ describe('signal inputs', () => { } @Component({ - standalone: true, template: ``, imports: [InputComp], }) @@ -137,7 +131,6 @@ describe('signal inputs', () => { it('should support transforms', () => { @Component({ selector: 'input-comp', - standalone: true, template: 'input:{{input()}}', }) class InputComp { @@ -145,7 +138,6 @@ describe('signal inputs', () => { } @Component({ - standalone: true, template: ``, imports: [InputComp], }) @@ -165,7 +157,6 @@ describe('signal inputs', () => { let transformRunCount = 0; @Component({ selector: 'input-comp', - standalone: true, template: '', }) class InputComp { @@ -175,7 +166,6 @@ describe('signal inputs', () => { } @Component({ - standalone: true, template: ``, imports: [InputComp], }) @@ -193,7 +183,6 @@ describe('signal inputs', () => { it('should throw error if a required input is accessed too early', () => { @Component({ selector: 'input-comp', - standalone: true, template: 'input:{{input()}}', }) class InputComp { @@ -205,7 +194,6 @@ describe('signal inputs', () => { } @Component({ - standalone: true, template: ``, imports: [InputComp], }) @@ -226,13 +214,11 @@ describe('signal inputs', () => { @Component({ selector: 'input-comp', - standalone: true, template: 'input:{{input()}}', }) class InputComp extends BaseDir {} @Component({ - standalone: true, template: ``, imports: [InputComp], }) @@ -252,7 +238,7 @@ describe('signal inputs', () => { }); it('should support two-way binding to signal input and @Output decorated member', () => { - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { value = input(0); @Output() valueChange = new EventEmitter(); @@ -260,7 +246,6 @@ describe('signal inputs', () => { @Component({ template: '
', - standalone: true, imports: [Dir], }) class App { @@ -290,14 +275,13 @@ describe('signal inputs', () => { }); it('should assign a debugName to the input signal node when a debugName is provided', () => { - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { value = input(0, {debugName: 'TEST_DEBUG_NAME'}); } @Component({ template: '
', - standalone: true, imports: [Dir], }) class App { @@ -312,14 +296,13 @@ describe('signal inputs', () => { }); it('should assign a debugName to the input signal node when a debugName is provided to a required input', () => { - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { value = input.required({debugName: 'TEST_DEBUG_NAME'}); } @Component({ template: '
', - standalone: true, imports: [Dir], }) class App { diff --git a/packages/core/test/acceptance/authoring/signal_queries_spec.ts b/packages/core/test/acceptance/authoring/signal_queries_spec.ts index 1011ba8685b2..a68b258ed0d1 100644 --- a/packages/core/test/acceptance/authoring/signal_queries_spec.ts +++ b/packages/core/test/acceptance/authoring/signal_queries_spec.ts @@ -28,7 +28,6 @@ describe('queries as signals', () => { describe('view', () => { it('should query for an optional element in a template', () => { @Component({ - standalone: true, template: `
`, }) class AppComponent { @@ -51,7 +50,6 @@ describe('queries as signals', () => { let result: {} | undefined = {}; @Component({ - standalone: true, template: `
`, }) class AppComponent { @@ -68,7 +66,6 @@ describe('queries as signals', () => { it('should query for a required element in a template', () => { @Component({ - standalone: true, template: `
`, }) class AppComponent { @@ -88,7 +85,6 @@ describe('queries as signals', () => { it('should throw if required query is read in the constructor', () => { @Component({ - standalone: true, template: `
`, }) class AppComponent { @@ -107,7 +103,6 @@ describe('queries as signals', () => { it('should query for multiple elements in a template', () => { @Component({ - standalone: true, template: `
@if (show) { @@ -144,7 +139,6 @@ describe('queries as signals', () => { let result: readonly ElementRef[] | undefined; @Component({ - standalone: true, template: `
`, }) class AppComponent { @@ -161,7 +155,6 @@ describe('queries as signals', () => { it('should return the same array instance when there were no changes in results', () => { @Component({ - standalone: true, template: `
`, }) class AppComponent { @@ -183,7 +176,6 @@ describe('queries as signals', () => { let computeCount = 0; @Component({ - standalone: true, template: `
@if (show) { @@ -212,7 +204,6 @@ describe('queries as signals', () => { it('should return the same array instance when there were no changes in results after view manipulation', () => { @Component({ - standalone: true, template: `
@if (show) { @@ -242,7 +233,6 @@ describe('queries as signals', () => { it('should be empty when no query matches exist', () => { @Component({ - standalone: true, template: ``, }) class AppComponent { @@ -259,7 +249,6 @@ describe('queries as signals', () => { it('should assign a debugName to the underlying signal node when a debugName is provided', () => { @Component({ - standalone: true, template: `
`, }) class AppComponent { @@ -282,7 +271,6 @@ describe('queries as signals', () => { it('should assign a debugName to the underlying signal node when a debugName is provided to a required viewChild query', () => { @Component({ - standalone: true, template: `
`, }) class AppComponent { @@ -299,7 +287,6 @@ describe('queries as signals', () => { it('should run content queries defined on components', () => { @Component({ selector: 'query-cmp', - standalone: true, template: `{{noOfEls()}}`, }) class QueryComponent { @@ -316,7 +303,6 @@ describe('queries as signals', () => { } @Component({ - standalone: true, imports: [QueryComponent], template: ` @@ -347,7 +333,6 @@ describe('queries as signals', () => { it('should run content queries defined on directives', () => { @Directive({ selector: '[query]', - standalone: true, host: {'[textContent]': `noOfEls()`}, }) class QueryDir { @@ -364,7 +349,6 @@ describe('queries as signals', () => { } @Component({ - standalone: true, imports: [QueryDir], template: `
@@ -393,18 +377,17 @@ describe('queries as signals', () => { }); it('should not return partial results during the first-time view rendering', () => { - @Directive({selector: '[marker]', standalone: true}) + @Directive({selector: '[marker]'}) class MarkerForResults {} @Directive({ selector: '[declare]', - standalone: true, }) class DeclareQuery { results = contentChildren(MarkerForResults); } - @Directive({selector: '[inspect]', standalone: true}) + @Directive({selector: '[inspect]'}) class InspectsQueryResults { constructor(declaration: DeclareQuery) { // we should _not_ get partial query results while the view is still creating @@ -413,7 +396,6 @@ describe('queries as signals', () => { } @Component({ - standalone: true, imports: [MarkerForResults, InspectsQueryResults, DeclareQuery], template: `
@@ -437,7 +419,6 @@ describe('queries as signals', () => { it('should be empty when no query matches exist', () => { @Directive({ selector: '[declare]', - standalone: true, }) class DeclareQuery { result = contentChild('unknown'); @@ -445,7 +426,6 @@ describe('queries as signals', () => { } @Component({ - standalone: true, imports: [DeclareQuery], template: `
`, }) @@ -464,7 +444,6 @@ describe('queries as signals', () => { it('should assign a debugName to the underlying signal node when a debugName is provided', () => { @Component({ selector: 'query-cmp', - standalone: true, template: ``, }) class QueryComponent { @@ -476,7 +455,6 @@ describe('queries as signals', () => { } @Component({ - standalone: true, imports: [QueryComponent], template: ` @@ -508,7 +486,6 @@ describe('queries as signals', () => { let recomputeCount = 0; @Component({ - standalone: true, template: `
@if (show) { @@ -544,7 +521,6 @@ describe('queries as signals', () => { let recomputeCount = 0; @Component({ - standalone: true, template: `
@if (show) { @@ -583,7 +559,6 @@ describe('queries as signals', () => { // https://github.com/angular/angular/issues/54450 @Component({ selector: 'query-cmp', - standalone: true, template: ``, }) class QueryComponent { @@ -592,7 +567,6 @@ describe('queries as signals', () => { } @Component({ - standalone: true, template: ``, }) class TestComponent { @@ -615,7 +589,6 @@ describe('queries as signals', () => { describe('mix of signal and decorator queries', () => { it('should allow specifying both types of queries in one component', () => { @Component({ - standalone: true, template: `
@if (show) { @@ -649,7 +622,6 @@ describe('queries as signals', () => { it('should allow combination via inheritance of both types of queries in one component', () => { @Component({ - standalone: true, template: `
@if (show) { @@ -663,7 +635,6 @@ describe('queries as signals', () => { } @Component({ - standalone: true, template: `
@if (show) { diff --git a/packages/core/test/acceptance/bootstrap_spec.ts b/packages/core/test/acceptance/bootstrap_spec.ts index 0695479cf491..6c5dbd12c4b9 100644 --- a/packages/core/test/acceptance/bootstrap_spec.ts +++ b/packages/core/test/acceptance/bootstrap_spec.ts @@ -61,10 +61,10 @@ describe('bootstrap', () => { it( 'should allow injecting VCRef into the root (bootstrapped) component', withBody('before||after', async () => { - @Component({selector: 'dynamic-cmp', standalone: true, template: 'dynamic'}) + @Component({selector: 'dynamic-cmp', template: 'dynamic'}) class DynamicCmp {} - @Component({selector: 'test-cmp', standalone: true, template: '(test)'}) + @Component({selector: 'test-cmp', template: '(test)'}) class TestCmp { constructor(public vcRef: ViewContainerRef) {} } @@ -305,7 +305,6 @@ describe('bootstrap', () => { 'should throw when standalone component is used in @NgModule.bootstrap', withBody('', async () => { @Component({ - standalone: true, selector: 'standalone-comp', template: '...', }) @@ -384,7 +383,6 @@ describe('bootstrap', () => { 'should throw when standalone component wrapped in `forwardRef` is used in @NgModule.bootstrap', withBody('', async () => { @Component({ - standalone: true, selector: 'standalone-comp', template: '...', }) diff --git a/packages/core/test/acceptance/change_detection_signals_in_zones_spec.ts b/packages/core/test/acceptance/change_detection_signals_in_zones_spec.ts index e4572c8c00bd..714b0be18f40 100644 --- a/packages/core/test/acceptance/change_detection_signals_in_zones_spec.ts +++ b/packages/core/test/acceptance/change_detection_signals_in_zones_spec.ts @@ -29,7 +29,6 @@ describe('CheckAlways components', () => { it('can read a signal', () => { @Component({ template: `{{value()}}`, - standalone: true, }) class CheckAlwaysCmp { value = signal('initial'); @@ -48,7 +47,6 @@ describe('CheckAlways components', () => { it('should properly remove stale dependencies from the signal graph', () => { @Component({ template: `{{show() ? name() + ' aged ' + age() : 'anonymous'}}`, - standalone: true, }) class CheckAlwaysCmp { name = signal('John'); @@ -81,7 +79,6 @@ describe('CheckAlways components', () => { const value = signal('initial'); @Component({ template: `{{value()}}`, - standalone: true, selector: 'check-always', }) class CheckAlwaysCmp { @@ -89,7 +86,6 @@ describe('CheckAlways components', () => { } @Component({ template: ``, - standalone: true, imports: [CheckAlwaysCmp], changeDetection: ChangeDetectionStrategy.OnPush, }) @@ -110,7 +106,6 @@ describe('CheckAlways components', () => { @Component({ template: '{{val()}}', - standalone: true, selector: 'a-comp', }) class A { @@ -118,7 +113,6 @@ describe('CheckAlways components', () => { } @Component({ template: '{{val()}}', - standalone: true, selector: 'b-comp', }) class B { @@ -132,7 +126,7 @@ describe('CheckAlways components', () => { } } - @Component({template: '-', standalone: true, imports: [A, B]}) + @Component({template: '-', imports: [A, B]}) class App {} const fixture = TestBed.createComponent(App); @@ -155,7 +149,6 @@ describe('CheckAlways components', () => { @Component({ template: '', selector: 'child', - standalone: true, }) class Child { ngDoCheck() { @@ -166,7 +159,7 @@ describe('CheckAlways components', () => { } } } - @Component({template: '{{val()}}', standalone: true, imports: [Child]}) + @Component({template: '{{val()}}', imports: [Child]}) class App { val = val; } @@ -187,7 +180,6 @@ describe('CheckAlways components', () => { const val = signal(0); @Component({ template: '{{val()}}', - standalone: true, }) class App { val = val; @@ -212,7 +204,6 @@ describe('OnPush components with signals', () => { @Component({ template: `{{value()}}{{incrementTemplateExecutions()}}`, changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, }) class OnPushCmp { numTemplateExecutions = 0; @@ -243,7 +234,6 @@ describe('OnPush components with signals', () => { @Component({ template: `{{memo()}}{{incrementTemplateExecutions()}}`, changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, }) class OnPushCmp { numTemplateExecutions = 0; @@ -278,7 +268,6 @@ describe('OnPush components with signals', () => { selector: 'child', template: `child`, changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, }) class ChildReadingSignalCmp { constructor() { @@ -293,7 +282,6 @@ describe('OnPush components with signals', () => { `, changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, imports: [NgIf, ChildReadingSignalCmp], }) class OnPushCmp { @@ -323,7 +311,6 @@ describe('OnPush components with signals', () => { @Component({ selector: 'with-input-setter', - standalone: true, template: '{{test}}', }) class WithInputSetter { @@ -342,7 +329,6 @@ describe('OnPush components with signals', () => { `, changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, imports: [NgIf, WithInputSetter], }) class OnPushCmp { @@ -373,7 +359,6 @@ describe('OnPush components with signals', () => { @Component({ selector: 'with-query-setter', - standalone: true, template: '
child
', }) class WithQuerySetter { @@ -393,7 +378,6 @@ describe('OnPush components with signals', () => { `, changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, imports: [NgIf, WithQuerySetter], }) class OnPushCmp { @@ -425,7 +409,6 @@ describe('OnPush components with signals', () => { selector: 'child', host: {'[class.blue]': 'useBlue()'}, changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, }) class MyCmp { useBlue = useBlue; @@ -455,7 +438,6 @@ describe('OnPush components with signals', () => { selector: 'child', host: {'[class.blue]': 'useBlue()'}, changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, }) class ChildCmp { useBlue = signal(false); @@ -471,7 +453,6 @@ describe('OnPush components with signals', () => { template: ``, changeDetection: ChangeDetectionStrategy.OnPush, imports: [ChildCmp], - standalone: true, }) class ParentCmp {} const fixture = TestBed.createComponent(ParentCmp); @@ -495,7 +476,6 @@ describe('OnPush components with signals', () => { selector: 'child', host: {'[class.blue]': 'useBlue()'}, changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, }) class ChildCmp { useBlue = signal(false); @@ -505,7 +485,6 @@ describe('OnPush components with signals', () => { template: ` {{parentSignalValue()}}`, changeDetection: ChangeDetectionStrategy.OnPush, imports: [ChildCmp], - standalone: true, selector: 'parent', }) class ParentCmp { @@ -517,7 +496,6 @@ describe('OnPush components with signals', () => { template: ``, changeDetection: ChangeDetectionStrategy.OnPush, imports: [ParentCmp], - standalone: true, }) class TestWrapper {} @@ -550,7 +528,6 @@ describe('OnPush components with signals', () => { const counter = signal(0); @Directive({ - standalone: true, selector: '[misunderstood]', }) class MisunderstoodDir { @@ -561,7 +538,6 @@ describe('OnPush components with signals', () => { @Component({ selector: 'test-component', - standalone: true, imports: [MisunderstoodDir], template: ` {{counter()}}
{{ 'force advance()' }} @@ -583,7 +559,6 @@ describe('OnPush components with signals', () => { const counter = signal(0); @Directive({ - standalone: true, selector: '[misunderstood]', }) class MisunderstoodDir { @@ -594,7 +569,6 @@ describe('OnPush components with signals', () => { @Component({ selector: 'test-component', - standalone: true, imports: [MisunderstoodDir], template: ` {{counter()}}
@@ -614,7 +588,6 @@ describe('OnPush components with signals', () => { it('should allow writing to signals in afterViewInit', () => { @Component({ template: '{{loading()}}', - standalone: true, }) class MyComp { loading = signal(true); @@ -634,7 +607,6 @@ describe('OnPush components with signals', () => { @Component({ template: '{{val()}}{{incrementChecks()}}', - standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, }) class App { @@ -664,7 +636,6 @@ describe('OnPush components with signals', () => { @if (true) { } {{val()}} `, - standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, }) class MyComp { @@ -685,7 +656,6 @@ describe('OnPush components with signals', () => { {{createEmbeddedView(template)}} {{val()}} `, - standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, }) class MyComp { @@ -708,7 +678,6 @@ describe('OnPush components with signals', () => { @Component({ selector: 'signal-component', changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, imports: [NgIf], template: `
{{value()}}
`, }) @@ -727,7 +696,6 @@ describe('OnPush components with signals', () => { @Component({ selector: 'signal-component', changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, imports: [NgFor], template: `
{{value()}}
`, }) @@ -746,7 +714,6 @@ describe('OnPush components with signals', () => { @Component({ selector: 'signal-component', changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, imports: [NgIf], template: ` {{componentSignal()}} @@ -776,7 +743,6 @@ describe('OnPush components with signals', () => { it('re-executes deep embedded template if signal updates', () => { @Component({ selector: 'signal-component', - standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgIf], template: ` @@ -807,7 +773,6 @@ describe('OnPush components with signals', () => { template: ` {{value()}} `, - standalone: true, }) class Test { value = signal('initial'); @@ -839,7 +804,6 @@ describe('OnPush components with signals', () => { template: ` {{value()}} `, - standalone: true, }) class Test { value = signal('initial'); @@ -873,7 +837,6 @@ describe('OnPush components with signals', () => { @Component({ selector: 'signal-component', changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, template: `{{value()}}`, }) class SignalComponent { @@ -891,7 +854,6 @@ describe('OnPush components with signals', () => { {{incrementChecks()}}`, changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, imports: [SignalComponent], }) class OnPushParent { @@ -956,7 +918,6 @@ describe('OnPush components with signals', () => { @Component({ template: '', selector: 'child', - standalone: true, }) class Child { ngOnInit() { @@ -967,7 +928,6 @@ describe('OnPush components with signals', () => { @Component({ template: '{{val()}} ', imports: [Child], - standalone: true, }) class SignalComponent { val = val; @@ -986,7 +946,6 @@ describe('OnPush components with signals', () => { @Component({ template: '{{double()}}', selector: 'child', - standalone: true, }) class Child { double = double; @@ -995,7 +954,6 @@ describe('OnPush components with signals', () => { @Component({ template: '|{{double()}}||', imports: [Child], - standalone: true, }) class SignalComponent { double = double; diff --git a/packages/core/test/acceptance/change_detection_spec.ts b/packages/core/test/acceptance/change_detection_spec.ts index 7a6debb944d1..c8eea48acb33 100644 --- a/packages/core/test/acceptance/change_detection_spec.ts +++ b/packages/core/test/acceptance/change_detection_spec.ts @@ -115,7 +115,6 @@ describe('change detection', () => { @Component({ selector: 'onpush', template: '', - standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, }) class OnPushComponent { @@ -126,7 +125,7 @@ describe('change detection', () => { } } - @Component({template: '', standalone: true}) + @Component({template: ''}) class Container { @ViewChild('template', {read: ViewContainerRef, static: true}) vcr!: ViewContainerRef; } @@ -235,7 +234,6 @@ describe('change detection', () => { selector: `test-cmpt`, template: `{{counter}}|`, changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, }) class TestCmpt { counter = 0; @@ -249,7 +247,6 @@ describe('change detection', () => { @Component({ selector: 'dynamic-cmpt', template: `dynamic|{{binding}}`, - standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, }) class DynamicCmpt { @@ -1410,7 +1407,6 @@ describe('change detection', () => { @Component({ changeDetection: ChangeDetectionStrategy.OnPush, - standalone: true, template: '{{state}}{{resolveReadPromise()}}', }) class MyApp { diff --git a/packages/core/test/acceptance/change_detection_transplanted_view_spec.ts b/packages/core/test/acceptance/change_detection_transplanted_view_spec.ts index 2041f649b633..397fa6e292ac 100644 --- a/packages/core/test/acceptance/change_detection_transplanted_view_spec.ts +++ b/packages/core/test/acceptance/change_detection_transplanted_view_spec.ts @@ -986,7 +986,6 @@ describe('change detection for transplanted views', () => { it('does not cause error if running change detection on detached view', () => { @Component({ - standalone: true, selector: 'insertion', template: ``, }) @@ -999,7 +998,6 @@ describe('change detection for transplanted views', () => { } @Component({ - standalone: true, template: ` @@ -1017,7 +1015,6 @@ describe('change detection for transplanted views', () => { it('backwards reference still updated if detaching root during change detection', () => { @Component({ - standalone: true, selector: 'insertion', template: ``, changeDetection: ChangeDetectionStrategy.OnPush, @@ -1033,7 +1030,6 @@ describe('change detection for transplanted views', () => { @Component({ template: '{{value}}', selector: 'declaration', - standalone: true, }) class Declaration { @ViewChild('template', {static: true}) transplantedTemplate!: TemplateRef<{}>; @@ -1041,7 +1037,6 @@ describe('change detection for transplanted views', () => { } @Component({ - standalone: true, template: ` @@ -1079,7 +1074,6 @@ describe('change detection for transplanted views', () => { @Component({ selector: 'insertion', imports: [NgTemplateOutlet], - standalone: true, template: ` `, }) class Insertion { @@ -1090,7 +1084,6 @@ describe('change detection for transplanted views', () => { @Component({ imports: [Insertion, AsyncPipe], template: ` {{newObservable() | async}} `, - standalone: true, selector: 'declaration', }) class Declaration { @@ -1100,7 +1093,6 @@ describe('change detection for transplanted views', () => { } } @Component({ - standalone: true, imports: [Declaration, Insertion], template: '', }) @@ -1137,7 +1129,6 @@ describe('change detection for transplanted views', () => { fail('console errored with ' + v); }); @Component({ - standalone: true, selector: 'insertion', template: ``, changeDetection: ChangeDetectionStrategy.OnPush, @@ -1151,7 +1142,6 @@ describe('change detection for transplanted views', () => { } @Component({ - standalone: true, template: ` hello world diff --git a/packages/core/test/acceptance/component_spec.ts b/packages/core/test/acceptance/component_spec.ts index 3586dfa1fa4d..80bbbeca2467 100644 --- a/packages/core/test/acceptance/component_spec.ts +++ b/packages/core/test/acceptance/component_spec.ts @@ -491,7 +491,6 @@ describe('component', () => { @Component({ selector: 'comp', template: 'hello', - standalone: true, imports: [Comp, NgIf], }) class Comp { @@ -500,7 +499,6 @@ describe('component', () => { @Component({ template: '', - standalone: true, imports: [Comp], }) class App {} @@ -521,7 +519,6 @@ describe('component', () => { @Component({ selector: 'comp', template: 'hello', - standalone: true, imports: [forwardRef(() => Comp), NgIf], }) class Comp { @@ -530,7 +527,6 @@ describe('component', () => { @Component({ template: '', - standalone: true, imports: [Comp], }) class App {} @@ -805,7 +801,6 @@ describe('component', () => { describe('createComponent', () => { it('should create an instance of a standalone component', () => { @Component({ - standalone: true, template: 'Hello {{ name }}!', }) class StandaloneComponent { @@ -858,7 +853,6 @@ describe('component', () => { it('should render projected content', () => { @Component({ - standalone: true, template: ` | | @@ -890,7 +884,6 @@ describe('component', () => { it('should be able to inject tokens from EnvironmentInjector', () => { const A = new InjectionToken('A'); @Component({ - standalone: true, template: 'Token: {{ a }}', }) class StandaloneComponent { @@ -912,7 +905,6 @@ describe('component', () => { const A = new InjectionToken('A'); const B = new InjectionToken('B'); @Component({ - standalone: true, template: '{{ a }} and {{ b }}', }) class ChildStandaloneComponent { @@ -921,7 +913,6 @@ describe('component', () => { } @Component({ - standalone: true, template: 'Tokens:
', providers: [{provide: A, useValue: 'ElementInjector(A)'}], }) @@ -961,7 +952,6 @@ describe('component', () => { const selector = 'standalone-comp'; @Component({ selector, - standalone: true, template: 'Hello {{ name }}!', }) class StandaloneComponent { @@ -988,7 +978,6 @@ describe('component', () => { () => { @Component({ selector: '.some-class', - standalone: true, template: 'Hello {{ name }}!', }) class StandaloneComponent { @@ -1048,7 +1037,6 @@ describe('component', () => { @Component({ selector: 'standalone-component', - standalone: true, template: ` diff --git a/packages/core/test/acceptance/content_spec.ts b/packages/core/test/acceptance/content_spec.ts index 61c07af68fba..675b8ab237be 100644 --- a/packages/core/test/acceptance/content_spec.ts +++ b/packages/core/test/acceptance/content_spec.ts @@ -1539,12 +1539,10 @@ describe('projection', () => { `Two fallback` + `Three fallback `, - standalone: true, }) class Projection {} @Component({ - standalone: true, imports: [Projection], template: ` @@ -1566,12 +1564,10 @@ describe('projection', () => { @Component({ selector: 'projection', template: `Fallback content`, - standalone: true, }) class Projection {} @Component({ - standalone: true, imports: [Projection], template: ` @@ -1594,12 +1590,10 @@ describe('projection', () => { @Component({ selector: 'projection', template: `I have no divs|I have no spans`, - standalone: true, }) class Projection {} @Component({ - standalone: true, imports: [Projection], template: ` @@ -1622,12 +1616,10 @@ describe('projection', () => { @Component({ selector: 'projection', template: `Wildcard fallback|Span fallback`, - standalone: true, }) class Projection {} @Component({ - standalone: true, imports: [Projection], template: ` @@ -1664,12 +1656,10 @@ describe('projection', () => { @Component({ selector: 'projection', template: `Fallback`, - standalone: true, }) class Projection {} @Component({ - standalone: true, imports: [Projection], template: ` @@ -1687,13 +1677,12 @@ describe('projection', () => { @Component({ selector: 'projection', template: `Value: {{value}}`, - standalone: true, }) class Projection { value = 0; } - @Component({standalone: true, imports: [Projection], template: ``}) + @Component({imports: [Projection], template: ``}) class App { @ViewChild(Projection) projection!: Projection; } @@ -1717,7 +1706,6 @@ describe('projection', () => { Value: {{value}} `, - standalone: true, }) class Projection { value = 0; @@ -1727,7 +1715,7 @@ describe('projection', () => { } } - @Component({standalone: true, imports: [Projection], template: ``}) + @Component({imports: [Projection], template: ``}) class App {} const fixture = TestBed.createComponent(App); @@ -1744,7 +1732,6 @@ describe('projection', () => { @Directive({ selector: 'fallback-dir', - standalone: true, }) class FallbackDir implements OnDestroy { constructor() { @@ -1759,13 +1746,11 @@ describe('projection', () => { @Component({ selector: 'projection', template: ``, - standalone: true, imports: [FallbackDir], }) class Projection {} @Component({ - standalone: true, imports: [Projection], template: ` @if (hasProjection) { @@ -1791,7 +1776,6 @@ describe('projection', () => { @Directive({ selector: 'fallback-dir', - standalone: true, }) class FallbackDir { constructor() { @@ -1802,7 +1786,6 @@ describe('projection', () => { @Component({ selector: 'projection', template: ``, - standalone: true, imports: [FallbackDir], }) class Projection { @@ -1810,7 +1793,6 @@ describe('projection', () => { } @Component({ - standalone: true, imports: [Projection], template: ``, }) @@ -1828,7 +1810,6 @@ describe('projection', () => { it('should be able to inject the host component from inside the fallback content', () => { @Directive({ selector: 'fallback-dir', - standalone: true, }) class FallbackDir { host = inject(Projection); @@ -1837,7 +1818,6 @@ describe('projection', () => { @Component({ selector: 'projection', template: ``, - standalone: true, imports: [FallbackDir], }) class Projection { @@ -1845,7 +1825,6 @@ describe('projection', () => { } @Component({ - standalone: true, imports: [Projection], template: ``, }) @@ -1861,7 +1840,6 @@ describe('projection', () => { it('should render the fallback content if content is not provided through projectableNodes', () => { @Component({ - standalone: true, template: `One fallback|` + `Two fallback|Three fallback`, @@ -1886,7 +1864,6 @@ describe('projection', () => { it('should render the content through projectableNodes along with fallback', () => { @Component({ - standalone: true, template: `One fallback|` + `Two fallback|Three fallback`, @@ -1914,7 +1891,6 @@ describe('projection', () => { @Component({ selector: 'projection', template: `Fallback`, - standalone: true, }) class Projection { @ViewChild('template') template!: TemplateRef; @@ -1926,7 +1902,6 @@ describe('projection', () => { } @Component({ - standalone: true, imports: [Projection], template: ``, }) @@ -1950,7 +1925,6 @@ describe('projection', () => { Inner header fallback Inner footer fallback `, - standalone: true, }) class InnerProjection {} @@ -1962,13 +1936,11 @@ describe('projection', () => { Outer footer fallback `, - standalone: true, imports: [InnerProjection], }) class Projection {} @Component({ - standalone: true, imports: [Projection], template: ` @@ -1990,7 +1962,6 @@ describe('projection', () => { @Component({ selector: 'fallback', - standalone: true, template: 'Fallback', }) class Fallback { @@ -2002,13 +1973,11 @@ describe('projection', () => { @Component({ selector: 'projection', template: ``, - standalone: true, imports: [Fallback], }) class Projection {} @Component({ - standalone: true, imports: [Projection], template: `Hello`, }) @@ -2026,12 +1995,10 @@ describe('projection', () => { @Component({ selector: 'projection', template: `Fallback`, - standalone: true, }) class Projection {} @Component({ - standalone: true, imports: [Projection], template: ` Content @@ -2054,12 +2021,10 @@ describe('projection', () => { @Component({ selector: 'projection', template: `Fallback`, - standalone: true, }) class Projection {} @Component({ - standalone: true, imports: [Projection], template: ` diff --git a/packages/core/test/acceptance/control_flow_for_spec.ts b/packages/core/test/acceptance/control_flow_for_spec.ts index 1b8336fefac0..81e5d71e379e 100644 --- a/packages/core/test/acceptance/control_flow_for_spec.ts +++ b/packages/core/test/acceptance/control_flow_for_spec.ts @@ -129,7 +129,7 @@ describe('control flow - for', () => { }); it('should be able to use pipes injecting ChangeDetectorRef in for loop blocks', () => { - @Pipe({name: 'test', standalone: true}) + @Pipe({name: 'test'}) class TestPipe implements PipeTransform { changeDetectorRef = inject(ChangeDetectorRef); @@ -141,7 +141,6 @@ describe('control flow - for', () => { @Component({ template: '@for (item of items | test; track item;) {{{item}}|}', imports: [TestPipe], - standalone: true, }) class TestComponent { items = [1, 2, 3]; @@ -156,7 +155,6 @@ describe('control flow - for', () => { @Directive({ selector: '[dir]', exportAs: 'dir', - standalone: true, }) class Dir { data = [1]; @@ -168,7 +166,6 @@ describe('control flow - for', () => { @Component({ selector: 'app-root', - standalone: true, imports: [Dir], template: `
@@ -589,14 +586,12 @@ describe('control flow - for', () => { ]; @Component({ - standalone: true, template: ``, selector: 'child-cmp', }) class ChildCmp {} @Component({ - standalone: true, imports: [ChildCmp], template: ` @for(task of tasks; track task.id) { @@ -622,14 +617,12 @@ describe('control flow - for', () => { describe('content projection', () => { it('should project an @for with a single root node into the root node slot', () => { @Component({ - standalone: true, selector: 'test', template: 'Main: Slot: ', }) class TestComponent {} @Component({ - standalone: true, imports: [TestComponent], template: ` Before @for (item of items; track $index) { @@ -649,14 +642,12 @@ describe('control flow - for', () => { it('should project an @empty block with a single root node into the root node slot', () => { @Component({ - standalone: true, selector: 'test', template: 'Main: Slot: ', }) class TestComponent {} @Component({ - standalone: true, imports: [TestComponent], template: ` Before @for (item of items; track $index) {} @empty { @@ -676,7 +667,6 @@ describe('control flow - for', () => { it('should allow @for and @empty blocks to be projected into different slots', () => { @Component({ - standalone: true, selector: 'test', template: 'Main: Loop slot: Empty slot: ', @@ -684,7 +674,6 @@ describe('control flow - for', () => { class TestComponent {} @Component({ - standalone: true, imports: [TestComponent], template: ` Before @for (item of items; track $index) { @@ -714,14 +703,12 @@ describe('control flow - for', () => { it('should project an @for with multiple root nodes into the catch-all slot', () => { @Component({ - standalone: true, selector: 'test', template: 'Main: Slot: ', }) class TestComponent {} @Component({ - standalone: true, imports: [TestComponent], template: ` Before @for (item of items; track $index) { @@ -743,7 +730,7 @@ describe('control flow - for', () => { it('should project an @for with a single root node with a data binding', () => { let directiveCount = 0; - @Directive({standalone: true, selector: '[foo]'}) + @Directive({selector: '[foo]'}) class Foo { @Input('foo') value: any; @@ -753,14 +740,12 @@ describe('control flow - for', () => { } @Component({ - standalone: true, selector: 'test', template: 'Main: Slot: ', }) class TestComponent {} @Component({ - standalone: true, imports: [TestComponent, Foo], template: ` Before @for (item of items; track $index) { @@ -781,14 +766,12 @@ describe('control flow - for', () => { it('should project an @for with an ng-container root node', () => { @Component({ - standalone: true, selector: 'test', template: 'Main: Slot: ', }) class TestComponent {} @Component({ - standalone: true, imports: [TestComponent], template: ` Before @for (item of items; track $index) { @@ -813,14 +796,12 @@ describe('control flow - for', () => { // This test is to ensure that we don't regress if it happens in the future. it('should project an @for with single root node and comments into the root node slot', () => { @Component({ - standalone: true, selector: 'test', template: 'Main: Slot: ', }) class TestComponent {} @Component({ - standalone: true, imports: [TestComponent], template: ` Before @for (item of items; track $index) { @@ -842,14 +823,12 @@ describe('control flow - for', () => { it('should project the root node when preserveWhitespaces is enabled and there are no whitespace nodes', () => { @Component({ - standalone: true, selector: 'test', template: 'Main: Slot: ', }) class TestComponent {} @Component({ - standalone: true, imports: [TestComponent], preserveWhitespaces: true, // Note the whitespace due to the indentation inside @for. @@ -867,14 +846,12 @@ describe('control flow - for', () => { it('should not project the root node when preserveWhitespaces is enabled and there are whitespace nodes', () => { @Component({ - standalone: true, selector: 'test', template: 'Main: Slot: ', }) class TestComponent {} @Component({ - standalone: true, imports: [TestComponent], preserveWhitespaces: true, // Note the whitespace due to the indentation inside @for. @@ -895,14 +872,12 @@ describe('control flow - for', () => { it('should not project the root node across multiple layers of @for', () => { @Component({ - standalone: true, selector: 'test', template: 'Main: Slot: ', }) class TestComponent {} @Component({ - standalone: true, imports: [TestComponent], template: ` Before @for (item of items; track $index) { @@ -923,14 +898,12 @@ describe('control flow - for', () => { it('should project an @for with a single root template node into the root node slot', () => { @Component({ - standalone: true, selector: 'test', template: 'Main: Slot: ', }) class TestComponent {} @Component({ - standalone: true, imports: [TestComponent, NgIf], template: `Before @for (item of items; track $index) { {{item}} @@ -953,7 +926,6 @@ describe('control flow - for', () => { let directiveCount = 0; @Component({ - standalone: true, selector: 'test', template: 'Main: Slot: ', }) @@ -961,7 +933,6 @@ describe('control flow - for', () => { @Directive({ selector: '[foo]', - standalone: true, }) class FooDirective { constructor() { @@ -970,7 +941,6 @@ describe('control flow - for', () => { } @Component({ - standalone: true, imports: [TestComponent, FooDirective], template: `Before @for (item of items; track $index) { {{item}} @@ -992,7 +962,6 @@ describe('control flow - for', () => { let directiveCount = 0; @Component({ - standalone: true, selector: 'test', template: 'Main: Slot: ', }) @@ -1000,7 +969,6 @@ describe('control flow - for', () => { @Directive({ selector: '[templateDir]', - standalone: true, }) class TemplateDirective implements OnInit { constructor( @@ -1017,7 +985,6 @@ describe('control flow - for', () => { } @Component({ - standalone: true, imports: [TestComponent, TemplateDirective], template: `Before @for (item of items; track $index) { {{item}} @@ -1039,7 +1006,6 @@ describe('control flow - for', () => { let directiveCount = 0; @Component({ - standalone: true, selector: 'test', template: 'Main: Slot: ', }) @@ -1047,7 +1013,6 @@ describe('control flow - for', () => { @Directive({ selector: '[templateDir]', - standalone: true, }) class TemplateDirective implements OnInit { constructor( @@ -1064,7 +1029,6 @@ describe('control flow - for', () => { } @Component({ - standalone: true, imports: [TestComponent, TemplateDirective], template: `Before @for (item of items; track $index) { {{item}} @@ -1108,14 +1072,12 @@ describe('control flow - for', () => { it('should project an @for with a single root node and @let declarations into the root node slot', () => { @Component({ - standalone: true, selector: 'test', template: 'Main: Slot: ', }) class TestComponent {} @Component({ - standalone: true, imports: [TestComponent], template: ` Before @for (item of items; track $index) { diff --git a/packages/core/test/acceptance/control_flow_if_spec.ts b/packages/core/test/acceptance/control_flow_if_spec.ts index 3541023dbe12..66a1c5882bb8 100644 --- a/packages/core/test/acceptance/control_flow_if_spec.ts +++ b/packages/core/test/acceptance/control_flow_if_spec.ts @@ -22,7 +22,7 @@ import { import {TestBed} from '@angular/core/testing'; // Basic shared pipe used during testing. -@Pipe({name: 'multiply', pure: true, standalone: true}) +@Pipe({name: 'multiply', pure: true}) class MultiplyPipe implements PipeTransform { transform(value: number, amount: number) { return value * amount; @@ -31,7 +31,7 @@ class MultiplyPipe implements PipeTransform { describe('control flow - if', () => { it('should add and remove views based on conditions change', () => { - @Component({standalone: true, template: '@if (show) {Something} @else {Nothing}'}) + @Component({template: '@if (show) {Something} @else {Nothing}'}) class TestComponent { show = true; } @@ -48,7 +48,6 @@ describe('control flow - if', () => { it('should expose expression value in context', () => { @Component({ - standalone: true, template: '@if (show; as alias) {{{show}} aliased to {{alias}}}', }) class TestComponent { @@ -66,7 +65,6 @@ describe('control flow - if', () => { it('should not expose the aliased expression to `if` and `else if` blocks', () => { @Component({ - standalone: true, template: ` @if (value === 1; as alias) { If: {{value}} as {{alias || 'unavailable'}} @@ -96,7 +94,6 @@ describe('control flow - if', () => { it('should expose the context to nested conditional blocks', () => { @Component({ - standalone: true, imports: [MultiplyPipe], template: ` @if (value | multiply:2; as root) { @@ -135,7 +132,6 @@ describe('control flow - if', () => { let logs: any[] = []; @Component({ - standalone: true, imports: [MultiplyPipe], template: ` @if (value | multiply:2; as root) { @@ -186,7 +182,6 @@ describe('control flow - if', () => { it('should expose expression value passed through a pipe in context', () => { @Component({ - standalone: true, template: '@if (value | multiply:2; as alias) {{{value}} aliased to {{alias}}}', imports: [MultiplyPipe], }) @@ -205,7 +200,6 @@ describe('control flow - if', () => { it('should destroy all views if there is nothing to display', () => { @Component({ - standalone: true, template: '@if (show) {Something}', }) class TestComponent { @@ -223,7 +217,6 @@ describe('control flow - if', () => { it('should be able to use pipes in conditional expressions', () => { @Component({ - standalone: true, imports: [MultiplyPipe], template: ` @if ((value | multiply:2) === 2) { @@ -254,7 +247,7 @@ describe('control flow - if', () => { }); it('should be able to use pipes injecting ChangeDetectorRef in if blocks', () => { - @Pipe({name: 'test', standalone: true}) + @Pipe({name: 'test'}) class TestPipe implements PipeTransform { changeDetectorRef = inject(ChangeDetectorRef); @@ -264,7 +257,6 @@ describe('control flow - if', () => { } @Component({ - standalone: true, template: '@if (show | test) {Something}', imports: [TestPipe], }) @@ -279,7 +271,6 @@ describe('control flow - if', () => { it('should support a condition with the a typeof expression', () => { @Component({ - standalone: true, template: ` @if (typeof value === 'string') { {{value.length}} @@ -304,14 +295,12 @@ describe('control flow - if', () => { describe('content projection', () => { it('should project an @if with a single root node into the root node slot', () => { @Component({ - standalone: true, selector: 'test', template: 'Main: Slot: ', }) class TestComponent {} @Component({ - standalone: true, imports: [TestComponent], template: ` Before @if (true) { @@ -330,7 +319,7 @@ describe('control flow - if', () => { it('should project an @if with a single root node with a data binding', () => { let directiveCount = 0; - @Directive({standalone: true, selector: '[foo]'}) + @Directive({selector: '[foo]'}) class Foo { @Input('foo') value: any; @@ -340,14 +329,12 @@ describe('control flow - if', () => { } @Component({ - standalone: true, selector: 'test', template: 'Main: Slot: ', }) class TestComponent {} @Component({ - standalone: true, imports: [TestComponent, Foo], template: ` Before @if (true) { @@ -368,14 +355,12 @@ describe('control flow - if', () => { it('should project an @if with multiple root nodes into the catch-all slot', () => { @Component({ - standalone: true, selector: 'test', template: 'Main: Slot: ', }) class TestComponent {} @Component({ - standalone: true, imports: [TestComponent], template: ` Before @if (true) { @@ -394,14 +379,12 @@ describe('control flow - if', () => { it('should project an @if with an ng-container root node', () => { @Component({ - standalone: true, selector: 'test', template: 'Main: Slot: ', }) class TestComponent {} @Component({ - standalone: true, imports: [TestComponent], template: ` Before @if (true) { @@ -424,14 +407,12 @@ describe('control flow - if', () => { // This test is to ensure that we don't regress if it happens in the future. it('should project an @if with a single root node and comments into the root node slot', () => { @Component({ - standalone: true, selector: 'test', template: 'Main: Slot: ', }) class TestComponent {} @Component({ - standalone: true, imports: [TestComponent], template: ` Before @if (true) { @@ -451,7 +432,6 @@ describe('control flow - if', () => { it('should project @if an @else content into separate slots', () => { @Component({ - standalone: true, selector: 'test', template: 'if: (), else: ()', @@ -459,7 +439,6 @@ describe('control flow - if', () => { class TestComponent {} @Component({ - standalone: true, imports: [TestComponent], template: ` @@ -490,14 +469,12 @@ describe('control flow - if', () => { it('should project @if an @else content into separate slots when if has default content', () => { @Component({ - standalone: true, selector: 'test', template: 'if: (), else: ()', }) class TestComponent {} @Component({ - standalone: true, imports: [TestComponent], template: ` @@ -528,14 +505,12 @@ describe('control flow - if', () => { it('should project @if an @else content into separate slots when else has default content', () => { @Component({ - standalone: true, selector: 'test', template: 'if: (), else: ()', }) class TestComponent {} @Component({ - standalone: true, imports: [TestComponent], template: ` @@ -566,14 +541,12 @@ describe('control flow - if', () => { it('should project the root node when preserveWhitespaces is enabled and there are no whitespace nodes', () => { @Component({ - standalone: true, selector: 'test', template: 'Main: Slot: ', }) class TestComponent {} @Component({ - standalone: true, imports: [TestComponent], preserveWhitespaces: true, template: 'Before @if (true) {one} After', @@ -587,14 +560,12 @@ describe('control flow - if', () => { it('should not project the root node when preserveWhitespaces is enabled and there are whitespace nodes', () => { @Component({ - standalone: true, selector: 'test', template: 'Main: Slot: ', }) class TestComponent {} @Component({ - standalone: true, imports: [TestComponent], preserveWhitespaces: true, // Note the whitespace due to the indentation inside @if. @@ -613,14 +584,12 @@ describe('control flow - if', () => { it('should not project the root node across multiple layers of @if', () => { @Component({ - standalone: true, selector: 'test', template: 'Main: Slot: ', }) class TestComponent {} @Component({ - standalone: true, imports: [TestComponent], template: ` Before @if (true) { @@ -639,14 +608,12 @@ describe('control flow - if', () => { it('should project an @if with a single root template node into the root node slot', () => { @Component({ - standalone: true, selector: 'test', template: 'Main: Slot: ', }) class TestComponent {} @Component({ - standalone: true, imports: [TestComponent, NgFor], template: `Before @if (true) { {{item}} @@ -669,7 +636,6 @@ describe('control flow - if', () => { let directiveCount = 0; @Component({ - standalone: true, selector: 'test', template: 'Main: Slot: ', }) @@ -677,7 +643,6 @@ describe('control flow - if', () => { @Directive({ selector: '[foo]', - standalone: true, }) class FooDirective { constructor() { @@ -686,7 +651,6 @@ describe('control flow - if', () => { } @Component({ - standalone: true, imports: [TestComponent, FooDirective], template: `Before @if (true) { foo @@ -706,7 +670,6 @@ describe('control flow - if', () => { let directiveCount = 0; @Component({ - standalone: true, selector: 'test', template: 'Main: Slot: ', }) @@ -714,7 +677,6 @@ describe('control flow - if', () => { @Directive({ selector: '[templateDir]', - standalone: true, }) class TemplateDirective implements OnInit { constructor( @@ -731,7 +693,6 @@ describe('control flow - if', () => { } @Component({ - standalone: true, imports: [TestComponent, TemplateDirective], template: `Before @if (true) { foo @@ -751,7 +712,6 @@ describe('control flow - if', () => { let directiveCount = 0; @Component({ - standalone: true, selector: 'test', template: 'Main: Slot: ', }) @@ -759,7 +719,6 @@ describe('control flow - if', () => { @Directive({ selector: '[templateDir]', - standalone: true, }) class TemplateDirective implements OnInit { constructor( @@ -776,7 +735,6 @@ describe('control flow - if', () => { } @Component({ - standalone: true, imports: [TestComponent, TemplateDirective], template: `Before @if (true) { foo @@ -796,7 +754,6 @@ describe('control flow - if', () => { let directiveCount = 0; @Component({ - standalone: true, selector: 'test', template: 'Main: Slot: ', }) @@ -804,7 +761,6 @@ describe('control flow - if', () => { @Directive({ selector: '.foo', - standalone: true, }) class TemplateDirective { constructor() { @@ -813,7 +769,6 @@ describe('control flow - if', () => { } @Component({ - standalone: true, imports: [TestComponent, TemplateDirective], template: `Before @if (condition) {
foo
@@ -861,14 +816,12 @@ describe('control flow - if', () => { it('should project an @if with a single root node and @let declarations into the root node slot', () => { @Component({ - standalone: true, selector: 'test', template: 'Main: Slot: ', }) class TestComponent {} @Component({ - standalone: true, imports: [TestComponent], template: ` Before @if (true) { diff --git a/packages/core/test/acceptance/control_flow_switch_spec.ts b/packages/core/test/acceptance/control_flow_switch_spec.ts index c70d3c3e90c1..a9a0ca4d28b7 100644 --- a/packages/core/test/acceptance/control_flow_switch_spec.ts +++ b/packages/core/test/acceptance/control_flow_switch_spec.ts @@ -10,7 +10,7 @@ import {ChangeDetectorRef, Component, inject, Pipe, PipeTransform} from '@angula import {TestBed} from '@angular/core/testing'; // Basic shared pipe used during testing. -@Pipe({name: 'multiply', pure: true, standalone: true}) +@Pipe({name: 'multiply', pure: true}) class MultiplyPipe implements PipeTransform { transform(value: number, amount: number) { return value * amount; @@ -20,7 +20,6 @@ class MultiplyPipe implements PipeTransform { describe('control flow - switch', () => { it('should show a template based on a matching case', () => { @Component({ - standalone: true, template: ` @switch (case) { @case (0) {case 0} @@ -49,7 +48,6 @@ describe('control flow - switch', () => { it('should be able to use a pipe in the switch expression', () => { @Component({ - standalone: true, imports: [MultiplyPipe], template: ` @switch (case | multiply:2) { @@ -79,7 +77,6 @@ describe('control flow - switch', () => { it('should be able to use a pipe in the case expression', () => { @Component({ - standalone: true, imports: [MultiplyPipe], template: ` @switch (case) { @@ -108,7 +105,7 @@ describe('control flow - switch', () => { }); it('should be able to use pipes injecting ChangeDetectorRef in switch blocks', () => { - @Pipe({name: 'test', standalone: true}) + @Pipe({name: 'test'}) class TestPipe implements PipeTransform { changeDetectorRef = inject(ChangeDetectorRef); @@ -118,7 +115,6 @@ describe('control flow - switch', () => { } @Component({ - standalone: true, template: ` @switch (case | test) { @case (0 | test) {Zero} @@ -138,7 +134,6 @@ describe('control flow - switch', () => { it('should project @switch cases into appropriate slots when selectors are used for all cases', () => { @Component({ - standalone: true, selector: 'test', template: 'case 1: (), case 2: (), case 3: ()', @@ -146,7 +141,6 @@ describe('control flow - switch', () => { class TestComponent {} @Component({ - standalone: true, imports: [TestComponent], template: ` @@ -183,7 +177,6 @@ describe('control flow - switch', () => { it('should project @switch cases into appropriate slots when selectors are used for some cases', () => { @Component({ - standalone: true, selector: 'test', template: 'case 1: (), case 2: (), case 3: ()', @@ -191,7 +184,6 @@ describe('control flow - switch', () => { class TestComponent {} @Component({ - standalone: true, imports: [TestComponent], template: ` diff --git a/packages/core/test/acceptance/csp_spec.ts b/packages/core/test/acceptance/csp_spec.ts index 2ef31dbef9c2..5338ead5ef49 100644 --- a/packages/core/test/acceptance/csp_spec.ts +++ b/packages/core/test/acceptance/csp_spec.ts @@ -45,14 +45,12 @@ describe('CSP integration', () => { selector: 'uses-styles', template: '', styles: [testStyles], - standalone: true, encapsulation: ViewEncapsulation.Emulated, }) class UsesStyles {} @Component({ selector: 'app', - standalone: true, template: '', imports: [UsesStyles], }) @@ -73,14 +71,12 @@ describe('CSP integration', () => { selector: 'uses-styles', template: '', styles: [testStyles], - standalone: true, encapsulation: ViewEncapsulation.None, }) class UsesStyles {} @Component({ selector: 'app', - standalone: true, template: '', imports: [UsesStyles], }) @@ -107,7 +103,6 @@ describe('CSP integration', () => { selector: 'uses-styles', template: '', styles: [testStyles], - standalone: true, encapsulation: ViewEncapsulation.ShadowDom, }) class UsesStyles { @@ -118,7 +113,6 @@ describe('CSP integration', () => { @Component({ selector: 'app', - standalone: true, template: '', imports: [UsesStyles], }) @@ -135,12 +129,11 @@ describe('CSP integration', () => { it( 'should prefer nonce provided through DI over one provided in the DOM', withBody('', async () => { - @Component({selector: 'uses-styles', template: '', styles: [testStyles], standalone: true}) + @Component({selector: 'uses-styles', template: '', styles: [testStyles]}) class UsesStyles {} @Component({ selector: 'app', - standalone: true, template: '', imports: [UsesStyles], }) diff --git a/packages/core/test/acceptance/defer_spec.ts b/packages/core/test/acceptance/defer_spec.ts index ac1f0ec5a659..1992b7e2ae58 100644 --- a/packages/core/test/acceptance/defer_spec.ts +++ b/packages/core/test/acceptance/defer_spec.ts @@ -137,7 +137,6 @@ async function verifyTimeline( function createFixture(template: string) { @Component({ selector: 'nested-cmp', - standalone: true, template: '{{ block }}', }) class NestedCmp { @@ -145,7 +144,6 @@ function createFixture(template: string) { } @Component({ - standalone: true, selector: 'simple-app', imports: [NestedCmp], template, @@ -203,13 +201,11 @@ describe('@defer', () => { it('should transition between placeholder, loading and loaded states', async () => { @Component({ selector: 'my-lazy-cmp', - standalone: true, template: 'Hi!', }) class MyLazyCmp {} @Component({ - standalone: true, selector: 'simple-app', imports: [MyLazyCmp], template: ` @@ -248,13 +244,11 @@ describe('@defer', () => { it('should work when only main block is present', async () => { @Component({ selector: 'my-lazy-cmp', - standalone: true, template: 'Hi!', }) class MyLazyCmp {} @Component({ - standalone: true, selector: 'simple-app', imports: [MyLazyCmp], template: ` @@ -284,7 +278,7 @@ describe('@defer', () => { }); it('should be able to use pipes injecting ChangeDetectorRef in defer blocks', async () => { - @Pipe({name: 'test', standalone: true}) + @Pipe({name: 'test'}) class TestPipe implements PipeTransform { changeDetectorRef = inject(ChangeDetectorRef); @@ -294,7 +288,6 @@ describe('@defer', () => { } @Component({ - standalone: true, imports: [TestPipe], template: `@defer (when isVisible | test; prefetch when isVisible | test) {Hello}`, }) @@ -323,7 +316,6 @@ describe('@defer', () => { // code is wrapped using the `@defer` block. const logs: string[] = []; @Directive({ - standalone: true, selector: '[dirA]', }) class DirA { @@ -333,7 +325,6 @@ describe('@defer', () => { } @Directive({ - standalone: true, selector: '[dirB]', }) class DirB { @@ -343,7 +334,6 @@ describe('@defer', () => { } @Directive({ - standalone: true, selector: '[dirC]', }) class DirC { @@ -353,7 +343,6 @@ describe('@defer', () => { } @Component({ - standalone: true, // Directive order is intentional here (different from the order // in which they are defined on the host element). imports: [DirC, DirB, DirA], @@ -387,7 +376,6 @@ describe('@defer', () => { it('should render when @defer is used inside of an OnPush component', async () => { @Component({ selector: 'my-lazy-cmp', - standalone: true, template: '{{ foo }}', }) class MyLazyCmp { @@ -395,7 +383,6 @@ describe('@defer', () => { } @Component({ - standalone: true, selector: 'simple-app', imports: [MyLazyCmp], changeDetection: ChangeDetectionStrategy.OnPush, @@ -420,7 +407,6 @@ describe('@defer', () => { it('should render when @defer-loaded component uses OnPush', async () => { @Component({ selector: 'my-lazy-cmp', - standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: '{{ foo }}', }) @@ -429,7 +415,6 @@ describe('@defer', () => { } @Component({ - standalone: true, selector: 'simple-app', imports: [MyLazyCmp], template: ` @@ -453,7 +438,6 @@ describe('@defer', () => { it('should render when both @defer-loaded and host component use OnPush', async () => { @Component({ selector: 'my-lazy-cmp', - standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: '{{ foo }}', }) @@ -462,7 +446,6 @@ describe('@defer', () => { } @Component({ - standalone: true, selector: 'simple-app', imports: [MyLazyCmp], changeDetection: ChangeDetectionStrategy.OnPush, @@ -487,7 +470,6 @@ describe('@defer', () => { it('should render when both OnPush components used in other blocks (e.g. @placeholder)', async () => { @Component({ selector: 'my-lazy-cmp', - standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: '{{ foo }}', }) @@ -497,7 +479,6 @@ describe('@defer', () => { @Component({ selector: 'another-lazy-cmp', - standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: '{{ foo }}', }) @@ -506,7 +487,6 @@ describe('@defer', () => { } @Component({ - standalone: true, selector: 'simple-app', imports: [MyLazyCmp, AnotherLazyCmp], changeDetection: ChangeDetectionStrategy.OnPush, @@ -550,7 +530,6 @@ describe('@defer', () => { it('should support `on immediate` condition', async () => { @Component({ selector: 'nested-cmp', - standalone: true, template: 'Rendering {{ block }} block.', }) class NestedCmp { @@ -558,7 +537,6 @@ describe('@defer', () => { } @Component({ - standalone: true, selector: 'root-app', imports: [NestedCmp], template: ` @@ -623,7 +601,6 @@ describe('@defer', () => { it('should support directive matching in all blocks', async () => { @Component({ selector: 'nested-cmp', - standalone: true, template: 'Rendering {{ block }} block.', }) class NestedCmp { @@ -631,7 +608,6 @@ describe('@defer', () => { } @Component({ - standalone: true, selector: 'simple-app', imports: [NestedCmp], template: ` @@ -822,7 +798,6 @@ describe('@defer', () => { it('should render an error block when loading fails', async () => { @Component({ selector: 'nested-cmp', - standalone: true, template: 'Rendering {{ block }} block.', }) class NestedCmp { @@ -830,7 +805,6 @@ describe('@defer', () => { } @Component({ - standalone: true, selector: 'simple-app', imports: [NestedCmp], template: ` @@ -889,13 +863,11 @@ describe('@defer', () => { it('should report an error to the ErrorHandler if no `@error` block is defined', async () => { @Component({ selector: 'nested-cmp', - standalone: true, template: 'NestedCmp', }) class NestedCmp {} @Component({ - standalone: true, selector: 'simple-app', imports: [NestedCmp], template: ` @@ -959,7 +931,6 @@ describe('@defer', () => { it('should not render `@error` block if loaded component has errors', async () => { @Component({ selector: 'cmp-with-error', - standalone: true, template: 'CmpWithError', }) class CmpWithError { @@ -969,7 +940,6 @@ describe('@defer', () => { } @Component({ - standalone: true, selector: 'simple-app', imports: [CmpWithError], template: ` @@ -1045,7 +1015,6 @@ describe('@defer', () => { it(`should log an error in the handler when there is no error block with devMode:${devMode}`, async () => { @Component({ selector: 'nested-cmp', - standalone: true, template: 'Rendering {{ block }} block.', }) class NestedCmp { @@ -1053,7 +1022,6 @@ describe('@defer', () => { } @Component({ - standalone: true, selector: 'simple-app', imports: [NestedCmp], template: ` @@ -1126,7 +1094,6 @@ describe('@defer', () => { it('should query for components within each block', async () => { @Component({ selector: 'nested-cmp', - standalone: true, template: 'Rendering {{ block }} block.', }) class NestedCmp { @@ -1134,7 +1101,6 @@ describe('@defer', () => { } @Component({ - standalone: true, selector: 'simple-app', imports: [NestedCmp], template: ` @@ -1192,21 +1158,18 @@ describe('@defer', () => { it('should be able to project content into each block', async () => { @Component({ selector: 'cmp-a', - standalone: true, template: 'CmpA', }) class CmpA {} @Component({ selector: 'cmp-b', - standalone: true, template: 'CmpB', }) class CmpB {} @Component({ selector: 'nested-cmp', - standalone: true, template: 'Rendering {{ block }} block.', }) class NestedCmp { @@ -1214,7 +1177,6 @@ describe('@defer', () => { } @Component({ - standalone: true, selector: 'my-app', imports: [NestedCmp], template: ` @@ -1238,7 +1200,6 @@ describe('@defer', () => { } @Component({ - standalone: true, selector: 'root-app', imports: [MyCmp, CmpA, CmpB], template: ` @@ -1303,14 +1264,12 @@ describe('@defer', () => { it('should be able to have nested blocks', async () => { @Component({ selector: 'cmp-a', - standalone: true, template: 'CmpA', }) class CmpA {} @Component({ selector: 'nested-cmp', - standalone: true, template: 'Rendering {{ block }} block.', }) class NestedCmp { @@ -1318,7 +1277,6 @@ describe('@defer', () => { } @Component({ - standalone: true, selector: 'root-app', imports: [NestedCmp, CmpA], template: ` @@ -1377,13 +1335,11 @@ describe('@defer', () => { it('should handle nested blocks that defer load the same dep', async () => { @Component({ selector: 'cmp-a', - standalone: true, template: 'CmpA', }) class CmpA {} @Component({ - standalone: true, selector: 'root-app', imports: [CmpA], template: ` @@ -1495,7 +1451,6 @@ describe('@defer', () => { it('should be able to prefetch resources', async () => { @Component({ selector: 'nested-cmp', - standalone: true, template: 'Rendering {{ block }} block.', }) class NestedCmp { @@ -1503,7 +1458,6 @@ describe('@defer', () => { } @Component({ - standalone: true, selector: 'root-app', imports: [NestedCmp], template: ` @@ -1576,7 +1530,6 @@ describe('@defer', () => { it('should handle a case when prefetching fails', async () => { @Component({ selector: 'nested-cmp', - standalone: true, template: 'Rendering {{ block }} block.', }) class NestedCmp { @@ -1584,7 +1537,6 @@ describe('@defer', () => { } @Component({ - standalone: true, selector: 'root-app', imports: [NestedCmp], template: ` @@ -1656,7 +1608,6 @@ describe('@defer', () => { it('should work when loading and prefetching were kicked off at the same time', async () => { @Component({ selector: 'nested-cmp', - standalone: true, template: 'Rendering {{ block }} block.', }) class NestedCmp { @@ -1664,7 +1615,6 @@ describe('@defer', () => { } @Component({ - standalone: true, selector: 'root-app', imports: [NestedCmp], template: ` @@ -1724,7 +1674,6 @@ describe('@defer', () => { it('should support `prefetch on idle` condition', async () => { @Component({ selector: 'nested-cmp', - standalone: true, template: 'Rendering {{ block }} block.', }) class NestedCmp { @@ -1732,7 +1681,6 @@ describe('@defer', () => { } @Component({ - standalone: true, selector: 'root-app', imports: [NestedCmp], template: ` @@ -1801,7 +1749,6 @@ describe('@defer', () => { it('should trigger prefetching based on `on idle` only once', async () => { @Component({ selector: 'nested-cmp', - standalone: true, template: 'Rendering {{ block }} block.', }) class NestedCmp { @@ -1809,7 +1756,6 @@ describe('@defer', () => { } @Component({ - standalone: true, selector: 'root-app', imports: [NestedCmp], template: ` @@ -1882,7 +1828,6 @@ describe('@defer', () => { it('should trigger fetching based on `on idle` only once', async () => { @Component({ selector: 'nested-cmp', - standalone: true, template: 'Rendering {{ block }} block.', }) class NestedCmp { @@ -1890,7 +1835,6 @@ describe('@defer', () => { } @Component({ - standalone: true, selector: 'root-app', imports: [NestedCmp], template: ` @@ -1952,7 +1896,6 @@ describe('@defer', () => { it('should support `prefetch on immediate` condition', async () => { @Component({ selector: 'nested-cmp', - standalone: true, template: 'Rendering {{ block }} block.', }) class NestedCmp { @@ -1960,7 +1903,6 @@ describe('@defer', () => { } @Component({ - standalone: true, selector: 'root-app', imports: [NestedCmp], template: ` @@ -2031,7 +1973,6 @@ describe('@defer', () => { it('should delay nested defer blocks with `on idle` triggers', async () => { @Component({ selector: 'nested-cmp', - standalone: true, template: 'Primary block content.', }) class NestedCmp { @@ -2040,13 +1981,11 @@ describe('@defer', () => { @Component({ selector: 'another-nested-cmp', - standalone: true, template: 'Nested block component.', }) class AnotherNestedCmp {} @Component({ - standalone: true, selector: 'root-app', imports: [NestedCmp, AnotherNestedCmp], template: ` @@ -2129,7 +2068,6 @@ describe('@defer', () => { it('should not request idle callback for each block in a for loop', async () => { @Component({ selector: 'nested-cmp', - standalone: true, template: 'Rendering {{ block }} block.', }) class NestedCmp { @@ -2137,7 +2075,6 @@ describe('@defer', () => { } @Component({ - standalone: true, selector: 'root-app', imports: [NestedCmp], template: ` @@ -2200,7 +2137,6 @@ describe('@defer', () => { it('should delay nested defer blocks with `on idle` triggers', async () => { @Component({ selector: 'nested-cmp', - standalone: true, template: 'Primary block content.', }) class NestedCmp { @@ -2209,13 +2145,11 @@ describe('@defer', () => { @Component({ selector: 'another-nested-cmp', - standalone: true, template: 'Nested block component.', }) class AnotherNestedCmp {} @Component({ - standalone: true, selector: 'root-app', imports: [NestedCmp, AnotherNestedCmp], template: ` @@ -2296,7 +2230,6 @@ describe('@defer', () => { it('should clear idle handlers when defer block is triggered', async () => { @Component({ - standalone: true, selector: 'root-app', template: ` @defer (when isVisible; on idle; prefetch on idle) { @@ -2339,7 +2272,6 @@ describe('@defer', () => { describe('trigger resolution', () => { it('should resolve a trigger is outside the defer block', fakeAsync(() => { @Component({ - standalone: true, template: ` @defer (on interaction(trigger)) { Main content @@ -2369,11 +2301,10 @@ describe('@defer', () => { })); it('should resolve a trigger on a component outside the defer block', fakeAsync(() => { - @Component({selector: 'some-comp', template: '', standalone: true}) + @Component({selector: 'some-comp', template: ''}) class SomeComp {} @Component({ - standalone: true, imports: [SomeComp], template: ` @defer (on interaction(trigger)) { @@ -2405,7 +2336,6 @@ describe('@defer', () => { it('should resolve a trigger that is on a parent element', fakeAsync(() => { @Component({ - standalone: true, template: ` @@ -2466,11 +2395,10 @@ describe('@defer', () => { })); it('should resolve a trigger that is on a component in a parent embedded view', fakeAsync(() => { - @Component({selector: 'some-comp', template: '', standalone: true}) + @Component({selector: 'some-comp', template: ''}) class SomeComp {} @Component({ - standalone: true, imports: [SomeComp], template: ` @if (cond) { @@ -2504,7 +2432,6 @@ describe('@defer', () => { it('should resolve a trigger that is inside the placeholder', fakeAsync(() => { @Component({ - standalone: true, template: ` @defer (on interaction(trigger)) { Main content @@ -2526,11 +2453,10 @@ describe('@defer', () => { })); it('should resolve a trigger that is a component inside the placeholder', fakeAsync(() => { - @Component({selector: 'some-comp', template: '', standalone: true}) + @Component({selector: 'some-comp', template: ''}) class SomeComp {} @Component({ - standalone: true, imports: [SomeComp], template: ` @defer (on interaction(trigger)) { @@ -2556,7 +2482,6 @@ describe('@defer', () => { describe('interaction triggers', () => { it('should load the deferred content when the trigger is clicked', fakeAsync(() => { @Component({ - standalone: true, template: ` @defer (on interaction(trigger)) { Main content @@ -2586,7 +2511,6 @@ describe('@defer', () => { } @Component({ - standalone: true, template: ` @defer (on interaction(trigger)) { Main content @@ -2612,7 +2536,6 @@ describe('@defer', () => { it('should load the deferred content when an implicit trigger is clicked', fakeAsync(() => { @Component({ - standalone: true, template: ` @defer (on interaction) { Main content @@ -2636,7 +2559,6 @@ describe('@defer', () => { it('should load the deferred content if a child of the trigger is clicked', fakeAsync(() => { @Component({ - standalone: true, template: ` @defer (on interaction(trigger)) { Main content @@ -2665,7 +2587,6 @@ describe('@defer', () => { it('should support multiple deferred blocks with the same trigger', fakeAsync(() => { @Component({ - standalone: true, template: ` @defer (on interaction(trigger)) { Main content 1 @@ -2696,7 +2617,6 @@ describe('@defer', () => { it('should unbind the trigger events when the deferred block is loaded', fakeAsync(() => { @Component({ - standalone: true, template: ` @defer (on interaction(trigger)) {Main content} @@ -2721,7 +2641,6 @@ describe('@defer', () => { it('should unbind the trigger events when the trigger is destroyed', fakeAsync(() => { @Component({ - standalone: true, template: ` @if (renderBlock) { @defer (on interaction(trigger)) {Main content} @@ -2749,7 +2668,6 @@ describe('@defer', () => { it('should unbind the trigger events when the deferred block is destroyed', fakeAsync(() => { @Component({ - standalone: true, template: ` @if (renderBlock) { @defer (on interaction(trigger)) {Main content} @@ -2778,7 +2696,6 @@ describe('@defer', () => { it('should remove placeholder content on interaction', fakeAsync(() => { @Component({ - standalone: true, template: ` @defer (on interaction(trigger)) { Main content @@ -2811,7 +2728,6 @@ describe('@defer', () => { it('should prefetch resources on interaction', fakeAsync(() => { @Component({ - standalone: true, selector: 'root-app', template: ` @defer (when isLoaded; prefetch on interaction(trigger)) {Main content} @@ -2855,7 +2771,6 @@ describe('@defer', () => { it('should prefetch resources on interaction with an implicit trigger', fakeAsync(() => { @Component({ - standalone: true, selector: 'root-app', template: ` @defer (when isLoaded; prefetch on interaction) { @@ -2909,7 +2824,6 @@ describe('@defer', () => { } @Component({ - standalone: true, template: ` @defer (on hover(trigger)) { Main content @@ -2940,7 +2854,6 @@ describe('@defer', () => { } @Component({ - standalone: true, template: ` @defer (on hover) { Main content @@ -2970,7 +2883,6 @@ describe('@defer', () => { } @Component({ - standalone: true, template: ` @defer (on hover(trigger)) { Main content 1 @@ -3007,7 +2919,6 @@ describe('@defer', () => { } @Component({ - standalone: true, template: ` @defer (on hover(trigger)) { Main content @@ -3040,7 +2951,6 @@ describe('@defer', () => { } @Component({ - standalone: true, template: ` @if (renderBlock) { @defer (on hover(trigger)) { @@ -3076,7 +2986,6 @@ describe('@defer', () => { } @Component({ - standalone: true, template: ` @if (renderBlock) { @defer (on hover(trigger)) { @@ -3113,7 +3022,6 @@ describe('@defer', () => { } @Component({ - standalone: true, selector: 'root-app', template: ` @defer (when isLoaded; prefetch on hover(trigger)) { @@ -3165,7 +3073,6 @@ describe('@defer', () => { } @Component({ - standalone: true, selector: 'root-app', template: ` @defer (when isLoaded; prefetch on hover) { @@ -3216,7 +3123,6 @@ describe('@defer', () => { it('should trigger based on `on timer` condition', async () => { @Component({ selector: 'nested-cmp', - standalone: true, template: 'Rendering {{ block }} block.', }) class NestedCmp { @@ -3224,7 +3130,6 @@ describe('@defer', () => { } @Component({ - standalone: true, selector: 'root-app', imports: [NestedCmp], template: ` @@ -3292,7 +3197,6 @@ describe('@defer', () => { it('should trigger nested `on timer` condition', async () => { @Component({ - standalone: true, selector: 'root-app', template: ` @defer (on timer(100ms)) { @@ -3339,7 +3243,6 @@ describe('@defer', () => { it('should trigger prefetching based on `on timer` condition', async () => { @Component({ selector: 'nested-cmp', - standalone: true, template: 'Rendering {{ block }} block.', }) class NestedCmp { @@ -3347,7 +3250,6 @@ describe('@defer', () => { } @Component({ - standalone: true, selector: 'root-app', imports: [NestedCmp], template: ` @@ -3428,7 +3330,6 @@ describe('@defer', () => { const clearSpy = spyOn(globalThis, 'clearTimeout'); @Component({ - standalone: true, selector: 'root-app', template: ` @defer (when isVisible; on timer(200ms); prefetch on timer(100ms)) { @@ -3554,7 +3455,6 @@ describe('@defer', () => { it('should load the deferred content when the trigger is in the viewport', fakeAsync(() => { @Component({ - standalone: true, template: ` @defer (on viewport(trigger)) { Main content @@ -3581,7 +3481,6 @@ describe('@defer', () => { it('should load the deferred content when an implicit trigger is in the viewport', fakeAsync(() => { @Component({ - standalone: true, template: ` @defer (on viewport) { Main content @@ -3607,7 +3506,6 @@ describe('@defer', () => { it('should not load the content if the trigger is not in the view yet', fakeAsync(() => { @Component({ - standalone: true, template: ` @defer (on viewport(trigger)) { Main content @@ -3645,7 +3543,6 @@ describe('@defer', () => { it('should support multiple deferred blocks with the same trigger', fakeAsync(() => { @Component({ - standalone: true, template: ` @defer (on viewport(trigger)) { Main content 1 @@ -3677,7 +3574,6 @@ describe('@defer', () => { it('should stop observing the trigger when the deferred block is loaded', fakeAsync(() => { @Component({ - standalone: true, template: ` @defer (on viewport(trigger)) { Main content @@ -3705,7 +3601,6 @@ describe('@defer', () => { it('should stop observing the trigger when the trigger is destroyed', fakeAsync(() => { @Component({ - standalone: true, template: ` @if (renderBlock) { @defer (on viewport(trigger)) { @@ -3736,7 +3631,6 @@ describe('@defer', () => { it('should stop observing the trigger when the deferred block is destroyed', fakeAsync(() => { @Component({ - standalone: true, template: ` @if (renderBlock) { @defer (on viewport(trigger)) { @@ -3768,7 +3662,6 @@ describe('@defer', () => { it('should disconnect the intersection observer once all deferred blocks have been loaded', fakeAsync(() => { @Component({ - standalone: true, template: ` @defer (on viewport(triggerOne)) { @@ -3808,7 +3701,6 @@ describe('@defer', () => { it('should prefetch resources when the trigger comes into the viewport', fakeAsync(() => { @Component({ - standalone: true, selector: 'root-app', template: ` @defer (when isLoaded; prefetch on viewport(trigger)) { @@ -3855,7 +3747,6 @@ describe('@defer', () => { it('should prefetch resources when an implicit trigger comes into the viewport', fakeAsync(() => { @Component({ - standalone: true, selector: 'root-app', template: ` @defer (when isLoaded; prefetch on viewport) { @@ -3903,7 +3794,6 @@ describe('@defer', () => { it('should load deferred content in a loop', fakeAsync(() => { @Component({ - standalone: true, template: ` @for (item of items; track item) { @defer (on viewport) {d{{item}} } @@ -3944,7 +3834,6 @@ describe('@defer', () => { describe('DOM-based events cleanup', () => { it('should unbind `interaction` trigger events when the deferred block is loaded', async () => { @Component({ - standalone: true, template: ` @defer ( when isVisible; @@ -3994,7 +3883,6 @@ describe('@defer', () => { it('should unbind `hover` trigger events when the deferred block is loaded', async () => { @Component({ - standalone: true, template: ` @defer ( when isVisible; @@ -4067,7 +3955,6 @@ describe('@defer', () => { const TokenB = new InjectionToken('B'); @Component({ - standalone: true, selector: 'parent-cmp', template: '', providers: [{provide: TokenA, useValue: 'TokenA.ParentCmp'}], @@ -4075,7 +3962,6 @@ describe('@defer', () => { class ParentCmp {} @Component({ - standalone: true, selector: 'child-cmp', template: 'Token A: {{ parentTokenA }} | Token B: {{ parentTokenB }}', }) @@ -4085,7 +3971,6 @@ describe('@defer', () => { } @Component({ - standalone: true, selector: 'app-root', template: ` @@ -4145,7 +4030,6 @@ describe('@defer', () => { @Component({ selector: 'lazy', - standalone: true, imports: [MyModule], template: ` Lazy Component! Token: {{ token }} @@ -4156,7 +4040,6 @@ describe('@defer', () => { } @Component({ - standalone: true, imports: [Lazy], template: ` @defer (on immediate) { @@ -4167,7 +4050,6 @@ describe('@defer', () => { class Dialog {} @Component({ - standalone: true, selector: 'app-root', providers: [{provide: TokenA, useValue: 'TokenA from RootCmp'}], template: ` @@ -4260,14 +4142,12 @@ describe('@defer', () => { @Component({ selector: 'chart-collection', template: '', - standalone: true, imports: [ChartsModule], }) class ChartCollectionComponent {} @Component({ selector: 'app-root', - standalone: true, template: ` @for(item of items; track $index) { @defer (when isVisible) { @@ -4336,14 +4216,12 @@ describe('@defer', () => { class MyModuleA {} @Component({ - standalone: true, imports: [RouterOutlet], template: '', }) class App {} @Component({ - standalone: true, selector: 'another-child', imports: [CommonModule, MyModuleA], template: 'another child: {{route.snapshot.url[0]}} | token: {{tokenA}}', @@ -4357,7 +4235,6 @@ describe('@defer', () => { } @Component({ - standalone: true, imports: [CommonModule, AnotherChild], template: ` child: {{route.snapshot.url[0]}} | diff --git a/packages/core/test/acceptance/destroy_ref_spec.ts b/packages/core/test/acceptance/destroy_ref_spec.ts index 872b4db4d67d..83b363ce8d82 100644 --- a/packages/core/test/acceptance/destroy_ref_spec.ts +++ b/packages/core/test/acceptance/destroy_ref_spec.ts @@ -82,7 +82,6 @@ describe('DestroyRef', () => { @Component({ selector: 'test', - standalone: true, template: ``, }) class TestCmp { @@ -103,7 +102,6 @@ describe('DestroyRef', () => { @Directive({ selector: '[withCleanup]', - standalone: true, }) class WithCleanupDirective { constructor() { @@ -113,7 +111,6 @@ describe('DestroyRef', () => { @Component({ selector: 'test', - standalone: true, imports: [WithCleanupDirective], // note: we are trying to register a LView-level cleanup _before_ TView-level one (event // listener) @@ -136,7 +133,6 @@ describe('DestroyRef', () => { @Directive({ selector: '[withCleanup]', - standalone: true, }) class WithCleanupDirective { constructor() { @@ -146,7 +142,6 @@ describe('DestroyRef', () => { @Component({ selector: 'test', - standalone: true, imports: [WithCleanupDirective, NgIf], template: `
`, }) @@ -167,7 +162,6 @@ describe('DestroyRef', () => { const onDestroySpy = jasmine.createSpy('destroy spy'); @Component({ selector: 'child', - standalone: true, template: '', }) class Child { @@ -176,7 +170,6 @@ describe('DestroyRef', () => { } } @Component({ - standalone: true, imports: [Child, NgIf], template: '', }) @@ -197,7 +190,6 @@ describe('DestroyRef', () => { @Component({ selector: 'test', - standalone: true, template: ``, }) class TestCmp { @@ -223,7 +215,6 @@ describe('DestroyRef', () => { @Component({ selector: 'test', - standalone: true, template: ``, }) class TestCmp { @@ -251,7 +242,6 @@ describe('DestroyRef', () => { it('should throw when trying to register destroy callback on destroyed LView', () => { @Component({ selector: 'test', - standalone: true, template: ``, }) class TestCmp { @@ -272,7 +262,6 @@ describe('DestroyRef', () => { @Component({ selector: 'test', - standalone: true, template: ``, }) class TestCmp { diff --git a/packages/core/test/acceptance/di_spec.ts b/packages/core/test/acceptance/di_spec.ts index 2a837a7075dc..5ef849a7722a 100644 --- a/packages/core/test/acceptance/di_spec.ts +++ b/packages/core/test/acceptance/di_spec.ts @@ -309,7 +309,6 @@ describe('importProvidersFrom', () => { class ModuleA {} @Component({ - standalone: true, template: '', imports: [ModuleA], }) @@ -3924,7 +3923,6 @@ describe('di', () => { const TOKEN = new InjectionToken('TOKEN'); @Component({ - standalone: true, selector: 'test-cmp', template: '{{value}}', providers: [{provide: TOKEN, useValue: 'injected value'}], @@ -3953,7 +3951,6 @@ describe('di', () => { } @Component({ - standalone: true, selector: 'test-cmp', template: '{{service.value}}', providers: [Service, {provide: TOKEN, useValue: 'injected value'}], @@ -3971,7 +3968,6 @@ describe('di', () => { const TOKEN = new InjectionToken('TOKEN'); @Component({ - standalone: true, selector: 'test-cmp', template: '{{value}}', }) @@ -4048,7 +4044,6 @@ describe('di', () => { } @Component({ - standalone: true, selector: 'test-cmp', template: '{{service.value}}', providers: [{provide: TOKEN, useValue: 'injected value'}], @@ -4074,7 +4069,6 @@ describe('di', () => { const TOKEN = new InjectionToken('TOKEN'); @Component({ - standalone: true, template: '', }) class TestCmp { @@ -4090,7 +4084,6 @@ describe('di', () => { factory: () => 'from root', }); @Component({ - standalone: true, template: '', providers: [{provide: TOKEN, useValue: 'from component'}], }) @@ -4108,7 +4101,6 @@ describe('di', () => { }); @Component({ - standalone: true, template: '', }) class TestCmp { @@ -4122,7 +4114,6 @@ describe('di', () => { const TOKEN = new InjectionToken('TOKEN'); @Component({ - standalone: true, selector: 'child', template: '{{value}}', }) @@ -4131,7 +4122,6 @@ describe('di', () => { } @Component({ - standalone: true, imports: [ChildCmp], template: '', providers: [{provide: TOKEN, useValue: 'from parent'}], @@ -4151,7 +4141,6 @@ describe('di', () => { }); @Component({ - standalone: true, template: '', }) class TestCmp { @@ -4171,7 +4160,6 @@ describe('di', () => { const TOKEN = new InjectionToken('TOKEN'); @Component({ - standalone: true, template: '', }) class TestCmp { @@ -4192,7 +4180,6 @@ describe('di', () => { const TOKEN = new InjectionToken('TOKEN'); @Component({ - standalone: true, template: '', }) class TestCmp { @@ -4227,7 +4214,6 @@ describe('di', () => { factory: () => 'from root', }); @Component({ - standalone: true, template: '', providers: [{provide: TOKEN, useValue: 'from component'}], }) @@ -4257,7 +4243,6 @@ describe('di', () => { }); @Component({ - standalone: true, template: '', }) class TestCmp { @@ -4282,7 +4267,6 @@ describe('di', () => { const TOKEN = new InjectionToken('TOKEN'); @Component({ - standalone: true, selector: 'child', template: '{{ a }}|{{ b }}', }) @@ -4293,7 +4277,6 @@ describe('di', () => { } @Component({ - standalone: true, imports: [ChildCmp], template: '', providers: [{provide: TOKEN, useValue: 'from parent'}], @@ -4364,7 +4347,6 @@ describe('di', () => { }); @Component({ - standalone: true, template: '', providers: [{provide: TOKEN, useValue: 'from component'}], }) @@ -4389,7 +4371,6 @@ describe('di', () => { it('should support node injectors', () => { @Component({ - standalone: true, template: '', }) class TestCmp { @@ -4905,13 +4886,12 @@ describe('di', () => { describe('HostAttributeToken', () => { it('should inject an attribute on an element node', () => { - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { value = inject(new HostAttributeToken('some-attr')); } @Component({ - standalone: true, template: '
', imports: [Dir], }) @@ -4925,13 +4905,12 @@ describe('di', () => { }); it('should inject an attribute on ', () => { - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { value = inject(new HostAttributeToken('some-attr')); } @Component({ - standalone: true, template: '', imports: [Dir], }) @@ -4945,13 +4924,12 @@ describe('di', () => { }); it('should inject an attribute on ', () => { - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { value = inject(new HostAttributeToken('some-attr')); } @Component({ - standalone: true, template: '', imports: [Dir], }) @@ -4965,7 +4943,7 @@ describe('di', () => { }); it('should be able to inject different kinds of attributes', () => { - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { className = inject(new HostAttributeToken('class')); inlineStyles = inject(new HostAttributeToken('style')); @@ -4973,7 +4951,6 @@ describe('di', () => { } @Component({ - standalone: true, template: `
{ }); it('should throw a DI error when injecting a non-existent attribute', () => { - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { value = inject(new HostAttributeToken('some-attr')); } @Component({ - standalone: true, template: '
', imports: [Dir], }) @@ -5019,13 +4995,12 @@ describe('di', () => { }); it('should not throw a DI error when injecting a non-existent attribute with optional: true', () => { - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { value = inject(new HostAttributeToken('some-attr'), {optional: true}); } @Component({ - standalone: true, template: '
', imports: [Dir], }) @@ -5039,7 +5014,7 @@ describe('di', () => { }); it('should not inject attributes with namespace', () => { - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { value = inject(new HostAttributeToken('some-attr'), {optional: true}); namespaceExists = inject(new HostAttributeToken('svg:exist'), {optional: true}); @@ -5047,7 +5022,6 @@ describe('di', () => { } @Component({ - standalone: true, template: `
`, @@ -5067,7 +5041,7 @@ describe('di', () => { }); it('should not inject attributes representing bindings and outputs', () => { - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { @Input() binding!: string; @Output() output = new EventEmitter(); @@ -5079,7 +5053,6 @@ describe('di', () => { } @Component({ - standalone: true, imports: [Dir], template: `
{ }); it('should not inject data-bound attributes', () => { - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { value = inject(new HostAttributeToken('title'), {optional: true}); } @Component({ - standalone: true, template: '
', imports: [Dir], }) @@ -5132,13 +5104,12 @@ describe('di', () => { it('should inject an attribute using @Inject', () => { const TOKEN = new HostAttributeToken('some-attr'); - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { constructor(@Inject(TOKEN) readonly value: string) {} } @Component({ - standalone: true, template: '
', imports: [Dir], }) @@ -5154,13 +5125,12 @@ describe('di', () => { it('should throw when injecting a non-existent attribute using @Inject', () => { const TOKEN = new HostAttributeToken('some-attr'); - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { constructor(@Inject(TOKEN) readonly value: string) {} } @Component({ - standalone: true, template: '
', imports: [Dir], }) @@ -5176,13 +5146,12 @@ describe('di', () => { it('should not throw when injecting a non-existent attribute using @Inject @Optional', () => { const TOKEN = new HostAttributeToken('some-attr'); - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { constructor(@Inject(TOKEN) @Optional() readonly value: string | null) {} } @Component({ - standalone: true, template: '
', imports: [Dir], }) @@ -5198,13 +5167,12 @@ describe('di', () => { describe('HOST_TAG_NAME', () => { it('should inject the tag name on an element node', () => { - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { value = inject(HOST_TAG_NAME); } @Component({ - standalone: true, template: `
@@ -5232,13 +5200,12 @@ describe('di', () => { }); it('should throw a DI error when injecting into non-DOM nodes', () => { - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { value = inject(HOST_TAG_NAME); } @Component({ - standalone: true, template: '', imports: [Dir], }) @@ -5247,7 +5214,6 @@ describe('di', () => { } @Component({ - standalone: true, template: '', imports: [Dir], }) @@ -5265,13 +5231,12 @@ describe('di', () => { }); it('should not throw a DI error when injecting into non-DOM nodes with optional: true', () => { - @Directive({selector: '[dir]', standalone: true}) + @Directive({selector: '[dir]'}) class Dir { value = inject(HOST_TAG_NAME, {optional: true}); } @Component({ - standalone: true, template: '', imports: [Dir], }) diff --git a/packages/core/test/acceptance/directive_spec.ts b/packages/core/test/acceptance/directive_spec.ts index 12099bea8e82..8c383b7f69c5 100644 --- a/packages/core/test/acceptance/directive_spec.ts +++ b/packages/core/test/acceptance/directive_spec.ts @@ -864,7 +864,7 @@ describe('directives', () => { }); it('should transform aliased inputs coming from host directives', () => { - @Directive({standalone: true}) + @Directive() class HostDir { @Input({transform: (value: string) => (value ? 1 : 0)}) value = -1; } diff --git a/packages/core/test/acceptance/env_injector_standalone_spec.ts b/packages/core/test/acceptance/env_injector_standalone_spec.ts index 0924c1a05d92..3bd45e1392c3 100644 --- a/packages/core/test/acceptance/env_injector_standalone_spec.ts +++ b/packages/core/test/acceptance/env_injector_standalone_spec.ts @@ -25,7 +25,7 @@ describe('environment injector and standalone components', () => { @NgModule({providers: [ModuleService]}) class Module {} - @Component({standalone: true, imports: [Module]}) + @Component({imports: [Module]}) class StandaloneComponent {} const parentEnvInjector = TestBed.inject(EnvironmentInjector); @@ -42,7 +42,7 @@ describe('environment injector and standalone components', () => { @NgModule({providers: [ModuleService]}) class Module {} - @Component({standalone: true, imports: [Module]}) + @Component({imports: [Module]}) class StandaloneComponent {} @NgModule({imports: [StandaloneComponent], exports: [StandaloneComponent]}) @@ -62,10 +62,10 @@ describe('environment injector and standalone components', () => { @NgModule({providers: [{provide: ModuleService, useClass: ModuleService, multi: true}]}) class Module {} - @Component({standalone: true, imports: [Module]}) + @Component({imports: [Module]}) class StandaloneComponent1 {} - @Component({standalone: true, imports: [Module]}) + @Component({imports: [Module]}) class StandaloneComponent2 {} @NgModule({ diff --git a/packages/core/test/acceptance/environment_injector_spec.ts b/packages/core/test/acceptance/environment_injector_spec.ts index 7a910e918fce..4f80382d185f 100644 --- a/packages/core/test/acceptance/environment_injector_spec.ts +++ b/packages/core/test/acceptance/environment_injector_spec.ts @@ -233,7 +233,6 @@ describe('environment injector', () => { }); @Component({ - standalone: true, template: '', providers: [{provide: TOKEN, useValue: 'from component'}], }) diff --git a/packages/core/test/acceptance/hmr_spec.ts b/packages/core/test/acceptance/hmr_spec.ts index ce88026f1a5e..6327eb66561c 100644 --- a/packages/core/test/acceptance/hmr_spec.ts +++ b/packages/core/test/acceptance/hmr_spec.ts @@ -44,7 +44,6 @@ describe('hot module replacement', () => { let instance!: ChildCmp; const initialMetadata: Component = { selector: 'child-cmp', - standalone: true, template: 'Hello {{state}}', }; @@ -58,7 +57,6 @@ describe('hot module replacement', () => { } @Component({ - standalone: true, imports: [ChildCmp], template: '', }) @@ -111,7 +109,6 @@ describe('hot module replacement', () => { it('should recreate multiple usages of a complex component', () => { const initialMetadata: Component = { selector: 'child-cmp', - standalone: true, template: 'ChildCmp (orig)

{{ text }}

', }; @@ -121,7 +118,6 @@ describe('hot module replacement', () => { } @Component({ - standalone: true, imports: [ChildCmp], template: ` Unrelated node #1 @@ -204,7 +200,6 @@ describe('hot module replacement', () => { it('should not recreate sub-classes of a component being replaced', () => { const initialMetadata: Component = { selector: 'child-cmp', - standalone: true, template: 'Base class', }; @@ -213,13 +208,11 @@ describe('hot module replacement', () => { @Component({ selector: 'child-sub-cmp', - standalone: true, template: 'Sub class', }) class ChildSubCmp extends ChildCmp {} @Component({ - standalone: true, imports: [ChildCmp, ChildSubCmp], template: `|`, }) @@ -275,7 +268,6 @@ describe('hot module replacement', () => { } @Component({ - standalone: true, imports: [ChildCmp], template: '', }) @@ -313,7 +305,6 @@ describe('hot module replacement', () => { it('should continue binding inputs to a component that is replaced', () => { const initialMetadata: Component = { selector: 'child-cmp', - standalone: true, template: '{{staticValue}}{{dynamicValue}}', }; @@ -324,7 +315,6 @@ describe('hot module replacement', () => { } @Component({ - standalone: true, imports: [ChildCmp], template: ``, }) @@ -397,7 +387,6 @@ describe('hot module replacement', () => { it('should recreate a component used inside @for', () => { const initialMetadata: Component = { selector: 'child-cmp', - standalone: true, template: 'Hello {{value}}', }; @@ -407,7 +396,6 @@ describe('hot module replacement', () => { } @Component({ - standalone: true, imports: [ChildCmp], template: ` @for (current of items; track current.id) { @@ -482,7 +470,6 @@ describe('hot module replacement', () => { it('should be able to replace a component that injects ViewContainerRef', () => { const initialMetadata: Component = { selector: 'child-cmp', - standalone: true, template: 'Hello world', }; @@ -492,7 +479,6 @@ describe('hot module replacement', () => { } @Component({ - standalone: true, imports: [ChildCmp], template: '', }) @@ -565,7 +551,6 @@ describe('hot module replacement', () => { it('should update ViewChildren query results', async () => { @Component({ selector: 'child-cmp', - standalone: true, template: 'ChildCmp {{ text }}', }) class ChildCmp { @@ -574,7 +559,6 @@ describe('hot module replacement', () => { let instance!: ParentCmp; const initialMetadata: Component = { - standalone: true, selector: 'parent-cmp', imports: [ChildCmp], template: ` @@ -593,7 +577,6 @@ describe('hot module replacement', () => { } @Component({ - standalone: true, imports: [ParentCmp], template: ``, }) @@ -623,7 +606,6 @@ describe('hot module replacement', () => { it('should update ViewChild when the string points to a different element', async () => { let instance!: ParentCmp; const initialMetadata: Component = { - standalone: true, selector: 'parent-cmp', template: `
@@ -644,7 +626,6 @@ describe('hot module replacement', () => { } @Component({ - standalone: true, imports: [ParentCmp], template: ``, }) @@ -677,14 +658,12 @@ describe('hot module replacement', () => { const token = new InjectionToken('token'); @Directive({ - standalone: true, selector: '[dir-a]', providers: [{provide: token, useExisting: DirA}], }) class DirA {} @Directive({ - standalone: true, selector: '[dir-b]', providers: [{provide: token, useExisting: DirB}], }) @@ -692,7 +671,6 @@ describe('hot module replacement', () => { let instance!: ParentCmp; const initialMetadata: Component = { - standalone: true, selector: 'parent-cmp', imports: [DirA, DirB], template: `
`, @@ -708,7 +686,6 @@ describe('hot module replacement', () => { } @Component({ - standalone: true, imports: [ParentCmp], template: ``, }) @@ -735,7 +712,6 @@ describe('hot module replacement', () => { const token = new InjectionToken('token'); @Directive({ - standalone: true, selector: '[dir]', providers: [{provide: token, useExisting: Dir}], }) @@ -743,7 +719,6 @@ describe('hot module replacement', () => { let instance!: ParentCmp; const initialMetadata: Component = { - standalone: true, selector: 'parent-cmp', imports: [Dir], template: `
`, @@ -759,7 +734,6 @@ describe('hot module replacement', () => { } @Component({ - standalone: true, imports: [ParentCmp], template: ``, }) @@ -782,7 +756,6 @@ describe('hot module replacement', () => { describe('content projection', () => { it('should work with content projection', () => { const initialMetadata: Component = { - standalone: true, selector: 'parent-cmp', template: ``, }; @@ -791,7 +764,6 @@ describe('hot module replacement', () => { class ParentCmp {} @Component({ - standalone: true, imports: [ParentCmp], template: ` @@ -848,7 +820,6 @@ describe('hot module replacement', () => { it('should handle elements moving around into different slots', () => { // Start off with a single catch-all slot. const initialMetadata: Component = { - standalone: true, selector: 'parent-cmp', template: ``, }; @@ -857,7 +828,6 @@ describe('hot module replacement', () => { class ParentCmp {} @Component({ - standalone: true, imports: [ParentCmp], template: ` @@ -934,7 +904,6 @@ describe('hot module replacement', () => { it('should handle default content for ng-content', () => { const initialMetadata: Component = { - standalone: true, selector: 'parent-cmp', template: ` @@ -947,7 +916,6 @@ describe('hot module replacement', () => { class ParentCmp {} @Component({ - standalone: true, imports: [ParentCmp], template: ` @@ -993,7 +961,6 @@ describe('hot module replacement', () => { it('should only invoke the init/destroy hooks inside the content when replacing the template', () => { @Component({ template: '', - standalone: true, selector: 'child-cmp', }) class ChildCmp implements OnInit, OnDestroy { @@ -1009,7 +976,6 @@ describe('hot module replacement', () => { } const initialMetadata: Component = { - standalone: true, template: ` @@ -1039,7 +1005,6 @@ describe('hot module replacement', () => { `, - standalone: true, imports: [ParentCmp], }) class RootCmp {} @@ -1099,7 +1064,6 @@ describe('hot module replacement', () => { it('should invoke checked hooks both on the host and the content being replaced', () => { @Component({ template: '', - standalone: true, selector: 'child-cmp', }) class ChildCmp implements DoCheck { @@ -1111,7 +1075,6 @@ describe('hot module replacement', () => { } const initialMetadata: Component = { - standalone: true, template: ``, imports: [ChildCmp], selector: 'parent-cmp', @@ -1127,7 +1090,6 @@ describe('hot module replacement', () => { @Component({ template: ``, - standalone: true, imports: [ParentCmp], }) class RootCmp {} @@ -1187,7 +1149,6 @@ describe('hot module replacement', () => { const values: string[] = []; const initialMetadata: Component = { selector: 'child-cmp', - standalone: true, template: '', }; @@ -1204,7 +1165,6 @@ describe('hot module replacement', () => { } @Component({ - standalone: true, imports: [ChildCmp], template: ``, }) @@ -1261,7 +1221,6 @@ describe('hot module replacement', () => { let count = 0; const initialMetadata: Component = { selector: 'child-cmp', - standalone: true, template: '', }; @@ -1275,7 +1234,6 @@ describe('hot module replacement', () => { } @Component({ - standalone: true, imports: [ChildCmp], template: ``, }) @@ -1313,7 +1271,6 @@ describe('hot module replacement', () => { let count = 0; const initialMetadata: Component = { selector: 'child-cmp', - standalone: true, template: '', }; @@ -1327,7 +1284,6 @@ describe('hot module replacement', () => { } @Component({ - standalone: true, imports: [ChildCmp], template: ``, }) @@ -1409,7 +1365,6 @@ describe('hot module replacement', () => { let destroyCount = 0; const initialMetadata: Component = { selector: 'child-cmp', - standalone: true, template: '', }; @@ -1424,7 +1379,7 @@ describe('hot module replacement', () => { } } - @Directive({selector: '[dir-a]', standalone: true}) + @Directive({selector: '[dir-a]'}) class DirA implements OnDestroy { constructor() { initLog.push('DirA init'); @@ -1435,7 +1390,7 @@ describe('hot module replacement', () => { } } - @Directive({selector: '[dir-b]', standalone: true}) + @Directive({selector: '[dir-b]'}) class DirB implements OnDestroy { constructor() { initLog.push('DirB init'); @@ -1447,7 +1402,6 @@ describe('hot module replacement', () => { } @Component({ - standalone: true, imports: [ChildCmp, DirA, DirB], template: ``, }) @@ -1472,7 +1426,7 @@ describe('hot module replacement', () => { const initLog: string[] = []; let destroyCount = 0; - @Directive({selector: '[dir-a]', standalone: true}) + @Directive({selector: '[dir-a]'}) class DirA implements OnDestroy { constructor() { initLog.push('DirA init'); @@ -1483,7 +1437,7 @@ describe('hot module replacement', () => { } } - @Directive({selector: '[dir-b]', standalone: true}) + @Directive({selector: '[dir-b]'}) class DirB implements OnDestroy { constructor() { initLog.push('DirB init'); @@ -1496,7 +1450,6 @@ describe('hot module replacement', () => { const initialMetadata: Component = { selector: 'child-cmp', - standalone: true, template: '', hostDirectives: [DirA, DirB], }; @@ -1513,7 +1466,6 @@ describe('hot module replacement', () => { } @Component({ - standalone: true, imports: [ChildCmp], template: '', }) @@ -1540,14 +1492,14 @@ describe('hot module replacement', () => { let instance!: ChildCmp; const injectedInstances: [unknown, ChildCmp][] = []; - @Directive({selector: '[dir-a]', standalone: true}) + @Directive({selector: '[dir-a]'}) class DirA { constructor() { injectedInstances.push([this, inject(ChildCmp)]); } } - @Directive({selector: '[dir-b]', standalone: true}) + @Directive({selector: '[dir-b]'}) class DirB { constructor() { injectedInstances.push([this, inject(ChildCmp)]); @@ -1556,7 +1508,6 @@ describe('hot module replacement', () => { const initialMetadata: Component = { selector: 'child-cmp', - standalone: true, template: '
', imports: [DirA, DirB], }; @@ -1569,7 +1520,6 @@ describe('hot module replacement', () => { } @Component({ - standalone: true, imports: [ChildCmp], template: '', }) @@ -1596,14 +1546,14 @@ describe('hot module replacement', () => { const token = new InjectionToken('TEST_TOKEN'); const injectedValues: [unknown, string][] = []; - @Directive({selector: '[dir-a]', standalone: true}) + @Directive({selector: '[dir-a]'}) class DirA { constructor() { injectedValues.push([this, inject(token)]); } } - @Directive({selector: '[dir-b]', standalone: true}) + @Directive({selector: '[dir-b]'}) class DirB { constructor() { injectedValues.push([this, inject(token)]); @@ -1612,7 +1562,6 @@ describe('hot module replacement', () => { const initialMetadata: Component = { selector: 'child-cmp', - standalone: true, template: '
', imports: [DirA, DirB], providers: [{provide: token, useValue: 'provided value'}], @@ -1622,7 +1571,6 @@ describe('hot module replacement', () => { class ChildCmp {} @Component({ - standalone: true, imports: [ChildCmp], template: '', }) @@ -1648,14 +1596,14 @@ describe('hot module replacement', () => { const token = new InjectionToken('TEST_TOKEN'); const injectedValues: [unknown, string][] = []; - @Directive({selector: '[dir-a]', standalone: true}) + @Directive({selector: '[dir-a]'}) class DirA { constructor() { injectedValues.push([this, inject(token)]); } } - @Directive({selector: '[dir-b]', standalone: true}) + @Directive({selector: '[dir-b]'}) class DirB { constructor() { injectedValues.push([this, inject(token)]); @@ -1664,7 +1612,6 @@ describe('hot module replacement', () => { const initialMetadata: Component = { selector: 'child-cmp', - standalone: true, template: '
', imports: [DirA, DirB], viewProviders: [{provide: token, useValue: 'provided value'}], @@ -1674,7 +1621,6 @@ describe('hot module replacement', () => { class ChildCmp {} @Component({ - standalone: true, imports: [ChildCmp], template: '', }) @@ -1701,7 +1647,6 @@ describe('hot module replacement', () => { it('should maintain attribute host bindings on a replaced component', () => { const initialMetadata: Component = { selector: 'child-cmp', - standalone: true, template: 'Hello', host: { '[attr.bar]': 'state', @@ -1714,7 +1659,6 @@ describe('hot module replacement', () => { } @Component({ - standalone: true, imports: [ChildCmp], template: ``, }) @@ -1755,7 +1699,6 @@ describe('hot module replacement', () => { it('should maintain class host bindings on a replaced component', () => { const initialMetadata: Component = { selector: 'child-cmp', - standalone: true, template: 'Hello', host: { '[class.bar]': 'state', @@ -1768,7 +1711,6 @@ describe('hot module replacement', () => { } @Component({ - standalone: true, imports: [ChildCmp], template: ``, }) @@ -1796,7 +1738,6 @@ describe('hot module replacement', () => { it('should maintain style host bindings on a replaced component', () => { const initialMetadata: Component = { selector: 'child-cmp', - standalone: true, template: 'Hello', host: { '[style.height]': 'state ? "5px" : "20px"', @@ -1809,7 +1750,6 @@ describe('hot module replacement', () => { } @Component({ - standalone: true, imports: [ChildCmp], template: ``, }) @@ -1860,7 +1800,6 @@ describe('hot module replacement', () => { const initialMetadata: Component = { selector: 'child-cmp', - standalone: true, template: 'hello', }; @@ -1868,7 +1807,6 @@ describe('hot module replacement', () => { class ChildCmp {} @Component({ - standalone: true, imports: [ChildCmp], template: '', }) @@ -1888,7 +1826,6 @@ describe('hot module replacement', () => { const initialMetadata: Component = { selector: 'child-cmp', - standalone: true, template: '', }; @@ -1896,7 +1833,6 @@ describe('hot module replacement', () => { class ChildCmp {} @Component({ - standalone: true, imports: [ChildCmp], template: `hello`, }) @@ -1931,7 +1867,6 @@ describe('hot module replacement', () => { let instance!: ChildCmp; const initialMetadata: Component = { selector: 'child-cmp', - standalone: true, template: 'Hello {{name}}!', }; @@ -1945,7 +1880,6 @@ describe('hot module replacement', () => { } @Component({ - standalone: true, imports: [ChildCmp], template: '', }) @@ -1984,7 +1918,6 @@ describe('hot module replacement', () => { const initialMetadata: Component = { selector: 'child-cmp', - standalone: true, template: '', }; @@ -1992,7 +1925,6 @@ describe('hot module replacement', () => { class ChildCmp {} @Component({ - standalone: true, imports: [ChildCmp], template: 'Hello {{name}}!', }) @@ -2037,7 +1969,6 @@ describe('hot module replacement', () => { let instance!: ChildCmp; const initialMetadata: Component = { selector: 'child-cmp', - standalone: true, template: '{count, select, 10 {ten} 20 {twenty} other {other}}', }; @@ -2051,7 +1982,6 @@ describe('hot module replacement', () => { } @Component({ - standalone: true, imports: [ChildCmp], template: '', }) @@ -2092,7 +2022,6 @@ describe('hot module replacement', () => { const initialMetadata: Component = { selector: 'child-cmp', - standalone: true, template: '', }; @@ -2100,7 +2029,6 @@ describe('hot module replacement', () => { class ChildCmp {} @Component({ - standalone: true, imports: [ChildCmp], template: '{count, select, 10 {ten} 20 {twenty} other {other}}', }) diff --git a/packages/core/test/acceptance/host_directives_spec.ts b/packages/core/test/acceptance/host_directives_spec.ts index b023d4c1fcef..b46ca2d0151a 100644 --- a/packages/core/test/acceptance/host_directives_spec.ts +++ b/packages/core/test/acceptance/host_directives_spec.ts @@ -38,7 +38,6 @@ describe('host directives', () => { const logs: string[] = []; @Directive({ - standalone: true, host: {'host-dir-attr': '', 'class': 'host-dir', 'style': 'height: 50px'}, }) class HostDir { @@ -101,14 +100,14 @@ describe('host directives', () => { } } - @Directive({standalone: true}) + @Directive() class OtherHostDir { constructor() { logs.push('OtherHostDir'); } } - @Directive({standalone: true}) + @Directive() class HostDir { constructor() { logs.push('HostDir'); @@ -149,14 +148,14 @@ describe('host directives', () => { }); } - @Directive({standalone: true, host: {'one': 'base'}}) + @Directive({host: {'one': 'base'}}) class OtherHostDir { constructor() { inject(Dir); } } - @Directive({standalone: true, host: {'two': 'base'}}) + @Directive({host: {'two': 'base'}}) class HostDir { constructor() { inject(Dir); @@ -192,7 +191,6 @@ describe('host directives', () => { 'id': 'leaf-id', }, providers: [{provide: token, useValue: 'leaf value'}], - standalone: true, }) class Chain1_3 { constructor(@Inject(token) tokenValue: string) { @@ -202,7 +200,6 @@ describe('host directives', () => { } @Directive({ - standalone: true, hostDirectives: [Chain1_3], }) class Chain1_2 { @@ -212,7 +209,6 @@ describe('host directives', () => { } @Directive({ - standalone: true, hostDirectives: [Chain1_2], }) class Chain1 { @@ -222,7 +218,6 @@ describe('host directives', () => { } @Directive({ - standalone: true, host: { 'class': 'middle', 'id': 'middle-id', @@ -236,7 +231,6 @@ describe('host directives', () => { } @Directive({ - standalone: true, hostDirectives: [Chain2_2], }) class Chain2 { @@ -245,14 +239,14 @@ describe('host directives', () => { } } - @Directive({standalone: true}) + @Directive() class Chain3_2 { constructor() { logs.push('Chain3 - level 2'); } } - @Directive({standalone: true, hostDirectives: [Chain3_2]}) + @Directive({hostDirectives: [Chain3_2]}) class Chain3 { constructor() { logs.push('Chain3 - level 1'); @@ -276,7 +270,7 @@ describe('host directives', () => { } } - @Directive({standalone: true}) + @Directive() class SelectorMatchedHostDir { constructor() { logs.push('SelectorMatchedHostDir'); @@ -327,14 +321,14 @@ describe('host directives', () => { let firstHostDirInstance!: FirstHostDir; let secondHostDirInstance!: SecondHostDir; - @Directive({standalone: true}) + @Directive() class SecondHostDir { constructor() { secondHostDirInstance = this; } } - @Directive({standalone: true, hostDirectives: [SecondHostDir]}) + @Directive({hostDirectives: [SecondHostDir]}) class FirstHostDir { constructor() { firstHostDirInstance = this; @@ -374,12 +368,12 @@ describe('host directives', () => { }); it('should be able to reference exported host directives', () => { - @Directive({standalone: true, exportAs: 'secondHost'}) + @Directive({exportAs: 'secondHost'}) class SecondHostDir { name = 'SecondHost'; } - @Directive({standalone: true, hostDirectives: [SecondHostDir], exportAs: 'firstHost'}) + @Directive({hostDirectives: [SecondHostDir], exportAs: 'firstHost'}) class FirstHostDir { name = 'FirstHost'; } @@ -412,42 +406,42 @@ describe('host directives', () => { it('should execute inherited host directives in the correct order', () => { const logs: string[] = []; - @Directive({standalone: true}) + @Directive() class HostGrandparent_1 { constructor() { logs.push('HostGrandparent_1'); } } - @Directive({standalone: true}) + @Directive() class HostGrandparent_2 { constructor() { logs.push('HostGrandparent_2'); } } - @Directive({standalone: true, hostDirectives: [HostGrandparent_1, HostGrandparent_2]}) + @Directive({hostDirectives: [HostGrandparent_1, HostGrandparent_2]}) class Grandparent { constructor() { logs.push('Grandparent'); } } - @Directive({standalone: true}) + @Directive() class HostParent_1 { constructor() { logs.push('HostParent_1'); } } - @Directive({standalone: true}) + @Directive() class HostParent_2 { constructor() { logs.push('HostParent_2'); } } - @Directive({standalone: true, hostDirectives: [HostParent_1, HostParent_2]}) + @Directive({hostDirectives: [HostParent_1, HostParent_2]}) class Parent extends Grandparent { constructor() { super(); @@ -455,14 +449,14 @@ describe('host directives', () => { } } - @Directive({standalone: true}) + @Directive() class HostDir_1 { constructor() { logs.push('HostDir_1'); } } - @Directive({standalone: true}) + @Directive() class HostDir_2 { constructor() { logs.push('HostDir_2'); @@ -508,7 +502,7 @@ describe('host directives', () => { it('should invoke lifecycle hooks from the host directives', () => { const logs: string[] = []; - @Directive({standalone: true}) + @Directive() class HostDir implements OnInit, AfterViewInit, AfterViewChecked { ngOnInit() { logs.push('HostDir - ngOnInit'); @@ -523,7 +517,7 @@ describe('host directives', () => { } } - @Directive({standalone: true}) + @Directive() class OtherHostDir implements OnInit, AfterViewInit, AfterViewChecked { ngOnInit() { logs.push('OtherHostDir - ngOnInit'); @@ -587,7 +581,7 @@ describe('host directives', () => { const logs: string[] = []; // Utility so we don't have to repeat the logging code. - @Directive({standalone: true}) + @Directive() abstract class LogsLifecycles implements OnInit, AfterViewInit { abstract name: string; @@ -600,12 +594,12 @@ describe('host directives', () => { } } - @Directive({standalone: true}) + @Directive() class ChildHostDir extends LogsLifecycles { override name = 'ChildHostDir'; } - @Directive({standalone: true}) + @Directive() class OtherChildHostDir extends LogsLifecycles { override name = 'OtherChildHostDir'; } @@ -619,12 +613,12 @@ describe('host directives', () => { override name = 'Child'; } - @Directive({standalone: true}) + @Directive() class ParentHostDir extends LogsLifecycles { override name = 'ParentHostDir'; } - @Directive({standalone: true}) + @Directive() class OtherParentHostDir extends LogsLifecycles { override name = 'OtherParentHostDir'; } @@ -681,7 +675,7 @@ describe('host directives', () => { let logs: string[] = []; // Utility so we don't have to repeat the logging code. - @Directive({standalone: true}) + @Directive() abstract class LogsLifecycles implements OnChanges { @Input() someInput: any; abstract name: string; @@ -691,12 +685,12 @@ describe('host directives', () => { } } - @Directive({standalone: true}) + @Directive() class HostDir extends LogsLifecycles { override name = 'HostDir'; } - @Directive({standalone: true}) + @Directive() class OtherHostDir extends LogsLifecycles { override name = 'OtherHostDir'; } @@ -757,7 +751,7 @@ describe('host directives', () => { it('should apply the host bindings from all host directives', () => { const clicks: string[] = []; - @Directive({standalone: true, host: {'host-dir-attr': 'true', '(click)': 'handleClick()'}}) + @Directive({host: {'host-dir-attr': 'true', '(click)': 'handleClick()'}}) class HostDir { handleClick() { clicks.push('HostDir'); @@ -765,7 +759,6 @@ describe('host directives', () => { } @Directive({ - standalone: true, host: {'other-host-dir-attr': 'true', '(click)': 'handleClick()'}, }) class OtherHostDir { @@ -809,10 +802,10 @@ describe('host directives', () => { }); it('should have the host bindings take precedence over the ones from the host directives', () => { - @Directive({standalone: true, host: {'id': 'host-dir'}}) + @Directive({host: {'id': 'host-dir'}}) class HostDir {} - @Directive({standalone: true, host: {'id': 'other-host-dir'}}) + @Directive({host: {'id': 'other-host-dir'}}) class OtherHostDir {} @Directive({ @@ -843,14 +836,14 @@ describe('host directives', () => { let firstHostDirInstance!: FirstHostDir; let secondHostDirInstance!: SecondHostDir; - @Directive({standalone: true}) + @Directive() class SecondHostDir { constructor() { secondHostDirInstance = this; } } - @Directive({standalone: true, hostDirectives: [SecondHostDir]}) + @Directive({hostDirectives: [SecondHostDir]}) class FirstHostDir { constructor() { firstHostDirInstance = this; @@ -901,7 +894,7 @@ describe('host directives', () => { hostDir = inject(HostDir); } - @Directive({standalone: true}) + @Directive() class HostDir { constructor() { hostDirectiveInstance = this; @@ -940,7 +933,7 @@ describe('host directives', () => { let firstHostDirInstance!: FirstHostDir; let secondHostDirInstance!: SecondHostDir; - @Directive({standalone: true}) + @Directive() class SecondHostDir { host = inject(Host); @@ -949,7 +942,7 @@ describe('host directives', () => { } } - @Directive({standalone: true, hostDirectives: [SecondHostDir]}) + @Directive({hostDirectives: [SecondHostDir]}) class FirstHostDir { host = inject(Host); @@ -993,7 +986,7 @@ describe('host directives', () => { let firstHostDirInstance!: FirstHostDir; let secondHostDirInstance!: SecondHostDir; - @Directive({standalone: true, providers: [{provide: token, useValue: 'SecondDir'}]}) + @Directive({providers: [{provide: token, useValue: 'SecondDir'}]}) class SecondHostDir { tokenValue = inject(token); @@ -1003,7 +996,6 @@ describe('host directives', () => { } @Directive({ - standalone: true, hostDirectives: [SecondHostDir], providers: [{provide: token, useValue: 'FirstDir'}], }) @@ -1052,11 +1044,10 @@ describe('host directives', () => { const firstToken = new InjectionToken('firstToken'); const secondToken = new InjectionToken('secondToken'); - @Directive({standalone: true, providers: [{provide: secondToken, useValue: 'SecondDir'}]}) + @Directive({providers: [{provide: secondToken, useValue: 'SecondDir'}]}) class SecondHostDir {} @Directive({ - standalone: true, hostDirectives: [SecondHostDir], providers: [{provide: firstToken, useValue: 'FirstDir'}], }) @@ -1092,7 +1083,7 @@ describe('host directives', () => { const token = new InjectionToken('token'); let tokenValue: string | undefined; - @Directive({standalone: true, providers: [{provide: token, useValue: 'host-dir'}]}) + @Directive({providers: [{provide: token, useValue: 'host-dir'}]}) class HostDir {} @Component({ @@ -1131,7 +1122,7 @@ describe('host directives', () => { const token = new InjectionToken('token'); let tokenValue: string | null = null; - @Directive({standalone: true}) + @Directive() class HostDir { constructor() { tokenValue = inject(token, {optional: true}); @@ -1161,7 +1152,7 @@ describe('host directives', () => { }); it('should throw a circular dependency error if a host and a host directive inject each other', () => { - @Directive({standalone: true}) + @Directive() class HostDir { host = inject(Host); } @@ -1190,7 +1181,7 @@ describe('host directives', () => { it('should inject a valid ChangeDetectorRef when attached to a component', () => { type InternalChangeDetectorRef = ChangeDetectorRef & {_lView: unknown}; - @Directive({standalone: true}) + @Directive() class HostDir { changeDetectorRef = inject(ChangeDetectorRef) as InternalChangeDetectorRef; } @@ -1238,7 +1229,7 @@ describe('host directives', () => { it('should not emit to an output of a host directive that has not been exposed', () => { let hostDirectiveInstance: HostDir | undefined; - @Directive({standalone: true, host: {'(click)': 'hasBeenClicked.emit()'}}) + @Directive({host: {'(click)': 'hasBeenClicked.emit()'}}) class HostDir { @Output() hasBeenClicked = new EventEmitter(); @@ -1274,7 +1265,7 @@ describe('host directives', () => { }); it('should emit to an output of a host directive that has been exposed', () => { - @Directive({standalone: true, host: {'(click)': 'hasBeenClicked.emit("hello")'}}) + @Directive({host: {'(click)': 'hasBeenClicked.emit("hello")'}}) class HostDir { @Output() hasBeenClicked = new EventEmitter(); } @@ -1310,7 +1301,7 @@ describe('host directives', () => { }); it('should emit to an output of a host directive that has been exposed under an alias', () => { - @Directive({standalone: true, host: {'(click)': 'hasBeenClicked.emit("hello")'}}) + @Directive({host: {'(click)': 'hasBeenClicked.emit("hello")'}}) class HostDir { @Output() hasBeenClicked = new EventEmitter(); } @@ -1344,7 +1335,7 @@ describe('host directives', () => { }); it('should alias to the public name of the host directive output, not the private one', () => { - @Directive({standalone: true, host: {'(click)': 'hasBeenClicked.emit("hello")'}}) + @Directive({host: {'(click)': 'hasBeenClicked.emit("hello")'}}) class HostDir { @Output('wasClicked') hasBeenClicked = new EventEmitter(); } @@ -1381,7 +1372,7 @@ describe('host directives', () => { }); it('should emit to an output of a host that has the same name as a non-exposed output of a host directive', () => { - @Directive({standalone: true, host: {'(click)': 'hasBeenClicked.emit("HostDir")'}}) + @Directive({host: {'(click)': 'hasBeenClicked.emit("HostDir")'}}) class HostDir { @Output() hasBeenClicked = new EventEmitter(); } @@ -1415,7 +1406,7 @@ describe('host directives', () => { }); it('should emit to an output of a host that has the same name as an exposed output of a host directive', () => { - @Directive({standalone: true, host: {'(click)': 'hasBeenClicked.emit("HostDir")'}}) + @Directive({host: {'(click)': 'hasBeenClicked.emit("HostDir")'}}) class HostDir { @Output() hasBeenClicked = new EventEmitter(); } @@ -1451,7 +1442,7 @@ describe('host directives', () => { }); it('should emit to an output of a host that has the same name as the alias of a host directive output', () => { - @Directive({standalone: true, host: {'(click)': 'hasBeenClicked.emit("HostDir")'}}) + @Directive({host: {'(click)': 'hasBeenClicked.emit("HostDir")'}}) class HostDir { @Output() hasBeenClicked = new EventEmitter(); } @@ -1487,7 +1478,7 @@ describe('host directives', () => { }); it('should not expose the same output more than once', () => { - @Directive({standalone: true, host: {'(click)': 'hasBeenClicked.emit()'}}) + @Directive({host: {'(click)': 'hasBeenClicked.emit()'}}) class HostDir { @Output() hasBeenClicked = new EventEmitter(); } @@ -1526,7 +1517,7 @@ describe('host directives', () => { @Output() hasBeenClicked = new EventEmitter(); } - @Directive({standalone: true}) + @Directive() class HostDir extends ParentDir {} @Directive({ @@ -1555,12 +1546,12 @@ describe('host directives', () => { }); it('should emit to an output that was exposed from one host directive, but not another', () => { - @Directive({standalone: true, host: {'(click)': 'hasBeenClicked.emit("ExposedHostDir")'}}) + @Directive({host: {'(click)': 'hasBeenClicked.emit("ExposedHostDir")'}}) class ExposedHostDir { @Output() hasBeenClicked = new EventEmitter(); } - @Directive({standalone: true, host: {'(click)': 'hasBeenClicked.emit("UnExposedHostDir")'}}) + @Directive({host: {'(click)': 'hasBeenClicked.emit("UnExposedHostDir")'}}) class UnExposedHostDir { @Output() hasBeenClicked = new EventEmitter(); } @@ -1596,7 +1587,6 @@ describe('host directives', () => { it('should emit to outputs from different host directives that have been aliased to the same name', () => { @Directive({ - standalone: true, host: {'(click)': 'firstHasBeenClicked.emit("FirstHostDir")'}, }) class FirstHostDir { @@ -1604,7 +1594,6 @@ describe('host directives', () => { } @Directive({ - standalone: true, host: {'(click)': 'secondHasBeenClicked.emit("SecondHostDir")'}, }) class SecondHostDir { @@ -1642,7 +1631,7 @@ describe('host directives', () => { }); it('should emit to an output of an inherited host directive that has been exposed', () => { - @Directive({standalone: true, host: {'(click)': 'hasBeenClicked.emit("hello")'}}) + @Directive({host: {'(click)': 'hasBeenClicked.emit("hello")'}}) class HostDir { @Output() hasBeenClicked = new EventEmitter(); } @@ -1685,7 +1674,7 @@ describe('host directives', () => { describe('inputs', () => { it('should not set an input of a host directive that has not been exposed', () => { - @Directive({standalone: true}) + @Directive() class HostDir { @Input() color?: string; } @@ -1714,7 +1703,7 @@ describe('host directives', () => { }); it('should set the input of a host directive that has been exposed', () => { - @Directive({standalone: true}) + @Directive() class HostDir { @Input() color?: string; } @@ -1746,7 +1735,7 @@ describe('host directives', () => { }); it('should set an input of a host directive that has been exposed under an alias', () => { - @Directive({standalone: true}) + @Directive() class HostDir { @Input() color?: string; } @@ -1778,7 +1767,7 @@ describe('host directives', () => { }); it('should alias to the public name of the host directive input, not the private one', () => { - @Directive({standalone: true}) + @Directive() class HostDir { @Input('colorAlias') color?: string; } @@ -1810,7 +1799,7 @@ describe('host directives', () => { }); it('should set an input of a host that has the same name as a non-exposed input of a host directive', () => { - @Directive({standalone: true}) + @Directive() class HostDir { @Input() color?: string; } @@ -1850,7 +1839,7 @@ describe('host directives', () => { }); it('should set an input of a host that has the same name as an exposed input of a host directive', () => { - @Directive({standalone: true}) + @Directive() class HostDir { @Input() color?: string; } @@ -1890,7 +1879,7 @@ describe('host directives', () => { }); it('should set an input of a host that has the same name as the alias of a host directive input', () => { - @Directive({standalone: true}) + @Directive() class HostDir { @Input() color?: string; } @@ -1935,7 +1924,7 @@ describe('host directives', () => { @Input() color?: string; } - @Directive({standalone: true}) + @Directive() class HostDir extends ParentDir {} @Directive({ @@ -1967,12 +1956,12 @@ describe('host directives', () => { }); it('should set an input that was exposed from one host directive, but not another', () => { - @Directive({standalone: true}) + @Directive() class ExposedHostDir { @Input() color?: string; } - @Directive({standalone: true}) + @Directive() class UnExposedHostDir { @Input() color?: string; } @@ -2010,12 +1999,12 @@ describe('host directives', () => { }); it('should set inputs from different host directives that have been aliased to the same name', () => { - @Directive({standalone: true}) + @Directive() class FirstHostDir { @Input() firstColor?: string; } - @Directive({standalone: true}) + @Directive() class SecondHostDir { @Input() secondColor?: string; } @@ -2056,7 +2045,7 @@ describe('host directives', () => { }); it('should not set a static input of a host directive that has not been exposed', () => { - @Directive({standalone: true}) + @Directive() class HostDir { @Input() color?: string; } @@ -2084,7 +2073,7 @@ describe('host directives', () => { }); it('should set a static input of a host directive that has been exposed', () => { - @Directive({standalone: true}) + @Directive() class HostDir { @Input() color?: string; } @@ -2111,7 +2100,7 @@ describe('host directives', () => { }); it('should set a static input of a host directive that has been exposed under an alias', () => { - @Directive({standalone: true}) + @Directive() class HostDir { @Input() color?: string; } @@ -2138,7 +2127,7 @@ describe('host directives', () => { }); it('should alias to the public name of a static host directive input, not the private one', () => { - @Directive({standalone: true}) + @Directive() class HostDir { @Input('colorAlias') color?: string; } @@ -2165,12 +2154,12 @@ describe('host directives', () => { }); it('should set a static input that was exposed from one host directive, but not another', () => { - @Directive({standalone: true}) + @Directive() class ExposedHostDir { @Input() color?: string; } - @Directive({standalone: true}) + @Directive() class UnExposedHostDir { @Input() color?: string; } @@ -2200,12 +2189,12 @@ describe('host directives', () => { }); it('should set static inputs from different host directives that have been aliased to the same name', () => { - @Directive({standalone: true}) + @Directive() class FirstHostDir { @Input() firstColor?: string; } - @Directive({standalone: true}) + @Directive() class SecondHostDir { @Input() secondColor?: string; } @@ -2241,7 +2230,7 @@ describe('host directives', () => { it('should not expose an input under its host directive alias if a host directive is not applied', () => { const logs: string[] = []; - @Directive({selector: '[host-dir]', standalone: true}) + @Directive({selector: '[host-dir]'}) class HostDir implements OnChanges { @Input('colorAlias') color?: string; @@ -2252,13 +2241,11 @@ describe('host directives', () => { @Directive({ selector: '[dir]', - standalone: true, hostDirectives: [{directive: HostDir, inputs: ['colorAlias: buttonColor']}], }) class Dir {} @Component({ - standalone: true, imports: [Dir, HostDir], // Note that `[dir]` doesn't match on the `button` on purpose. // The wrong behavior would be if the `buttonColor` binding worked on `host-dir`. @@ -2284,7 +2271,7 @@ describe('host directives', () => { }); it('should set the input of an inherited host directive that has been exposed', () => { - @Directive({standalone: true}) + @Directive() class HostDir { @Input() color?: string; } @@ -2326,7 +2313,7 @@ describe('host directives', () => { let firstDirChangeEvent: SimpleChanges | undefined; let secondDirChangeEvent: SimpleChanges | undefined; - @Directive({standalone: true}) + @Directive() class FirstHostDir implements OnChanges { @Input() color?: string; @@ -2335,7 +2322,7 @@ describe('host directives', () => { } } - @Directive({standalone: true}) + @Directive() class SecondHostDir implements OnChanges { @Input() color?: string; @@ -2413,7 +2400,7 @@ describe('host directives', () => { let firstDirChangeEvent: SimpleChanges | undefined; let secondDirChangeEvent: SimpleChanges | undefined; - @Directive({standalone: true}) + @Directive() class FirstHostDir implements OnChanges { @Input('firstAlias') color?: string; @@ -2422,7 +2409,7 @@ describe('host directives', () => { } } - @Directive({standalone: true}) + @Directive() class SecondHostDir implements OnChanges { @Input('secondAlias') color?: string; @@ -2500,7 +2487,7 @@ describe('host directives', () => { let firstDirChangeEvent: SimpleChanges | undefined; let secondDirChangeEvent: SimpleChanges | undefined; - @Directive({standalone: true}) + @Directive() class FirstHostDir implements OnChanges { @Input() color?: string; @@ -2509,7 +2496,7 @@ describe('host directives', () => { } } - @Directive({standalone: true}) + @Directive() class SecondHostDir implements OnChanges { @Input() color?: string; @@ -2566,7 +2553,7 @@ describe('host directives', () => { it('should invoke ngOnChanges when a static aliased host directive input is set', () => { let latestChangeEvent: SimpleChanges | undefined; - @Directive({standalone: true}) + @Directive() class HostDir implements OnChanges { @Input('colorAlias') color?: string; @@ -2610,14 +2597,14 @@ describe('host directives', () => { let otherHostDirInstance!: OtherHostDir; let plainDirInstance!: PlainDir; - @Directive({standalone: true}) + @Directive() class HostDir { constructor() { hostDirInstance = this; } } - @Directive({standalone: true}) + @Directive() class OtherHostDir { constructor() { otherHostDirInstance = this; @@ -2666,7 +2653,7 @@ describe('host directives', () => { it('should be able to retrieve components that have host directives using ng.getComponent', () => { let compInstance!: Comp; - @Directive({standalone: true}) + @Directive() class HostDir {} @Component({ @@ -2699,7 +2686,7 @@ describe('host directives', () => { it('should be able to retrieve components that have host directives using DebugNode.componentInstance', () => { let compInstance!: Comp; - @Directive({standalone: true}) + @Directive() class HostDir {} @Component({ @@ -2730,7 +2717,7 @@ describe('host directives', () => { }); it('should be able to query by a host directive', () => { - @Directive({standalone: true}) + @Directive() class HostDir {} @Component({ @@ -2787,7 +2774,6 @@ describe('host directives', () => { const logs: string[] = []; @Directive({ - standalone: true, host: {'host-dir-attr': '', 'class': 'host-dir', 'style': 'height: 50px'}, }) class HostDir { @@ -2821,7 +2807,7 @@ describe('host directives', () => { it('should invoke lifecycle hooks on host directives applied to a root component', () => { const logs: string[] = []; - @Directive({standalone: true}) + @Directive() class HostDir implements OnInit, AfterViewInit, AfterViewChecked { ngOnInit() { logs.push('HostDir - ngOnInit'); @@ -2836,7 +2822,7 @@ describe('host directives', () => { } } - @Directive({standalone: true}) + @Directive() class OtherHostDir implements OnInit, AfterViewInit, AfterViewChecked { ngOnInit() { logs.push('OtherHostDir - ngOnInit'); @@ -2889,7 +2875,6 @@ describe('host directives', () => { describe('host bindings', () => { it('should support host attribute bindings coming from the host directives', () => { @Directive({ - standalone: true, host: { '[attr.host-dir-only]': 'value', '[attr.shadowed-attr]': 'value', @@ -2900,7 +2885,6 @@ describe('host directives', () => { } @Directive({ - standalone: true, host: { '[attr.other-host-dir-only]': 'value', '[attr.shadowed-attr]': 'value', @@ -2946,14 +2930,14 @@ describe('host directives', () => { it('should support host event bindings coming from the host directives', () => { const logs: string[] = []; - @Directive({standalone: true, host: {'(click)': 'handleClick()'}}) + @Directive({host: {'(click)': 'handleClick()'}}) class HostDir { handleClick() { logs.push('HostDir'); } } - @Directive({standalone: true, host: {'(click)': 'handleClick()'}}) + @Directive({host: {'(click)': 'handleClick()'}}) class OtherHostDir { handleClick() { logs.push('OtherHostDir'); @@ -2981,10 +2965,10 @@ describe('host directives', () => { }); it('should have the host bindings of the root component take precedence over the ones from the host directives', () => { - @Directive({standalone: true, host: {'id': 'host-dir'}}) + @Directive({host: {'id': 'host-dir'}}) class HostDir {} - @Directive({standalone: true, host: {'id': 'other-host-dir'}}) + @Directive({host: {'id': 'other-host-dir'}}) class OtherHostDir {} @Component({ @@ -3005,7 +2989,7 @@ describe('host directives', () => { it('should allow the host directive to inject the root component', () => { let hostDirInstance!: HostDir; - @Directive({standalone: true}) + @Directive() class HostDir { host = inject(HostComp); @@ -3030,7 +3014,7 @@ describe('host directives', () => { it('should allow the root component to inject the host directive', () => { let hostDirInstance!: HostDir; - @Directive({standalone: true}) + @Directive() class HostDir { constructor() { hostDirInstance = this; @@ -3057,7 +3041,7 @@ describe('host directives', () => { let firstHostDirInstance!: FirstHostDir; let secondHostDirInstance!: SecondHostDir; - @Directive({standalone: true, providers: [{provide: token, useValue: 'SecondDir'}]}) + @Directive({providers: [{provide: token, useValue: 'SecondDir'}]}) class SecondHostDir { tokenValue = inject(token); @@ -3067,7 +3051,6 @@ describe('host directives', () => { } @Directive({ - standalone: true, hostDirectives: [SecondHostDir], providers: [{provide: token, useValue: 'FirstDir'}], }) @@ -3108,11 +3091,10 @@ describe('host directives', () => { const firstToken = new InjectionToken('firstToken'); const secondToken = new InjectionToken('secondToken'); - @Directive({standalone: true, providers: [{provide: secondToken, useValue: 'SecondDir'}]}) + @Directive({providers: [{provide: secondToken, useValue: 'SecondDir'}]}) class SecondHostDir {} @Directive({ - standalone: true, hostDirectives: [SecondHostDir], providers: [{provide: firstToken, useValue: 'FirstDir'}], }) @@ -3139,7 +3121,7 @@ describe('host directives', () => { let hostDirInstance!: HostDir; let otherHostDirInstance!: OtherHostDir; - @Directive({standalone: true}) + @Directive() class HostDir { @Input() color?: string; @@ -3148,7 +3130,7 @@ describe('host directives', () => { } } - @Directive({standalone: true}) + @Directive() class OtherHostDir { @Input() color?: string; @@ -3192,7 +3174,7 @@ describe('host directives', () => { it('should set inputs that only exist on a host directive when using `setInput`', () => { let hostDirInstance!: HostDir; - @Directive({standalone: true}) + @Directive() class HostDir { @Input() color?: string; @@ -3229,7 +3211,7 @@ describe('host directives', () => { it('should set inputs that only exist on the root component when using `setInput`', () => { let hostDirInstance!: HostDir; - @Directive({standalone: true}) + @Directive() class HostDir { @Input() color?: string; @@ -3262,7 +3244,7 @@ describe('host directives', () => { it('should use the input name alias in `setInput`', () => { let hostDirInstance!: HostDir; - @Directive({standalone: true}) + @Directive() class HostDir { @Input('alias') color?: string; @@ -3305,7 +3287,7 @@ describe('host directives', () => { it('should invoke ngOnChanges when setting host directive inputs using setInput', () => { let latestChanges: SimpleChanges | undefined; - @Directive({standalone: true}) + @Directive() class HostDir implements OnChanges { @Input('alias') color?: string; @@ -3354,13 +3336,13 @@ describe('host directives', () => { }); it('should throw an error if a host directive is applied multiple times to a root component', () => { - @Directive({standalone: true}) + @Directive() class DuplicateHostDir {} - @Directive({standalone: true, hostDirectives: [DuplicateHostDir]}) + @Directive({hostDirectives: [DuplicateHostDir]}) class HostDir {} - @Directive({standalone: true, hostDirectives: [HostDir, DuplicateHostDir]}) + @Directive({hostDirectives: [HostDir, DuplicateHostDir]}) class Dir {} @Component({ @@ -3425,17 +3407,16 @@ describe('host directives', () => { }); it('should throw an error if a host directive matches multiple times in a template', () => { - @Directive({standalone: true, selector: '[dir]'}) + @Directive({selector: '[dir]'}) class HostDir {} @Directive({ selector: '[dir]', hostDirectives: [HostDir], - standalone: true, }) class Dir {} - @Component({template: '
', standalone: true, imports: [HostDir, Dir]}) + @Component({template: '
', imports: [HostDir, Dir]}) class App {} expect(() => TestBed.createComponent(App)).toThrowError( @@ -3444,20 +3425,18 @@ describe('host directives', () => { }); it('should throw an error if a host directive matches multiple times on a component', () => { - @Directive({standalone: true, selector: '[dir]'}) + @Directive({selector: '[dir]'}) class HostDir {} @Component({ selector: 'comp', hostDirectives: [HostDir], - standalone: true, template: '', }) class Comp {} const baseAppMetadata = { template: '', - standalone: true, }; const expectedError = @@ -3485,10 +3464,10 @@ describe('host directives', () => { }); it('should throw an error if a host directive appears multiple times in a chain', () => { - @Directive({standalone: true}) + @Directive() class DuplicateHostDir {} - @Directive({standalone: true, hostDirectives: [DuplicateHostDir]}) + @Directive({hostDirectives: [DuplicateHostDir]}) class HostDir {} @Directive({ @@ -3512,7 +3491,7 @@ describe('host directives', () => { }); it('should throw an error if a host directive is a component', () => { - @Component({standalone: true, template: '', selector: 'host-comp'}) + @Component({template: '', selector: 'host-comp'}) class HostComp {} @Directive({ @@ -3536,7 +3515,7 @@ describe('host directives', () => { }); it('should throw an error if a host directive output does not exist', () => { - @Directive({standalone: true}) + @Directive() class HostDir { @Output() foo = new EventEmitter(); } @@ -3567,7 +3546,7 @@ describe('host directives', () => { }); it('should throw an error if a host directive output alias does not exist', () => { - @Directive({standalone: true}) + @Directive() class HostDir { @Output('alias') foo = new EventEmitter(); } @@ -3598,7 +3577,7 @@ describe('host directives', () => { }); it('should throw an error if a host directive input does not exist', () => { - @Directive({standalone: true}) + @Directive() class HostDir { @Input() foo: any; } @@ -3629,7 +3608,7 @@ describe('host directives', () => { }); it('should throw an error if a host directive input alias does not exist', () => { - @Directive({standalone: true}) + @Directive() class HostDir { @Input('alias') foo: any; } @@ -3655,7 +3634,7 @@ describe('host directives', () => { }); it('should throw an error if a host directive tries to alias to an existing input', () => { - @Directive({selector: '[host-dir]', standalone: true}) + @Directive({selector: '[host-dir]'}) class HostDir { @Input('colorAlias') color?: string; @Input() buttonColor?: string; @@ -3687,7 +3666,7 @@ describe('host directives', () => { }); it('should throw an error if a host directive tries to alias to an existing input alias', () => { - @Directive({selector: '[host-dir]', standalone: true}) + @Directive({selector: '[host-dir]'}) class HostDir { @Input('colorAlias') color?: string; @Input('buttonColorAlias') buttonColor?: string; @@ -3719,7 +3698,7 @@ describe('host directives', () => { }); it('should not throw if a host directive input aliases to the same name', () => { - @Directive({selector: '[host-dir]', standalone: true}) + @Directive({selector: '[host-dir]'}) class HostDir { @Input('color') color?: string; } @@ -3747,7 +3726,7 @@ describe('host directives', () => { }); it('should throw an error if a host directive tries to alias to an existing output alias', () => { - @Directive({selector: '[host-dir]', standalone: true}) + @Directive({selector: '[host-dir]'}) class HostDir { @Output('clickedAlias') clicked = new EventEmitter(); @Output('tappedAlias') tapped = new EventEmitter(); @@ -3781,7 +3760,7 @@ describe('host directives', () => { }); it('should not throw if a host directive output aliases to the same name', () => { - @Directive({selector: '[host-dir]', standalone: true}) + @Directive({selector: '[host-dir]'}) class HostDir { @Output('clicked') clicked = new EventEmitter(); } @@ -3814,20 +3793,18 @@ describe('host directives', () => { @Directive({ outputs: ['opened: triggerOpened'], selector: '[trigger]', - standalone: true, }) class Trigger { opened = new EventEmitter(); } @Directive({ - standalone: true, selector: '[host]', hostDirectives: [{directive: Trigger, outputs: ['triggerOpened']}], }) class Host {} - @Component({template: '
', standalone: true, imports: [Host]}) + @Component({template: '
', imports: [Host]}) class App {} expect(() => { @@ -3837,7 +3814,7 @@ describe('host directives', () => { }); it('should not throw when exposing an inherited aliased binding', () => { - @Directive({standalone: true}) + @Directive() abstract class Base { opened = new EventEmitter(); } @@ -3845,18 +3822,16 @@ describe('host directives', () => { @Directive({ outputs: ['opened: triggerOpened'], selector: '[trigger]', - standalone: true, }) class Trigger extends Base {} @Directive({ - standalone: true, selector: '[host]', hostDirectives: [{directive: Trigger, outputs: ['triggerOpened: hostOpened']}], }) class Host {} - @Component({template: '
', standalone: true, imports: [Host]}) + @Component({template: '
', imports: [Host]}) class App {} expect(() => { @@ -3866,13 +3841,13 @@ describe('host directives', () => { }); it('should throw an error if a duplicate directive is inherited', () => { - @Directive({standalone: true}) + @Directive() class HostDir {} - @Directive({standalone: true, hostDirectives: [HostDir]}) + @Directive({hostDirectives: [HostDir]}) class Grandparent {} - @Directive({standalone: true}) + @Directive() class Parent extends Grandparent {} @Directive({ diff --git a/packages/core/test/acceptance/i18n_spec.ts b/packages/core/test/acceptance/i18n_spec.ts index a6735d1decb2..f72f40f4b2d0 100644 --- a/packages/core/test/acceptance/i18n_spec.ts +++ b/packages/core/test/acceptance/i18n_spec.ts @@ -563,7 +563,6 @@ describe('runtime i18n', () => { @Component({ selector: 'defer-comp', - standalone: true, template: '
Content: @defer (when isLoaded) {beforemiddleafter} ' + '@placeholder {before
placeholder
after}!
', diff --git a/packages/core/test/acceptance/inherit_definition_feature_spec.ts b/packages/core/test/acceptance/inherit_definition_feature_spec.ts index e882cac81433..77e027f8fcc9 100644 --- a/packages/core/test/acceptance/inherit_definition_feature_spec.ts +++ b/packages/core/test/acceptance/inherit_definition_feature_spec.ts @@ -794,14 +794,12 @@ describe('inheritance', () => { } @Directive({ - standalone: true, selector: 'dir', inputs: ['someInput'], }) class ActualDir extends Base {} @Component({ - standalone: true, imports: [ActualDir], template: ``, }) @@ -825,13 +823,11 @@ describe('inheritance', () => { } @Directive({ - standalone: true, selector: 'dir', }) class ActualDir extends Base {} @Component({ - standalone: true, imports: [ActualDir], template: ``, }) diff --git a/packages/core/test/acceptance/injector_profiler_spec.ts b/packages/core/test/acceptance/injector_profiler_spec.ts index f8777d929696..40371929bc0c 100644 --- a/packages/core/test/acceptance/injector_profiler_spec.ts +++ b/packages/core/test/acceptance/injector_profiler_spec.ts @@ -385,7 +385,6 @@ describe('getInjectorMetadata', () => { @Component({ selector: 'lazy-comp', template: `lazy component`, - standalone: true, imports: [ModuleB], }) class LazyComponent { @@ -398,7 +397,6 @@ describe('getInjectorMetadata', () => { } @Component({ - standalone: true, imports: [RouterOutlet, ModuleA], template: ``, }) @@ -667,7 +665,6 @@ describe('getInjectorProviders', () => { selector: 'my-comp-c', template: 'hello world', imports: [ModuleE, ModuleC], - standalone: true, }) class MyStandaloneComponentC {} @@ -675,7 +672,6 @@ describe('getInjectorProviders', () => { selector: 'my-comp-b', template: 'hello world', imports: [ModuleD, ModuleF], - standalone: true, }) class MyStandaloneComponentB {} @@ -686,7 +682,6 @@ describe('getInjectorProviders', () => { `, imports: [ModuleD, MyStandaloneComponentB, MyStandaloneComponentC], - standalone: true, }) class MyStandaloneComponent {} @@ -743,7 +738,6 @@ describe('getInjectorProviders', () => { selector: 'my-comp-b', template: 'hello world', imports: [ModuleA], - standalone: true, }) class MyStandaloneComponentB { injector = inject(Injector); @@ -753,7 +747,6 @@ describe('getInjectorProviders', () => { selector: 'my-comp', template: ``, imports: [MyStandaloneComponentB, RouterOutlet], - standalone: true, }) class MyStandaloneComponent { injector = inject(Injector); @@ -809,7 +802,7 @@ describe('getInjectorProviders', () => { it('should be able to determine providers in a lazy route that has providers', fakeAsync(() => { class MyService {} - @Component({selector: 'my-comp-b', template: 'hello world', standalone: true}) + @Component({selector: 'my-comp-b', template: 'hello world'}) class MyStandaloneComponentB { injector = inject(Injector); } @@ -818,7 +811,6 @@ describe('getInjectorProviders', () => { selector: 'my-comp', template: ``, imports: [MyStandaloneComponentB, RouterOutlet], - standalone: true, }) class MyStandaloneComponent { injector = inject(Injector); @@ -871,7 +863,7 @@ describe('getInjectorProviders', () => { it('should be able to get injector providers for element injectors created by components rendering in an ngFor', () => { class MyService {} - @Component({selector: 'item-cmp', template: 'item', standalone: true, providers: [MyService]}) + @Component({selector: 'item-cmp', template: 'item', providers: [MyService]}) class ItemComponent { injector = inject(Injector); } @@ -882,7 +874,6 @@ describe('getInjectorProviders', () => { `, imports: [ItemComponent, NgForOf], - standalone: true, }) class MyStandaloneComponent { injector = inject(Injector); @@ -911,7 +902,7 @@ describe('getInjectorProviders', () => { it('should be able to get injector providers for element injectors created by components rendering in a @for', () => { class MyService {} - @Component({selector: 'item-cmp', template: 'item', standalone: true, providers: [MyService]}) + @Component({selector: 'item-cmp', template: 'item', providers: [MyService]}) class ItemComponent { injector = inject(Injector); } @@ -924,7 +915,6 @@ describe('getInjectorProviders', () => { } `, imports: [ItemComponent], - standalone: true, }) class MyStandaloneComponent { injector = inject(Injector); @@ -978,7 +968,6 @@ describe('getDependenciesFromInjectable', () => { @Directive({ selector: '[my-directive]', - standalone: true, }) class MyStandaloneDirective { serviceFromHost = inject(MyServiceH, {host: true, optional: true}); @@ -993,7 +982,6 @@ describe('getDependenciesFromInjectable', () => { selector: 'my-comp-c', template: 'hello world', imports: [], - standalone: true, }) class MyStandaloneComponentC {} @@ -1001,7 +989,6 @@ describe('getDependenciesFromInjectable', () => { selector: 'my-comp-b', template: '', imports: [MyStandaloneComponentC, MyStandaloneDirective], - standalone: true, }) class MyStandaloneComponentB { myService = inject(MyService, {optional: true}); @@ -1019,7 +1006,6 @@ describe('getDependenciesFromInjectable', () => { template: ``, imports: [RouterOutlet, ModuleA], providers: [MyServiceG, {provide: MyServiceH, useValue: 'MyStandaloneComponent'}], - standalone: true, }) class MyStandaloneComponent { injector = inject(Injector); @@ -1182,7 +1168,7 @@ describe('getDependenciesFromInjectable', () => { @NgModule({imports: [ModuleB, ModuleC]}) class ModuleD {} - @Component({selector: 'my-comp', template: 'hello world', imports: [ModuleD], standalone: true}) + @Component({selector: 'my-comp', template: 'hello world', imports: [ModuleD]}) class MyStandaloneComponent { myService = inject(MyService); } @@ -1262,7 +1248,6 @@ describe('getInjectorResolutionPath', () => { @Component({ selector: 'lazy-comp', template: `lazy component`, - standalone: true, imports: [ModuleB], }) class LazyComponent { @@ -1272,7 +1257,6 @@ describe('getInjectorResolutionPath', () => { } @Component({ - standalone: true, imports: [RouterOutlet, ModuleA], template: ``, }) diff --git a/packages/core/test/acceptance/integration_spec.ts b/packages/core/test/acceptance/integration_spec.ts index 62c598f99937..5cc3a2e5dbdc 100644 --- a/packages/core/test/acceptance/integration_spec.ts +++ b/packages/core/test/acceptance/integration_spec.ts @@ -2718,7 +2718,6 @@ describe('acceptance integration tests', () => { it('should support template literals in expressions', () => { @Component({ - standalone: true, template: 'Message: {{`Hello, ${name} - ${value}`}}', }) class TestComponent { diff --git a/packages/core/test/acceptance/internal_spec.ts b/packages/core/test/acceptance/internal_spec.ts index f0b585219fbf..7c553fee2bb7 100644 --- a/packages/core/test/acceptance/internal_spec.ts +++ b/packages/core/test/acceptance/internal_spec.ts @@ -21,7 +21,6 @@ describe('internal utilities', () => { describe('getClosestComponentName', () => { it('should get the name from a node placed inside a root component', () => { @Component({ - standalone: true, template: `
`, }) class App {} @@ -36,12 +35,10 @@ describe('internal utilities', () => { @Component({ selector: 'comp', template: `
`, - standalone: true, }) class Comp {} @Component({ - standalone: true, template: ``, imports: [Comp], }) @@ -57,12 +54,10 @@ describe('internal utilities', () => { @Component({ selector: 'comp', template: `
`, - standalone: true, }) class Comp {} @Component({ - standalone: true, template: ` @for (current of [1]; track $index) { @@ -81,12 +76,10 @@ describe('internal utilities', () => { it('should get the name from a node that has a directive', () => { @Directive({ selector: 'dir', - standalone: true, }) class Dir {} @Component({ - standalone: true, template: `
`, imports: [Dir], }) @@ -100,7 +93,6 @@ describe('internal utilities', () => { it('should return null when not placed in a component', () => { @Component({ - standalone: true, template: '', }) class App {} @@ -114,12 +106,10 @@ describe('internal utilities', () => { @Component({ selector: 'comp', template: `
`, - standalone: true, }) class Comp {} @Component({ - standalone: true, template: ``, }) class App { @@ -141,7 +131,6 @@ describe('internal utilities', () => { @Component({ selector: 'comp', template: `
`, - standalone: true, }) class Comp {} diff --git a/packages/core/test/acceptance/let_spec.ts b/packages/core/test/acceptance/let_spec.ts index bcd826513595..35607e92a99f 100644 --- a/packages/core/test/acceptance/let_spec.ts +++ b/packages/core/test/acceptance/let_spec.ts @@ -23,7 +23,6 @@ import {TestBed} from '@angular/core/testing'; describe('@let declarations', () => { it('should update the value of a @let declaration over time', () => { @Component({ - standalone: true, template: ` @let multiplier = 2; @let result = value * multiplier; @@ -51,7 +50,6 @@ describe('@let declarations', () => { const values: number[] = []; @Component({ - standalone: true, template: ` @let result = value * 2; @@ -81,7 +79,6 @@ describe('@let declarations', () => { it('should be able to access @let declarations through multiple levels of views', () => { @Component({ - standalone: true, template: ` @if (true) { @if (true) { @@ -110,7 +107,6 @@ describe('@let declarations', () => { it('should be able to access @let declarations from parent view before they are declared', () => { @Component({ - standalone: true, template: ` @if (true) { {{value}} times {{multiplier}} is {{result}} @@ -142,7 +138,6 @@ describe('@let declarations', () => { @Directive({ selector: '[dir]', - standalone: true, }) class TestDirective { @Output() testEvent = new EventEmitter(); @@ -153,7 +148,6 @@ describe('@let declarations', () => { } @Component({ - standalone: true, imports: [TestDirective], template: `
@@ -186,7 +180,7 @@ describe('@let declarations', () => { }); it('should be able to use pipes injecting ChangeDetectorRef in a let declaration', () => { - @Pipe({name: 'double', standalone: true}) + @Pipe({name: 'double'}) class DoublePipe implements PipeTransform { changeDetectorRef = inject(ChangeDetectorRef); @@ -196,7 +190,6 @@ describe('@let declarations', () => { } @Component({ - standalone: true, template: ` @let result = value | double; Result: {{result}} @@ -218,7 +211,6 @@ describe('@let declarations', () => { it('should be able to use local references inside @let declarations', () => { @Component({ - standalone: true, template: ` @@ -240,7 +232,6 @@ describe('@let declarations', () => { it('should be able to proxy a local reference through @let declarations', () => { @Component({ - standalone: true, template: ` @@ -271,7 +262,6 @@ describe('@let declarations', () => { let calls = 0; @Component({ - standalone: true, template: ` @let one = getOne(); @let two = one + getTwo(); @@ -302,7 +292,6 @@ describe('@let declarations', () => { it('should resolve a @let declaration correctly within an embedded view that uses a value from parent view and cannot be optimized', () => { @Component({ - standalone: true, template: ` @let foo = value + 1; @@ -333,7 +322,6 @@ describe('@let declarations', () => { it('should not be able to access @let declarations using a query', () => { @Component({ - standalone: true, template: ` @let value = 1; {{value}} @@ -355,12 +343,10 @@ describe('@let declarations', () => { @let value = 123; The value is {{value}} `, - standalone: true, }) class InnerComponent {} @Component({ - standalone: true, template: '', imports: [InnerComponent], }) @@ -379,12 +365,10 @@ describe('@let declarations', () => { Fallback content Fallback footer `, - standalone: true, }) class InnerComponent {} @Component({ - standalone: true, template: ` @let one = 1; @@ -408,7 +392,6 @@ describe('@let declarations', () => { it('should give precedence to @let declarations over component properties', () => { @Component({ - standalone: true, template: ` @let value = '@let'; @@ -428,7 +411,6 @@ describe('@let declarations', () => { it('should give precedence to local @let definition over one from a parent view', () => { @Component({ - standalone: true, template: ` @let value = 'parent'; @@ -447,7 +429,6 @@ describe('@let declarations', () => { it('should be able to use @for loop variables in @let declarations', () => { @Component({ - standalone: true, template: ` @for (value of values; track $index) { @let calculation = value * $index; diff --git a/packages/core/test/acceptance/listener_spec.ts b/packages/core/test/acceptance/listener_spec.ts index 7ee9ba3f76a5..d5d2e72bac4d 100644 --- a/packages/core/test/acceptance/listener_spec.ts +++ b/packages/core/test/acceptance/listener_spec.ts @@ -162,7 +162,7 @@ describe('event listeners', () => { - + `, standalone: false, @@ -187,7 +187,7 @@ describe('event listeners', () => { - + `, standalone: false, @@ -226,13 +226,11 @@ describe('event listeners', () => { it('should support local refs in listeners', () => { @Component({ selector: 'my-comp', - standalone: true, template: ``, }) class MyComp {} @Component({ - standalone: true, imports: [MyComp], template: ` @@ -768,7 +766,6 @@ describe('event listeners', () => { @Directive({ selector: '[hostListenerDir]', - standalone: true, }) class HostListenerDir { @HostListener('click') @@ -778,7 +775,6 @@ describe('event listeners', () => { } @Component({ - standalone: true, imports: [HostListenerDir], template: ``, }) @@ -801,7 +797,6 @@ describe('event listeners', () => { @Directive({ selector: '[hostListenerDir]', - standalone: true, }) class HostListenerDir { @HostListener('document:click') @@ -811,7 +806,6 @@ describe('event listeners', () => { } @Component({ - standalone: true, imports: [HostListenerDir], template: ``, }) @@ -883,7 +877,7 @@ describe('event listeners', () => { - + `, standalone: false, diff --git a/packages/core/test/acceptance/ng_module_spec.ts b/packages/core/test/acceptance/ng_module_spec.ts index 75f04290f43d..b64bb6cd2d5c 100644 --- a/packages/core/test/acceptance/ng_module_spec.ts +++ b/packages/core/test/acceptance/ng_module_spec.ts @@ -98,7 +98,6 @@ describe('NgModule', () => { it('should throw when a standalone component is added to NgModule declarations', () => { @Component({ selector: 'my-comp', - standalone: true, template: '', }) class MyComp {} @@ -120,7 +119,6 @@ describe('NgModule', () => { it('should throw when a standalone directive is added to NgModule declarations', () => { @Directive({ selector: '[my-dir]', - standalone: true, }) class MyDir {} @@ -148,7 +146,6 @@ describe('NgModule', () => { it('should throw when a standalone pipe is added to NgModule declarations', () => { @Pipe({ name: 'my-pipe', - standalone: true, }) class MyPipe {} @@ -177,7 +174,6 @@ describe('NgModule', () => { @Component({ selector: 'my-comp', template: '', - standalone: true, }) class MyComp {} @@ -443,7 +439,6 @@ describe('NgModule', () => { it('should log an error about unknown element for a standalone component without CUSTOM_ELEMENTS_SCHEMA', () => { @Component({ template: ``, - standalone: true, }) class MyComp {} @@ -457,7 +452,6 @@ describe('NgModule', () => { it('should not log an error about unknown element for a standalone component with CUSTOM_ELEMENTS_SCHEMA', () => { @Component({ template: ``, - standalone: true, schemas: [CUSTOM_ELEMENTS_SCHEMA], }) class MyComp {} @@ -657,7 +651,6 @@ describe('NgModule', () => { `is used in a template, but not imported in a standalone component`, () => { @Component({ - standalone: true, template: `
`, }) class App { diff --git a/packages/core/test/acceptance/pipe_spec.ts b/packages/core/test/acceptance/pipe_spec.ts index 8376db2f1838..1639cdb856c8 100644 --- a/packages/core/test/acceptance/pipe_spec.ts +++ b/packages/core/test/acceptance/pipe_spec.ts @@ -354,7 +354,7 @@ describe('pipe', () => { } // The generated code corresponds to the following decorator: - // @Pipe({name: 'sayHello', pure: true, standalone: true}) + // @Pipe({name: 'sayHello', pure: true}) class SayHelloPipe extends ParentPipe implements PipeTransform { transform() { return this.sayHelloService.getHello(); @@ -369,7 +369,6 @@ describe('pipe', () => { } @Component({ - standalone: true, selector: 'app', template: '{{ value | sayHello }}', imports: [SayHelloPipe], diff --git a/packages/core/test/acceptance/query_spec.ts b/packages/core/test/acceptance/query_spec.ts index fbfbdd05ed5d..055bb4de2ebb 100644 --- a/packages/core/test/acceptance/query_spec.ts +++ b/packages/core/test/acceptance/query_spec.ts @@ -886,14 +886,12 @@ describe('query logic', () => { it('should not match directive host with content queries', () => { @Directive({ selector: '[content-query]', - standalone: true, }) class ContentQueryDirective { @ContentChildren('foo', {descendants: true}) foos!: QueryList; } @Component({ - standalone: true, imports: [ContentQueryDirective], template: `
`, }) @@ -910,13 +908,12 @@ describe('query logic', () => { }); it('should report results to appropriate queries where deep content queries are nested', () => { - @Directive({selector: '[content-query]', standalone: true, exportAs: 'query'}) + @Directive({selector: '[content-query]', exportAs: 'query'}) class ContentQueryDirective { @ContentChildren('foo, bar, baz', {descendants: true}) qlist!: QueryList; } @Component({ - standalone: true, imports: [ContentQueryDirective], template: `
@@ -944,13 +941,12 @@ describe('query logic', () => { }); it('should support nested shallow content queries', () => { - @Directive({selector: '[content-query]', standalone: true, exportAs: 'query'}) + @Directive({selector: '[content-query]', exportAs: 'query'}) class ContentQueryDirective { @ContentChildren('foo') qlist!: QueryList; } @Component({ - standalone: true, imports: [ContentQueryDirective], template: `
@@ -976,18 +972,17 @@ describe('query logic', () => { }); it('should respect shallow flag on content queries when mixing deep and shallow queries', () => { - @Directive({selector: '[shallow-content-query]', standalone: true, exportAs: 'shallow-query'}) + @Directive({selector: '[shallow-content-query]', exportAs: 'shallow-query'}) class ShallowContentQueryDirective { @ContentChildren('foo') qlist!: QueryList; } - @Directive({selector: '[deep-content-query]', standalone: true, exportAs: 'deep-query'}) + @Directive({selector: '[deep-content-query]', exportAs: 'deep-query'}) class DeepContentQueryDirective { @ContentChildren('foo', {descendants: true}) qlist!: QueryList; } @Component({ - standalone: true, imports: [ShallowContentQueryDirective, DeepContentQueryDirective], template: `
@@ -1014,7 +1009,7 @@ describe('query logic', () => { }); it('should support shallow ContentChild queries', () => { - @Directive({selector: '[query-dir]', standalone: true}) + @Directive({selector: '[query-dir]'}) class ContentQueryDirective { @ContentChild('foo', {descendants: false}) shallow: ElementRef | undefined; // ContentChild queries have {descendants: true} option by default @@ -1022,7 +1017,6 @@ describe('query logic', () => { } @Component({ - standalone: true, imports: [ContentQueryDirective], template: `
@@ -1046,14 +1040,12 @@ describe('query logic', () => { it('should support view and content queries matching the same element', () => { @Directive({ selector: '[content-query]', - standalone: true, }) class ContentQueryDirective { @ContentChildren('foo') foos!: QueryList; } @Component({ - standalone: true, imports: [ContentQueryDirective], template: `
@@ -1082,14 +1074,13 @@ describe('query logic', () => { }); describe('query order', () => { - @Directive({selector: '[text]', standalone: true}) + @Directive({selector: '[text]'}) class TextDirective { @Input() text: string | undefined; } it('should register view query matches from top to bottom', () => { @Component({ - standalone: true, imports: [TextDirective], template: ` @@ -1119,14 +1110,12 @@ describe('query logic', () => { it('should register content query matches from top to bottom', () => { @Directive({ selector: '[content-query]', - standalone: true, }) class ContentQueryDirective { @ContentChildren(TextDirective, {descendants: true}) texts!: QueryList; } @Component({ - standalone: true, imports: [TextDirective, ContentQueryDirective], template: `
@@ -1475,15 +1464,14 @@ describe('query logic', () => { }); describe('read option', () => { - @Directive({selector: '[child]', standalone: true}) + @Directive({selector: '[child]'}) class Child {} - @Directive({selector: '[otherChild]', standalone: true}) + @Directive({selector: '[otherChild]'}) class OtherChild {} it('should query using type predicate and read ElementRef', () => { @Component({ - standalone: true, imports: [Child], template: `
`, }) @@ -1503,7 +1491,6 @@ describe('query logic', () => { it('should query using type predicate and read another directive type', () => { @Component({ - standalone: true, imports: [Child, OtherChild], template: `
`, }) @@ -1521,7 +1508,6 @@ describe('query logic', () => { it('should not add results to query if a requested token cant be read', () => { @Component({ - standalone: true, imports: [Child], template: `
`, }) @@ -1538,7 +1524,6 @@ describe('query logic', () => { it('should query using local ref and read ElementRef by default', () => { @Component({ - standalone: true, template: `
@@ -1560,7 +1545,6 @@ describe('query logic', () => { it('should query for multiple elements and read ElementRef by default', () => { @Component({ - standalone: true, template: `
@@ -1584,7 +1568,6 @@ describe('query logic', () => { it('should read ElementRef from an element when explicitly asked for', () => { @Component({ - standalone: true, template: `
@@ -1606,7 +1589,6 @@ describe('query logic', () => { it('should query for and read ElementRef with a native element pointing to comment node', () => { @Component({ - standalone: true, template: ``, }) class TestCmp { @@ -1623,7 +1605,6 @@ describe('query logic', () => { it('should query for and read ElementRef without explicit read option', () => { @Component({ - standalone: true, template: ``, }) class TestCmp { @@ -1640,7 +1621,6 @@ describe('query logic', () => { it('should read ViewContainerRef from element nodes when explicitly asked for', () => { @Component({ - standalone: true, template: `
`, }) class TestCmp { @@ -1657,7 +1637,6 @@ describe('query logic', () => { it('should read ViewContainerRef from ng-template nodes when explicitly asked for', () => { @Component({ - standalone: true, template: ``, }) class TestCmp { @@ -1674,7 +1653,6 @@ describe('query logic', () => { it('should read ElementRef with a native element pointing to comment DOM node from ng-template', () => { @Component({ - standalone: true, template: ``, }) class TestCmp { @@ -1691,7 +1669,6 @@ describe('query logic', () => { it('should read TemplateRef from ng-template by default', () => { @Component({ - standalone: true, template: ``, }) class TestCmp { @@ -1708,7 +1685,6 @@ describe('query logic', () => { it('should read TemplateRef from ng-template when explicitly asked for', () => { @Component({ - standalone: true, template: ``, }) class TestCmp { @@ -1724,11 +1700,10 @@ describe('query logic', () => { }); it('should read component instance if element queried for is a component host', () => { - @Component({selector: 'child-cmp', standalone: true, template: ''}) + @Component({selector: 'child-cmp', template: ''}) class ChildCmp {} @Component({ - standalone: true, imports: [ChildCmp], template: ``, }) @@ -1748,13 +1723,11 @@ describe('query logic', () => { @Component({ selector: 'child-cmp', exportAs: 'child', - standalone: true, template: '', }) class ChildCmp {} @Component({ - standalone: true, imports: [ChildCmp], template: ``, }) @@ -1771,11 +1744,10 @@ describe('query logic', () => { }); it('should read directive instance if element queried for has an exported directive with a matching name', () => { - @Directive({selector: '[child]', exportAs: 'child', standalone: true}) + @Directive({selector: '[child]', exportAs: 'child'}) class ChildDirective {} @Component({ - standalone: true, imports: [ChildDirective], template: `
`, }) @@ -1792,14 +1764,13 @@ describe('query logic', () => { }); it('should read all matching directive instances from a given element', () => { - @Directive({selector: '[child1]', exportAs: 'child1', standalone: true}) + @Directive({selector: '[child1]', exportAs: 'child1'}) class Child1Dir {} - @Directive({selector: '[child2]', exportAs: 'child2', standalone: true}) + @Directive({selector: '[child2]', exportAs: 'child2'}) class Child2Dir {} @Component({ - standalone: true, imports: [Child1Dir, Child2Dir], template: `
`, }) @@ -1817,11 +1788,10 @@ describe('query logic', () => { }); it('should read multiple locals exporting the same directive from a given element', () => { - @Directive({selector: '[child]', exportAs: 'child', standalone: true}) + @Directive({selector: '[child]', exportAs: 'child'}) class ChildDir {} @Component({ - standalone: true, imports: [ChildDir], template: `
`, }) @@ -1869,11 +1839,10 @@ describe('query logic', () => { }); it('should match on exported directive name and read a requested token', () => { - @Directive({selector: '[child]', exportAs: 'child', standalone: true}) + @Directive({selector: '[child]', exportAs: 'child'}) class ChildDir {} @Component({ - standalone: true, imports: [ChildDir], template: `
`, }) @@ -1890,11 +1859,10 @@ describe('query logic', () => { }); it('should support reading a mix of ElementRef and directive instances', () => { - @Directive({selector: '[child]', exportAs: 'child', standalone: true}) + @Directive({selector: '[child]', exportAs: 'child'}) class ChildDir {} @Component({ - standalone: true, imports: [ChildDir], template: `
`, }) @@ -1912,11 +1880,10 @@ describe('query logic', () => { }); it('should not add results to selector-based query if a requested token cant be read', () => { - @Directive({selector: '[child]', standalone: true}) + @Directive({selector: '[child]'}) class ChildDir {} @Component({ - standalone: true, imports: [], template: `
`, }) @@ -1932,14 +1899,13 @@ describe('query logic', () => { }); it('should not add results to directive-based query if only read token matches', () => { - @Directive({selector: '[child]', standalone: true}) + @Directive({selector: '[child]'}) class ChildDir {} - @Directive({selector: '[otherChild]', standalone: true}) + @Directive({selector: '[otherChild]'}) class OtherChildDir {} @Component({ - standalone: true, imports: [Child], template: `
`, }) @@ -1956,7 +1922,6 @@ describe('query logic', () => { it('should not add results to TemplateRef-based query if only read token matches', () => { @Component({ - standalone: true, template: `
`, }) class TestCmp { @@ -1972,7 +1937,6 @@ describe('query logic', () => { it('should not add results to the query in case no match found (via TemplateRef)', () => { @Component({ - standalone: true, template: `
`, }) class TestCmp { @@ -1988,7 +1952,6 @@ describe('query logic', () => { it('should query templates if the type is TemplateRef (and respect "read" option)', () => { @Component({ - standalone: true, template: `
Test
Test
@@ -2015,7 +1978,6 @@ describe('query logic', () => { it('should match using string selector and directive as a read argument', () => { @Component({ - standalone: true, imports: [Child], template: `
`, }) diff --git a/packages/core/test/acceptance/renderer_factory_spec.ts b/packages/core/test/acceptance/renderer_factory_spec.ts index b907a6a63747..8d2bf0161ddb 100644 --- a/packages/core/test/acceptance/renderer_factory_spec.ts +++ b/packages/core/test/acceptance/renderer_factory_spec.ts @@ -134,7 +134,6 @@ describe('renderer factory lifecycle', () => { it('should pass in the component styles directly into the underlying renderer', () => { @Component({ - standalone: true, styles: ['.some-css-class { color: red; }'], template: '...', encapsulation: ViewEncapsulation.ShadowDom, @@ -153,7 +152,6 @@ describe('renderer factory lifecycle', () => { const animB = {name: 'b'}; @Component({ - standalone: true, template: '', animations: [animA, animB], }) @@ -170,7 +168,6 @@ describe('renderer factory lifecycle', () => { it('should include animations in the renderType data array even if the array is empty', () => { @Component({ - standalone: true, template: '...', animations: [], }) @@ -184,7 +181,6 @@ describe('renderer factory lifecycle', () => { it('should allow [@trigger] bindings to be picked up by the underlying renderer', () => { @Component({ - standalone: true, template: '
', animations: [], }) @@ -216,7 +212,6 @@ describe('renderer factory lifecycle', () => { it('should not invoke renderer destroy method for embedded views', () => { @Component({ selector: 'comp', - standalone: true, imports: [CommonModule], template: `
Root view
diff --git a/packages/core/test/acceptance/security_spec.ts b/packages/core/test/acceptance/security_spec.ts index 903751a64020..6038e8181c45 100644 --- a/packages/core/test/acceptance/security_spec.ts +++ b/packages/core/test/acceptance/security_spec.ts @@ -140,7 +140,6 @@ describe('iframe processing', () => { `as a static attribute (checking \`${securityAttr}\`)`, () => { @Component({ - standalone: true, selector: 'my-comp', template: ` `, }) @@ -194,7 +191,6 @@ describe('iframe processing', () => { `using a property interpolation (checking \`${securityAttr}\`)`, () => { @Component({ - standalone: true, selector: 'my-comp', template: ``, }) @@ -210,7 +206,6 @@ describe('iframe processing', () => { `sure it's case-insensitive)`, () => { @Component({ - standalone: true, selector: 'my-comp', template: ` ', @@ -323,7 +313,6 @@ describe('iframe processing', () => { it('should work when a directive sets a security-sensitive host attribute on a non-iframe element', () => { @Directive({ - standalone: true, selector: '[dir]', host: { 'src': TEST_IFRAME_URL, @@ -333,7 +322,6 @@ describe('iframe processing', () => { class Dir {} @Component({ - standalone: true, imports: [Dir], selector: 'my-comp', template: '', @@ -351,7 +339,6 @@ describe('iframe processing', () => { 'which also has a structural directive (*ngIf)', () => { @Component({ - standalone: true, imports: [NgIf], selector: 'my-comp', template: ``, @@ -366,7 +353,6 @@ describe('iframe processing', () => { it('should work when a security-sensitive attribute is set between `src` and `srcdoc`', () => { @Component({ - standalone: true, selector: 'my-comp', template: ``, }) @@ -377,7 +363,6 @@ describe('iframe processing', () => { it('should work when a directive sets a security-sensitive attribute before setting `src`', () => { @Directive({ - standalone: true, selector: '[dir]', host: { 'sandbox': '', @@ -387,7 +372,6 @@ describe('iframe processing', () => { class IframeDir {} @Component({ - standalone: true, imports: [IframeDir], selector: 'my-comp', template: '', @@ -403,7 +387,6 @@ describe('iframe processing', () => { '(directive attribute after `sandbox`)', () => { @Directive({ - standalone: true, selector: '[dir]', host: { 'src': TEST_IFRAME_URL, @@ -412,7 +395,6 @@ describe('iframe processing', () => { class IframeDir {} @Component({ - standalone: true, imports: [IframeDir], selector: 'my-comp', template: '', @@ -428,7 +410,6 @@ describe('iframe processing', () => { "as an attribute binding (checking that it's case-insensitive)", () => { @Directive({ - standalone: true, selector: '[dir]', host: { '[attr.SANDBOX]': "''", @@ -437,7 +418,6 @@ describe('iframe processing', () => { class IframeDir {} @Component({ - standalone: true, imports: [IframeDir], selector: 'my-comp', template: ``, @@ -454,7 +434,6 @@ describe('iframe processing', () => { '(directive attribute before `sandbox`)', () => { @Directive({ - standalone: true, selector: '[dir]', host: { 'src': TEST_IFRAME_URL, @@ -463,7 +442,6 @@ describe('iframe processing', () => { class IframeDir {} @Component({ - standalone: true, imports: [IframeDir], selector: 'my-comp', template: '', @@ -480,7 +458,6 @@ describe('iframe processing', () => { '(directive attribute after `src`)', () => { @Directive({ - standalone: true, selector: '[dir]', host: { 'sandbox': '', @@ -489,7 +466,6 @@ describe('iframe processing', () => { class IframeDir {} @Component({ - standalone: true, imports: [IframeDir], selector: 'my-comp', template: ``, @@ -502,7 +478,6 @@ describe('iframe processing', () => { it('should work when a security-sensitive attribute is set as a static attribute', () => { @Component({ - standalone: true, selector: 'my-comp', template: ` @@ -521,7 +496,6 @@ describe('iframe processing', () => { 'as a property binding and an `, @@ -568,7 +540,6 @@ describe('iframe processing', () => { 'before the directive that sets an `src` attribute value', () => { @Directive({ - standalone: true, selector: '[set-src]', host: { 'src': TEST_IFRAME_URL, @@ -577,7 +548,6 @@ describe('iframe processing', () => { class DirThatSetsSrc {} @Directive({ - standalone: true, selector: '[set-sandbox]', host: { 'sandbox': '', @@ -586,7 +556,6 @@ describe('iframe processing', () => { class DirThatSetsSandbox {} @Component({ - standalone: true, imports: [DirThatSetsSandbox, DirThatSetsSrc], selector: 'my-comp', // Important note: even though the `set-sandbox` goes after the `set-src`, @@ -605,7 +574,6 @@ describe('iframe processing', () => { 'a host directive that sets an `src` attribute value', () => { @Directive({ - standalone: true, selector: '[set-src-dir]', host: { 'src': TEST_IFRAME_URL, @@ -614,7 +582,6 @@ describe('iframe processing', () => { class DirThatSetsSrc {} @Directive({ - standalone: true, selector: '[dir]', hostDirectives: [DirThatSetsSrc], host: { @@ -624,7 +591,6 @@ describe('iframe processing', () => { class DirThatSetsSandbox {} @Component({ - standalone: true, imports: [DirThatSetsSandbox], selector: 'my-comp', template: '', @@ -640,7 +606,6 @@ describe('iframe processing', () => { 'a host directive that sets a security-sensitive attribute value', () => { @Directive({ - standalone: true, selector: '[set-sandbox-dir]', host: { 'sandbox': '', @@ -649,7 +614,6 @@ describe('iframe processing', () => { class DirThatSetsSandbox {} @Directive({ - standalone: true, selector: '[dir]', hostDirectives: [DirThatSetsSandbox], host: { @@ -659,7 +623,6 @@ describe('iframe processing', () => { class DirThatSetsSrc {} @Component({ - standalone: true, imports: [DirThatSetsSrc], selector: 'my-comp', template: '', @@ -675,7 +638,6 @@ describe('iframe processing', () => { 'with security-sensitive attributes set via property bindings', () => { @Component({ - standalone: true, selector: 'my-comp', template: ` @@ -711,7 +673,6 @@ describe('iframe processing', () => { 'a property binding on an