From fabd642826f0c6da2f47a6d32322a0bc893117c3 Mon Sep 17 00:00:00 2001 From: RafaelJCamara Date: Wed, 8 Jan 2025 08:03:54 +0100 Subject: [PATCH 0001/1220] docs: update README to reflect correct Angular repository branch in rendering regions (#59421) PR Close #59421 --- adev/shared-docs/pipeline/api-gen/rendering/regions/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adev/shared-docs/pipeline/api-gen/rendering/regions/README.md b/adev/shared-docs/pipeline/api-gen/rendering/regions/README.md index b87a6668d88f..0f18941a8743 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/regions/README.md +++ b/adev/shared-docs/pipeline/api-gen/rendering/regions/README.md @@ -1,3 +1,3 @@ # Code Regions -All the files in the regions folder were implemented based on angular.io: . +All the files in the regions folder were implemented based on angular.io: . From fd073004bb19c4803252e6cc2985630f278baa7d Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Mon, 6 Jan 2025 21:41:44 +0100 Subject: [PATCH 0002/1220] docs(docs-infra): fix entry labels. (#59384) fixes #59382 PR Close #59384 --- .../pipeline/api-gen/rendering/templates/header-api.tsx | 6 +++--- .../pipeline/api-gen/rendering/templates/header-cli.tsx | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/header-api.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/header-api.tsx index 9ca0bcb55630..d7775224c12d 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/templates/header-api.tsx +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/header-api.tsx @@ -40,17 +40,17 @@ export function HeaderApi(props: {entry: DocEntryRenderable; showFullDescription {getEntryTypeDisplayName(entry.entryType)} {entry.isDeprecated && ( -
+
Deprecated
)} {entry.isDeveloperPreview && ( -
+ )} {entry.isExperimental && ( -
+ )} diff --git a/adev/shared-docs/pipeline/api-gen/rendering/templates/header-cli.tsx b/adev/shared-docs/pipeline/api-gen/rendering/templates/header-cli.tsx index 659033c67b94..dd2c475b62b7 100644 --- a/adev/shared-docs/pipeline/api-gen/rendering/templates/header-cli.tsx +++ b/adev/shared-docs/pipeline/api-gen/rendering/templates/header-cli.tsx @@ -21,7 +21,7 @@ export function HeaderCli(props: {command: CliCommandRenderable}) {

{command.parentCommand?.name} {command.name}

-
{'Command'}
+
{'Command'}
From ce8c7c877cc488edf5620225c92707b38bd9b670 Mon Sep 17 00:00:00 2001 From: arturovt Date: Fri, 11 Oct 2024 15:30:33 +0300 Subject: [PATCH 0003/1220] refactor(docs-infra): allow home editor to be cleaned up properly (#58164) In this commit, we're replacing the `async-await` style in the `home-editor` component with the `from()` observable, which allows us to invert a dependency and avoid memory leaks. Because an `async` function has a closure, just like any other function in JavaScript, using `await` captures `this` until the promise is resolved. PR Close #58164 --- .../home/components/home-editor.component.ts | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) 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 3b15cbd2f015..d8e2cf7f25ec 100644 --- a/adev/src/app/features/home/components/home-editor.component.ts +++ b/adev/src/app/features/home/components/home-editor.component.ts @@ -10,11 +10,14 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, + DestroyRef, EnvironmentInjector, inject, Input, OnInit, } from '@angular/core'; +import {takeUntilDestroyed} from '@angular/core/rxjs-interop'; +import {forkJoin} from 'rxjs'; import {injectAsync} from '../../../core/services/inject-async'; import {EmbeddedEditor, EmbeddedTutorialManager} from '../../../editor'; @@ -29,8 +32,9 @@ import {EmbeddedEditor, EmbeddedTutorialManager} from '../../../editor'; }) export class CodeEditorComponent implements OnInit { private readonly cdRef = inject(ChangeDetectorRef); - private readonly environmentInjector = inject(EnvironmentInjector); private readonly embeddedTutorialManager = inject(EmbeddedTutorialManager); + private readonly environmentInjector = inject(EnvironmentInjector); + private readonly destroyRef = inject(DestroyRef); @Input({required: true}) tutorialFiles!: string; @@ -38,15 +42,20 @@ export class CodeEditorComponent implements OnInit { this.loadEmbeddedEditor(); } - private async loadEmbeddedEditor() { - const nodeRuntimeSandbox = await injectAsync(this.environmentInjector, () => - import('../../../editor/index').then((c) => c.NodeRuntimeSandbox), - ); - - await this.embeddedTutorialManager.fetchAndSetTutorialFiles(this.tutorialFiles); - - this.cdRef.markForCheck(); - - await nodeRuntimeSandbox.init(); + private loadEmbeddedEditor() { + // If using `async-await`, `this` will be captured until the function is executed + // 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), + ), + this.embeddedTutorialManager.fetchAndSetTutorialFiles(this.tutorialFiles), + ]) + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe(([nodeRuntimeSandbox]) => { + this.cdRef.markForCheck(); + nodeRuntimeSandbox.init(); + }); } } From a25396d562c66793e9d8b7d055650f7715e1febf Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Tue, 7 Jan 2025 15:59:10 +0000 Subject: [PATCH 0004/1220] fix(bazel): support setting `type: module` in source `package.json` (#59406) This is helpful as it allows us to set `type: module` in the checked-in package files, useful for the hybrid mode of `rules_js` and `rules_nodejs`, where the package.json files can control the execution format. PR Close #59406 --- packages/bazel/src/ng_package/packager.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/bazel/src/ng_package/packager.ts b/packages/bazel/src/ng_package/packager.ts index e183ba659825..4df831f7ecaf 100644 --- a/packages/bazel/src/ng_package/packager.ts +++ b/packages/bazel/src/ng_package/packager.ts @@ -306,10 +306,10 @@ function main(args: string[]): void { * the module conditional exports and the ESM module type. */ function updatePrimaryPackageJson(packageJson: Readonly): PackageJson { - if (packageJson.type !== undefined) { + if (packageJson.type !== undefined && packageJson.type !== 'module') { throw Error( 'The primary "package.json" file of the package sets the "type" field ' + - 'that is controlled by the packager. Please unset it.', + 'that is controlled by the packager. Please unset it or set `type` to `module`.', ); } From 9870b643bff46f089a3f0a30514fb7e062a66d56 Mon Sep 17 00:00:00 2001 From: Miles Malerba Date: Wed, 16 Oct 2024 23:30:29 +0000 Subject: [PATCH 0005/1220] fix(core): Defer afterRender until after first CD (#58250) For `afterRender`/`afterNextRender` calls associated with a particular view, ensure that they are not registered until after the first time the view is rendered. Co-authored-by: Alex Rickabaugh PR Close #58250 --- .../core/src/application/application_ref.ts | 17 +- .../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, 198 insertions(+), 138 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 349f5de9657c..41d91593550c 100644 --- a/packages/core/src/application/application_ref.ts +++ b/packages/core/src/application/application_ref.ts @@ -44,9 +44,9 @@ import {TESTABILITY} from '../testability/testability'; import {isPromise} from '../util/lang'; import {NgZone} from '../zone/ng_zone'; +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'; /** * A DI token that provides a set of callbacks to @@ -321,13 +321,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. * @@ -647,10 +640,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) { this.synchronizeOnce(); @@ -671,10 +660,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 8472188da363..f29b8258f019 100644 --- a/packages/core/src/render3/after_render/manager.ts +++ b/packages/core/src/render3/after_render/manager.ts @@ -6,17 +6,19 @@ * 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 {markAncestorsForTraversal} from '../util/view_utils'; +import {AfterRenderPhase, AfterRenderRef} from './api'; export class AfterRenderManager { impl: AfterRenderImpl | null = null; @@ -102,22 +104,34 @@ 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(); } 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. @@ -172,6 +186,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, @@ -194,5 +209,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 06fe193302da..84f152979ef1 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, RenderFlags} from '../interfaces/definition'; @@ -33,8 +34,8 @@ import { TView, } from '../interfaces/view'; import { - getOrCreateTemporaryConsumer, getOrBorrowReactiveLViewConsumer, + getOrCreateTemporaryConsumer, maybeReturnReactiveLViewConsumer, ReactiveLViewConsumer, viewShouldHaveReactiveConsumer, @@ -61,6 +62,8 @@ import { viewAttachedToChangeDetector, } from '../util/view_utils'; +import {isDestroyed} from '../interfaces/type_checks'; +import {runEffectsInView} from '../reactivity/view_effect_runner'; import { executeTemplate, executeViewQueryFn, @@ -68,8 +71,6 @@ import { processHostBindingOpCodes, refreshContentQueries, } from './shared'; -import {runEffectsInView} from '../reactivity/view_effect_runner'; -import {isDestroyed} from '../interfaces/type_checks'; /** * The maximum number of times the change detection traversal will rerun before throwing an error. @@ -355,6 +356,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) { @@ -501,6 +504,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 9a22a958927e..56d88c003f8a 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 2e2e27117ed7..52b62a1375f0 100644 --- a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json @@ -200,6 +200,7 @@ "_platformInjector", "_wasLastNodeCreated", "activeConsumer", + "addAfterRenderSequencesForView", "addClass", "addPropertyBinding", "addToEndOfViewTree", diff --git a/packages/core/test/bundling/animations/bundle.golden_symbols.json b/packages/core/test/bundling/animations/bundle.golden_symbols.json index ebbc60f3e3cf..925b4041641f 100644 --- a/packages/core/test/bundling/animations/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations/bundle.golden_symbols.json @@ -220,6 +220,7 @@ "_testabilityGetter", "_wasLastNodeCreated", "activeConsumer", + "addAfterRenderSequencesForView", "addClass", "addPropertyBinding", "addToEndOfViewTree", 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 eed65d143f05..803d0f22803a 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -167,6 +167,7 @@ "_testabilityGetter", "_wasLastNodeCreated", "activeConsumer", + "addAfterRenderSequencesForView", "addPropertyBinding", "addToEndOfViewTree", "allocExpando", diff --git a/packages/core/test/bundling/defer/bundle.golden_symbols.json b/packages/core/test/bundling/defer/bundle.golden_symbols.json index fa5f219a8544..a73ac55a1284 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -205,6 +205,7 @@ "_retrieveHydrationInfoImpl", "_wasLastNodeCreated", "activeConsumer", + "addAfterRenderSequencesForView", "addDepsToRegistry", "addPropertyBinding", "addToEndOfViewTree", @@ -724,6 +725,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 40c1c7fb2389..70d4f900d269 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -237,6 +237,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 029463abf3ee..7e8222b9ab3f 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 @@ -231,6 +231,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 a76215fb1d1f..baa857939c79 100644 --- a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json @@ -124,6 +124,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 284d6eb507ae..ca5dfab575e8 100644 --- a/packages/core/test/bundling/hydration/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hydration/bundle.golden_symbols.json @@ -171,6 +171,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 71364e6cefca..6bbc40ff7d2b 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -279,6 +279,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 0d41e6808cc0..ffe656b028ec 100644 --- a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json +++ b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json @@ -149,6 +149,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 1524cf7a2ba7..144fe0e2025c 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -196,6 +196,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 b8d518a321e0..5f28d71609cd 100644 --- a/packages/platform-server/test/full_app_hydration_spec.ts +++ b/packages/platform-server/test/full_app_hydration_spec.ts @@ -60,10 +60,12 @@ import { stripUtilAttributes, } from './dom_utils'; import { + clearConsole, EMPTY_TEXT_NODE_COMMENT, getComponentRef, getHydrationInfoFromTransferState, NGH_ATTR_NAME, + resetNgDevModeCounters, ssr, stripExcessiveSpaces, stripSsrIntegrityMarker, @@ -73,6 +75,7 @@ import { verifyAllChildNodesClaimedForHydration, verifyAllNodesClaimedForHydration, verifyClientAndSSRContentsMatch, + verifyEmptyConsole, verifyHasLog, verifyHasNoLog, verifyNodeHasMismatchInfo, @@ -80,9 +83,6 @@ import { verifyNoNodesWereClaimedForHydration, withDebugConsole, withNoopErrorHandler, - verifyEmptyConsole, - clearConsole, - resetNgDevModeCounters, } from './hydration_utils'; import {CLIENT_RENDER_MODE_FLAG} from '@angular/core/src/hydration/api'; @@ -2071,7 +2071,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', ); }); @@ -2125,7 +2125,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', ); }); @@ -2366,7 +2366,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 a5fc9620948c59da2146d46d27de388839b93254 Mon Sep 17 00:00:00 2001 From: Miles Malerba Date: Mon, 6 Jan 2025 22:43:20 +0000 Subject: [PATCH 0006/1220] fix(core): Don't run effects in check no changes pass (#58250) Fixes an issue where we accidentally ran effects in check no changes passes. PR Close #58250 --- 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 84f152979ef1..05b227fda383 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 00cc923117bc5062c47e19adedf952c83721b243 Mon Sep 17 00:00:00 2001 From: Dmytro Mezhenskyi Date: Sat, 30 Nov 2024 13:10:16 +0100 Subject: [PATCH 0007/1220] refactor(platform-browser): improve error message for UNEXPECTED_SYNTHETIC_PROPERTY (#58983) Improve error message by adding instructions for enabling animations using standalone API. PR Close #58983 --- packages/core/test/animation/animation_integration_spec.ts | 4 ++-- packages/platform-browser/src/dom/dom_renderer.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/core/test/animation/animation_integration_spec.ts b/packages/core/test/animation/animation_integration_spec.ts index cb4954f56f40..b2286f0b7740 100644 --- a/packages/core/test/animation/animation_integration_spec.ts +++ b/packages/core/test/animation/animation_integration_spec.ts @@ -4521,8 +4521,8 @@ const DEFAULT_COMPONENT_ID = '1'; function syntheticPropError(name: string, nameKind: string) { return `NG05105: Unexpected synthetic ${nameKind} ${name} found. Please make sure that: - - Either \`BrowserAnimationsModule\` or \`NoopAnimationsModule\` are imported in your application. - - There is corresponding configuration for the animation named \`${name}\` defined in the \`animations\` field of the \`@Component\` decorator (see https://angular.io/api/core/Component#animations).`; + - Make sure \`provideAnimationsAsync()\`, \`provideAnimations()\` or \`provideNoopAnimations()\` call was added to a list of providers used to bootstrap an application. + - There is a corresponding animation configuration named \`${name}\` defined in the \`animations\` field of the \`@Component\` decorator (see https://angular.dev/api/core/Component#animations).`; } describe('when modules are missing', () => { diff --git a/packages/platform-browser/src/dom/dom_renderer.ts b/packages/platform-browser/src/dom/dom_renderer.ts index ef32a78f7442..f0d1da86c95a 100644 --- a/packages/platform-browser/src/dom/dom_renderer.ts +++ b/packages/platform-browser/src/dom/dom_renderer.ts @@ -423,8 +423,8 @@ function checkNoSyntheticProp(name: string, nameKind: string) { throw new RuntimeError( RuntimeErrorCode.UNEXPECTED_SYNTHETIC_PROPERTY, `Unexpected synthetic ${nameKind} ${name} found. Please make sure that: - - Either \`BrowserAnimationsModule\` or \`NoopAnimationsModule\` are imported in your application. - - There is corresponding configuration for the animation named \`${name}\` defined in the \`animations\` field of the \`@Component\` decorator (see https://angular.io/api/core/Component#animations).`, + - Make sure \`provideAnimationsAsync()\`, \`provideAnimations()\` or \`provideNoopAnimations()\` call was added to a list of providers used to bootstrap an application. + - There is a corresponding animation configuration named \`${name}\` defined in the \`animations\` field of the \`@Component\` decorator (see https://angular.dev/api/core/Component#animations).`, ); } } From dd1d69b2e2f89ddf793f80211e1fb2ffde9fb1e5 Mon Sep 17 00:00:00 2001 From: arturovt Date: Wed, 8 Jan 2025 16:14:44 +0200 Subject: [PATCH 0008/1220] refactor(common): drop `PRELOADED_IMAGES` name in production (#59425) In this commit, we drop the `PRELOADED_IMAGES` injection token name in production. PR Close #59425 --- .../src/directives/ng_optimized_image/tokens.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/common/src/directives/ng_optimized_image/tokens.ts b/packages/common/src/directives/ng_optimized_image/tokens.ts index 32348cc8ac1f..1ccc422708a7 100644 --- a/packages/common/src/directives/ng_optimized_image/tokens.ts +++ b/packages/common/src/directives/ng_optimized_image/tokens.ts @@ -23,7 +23,10 @@ export const DEFAULT_PRELOADED_IMAGES_LIMIT = 5; * This Set tracks the original src passed into the `ngSrc` input not the src after it has been * run through the specified `IMAGE_LOADER`. */ -export const PRELOADED_IMAGES = new InjectionToken>('NG_OPTIMIZED_PRELOADED_IMAGES', { - providedIn: 'root', - factory: () => new Set(), -}); +export const PRELOADED_IMAGES = new InjectionToken>( + typeof ngDevMode === 'undefined' || ngDevMode ? 'NG_OPTIMIZED_PRELOADED_IMAGES' : '', + { + providedIn: 'root', + factory: () => new Set(), + }, +); From 5c0d68804e03bcd425e5398e08d9cbe1846b21ca Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Tue, 7 Jan 2025 21:45:52 +0100 Subject: [PATCH 0009/1220] fix(core): Ensure that a destroyed `effect` never run. (#59415) Prior to this change, a scheduled root effect, even if destroyed instantly, would still run at least once. This commit fixes this. fixes #59410 PR Close #59415 --- .../size-tracking/integration-payloads.json | 2 +- .../core/src/render3/reactivity/effect.ts | 1 + .../reactivity/root_effect_scheduler.ts | 14 +++++ packages/core/test/render3/reactivity_spec.ts | 52 +++++++++++++++++-- 4 files changed, 64 insertions(+), 5 deletions(-) diff --git a/goldens/size-tracking/integration-payloads.json b/goldens/size-tracking/integration-payloads.json index fe8a61ccb84e..a1885374cef1 100644 --- a/goldens/size-tracking/integration-payloads.json +++ b/goldens/size-tracking/integration-payloads.json @@ -20,7 +20,7 @@ }, "forms": { "uncompressed": { - "main": 176726, + "main": 181773, "polyfills": 33772 } }, diff --git a/packages/core/src/render3/reactivity/effect.ts b/packages/core/src/render3/reactivity/effect.ts index 6317b9fd3e45..dd8552e0fd0b 100644 --- a/packages/core/src/render3/reactivity/effect.ts +++ b/packages/core/src/render3/reactivity/effect.ts @@ -312,6 +312,7 @@ export const ROOT_EFFECT_NODE: Omit { let prev: boolean; @@ -487,6 +484,53 @@ describe('reactivity', () => { (fix.componentInstance.injector as Injector & {destroy(): void}).destroy(); expect(destroyed).toBeTrue(); }); + + it('should not run root effects after it has been destroyed', async () => { + let effectCounter = 0; + const counter = signal(1); + const effectRef = TestBed.runInInjectionContext(() => + effect( + () => { + counter(); + effectCounter++; + }, + {injector: TestBed.inject(EnvironmentInjector)}, + ), + ); + expect(effectCounter).toBe(0); + effectRef.destroy(); + TestBed.flushEffects(); + expect(effectCounter).toBe(0); + + counter.set(2); + TestBed.flushEffects(); + expect(effectCounter).toBe(0); + }); + + it('should not run view effects after it has been destroyed', async () => { + let effectCounter = 0; + + @Component({template: ''}) + class TestCmp { + counter = signal(1); + effectRef = effect(() => { + this.counter(); + effectCounter++; + }); + } + + const fixture = TestBed.createComponent(TestCmp); + fixture.componentInstance.effectRef.destroy(); + fixture.detectChanges(); + expect(effectCounter).toBe(0); + + TestBed.flushEffects(); + expect(effectCounter).toBe(0); + + fixture.componentInstance.counter.set(2); + TestBed.flushEffects(); + expect(effectCounter).toBe(0); + }); }); }); From 5e8ee7aae0e21ffb5761e1cf0782cf64735ccba5 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Tue, 7 Jan 2025 16:34:23 +0100 Subject: [PATCH 0010/1220] refactor(docs-infra): simplify Preview component (#59404) The Preview component contains a work-around for the IFrame flickering issue https://github.com/angular/angular/issues/16994 Attempting a different work-around here. PR Close #59404 --- .../preview/preview-error.component.html | 35 ++++------ .../editor/preview/preview-error.component.ts | 1 - .../app/editor/preview/preview.component.html | 69 ++++++++++--------- .../editor/preview/preview.component.spec.ts | 13 ++-- .../app/editor/preview/preview.component.ts | 60 ++++------------ 5 files changed, 66 insertions(+), 112 deletions(-) diff --git a/adev/src/app/editor/preview/preview-error.component.html b/adev/src/app/editor/preview/preview-error.component.html index 4e3a096da459..88b6c773f8cc 100644 --- a/adev/src/app/editor/preview/preview-error.component.html +++ b/adev/src/app/editor/preview/preview-error.component.html @@ -1,27 +1,18 @@
- @switch (true) { - @case (error()?.type === ErrorType.UNSUPPORTED_BROWSER_ENVIRONMENT) { - @if(isIos) { -

Open angular.dev on desktop to code in your browser.

- } @else if(isFirefox) { -

- We're currently working on supporting Firefox with our development server. Meanwhile, try - running the page using a different browser. -

- } - } - @case (error()?.type === ErrorType.COOKIES || error()?.type === ErrorType.UNKNOWN) { -

- We couldn't start the tutorial app. Please ensure third party cookies are enabled for this - site. -

- } - @case (error()?.type === ErrorType.OUT_OF_MEMORY) { -

- We couldn't start the tutorial app because your browser is out of memory. To free up memory, - close angular.dev tutorials in other tabs or windows, and refresh the page. -

+ @if (error()?.type === ErrorType.UNSUPPORTED_BROWSER_ENVIRONMENT) { + @if (isIos) { +

Open angular.dev on desktop to code in your browser.

} + } @else if (error()?.type === ErrorType.COOKIES || error()?.type === ErrorType.UNKNOWN) { +

+ We couldn't start the tutorial app. Please ensure third party cookies are enabled for this + site. +

+ } @else if (error()?.type === ErrorType.OUT_OF_MEMORY) { +

+ We couldn't start the tutorial app because your browser is out of memory. To free up memory, + close angular.dev tutorials in other tabs or windows, and refresh the page. +

} @if (error()?.message) { diff --git a/adev/src/app/editor/preview/preview-error.component.ts b/adev/src/app/editor/preview/preview-error.component.ts index abd5e36c581e..a01efe87ab59 100644 --- a/adev/src/app/editor/preview/preview-error.component.ts +++ b/adev/src/app/editor/preview/preview-error.component.ts @@ -16,7 +16,6 @@ import {ErrorType, NodeRuntimeState} from '../node-runtime-state.service'; templateUrl: './preview-error.component.html', styleUrls: ['./preview-error.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, - imports: [], }) export class PreviewError { private readonly nodeRuntimeState = inject(NodeRuntimeState); diff --git a/adev/src/app/editor/preview/preview.component.html b/adev/src/app/editor/preview/preview.component.html index d03176ad20f1..edc30bb625f4 100644 --- a/adev/src/app/editor/preview/preview.component.html +++ b/adev/src/app/editor/preview/preview.component.html @@ -1,36 +1,41 @@
@if (loadingProgressValue() !== loadingEnum.ERROR) { - - } @if (previewErrorComponent) { - - } @if (loadingProgressValue() < loadingEnum.READY && loadingProgressValue() !== loadingEnum.ERROR) - { -
- @switch (loadingProgressValue()) { @case (loadingEnum.NOT_STARTED) { - Starting - } @case (loadingEnum.BOOT) { - Booting - } @case (loadingEnum.LOAD_FILES) { - Creating project - } @case (loadingEnum.INSTALL) { - Installing packages - } @case (loadingEnum.START_DEV_SERVER) { - - Initializing dev server - - } } - -
+ + } @else { + + } + + @if (loadingProgressValue() < loadingEnum.READY && loadingProgressValue() !== loadingEnum.ERROR) { +
+ @switch (loadingProgressValue()) { + @case (loadingEnum.NOT_STARTED) { + Starting + } + @case (loadingEnum.BOOT) { + Booting + } + @case (loadingEnum.LOAD_FILES) { + Creating project + } + @case (loadingEnum.INSTALL) { + Installing packages + } + @case (loadingEnum.START_DEV_SERVER) { + + Initializing dev server + + } + } + +
}
diff --git a/adev/src/app/editor/preview/preview.component.spec.ts b/adev/src/app/editor/preview/preview.component.spec.ts index ca7ac36cfb92..c800aa1d5e39 100644 --- a/adev/src/app/editor/preview/preview.component.spec.ts +++ b/adev/src/app/editor/preview/preview.component.spec.ts @@ -64,15 +64,10 @@ describe('Preview', () => { }; }; - it('should set iframe src on init', async () => { - const {component, PREVIEW_URL} = beforeEach(); - - component.ngAfterViewInit(); - - await new Promise((resolve) => setTimeout(resolve, 100)); - - expect(component.previewIframe?.nativeElement).toBeTruthy(); - expect(component.previewIframe?.nativeElement?.src).toBe(PREVIEW_URL); + it('should set iframe src', () => { + const {fixture, PREVIEW_URL} = beforeEach(); + const iframeElement = fixture.debugElement.query(By.css('iframe')); + expect(iframeElement?.nativeElement?.src).toBe(PREVIEW_URL); }); it('should not render loading elements if the loadingStep is READY or ERROR', () => { diff --git a/adev/src/app/editor/preview/preview.component.ts b/adev/src/app/editor/preview/preview.component.ts index e58f876c52f8..f968a47d5e75 100644 --- a/adev/src/app/editor/preview/preview.component.ts +++ b/adev/src/app/editor/preview/preview.component.ts @@ -6,77 +6,41 @@ * found in the LICENSE file at https://angular.dev/license */ -import {NgComponentOutlet} from '@angular/common'; import { - AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, - DestroyRef, - ElementRef, - ViewChild, - effect, inject, + computed, } from '@angular/core'; -import {takeUntilDestroyed} from '@angular/core/rxjs-interop'; -import {delay, filter, map} from 'rxjs'; +import {DomSanitizer} from '@angular/platform-browser'; +import {toSignal} from '@angular/core/rxjs-interop'; import {LoadingStep} from '../enums/loading-steps'; import {NodeRuntimeSandbox} from '../node-runtime-sandbox.service'; import {NodeRuntimeState} from '../node-runtime-state.service'; -import type {PreviewError} from './preview-error.component'; - -type PreviewUrlEmittedValue = { - url: string | null; - previewIframe: ElementRef; -}; +import {PreviewError} from './preview-error.component'; @Component({ selector: 'docs-tutorial-preview', templateUrl: './preview.component.html', styleUrls: ['./preview.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, - imports: [NgComponentOutlet], + imports: [PreviewError], }) -export class Preview implements AfterViewInit { - @ViewChild('preview') previewIframe: ElementRef | undefined; - +export class Preview { private readonly changeDetectorRef = inject(ChangeDetectorRef); - private readonly destroyRef = inject(DestroyRef); + private readonly domSanitizer = inject(DomSanitizer); private readonly nodeRuntimeSandbox = inject(NodeRuntimeSandbox); private readonly nodeRuntimeState = inject(NodeRuntimeState); loadingProgressValue = this.nodeRuntimeState.loadingStep; loadingEnum = LoadingStep; - previewErrorComponent: typeof PreviewError | undefined; - - constructor() { - effect(async () => { - if (this.nodeRuntimeState.loadingStep() === LoadingStep.ERROR) { - const {PreviewError} = await import('./preview-error.component'); - - this.previewErrorComponent = PreviewError; - - this.changeDetectorRef.markForCheck(); - } - }); - } - - ngAfterViewInit() { - this.nodeRuntimeSandbox.previewUrl$ - .pipe( - map((url) => ({url, previewIframe: this.previewIframe})), - filter((value): value is PreviewUrlEmittedValue => !!value.previewIframe), - // Note: The delay is being used here to workaround the flickering issue - // while switching tutorials - delay(100), - takeUntilDestroyed(this.destroyRef), - ) - .subscribe(({url, previewIframe}) => { - // Known issue - Binding to the src of an iframe causes the iframe to flicker: https://github.com/angular/angular/issues/16994 - previewIframe.nativeElement.src = url ?? ''; - }); - } + previewUrl = toSignal(this.nodeRuntimeSandbox.previewUrl$, {initialValue: null}); + previewUrlForIFrame = computed(() => { + const url = this.previewUrl(); + return url !== null ? this.domSanitizer.bypassSecurityTrustResourceUrl(url) : null; + }); } From c69f12ffd6face144ece3b8de22af3b8910bcf8e Mon Sep 17 00:00:00 2001 From: Jessica Janiuk Date: Wed, 8 Jan 2025 18:06:19 +0000 Subject: [PATCH 0011/1220] docs: release notes for the v19.0.6 release --- CHANGELOG.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index db1e9b99abd3..e64860496b2b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,26 @@ + +# 19.0.6 (2025-01-08) +### compiler-cli +| Commit | Type | Description | +| -- | -- | -- | +| [06a55e9817](https://github.com/angular/angular/commit/06a55e98173ff7bdd4e2ac1263309f9b935240f0) | fix | account for more expression types when determining HMR dependencies ([#59323](https://github.com/angular/angular/pull/59323)) | +| [17fb20f85d](https://github.com/angular/angular/commit/17fb20f85db9f3c172c194c0436644f34b7176b1) | fix | preserve defer block dependencies during HMR when class metadata is disabled ([#59313](https://github.com/angular/angular/pull/59313)) | +### core +| Commit | Type | Description | +| -- | -- | -- | +| [07afce81b8](https://github.com/angular/angular/commit/07afce81b8ce28d1b308ff25017a4d4993881f36) | fix | Ensure that a destroyed `effect` never run. ([#59415](https://github.com/angular/angular/pull/59415)) | +### platform-browser +| Commit | Type | Description | +| -- | -- | -- | +| [dbb8980d03](https://github.com/angular/angular/commit/dbb8980d03485ad1cf0e19503c4e770b1ba0767e) | fix | avoid circular DI error in async renderer ([#59271](https://github.com/angular/angular/pull/59271)) | +| [6d00efde95](https://github.com/angular/angular/commit/6d00efde952971573359b32cab06d0a513600fe0) | fix | styles not replaced during HMR when using animations renderer ([#59393](https://github.com/angular/angular/pull/59393)) | +### router +| Commit | Type | Description | +| -- | -- | -- | +| [144bccb687](https://github.com/angular/angular/commit/144bccb6872ece8fa1cf4954b5839054ccf20aa1) | fix | avoid component ID collisions with user code ([#59300](https://github.com/angular/angular/pull/59300)) | + + + # 19.1.0-next.4 (2024-12-18) ### core From f39425a489110ef0542ebbb195d466e415c26454 Mon Sep 17 00:00:00 2001 From: Jessica Janiuk Date: Wed, 8 Jan 2025 18:25:53 +0000 Subject: [PATCH 0012/1220] release: bump the next branch to v19.2.0-next.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9cfcc9ba7899..96e9f4ab60b6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "angular-srcs", - "version": "19.1.0-next.4", + "version": "19.2.0-next.0", "private": true, "description": "Angular - a web framework for modern web apps", "homepage": "https://github.com/angular/angular", From e689aaed306616ffeba62a74672d38decbdb2731 Mon Sep 17 00:00:00 2001 From: Jessica Janiuk Date: Wed, 8 Jan 2025 18:25:53 +0000 Subject: [PATCH 0013/1220] docs: release notes for the v19.1.0-rc.0 release --- CHANGELOG.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e64860496b2b..7cb7b98ed6fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,37 @@ + +# 19.1.0-rc.0 (2025-01-08) +### compiler +| Commit | Type | Description | +| -- | -- | -- | +| [ceadd28ea1](https://github.com/angular/angular/commit/ceadd28ea12140e8e78cdb706aff0487f5a87a3c) | fix | allow $any in two-way bindings ([#59362](https://github.com/angular/angular/pull/59362)) | +### compiler-cli +| Commit | Type | Description | +| -- | -- | -- | +| [ce3b6641fb](https://github.com/angular/angular/commit/ce3b6641fbbbc968ee2ddf037dbc5ea70b8f1b07) | fix | account for more expression types when determining HMR dependencies ([#59323](https://github.com/angular/angular/pull/59323)) | +| [ee99879fdc](https://github.com/angular/angular/commit/ee99879fdc66f98dca80524c702304066c9882d5) | fix | preserve defer block dependencies during HMR when class metadata is disabled ([#59313](https://github.com/angular/angular/pull/59313)) | +### core +| Commit | Type | Description | +| -- | -- | -- | +| [9870b643bf](https://github.com/angular/angular/commit/9870b643bff46f089a3f0a30514fb7e062a66d56) | fix | Defer afterRender until after first CD ([#58250](https://github.com/angular/angular/pull/58250)) | +| [a5fc962094](https://github.com/angular/angular/commit/a5fc9620948c59da2146d46d27de388839b93254) | fix | Don't run effects in check no changes pass ([#58250](https://github.com/angular/angular/pull/58250)) | +| [5c0d68804e](https://github.com/angular/angular/commit/5c0d68804e03bcd425e5398e08d9cbe1846b21ca) | fix | Ensure that a destroyed `effect` never run. ([#59415](https://github.com/angular/angular/pull/59415)) | +### migrations +| Commit | Type | Description | +| -- | -- | -- | +| [d298d25426](https://github.com/angular/angular/commit/d298d254269ff759111fbdef7736bc8b713638bc) | feat | add schematic to clean up unused imports ([#59353](https://github.com/angular/angular/pull/59353)) | +### platform-browser +| Commit | Type | Description | +| -- | -- | -- | +| [8c5db3cfb7](https://github.com/angular/angular/commit/8c5db3cfb75700dd64f4c8c073554c7086835950) | fix | avoid circular DI error in async renderer ([#59256](https://github.com/angular/angular/pull/59256)) | +| [0e23f20c41](https://github.com/angular/angular/commit/0e23f20c4117ffd5c871549a8012b8e22b03b5f4) | fix | styles not replaced during HMR when using animations renderer ([#59393](https://github.com/angular/angular/pull/59393)) | +### router +| Commit | Type | Description | +| -- | -- | -- | +| [5ac6f065ab](https://github.com/angular/angular/commit/5ac6f065ab370ae99657c7a230bfd7ebf1d2f587) | fix | avoid component ID collisions with user code ([#59300](https://github.com/angular/angular/pull/59300)) | +| [52a6710f54](https://github.com/angular/angular/commit/52a6710f54bcec81f4cde23a78b9f78d038156c5) | fix | complete router `events` on dispose ([#59327](https://github.com/angular/angular/pull/59327)) | + + + # 19.0.6 (2025-01-08) ### compiler-cli From 854a5616bf618c9f4fc6b8ee2fceedbae48da5b5 Mon Sep 17 00:00:00 2001 From: arturovt Date: Wed, 8 Jan 2025 19:45:59 +0200 Subject: [PATCH 0014/1220] refactor(forms): drop `CALL_SET_DISABLED_STATE` name in production (#59430) In this commit, we drop the `CALL_SET_DISABLED_STATE` injection token name in production. PR Close #59430 --- packages/forms/src/directives/shared.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/forms/src/directives/shared.ts b/packages/forms/src/directives/shared.ts index 6e92de01a575..587ac4f07215 100644 --- a/packages/forms/src/directives/shared.ts +++ b/packages/forms/src/directives/shared.ts @@ -31,10 +31,13 @@ import {AsyncValidatorFn, Validator, ValidatorFn} from './validators'; * * @see {@link FormsModule#withconfig} */ -export const CALL_SET_DISABLED_STATE = new InjectionToken('CallSetDisabledState', { - providedIn: 'root', - factory: () => setDisabledStateDefault, -}); +export const CALL_SET_DISABLED_STATE = new InjectionToken( + typeof ngDevMode === 'undefined' || ngDevMode ? 'CallSetDisabledState' : '', + { + providedIn: 'root', + factory: () => setDisabledStateDefault, + }, +); /** * The type for CALL_SET_DISABLED_STATE. If `always`, then ControlValueAccessor will always call From adc6c094f425813023f2fca8cce38039a1d24125 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Thu, 9 Jan 2025 14:15:21 +0100 Subject: [PATCH 0015/1220] build: clean up pipeline-specific tests (#59450) Now that we only have the template pipeline, we can remove the `.pipeline` extension from the files. PR Close #59450 --- .../lifecycle_hooks/TEST_CASES.json | 6 +- ...ference_and_context_variables_template.js} | 0 ....pipeline.js => local_reference_nested.js} | 0 .../pipes/TEST_CASES.json | 4 +- ...pp_def.pipeline.js => pipes_my_app_def.js} | 0 .../safe_access/TEST_CASES.json | 8 +-- ...ne.js => safe_access_non_null_template.js} | 0 ...js => safe_access_temporaries_template.js} | 0 ...late.pipeline.js => safe_call_template.js} | 0 .../attribute_bindings/TEST_CASES.json | 2 +- ... exclude_bindings_from_consts_template.js} | 0 .../host_bindings/TEST_CASES.json | 2 +- ...e_attrs.pipeline.js => deceptive_attrs.js} | 0 .../non_bindable_behavior/TEST_CASES.json | 4 +- ..._host.pipeline.js => local_ref_on_host.js} | 0 .../TEST_CASES.json | 14 ++--- ...or_aliased_template_variables_template.js} | 0 ...r_template_variables_listener_template.js} | 0 ... for_template_variables_scope_template.js} | 0 ....js => for_template_variables_template.js} | 0 ... => if_nested_alias_listeners_template.js} | 0 ...e.pipeline.js => if_with_pipe_template.js} | 0 ...peline.js => switch_with_pipe_template.js} | 0 .../r3_view_compiler_deferred/TEST_CASES.json | 2 +- ...js => deferred_when_with_pipe_template.js} | 0 .../element_attributes/TEST_CASES.json | 18 +++--- ...pipeline.js => i18n_root_node_template.js} | 0 ...ine.js => interpolation_basic_template.js} | 0 ...rpolation_complex_expressions_template.js} | 0 ...> interpolation_custom_config_template.js} | 0 ... interpolation_nested_context_template.js} | 0 ...ine.js => meaning_description_template.js} | 0 ...late_interpolation_structural_template.js} | 0 ... => ng-template_interpolation_template.js} | 0 ... static_attributes_structural_template.js} | 0 .../icu_logic/TEST_CASES.json | 2 +- .../{bare_icu.pipeline.js => bare_icu.js} | 0 .../TEST_CASES.json | 2 +- ..._enabled.pipeline.js => legacy_enabled.js} | 0 .../namespaces/TEST_CASES.json | 4 +- ...n_object.pipeline.js => foreign_object.js} | 0 ...aced_div.pipeline.js => namespaced_div.js} | 0 .../nested_nodes/TEST_CASES.json | 12 ++-- .../{directives.pipeline.js => directives.js} | 0 ...ipeline.js => event_listeners_template.js} | 0 ...> last_elem_inside_i18n_block_template.js} | 0 ...elements_with_i18n_attributes_template.js} | 0 ...plates.pipeline.js => nested_templates.js} | 0 ...e.pipeline.js => self_closing_template.js} | 0 .../ng-container_ng-template/TEST_CASES.json | 4 +- ..._tags.pipeline.js => self_closing_tags.js} | 0 ...s.pipeline.js => structural_directives.js} | 0 .../TEST_CASES.json | 2 +- .../{styles.pipeline.js => styles.js} | 0 .../r3_view_compiler_listener/TEST_CASES.json | 4 +- ...mbedded_view_listener_context_template.js} | 0 ...peline.js => local_ref_before_listener.js} | 0 .../class_bindings/TEST_CASES.json | 2 +- ...js => shared_name_with_consts_template.js} | 0 .../mixed_style_and_class/TEST_CASES.json | 2 +- ..._bindings.pipeline.js => pipe_bindings.js} | 0 .../r3_view_compiler_template/TEST_CASES.json | 4 +- ...pipeline.js => nested_template_context.js} | 0 ....js => ng_for_parent_context_variables.js} | 0 .../test/compliance/test_cases/replace.sh | 61 ------------------- .../inline_templates/TEST_CASES.json | 6 +- ...erpolation_whitespace_partial_template.js} | 0 ...sage_interpolation_whitespace_template.js} | 0 68 files changed, 52 insertions(+), 113 deletions(-) rename packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/{local_reference_and_context_variables_template.pipeline.js => local_reference_and_context_variables_template.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/{local_reference_nested.pipeline.js => local_reference_nested.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/pipes/{pipes_my_app_def.pipeline.js => pipes_my_app_def.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/{safe_access_non_null_template.pipeline.js => safe_access_non_null_template.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/{safe_access_temporaries_template.pipeline.js => safe_access_temporaries_template.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/{safe_call_template.pipeline.js => safe_call_template.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/attribute_bindings/{exclude_bindings_from_consts_template.pipeline.js => exclude_bindings_from_consts_template.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/host_bindings/{deceptive_attrs.pipeline.js => deceptive_attrs.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/non_bindable_behavior/{local_ref_on_host.pipeline.js => local_ref_on_host.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/{for_aliased_template_variables_template.pipeline.js => for_aliased_template_variables_template.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/{for_template_variables_listener_template.pipeline.js => for_template_variables_listener_template.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/{for_template_variables_scope_template.pipeline.js => for_template_variables_scope_template.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/{for_template_variables_template.pipeline.js => for_template_variables_template.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/{if_nested_alias_listeners_template.pipeline.js => if_nested_alias_listeners_template.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/{if_with_pipe_template.pipeline.js => if_with_pipe_template.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/{switch_with_pipe_template.pipeline.js => switch_with_pipe_template.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/{deferred_when_with_pipe_template.pipeline.js => deferred_when_with_pipe_template.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/{i18n_root_node_template.pipeline.js => i18n_root_node_template.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/{interpolation_basic_template.pipeline.js => interpolation_basic_template.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/{interpolation_complex_expressions_template.pipeline.js => interpolation_complex_expressions_template.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/{interpolation_custom_config_template.pipeline.js => interpolation_custom_config_template.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/{interpolation_nested_context_template.pipeline.js => interpolation_nested_context_template.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/{meaning_description_template.pipeline.js => meaning_description_template.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/{ng-template_interpolation_structural_template.pipeline.js => ng-template_interpolation_structural_template.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/{ng-template_interpolation_template.pipeline.js => ng-template_interpolation_template.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/{static_attributes_structural_template.pipeline.js => static_attributes_structural_template.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/{bare_icu.pipeline.js => bare_icu.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/localize_legacy_message_ids/{legacy_enabled.pipeline.js => legacy_enabled.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/{foreign_object.pipeline.js => foreign_object.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/{namespaced_div.pipeline.js => namespaced_div.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/{directives.pipeline.js => directives.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/{event_listeners_template.pipeline.js => event_listeners_template.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/{last_elem_inside_i18n_block_template.pipeline.js => last_elem_inside_i18n_block_template.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/{nested_elements_with_i18n_attributes_template.pipeline.js => nested_elements_with_i18n_attributes_template.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/{nested_templates.pipeline.js => nested_templates.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/{self_closing_template.pipeline.js => self_closing_template.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/{self_closing_tags.pipeline.js => self_closing_tags.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/{structural_directives.pipeline.js => structural_directives.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/{styles.pipeline.js => styles.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/{embedded_view_listener_context_template.pipeline.js => embedded_view_listener_context_template.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/{local_ref_before_listener.pipeline.js => local_ref_before_listener.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/class_bindings/{shared_name_with_consts_template.pipeline.js => shared_name_with_consts_template.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/mixed_style_and_class/{pipe_bindings.pipeline.js => pipe_bindings.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/{nested_template_context.pipeline.js => nested_template_context.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/{ng_for_parent_context_variables.pipeline.js => ng_for_parent_context_variables.js} (100%) delete mode 100755 packages/compiler-cli/test/compliance/test_cases/replace.sh rename packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/{i18n_message_interpolation_whitespace_partial_template.pipeline.js => i18n_message_interpolation_whitespace_partial_template.js} (100%) rename packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/{i18n_message_interpolation_whitespace_template.pipeline.js => i18n_message_interpolation_whitespace_template.js} (100%) diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/TEST_CASES.json index d727ec337781..813d9ebfd3cc 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/TEST_CASES.json @@ -26,7 +26,7 @@ "files": [ { "generated": "local_reference_nested.js", - "expected": "local_reference_nested.pipeline.js" + "expected": "local_reference_nested.js" } ] } @@ -42,7 +42,7 @@ "failureMessage": "Incorrect template", "files": [ { - "expected": "local_reference_and_context_variables_template.pipeline.js", + "expected": "local_reference_and_context_variables_template.js", "generated": "local_reference_and_context_variables.js" } ] @@ -76,4 +76,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/local_reference_and_context_variables_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/local_reference_and_context_variables_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/local_reference_and_context_variables_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/local_reference_and_context_variables_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/local_reference_nested.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/local_reference_nested.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/local_reference_nested.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/local_reference_nested.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/pipes/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/pipes/TEST_CASES.json index d9a7772cf361..394925034af5 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/pipes/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/pipes/TEST_CASES.json @@ -47,7 +47,7 @@ "failureMessage": "Invalid MyApp definition", "files": [ { - "expected": "pipes_my_app_def.pipeline.js", + "expected": "pipes_my_app_def.js", "generated": "pipes.js" } ] @@ -113,4 +113,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/pipes/pipes_my_app_def.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/pipes/pipes_my_app_def.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/pipes/pipes_my_app_def.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/pipes/pipes_my_app_def.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/TEST_CASES.json index bfcd19ea1be8..074118772b95 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/TEST_CASES.json @@ -43,7 +43,7 @@ { "files": [ { - "expected": "safe_access_temporaries_template.pipeline.js", + "expected": "safe_access_temporaries_template.js", "generated": "safe_access_temporaries.js" } ], @@ -77,7 +77,7 @@ { "files": [ { - "expected": "safe_call_template.pipeline.js", + "expected": "safe_call_template.js", "generated": "safe_call.js" } ], @@ -94,7 +94,7 @@ { "files": [ { - "expected": "safe_access_non_null_template.pipeline.js", + "expected": "safe_access_non_null_template.js", "generated": "safe_access_non_null.js" } ], @@ -103,4 +103,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/safe_access_non_null_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/safe_access_non_null_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/safe_access_non_null_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/safe_access_non_null_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/safe_access_temporaries_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/safe_access_temporaries_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/safe_access_temporaries_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/safe_access_temporaries_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/safe_call_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/safe_call_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/safe_call_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/safe_call_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/attribute_bindings/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/attribute_bindings/TEST_CASES.json index b025ad0a0744..9d94894e1d45 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/attribute_bindings/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/attribute_bindings/TEST_CASES.json @@ -89,7 +89,7 @@ "failureMessage": "Incorrect attribute array", "files": [ { - "expected": "exclude_bindings_from_consts_template.pipeline.js", + "expected": "exclude_bindings_from_consts_template.js", "generated": "exclude_bindings_from_consts.js" } ] diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/attribute_bindings/exclude_bindings_from_consts_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/attribute_bindings/exclude_bindings_from_consts_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/attribute_bindings/exclude_bindings_from_consts_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/attribute_bindings/exclude_bindings_from_consts_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/host_bindings/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/host_bindings/TEST_CASES.json index 158f2560a226..5805b4997116 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/host_bindings/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/host_bindings/TEST_CASES.json @@ -379,7 +379,7 @@ "files": [ { "generated": "deceptive_attrs.js", - "expected": "deceptive_attrs.pipeline.js" + "expected": "deceptive_attrs.js" } ] } diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/host_bindings/deceptive_attrs.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/host_bindings/deceptive_attrs.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/host_bindings/deceptive_attrs.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/host_bindings/deceptive_attrs.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/non_bindable_behavior/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/non_bindable_behavior/TEST_CASES.json index 08e0ad983b01..eb6404d13a46 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/non_bindable_behavior/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/non_bindable_behavior/TEST_CASES.json @@ -12,7 +12,7 @@ "files": [ { "generated": "local_ref_on_host.js", - "expected": "local_ref_on_host.pipeline.js" + "expected": "local_ref_on_host.js" } ] } @@ -61,4 +61,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/non_bindable_behavior/local_ref_on_host.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/non_bindable_behavior/local_ref_on_host.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/non_bindable_behavior/local_ref_on_host.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/non_bindable_behavior/local_ref_on_host.js 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 ae5893bcf993..39b9aabe08ee 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 @@ -54,7 +54,7 @@ "files": [ { "generated": "switch_with_pipe.js", - "expected": "switch_with_pipe_template.pipeline.js" + "expected": "switch_with_pipe_template.js" } ], "failureMessage": "Incorrect template" @@ -144,7 +144,7 @@ "files": [ { "generated": "if_with_pipe.js", - "expected": "if_with_pipe_template.pipeline.js" + "expected": "if_with_pipe_template.js" } ], "failureMessage": "Incorrect template" @@ -188,7 +188,7 @@ { "files": [ { - "expected": "if_nested_alias_listeners_template.pipeline.js", + "expected": "if_nested_alias_listeners_template.js", "generated": "if_nested_alias_listeners.js" } ], @@ -278,7 +278,7 @@ { "files": [ { - "expected": "for_template_variables_template.pipeline.js", + "expected": "for_template_variables_template.js", "generated": "for_template_variables.js" } ], @@ -293,7 +293,7 @@ { "files": [ { - "expected": "for_aliased_template_variables_template.pipeline.js", + "expected": "for_aliased_template_variables_template.js", "generated": "for_aliased_template_variables.js" } ], @@ -338,7 +338,7 @@ { "files": [ { - "expected": "for_template_variables_listener_template.pipeline.js", + "expected": "for_template_variables_listener_template.js", "generated": "for_template_variables_listener.js" } ], @@ -383,7 +383,7 @@ { "files": [ { - "expected": "for_template_variables_scope_template.pipeline.js", + "expected": "for_template_variables_scope_template.js", "generated": "for_template_variables_scope.js" } ], diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_aliased_template_variables_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_aliased_template_variables_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_aliased_template_variables_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_aliased_template_variables_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_listener_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_listener_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_listener_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_listener_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_scope_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_scope_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_scope_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_scope_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/if_nested_alias_listeners_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/if_nested_alias_listeners_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/if_nested_alias_listeners_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/if_nested_alias_listeners_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/if_with_pipe_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/if_with_pipe_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/if_with_pipe_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/if_with_pipe_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/switch_with_pipe_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/switch_with_pipe_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/switch_with_pipe_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/switch_with_pipe_template.js 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 2744b408d5de..a027e6c58534 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 @@ -178,7 +178,7 @@ { "files": [ { - "expected": "deferred_when_with_pipe_template.pipeline.js", + "expected": "deferred_when_with_pipe_template.js", "generated": "deferred_when_with_pipe.js" } ], diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_when_with_pipe_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_when_with_pipe_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_when_with_pipe_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/deferred_when_with_pipe_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/TEST_CASES.json index 2ed7b1c54bb7..9a688f687b30 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/TEST_CASES.json @@ -14,7 +14,7 @@ ], "files": [ { - "expected": "meaning_description_template.pipeline.js", + "expected": "meaning_description_template.js", "generated": "meaning_description.js" } ] @@ -62,7 +62,7 @@ ], "files": [ { - "expected": "ng-template_interpolation_template.pipeline.js", + "expected": "ng-template_interpolation_template.js", "generated": "ng-template_interpolation.js" } ] @@ -82,7 +82,7 @@ ], "files": [ { - "expected": "ng-template_interpolation_structural_template.pipeline.js", + "expected": "ng-template_interpolation_structural_template.js", "generated": "ng-template_interpolation_structural.js" } ] @@ -144,7 +144,7 @@ ], "files": [ { - "expected": "static_attributes_structural_template.pipeline.js", + "expected": "static_attributes_structural_template.js", "generated": "static_attributes_structural.js" } ] @@ -164,7 +164,7 @@ ], "files": [ { - "expected": "interpolation_basic_template.pipeline.js", + "expected": "interpolation_basic_template.js", "generated": "interpolation_basic.js" } ] @@ -184,7 +184,7 @@ ], "files": [ { - "expected": "interpolation_custom_config_template.pipeline.js", + "expected": "interpolation_custom_config_template.js", "generated": "interpolation_custom_config.js" } ] @@ -204,7 +204,7 @@ ], "files": [ { - "expected": "interpolation_nested_context_template.pipeline.js", + "expected": "interpolation_nested_context_template.js", "generated": "interpolation_nested_context.js" } ] @@ -224,7 +224,7 @@ ], "files": [ { - "expected": "interpolation_complex_expressions_template.pipeline.js", + "expected": "interpolation_complex_expressions_template.js", "generated": "interpolation_complex_expressions.js" } ] @@ -244,7 +244,7 @@ ], "files": [ { - "expected": "i18n_root_node_template.pipeline.js", + "expected": "i18n_root_node_template.js", "generated": "i18n_root_node.js" } ] diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/i18n_root_node_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/i18n_root_node_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/i18n_root_node_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/i18n_root_node_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_basic_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_basic_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_basic_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_basic_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_complex_expressions_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_complex_expressions_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_complex_expressions_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_complex_expressions_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_custom_config_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_custom_config_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_custom_config_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_custom_config_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_nested_context_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_nested_context_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_nested_context_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_nested_context_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/meaning_description_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/meaning_description_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/meaning_description_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/meaning_description_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_interpolation_structural_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_interpolation_structural_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_interpolation_structural_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_interpolation_structural_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_interpolation_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_interpolation_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_interpolation_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_interpolation_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/static_attributes_structural_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/static_attributes_structural_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/static_attributes_structural_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/static_attributes_structural_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/TEST_CASES.json index ea940b2832f1..73dc0bd3acdd 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/TEST_CASES.json @@ -53,7 +53,7 @@ "files": [ { "generated": "bare_icu.js", - "expected": "bare_icu.pipeline.js" + "expected": "bare_icu.js" } ], "extraChecks": [ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/bare_icu.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/bare_icu.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/bare_icu.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/bare_icu.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/localize_legacy_message_ids/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/localize_legacy_message_ids/TEST_CASES.json index 0df6709834c9..4e88947a539e 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/localize_legacy_message_ids/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/localize_legacy_message_ids/TEST_CASES.json @@ -17,7 +17,7 @@ "files": [ { "generated": "legacy_enabled.js", - "expected": "legacy_enabled.pipeline.js" + "expected": "legacy_enabled.js" } ], "extraChecks": [ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/localize_legacy_message_ids/legacy_enabled.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/localize_legacy_message_ids/legacy_enabled.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/localize_legacy_message_ids/legacy_enabled.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/localize_legacy_message_ids/legacy_enabled.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/TEST_CASES.json index 3da69fcf44e5..cfafece8e3e3 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/TEST_CASES.json @@ -11,7 +11,7 @@ "files": [ { "generated": "foreign_object.js", - "expected": "foreign_object.pipeline.js" + "expected": "foreign_object.js" } ], "extraChecks": [ @@ -31,7 +31,7 @@ "files": [ { "generated": "namespaced_div.js", - "expected": "namespaced_div.pipeline.js" + "expected": "namespaced_div.js" } ], "extraChecks": [ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/foreign_object.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/foreign_object.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/foreign_object.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/foreign_object.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/namespaced_div.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/namespaced_div.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/namespaced_div.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/namespaced_div.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/TEST_CASES.json index fadb0ba213b0..6d6b7330d399 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/TEST_CASES.json @@ -151,7 +151,7 @@ "files": [ { "generated": "nested_elements_with_i18n_attributes.js", - "expected": "nested_elements_with_i18n_attributes_template.pipeline.js" + "expected": "nested_elements_with_i18n_attributes_template.js" } ], "extraChecks": [ @@ -171,7 +171,7 @@ "files": [ { "generated": "nested_templates.js", - "expected": "nested_templates.pipeline.js" + "expected": "nested_templates.js" } ], "extraChecks": [ @@ -191,7 +191,7 @@ "files": [ { "generated": "self_closing.js", - "expected": "self_closing_template.pipeline.js" + "expected": "self_closing_template.js" } ], "extraChecks": [ @@ -225,7 +225,7 @@ "files": [ { "generated": "directives.js", - "expected": "directives.pipeline.js" + "expected": "directives.js" } ], "extraChecks": [ @@ -245,7 +245,7 @@ "files": [ { "generated": "event_listeners.js", - "expected": "event_listeners_template.pipeline.js" + "expected": "event_listeners_template.js" } ], "extraChecks": [ @@ -296,7 +296,7 @@ ], "files": [ { - "expected": "last_elem_inside_i18n_block_template.pipeline.js", + "expected": "last_elem_inside_i18n_block_template.js", "generated": "last_elem_inside_i18n_block.js" } ] diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/directives.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/directives.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/directives.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/directives.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/event_listeners_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/event_listeners_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/event_listeners_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/event_listeners_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/last_elem_inside_i18n_block_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/last_elem_inside_i18n_block_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/last_elem_inside_i18n_block_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/last_elem_inside_i18n_block_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_elements_with_i18n_attributes_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_elements_with_i18n_attributes_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_elements_with_i18n_attributes_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_elements_with_i18n_attributes_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_templates.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_templates.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_templates.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_templates.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/self_closing_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/self_closing_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/self_closing_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/self_closing_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/TEST_CASES.json index ff1e021360d9..accc9d30ca77 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/TEST_CASES.json @@ -95,7 +95,7 @@ "files": [ { "generated": "self_closing_tags.js", - "expected": "self_closing_tags.pipeline.js" + "expected": "self_closing_tags.js" } ], "extraChecks": [ @@ -169,7 +169,7 @@ "files": [ { "generated": "structural_directives.js", - "expected": "structural_directives.pipeline.js" + "expected": "structural_directives.js" } ], "extraChecks": [ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/self_closing_tags.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/self_closing_tags.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/self_closing_tags.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/self_closing_tags.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/structural_directives.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/structural_directives.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/structural_directives.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/structural_directives.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/TEST_CASES.json index 35cd62939de3..49048ee0b913 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/TEST_CASES.json @@ -53,7 +53,7 @@ "files": [ { "generated": "styles.js", - "expected": "styles.pipeline.js" + "expected": "styles.js" } ], "extraChecks": [ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/styles.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/styles.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/styles.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/styles.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/TEST_CASES.json index 73e4a5da25e0..9460a3c57d6c 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/TEST_CASES.json @@ -61,7 +61,7 @@ { "files": [ { - "expected": "local_ref_before_listener.pipeline.js", + "expected": "local_ref_before_listener.js", "generated": "local_ref_before_listener.js" } ], @@ -290,7 +290,7 @@ { "files": [ { - "expected": "embedded_view_listener_context_template.pipeline.js", + "expected": "embedded_view_listener_context_template.js", "generated": "embedded_view_listener_context.js" } ], diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/embedded_view_listener_context_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/embedded_view_listener_context_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/embedded_view_listener_context_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/embedded_view_listener_context_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/local_ref_before_listener.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/local_ref_before_listener.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/local_ref_before_listener.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/local_ref_before_listener.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/class_bindings/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/class_bindings/TEST_CASES.json index 1cb564d45d3f..2ba1aa483d97 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/class_bindings/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/class_bindings/TEST_CASES.json @@ -80,7 +80,7 @@ { "files": [ { - "expected": "shared_name_with_consts_template.pipeline.js", + "expected": "shared_name_with_consts_template.js", "generated": "shared_name_with_consts.js" } ], diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/class_bindings/shared_name_with_consts_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/class_bindings/shared_name_with_consts_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/class_bindings/shared_name_with_consts_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/class_bindings/shared_name_with_consts_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/mixed_style_and_class/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/mixed_style_and_class/TEST_CASES.json index 8e026b5f5350..8ca28fb2eb4c 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/mixed_style_and_class/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/mixed_style_and_class/TEST_CASES.json @@ -18,7 +18,7 @@ { "failureMessage": "Incorrect template", "files": [{ - "expected": "pipe_bindings.pipeline.js", + "expected": "pipe_bindings.js", "generated": "pipe_bindings.js" }] } diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/mixed_style_and_class/pipe_bindings.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/mixed_style_and_class/pipe_bindings.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/mixed_style_and_class/pipe_bindings.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/mixed_style_and_class/pipe_bindings.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/TEST_CASES.json index 9a556531741c..943c53a6bf53 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/TEST_CASES.json @@ -10,7 +10,7 @@ { "files": [ { - "expected": "nested_template_context.pipeline.js", + "expected": "nested_template_context.js", "generated": "nested_template_context.js" } ], @@ -78,7 +78,7 @@ { "files": [ { - "expected": "ng_for_parent_context_variables.pipeline.js", + "expected": "ng_for_parent_context_variables.js", "generated": "ng_for_parent_context_variables.js" } ], diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/nested_template_context.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/nested_template_context.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/nested_template_context.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/nested_template_context.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/ng_for_parent_context_variables.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/ng_for_parent_context_variables.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/ng_for_parent_context_variables.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/ng_for_parent_context_variables.js diff --git a/packages/compiler-cli/test/compliance/test_cases/replace.sh b/packages/compiler-cli/test/compliance/test_cases/replace.sh deleted file mode 100755 index 686f3c76e568..000000000000 --- a/packages/compiler-cli/test/compliance/test_cases/replace.sh +++ /dev/null @@ -1,61 +0,0 @@ -#!/bin/bash - -# Step 1: Find all .pipeline.js files recursively -find . -type f -name "*.pipeline.js" | while read -r pipeline_file; do - base_dir=$(dirname "$pipeline_file") - base_name=$(basename "$pipeline_file" .pipeline.js) - - # Step 2: Attempt to delete the corresponding .js, .template.js, or _template.js file - js_file="${base_dir}/${base_name}.js" - template_js_file="${base_dir}/${base_name}.template.js" - underscore_template_js_file="${base_dir}/${base_name}_template.js" - - file_deleted=false - - if [ -f "$js_file" ]; then - rm "$js_file" && echo "Deleted file: $js_file" - file_deleted=true - fi - if [ -f "$template_js_file" ]; then - rm "$template_js_file" && echo "Deleted file: $template_js_file" - file_deleted=true - fi - if [ -f "$underscore_template_js_file" ]; then - rm "$underscore_template_js_file" && echo "Deleted file: $underscore_template_js_file" - file_deleted=true - fi - - if [ "$file_deleted" = false ]; then - echo "Error: Corresponding file for $pipeline_file not found." - fi - - # Step 3: Modify TEST_CASES.json if it exists in the same directory - test_cases_file="${base_dir}/TEST_CASES.json" - if [ -f "$test_cases_file" ]; then - # Patterns to match "expected" before the filename - js_pattern="expected.*$base_name\.js" - template_js_pattern="expected.*$base_name\.template\.js" - underscore_template_js_pattern="expected.*$base_name\_template\.js" - - # Use a more compatible sed in-place editing command - if grep -q -E "expected.*(js|template\.js|_template\.js)" "$test_cases_file"; then - # Determine if we are using GNU sed or BSD sed and adjust the command accordingly - if sed --version 2>/dev/null | grep -q GNU; then - # GNU sed - sed -i "/$js_pattern/d" "$test_cases_file" - sed -i "/$template_js_pattern/d" "$test_cases_file" - sed -i "/$underscore_template_js_pattern/d" "$test_cases_file" - else - # BSD sed - sed -i '' "/$js_pattern/d" "$test_cases_file" - sed -i '' "/$template_js_pattern/d" "$test_cases_file" - sed -i '' "/$underscore_template_js_pattern/d" "$test_cases_file" - fi - echo "Modified $test_cases_file to remove references to ${base_name}.js, ${base_name}.template.js, and/or ${base_name}_template.js with 'expected' preceding" - else - echo "Error: No line found in $test_cases_file for 'expected' preceding ${base_name}.js, ${base_name}.template.js, or ${base_name}_template.js" - fi - else - echo "Error: TEST_CASES.json not found in $base_dir" - fi -done diff --git a/packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/TEST_CASES.json index 8caed2dceaf8..37a0a2071b6b 100644 --- a/packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/TEST_CASES.json @@ -794,7 +794,7 @@ "files": [ { "generated": "i18n_message_interpolation_whitespace.js", - "expected": "i18n_message_interpolation_whitespace_template.pipeline.js" + "expected": "i18n_message_interpolation_whitespace_template.js" } ] } @@ -817,7 +817,7 @@ "files": [ { "generated": "i18n_message_interpolation_whitespace.js", - "expected": "i18n_message_interpolation_whitespace_partial_template.pipeline.js" + "expected": "i18n_message_interpolation_whitespace_partial_template.js" } ] } @@ -966,4 +966,4 @@ } } ] -} \ No newline at end of file +} diff --git a/packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/i18n_message_interpolation_whitespace_partial_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/i18n_message_interpolation_whitespace_partial_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/i18n_message_interpolation_whitespace_partial_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/i18n_message_interpolation_whitespace_partial_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/i18n_message_interpolation_whitespace_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/i18n_message_interpolation_whitespace_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/i18n_message_interpolation_whitespace_template.pipeline.js rename to packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/i18n_message_interpolation_whitespace_template.js From 5c9e84acd67e79d946fa23dd066f7756a5eb868d Mon Sep 17 00:00:00 2001 From: RafaelJCamara Date: Tue, 7 Jan 2025 17:01:43 +0100 Subject: [PATCH 0016/1220] docs: update license URL from angular.io to angular.dev and year of license to 2025 (#59407) PR Close #59407 --- adev/src/content/reference/license.md | 2 +- .../src/lib/devtools-tabs/router-tree/router-tree-visualizer.ts | 2 +- devtools/src/app/demo-app/todo/routes/routes.component.ts | 2 +- devtools/src/app/demo-app/todo/routes/routes.module.ts | 2 +- modules/ssr-benchmarks/run-benchmark.ts | 2 +- modules/ssr-benchmarks/src/app/app.component.ts | 2 +- modules/ssr-benchmarks/src/app/app.config.server.ts | 2 +- modules/ssr-benchmarks/src/app/app.config.ts | 2 +- modules/ssr-benchmarks/src/main.server.ts | 2 +- modules/ssr-benchmarks/src/main.ts | 2 +- modules/ssr-benchmarks/test-data.ts | 2 +- packages/core/rxjs-interop/src/pending_until_event.ts | 2 +- packages/core/rxjs-interop/test/pending_until_event_spec.ts | 2 +- packages/core/schematics/migrations/pending-tasks/index.ts | 2 +- packages/core/schematics/migrations/pending-tasks/migration.ts | 2 +- .../core/schematics/migrations/provide-initializer/utils.ts | 2 +- .../src/passes/problematic_patterns/incompatibility_todos.ts | 2 +- .../signal-queries-migration/fn_first_last_replacement.ts | 2 +- .../migrations/signal-queries-migration/fn_get_replacement.ts | 2 +- .../migrations/signal-queries-migration/fn_to_array_removal.ts | 2 +- .../migrations/signal-queries-migration/property_accesses.ts | 2 +- packages/core/schematics/test/pending_tasks_spec.ts | 2 +- packages/core/schematics/test/provide_initializer_spec.ts | 2 +- .../utils/tsurge/helpers/ast/insert_preceding_line.ts | 2 +- .../core/schematics/utils/tsurge/helpers/ast/leading_space.ts | 2 +- .../helpers/string_manipulation/cut_string_line_length.ts | 2 +- packages/core/src/defer/registry.ts | 2 +- packages/core/src/render3/features/external_styles_feature.ts | 2 +- packages/core/src/render3/reactivity/linked_signal.ts | 2 +- packages/core/test/signals/linked_signal_spec.ts | 2 +- packages/platform-server/test/hydration_utils.ts | 2 +- packages/platform-server/test/incremental_hydration_spec.ts | 2 +- packages/router/src/router_devtools.ts | 2 +- 33 files changed, 33 insertions(+), 33 deletions(-) diff --git a/adev/src/content/reference/license.md b/adev/src/content/reference/license.md index c37c9024852b..9fb02a48c528 100644 --- a/adev/src/content/reference/license.md +++ b/adev/src/content/reference/license.md @@ -1,6 +1,6 @@ # The MIT License -Copyright (c) 2010-2024 Google LLC. https://angular.dev/license +Copyright (c) 2010-2025 Google LLC. https://angular.dev/license Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/router-tree/router-tree-visualizer.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/router-tree/router-tree-visualizer.ts index f0a7e7da406b..b27bd73f5254 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/router-tree/router-tree-visualizer.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/router-tree/router-tree-visualizer.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import * as d3 from 'd3'; diff --git a/devtools/src/app/demo-app/todo/routes/routes.component.ts b/devtools/src/app/demo-app/todo/routes/routes.component.ts index 5bbf27f9506e..4474a89163ba 100644 --- a/devtools/src/app/demo-app/todo/routes/routes.component.ts +++ b/devtools/src/app/demo-app/todo/routes/routes.component.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {Component, Injectable} from '@angular/core'; diff --git a/devtools/src/app/demo-app/todo/routes/routes.module.ts b/devtools/src/app/demo-app/todo/routes/routes.module.ts index 8a223e4678f7..4253c95af7bc 100644 --- a/devtools/src/app/demo-app/todo/routes/routes.module.ts +++ b/devtools/src/app/demo-app/todo/routes/routes.module.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {CommonModule} from '@angular/common'; diff --git a/modules/ssr-benchmarks/run-benchmark.ts b/modules/ssr-benchmarks/run-benchmark.ts index 365c05beac55..102cec292215 100644 --- a/modules/ssr-benchmarks/run-benchmark.ts +++ b/modules/ssr-benchmarks/run-benchmark.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ /* tslint:disable:no-console */ diff --git a/modules/ssr-benchmarks/src/app/app.component.ts b/modules/ssr-benchmarks/src/app/app.component.ts index 543082cde329..ab4d151a3716 100644 --- a/modules/ssr-benchmarks/src/app/app.component.ts +++ b/modules/ssr-benchmarks/src/app/app.component.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {Component} from '@angular/core'; diff --git a/modules/ssr-benchmarks/src/app/app.config.server.ts b/modules/ssr-benchmarks/src/app/app.config.server.ts index af527d9da5f0..5fd016867059 100644 --- a/modules/ssr-benchmarks/src/app/app.config.server.ts +++ b/modules/ssr-benchmarks/src/app/app.config.server.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {mergeApplicationConfig, ApplicationConfig} from '@angular/core'; diff --git a/modules/ssr-benchmarks/src/app/app.config.ts b/modules/ssr-benchmarks/src/app/app.config.ts index 3f6c574850ed..58298b051145 100644 --- a/modules/ssr-benchmarks/src/app/app.config.ts +++ b/modules/ssr-benchmarks/src/app/app.config.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {ApplicationConfig, provideExperimentalZonelessChangeDetection} from '@angular/core'; diff --git a/modules/ssr-benchmarks/src/main.server.ts b/modules/ssr-benchmarks/src/main.server.ts index c14f2b60f45b..c2a6866f6c74 100644 --- a/modules/ssr-benchmarks/src/main.server.ts +++ b/modules/ssr-benchmarks/src/main.server.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {ɵenableProfiling} from '@angular/core'; diff --git a/modules/ssr-benchmarks/src/main.ts b/modules/ssr-benchmarks/src/main.ts index b337fc19dc4b..348737c14b36 100644 --- a/modules/ssr-benchmarks/src/main.ts +++ b/modules/ssr-benchmarks/src/main.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {bootstrapApplication} from '@angular/platform-browser'; diff --git a/modules/ssr-benchmarks/test-data.ts b/modules/ssr-benchmarks/test-data.ts index 57b5ae432b9d..003d374d63ce 100644 --- a/modules/ssr-benchmarks/test-data.ts +++ b/modules/ssr-benchmarks/test-data.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ let data: {name: string; id: string}[] = []; diff --git a/packages/core/rxjs-interop/src/pending_until_event.ts b/packages/core/rxjs-interop/src/pending_until_event.ts index 6b08625c0684..67c87ada41c6 100644 --- a/packages/core/rxjs-interop/src/pending_until_event.ts +++ b/packages/core/rxjs-interop/src/pending_until_event.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {assertInInjectionContext, PendingTasks, inject, Injector} from '@angular/core'; diff --git a/packages/core/rxjs-interop/test/pending_until_event_spec.ts b/packages/core/rxjs-interop/test/pending_until_event_spec.ts index 7fffbc306d64..23c3750ebdc8 100644 --- a/packages/core/rxjs-interop/test/pending_until_event_spec.ts +++ b/packages/core/rxjs-interop/test/pending_until_event_spec.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import { diff --git a/packages/core/schematics/migrations/pending-tasks/index.ts b/packages/core/schematics/migrations/pending-tasks/index.ts index 30fc65950ccf..525622a6fe76 100644 --- a/packages/core/schematics/migrations/pending-tasks/index.ts +++ b/packages/core/schematics/migrations/pending-tasks/index.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {Rule, SchematicsException, Tree, UpdateRecorder} from '@angular-devkit/schematics'; diff --git a/packages/core/schematics/migrations/pending-tasks/migration.ts b/packages/core/schematics/migrations/pending-tasks/migration.ts index 6191f906e11a..0e7d7dbcf9de 100644 --- a/packages/core/schematics/migrations/pending-tasks/migration.ts +++ b/packages/core/schematics/migrations/pending-tasks/migration.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import ts from 'typescript'; diff --git a/packages/core/schematics/migrations/provide-initializer/utils.ts b/packages/core/schematics/migrations/provide-initializer/utils.ts index 9dff9d6573d3..0c4f42624894 100644 --- a/packages/core/schematics/migrations/provide-initializer/utils.ts +++ b/packages/core/schematics/migrations/provide-initializer/utils.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import ts from 'typescript'; diff --git a/packages/core/schematics/migrations/signal-migration/src/passes/problematic_patterns/incompatibility_todos.ts b/packages/core/schematics/migrations/signal-migration/src/passes/problematic_patterns/incompatibility_todos.ts index db2796151db8..e42b4f638299 100644 --- a/packages/core/schematics/migrations/signal-migration/src/passes/problematic_patterns/incompatibility_todos.ts +++ b/packages/core/schematics/migrations/signal-migration/src/passes/problematic_patterns/incompatibility_todos.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {ProgramInfo, Replacement} from '../../../../../utils/tsurge'; diff --git a/packages/core/schematics/migrations/signal-queries-migration/fn_first_last_replacement.ts b/packages/core/schematics/migrations/signal-queries-migration/fn_first_last_replacement.ts index 720fc1b8ebd5..627717e6ebae 100644 --- a/packages/core/schematics/migrations/signal-queries-migration/fn_first_last_replacement.ts +++ b/packages/core/schematics/migrations/signal-queries-migration/fn_first_last_replacement.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {ProgramInfo, projectFile, Replacement, TextUpdate} from '../../utils/tsurge'; diff --git a/packages/core/schematics/migrations/signal-queries-migration/fn_get_replacement.ts b/packages/core/schematics/migrations/signal-queries-migration/fn_get_replacement.ts index 7741984b378b..23f8653d35f1 100644 --- a/packages/core/schematics/migrations/signal-queries-migration/fn_get_replacement.ts +++ b/packages/core/schematics/migrations/signal-queries-migration/fn_get_replacement.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {ProgramInfo, projectFile, Replacement, TextUpdate} from '../../utils/tsurge'; diff --git a/packages/core/schematics/migrations/signal-queries-migration/fn_to_array_removal.ts b/packages/core/schematics/migrations/signal-queries-migration/fn_to_array_removal.ts index 28aabb2b7468..d9d7de3457d4 100644 --- a/packages/core/schematics/migrations/signal-queries-migration/fn_to_array_removal.ts +++ b/packages/core/schematics/migrations/signal-queries-migration/fn_to_array_removal.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {ProgramInfo, projectFile, Replacement, TextUpdate} from '../../utils/tsurge'; diff --git a/packages/core/schematics/migrations/signal-queries-migration/property_accesses.ts b/packages/core/schematics/migrations/signal-queries-migration/property_accesses.ts index 8a70322c3df9..ecd92a1ebea1 100644 --- a/packages/core/schematics/migrations/signal-queries-migration/property_accesses.ts +++ b/packages/core/schematics/migrations/signal-queries-migration/property_accesses.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import ts from 'typescript'; diff --git a/packages/core/schematics/test/pending_tasks_spec.ts b/packages/core/schematics/test/pending_tasks_spec.ts index 981b4220818b..95a703d18c62 100644 --- a/packages/core/schematics/test/pending_tasks_spec.ts +++ b/packages/core/schematics/test/pending_tasks_spec.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {getSystemPath, normalize, virtualFs} from '@angular-devkit/core'; diff --git a/packages/core/schematics/test/provide_initializer_spec.ts b/packages/core/schematics/test/provide_initializer_spec.ts index 8598105a953f..f0481e09e360 100644 --- a/packages/core/schematics/test/provide_initializer_spec.ts +++ b/packages/core/schematics/test/provide_initializer_spec.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {getSystemPath, normalize, virtualFs} from '@angular-devkit/core'; diff --git a/packages/core/schematics/utils/tsurge/helpers/ast/insert_preceding_line.ts b/packages/core/schematics/utils/tsurge/helpers/ast/insert_preceding_line.ts index 2eb6f7ce5ec4..24b0a242c2b0 100644 --- a/packages/core/schematics/utils/tsurge/helpers/ast/insert_preceding_line.ts +++ b/packages/core/schematics/utils/tsurge/helpers/ast/insert_preceding_line.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import ts from 'typescript'; diff --git a/packages/core/schematics/utils/tsurge/helpers/ast/leading_space.ts b/packages/core/schematics/utils/tsurge/helpers/ast/leading_space.ts index 8230d7951ae8..e36dd194aac3 100644 --- a/packages/core/schematics/utils/tsurge/helpers/ast/leading_space.ts +++ b/packages/core/schematics/utils/tsurge/helpers/ast/leading_space.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import ts from 'typescript'; diff --git a/packages/core/schematics/utils/tsurge/helpers/string_manipulation/cut_string_line_length.ts b/packages/core/schematics/utils/tsurge/helpers/string_manipulation/cut_string_line_length.ts index f7bebdef2bf5..8251f1bf434b 100644 --- a/packages/core/schematics/utils/tsurge/helpers/string_manipulation/cut_string_line_length.ts +++ b/packages/core/schematics/utils/tsurge/helpers/string_manipulation/cut_string_line_length.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ /** diff --git a/packages/core/src/defer/registry.ts b/packages/core/src/defer/registry.ts index 7dca251dac35..122eb434ab5f 100644 --- a/packages/core/src/defer/registry.ts +++ b/packages/core/src/defer/registry.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {inject} from '../di'; import {InjectionToken} from '../di/injection_token'; diff --git a/packages/core/src/render3/features/external_styles_feature.ts b/packages/core/src/render3/features/external_styles_feature.ts index 0df3191e903a..b6759f5199f5 100644 --- a/packages/core/src/render3/features/external_styles_feature.ts +++ b/packages/core/src/render3/features/external_styles_feature.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {ComponentDef, ComponentDefFeature} from '../interfaces/definition'; diff --git a/packages/core/src/render3/reactivity/linked_signal.ts b/packages/core/src/render3/reactivity/linked_signal.ts index 781ff6815c58..0e3bf65a7eec 100644 --- a/packages/core/src/render3/reactivity/linked_signal.ts +++ b/packages/core/src/render3/reactivity/linked_signal.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {signalAsReadonlyFn, WritableSignal} from './signal'; diff --git a/packages/core/test/signals/linked_signal_spec.ts b/packages/core/test/signals/linked_signal_spec.ts index 89600005d44f..2f6c00a3b24b 100644 --- a/packages/core/test/signals/linked_signal_spec.ts +++ b/packages/core/test/signals/linked_signal_spec.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {isSignal, linkedSignal, signal, computed} from '@angular/core'; diff --git a/packages/platform-server/test/hydration_utils.ts b/packages/platform-server/test/hydration_utils.ts index 4baa77de1112..a7b91e6f08ed 100644 --- a/packages/platform-server/test/hydration_utils.ts +++ b/packages/platform-server/test/hydration_utils.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import { diff --git a/packages/platform-server/test/incremental_hydration_spec.ts b/packages/platform-server/test/incremental_hydration_spec.ts index 44e0c8b4665b..d6bdcd1a78fe 100644 --- a/packages/platform-server/test/incremental_hydration_spec.ts +++ b/packages/platform-server/test/incremental_hydration_spec.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import { diff --git a/packages/router/src/router_devtools.ts b/packages/router/src/router_devtools.ts index 2bba93c5be46..b2aba86d23e3 100644 --- a/packages/router/src/router_devtools.ts +++ b/packages/router/src/router_devtools.ts @@ -3,7 +3,7 @@ * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license + * found in the LICENSE file at https://angular.dev/license */ import {ɵpublishExternalGlobalUtil} from '@angular/core'; From d5645061640ca76a95cd683bf20a85a59ac10364 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Thu, 9 Jan 2025 13:38:56 +0100 Subject: [PATCH 0017/1220] docs: add doc page about unused imports schematic (#59449) Adds a docs for the new `ng generate @angular/core:cleanup-unused-imports` schematic. PR Close #59449 --- adev/src/app/sub-navigation-data.ts | 5 +++ .../migrations/cleanup-unused-imports.md | 38 +++++++++++++++++++ .../content/reference/migrations/overview.md | 3 ++ 3 files changed, 46 insertions(+) create mode 100644 adev/src/content/reference/migrations/cleanup-unused-imports.md diff --git a/adev/src/app/sub-navigation-data.ts b/adev/src/app/sub-navigation-data.ts index dcaa29f1f761..9cdd596611ff 100644 --- a/adev/src/app/sub-navigation-data.ts +++ b/adev/src/app/sub-navigation-data.ts @@ -1459,6 +1459,11 @@ const REFERENCE_SUB_NAVIGATION_DATA: NavigationItem[] = [ path: 'reference/migrations/signal-queries', contentPath: 'reference/migrations/signal-queries', }, + { + label: 'Clean up unused imports', + path: 'reference/migrations/cleanup-unused-imports', + contentPath: 'reference/migrations/cleanup-unused-imports', + }, ], }, ]; diff --git a/adev/src/content/reference/migrations/cleanup-unused-imports.md b/adev/src/content/reference/migrations/cleanup-unused-imports.md new file mode 100644 index 000000000000..3191acaf2a09 --- /dev/null +++ b/adev/src/content/reference/migrations/cleanup-unused-imports.md @@ -0,0 +1,38 @@ +# Clean up unused imports + +As of version 19, Angular reports when a component's `imports` array contains symbols that aren't used in its template. + +Running this schematic will clean up all unused imports within the project. + +Run the schematic using the following command: + + + +ng generate @angular/core:cleanup-unused-imports + + + +#### Before + + +import { Component } from '@angular/core'; +import { UnusedDirective } from './unused'; + +@Component({ + template: 'Hello', + imports: [UnusedDirective], +}) +export class MyComp {} + + +#### After + + +import { Component } from '@angular/core'; + +@Component({ + template: 'Hello', + imports: [], +}) +export class MyComp {} + diff --git a/adev/src/content/reference/migrations/overview.md b/adev/src/content/reference/migrations/overview.md index ac4e1a4f7d98..132beae45318 100644 --- a/adev/src/content/reference/migrations/overview.md +++ b/adev/src/content/reference/migrations/overview.md @@ -24,4 +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 a201d455e66a8c164237bf02784ec25962fe1932 Mon Sep 17 00:00:00 2001 From: zhangenming <282126346@qq.com> Date: Wed, 8 Jan 2025 10:03:40 +0800 Subject: [PATCH 0018/1220] docs(router): update link to development guide in README.md (#59388) PR Close #59388 --- packages/router/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/router/README.md b/packages/router/README.md index 442792533efd..68ad6fae9691 100644 --- a/packages/router/README.md +++ b/packages/router/README.md @@ -6,4 +6,4 @@ Managing state transitions is one of the hardest parts of building applications. The Angular router is designed to solve these problems. Using the router, you can declaratively specify application state, manage state transitions while taking care of the URL, and load components on demand. ## Guide -Read the dev guide [here](https://angular.io/guide/routing/common-router-tasks). +Read the dev guide [here](https://angular.dev/guide/routing). From 092557ef984cea52eafbd5bba79d38b35b54d309 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Thu, 9 Jan 2025 11:16:20 +0000 Subject: [PATCH 0019/1220] build: update dependency @bazel/buildifier to v8 (#59446) See associated pull request for more information. PR Close #59446 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 96e9f4ab60b6..b4038a331bff 100644 --- a/package.json +++ b/package.json @@ -164,7 +164,7 @@ "@angular/core": "^19.1.0-next", "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#d300539f8ebeadaa46e6cb8ed36e4748ac6d303a", "@bazel/bazelisk": "^1.7.5", - "@bazel/buildifier": "^7.0.0", + "@bazel/buildifier": "^8.0.0", "@bazel/ibazel": "^0.25.0", "@codemirror/autocomplete": "^6.11.1", "@codemirror/commands": "^6.3.2", diff --git a/yarn.lock b/yarn.lock index 62250d95cf61..bbf886ddcd75 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1369,10 +1369,10 @@ resolved "https://registry.yarnpkg.com/@bazel/buildifier/-/buildifier-6.3.3.tgz#ff21352ac9f72df6a53cc8ad9b862eb68918c1e9" integrity sha512-0f5eNWhylZQbiTddfVkIXKkugQadzZdonLw4ur58oK4X+gIHOZ42Xv94sepu8Di9UWKFXNc4zxuuTiWM22hGvw== -"@bazel/buildifier@^7.0.0": - version "7.3.1" - resolved "https://registry.yarnpkg.com/@bazel/buildifier/-/buildifier-7.3.1.tgz#ac988d719dd79589ec02db90c1b41ae5c88a0de6" - integrity sha512-qhSjryLo2uHeib/uLc8Yeh6SBisqdf9pPO79QPlyNO3Apc4g9J1Tir/52VdOo9czHTgSasbtOjfWJCPzMoCSIA== +"@bazel/buildifier@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@bazel/buildifier/-/buildifier-8.0.0.tgz#77a9f07d3dfad8b5f410513b8af371b63057cbb5" + integrity sha512-ur5DKaLK6vQjUUptxATC4TpsnBA2leqQDtqSF7qovbNuoCNzOfySJWMof1otT9ATW8ZsJfTFvNSYFRT8+LCVhw== "@bazel/concatjs@5.8.1": version "5.8.1" From a648fa14dd4610854cc0aa8f27286f19b1928b50 Mon Sep 17 00:00:00 2001 From: Ethan Cline Date: Wed, 8 Jan 2025 13:36:21 -0500 Subject: [PATCH 0020/1220] ci: Add self (Ethan Cline) as primitives-shared reviewer. (#59437) Add self (Ethan Cline) as primitives-shared reviewer. PR Close #59437 --- .pullapprove.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.pullapprove.yml b/.pullapprove.yml index 8357b0095e38..01b35ac42af3 100644 --- a/.pullapprove.yml +++ b/.pullapprove.yml @@ -516,6 +516,7 @@ groups: - iteriani # Thomas Nguyen - tbondwilkinson # Tom Wilkinson - rahatarmanahmed # Rahat Ahmed + - enaml # Ethan Cline labels: pending: 'requires: TGP' approved: 'requires: TGP' From a55575d4d6c4c0ea7ab5fe1a76dc05fff5919481 Mon Sep 17 00:00:00 2001 From: Sumit Arora Date: Sun, 29 Dec 2024 20:06:48 -0500 Subject: [PATCH 0021/1220] fix(devtools): fixing dark mode colors for devtools and router tree (#59329) added dark mode colors for devtools and router tree and fixed the router tree legend rerendering issue PR Close #59329 --- .../devtools-tabs.component.scss | 44 +++++++++---------- .../property-tab-header.component.scss | 6 +++ .../injector-providers.component.ts | 8 +++- .../injector-tree.component.scss | 32 +++++++------- .../profiler/profiler.component.scss | 6 +++ .../timeline/frame-selector.component.scss | 4 ++ .../execution-details.component.scss | 8 ++++ .../timeline-visualizer.component.scss | 4 ++ .../timeline/timeline-controls.component.scss | 3 ++ .../profiler/timeline/timeline.component.scss | 6 +++ .../router-tree/router-tree-visualizer.ts | 8 +++- .../router-tree/router-tree.component.scss | 7 +++ .../src/lib/devtools.component.scss | 3 ++ 13 files changed, 99 insertions(+), 40 deletions(-) diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/devtools-tabs.component.scss b/devtools/projects/ng-devtools/src/lib/devtools-tabs/devtools-tabs.component.scss index 88c57007802d..4a3bc09ea12c 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/devtools-tabs.component.scss +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/devtools-tabs.component.scss @@ -36,14 +36,6 @@ ng-injector-tree.hidden { } } -:host-context(.dark-theme) { - #nav-buttons { - button { - color: #fff; - } - } -} - .inspector-active { color: #1a73e8 !important; } @@ -90,20 +82,6 @@ mat-icon { font-weight: 400; } -:host-context(.dark-theme) { - #version-number { - color: #5caace; - - &.unsupported-version { - color: red; - } - } - - .inspector-active { - color: #4688f1 !important; - } -} - @media only screen and (max-width: 700px) { #app-angular-version { max-width: 135px; @@ -145,4 +123,26 @@ mat-icon { background-color: #464646; color: #fff; } + + #app-angular-version { + color: #fff; + } + + #nav-buttons { + button { + color: #fff; + } + } + + #version-number { + color: #5caace; + + &.unsupported-version { + color: red; + } + } + + .inspector-active { + color: #4688f1 !important; + } } diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-tab-header.component.scss b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-tab-header.component.scss index b4c4d74dba76..179e7a16acd6 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-tab-header.component.scss +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-tab-header.component.scss @@ -43,3 +43,9 @@ } } } + +:host-context(.dark-theme) { + .element-name { + color: #ffffff; + } +} diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers.component.ts index 02cae9ee2e0b..3653fc885cab 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers.component.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers.component.ts @@ -19,7 +19,7 @@ import {Events, MessageBus, SerializedInjector, SerializedProviderRecord} from ' @Component({ selector: 'ng-injector-providers', template: ` -

Providers for {{ injector()?.name }}

+

Providers for {{ injector()?.name }}

@if (injector()) {
@@ -140,6 +140,12 @@ import {Events, MessageBus, SerializedInjector, SerializedProviderRecord} from ' .example-element-description-attribution { opacity: 0.5; } + + :host-context(.dark-theme) { + .providers-title { + color: #ffffff; + } + } `, ], imports: [ diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-tree.component.scss b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-tree.component.scss index 076cea15666c..d70bcde0cb28 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-tree.component.scss +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-tree.component.scss @@ -133,12 +133,6 @@ as-split-area { } } -:host-context(.dark-theme) { - .deps { - background: #161515; - } -} - .deps { display: flex; overflow: auto; @@ -179,16 +173,6 @@ as-split-area { background: #f5f5f5; } -:host-context(.dark-theme) { - .providers-title { - background: #161515; - } - - .injector-graph { - background: #1a1a1a; - } -} - .injector-hierarchy { height: 100%; overflow: hidden; @@ -213,3 +197,19 @@ as-split-area { color: currentColor; text-decoration: none; } + +:host-context(.dark-theme) { + .injector-hierarchy { + h2 { + color: #ffffff; + } + } + + .deps { + background: #161515; + } + + .injector-graph { + background: #1a1a1a; + } +} diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/profiler.component.scss b/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/profiler.component.scss index a715f55a37c4..cc6ba20fbc0c 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/profiler.component.scss +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/profiler.component.scss @@ -36,6 +36,12 @@ } } +:host-context(.dark-theme) { + .instructions { + color: #ffffff; + } +} + #profiler-content-wrapper { margin: 0; height: calc(100% - 30px); diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/frame-selector.component.scss b/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/frame-selector.component.scss index c06e315cf01d..247e816de9a8 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/frame-selector.component.scss +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/frame-selector.component.scss @@ -73,6 +73,10 @@ border: 2px solid #073d69; } } + + .txt-frames { + color: #ffffff; + } } cdk-virtual-scroll-viewport { diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/recording-visualizer/execution-details.component.scss b/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/recording-visualizer/execution-details.component.scss index 39063ce10e06..4ccaa4a63644 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/recording-visualizer/execution-details.component.scss +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/recording-visualizer/execution-details.component.scss @@ -10,3 +10,11 @@ th, td { border-bottom: 1px solid #ddd; } + +:host-context(.dark-theme) { + .name, + .method, + .value { + color: #ffffff; + } +} diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/recording-visualizer/timeline-visualizer.component.scss b/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/recording-visualizer/timeline-visualizer.component.scss index 6a08a7a96f2d..90899b6c7db5 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/recording-visualizer/timeline-visualizer.component.scss +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/recording-visualizer/timeline-visualizer.component.scss @@ -65,4 +65,8 @@ ul { color: #5cadd3; } } + + .txt-total-time { + color: #ffffff; + } } diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/timeline-controls.component.scss b/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/timeline-controls.component.scss index 84ac48896eba..7b1f5512f728 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/timeline-controls.component.scss +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/timeline-controls.component.scss @@ -73,4 +73,7 @@ .warning-label { color: #ff625a; } + .details { + color: #ffffff; + } } diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/timeline.component.scss b/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/timeline.component.scss index fd509bd68b8a..00420b2ba507 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/timeline.component.scss +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/profiler/timeline/timeline.component.scss @@ -26,3 +26,9 @@ height: 100%; margin: 0 10px; } + +:host-context(.dark-theme) { + .info { + color: #ffffff; + } +} diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/router-tree/router-tree-visualizer.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/router-tree/router-tree-visualizer.ts index b27bd73f5254..6106cf7107eb 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/router-tree/router-tree-visualizer.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/router-tree/router-tree-visualizer.ts @@ -95,6 +95,10 @@ export class RouterTreeVisualizer { const size = 20; + svg.selectAll('text').remove(); + svg.selectAll('rect').remove(); + svg.selectAll('defs').remove(); + svg .append('rect') .attr('x', 10) @@ -126,8 +130,8 @@ export class RouterTreeVisualizer { .append('text') .attr('x', 37) .attr('y', 21) + .attr('class', 'legend-router-tree') .text('Eager loaded routes') - .style('font-size', '15px') .attr('alignment-baseline', 'middle'); @@ -135,6 +139,7 @@ export class RouterTreeVisualizer { .append('text') .attr('x', 37) .attr('y', 56) + .attr('class', 'legend-router-tree') .text('Lazy Loaded Route') .style('font-size', '15px') .attr('alignment-baseline', 'middle'); @@ -143,6 +148,7 @@ export class RouterTreeVisualizer { .append('text') .attr('x', 37) .attr('y', 92) + .attr('class', 'legend-router-tree') .text('Active Route') .style('font-size', '15px') .attr('alignment-baseline', 'middle'); diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/router-tree/router-tree.component.scss b/devtools/projects/ng-devtools/src/lib/devtools-tabs/router-tree/router-tree.component.scss index 40304c173660..5d7116205ee7 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/router-tree/router-tree.component.scss +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/router-tree/router-tree.component.scss @@ -25,3 +25,10 @@ .svg-container { max-height: inherit; } + +:host-context(.dark-theme) { + .filter-input { + border: 1px solid rgba(255, 255, 255, 0.12); + color: rgba(255, 255, 255, 0.87); + } +} diff --git a/devtools/projects/ng-devtools/src/lib/devtools.component.scss b/devtools/projects/ng-devtools/src/lib/devtools.component.scss index af20a9822e40..a9cd95ba88d0 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools.component.scss +++ b/devtools/projects/ng-devtools/src/lib/devtools.component.scss @@ -230,6 +230,9 @@ .node-label { color: #000; } + .legend-router-tree { + fill: #ffffff !important; + } } .ng-dev-mode-causes { From 06214821cab952e5a8cd6376e2c3b891f5d45678 Mon Sep 17 00:00:00 2001 From: arturovt Date: Tue, 7 Jan 2025 23:39:18 +0200 Subject: [PATCH 0022/1220] refactor(core): change `LContainerFlags` to `const enum` (#59416) Prior to this commit, the compiler produced: ```js No = (function (e) { return ( (e[(e.None = 0)] = "None"), (e[(e.HasTransplantedViews = 2)] = "HasTransplantedViews"), e ); })(No || {}); ``` Changing to `const enum` allows it to be entirely dropped and inline values. PR Close #59416 --- packages/core/src/render3/interfaces/container.ts | 2 +- .../bundling/animations-standalone/bundle.golden_symbols.json | 1 - .../core/test/bundling/animations/bundle.golden_symbols.json | 1 - .../core/test/bundling/cyclic_import/bundle.golden_symbols.json | 1 - packages/core/test/bundling/defer/bundle.golden_symbols.json | 1 - .../test/bundling/forms_reactive/bundle.golden_symbols.json | 1 - .../bundling/forms_template_driven/bundle.golden_symbols.json | 1 - .../core/test/bundling/hello_world/bundle.golden_symbols.json | 1 - .../core/test/bundling/hydration/bundle.golden_symbols.json | 1 - packages/core/test/bundling/router/bundle.golden_symbols.json | 2 -- .../bundling/standalone_bootstrap/bundle.golden_symbols.json | 1 - packages/core/test/bundling/todo/bundle.golden_symbols.json | 1 - packages/router/src/utils/navigations.ts | 2 +- 13 files changed, 2 insertions(+), 14 deletions(-) diff --git a/packages/core/src/render3/interfaces/container.ts b/packages/core/src/render3/interfaces/container.ts index e0fdd5e7ae2e..92bae6e40c54 100644 --- a/packages/core/src/render3/interfaces/container.ts +++ b/packages/core/src/render3/interfaces/container.ts @@ -118,7 +118,7 @@ export interface LContainer extends Array { } /** Flags associated with an LContainer (saved in LContainer[FLAGS]) */ -export enum LContainerFlags { +export const enum LContainerFlags { None = 0, /** * Flag to signify that this `LContainer` may have transplanted views which need to be change 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 52b62a1375f0..76e075c14d29 100644 --- a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json @@ -90,7 +90,6 @@ "Injector", "InputFlags", "KeyEventsPlugin", - "LContainerFlags", "LEAVE_TOKEN_REGEX", "LOCALE_ID2", "LifecycleHooksFeature", diff --git a/packages/core/test/bundling/animations/bundle.golden_symbols.json b/packages/core/test/bundling/animations/bundle.golden_symbols.json index 925b4041641f..93ed4b8e31d0 100644 --- a/packages/core/test/bundling/animations/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations/bundle.golden_symbols.json @@ -97,7 +97,6 @@ "Injector", "InputFlags", "KeyEventsPlugin", - "LContainerFlags", "LEAVE_TOKEN_REGEX", "LOCALE_ID2", "LifecycleHooksFeature", 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 803d0f22803a..85db2f696e7d 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -66,7 +66,6 @@ "Injector", "InputFlags", "KeyEventsPlugin", - "LContainerFlags", "LOCALE_ID2", "LifecycleHooksFeature", "MODIFIER_KEYS", diff --git a/packages/core/test/bundling/defer/bundle.golden_symbols.json b/packages/core/test/bundling/defer/bundle.golden_symbols.json index a73ac55a1284..70c6defa4127 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -85,7 +85,6 @@ "Injector", "InputFlags", "KeyEventsPlugin", - "LContainerFlags", "LOADING_AFTER_SLOT", "LOCALE_ID2", "LifecycleHooksFeature", 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 70d4f900d269..010c42a9a290 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -99,7 +99,6 @@ "IterableChangeRecord_", "IterableDiffers", "KeyEventsPlugin", - "LContainerFlags", "LOCALE_ID2", "LifecycleHooksFeature", "MODIFIER_KEYS", 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 7e8222b9ab3f..0a17d416bccb 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 @@ -92,7 +92,6 @@ "IterableChangeRecord_", "IterableDiffers", "KeyEventsPlugin", - "LContainerFlags", "LOCALE_ID2", "LifecycleHooksFeature", "MODIFIER_KEYS", 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 baa857939c79..611c535d1382 100644 --- a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json @@ -45,7 +45,6 @@ "InjectionToken", "Injector", "InputFlags", - "LContainerFlags", "LOCALE_ID2", "LifecycleHooksFeature", "NEW_LINE", diff --git a/packages/core/test/bundling/hydration/bundle.golden_symbols.json b/packages/core/test/bundling/hydration/bundle.golden_symbols.json index ca5dfab575e8..29727aeb828c 100644 --- a/packages/core/test/bundling/hydration/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hydration/bundle.golden_symbols.json @@ -73,7 +73,6 @@ "Injector", "InputFlags", "KeyEventsPlugin", - "LContainerFlags", "LOCALE_ID2", "LifecycleHooksFeature", "MODIFIER_KEYS", diff --git a/packages/core/test/bundling/router/bundle.golden_symbols.json b/packages/core/test/bundling/router/bundle.golden_symbols.json index 6bbc40ff7d2b..9aa97309c7b1 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -99,7 +99,6 @@ "InputFlags", "ItemComponent", "KeyEventsPlugin", - "LContainerFlags", "LOCALE_ID2", "LQueries_", "LQuery_", @@ -135,7 +134,6 @@ "NavigationCancellationCode", "NavigationEnd", "NavigationError", - "NavigationResult", "NavigationSkipped", "NavigationSkippedCode", "NavigationStart", 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 ffe656b028ec..19874c9a0f39 100644 --- a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json +++ b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json @@ -61,7 +61,6 @@ "Injector", "InputFlags", "KeyEventsPlugin", - "LContainerFlags", "LOCALE_ID2", "LifecycleHooksFeature", "MODIFIER_KEYS", diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index 144fe0e2025c..a1f81dbaa1b3 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -69,7 +69,6 @@ "IterableChangeRecord_", "IterableDiffers", "KeyEventsPlugin", - "LContainerFlags", "LOCALE_ID2", "LifecycleHooksFeature", "MODIFIER_KEYS", diff --git a/packages/router/src/utils/navigations.ts b/packages/router/src/utils/navigations.ts index b20f71ac3c97..2f96b5b35f87 100644 --- a/packages/router/src/utils/navigations.ts +++ b/packages/router/src/utils/navigations.ts @@ -18,7 +18,7 @@ import { NavigationSkipped, } from '../events'; -enum NavigationResult { +const enum NavigationResult { COMPLETE, FAILED, REDIRECTING, From 9abc79bb23cc9ad0b68dde60c87f9dc6c7a05c2c Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Thu, 9 Jan 2025 15:15:09 +0000 Subject: [PATCH 0023/1220] build: update cross-repo angular dependencies (#59249) See associated pull request for more information. PR Close #59249 --- .github/actions/deploy-docs-site/main.js | 193 +++- .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 | 24 +- yarn.lock | 935 ++++++------------ 16 files changed, 557 insertions(+), 713 deletions(-) diff --git a/.github/actions/deploy-docs-site/main.js b/.github/actions/deploy-docs-site/main.js index d9fd5a52cdf8..1faad35c65e9 100644 --- a/.github/actions/deploy-docs-site/main.js +++ b/.github/actions/deploy-docs-site/main.js @@ -10138,15 +10138,23 @@ if (hasFlag2("no-color") || hasFlag2("no-colors") || hasFlag2("color=false") || flagForceColor2 = 1; } function envForceColor2() { - if ("FORCE_COLOR" in env2) { - if (env2.FORCE_COLOR === "true") { - return 1; - } - if (env2.FORCE_COLOR === "false") { - return 0; - } - return env2.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env2.FORCE_COLOR, 10), 3); + if (!("FORCE_COLOR" in env2)) { + return; + } + if (env2.FORCE_COLOR === "true") { + return 1; + } + if (env2.FORCE_COLOR === "false") { + return 0; } + if (env2.FORCE_COLOR.length === 0) { + return 1; + } + const level = Math.min(Number.parseInt(env2.FORCE_COLOR, 10), 3); + if (![0, 1, 2, 3].includes(level)) { + return; + } + return level; } function translateLevel2(level) { if (level === 0) { @@ -10194,10 +10202,10 @@ function _supportsColor2(haveStream, { streamIsTTY, sniffFlags = true } = {}) { return 1; } if ("CI" in env2) { - if ("GITHUB_ACTIONS" in env2 || "GITEA_ACTIONS" in env2) { + if (["GITHUB_ACTIONS", "GITEA_ACTIONS", "CIRCLECI"].some((key) => key in env2)) { return 3; } - if (["TRAVIS", "CIRCLECI", "APPVEYOR", "GITLAB_CI", "BUILDKITE", "DRONE"].some((sign) => sign in env2) || env2.CI_NAME === "codeship") { + if (["TRAVIS", "APPVEYOR", "GITLAB_CI", "BUILDKITE", "DRONE"].some((sign) => sign in env2) || env2.CI_NAME === "codeship") { return 1; } return min; @@ -12620,7 +12628,7 @@ function paginateRest(octokit) { paginateRest.VERSION = VERSION8; // -var VERSION9 = "13.2.6"; +var VERSION9 = "13.3.0"; // var Endpoints = { @@ -12631,6 +12639,9 @@ var Endpoints = { addCustomLabelsToSelfHostedRunnerForRepo: [ "POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels" ], + addRepoAccessToSelfHostedRunnerGroupInOrg: [ + "PUT /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories/{repository_id}" + ], addSelectedRepoToOrgSecret: [ "PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}" ], @@ -13059,6 +13070,9 @@ var Endpoints = { getGithubActionsBillingUser: [ "GET /users/{username}/settings/billing/actions" ], + getGithubBillingUsageReportOrg: [ + "GET /organizations/{org}/settings/billing/usage" + ], getGithubPackagesBillingOrg: ["GET /orgs/{org}/settings/billing/packages"], getGithubPackagesBillingUser: [ "GET /users/{username}/settings/billing/packages" @@ -13095,9 +13109,21 @@ var Endpoints = { update: ["PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}"] }, codeScanning: { + commitAutofix: [ + "POST /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix/commits" + ], + createAutofix: [ + "POST /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix" + ], + createVariantAnalysis: [ + "POST /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses" + ], deleteAnalysis: [ "DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}{?confirm_delete}" ], + deleteCodeqlDatabase: [ + "DELETE /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}" + ], getAlert: [ "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}", {}, @@ -13106,11 +13132,20 @@ var Endpoints = { getAnalysis: [ "GET /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}" ], + getAutofix: [ + "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/autofix" + ], getCodeqlDatabase: [ "GET /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}" ], getDefaultSetup: ["GET /repos/{owner}/{repo}/code-scanning/default-setup"], getSarif: ["GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}"], + getVariantAnalysis: [ + "GET /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses/{codeql_variant_analysis_id}" + ], + getVariantAnalysisRepoTask: [ + "GET /repos/{owner}/{repo}/code-scanning/codeql/variant-analyses/{codeql_variant_analysis_id}/repos/{repo_owner}/{repo_name}" + ], listAlertInstances: [ "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances" ], @@ -13133,6 +13168,64 @@ var Endpoints = { ], uploadSarif: ["POST /repos/{owner}/{repo}/code-scanning/sarifs"] }, + codeSecurity: { + attachConfiguration: [ + "POST /orgs/{org}/code-security/configurations/{configuration_id}/attach" + ], + attachEnterpriseConfiguration: [ + "POST /enterprises/{enterprise}/code-security/configurations/{configuration_id}/attach" + ], + createConfiguration: ["POST /orgs/{org}/code-security/configurations"], + createConfigurationForEnterprise: [ + "POST /enterprises/{enterprise}/code-security/configurations" + ], + deleteConfiguration: [ + "DELETE /orgs/{org}/code-security/configurations/{configuration_id}" + ], + deleteConfigurationForEnterprise: [ + "DELETE /enterprises/{enterprise}/code-security/configurations/{configuration_id}" + ], + detachConfiguration: [ + "DELETE /orgs/{org}/code-security/configurations/detach" + ], + getConfiguration: [ + "GET /orgs/{org}/code-security/configurations/{configuration_id}" + ], + getConfigurationForRepository: [ + "GET /repos/{owner}/{repo}/code-security-configuration" + ], + getConfigurationsForEnterprise: [ + "GET /enterprises/{enterprise}/code-security/configurations" + ], + getConfigurationsForOrg: ["GET /orgs/{org}/code-security/configurations"], + getDefaultConfigurations: [ + "GET /orgs/{org}/code-security/configurations/defaults" + ], + getDefaultConfigurationsForEnterprise: [ + "GET /enterprises/{enterprise}/code-security/configurations/defaults" + ], + getRepositoriesForConfiguration: [ + "GET /orgs/{org}/code-security/configurations/{configuration_id}/repositories" + ], + getRepositoriesForEnterpriseConfiguration: [ + "GET /enterprises/{enterprise}/code-security/configurations/{configuration_id}/repositories" + ], + getSingleConfigurationForEnterprise: [ + "GET /enterprises/{enterprise}/code-security/configurations/{configuration_id}" + ], + setConfigurationAsDefault: [ + "PUT /orgs/{org}/code-security/configurations/{configuration_id}/defaults" + ], + setConfigurationAsDefaultForEnterprise: [ + "PUT /enterprises/{enterprise}/code-security/configurations/{configuration_id}/defaults" + ], + updateConfiguration: [ + "PATCH /orgs/{org}/code-security/configurations/{configuration_id}" + ], + updateEnterpriseConfiguration: [ + "PATCH /enterprises/{enterprise}/code-security/configurations/{configuration_id}" + ] + }, codesOfConduct: { getAllCodesOfConduct: ["GET /codes_of_conduct"], getConductCode: ["GET /codes_of_conduct/{key}"] @@ -13263,12 +13356,13 @@ var Endpoints = { cancelCopilotSeatAssignmentForUsers: [ "DELETE /orgs/{org}/copilot/billing/selected_users" ], + copilotMetricsForOrganization: ["GET /orgs/{org}/copilot/metrics"], + copilotMetricsForTeam: ["GET /orgs/{org}/team/{team_slug}/copilot/metrics"], getCopilotOrganizationDetails: ["GET /orgs/{org}/copilot/billing"], getCopilotSeatDetailsForUser: [ "GET /orgs/{org}/members/{username}/copilot" ], listCopilotSeats: ["GET /orgs/{org}/copilot/billing/seats"], - usageMetricsForEnterprise: ["GET /enterprises/{enterprise}/copilot/usage"], usageMetricsForOrg: ["GET /orgs/{org}/copilot/usage"], usageMetricsForTeam: ["GET /orgs/{org}/team/{team_slug}/copilot/usage"] }, @@ -13399,6 +13493,9 @@ var Endpoints = { "POST /repos/{owner}/{repo}/issues/{issue_number}/assignees" ], addLabels: ["POST /repos/{owner}/{repo}/issues/{issue_number}/labels"], + addSubIssue: [ + "POST /repos/{owner}/{repo}/issues/{issue_number}/sub_issues" + ], checkUserCanBeAssigned: ["GET /repos/{owner}/{repo}/assignees/{assignee}"], checkUserCanBeAssignedToIssue: [ "GET /repos/{owner}/{repo}/issues/{issue_number}/assignees/{assignee}" @@ -13441,6 +13538,9 @@ var Endpoints = { "GET /repos/{owner}/{repo}/issues/{issue_number}/labels" ], listMilestones: ["GET /repos/{owner}/{repo}/milestones"], + listSubIssues: [ + "GET /repos/{owner}/{repo}/issues/{issue_number}/sub_issues" + ], lock: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/lock"], removeAllLabels: [ "DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels" @@ -13451,6 +13551,12 @@ var Endpoints = { removeLabel: [ "DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}" ], + removeSubIssue: [ + "DELETE /repos/{owner}/{repo}/issues/{issue_number}/sub_issue" + ], + reprioritizeSubIssue: [ + "PATCH /repos/{owner}/{repo}/issues/{issue_number}/sub_issues/priority" + ], setLabels: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/labels"], unlock: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock"], update: ["PATCH /repos/{owner}/{repo}/issues/{issue_number}"], @@ -13524,7 +13630,11 @@ var Endpoints = { }, orgs: { addSecurityManagerTeam: [ - "PUT /orgs/{org}/security-managers/teams/{team_slug}" + "PUT /orgs/{org}/security-managers/teams/{team_slug}", + {}, + { + deprecated: "octokit.rest.orgs.addSecurityManagerTeam() is deprecated, see https://docs.github.com/rest/orgs/security-managers#add-a-security-manager-team" + } ], assignTeamToOrgRole: [ "PUT /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}" @@ -13540,7 +13650,6 @@ var Endpoints = { convertMemberToOutsideCollaborator: [ "PUT /orgs/{org}/outside_collaborators/{username}" ], - createCustomOrganizationRole: ["POST /orgs/{org}/organization-roles"], createInvitation: ["POST /orgs/{org}/invitations"], createOrUpdateCustomProperties: ["PATCH /orgs/{org}/properties/schema"], createOrUpdateCustomPropertiesValuesForRepos: [ @@ -13551,12 +13660,13 @@ var Endpoints = { ], createWebhook: ["POST /orgs/{org}/hooks"], delete: ["DELETE /orgs/{org}"], - deleteCustomOrganizationRole: [ - "DELETE /orgs/{org}/organization-roles/{role_id}" - ], deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"], enableOrDisableSecurityProductOnAllOrgRepos: [ - "POST /orgs/{org}/{security_product}/{enablement}" + "POST /orgs/{org}/{security_product}/{enablement}", + {}, + { + deprecated: "octokit.rest.orgs.enableOrDisableSecurityProductOnAllOrgRepos() is deprecated, see https://docs.github.com/rest/orgs/orgs#enable-or-disable-a-security-feature-for-an-organization" + } ], get: ["GET /orgs/{org}"], getAllCustomProperties: ["GET /orgs/{org}/properties/schema"], @@ -13573,6 +13683,7 @@ var Endpoints = { ], list: ["GET /organizations"], listAppInstallations: ["GET /orgs/{org}/installations"], + listAttestations: ["GET /orgs/{org}/attestations/{subject_digest}"], listBlockedUsers: ["GET /orgs/{org}/blocks"], listCustomPropertiesValuesForRepos: ["GET /orgs/{org}/properties/values"], listFailedInvitations: ["GET /orgs/{org}/failed_invitations"], @@ -13598,12 +13709,15 @@ var Endpoints = { listPatGrants: ["GET /orgs/{org}/personal-access-tokens"], listPendingInvitations: ["GET /orgs/{org}/invitations"], listPublicMembers: ["GET /orgs/{org}/public_members"], - listSecurityManagerTeams: ["GET /orgs/{org}/security-managers"], + listSecurityManagerTeams: [ + "GET /orgs/{org}/security-managers", + {}, + { + deprecated: "octokit.rest.orgs.listSecurityManagerTeams() is deprecated, see https://docs.github.com/rest/orgs/security-managers#list-security-manager-teams" + } + ], listWebhookDeliveries: ["GET /orgs/{org}/hooks/{hook_id}/deliveries"], listWebhooks: ["GET /orgs/{org}/hooks"], - patchCustomOrganizationRole: [ - "PATCH /orgs/{org}/organization-roles/{role_id}" - ], pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"], redeliverWebhookDelivery: [ "POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts" @@ -13620,7 +13734,11 @@ var Endpoints = { "DELETE /orgs/{org}/public_members/{username}" ], removeSecurityManagerTeam: [ - "DELETE /orgs/{org}/security-managers/teams/{team_slug}" + "DELETE /orgs/{org}/security-managers/teams/{team_slug}", + {}, + { + deprecated: "octokit.rest.orgs.removeSecurityManagerTeam() is deprecated, see https://docs.github.com/rest/orgs/security-managers#remove-a-security-manager-team" + } ], reviewPatGrantRequest: [ "POST /orgs/{org}/personal-access-token-requests/{pat_request_id}" @@ -13746,6 +13864,18 @@ var Endpoints = { "POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore" ] }, + privateRegistries: { + createOrgPrivateRegistry: ["POST /orgs/{org}/private-registries"], + deleteOrgPrivateRegistry: [ + "DELETE /orgs/{org}/private-registries/{secret_name}" + ], + getOrgPrivateRegistry: ["GET /orgs/{org}/private-registries/{secret_name}"], + getOrgPublicKey: ["GET /orgs/{org}/private-registries/public-key"], + listOrgPrivateRegistries: ["GET /orgs/{org}/private-registries"], + updateOrgPrivateRegistry: [ + "PATCH /orgs/{org}/private-registries/{secret_name}" + ] + }, projects: { addCollaborator: ["PUT /projects/{project_id}/collaborators/{username}"], createCard: ["POST /projects/columns/{column_id}/cards"], @@ -13948,6 +14078,7 @@ var Endpoints = { compareCommitsWithBasehead: [ "GET /repos/{owner}/{repo}/compare/{basehead}" ], + createAttestation: ["POST /repos/{owner}/{repo}/attestations"], createAutolink: ["POST /repos/{owner}/{repo}/autolinks"], createCommitComment: [ "POST /repos/{owner}/{repo}/commits/{commit_sha}/comments" @@ -13983,7 +14114,6 @@ var Endpoints = { createPagesSite: ["POST /repos/{owner}/{repo}/pages"], createRelease: ["POST /repos/{owner}/{repo}/releases"], createRepoRuleset: ["POST /repos/{owner}/{repo}/rulesets"], - createTagProtection: ["POST /repos/{owner}/{repo}/tags/protection"], createUsingTemplate: [ "POST /repos/{template_owner}/{template_repo}/generate" ], @@ -14035,9 +14165,6 @@ var Endpoints = { "DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}" ], deleteRepoRuleset: ["DELETE /repos/{owner}/{repo}/rulesets/{ruleset_id}"], - deleteTagProtection: [ - "DELETE /repos/{owner}/{repo}/tags/protection/{tag_protection_id}" - ], deleteWebhook: ["DELETE /repos/{owner}/{repo}/hooks/{hook_id}"], disableAutomatedSecurityFixes: [ "DELETE /repos/{owner}/{repo}/automated-security-fixes" @@ -14172,6 +14299,9 @@ var Endpoints = { "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}" ], listActivities: ["GET /repos/{owner}/{repo}/activity"], + listAttestations: [ + "GET /repos/{owner}/{repo}/attestations/{subject_digest}" + ], listAutolinks: ["GET /repos/{owner}/{repo}/autolinks"], listBranches: ["GET /repos/{owner}/{repo}/branches"], listBranchesForHeadCommit: [ @@ -14214,7 +14344,6 @@ var Endpoints = { "GET /repos/{owner}/{repo}/releases/{release_id}/assets" ], listReleases: ["GET /repos/{owner}/{repo}/releases"], - listTagProtection: ["GET /repos/{owner}/{repo}/tags/protection"], listTags: ["GET /repos/{owner}/{repo}/tags"], listTeams: ["GET /repos/{owner}/{repo}/teams"], listWebhookDeliveries: [ @@ -14329,9 +14458,13 @@ var Endpoints = { users: ["GET /search/users"] }, secretScanning: { + createPushProtectionBypass: [ + "POST /repos/{owner}/{repo}/secret-scanning/push-protection-bypasses" + ], getAlert: [ "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}" ], + getScanHistory: ["GET /repos/{owner}/{repo}/secret-scanning/scan-history"], listAlertsForEnterprise: [ "GET /enterprises/{enterprise}/secret-scanning/alerts" ], @@ -14485,6 +14618,7 @@ var Endpoints = { ], follow: ["PUT /user/following/{username}"], getAuthenticated: ["GET /user"], + getById: ["GET /user/{account_id}"], getByUsername: ["GET /users/{username}"], getContextForUser: ["GET /users/{username}/hovercard"], getGpgKeyForAuthenticated: [ @@ -14503,6 +14637,7 @@ var Endpoints = { "GET /user/ssh_signing_keys/{ssh_signing_key_id}" ], list: ["GET /users"], + listAttestations: ["GET /users/{username}/attestations/{subject_digest}"], listBlockedByAuthenticated: [ "GET /user/blocks", {}, @@ -14703,7 +14838,7 @@ function legacyRestEndpointMethods(octokit) { legacyRestEndpointMethods.VERSION = VERSION9; // -var VERSION10 = "21.0.2"; +var VERSION10 = "21.1.0"; // var Octokit2 = Octokit.plugin(requestLog, legacyRestEndpointMethods, paginateRest).defaults( diff --git a/.github/actions/saucelabs-legacy/action.yml b/.github/actions/saucelabs-legacy/action.yml index 27557b38bf2a..360f465e5f18 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/setup@5b4b2a6258dece411626435f680d2818769f469a - name: Setup Saucelabs Variables - uses: angular/dev-infra/github-actions/saucelabs@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/saucelabs@5b4b2a6258dece411626435f680d2818769f469a - 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 4ed5325b68cb..eca301689788 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@5b4b2a6258dece411626435f680d2818769f469a - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/setup@5b4b2a6258dece411626435f680d2818769f469a - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/configure-remote@5b4b2a6258dece411626435f680d2818769f469a - 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + - uses: angular/dev-infra/github-actions/previews/pack-and-upload-artifact@5b4b2a6258dece411626435f680d2818769f469a 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 901b371aee1a..e5d96ce2f2f3 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + - uses: angular/dev-infra/github-actions/previews/upload-artifacts-to-firebase@5b4b2a6258dece411626435f680d2818769f469a 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 faad5f28e26a..9178d4101d1f 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + - uses: angular/dev-infra/github-actions/branch-manager@5b4b2a6258dece411626435f680d2818769f469a with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/benchmark-compare.yml b/.github/workflows/benchmark-compare.yml index 3b8f5b84b83c..613d304a7a6e 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + - uses: angular/dev-infra/github-actions/bazel/configure-remote@5b4b2a6258dece411626435f680d2818769f469a with: bazelrc: ./.bazelrc.user diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6380f97b9513..9f08219858f8 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@5b4b2a6258dece411626435f680d2818769f469a 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@5b4b2a6258dece411626435f680d2818769f469a with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/setup@5b4b2a6258dece411626435f680d2818769f469a - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/configure-remote@5b4b2a6258dece411626435f680d2818769f469a - 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@5b4b2a6258dece411626435f680d2818769f469a with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/setup@5b4b2a6258dece411626435f680d2818769f469a - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/configure-remote@5b4b2a6258dece411626435f680d2818769f469a - 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@5b4b2a6258dece411626435f680d2818769f469a - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/setup@5b4b2a6258dece411626435f680d2818769f469a - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/configure-remote@5b4b2a6258dece411626435f680d2818769f469a - 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@5b4b2a6258dece411626435f680d2818769f469a with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/setup@5b4b2a6258dece411626435f680d2818769f469a - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/configure-remote@5b4b2a6258dece411626435f680d2818769f469a - 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@5b4b2a6258dece411626435f680d2818769f469a 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/setup@5b4b2a6258dece411626435f680d2818769f469a - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/configure-remote@5b4b2a6258dece411626435f680d2818769f469a - 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@5b4b2a6258dece411626435f680d2818769f469a 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@5b4b2a6258dece411626435f680d2818769f469a - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/setup@5b4b2a6258dece411626435f680d2818769f469a - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/configure-remote@5b4b2a6258dece411626435f680d2818769f469a - 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 dec5276091ec..3dac4b9d0c59 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + - uses: angular/dev-infra/github-actions/commit-message-based-labels@5b4b2a6258dece411626435f680d2818769f469a 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + - uses: angular/dev-infra/github-actions/post-approval-changes@5b4b2a6258dece411626435f680d2818769f469a 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 c06d486970ec..4021688193fc 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + - uses: angular/dev-infra/github-actions/google-internal-tests@5b4b2a6258dece411626435f680d2818769f469a 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 062bd915a3f2..f82b80981cd1 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@5b4b2a6258dece411626435f680d2818769f469a 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/setup@5b4b2a6258dece411626435f680d2818769f469a - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/configure-remote@5b4b2a6258dece411626435f680d2818769f469a - name: Setup Saucelabs Variables - uses: angular/dev-infra/github-actions/saucelabs@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/saucelabs@5b4b2a6258dece411626435f680d2818769f469a - 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 84e1f4b2c975..47e8acb04bbb 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + - uses: angular/dev-infra/github-actions/unified-status-check@5b4b2a6258dece411626435f680d2818769f469a with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/perf.yml b/.github/workflows/perf.yml index 5c462853df65..8448a58c15ef 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@5b4b2a6258dece411626435f680d2818769f469a - 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@5b4b2a6258dece411626435f680d2818769f469a - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/setup@5b4b2a6258dece411626435f680d2818769f469a - 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 e524cb9f57aa..4765eafe4e2e 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@5b4b2a6258dece411626435f680d2818769f469a 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/linting/licenses@5b4b2a6258dece411626435f680d2818769f469a 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@5b4b2a6258dece411626435f680d2818769f469a with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/setup@5b4b2a6258dece411626435f680d2818769f469a - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/configure-remote@5b4b2a6258dece411626435f680d2818769f469a - 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@5b4b2a6258dece411626435f680d2818769f469a with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/setup@5b4b2a6258dece411626435f680d2818769f469a - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/configure-remote@5b4b2a6258dece411626435f680d2818769f469a - 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@5b4b2a6258dece411626435f680d2818769f469a with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/setup@5b4b2a6258dece411626435f680d2818769f469a - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/configure-remote@5b4b2a6258dece411626435f680d2818769f469a - 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@5b4b2a6258dece411626435f680d2818769f469a - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/setup@5b4b2a6258dece411626435f680d2818769f469a - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/configure-remote@5b4b2a6258dece411626435f680d2818769f469a - 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@5b4b2a6258dece411626435f680d2818769f469a 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/setup@5b4b2a6258dece411626435f680d2818769f469a - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/bazel/configure-remote@5b4b2a6258dece411626435f680d2818769f469a - 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@5b4b2a6258dece411626435f680d2818769f469a 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 ab56712d9854..a26c3dc4875e 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@289aa644e65a557bcb21adcf75ad60605a9c9859 + uses: angular/dev-infra/github-actions/create-pr-for-changes@5b4b2a6258dece411626435f680d2818769f469a 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 b4038a331bff..23a5a253b5af 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.1.0-next.2", - "@angular-devkit/core": "19.1.0-next.2", - "@angular-devkit/schematics": "19.1.0-next.2", - "@angular/build": "19.1.0-next.2", - "@angular/cdk": "19.1.0-next.3", - "@angular/cli": "19.1.0-next.2", - "@angular/material": "19.1.0-next.3", - "@angular/ssr": "19.1.0-next.2", + "@angular-devkit/build-angular": "19.1.0-rc.0", + "@angular-devkit/core": "19.1.0-rc.0", + "@angular-devkit/schematics": "19.1.0-rc.0", + "@angular/build": "19.1.0-rc.0", + "@angular/cdk": "19.1.0-rc.0", + "@angular/cli": "19.1.0-rc.0", + "@angular/material": "19.1.0-rc.0", + "@angular/ssr": "19.1.0-rc.0", "@babel/cli": "7.26.4", "@babel/core": "7.26.0", "@babel/generator": "7.26.3", @@ -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.1.0-next.2", + "@schematics/angular": "19.1.0-rc.0", "@stackblitz/sdk": "^1.11.0", "@types/angular": "^1.6.47", "@types/babel__core": "7.20.5", @@ -158,11 +158,11 @@ "devDependencies": { "@actions/core": "^1.10.0", "@actions/github": "^6.0.0", - "@angular-devkit/architect-cli": "0.1901.0-next.2", + "@angular-devkit/architect-cli": "0.1901.0-rc.0", "@angular/animations": "^19.1.0-next", - "@angular/build-tooling": "https://github.com/angular/dev-infra-private-build-tooling-builds.git#0850ed7e3d784457d3ecac29d48a3241c6eb7da0", + "@angular/build-tooling": "https://github.com/angular/dev-infra-private-build-tooling-builds.git#4b0419ce0fea35aa1ad3e92a882f93ba41199ace", "@angular/core": "^19.1.0-next", - "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#d300539f8ebeadaa46e6cb8ed36e4748ac6d303a", + "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#5d1a3e42cd27a30b988a5d0e40fca332c7a10aa0", "@bazel/bazelisk": "^1.7.5", "@bazel/buildifier": "^8.0.0", "@bazel/ibazel": "^0.25.0", diff --git a/yarn.lock b/yarn.lock index bbf886ddcd75..fe765f9bda81 100644 --- a/yarn.lock +++ b/yarn.lock @@ -164,44 +164,36 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" -"@angular-devkit/architect-cli@0.1901.0-next.2": - version "0.1901.0-next.2" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect-cli/-/architect-cli-0.1901.0-next.2.tgz#ef4631d284cf1ad37560316e2714968fd7b76703" - integrity sha512-Stp/m4nj9WBHgjrdN4H7woxBA6WzNweLOmCalQy/5eTU/ZyppodPsJIBTYhxv9PECvsW+6VlPMJbzycUMS592g== +"@angular-devkit/architect-cli@0.1901.0-rc.0": + version "0.1901.0-rc.0" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect-cli/-/architect-cli-0.1901.0-rc.0.tgz#5b9aace13ec4ba492377f6687236ede74b9462af" + integrity sha512-yd8cwQN5bPZdiRZnLWfobPmWfkaO4eWz3foIXbSEcEUOAPRGYwOkrXMb8qNf2O9iXYE8JdXmVWh5S+5CmyYbrA== dependencies: - "@angular-devkit/architect" "0.1901.0-next.2" - "@angular-devkit/core" "19.1.0-next.2" + "@angular-devkit/architect" "0.1901.0-rc.0" + "@angular-devkit/core" "19.1.0-rc.0" ansi-colors "4.1.3" progress "2.0.3" symbol-observable "4.0.0" yargs-parser "21.1.1" -"@angular-devkit/architect@0.1901.0-next.1": - version "0.1901.0-next.1" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1901.0-next.1.tgz#e2f10e4eb750a3cae149f25c791ea46d12a3a72f" - integrity sha512-bZS5UlLsdL5eF3JqMaheYdIBVYrEIoDs6Q5UN50cJe5gKcakDvn8ky/Dhmv8kxfq5efb9zUevTC5xqnu+cgcmg== +"@angular-devkit/architect@0.1901.0-rc.0": + version "0.1901.0-rc.0" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1901.0-rc.0.tgz#0f3c39529b2639910ae0cf084d43187bffffef8e" + integrity sha512-BDZV/o1afvbUu8dqr77jjTovcC03DfQB/LGoSN6BkW2vu0jwFCHPXdc/D588p0Bw8cdlMJghkyQhqZ7SHPRivg== dependencies: - "@angular-devkit/core" "19.1.0-next.1" + "@angular-devkit/core" "19.1.0-rc.0" rxjs "7.8.1" -"@angular-devkit/architect@0.1901.0-next.2": - version "0.1901.0-next.2" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1901.0-next.2.tgz#eaa8be9d313b0052a28ed8a65ac06ae7b643ae90" - integrity sha512-LJH2kZ6zGgWqCg4l42n/x+1jxUtcgJFrhBR11jXtkQperDvxRmhWpCEbjx0e9frGJbDe3vBlPdPy2PMYimwAvQ== - dependencies: - "@angular-devkit/core" "19.1.0-next.2" - rxjs "7.8.1" - -"@angular-devkit/build-angular@19.1.0-next.2": - version "19.1.0-next.2" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-19.1.0-next.2.tgz#2797d13d98a523ce4b211c8d409c89bfccde2c48" - integrity sha512-a5pR6lly9nKnHQ5+NVA6wLHPDW3ziZF0HdOg9VquahssqJoiMc7CrMu0oG3kgb88VYdNJoiHv+EiIQ+7jFbE4g== +"@angular-devkit/build-angular@19.1.0-rc.0": + version "19.1.0-rc.0" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-19.1.0-rc.0.tgz#f47f4e7aa08b1d23fd4345eda7837c48f1f6c412" + integrity sha512-hVuVwGASabKYOFZVnBxCzt+1eqw9bEtNA/N3XZMTkVz0kU12Okw7V78+fmlxODD3T//DuBF39w/UjwpsSAq7ag== dependencies: "@ampproject/remapping" "2.3.0" - "@angular-devkit/architect" "0.1901.0-next.2" - "@angular-devkit/build-webpack" "0.1901.0-next.2" - "@angular-devkit/core" "19.1.0-next.2" - "@angular/build" "19.1.0-next.2" + "@angular-devkit/architect" "0.1901.0-rc.0" + "@angular-devkit/build-webpack" "0.1901.0-rc.0" + "@angular-devkit/core" "19.1.0-rc.0" + "@angular/build" "19.1.0-rc.0" "@babel/core" "7.26.0" "@babel/generator" "7.26.3" "@babel/helper-annotate-as-pure" "7.25.9" @@ -212,7 +204,7 @@ "@babel/preset-env" "7.26.0" "@babel/runtime" "7.26.0" "@discoveryjs/json-ext" "0.6.3" - "@ngtools/webpack" "19.1.0-next.2" + "@ngtools/webpack" "19.1.0-rc.0" "@vitejs/plugin-basic-ssl" "1.2.0" ansi-colors "4.1.3" autoprefixer "10.4.20" @@ -220,8 +212,8 @@ browserslist "^4.21.5" copy-webpack-plugin "12.0.2" css-loader "7.1.2" - esbuild-wasm "0.24.0" - fast-glob "3.3.2" + esbuild-wasm "0.24.2" + fast-glob "3.3.3" http-proxy-middleware "3.0.3" istanbul-lib-instrument "6.0.3" jsonc-parser "3.3.1" @@ -239,7 +231,7 @@ postcss-loader "8.1.1" resolve-url-loader "5.0.0" rxjs "7.8.1" - sass "1.83.0" + sass "1.83.1" sass-loader "16.0.4" semver "7.6.3" source-map-loader "5.0.0" @@ -253,7 +245,7 @@ webpack-merge "6.0.1" webpack-subresource-integrity "5.1.0" optionalDependencies: - esbuild "0.24.0" + esbuild "0.24.2" "@angular-devkit/build-optimizer@0.14.0-beta.5": version "0.14.0-beta.5" @@ -265,30 +257,18 @@ typescript "3.2.4" webpack-sources "1.3.0" -"@angular-devkit/build-webpack@0.1901.0-next.2": - version "0.1901.0-next.2" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1901.0-next.2.tgz#7d6192741ab3de31cd8e2ea6128e23a9a4f520c4" - integrity sha512-i+Q0PaWXec9hKpDgh4k2/ds6Z2GbQj7UfZozaJN1Sen19BGyq4Dl0ADiIr1tgZc6y1Ym09AgCFT0gpI3v4grjg== +"@angular-devkit/build-webpack@0.1901.0-rc.0": + version "0.1901.0-rc.0" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1901.0-rc.0.tgz#44b734e3224703649833ced10a4094cc5b7a61c3" + integrity sha512-1rxJ2oNqjeWF7rXkElGWtWeR6F4C+uF1HU1b65OI9pYNjzUp5Wh7+z1V/l3gfexohkv7W+7KyQkAFzFjwoJMpw== dependencies: - "@angular-devkit/architect" "0.1901.0-next.2" - rxjs "7.8.1" - -"@angular-devkit/core@19.1.0-next.1": - version "19.1.0-next.1" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-19.1.0-next.1.tgz#8f46c3e25cc811945880bb5ebb42b1c885c91ac9" - integrity sha512-2xzT/jBSKuDO2avbB00qiuM4Moir9RcLtK++oyJm/CVQ8tUFppVvpb2MIp0TB/FuV+Tfm8APf0etY0w/fWfWZA== - dependencies: - ajv "8.17.1" - ajv-formats "3.0.1" - jsonc-parser "3.3.1" - picomatch "4.0.2" + "@angular-devkit/architect" "0.1901.0-rc.0" rxjs "7.8.1" - source-map "0.7.4" -"@angular-devkit/core@19.1.0-next.2": - version "19.1.0-next.2" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-19.1.0-next.2.tgz#2e302f300ec3257e15305382829d9c72deee4256" - integrity sha512-e02oakLxYszcpltPhZDuQ2AKGWXblJLU2Ua7xD57BtjQtZt5c10bvePOvU4M5KnD5KqZUzjYQZtC6nqKOVvkMA== +"@angular-devkit/core@19.1.0-rc.0": + version "19.1.0-rc.0" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-19.1.0-rc.0.tgz#b71c99234200e85d0a74ba526fceb9e465fb50bf" + integrity sha512-0kGErE+1jgEU2a6Q2JCg0XHeI+3PW48ZkINWMgD249TyRO7vC/VChSBMTi3CxuEatxp+1t9MQgMehZSuN4JL9w== dependencies: ajv "8.17.1" ajv-formats "3.0.1" @@ -297,14 +277,14 @@ rxjs "7.8.1" source-map "0.7.4" -"@angular-devkit/schematics@19.1.0-next.2": - version "19.1.0-next.2" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-19.1.0-next.2.tgz#23025b85f760cfdf124ef8abf992c4d24e473af5" - integrity sha512-He6LD1PYLUWldYZrMZ7N5Z86KujGKFtzUC/wh93L2HnMnMRSARm8AAhZHekntG6BNq/0SOVFVL0g3C05aQjBOg== +"@angular-devkit/schematics@19.1.0-rc.0": + version "19.1.0-rc.0" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-19.1.0-rc.0.tgz#ec47363d7dc98c7d468ed5991fe6b119651cd4fb" + integrity sha512-SfgiXmRsfqH+zn6vkO1Oi4PpzQ9QA6G/ACV65+fgm3YeAaiD2v2h6UXOF/CVC2yjRfzD5ychEIcsY2YPAsvJIA== dependencies: - "@angular-devkit/core" "19.1.0-next.2" + "@angular-devkit/core" "19.1.0-rc.0" jsonc-parser "3.3.1" - magic-string "0.30.15" + magic-string "0.30.17" ora "5.4.1" rxjs "7.8.1" @@ -323,13 +303,13 @@ "@angular/core" "^13.0.0 || ^14.0.0-0" reflect-metadata "^0.1.13" -"@angular/build-tooling@https://github.com/angular/dev-infra-private-build-tooling-builds.git#0850ed7e3d784457d3ecac29d48a3241c6eb7da0": - version "0.0.0-289aa644e65a557bcb21adcf75ad60605a9c9859" - uid "0850ed7e3d784457d3ecac29d48a3241c6eb7da0" - resolved "https://github.com/angular/dev-infra-private-build-tooling-builds.git#0850ed7e3d784457d3ecac29d48a3241c6eb7da0" +"@angular/build-tooling@https://github.com/angular/dev-infra-private-build-tooling-builds.git#4b0419ce0fea35aa1ad3e92a882f93ba41199ace": + version "0.0.0-5b4b2a6258dece411626435f680d2818769f469a" + uid "4b0419ce0fea35aa1ad3e92a882f93ba41199ace" + resolved "https://github.com/angular/dev-infra-private-build-tooling-builds.git#4b0419ce0fea35aa1ad3e92a882f93ba41199ace" dependencies: "@angular/benchpress" "0.3.0" - "@angular/build" "19.1.0-next.1" + "@angular/build" "19.1.0-rc.0" "@babel/core" "^7.16.0" "@babel/plugin-proposal-async-generator-functions" "^7.20.1" "@bazel/buildifier" "6.3.3" @@ -339,7 +319,7 @@ "@bazel/runfiles" "5.8.1" "@bazel/terser" "5.8.1" "@bazel/typescript" "5.8.1" - "@microsoft/api-extractor" "7.48.0" + "@microsoft/api-extractor" "7.49.0" "@types/browser-sync" "^2.26.3" "@types/minimatch" "^5.1.2" "@types/node" "^18.19.21" @@ -361,92 +341,59 @@ uuid "^11.0.0" yargs "^17.0.0" -"@angular/build@19.1.0-next.1": - version "19.1.0-next.1" - resolved "https://registry.yarnpkg.com/@angular/build/-/build-19.1.0-next.1.tgz#8b9ff247f3ec9463dc9bdf99640ede88feb70726" - integrity sha512-rLzY+2AxkNb82TSRp7DaZH/y0/ZdUV3g0OwJl7ajXvyIH0oJgq5mtNAO4VUreU+MR6h3tGO+XJRg6W0OUM9rzw== - dependencies: - "@ampproject/remapping" "2.3.0" - "@angular-devkit/architect" "0.1901.0-next.1" - "@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.0" - "@vitejs/plugin-basic-ssl" "1.2.0" - beasties "0.2.0" - browserslist "^4.23.0" - esbuild "0.24.0" - fast-glob "3.3.2" - https-proxy-agent "7.0.6" - istanbul-lib-instrument "6.0.3" - listr2 "8.2.5" - magic-string "0.30.15" - mrmime "2.0.0" - parse5-html-rewriting-stream "7.0.0" - picomatch "4.0.2" - piscina "4.8.0" - rollup "4.28.1" - sass "1.82.0" - semver "7.6.3" - vite "6.0.3" - watchpack "2.4.2" - optionalDependencies: - lmdb "3.2.0" - -"@angular/build@19.1.0-next.2": - version "19.1.0-next.2" - resolved "https://registry.yarnpkg.com/@angular/build/-/build-19.1.0-next.2.tgz#0864a7a4d9e7fab35d66d07374d01634375211b3" - integrity sha512-HDyPsyyqbMpUQXA3VBcfFcGu6sj0vxKL/DEKxnxIgbC9dZ/01yNDMTPIszpGg16fRPt10xEefx3hUFMMgYzWJQ== +"@angular/build@19.1.0-rc.0": + version "19.1.0-rc.0" + resolved "https://registry.yarnpkg.com/@angular/build/-/build-19.1.0-rc.0.tgz#7ac3a48be233c2978d94d3587badc74a817d60bd" + integrity sha512-ALl+MVMYBF+E7HyAQ+1MtE6sNIOAX0o2Sfs0wdIQfM2unRl6jPsz/Ker4BjnNQIK4wRCcstyzBv5mZBDulfFIQ== dependencies: "@ampproject/remapping" "2.3.0" - "@angular-devkit/architect" "0.1901.0-next.2" + "@angular-devkit/architect" "0.1901.0-rc.0" "@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.0" + "@inquirer/confirm" "5.1.1" "@vitejs/plugin-basic-ssl" "1.2.0" beasties "0.2.0" browserslist "^4.23.0" - esbuild "0.24.0" - fast-glob "3.3.2" + 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.15" + magic-string "0.30.17" mrmime "2.0.0" parse5-html-rewriting-stream "7.0.0" picomatch "4.0.2" piscina "4.8.0" - rollup "4.28.1" - sass "1.83.0" + rollup "4.30.1" + sass "1.83.1" semver "7.6.3" - vite "6.0.3" + vite "6.0.7" watchpack "2.4.2" optionalDependencies: - lmdb "3.2.0" + lmdb "3.2.2" -"@angular/cdk@19.1.0-next.3": - version "19.1.0-next.3" - resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-19.1.0-next.3.tgz#7966fffbd21b1b14cedbe79766a29ffd38464ae9" - integrity sha512-7JX7kzV3PmeXwoL7dd2xLjDvZ7w/U+vuP/IHxSv0p+ThBZraMibcSUK/OeFC2XDKMs7Z8/0YnH/OWaAkxj8gmA== +"@angular/cdk@19.1.0-rc.0": + version "19.1.0-rc.0" + resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-19.1.0-rc.0.tgz#0ce5d350b6198d53a3e5e70f8a1d69836053279a" + integrity sha512-uU//V0eUFoC9m1iJX6np3z+Ss+uww/iEl+Qsfi1WnTWALt0lE2v+vyF9OmFJz6LnEZRTczcG+K/Aj1DcJE0CtA== dependencies: tslib "^2.3.0" optionalDependencies: parse5 "^7.1.2" -"@angular/cli@19.1.0-next.2": - version "19.1.0-next.2" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-19.1.0-next.2.tgz#32b3f6bfa2e35f01e28e26ad4fe2e0ab2a25dacd" - integrity sha512-Z1HLXWMaw/FVmkuBibpB1X85a2m+gWvtwc8ZFG11ulKhqMiCNo1bFzWrJh4wqbOHXlw8RBkklOuWVmhaWuFg8g== +"@angular/cli@19.1.0-rc.0": + version "19.1.0-rc.0" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-19.1.0-rc.0.tgz#f83c8fce3addda86d59c4741c676b62270962743" + integrity sha512-NWrXdaGxC4l8mJTeJDVDd8eKFIvWa+S0grQON88orL4Rm5n7LwT8SC3vPPDIrc/W6m8Z9Wc+JBrI3VPI9lZh3w== dependencies: - "@angular-devkit/architect" "0.1901.0-next.2" - "@angular-devkit/core" "19.1.0-next.2" - "@angular-devkit/schematics" "19.1.0-next.2" - "@inquirer/prompts" "7.2.0" + "@angular-devkit/architect" "0.1901.0-rc.0" + "@angular-devkit/core" "19.1.0-rc.0" + "@angular-devkit/schematics" "19.1.0-rc.0" + "@inquirer/prompts" "7.2.1" "@listr2/prompt-adapter-inquirer" "2.0.18" - "@schematics/angular" "19.1.0-next.2" + "@schematics/angular" "19.1.0-rc.0" "@yarnpkg/lockfile" "1.1.0" ini "5.0.0" jsonc-parser "3.3.1" @@ -454,7 +401,7 @@ npm-package-arg "12.0.1" npm-pick-manifest "10.0.0" pacote "20.0.0" - resolve "1.22.8" + resolve "1.22.10" semver "7.6.3" symbol-observable "4.0.0" yargs "17.7.2" @@ -473,34 +420,34 @@ dependencies: tslib "^2.3.0" -"@angular/material@19.1.0-next.3": - version "19.1.0-next.3" - resolved "https://registry.yarnpkg.com/@angular/material/-/material-19.1.0-next.3.tgz#6c58e47c28fc5d893841c68ed79ac1eb2db17256" - integrity sha512-aq92B77YkgHSoew2aN2Fqeg9eu/DiL3c09JKul0PW7cQfMejYU1UmiiyhXS5MhxFdVofhsJdV5C8m4aMzjagVw== +"@angular/material@19.1.0-rc.0": + version "19.1.0-rc.0" + resolved "https://registry.yarnpkg.com/@angular/material/-/material-19.1.0-rc.0.tgz#d7a63ab12df03e6bd755fc391e9cbf8faaeb87a1" + integrity sha512-mLobhkm2Cc6+QqiNQbZ/k8yfSyES02FXv/CoeZgrFINsmYHDuBTVbe0KsR4Xhs1lNYqalyLMvbypJ5WzWT3TYw== dependencies: tslib "^2.3.0" -"@angular/ng-dev@https://github.com/angular/dev-infra-private-ng-dev-builds.git#d300539f8ebeadaa46e6cb8ed36e4748ac6d303a": - version "0.0.0-289aa644e65a557bcb21adcf75ad60605a9c9859" - uid d300539f8ebeadaa46e6cb8ed36e4748ac6d303a - resolved "https://github.com/angular/dev-infra-private-ng-dev-builds.git#d300539f8ebeadaa46e6cb8ed36e4748ac6d303a" +"@angular/ng-dev@https://github.com/angular/dev-infra-private-ng-dev-builds.git#5d1a3e42cd27a30b988a5d0e40fca332c7a10aa0": + version "0.0.0-5b4b2a6258dece411626435f680d2818769f469a" + uid "5d1a3e42cd27a30b988a5d0e40fca332c7a10aa0" + resolved "https://github.com/angular/dev-infra-private-ng-dev-builds.git#5d1a3e42cd27a30b988a5d0e40fca332c7a10aa0" dependencies: - "@google-cloud/spanner" "7.16.0" - "@octokit/rest" "21.0.2" + "@google-cloud/spanner" "7.17.1" + "@octokit/rest" "21.1.0" "@types/semver" "^7.3.6" "@types/supports-color" "^8.1.1" "@yarnpkg/lockfile" "^1.1.0" chalk "^5.0.1" semver "^7.5.4" - supports-color "9.4.0" + supports-color "10.0.0" typed-graphqlify "^3.1.1" typescript "~4.9.0" - yaml "2.6.1" + yaml "2.7.0" -"@angular/ssr@19.1.0-next.2": - version "19.1.0-next.2" - resolved "https://registry.yarnpkg.com/@angular/ssr/-/ssr-19.1.0-next.2.tgz#ccc570eb5b34c346e037d8fdf0819f0328b20fc6" - integrity sha512-UBSkHUi9W+N5q+IgVNtwt8u6Sfcjj8sOesgUjEWPcqKUrVjIpVNVJLPP2t6WkogTqyRWOHH2zuGktKzglBQaeA== +"@angular/ssr@19.1.0-rc.0": + version "19.1.0-rc.0" + resolved "https://registry.yarnpkg.com/@angular/ssr/-/ssr-19.1.0-rc.0.tgz#c58daf37b555d580cea07d40f5e29d96a28a51c3" + integrity sha512-hqB/TKcKLjMYcQJg3O6NprL6m0OpD9a25M5o318QduZSjbYqSCsG7GrpuNpKUIbLjGj3U0aBTyV86OoaUG+yeg== dependencies: tslib "^2.3.0" @@ -1680,11 +1627,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz#51299374de171dbd80bb7d838e1cfce9af36f353" integrity sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ== -"@esbuild/aix-ppc64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz#b57697945b50e99007b4c2521507dc613d4a648c" - integrity sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw== - "@esbuild/aix-ppc64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz#38848d3e25afe842a7943643cbcd387cc6e13461" @@ -1695,11 +1637,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz#58565291a1fe548638adb9c584237449e5e14018" integrity sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw== -"@esbuild/android-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz#1add7e0af67acefd556e407f8497e81fddad79c0" - integrity sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w== - "@esbuild/android-arm64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz#f592957ae8b5643129fa889c79e69cd8669bb894" @@ -1710,11 +1647,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.23.1.tgz#5eb8c652d4c82a2421e3395b808e6d9c42c862ee" integrity sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ== -"@esbuild/android-arm@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.24.0.tgz#ab7263045fa8e090833a8e3c393b60d59a789810" - integrity sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew== - "@esbuild/android-arm@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.24.2.tgz#72d8a2063aa630308af486a7e5cbcd1e134335b3" @@ -1725,11 +1657,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.23.1.tgz#ae19d665d2f06f0f48a6ac9a224b3f672e65d517" integrity sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg== -"@esbuild/android-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.24.0.tgz#e8f8b196cfdfdd5aeaebbdb0110983460440e705" - integrity sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ== - "@esbuild/android-x64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.24.2.tgz#9a7713504d5f04792f33be9c197a882b2d88febb" @@ -1740,11 +1667,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz#05b17f91a87e557b468a9c75e9d85ab10c121b16" integrity sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q== -"@esbuild/darwin-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz#2d0d9414f2acbffd2d86e98253914fca603a53dd" - integrity sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw== - "@esbuild/darwin-arm64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz#02ae04ad8ebffd6e2ea096181b3366816b2b5936" @@ -1755,11 +1677,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz#c58353b982f4e04f0d022284b8ba2733f5ff0931" integrity sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw== -"@esbuild/darwin-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz#33087aab31a1eb64c89daf3d2cf8ce1775656107" - integrity sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA== - "@esbuild/darwin-x64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz#9ec312bc29c60e1b6cecadc82bd504d8adaa19e9" @@ -1770,11 +1687,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz#f9220dc65f80f03635e1ef96cfad5da1f446f3bc" integrity sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA== -"@esbuild/freebsd-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz#bb76e5ea9e97fa3c753472f19421075d3a33e8a7" - integrity sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA== - "@esbuild/freebsd-arm64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz#5e82f44cb4906d6aebf24497d6a068cfc152fa00" @@ -1785,11 +1697,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz#69bd8511fa013b59f0226d1609ac43f7ce489730" integrity sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g== -"@esbuild/freebsd-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz#e0e2ce9249fdf6ee29e5dc3d420c7007fa579b93" - integrity sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ== - "@esbuild/freebsd-x64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz#3fb1ce92f276168b75074b4e51aa0d8141ecce7f" @@ -1800,11 +1707,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz#8050af6d51ddb388c75653ef9871f5ccd8f12383" integrity sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g== -"@esbuild/linux-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz#d1b2aa58085f73ecf45533c07c82d81235388e75" - integrity sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g== - "@esbuild/linux-arm64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz#856b632d79eb80aec0864381efd29de8fd0b1f43" @@ -1815,11 +1717,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz#ecaabd1c23b701070484990db9a82f382f99e771" integrity sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ== -"@esbuild/linux-arm@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz#8e4915df8ea3e12b690a057e77a47b1d5935ef6d" - integrity sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw== - "@esbuild/linux-arm@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz#c846b4694dc5a75d1444f52257ccc5659021b736" @@ -1830,11 +1727,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz#3ed2273214178109741c09bd0687098a0243b333" integrity sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ== -"@esbuild/linux-ia32@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz#8200b1110666c39ab316572324b7af63d82013fb" - integrity sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA== - "@esbuild/linux-ia32@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz#f8a16615a78826ccbb6566fab9a9606cfd4a37d5" @@ -1845,11 +1737,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz#a0fdf440b5485c81b0fbb316b08933d217f5d3ac" integrity sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw== -"@esbuild/linux-loong64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz#6ff0c99cf647504df321d0640f0d32e557da745c" - integrity sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g== - "@esbuild/linux-loong64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz#1c451538c765bf14913512c76ed8a351e18b09fc" @@ -1860,11 +1747,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz#e11a2806346db8375b18f5e104c5a9d4e81807f6" integrity sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q== -"@esbuild/linux-mips64el@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz#3f720ccd4d59bfeb4c2ce276a46b77ad380fa1f3" - integrity sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA== - "@esbuild/linux-mips64el@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz#0846edeefbc3d8d50645c51869cc64401d9239cb" @@ -1875,11 +1757,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz#06a2744c5eaf562b1a90937855b4d6cf7c75ec96" integrity sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw== -"@esbuild/linux-ppc64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz#9d6b188b15c25afd2e213474bf5f31e42e3aa09e" - integrity sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ== - "@esbuild/linux-ppc64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz#8e3fc54505671d193337a36dfd4c1a23b8a41412" @@ -1890,11 +1767,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz#65b46a2892fc0d1af4ba342af3fe0fa4a8fe08e7" integrity sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA== -"@esbuild/linux-riscv64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz#f989fdc9752dfda286c9cd87c46248e4dfecbc25" - integrity sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw== - "@esbuild/linux-riscv64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz#6a1e92096d5e68f7bb10a0d64bb5b6d1daf9a694" @@ -1905,11 +1777,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz#e71ea18c70c3f604e241d16e4e5ab193a9785d6f" integrity sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw== -"@esbuild/linux-s390x@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz#29ebf87e4132ea659c1489fce63cd8509d1c7319" - integrity sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g== - "@esbuild/linux-s390x@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz#ab18e56e66f7a3c49cb97d337cd0a6fea28a8577" @@ -1920,11 +1787,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz#d47f97391e80690d4dfe811a2e7d6927ad9eed24" integrity sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ== -"@esbuild/linux-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz#4af48c5c0479569b1f359ffbce22d15f261c0cef" - integrity sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA== - "@esbuild/linux-x64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz#8140c9b40da634d380b0b29c837a0b4267aff38f" @@ -1940,11 +1802,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz#44e743c9778d57a8ace4b72f3c6b839a3b74a653" integrity sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA== -"@esbuild/netbsd-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz#1ae73d23cc044a0ebd4f198334416fb26c31366c" - integrity sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg== - "@esbuild/netbsd-x64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz#7a3a97d77abfd11765a72f1c6f9b18f5396bcc40" @@ -1955,11 +1812,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz#05c5a1faf67b9881834758c69f3e51b7dee015d7" integrity sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q== -"@esbuild/openbsd-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz#5d904a4f5158c89859fd902c427f96d6a9e632e2" - integrity sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg== - "@esbuild/openbsd-arm64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz#58b00238dd8f123bfff68d3acc53a6ee369af89f" @@ -1970,11 +1822,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz#2e58ae511bacf67d19f9f2dcd9e8c5a93f00c273" integrity sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA== -"@esbuild/openbsd-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz#4c8aa88c49187c601bae2971e71c6dc5e0ad1cdf" - integrity sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q== - "@esbuild/openbsd-x64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz#0ac843fda0feb85a93e288842936c21a00a8a205" @@ -1985,11 +1832,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz#adb022b959d18d3389ac70769cef5a03d3abd403" integrity sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA== -"@esbuild/sunos-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz#8ddc35a0ea38575fa44eda30a5ee01ae2fa54dd4" - integrity sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA== - "@esbuild/sunos-x64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz#8b7aa895e07828d36c422a4404cc2ecf27fb15c6" @@ -2000,11 +1842,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz#84906f50c212b72ec360f48461d43202f4c8b9a2" integrity sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A== -"@esbuild/win32-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz#6e79c8543f282c4539db684a207ae0e174a9007b" - integrity sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA== - "@esbuild/win32-arm64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz#c023afb647cabf0c3ed13f0eddfc4f1d61c66a85" @@ -2015,11 +1852,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz#5e3eacc515820ff729e90d0cb463183128e82fac" integrity sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ== -"@esbuild/win32-ia32@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz#057af345da256b7192d18b676a02e95d0fa39103" - integrity sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw== - "@esbuild/win32-ia32@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz#96c356132d2dda990098c8b8b951209c3cd743c2" @@ -2030,11 +1862,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz#81fd50d11e2c32b2d6241470e3185b70c7b30699" integrity sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg== -"@esbuild/win32-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz#168ab1c7e1c318b922637fad8f339d48b01e1244" - integrity sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA== - "@esbuild/win32-x64@0.24.2": version "0.24.2" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz#34aa0b52d0fbb1a654b596acfa595f0c7b77a77b" @@ -2113,10 +1940,10 @@ lodash.snakecase "^4.1.1" p-defer "^3.0.0" -"@google-cloud/spanner@7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@google-cloud/spanner/-/spanner-7.16.0.tgz#29511842de6208d117175d0364749fab2098bcb6" - integrity sha512-9/rQau/WNgM1Zle9sEJm6jUp1l4sbHtiHGcktQnQc2LPs5EjMMg9eYaP4UfWgDzoxny+3hyKTyhBbAzHR8pQGA== +"@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== dependencies: "@google-cloud/common" "^5.0.0" "@google-cloud/precise-date" "^4.0.0" @@ -2125,6 +1952,7 @@ "@grpc/proto-loader" "^0.7.0" "@opentelemetry/api" "^1.9.0" "@opentelemetry/context-async-hooks" "^1.26.0" + "@opentelemetry/core" "^1.27.0" "@opentelemetry/semantic-conventions" "^1.25.1" "@types/big.js" "^6.0.0" "@types/stack-trace" "0.0.33" @@ -2210,7 +2038,7 @@ local-pkg "^0.5.1" mlly "^1.7.3" -"@inquirer/checkbox@^4.0.3", "@inquirer/checkbox@^4.0.4": +"@inquirer/checkbox@^4.0.4": version "4.0.4" resolved "https://registry.yarnpkg.com/@inquirer/checkbox/-/checkbox-4.0.4.tgz#e7335f9c23f4100f789a8fceb26417c9a74a6dee" integrity sha512-fYAKCAcGNMdfjL6hZTRUwkIByQ8EIZCXKrIQZH7XjADnN/xvRUhj8UdBbpC4zoUzvChhkSC/zRKaP/tDs3dZpg== @@ -2221,15 +2049,7 @@ ansi-escapes "^4.3.2" yoctocolors-cjs "^2.1.2" -"@inquirer/confirm@5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.1.0.tgz#061cd0790c8debe092353589a501211b0d6c53ef" - integrity sha512-osaBbIMEqVFjTX5exoqPXs6PilWQdjaLhGtMDXMXg/yxkHXNq43GlxGyTA35lK2HpzUgDN+Cjh/2AmqCN0QJpw== - dependencies: - "@inquirer/core" "^10.1.1" - "@inquirer/type" "^3.0.1" - -"@inquirer/confirm@^5.1.0", "@inquirer/confirm@^5.1.1": +"@inquirer/confirm@5.1.1", "@inquirer/confirm@^5.1.1": version "5.1.1" resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.1.1.tgz#18385064b8275eb79fdba505ce527801804eea04" integrity sha512-vVLSbGci+IKQvDOtzpPTCOiEJCNidHcAq9JYVoWTW0svb5FiwSLotkM+JXNXejfjnzVYV9n0DTBythl9+XgTxg== @@ -2237,7 +2057,7 @@ "@inquirer/core" "^10.1.2" "@inquirer/type" "^3.0.2" -"@inquirer/core@^10.1.1", "@inquirer/core@^10.1.2": +"@inquirer/core@^10.1.2": version "10.1.2" resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.1.2.tgz#a9c5b9ed814a636e99b5c0a8ca4f1626d99fd75d" integrity sha512-bHd96F3ezHg1mf/J0Rb4CV8ndCN0v28kUlrHqP7+ECm1C/A+paB7Xh2lbMk6x+kweQC+rZOxM/YeKikzxco8bQ== @@ -2252,7 +2072,7 @@ wrap-ansi "^6.2.0" yoctocolors-cjs "^2.1.2" -"@inquirer/editor@^4.2.0", "@inquirer/editor@^4.2.1": +"@inquirer/editor@^4.2.1": version "4.2.1" resolved "https://registry.yarnpkg.com/@inquirer/editor/-/editor-4.2.1.tgz#9887e95aa28a52eb20e9e08d85cb3698ef404601" integrity sha512-xn9aDaiP6nFa432i68JCaL302FyL6y/6EG97nAtfIPnWZ+mWPgCMLGc4XZ2QQMsZtu9q3Jd5AzBPjXh10aX9kA== @@ -2261,7 +2081,7 @@ "@inquirer/type" "^3.0.2" external-editor "^3.1.0" -"@inquirer/expand@^4.0.3", "@inquirer/expand@^4.0.4": +"@inquirer/expand@^4.0.4": version "4.0.4" resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-4.0.4.tgz#e3b052835e48fd4ebcf71813b7eae8b03c729d1b" integrity sha512-GYocr+BPyxKPxQ4UZyNMqZFSGKScSUc0Vk17II3J+0bDcgGsQm0KYQNooN1Q5iBfXsy3x/VWmHGh20QnzsaHwg== @@ -2275,7 +2095,7 @@ resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.9.tgz#9d8128f8274cde4ca009ca8547337cab3f37a4a3" integrity sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ== -"@inquirer/input@^4.1.0", "@inquirer/input@^4.1.1": +"@inquirer/input@^4.1.1": version "4.1.1" resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-4.1.1.tgz#aea2e463087c6aae57b9801e1ae5648f50d0d22e" integrity sha512-nAXAHQndZcXB+7CyjIW3XuQZZHbQQ0q8LX6miY6bqAWwDzNa9JUioDBYrFmOUNIsuF08o1WT/m2gbBXvBhYVxg== @@ -2283,7 +2103,7 @@ "@inquirer/core" "^10.1.2" "@inquirer/type" "^3.0.2" -"@inquirer/number@^3.0.3", "@inquirer/number@^3.0.4": +"@inquirer/number@^3.0.4": version "3.0.4" resolved "https://registry.yarnpkg.com/@inquirer/number/-/number-3.0.4.tgz#090dcac6886d0cddc255f6624b61fb4461747fee" integrity sha512-DX7a6IXRPU0j8kr2ovf+QaaDiIf+zEKaZVzCWdLOTk7XigqSXvoh4cul7x68xp54WTQrgSnW7P1WBJDbyY3GhA== @@ -2291,7 +2111,7 @@ "@inquirer/core" "^10.1.2" "@inquirer/type" "^3.0.2" -"@inquirer/password@^4.0.3", "@inquirer/password@^4.0.4": +"@inquirer/password@^4.0.4": version "4.0.4" resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-4.0.4.tgz#77891ae3ed5736607e6e942993ac40ca00411a2c" integrity sha512-wiliQOWdjM8FnBmdIHtQV2Ca3S1+tMBUerhyjkRCv1g+4jSvEweGu9GCcvVEgKDhTBT15nrxvk5/bVrGUqSs1w== @@ -2300,23 +2120,7 @@ "@inquirer/type" "^3.0.2" ansi-escapes "^4.3.2" -"@inquirer/prompts@7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-7.2.0.tgz#15010df2257a243866480513d36f3e19c98d7fb1" - integrity sha512-ZXYZ5oGVrb+hCzcglPeVerJ5SFwennmDOPfXq1WyeZIrPGySLbl4W6GaSsBFvu3WII36AOK5yB8RMIEEkBjf8w== - dependencies: - "@inquirer/checkbox" "^4.0.3" - "@inquirer/confirm" "^5.1.0" - "@inquirer/editor" "^4.2.0" - "@inquirer/expand" "^4.0.3" - "@inquirer/input" "^4.1.0" - "@inquirer/number" "^3.0.3" - "@inquirer/password" "^4.0.3" - "@inquirer/rawlist" "^4.0.3" - "@inquirer/search" "^3.0.3" - "@inquirer/select" "^4.0.3" - -"@inquirer/prompts@^7.0.0": +"@inquirer/prompts@7.2.1", "@inquirer/prompts@^7.0.0": version "7.2.1" resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-7.2.1.tgz#f00fbcf06998a07faebc10741efa289384529950" integrity sha512-v2JSGri6/HXSfoGIwuKEn8sNCQK6nsB2BNpy2lSX6QH9bsECrMv93QHnj5+f+1ZWpF/VNioIV2B/PDox8EvGuQ== @@ -2332,7 +2136,7 @@ "@inquirer/search" "^3.0.4" "@inquirer/select" "^4.0.4" -"@inquirer/rawlist@^4.0.3", "@inquirer/rawlist@^4.0.4": +"@inquirer/rawlist@^4.0.4": version "4.0.4" resolved "https://registry.yarnpkg.com/@inquirer/rawlist/-/rawlist-4.0.4.tgz#d10bbd6c529cd468d3d764c19de21334a01fa6d9" integrity sha512-IsVN2EZdNHsmFdKWx9HaXb8T/s3FlR/U1QPt9dwbSyPtjFbMTlW9CRFvnn0bm/QIsrMRD2oMZqrQpSWPQVbXXg== @@ -2341,7 +2145,7 @@ "@inquirer/type" "^3.0.2" yoctocolors-cjs "^2.1.2" -"@inquirer/search@^3.0.3", "@inquirer/search@^3.0.4": +"@inquirer/search@^3.0.4": version "3.0.4" resolved "https://registry.yarnpkg.com/@inquirer/search/-/search-3.0.4.tgz#fcf51a853536add37491920634a182ecc9f5524b" integrity sha512-tSkJk2SDmC2MEdTIjknXWmCnmPr5owTs9/xjfa14ol1Oh95n6xW7SYn5fiPk4/vrJPys0ggSWiISdPze4LTa7A== @@ -2351,7 +2155,7 @@ "@inquirer/type" "^3.0.2" yoctocolors-cjs "^2.1.2" -"@inquirer/select@^4.0.3", "@inquirer/select@^4.0.4": +"@inquirer/select@^4.0.4": version "4.0.4" resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-4.0.4.tgz#026ada15754def1cd3fbc01efc56eae45ccc7de4" integrity sha512-ZzYLuLoUzTIW9EJm++jBpRiTshGqS3Q1o5qOEQqgzaBlmdsjQr6pA4TUNkwu6OBYgM2mIRbCz6mUhFDfl/GF+w== @@ -2369,7 +2173,7 @@ dependencies: mute-stream "^1.0.0" -"@inquirer/type@^3.0.1", "@inquirer/type@^3.0.2": +"@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== @@ -2543,35 +2347,35 @@ dependencies: "@inquirer/type" "^1.5.5" -"@lmdb/lmdb-darwin-arm64@3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.0.tgz#fefac30026690e8e68a9b508b650ce0cbfe8a122" - integrity sha512-Ca5N6DGDlH/lIycMj2U3FtokNPdUmGyL+htto3G+gexoXYaDE9cbojVgwXd3/Zih9Friqh7l5qZk+LZEVDwJvQ== +"@lmdb/lmdb-darwin-arm64@3.2.2": + version "3.2.2" + 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-x64@3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.0.tgz#ae7134b12d8e479bcde5c5bcbdf1d17ba535f35b" - integrity sha512-s/MXLuRXxJjQpg0aM/yN3FJh34tqEPo6Zg+FJvc9+gUNpzXzZwBB9MOTYA05WVrvxwtIKxMg7ocLjAH1LQUT3A== +"@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-linux-arm64@3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.0.tgz#7492adba1667789f4f129945c71d38b936517628" - integrity sha512-XRkaZok4AkzMXKLfsdJYVBXYJ/6idDpuLIPGiVjelxKLbZIKB7F+Xp2BDfeelAPdjRbW/qhzF7FNA0u1blz/Og== +"@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-arm@3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.0.tgz#cbea8970baaa7a802f0ff1b17d6873c50a6fb1b0" - integrity sha512-e9pljI8rZk1UAaDdi7sGiY0zkqsNAS3a4llOuk2UslAH4UP9vGZfjfCR5D+HKPUPbSEk28adOiNmIUT4N2lTBw== +"@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-x64@3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.0.tgz#0424671e51802f0864873501abe558c5e6f8461e" - integrity sha512-c8HMb044qzMT/wvk4HzBesRv3wQNeFkUFz6laH3FKVs0+ztM7snuT3izPWdeYhgCLkAiIqshqlcbvzQfPDeg2Q== +"@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-win32-x64@3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.0.tgz#082b3996e46bc6b4333df08287813ecb53288ea3" - integrity sha512-xcrdSOPtpZ4ScWJM2x4g+eWCOctINOcaEWGSvZbmXPFD69SAFywyhqNsB3snAY3assYV0B52PWmiAwXWfijd+g== +"@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== "@marijn/find-cluster-break@^1.0.0": version "1.0.2" @@ -2585,15 +2389,6 @@ dependencies: langium "3.0.0" -"@microsoft/api-extractor-model@7.30.0": - version "7.30.0" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.30.0.tgz#18a0528350124015b2c08397474e9309a8b3c807" - integrity sha512-26/LJZBrsWDKAkOWRiQbdVgcfd1F3nyJnAiJzsAgpouPk7LtOIj7PK9aJtBaw/pUXrkotEg27RrT+Jm/q0bbug== - dependencies: - "@microsoft/tsdoc" "~0.15.1" - "@microsoft/tsdoc-config" "~0.17.1" - "@rushstack/node-core-library" "5.10.0" - "@microsoft/api-extractor-model@7.30.1": version "7.30.1" resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.30.1.tgz#719e2ab8afe8fe3a5dd65aaa8783dbba90f7c802" @@ -2603,24 +2398,24 @@ "@microsoft/tsdoc-config" "~0.17.1" "@rushstack/node-core-library" "5.10.1" -"@microsoft/api-extractor@7.48.0": - version "7.48.0" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.48.0.tgz#d87243bdafbfadcf87b336b2b4e5de71ecc7caab" - integrity sha512-FMFgPjoilMUWeZXqYRlJ3gCVRhB7WU/HN88n8OLqEsmsG4zBdX/KQdtJfhq95LQTQ++zfu0Em1LLb73NqRCLYQ== +"@microsoft/api-extractor@7.49.0": + version "7.49.0" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.49.0.tgz#0cd36b62acb9481d81388cb8314d980461fb809b" + integrity sha512-X5b462k0/yl8qWdGx3siq5vyI8fTDU9fRnwqTMlGHqFhLxpASmLWA2EU6nft+ZG8cQM2HRZlr4HSo62UqiAnug== dependencies: - "@microsoft/api-extractor-model" "7.30.0" + "@microsoft/api-extractor-model" "7.30.1" "@microsoft/tsdoc" "~0.15.1" "@microsoft/tsdoc-config" "~0.17.1" - "@rushstack/node-core-library" "5.10.0" + "@rushstack/node-core-library" "5.10.1" "@rushstack/rig-package" "0.5.3" - "@rushstack/terminal" "0.14.3" - "@rushstack/ts-command-line" "4.23.1" + "@rushstack/terminal" "0.14.4" + "@rushstack/ts-command-line" "4.23.2" lodash "~4.17.15" minimatch "~3.0.3" resolve "~1.22.1" semver "~7.5.4" source-map "~0.6.1" - typescript "5.4.2" + typescript "5.7.2" "@microsoft/api-extractor@^7.24.2": version "7.48.1" @@ -2788,10 +2583,10 @@ "@napi-rs/nice-win32-ia32-msvc" "1.0.1" "@napi-rs/nice-win32-x64-msvc" "1.0.1" -"@ngtools/webpack@19.1.0-next.2": - version "19.1.0-next.2" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-19.1.0-next.2.tgz#03de00461233c620320e86a8196030a0ae1e9fb4" - integrity sha512-p/iDYNSMp20ArnMuZmQ7y9NLkiB0n2iYP0lqywga8EOHrl/e+Nt84wqVgQ6plapo2LCkS6ZdIlwMi7yN1fz1IA== +"@ngtools/webpack@19.1.0-rc.0": + version "19.1.0-rc.0" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-19.1.0-rc.0.tgz#139fd4576f09be91afbcfc3a8c589af3d1639120" + integrity sha512-alRs/9Lk0x4LBWw6e3MaSS7ISDFoorM4DBwA2qPrIfytYkJR1tbKKCn5m+TwgeNPPp43+QpBzIfftzHhnyiRuw== "@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3": version "2.1.8-no-fsevents.3" @@ -2943,7 +2738,7 @@ before-after-hook "^2.2.0" universal-user-agent "^6.0.0" -"@octokit/core@^6.1.2": +"@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== @@ -3000,12 +2795,17 @@ resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-22.2.0.tgz#75aa7dcd440821d99def6a60b5f014207ae4968e" integrity sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg== -"@octokit/plugin-paginate-rest@^11.0.0": - version "11.3.6" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.6.tgz#82f33c87464202423c2a89d5cc8c38761f4aa86b" - integrity sha512-zcvqqf/+TicbTCa/Z+3w4eBJcAxCFymtc0UAIsR3dEVoNilWld4oXdscQ3laXamTszUZdusw97K8+DrbFiOwjw== +"@octokit/openapi-types@^23.0.1": + version "23.0.1" + 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": + version "11.4.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.4.0.tgz#a9c3347113d793e48a014f0aa549eada00de7c9a" + integrity sha512-ttpGck5AYWkwMkMazNCZMqxKqIq1fJBNxBfsFwwfyYKTf914jKkLF0POMS3YkPBwp5g1c2Y4L79gDz01GhSr1g== dependencies: - "@octokit/types" "^13.6.2" + "@octokit/types" "^13.7.0" "@octokit/plugin-paginate-rest@^9.0.0": version "9.2.1" @@ -3026,12 +2826,12 @@ dependencies: "@octokit/types" "^12.6.0" -"@octokit/plugin-rest-endpoint-methods@^13.0.0": - version "13.2.6" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.2.6.tgz#b9d343dbe88a6cb70cc7fa16faa98f0a29ffe654" - integrity sha512-wMsdyHMjSfKjGINkdGKki06VEkgdEldIGstIEyGX0wbYHGByOwN/KiM+hAAlUwAtPkP3gvXtVQA9L3ITdV2tVw== +"@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== dependencies: - "@octokit/types" "^13.6.1" + "@octokit/types" "^13.7.0" "@octokit/request-error@^5.1.0": version "5.1.0" @@ -3070,15 +2870,15 @@ fast-content-type-parse "^2.0.0" universal-user-agent "^7.0.2" -"@octokit/rest@21.0.2": - version "21.0.2" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-21.0.2.tgz#9b767dbc1098daea8310fd8b76bf7a97215d5972" - integrity sha512-+CiLisCoyWmYicH25y1cDfCrv41kRSvTq6pPWtRroRJzhsCZWZyCqGyI8foJT5LmScADSwRAnr/xo+eewL04wQ== +"@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== dependencies: - "@octokit/core" "^6.1.2" - "@octokit/plugin-paginate-rest" "^11.0.0" + "@octokit/core" "^6.1.3" + "@octokit/plugin-paginate-rest" "^11.4.0" "@octokit/plugin-request-log" "^5.3.1" - "@octokit/plugin-rest-endpoint-methods" "^13.0.0" + "@octokit/plugin-rest-endpoint-methods" "^13.3.0" "@octokit/types@^12.6.0": version "12.6.0" @@ -3087,13 +2887,20 @@ dependencies: "@octokit/openapi-types" "^20.0.0" -"@octokit/types@^13.0.0", "@octokit/types@^13.1.0", "@octokit/types@^13.6.1", "@octokit/types@^13.6.2": +"@octokit/types@^13.0.0", "@octokit/types@^13.1.0", "@octokit/types@^13.6.2": version "13.6.2" resolved "https://registry.yarnpkg.com/@octokit/types/-/types-13.6.2.tgz#e10fc4d2bdd65d836d1ced223b03ad4cfdb525bd" integrity sha512-WpbZfZUcZU77DrSW4wbsSgTPfKcp286q3ItaIgvSbBpZJlu6mnYXAkjZz6LVZPXkEvLIM8McanyZejKTYUHipA== dependencies: "@octokit/openapi-types" "^22.2.0" +"@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== + dependencies: + "@octokit/openapi-types" "^23.0.1" + "@opentelemetry/api@^1.9.0", "@opentelemetry/api@~1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.9.0.tgz#d03eba68273dc0f7509e2a3d5cba21eae10379fe" @@ -3104,7 +2911,14 @@ resolved "https://registry.yarnpkg.com/@opentelemetry/context-async-hooks/-/context-async-hooks-1.30.0.tgz#5639c8a7d19c6fe04a44b86aa302cb09008f6db9" integrity sha512-roCetrG/cz0r/gugQm/jFo75UxblVvHaNSRoR0kSSRSzXFAiIBqFCZuH458BHBNRtRe+0yJdIJ21L9t94bw7+g== -"@opentelemetry/semantic-conventions@^1.25.1": +"@opentelemetry/core@^1.27.0": + version "1.30.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.30.0.tgz#ef959e11e137d72466e566e375ecc5a82e922b86" + integrity sha512-Q/3u/K73KUjTCnFUP97ZY+pBjQ1kPEgjOfXj/bJl8zW7GbXdkw6cwuyZk6ZTXkVgCBsYRYUzx4fvYK1jxdb9MA== + dependencies: + "@opentelemetry/semantic-conventions" "1.28.0" + +"@opentelemetry/semantic-conventions@1.28.0", "@opentelemetry/semantic-conventions@^1.25.1": version "1.28.0" resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz#337fb2bca0453d0726696e745f50064411f646d6" integrity sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA== @@ -3347,209 +3161,195 @@ estree-walker "^2.0.2" picomatch "^4.0.2" -"@rollup/rollup-android-arm-eabi@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz#7f4c4d8cd5ccab6e95d6750dbe00321c1f30791e" - integrity sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ== - "@rollup/rollup-android-arm-eabi@4.30.0": version "4.30.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.0.tgz#f2552f6984cfae52784b2fbf0e47633f38955d66" integrity sha512-qFcFto9figFLz2g25DxJ1WWL9+c91fTxnGuwhToCl8BaqDsDYMl/kOnBXAyAqkkzAWimYMSWNPWEjt+ADAHuoQ== -"@rollup/rollup-android-arm64@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.1.tgz#17ea71695fb1518c2c324badbe431a0bd1879f2d" - integrity sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA== +"@rollup/rollup-android-arm-eabi@4.30.1": + version "4.30.1" + 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-arm64@4.30.0": version "4.30.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.0.tgz#7e5764268d3049b7341c60f1c650f1d71760a5b2" integrity sha512-vqrQdusvVl7dthqNjWCL043qelBK+gv9v3ZiqdxgaJvmZyIAAXMjeGVSqZynKq69T7062T5VrVTuikKSAAVP6A== -"@rollup/rollup-darwin-arm64@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.1.tgz#dac0f0d0cfa73e7d5225ae6d303c13c8979e7999" - integrity sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ== +"@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-darwin-arm64@4.30.0": version "4.30.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.0.tgz#c9245577f673802f0f6de0d46ee776691d77552e" integrity sha512-617pd92LhdA9+wpixnzsyhVft3szYiN16aNUMzVkf2N+yAk8UXY226Bfp36LvxYTUt7MO/ycqGFjQgJ0wlMaWQ== -"@rollup/rollup-darwin-x64@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.1.tgz#8f63baa1d31784904a380d2e293fa1ddf53dd4a2" - integrity sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ== +"@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-x64@4.30.0": version "4.30.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.0.tgz#e492705339542f8b54fa66f630c9d820bc708693" integrity sha512-Y3b4oDoaEhCypg8ajPqigKDcpi5ZZovemQl9Edpem0uNv6UUjXv7iySBpGIUTSs2ovWOzYpfw9EbFJXF/fJHWw== -"@rollup/rollup-freebsd-arm64@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.1.tgz#30ed247e0df6e8858cdc6ae4090e12dbeb8ce946" - integrity sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA== +"@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-freebsd-arm64@4.30.0": version "4.30.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.0.tgz#3e13b5d4d44ea87598d5d4db97181db1174fb3c8" integrity sha512-3REQJ4f90sFIBfa0BUokiCdrV/E4uIjhkWe1bMgCkhFXbf4D8YN6C4zwJL881GM818qVYE9BO3dGwjKhpo2ABA== -"@rollup/rollup-freebsd-x64@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.1.tgz#57846f382fddbb508412ae07855b8a04c8f56282" - integrity sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ== +"@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-x64@4.30.0": version "4.30.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.0.tgz#138daa08d1b345d605f57b4dedd18a50420488e7" integrity sha512-ZtY3Y8icbe3Cc+uQicsXG5L+CRGUfLZjW6j2gn5ikpltt3Whqjfo5mkyZ86UiuHF9Q3ZsaQeW7YswlHnN+lAcg== -"@rollup/rollup-linux-arm-gnueabihf@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.1.tgz#378ca666c9dae5e6f94d1d351e7497c176e9b6df" - integrity sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA== +"@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-linux-arm-gnueabihf@4.30.0": version "4.30.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.0.tgz#bdaece34f93c3dfd521e9ab8f5c740121862468e" integrity sha512-bsPGGzfiHXMhQGuFGpmo2PyTwcrh2otL6ycSZAFTESviUoBOuxF7iBbAL5IJXc/69peXl5rAtbewBFeASZ9O0g== -"@rollup/rollup-linux-arm-musleabihf@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.1.tgz#a692eff3bab330d5c33a5d5813a090c15374cddb" - integrity sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg== +"@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-musleabihf@4.30.0": version "4.30.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.0.tgz#1804c6ec49be21521eac612513e0666cdde2188c" integrity sha512-kvyIECEhs2DrrdfQf++maCWJIQ974EI4txlz1nNSBaCdtf7i5Xf1AQCEJWOC5rEBisdaMFFnOWNLYt7KpFqy5A== -"@rollup/rollup-linux-arm64-gnu@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.1.tgz#6b1719b76088da5ac1ae1feccf48c5926b9e3db9" - integrity sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA== +"@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-arm64-gnu@4.30.0": version "4.30.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.0.tgz#2c4bd90f77fcf769502743ec38f184c00a087e08" integrity sha512-CFE7zDNrokaotXu+shwIrmWrFxllg79vciH4E/zeK7NitVuWEaXRzS0mFfFvyhZfn8WfVOG/1E9u8/DFEgK7WQ== -"@rollup/rollup-linux-arm64-musl@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.1.tgz#865baf5b6f5ff67acb32e5a359508828e8dc5788" - integrity sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A== +"@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-musl@4.30.0": version "4.30.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.0.tgz#63eadee20f220d28e85cbd10aba671ada8e89c84" integrity sha512-MctNTBlvMcIBP0t8lV/NXiUwFg9oK5F79CxLU+a3xgrdJjfBLVIEHSAjQ9+ipofN2GKaMLnFFXLltg1HEEPaGQ== -"@rollup/rollup-linux-loongarch64-gnu@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.28.1.tgz#23c6609ba0f7fa7a7f2038b6b6a08555a5055a87" - integrity sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA== +"@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-loongarch64-gnu@4.30.0": version "4.30.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.0.tgz#1c2c2bb30f61cbbc0fcf4e6c359777fcdb7108cc" integrity sha512-fBpoYwLEPivL3q368+gwn4qnYnr7GVwM6NnMo8rJ4wb0p/Y5lg88vQRRP077gf+tc25akuqd+1Sxbn9meODhwA== -"@rollup/rollup-linux-powerpc64le-gnu@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.1.tgz#652ef0d9334a9f25b9daf85731242801cb0fc41c" - integrity sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A== +"@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-powerpc64le-gnu@4.30.0": version "4.30.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.0.tgz#cea71e0359f086a01c57cf312bef9ec9cc3ba010" integrity sha512-1hiHPV6dUaqIMXrIjN+vgJqtfkLpqHS1Xsg0oUfUVD98xGp1wX89PIXgDF2DWra1nxAd8dfE0Dk59MyeKaBVAw== -"@rollup/rollup-linux-riscv64-gnu@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.1.tgz#1eb6651839ee6ebca64d6cc64febbd299e95e6bd" - integrity sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA== +"@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-riscv64-gnu@4.30.0": version "4.30.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.0.tgz#25ab4a6dbcbd27f4a68382f7963363f886a237aa" integrity sha512-U0xcC80SMpEbvvLw92emHrNjlS3OXjAM0aVzlWfar6PR0ODWCTQtKeeB+tlAPGfZQXicv1SpWwRz9Hyzq3Jx3g== -"@rollup/rollup-linux-s390x-gnu@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.1.tgz#015c52293afb3ff2a293cf0936b1d43975c1e9cd" - integrity sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg== +"@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-s390x-gnu@4.30.0": version "4.30.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.0.tgz#7054b237152d9e36c51194532a6b70ca1a62a487" integrity sha512-VU/P/IODrNPasgZDLIFJmMiLGez+BN11DQWfTVlViJVabyF3JaeaJkP6teI8760f18BMGCQOW9gOmuzFaI1pUw== -"@rollup/rollup-linux-x64-gnu@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.1.tgz#b83001b5abed2bcb5e2dbeec6a7e69b194235c1e" - integrity sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw== +"@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-x64-gnu@4.30.0": version "4.30.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.0.tgz#3656a8341a6048f2111f423301aaad8e84a5fe90" integrity sha512-laQVRvdbKmjXuFA3ZiZj7+U24FcmoPlXEi2OyLfbpY2MW1oxLt9Au8q9eHd0x6Pw/Kw4oe9gwVXWwIf2PVqblg== -"@rollup/rollup-linux-x64-musl@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.1.tgz#6cc7c84cd4563737f8593e66f33b57d8e228805b" - integrity sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g== +"@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-musl@4.30.0": version "4.30.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.0.tgz#cf8ae018ea6ff65eb36722a28beb93a20a6047f0" integrity sha512-3wzKzduS7jzxqcOvy/ocU/gMR3/QrHEFLge5CD7Si9fyHuoXcidyYZ6jyx8OPYmCcGm3uKTUl+9jUSAY74Ln5A== -"@rollup/rollup-win32-arm64-msvc@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.1.tgz#631ffeee094d71279fcd1fe8072bdcf25311bc11" - integrity sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A== +"@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-win32-arm64-msvc@4.30.0": version "4.30.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.0.tgz#6b968f5b068469db16eac743811ee6c040671042" integrity sha512-jROwnI1+wPyuv696rAFHp5+6RFhXGGwgmgSfzE8e4xfit6oLRg7GyMArVUoM3ChS045OwWr9aTnU+2c1UdBMyw== -"@rollup/rollup-win32-ia32-msvc@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.1.tgz#06d1d60d5b9f718e8a6c4a43f82e3f9e3254587f" - integrity sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA== +"@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-ia32-msvc@4.30.0": version "4.30.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.0.tgz#0321de1a0540dd402e8e523d90cbd9d16f1b9e96" integrity sha512-duzweyup5WELhcXx5H1jokpr13i3BV9b48FMiikYAwk/MT1LrMYYk2TzenBd0jj4ivQIt58JWSxc19y4SvLP4g== -"@rollup/rollup-win32-x64-msvc@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.1.tgz#4dff5c4259ebe6c5b4a8f2c5bc3829b7a8447ff0" - integrity sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA== +"@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-x64-msvc@4.30.0": version "4.30.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.0.tgz#7384b359bb45c0c3c76ba2c7aaec1d047305efcb" integrity sha512-DYvxS0M07PvgvavMIybCOBYheyrqlui6ZQBHJs6GqduVzHSZ06TPPvlfvnYstjODHQ8UUXFwt5YE+h0jFI8kwg== -"@rushstack/node-core-library@5.10.0": - version "5.10.0" - resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-5.10.0.tgz#84173c913761a7d1edef5c818ce03d9e22cab9d7" - integrity sha512-2pPLCuS/3x7DCd7liZkqOewGM0OzLyCacdvOe8j6Yrx9LkETGnxul1t7603bIaB8nUAooORcct9fFDOQMbWAgw== - dependencies: - ajv "~8.13.0" - ajv-draft-04 "~1.0.0" - ajv-formats "~3.0.1" - fs-extra "~7.0.1" - import-lazy "~4.0.0" - jju "~1.4.0" - resolve "~1.22.1" - semver "~7.5.4" +"@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== "@rushstack/node-core-library@5.10.1": version "5.10.1" @@ -3573,14 +3373,6 @@ resolve "~1.22.1" strip-json-comments "~3.1.1" -"@rushstack/terminal@0.14.3": - version "0.14.3" - resolved "https://registry.yarnpkg.com/@rushstack/terminal/-/terminal-0.14.3.tgz#eae0198e73eac56c901f6e00d0d4254c50a3f655" - integrity sha512-csXbZsAdab/v8DbU1sz7WC2aNaKArcdS/FPmXMOXEj/JBBZMvDK0+1b4Qao0kkG0ciB1Qe86/Mb68GjH6/TnMw== - dependencies: - "@rushstack/node-core-library" "5.10.0" - supports-color "~8.1.1" - "@rushstack/terminal@0.14.4": version "0.14.4" resolved "https://registry.yarnpkg.com/@rushstack/terminal/-/terminal-0.14.4.tgz#37e160b0878a324cf3e0fecab25fe48a030e29ed" @@ -3589,16 +3381,6 @@ "@rushstack/node-core-library" "5.10.1" supports-color "~8.1.1" -"@rushstack/ts-command-line@4.23.1": - version "4.23.1" - resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.23.1.tgz#d5e33dbb1a016d9440b3a20010b82ccfe9abd34a" - integrity sha512-40jTmYoiu/xlIpkkRsVfENtBq4CW3R4azbL0Vmda+fMwHWqss6wwf/Cy/UJmMqIzpfYc2OTnjYP1ZLD3CmyeCA== - dependencies: - "@rushstack/terminal" "0.14.3" - "@types/argparse" "1.0.38" - argparse "~1.0.9" - string-argv "~0.3.1" - "@rushstack/ts-command-line@4.23.2": version "4.23.2" resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.23.2.tgz#37b28a418db84d04f6a1c787390dd02ad8dfadf0" @@ -3609,13 +3391,13 @@ argparse "~1.0.9" string-argv "~0.3.1" -"@schematics/angular@19.1.0-next.2": - version "19.1.0-next.2" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-19.1.0-next.2.tgz#b63708db004009988a1e35b5cfc4312b1346ef15" - integrity sha512-AqpJD8Jx21aUzClvEC5YrLgF6Cbfy8BikdUzIHTa16KY9SVptKVGa2UQGgod5FWX2N7OBaGpD6v3tn+dStDjDg== +"@schematics/angular@19.1.0-rc.0": + version "19.1.0-rc.0" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-19.1.0-rc.0.tgz#9192d8f26d0c26b0ffc895d9392a7d7746ec1408" + integrity sha512-YJi2fO9sUMnUG2fhEDWlb7Ad3Xx6sr1OJHLN4snFq3smZEzgrYKqiOp97/ZMcEsVOtgTpYAQ1l0nci2MJa6YtQ== dependencies: - "@angular-devkit/core" "19.1.0-next.2" - "@angular-devkit/schematics" "19.1.0-next.2" + "@angular-devkit/core" "19.1.0-rc.0" + "@angular-devkit/schematics" "19.1.0-rc.0" jsonc-parser "3.3.1" "@shikijs/core@1.26.1": @@ -8420,42 +8202,12 @@ es6-module-loader@^0.17.4: dependencies: when "^3.7.2" -esbuild-wasm@0.24.0: - version "0.24.0" - resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.24.0.tgz#99f44feb1dfccd25dbe7de1a26326ea1c7aca0d8" - integrity sha512-xhNn5tL1AhkPg4ft59yXT6FkwKXiPSYyz1IeinJHUJpjvOHOIPvdmFQc0pGdjxlKSbzZc2mNmtVOWAR1EF/JAg== +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@0.24.0: - version "0.24.0" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.24.0.tgz#f2d470596885fcb2e91c21eb3da3b3c89c0b55e7" - integrity sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ== - optionalDependencies: - "@esbuild/aix-ppc64" "0.24.0" - "@esbuild/android-arm" "0.24.0" - "@esbuild/android-arm64" "0.24.0" - "@esbuild/android-x64" "0.24.0" - "@esbuild/darwin-arm64" "0.24.0" - "@esbuild/darwin-x64" "0.24.0" - "@esbuild/freebsd-arm64" "0.24.0" - "@esbuild/freebsd-x64" "0.24.0" - "@esbuild/linux-arm" "0.24.0" - "@esbuild/linux-arm64" "0.24.0" - "@esbuild/linux-ia32" "0.24.0" - "@esbuild/linux-loong64" "0.24.0" - "@esbuild/linux-mips64el" "0.24.0" - "@esbuild/linux-ppc64" "0.24.0" - "@esbuild/linux-riscv64" "0.24.0" - "@esbuild/linux-s390x" "0.24.0" - "@esbuild/linux-x64" "0.24.0" - "@esbuild/netbsd-x64" "0.24.0" - "@esbuild/openbsd-arm64" "0.24.0" - "@esbuild/openbsd-x64" "0.24.0" - "@esbuild/sunos-x64" "0.24.0" - "@esbuild/win32-arm64" "0.24.0" - "@esbuild/win32-ia32" "0.24.0" - "@esbuild/win32-x64" "0.24.0" - -esbuild@^0.24.0: +esbuild@0.24.2, esbuild@^0.24.2: version "0.24.2" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.24.2.tgz#b5b55bee7de017bff5fb8a4e3e44f2ebe2c3567d" integrity sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA== @@ -8843,17 +8595,6 @@ 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.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - 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" - fast-glob@3.3.3, fast-glob@^3.2.9, fast-glob@^3.3.2: version "3.3.3" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" @@ -10644,7 +10385,7 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.13.0, is-core-module@^2.16.0: +is-core-module@^2.16.0: version "2.16.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== @@ -11839,10 +11580,10 @@ live-server@^1.2.2: send latest serve-index "^1.9.1" -lmdb@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lmdb/-/lmdb-3.2.0.tgz#b951233e9e8fcf8d1671bec5103250887f3abd87" - integrity sha512-cDeZAM4mXOwN1IdH93a91qXppn4jXV4NHphg53bqQDRFjJnpYZTgGcjrqpsmm209DtXTvmKMcYJd+XrHybwFZg== +lmdb@3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/lmdb/-/lmdb-3.2.2.tgz#1b3c50a0184847c88e02f038a598d6a229a8765e" + integrity sha512-LriG93la4PbmPMwI7Hbv8W+0ncLK7549w4sbZSi4QGDjnnxnmNMgxUkaQTEMzH8TpwsfFvgEjpLX7V8B/I9e3g== dependencies: msgpackr "^1.11.2" node-addon-api "^6.1.0" @@ -11850,12 +11591,12 @@ lmdb@3.2.0: ordered-binary "^1.5.3" weak-lru-cache "^1.2.2" optionalDependencies: - "@lmdb/lmdb-darwin-arm64" "3.2.0" - "@lmdb/lmdb-darwin-x64" "3.2.0" - "@lmdb/lmdb-linux-arm" "3.2.0" - "@lmdb/lmdb-linux-arm64" "3.2.0" - "@lmdb/lmdb-linux-x64" "3.2.0" - "@lmdb/lmdb-win32-x64" "3.2.0" + "@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" loader-runner@^4.2.0: version "4.3.0" @@ -12165,10 +11906,10 @@ madge@^8.0.0: ts-graphviz "^2.1.2" walkdir "^0.4.1" -magic-string@0.30.15: - version "0.30.15" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.15.tgz#d5474a2c4c5f35f041349edaba8a5cb02733ed3c" - integrity sha512-zXeaYRgZ6ldS1RJJUrMrYgNJ4fdwnyI6tVqoiIhyCyv5IVTK9BU8Ic2l253GGETQHxI4HNUwhJ3fjDhKqEoaAw== +magic-string@0.30.17, magic-string@^0.30.11, magic-string@^0.30.3, magic-string@^0.30.8: + version "0.30.17" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" + integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== dependencies: "@jridgewell/sourcemap-codec" "^1.5.0" @@ -12179,13 +11920,6 @@ magic-string@^0.25.7: dependencies: sourcemap-codec "^1.4.8" -magic-string@^0.30.11, magic-string@^0.30.3, magic-string@^0.30.8: - version "0.30.17" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" - integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -14816,16 +14550,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.8: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -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.8, 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== @@ -14984,32 +14709,32 @@ rollup-plugin-terser@^7.0.1: serialize-javascript "^4.0.0" terser "^5.0.0" -rollup@4.28.1: - version "4.28.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.28.1.tgz#7718ba34d62b449dfc49adbfd2f312b4fe0df4de" - integrity sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg== +rollup@4.30.1: + version "4.30.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.30.1.tgz#d5c3d066055259366cdc3eb6f1d051c5d6afaf74" + integrity sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w== dependencies: "@types/estree" "1.0.6" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.28.1" - "@rollup/rollup-android-arm64" "4.28.1" - "@rollup/rollup-darwin-arm64" "4.28.1" - "@rollup/rollup-darwin-x64" "4.28.1" - "@rollup/rollup-freebsd-arm64" "4.28.1" - "@rollup/rollup-freebsd-x64" "4.28.1" - "@rollup/rollup-linux-arm-gnueabihf" "4.28.1" - "@rollup/rollup-linux-arm-musleabihf" "4.28.1" - "@rollup/rollup-linux-arm64-gnu" "4.28.1" - "@rollup/rollup-linux-arm64-musl" "4.28.1" - "@rollup/rollup-linux-loongarch64-gnu" "4.28.1" - "@rollup/rollup-linux-powerpc64le-gnu" "4.28.1" - "@rollup/rollup-linux-riscv64-gnu" "4.28.1" - "@rollup/rollup-linux-s390x-gnu" "4.28.1" - "@rollup/rollup-linux-x64-gnu" "4.28.1" - "@rollup/rollup-linux-x64-musl" "4.28.1" - "@rollup/rollup-win32-arm64-msvc" "4.28.1" - "@rollup/rollup-win32-ia32-msvc" "4.28.1" - "@rollup/rollup-win32-x64-msvc" "4.28.1" + "@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" rollup@^4.23.0: @@ -15187,21 +14912,10 @@ sass-lookup@^6.0.1: dependencies: commander "^12.0.0" -sass@1.82.0: - version "1.82.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.82.0.tgz#30da277af3d0fa6042e9ceabd0d984ed6d07df70" - integrity sha512-j4GMCTa8elGyN9A7x7bEglx0VgSpNUG4W4wNedQ33wSMdnkqQCT8HTwOaVSV4e6yQovcu/3Oc4coJP/l0xhL2Q== - dependencies: - chokidar "^4.0.0" - immutable "^5.0.2" - source-map-js ">=0.6.2 <2.0.0" - optionalDependencies: - "@parcel/watcher" "^2.4.1" - -sass@1.83.0: - version "1.83.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.83.0.tgz#e36842c0b88a94ed336fd16249b878a0541d536f" - integrity sha512-qsSxlayzoOjdvXMVLkzF84DJFc2HZEL/rFyGIKbbilYtAvlCxyuzUeff9LawTn4btVnLKg75Z8MMr1lxU1lfGw== +sass@1.83.1: + version "1.83.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.83.1.tgz#dee1ab94b47a6f9993d3195d36f556bcbda64846" + integrity sha512-EVJbDaEs4Rr3F0glJzFSOvtg2/oy2V/YrGFPqPY24UqcLDWcI9ZY5sN+qyO3c/QCZwzgfirvhXvINiJCE/OLcA== dependencies: chokidar "^4.0.0" immutable "^5.0.2" @@ -16383,10 +16097,10 @@ superstatic@^9.1.0: optionalDependencies: re2 "^1.17.7" -supports-color@9.4.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.4.0.tgz#17bfcf686288f531db3dea3215510621ccb55954" - integrity sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw== +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== supports-color@^2.0.0: version "2.0.0" @@ -17596,12 +17310,12 @@ vinyl@^3.0.0: replace-ext "^2.0.0" teex "^1.0.1" -vite@6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/vite/-/vite-6.0.3.tgz#cc01f403e326a9fc1e064235df8a6de084c8a491" - integrity sha512-Cmuo5P0ENTN6HxLSo6IHsjCLn/81Vgrp81oaiFFMRa8gGDj5xEjIcEpf2ZymZtZR8oU0P2JX5WuUp/rlXcHkAw== +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.0" + esbuild "^0.24.2" postcss "^8.4.49" rollup "^4.23.0" optionalDependencies: @@ -18224,12 +17938,7 @@ yallist@^5.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-5.0.0.tgz#00e2de443639ed0d78fd87de0d27469fbcffb533" integrity sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw== -yaml@2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.6.1.tgz#42f2b1ba89203f374609572d5349fb8686500773" - integrity sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg== - -yaml@^2.2.1, yaml@^2.2.2, yaml@^2.4.1: +yaml@2.7.0, yaml@^2.2.1, yaml@^2.2.2, yaml@^2.4.1: version "2.7.0" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.7.0.tgz#aef9bb617a64c937a9a748803786ad8d3ffe1e98" integrity sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA== From 3638f93acc0ca19d4b544fe68375ddfc4196dd1c Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Thu, 9 Jan 2025 12:36:33 +0100 Subject: [PATCH 0024/1220] fix(compiler-cli): handle more node types when extracting dependencies (#59445) Fixes that the HMR dependency extraction logic wasn't handling some node types. Most of these are a bit edge-case-ey in component definitions, but variable initializers and arrow functions can realistically happen in factories. PR Close #59445 --- .../src/ngtsc/hmr/src/extract_dependencies.ts | 39 +++++++--- packages/compiler-cli/test/ngtsc/hmr_spec.ts | 71 +++++++++++++++++++ 2 files changed, 101 insertions(+), 9 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 0d8df658f4b1..f64d5c11a972 100644 --- a/packages/compiler-cli/src/ngtsc/hmr/src/extract_dependencies.ts +++ b/packages/compiler-cli/src/ngtsc/hmr/src/extract_dependencies.ts @@ -210,10 +210,7 @@ class PotentialTopLevelReadsVisitor extends o.RecursiveAstVisitor { } // Identifier referenced at the top level. Unlikely. - if ( - ts.isSourceFile(parent) || - (ts.isExpressionStatement(parent) && parent.expression === node) - ) { + if (ts.isSourceFile(parent)) { return true; } @@ -225,6 +222,7 @@ class PotentialTopLevelReadsVisitor extends o.RecursiveAstVisitor { // Identifier used in a nested expression is only top-level if it's the actual expression. if ( + ts.isExpressionStatement(parent) || ts.isPropertyAccessExpression(parent) || ts.isComputedPropertyName(parent) || ts.isTemplateSpan(parent) || @@ -235,8 +233,6 @@ class PotentialTopLevelReadsVisitor extends o.RecursiveAstVisitor { ts.isIfStatement(parent) || ts.isDoStatement(parent) || ts.isWhileStatement(parent) || - ts.isForInStatement(parent) || - ts.isForOfStatement(parent) || ts.isSwitchStatement(parent) || ts.isCaseClause(parent) || ts.isThrowStatement(parent) @@ -249,17 +245,28 @@ class PotentialTopLevelReadsVisitor extends o.RecursiveAstVisitor { return parent.elements.includes(node); } - // Identifier in a property assignment is only top level if it's the initializer. - if (ts.isPropertyAssignment(parent)) { + // If the parent is an initialized node, the identifier is + // at the top level if it's the initializer itself. + if ( + ts.isPropertyAssignment(parent) || + ts.isParameter(parent) || + ts.isBindingElement(parent) || + ts.isPropertyDeclaration(parent) || + ts.isEnumMember(parent) + ) { return parent.initializer === node; } + // Identifier in a function is top level if it's either the name or the initializer. + if (ts.isVariableDeclaration(parent)) { + return parent.name === node || parent.initializer === node; + } + // Identifier in a declaration is only top level if it's the name. // In shorthand assignments the name is also the value. if ( ts.isClassDeclaration(parent) || ts.isFunctionDeclaration(parent) || - ts.isVariableDeclaration(parent) || ts.isShorthandPropertyAssignment(parent) ) { return parent.name === node; @@ -273,6 +280,20 @@ class PotentialTopLevelReadsVisitor extends o.RecursiveAstVisitor { return parent.left === node || parent.right === node; } + if (ts.isForInStatement(parent) || ts.isForOfStatement(parent)) { + return parent.expression === node || parent.initializer === node; + } + + if (ts.isForStatement(parent)) { + return ( + parent.condition === node || parent.initializer === node || parent.incrementor === node + ); + } + + if (ts.isArrowFunction(parent)) { + return parent.body === node; + } + // It's unlikely that we'll run into imports/exports in this use case. // We handle them since it's simple and for completeness' sake. if (ts.isImportSpecifier(parent) || ts.isExportSpecifier(parent)) { diff --git a/packages/compiler-cli/test/ngtsc/hmr_spec.ts b/packages/compiler-cli/test/ngtsc/hmr_spec.ts index 74e8cfaa22e2..57cf34aea966 100644 --- a/packages/compiler-cli/test/ngtsc/hmr_spec.ts +++ b/packages/compiler-cli/test/ngtsc/hmr_spec.ts @@ -431,5 +431,76 @@ runInEachFileSystem(() => { 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, providers, Component) {', ); }); + + it('should capture variable initializer dependencies', () => { + enableHmr(); + env.write( + 'test.ts', + ` + import {Component, InjectionToken} from '@angular/core'; + + const token = new InjectionToken('TEST'); + const value = 123; + + @Component({ + template: '', + providers: [{ + provide: token, + useFactory: () => { + const v = value; + return v; + } + }] + }) + 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, value, Component]));', + ); + expect(hmrContents).toContain( + 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, token, value, Component) {', + ); + }); + + it('should capture arrow function dependencies', () => { + enableHmr(); + env.write( + 'test.ts', + ` + import {Component, InjectionToken} from '@angular/core'; + + const token = new InjectionToken('TEST'); + const value = 123; + + @Component({ + template: '', + providers: [{ + provide: token, + useFactory: () => value + }] + }) + 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, value, Component]));', + ); + expect(hmrContents).toContain( + 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, token, value, Component) {', + ); + }); }); }); From 205330d46a284e524f13a75fa3040754d428ecf8 Mon Sep 17 00:00:00 2001 From: arturovt Date: Tue, 7 Jan 2025 15:29:08 +0200 Subject: [PATCH 0025/1220] refactor(core): drop platform injection token names in production (#59400) In this commit, we tree-shake the injection token names in production. PR Close #59400 --- .../core/src/application/platform_tokens.ts | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/packages/core/src/application/platform_tokens.ts b/packages/core/src/application/platform_tokens.ts index 268cb162fc66..038ecca0f25c 100644 --- a/packages/core/src/application/platform_tokens.ts +++ b/packages/core/src/application/platform_tokens.ts @@ -26,10 +26,13 @@ import {InjectionToken} from '../di/injection_token'; * * @developerPreview */ -export const REQUEST = new InjectionToken('REQUEST', { - providedIn: 'platform', - factory: () => null, -}); +export const REQUEST = new InjectionToken( + typeof ngDevMode === 'undefined' || ngDevMode ? 'REQUEST' : '', + { + providedIn: 'platform', + factory: () => null, + }, +); /** * Injection token for response initialization options. @@ -49,10 +52,13 @@ export const REQUEST = new InjectionToken('REQUEST', { * * @developerPreview */ -export const RESPONSE_INIT = new InjectionToken('RESPONSE_INIT', { - providedIn: 'platform', - factory: () => null, -}); +export const RESPONSE_INIT = new InjectionToken( + typeof ngDevMode === 'undefined' || ngDevMode ? 'RESPONSE_INIT' : '', + { + providedIn: 'platform', + factory: () => null, + }, +); /** * Injection token for additional request context. @@ -64,7 +70,10 @@ export const RESPONSE_INIT = new InjectionToken('RESPONSE_I * * @developerPreview */ -export const REQUEST_CONTEXT = new InjectionToken('REQUEST_CONTEXT', { - providedIn: 'platform', - factory: () => null, -}); +export const REQUEST_CONTEXT = new InjectionToken( + typeof ngDevMode === 'undefined' || ngDevMode ? 'REQUEST_CONTEXT' : '', + { + providedIn: 'platform', + factory: () => null, + }, +); From 83bd63fa7c91cdaa6f8efc31447e66237f348c8c Mon Sep 17 00:00:00 2001 From: arturovt Date: Thu, 9 Jan 2025 00:38:18 +0200 Subject: [PATCH 0026/1220] refactor(common): drop `NullViewportScroller` for client bundles (#59440) In this commit, we replace the `isPlatformBrowser` runtime call with the `ngServerMode` in order to drop the `NullViewportScroller` for client bundles. PR Close #59440 --- packages/common/src/viewport_scroller.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/common/src/viewport_scroller.ts b/packages/common/src/viewport_scroller.ts index 0aec9d69e4c4..da4f021aac53 100644 --- a/packages/common/src/viewport_scroller.ts +++ b/packages/common/src/viewport_scroller.ts @@ -6,10 +6,9 @@ * found in the LICENSE file at https://angular.dev/license */ -import {inject, PLATFORM_ID, ɵɵdefineInjectable} from '@angular/core'; +import {inject, ɵɵdefineInjectable} from '@angular/core'; import {DOCUMENT} from './dom_tokens'; -import {isPlatformBrowser} from './platform_id'; /** * Defines a scroll position manager. Implemented by `BrowserViewportScroller`. @@ -24,9 +23,9 @@ export abstract class ViewportScroller { token: ViewportScroller, providedIn: 'root', factory: () => - isPlatformBrowser(inject(PLATFORM_ID)) - ? new BrowserViewportScroller(inject(DOCUMENT), window) - : new NullViewportScroller(), + typeof ngServerMode !== 'undefined' && ngServerMode + ? new NullViewportScroller() + : new BrowserViewportScroller(inject(DOCUMENT), window), }); /** From f2e293db4e9053c7132a9d17059a29ae47051009 Mon Sep 17 00:00:00 2001 From: arturovt Date: Thu, 9 Jan 2025 00:04:33 +0200 Subject: [PATCH 0027/1220] refactor(platform-browser): drop Hammer token names in production (#59438) In this commit, we drop `HAMMER_GESTURE_CONFIG` and `HAMMER_LOADER` injection token names in production. PR Close #59438 --- .../platform-browser/src/dom/events/hammer_gestures.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/platform-browser/src/dom/events/hammer_gestures.ts b/packages/platform-browser/src/dom/events/hammer_gestures.ts index 85810769f649..50fc23d83d6a 100644 --- a/packages/platform-browser/src/dom/events/hammer_gestures.ts +++ b/packages/platform-browser/src/dom/events/hammer_gestures.ts @@ -68,7 +68,9 @@ const EVENT_NAMES = { * @ngModule HammerModule * @publicApi */ -export const HAMMER_GESTURE_CONFIG = new InjectionToken('HammerGestureConfig'); +export const HAMMER_GESTURE_CONFIG = new InjectionToken( + typeof ngDevMode === 'undefined' || ngDevMode ? 'HammerGestureConfig' : '', +); /** * Function that loads HammerJS, returning a promise that is resolved once HammerJs is loaded. @@ -84,7 +86,9 @@ export type HammerLoader = () => Promise; * * @publicApi */ -export const HAMMER_LOADER = new InjectionToken('HammerLoader'); +export const HAMMER_LOADER = new InjectionToken( + typeof ngDevMode === 'undefined' || ngDevMode ? 'HammerLoader' : '', +); export interface HammerInstance { on(eventName: string, callback?: Function): void; From e194573d0d233171ec1815f0ef670e22a0e1168e Mon Sep 17 00:00:00 2001 From: arturovt Date: Wed, 8 Jan 2025 00:50:52 +0200 Subject: [PATCH 0028/1220] refactor(common): tree-shake fetch backend (#59418) This commit updates the code of the HTTP code to make the `FetchBackend` class tree-shakable. The class is only needed with `withFetch()` is called and it should not be included into bundles that do not use that feature. PR Close #59418 --- packages/common/http/src/fetch.ts | 10 +++++++++- packages/common/http/src/provider.ts | 5 +++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/packages/common/http/src/fetch.ts b/packages/common/http/src/fetch.ts index 4262be85839b..cef621d3aaac 100644 --- a/packages/common/http/src/fetch.ts +++ b/packages/common/http/src/fetch.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -import {inject, Injectable, NgZone} from '@angular/core'; +import {inject, Injectable, InjectionToken, NgZone} from '@angular/core'; import {Observable, Observer} from 'rxjs'; import {HttpBackend} from './backend'; @@ -39,6 +39,14 @@ function getResponseUrl(response: Response): string | null { return response.headers.get(xRequestUrl); } +/** + * An internal injection token to reference `FetchBackend` implementation + * in a tree-shakable way. + */ +export const FETCH_BACKEND = new InjectionToken( + typeof ngDevMode === 'undefined' || ngDevMode ? 'FETCH_BACKEND' : '', +); + /** * Uses `fetch` to send requests to a backend server. * diff --git a/packages/common/http/src/provider.ts b/packages/common/http/src/provider.ts index 3390c12d54f1..be6806acd3c5 100644 --- a/packages/common/http/src/provider.ts +++ b/packages/common/http/src/provider.ts @@ -16,7 +16,7 @@ import { import {HttpBackend, HttpHandler} from './backend'; import {HttpClient} from './client'; -import {FetchBackend} from './fetch'; +import {FETCH_BACKEND, FetchBackend} from './fetch'; import { HTTP_INTERCEPTOR_FNS, HttpInterceptorFn, @@ -128,7 +128,7 @@ export function provideHttpClient( { provide: HttpBackend, useFactory: () => { - return inject(FetchBackend, {optional: true}) ?? inject(HttpXhrBackend); + return inject(FETCH_BACKEND, {optional: true}) ?? inject(HttpXhrBackend); }, }, { @@ -305,6 +305,7 @@ export function withRequestsMadeViaParent(): HttpFeature { return makeHttpFeature(HttpFeatureKind.Fetch, [ FetchBackend, + {provide: FETCH_BACKEND, useExisting: FetchBackend}, {provide: HttpBackend, useExisting: FetchBackend}, ]); } From 17234213f6d33fa7b9ab93fd9f01a798e5859b68 Mon Sep 17 00:00:00 2001 From: arturovt Date: Tue, 7 Jan 2025 18:30:08 +0200 Subject: [PATCH 0029/1220] refactor(platform-browser): remove `Console` from Hammer gestures (#59409) Injecting the `Console` is redundant because it directly calls the global `console` object. There is no reason to reference this class in Hammer gestures, as it is only used in development mode. We can safely call the `console` object directly. PR Close #59409 --- .../src/dom/events/hammer_gestures.ts | 19 ++++++++------- .../test/dom/events/hammer_gestures_spec.ts | 23 ++++++++++--------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/packages/platform-browser/src/dom/events/hammer_gestures.ts b/packages/platform-browser/src/dom/events/hammer_gestures.ts index 50fc23d83d6a..ae408e8f24b2 100644 --- a/packages/platform-browser/src/dom/events/hammer_gestures.ts +++ b/packages/platform-browser/src/dom/events/hammer_gestures.ts @@ -11,9 +11,9 @@ import { Inject, Injectable, InjectionToken, + Injector, NgModule, Optional, - Provider, ɵConsole as Console, } from '@angular/core'; @@ -178,7 +178,7 @@ export class HammerGesturesPlugin extends EventManagerPlugin { constructor( @Inject(DOCUMENT) doc: any, @Inject(HAMMER_GESTURE_CONFIG) private _config: HammerGestureConfig, - private console: Console, + private _injector: Injector, @Optional() @Inject(HAMMER_LOADER) private loader?: HammerLoader | null, ) { super(doc); @@ -191,7 +191,10 @@ export class HammerGesturesPlugin extends EventManagerPlugin { if (!(window as any).Hammer && !this.loader) { if (typeof ngDevMode === 'undefined' || ngDevMode) { - this.console.warn( + // Get a `Console` through an injector to tree-shake the + // class when it is unused in production. + const _console = this._injector.get(Console); + _console.warn( `The "${eventName}" event cannot be bound because Hammer.JS is not ` + `loaded and no custom loader has been specified.`, ); @@ -223,9 +226,8 @@ export class HammerGesturesPlugin extends EventManagerPlugin { // If Hammer isn't actually loaded when the custom loader resolves, give up. if (!(window as any).Hammer) { if (typeof ngDevMode === 'undefined' || ngDevMode) { - this.console.warn( - `The custom HAMMER_LOADER completed, but Hammer.JS is not present.`, - ); + const _console = this._injector.get(Console); + _console.warn(`The custom HAMMER_LOADER completed, but Hammer.JS is not present.`); } deregister = () => {}; return; @@ -239,7 +241,8 @@ export class HammerGesturesPlugin extends EventManagerPlugin { } }).catch(() => { if (typeof ngDevMode === 'undefined' || ngDevMode) { - this.console.warn( + const _console = this._injector.get(Console); + _console.warn( `The "${eventName}" event cannot be bound because the custom ` + `Hammer.JS loader failed.`, ); @@ -297,7 +300,7 @@ export class HammerGesturesPlugin extends EventManagerPlugin { provide: EVENT_MANAGER_PLUGINS, useClass: HammerGesturesPlugin, multi: true, - deps: [DOCUMENT, HAMMER_GESTURE_CONFIG, Console, [new Optional(), HAMMER_LOADER]], + deps: [DOCUMENT, HAMMER_GESTURE_CONFIG, Injector, [new Optional(), HAMMER_LOADER]], }, {provide: HAMMER_GESTURE_CONFIG, useClass: HammerGestureConfig, deps: []}, ], diff --git a/packages/platform-browser/test/dom/events/hammer_gestures_spec.ts b/packages/platform-browser/test/dom/events/hammer_gestures_spec.ts index 30553e1d7ca6..7cf6a28bd0dd 100644 --- a/packages/platform-browser/test/dom/events/hammer_gestures_spec.ts +++ b/packages/platform-browser/test/dom/events/hammer_gestures_spec.ts @@ -15,7 +15,6 @@ import { describe('HammerGesturesPlugin', () => { let plugin: HammerGesturesPlugin; - let fakeConsole: any; if (isNode) { // Jasmine will throw if there are no tests. @@ -23,18 +22,15 @@ describe('HammerGesturesPlugin', () => { return; } - beforeEach(() => { - fakeConsole = {warn: jasmine.createSpy('console.warn')}; - }); - describe('with no custom loader', () => { beforeEach(() => { - plugin = new HammerGesturesPlugin(document, new HammerGestureConfig(), fakeConsole); + plugin = new HammerGesturesPlugin(document, new HammerGestureConfig(), TestBed); }); it('should warn user and do nothing when Hammer.js not loaded', () => { + const warnSpy = spyOn(console, 'warn'); expect(plugin.supports('swipe')).toBe(false); - expect(fakeConsole.warn).toHaveBeenCalledWith( + expect(warnSpy).toHaveBeenCalledWith( `The "swipe" event cannot be bound because Hammer.JS is not ` + `loaded and no custom loader has been specified.`, ); @@ -90,7 +86,7 @@ describe('HammerGesturesPlugin', () => { const hammerConfig = new HammerGestureConfig(); spyOn(hammerConfig, 'buildHammer').and.returnValue(fakeHammerInstance); - plugin = new HammerGesturesPlugin(document, hammerConfig, fakeConsole, loader); + plugin = new HammerGesturesPlugin(document, hammerConfig, TestBed, loader); // Use a fake EventManager that has access to the NgZone. plugin.manager = {getZone: () => ngZone} as EventManager; @@ -114,8 +110,9 @@ describe('HammerGesturesPlugin', () => { }); it('should not log a warning when HammerJS is not loaded', () => { + const warnSpy = spyOn(console, 'warn'); plugin.addEventListener(someElement, 'swipe', () => {}); - expect(fakeConsole.warn).not.toHaveBeenCalled(); + expect(warnSpy).not.toHaveBeenCalled(); }); it('should defer registering an event until Hammer is loaded', fakeAsync(() => { @@ -152,21 +149,25 @@ describe('HammerGesturesPlugin', () => { })); it('should log a warning when the loader fails', fakeAsync(() => { + const warnSpy = spyOn(console, 'warn'); + plugin.addEventListener(someElement, 'swipe', () => {}); failLoader(); tick(); - expect(fakeConsole.warn).toHaveBeenCalledWith( + expect(warnSpy).toHaveBeenCalledWith( `The "swipe" event cannot be bound because the custom Hammer.JS loader failed.`, ); })); it('should load a warning if the loader resolves and Hammer is not present', fakeAsync(() => { + const warnSpy = spyOn(console, 'warn'); + plugin.addEventListener(someElement, 'swipe', () => {}); resolveLoader(); tick(); - expect(fakeConsole.warn).toHaveBeenCalledWith( + expect(warnSpy).toHaveBeenCalledWith( `The custom HAMMER_LOADER completed, but Hammer.JS is not present.`, ); })); From 5884153e1281c73cde79757ebbaad169ccd63df4 Mon Sep 17 00:00:00 2001 From: arturovt Date: Tue, 7 Jan 2025 18:14:03 +0200 Subject: [PATCH 0030/1220] refactor(animations): drop warning functions in production (#59408) Prior to this commit, functions that issued warnings were not wrapped with `ngDevMode` at the point of invocation but had the `ngDevMode` check inside. This meant they acted as no-ops in production. In this commit, we wrap them externally with `ngDevMode`, so they are entirely removed. PR Close #59408 --- .../animations/browser/src/dsl/animation.ts | 6 ++-- .../src/render/animation_engine_next.ts | 6 ++-- .../src/render/timeline_animation_engine.ts | 6 ++-- .../animations/browser/src/warning_helpers.ts | 28 ++++++++----------- 4 files changed, 24 insertions(+), 22 deletions(-) diff --git a/packages/animations/browser/src/dsl/animation.ts b/packages/animations/browser/src/dsl/animation.ts index 7f82f5595372..4abb823b2a8e 100644 --- a/packages/animations/browser/src/dsl/animation.ts +++ b/packages/animations/browser/src/dsl/animation.ts @@ -35,8 +35,10 @@ export class Animation { if (errors.length) { throw validationFailed(errors); } - if (warnings.length) { - warnValidation(warnings); + if (typeof ngDevMode === 'undefined' || ngDevMode) { + if (warnings.length) { + warnValidation(warnings); + } } this._animationAst = ast; } diff --git a/packages/animations/browser/src/render/animation_engine_next.ts b/packages/animations/browser/src/render/animation_engine_next.ts index 8cec1571a828..08b31f941f20 100644 --- a/packages/animations/browser/src/render/animation_engine_next.ts +++ b/packages/animations/browser/src/render/animation_engine_next.ts @@ -61,8 +61,10 @@ export class AnimationEngine { if (errors.length) { throw triggerBuildFailed(name, errors); } - if (warnings.length) { - warnTriggerBuild(name, warnings); + if (typeof ngDevMode === 'undefined' || ngDevMode) { + if (warnings.length) { + warnTriggerBuild(name, warnings); + } } trigger = buildTrigger(name, ast, this._normalizer); this._triggerCache[cacheKey] = trigger; diff --git a/packages/animations/browser/src/render/timeline_animation_engine.ts b/packages/animations/browser/src/render/timeline_animation_engine.ts index 6ac2fb888b2f..92bca59acb05 100644 --- a/packages/animations/browser/src/render/timeline_animation_engine.ts +++ b/packages/animations/browser/src/render/timeline_animation_engine.ts @@ -58,8 +58,10 @@ export class TimelineAnimationEngine { if (errors.length) { throw registerFailed(errors); } else { - if (warnings.length) { - warnRegister(warnings); + if (typeof ngDevMode === 'undefined' || ngDevMode) { + if (warnings.length) { + warnRegister(warnings); + } } this._animations.set(id, ast); } diff --git a/packages/animations/browser/src/warning_helpers.ts b/packages/animations/browser/src/warning_helpers.ts index 08e459c20e76..77ffba89c722 100644 --- a/packages/animations/browser/src/warning_helpers.ts +++ b/packages/animations/browser/src/warning_helpers.ts @@ -15,31 +15,27 @@ function createListOfWarnings(warnings: string[]): string { } export function warnValidation(warnings: string[]): void { - (typeof ngDevMode === 'undefined' || ngDevMode) && - console.warn(`animation validation warnings:${createListOfWarnings(warnings)}`); + console.warn(`animation validation warnings:${createListOfWarnings(warnings)}`); } export function warnTriggerBuild(name: string, warnings: string[]): void { - (typeof ngDevMode === 'undefined' || ngDevMode) && - console.warn( - `The animation trigger "${name}" has built with the following warnings:${createListOfWarnings( - warnings, - )}`, - ); + console.warn( + `The animation trigger "${name}" has built with the following warnings:${createListOfWarnings( + warnings, + )}`, + ); } export function warnRegister(warnings: string[]): void { - (typeof ngDevMode === 'undefined' || ngDevMode) && - console.warn(`Animation built with the following warnings:${createListOfWarnings(warnings)}`); + console.warn(`Animation built with the following warnings:${createListOfWarnings(warnings)}`); } export function triggerParsingWarnings(name: string, warnings: string[]): void { - (typeof ngDevMode === 'undefined' || ngDevMode) && - console.warn( - `Animation parsing for the ${name} trigger presents the following warnings:${createListOfWarnings( - warnings, - )}`, - ); + console.warn( + `Animation parsing for the ${name} trigger presents the following warnings:${createListOfWarnings( + warnings, + )}`, + ); } export function pushUnrecognizedPropertiesWarning(warnings: string[], props: string[]): void { From 21f1ba22a6d81d8220c95bd7bd003b82e76ce76c Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Thu, 9 Jan 2025 10:52:55 -0800 Subject: [PATCH 0031/1220] Revert "fix(core): Don't run effects in check no changes pass (#58250)" (#59455) This reverts commit a5fc9620948c59da2146d46d27de388839b93254. PR Close #59455 --- packages/core/src/render3/instructions/change_detection.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/core/src/render3/instructions/change_detection.ts b/packages/core/src/render3/instructions/change_detection.ts index 05b227fda383..84f152979ef1 100644 --- a/packages/core/src/render3/instructions/change_detection.ts +++ b/packages/core/src/render3/instructions/change_detection.ts @@ -498,9 +498,7 @@ function detectChangesInView(lView: LView, mode: ChangeDetectionMode) { if (shouldRefreshView) { refreshView(tView, lView, tView.template, lView[CONTEXT]); } else if (flags & LViewFlags.HasChildViewsToRefresh) { - if (!isInCheckNoChangesPass) { - runEffectsInView(lView); - } + runEffectsInView(lView); detectChangesInEmbeddedViews(lView, ChangeDetectionMode.Targeted); const components = tView.components; if (components !== null) { From ac2dbe3eb1205ce0683c69c801c1eeb2b5adfc1b Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Thu, 9 Jan 2025 10:53:06 -0800 Subject: [PATCH 0032/1220] Revert "fix(core): Defer afterRender until after first CD (#58250)" (#59455) This reverts commit 9870b643bff46f089a3f0a30514fb7e062a66d56. PR Close #59455 --- .../core/src/application/application_ref.ts | 17 +- .../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, 138 insertions(+), 198 deletions(-) delete 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 41d91593550c..349f5de9657c 100644 --- a/packages/core/src/application/application_ref.ts +++ b/packages/core/src/application/application_ref.ts @@ -44,9 +44,9 @@ import {TESTABILITY} from '../testability/testability'; import {isPromise} from '../util/lang'; import {NgZone} from '../zone/ng_zone'; -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'; /** * A DI token that provides a set of callbacks to @@ -321,6 +321,13 @@ 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. * @@ -640,6 +647,10 @@ 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) { this.synchronizeOnce(); @@ -660,6 +671,10 @@ 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 352c92824e57..5812ae553337 100644 --- a/packages/core/src/change_detection/scheduling/zoneless_scheduling.ts +++ b/packages/core/src/change_detection/scheduling/zoneless_scheduling.ts @@ -33,6 +33,7 @@ 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 453aaafea219..433c7f956634 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, - PROVIDED_ZONELESS, - SCHEDULE_IN_ROOT_ZONE, ZONELESS_ENABLED, + PROVIDED_ZONELESS, ZONELESS_SCHEDULER_DISABLED, + SCHEDULE_IN_ROOT_ZONE, } from './zoneless_scheduling'; import {TracingService} from '../../application/tracing'; @@ -140,6 +140,13 @@ 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 f66c86f156d6..75b69acbc46a 100644 --- a/packages/core/src/defer/dom_triggers.ts +++ b/packages/core/src/defer/dom_triggers.ts @@ -6,9 +6,8 @@ * 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'; @@ -281,11 +280,9 @@ 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; } @@ -297,7 +294,6 @@ export function registerDomTrigger( renderedState !== DeferBlockInternalState.Initial && renderedState !== DeferBlockState.Placeholder ) { - poll.destroy(); return; } @@ -305,12 +301,10 @@ export function registerDomTrigger( // Keep polling until we resolve the trigger's LView. if (!triggerLView) { - // Keep polling. + afterNextRender({read: pollDomTrigger}, {injector}); return; } - poll.destroy(); - // It's possible that the trigger's view was destroyed before we resolved the trigger element. if (isDestroyed(triggerLView)) { return; @@ -345,5 +339,5 @@ export function registerDomTrigger( } // Begin polling for the trigger. - poll = afterRender({read: pollDomTrigger}, {injector}); + afterNextRender({read: pollDomTrigger}, {injector}); } diff --git a/packages/core/src/render3/after_render/hooks.ts b/packages/core/src/render3/after_render/hooks.ts index 9e4008fc42f6..faae30a83e4e 100644 --- a/packages/core/src/render3/after_render/hooks.ts +++ b/packages/core/src/render3/after_render/hooks.ts @@ -13,7 +13,6 @@ 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, @@ -460,11 +459,9 @@ 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 f29b8258f019..8472188da363 100644 --- a/packages/core/src/render3/after_render/manager.ts +++ b/packages/core/src/render3/after_render/manager.ts @@ -6,19 +6,17 @@ * found in the LICENSE file at https://angular.dev/license */ -import {TracingAction, TracingService, TracingSnapshot} from '../../application/tracing'; +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 { 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 {NgZone} from '../../zone'; -import {AFTER_RENDER_SEQUENCES_TO_ADD, FLAGS, LView, LViewFlags} from '../interfaces/view'; -import {markAncestorsForTraversal} from '../util/view_utils'; -import {AfterRenderPhase, AfterRenderRef} from './api'; +import {TracingAction, TracingService, TracingSnapshot} from '../../application/tracing'; export class AfterRenderManager { impl: AfterRenderImpl | null = null; @@ -104,34 +102,22 @@ export class AfterRenderImpl { this.sequences.add(sequence); } if (this.deferredRegistrations.size > 0) { - this.scheduler.notify(NotificationSource.RenderHook); + this.scheduler.notify(NotificationSource.DeferredRenderHook); } this.deferredRegistrations.clear(); } register(sequence: AfterRenderSequence): void { - 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); + 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); } 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. @@ -186,7 +172,6 @@ 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, @@ -209,9 +194,5 @@ 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 deleted file mode 100644 index a84febc587fb..000000000000 --- a/packages/core/src/render3/after_render/view.ts +++ /dev/null @@ -1,18 +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 {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 84f152979ef1..06fe193302da 100644 --- a/packages/core/src/render3/instructions/change_detection.ts +++ b/packages/core/src/render3/instructions/change_detection.ts @@ -17,7 +17,6 @@ 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, RenderFlags} from '../interfaces/definition'; @@ -34,8 +33,8 @@ import { TView, } from '../interfaces/view'; import { - getOrBorrowReactiveLViewConsumer, getOrCreateTemporaryConsumer, + getOrBorrowReactiveLViewConsumer, maybeReturnReactiveLViewConsumer, ReactiveLViewConsumer, viewShouldHaveReactiveConsumer, @@ -62,8 +61,6 @@ import { viewAttachedToChangeDetector, } from '../util/view_utils'; -import {isDestroyed} from '../interfaces/type_checks'; -import {runEffectsInView} from '../reactivity/view_effect_runner'; import { executeTemplate, executeViewQueryFn, @@ -71,6 +68,8 @@ import { processHostBindingOpCodes, refreshContentQueries, } from './shared'; +import {runEffectsInView} from '../reactivity/view_effect_runner'; +import {isDestroyed} from '../interfaces/type_checks'; /** * The maximum number of times the change detection traversal will rerun before throwing an error. @@ -356,8 +355,6 @@ 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) { @@ -504,9 +501,6 @@ 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 56d88c003f8a..9a22a958927e 100644 --- a/packages/core/src/render3/interfaces/view.ts +++ b/packages/core/src/render3/interfaces/view.ts @@ -13,7 +13,6 @@ 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'; @@ -68,7 +67,6 @@ 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. @@ -77,7 +75,7 @@ export const AFTER_RENDER_SEQUENCES_TO_ADD = 25; * 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 = 26; +export const HEADER_OFFSET = 25; // 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 @@ -364,9 +362,6 @@ 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 616c0f1d95f1..e51db04d93dd 100644 --- a/packages/core/src/render3/reactivity/after_render_effect.ts +++ b/packages/core/src/render3/reactivity/after_render_effect.ts @@ -19,26 +19,24 @@ 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 {LView} from '../interfaces/view'; -import {ViewContext} from '../view_context'; +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 {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>(); @@ -176,14 +174,13 @@ 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], view, false, destroyRef, snapshot); + super(impl, [undefined, undefined, undefined, undefined], false, destroyRef, snapshot); // Setup a reactive node for each phase. for (const phase of AFTER_RENDER_PHASES) { @@ -383,12 +380,9 @@ 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 0ab9ebb9089c..368e27b9dc59 100644 --- a/packages/core/test/acceptance/after_render_hook_spec.ts +++ b/packages/core/test/acceptance/after_render_hook_spec.ts @@ -8,10 +8,8 @@ import {PLATFORM_BROWSER_ID, PLATFORM_SERVER_ID} from '@angular/common/src/platform_id'; import { - AfterRenderPhase, AfterRenderRef, ApplicationRef, - ChangeDetectionStrategy, ChangeDetectorRef, Component, ErrorHandler, @@ -27,14 +25,15 @@ 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, { @@ -164,28 +163,28 @@ describe('after render hooks', () => { const viewContainerRef = compInstance.viewContainerRef; const dynamicCompRef = viewContainerRef.createComponent(DynamicComp); expect(dynamicCompRef.instance.afterRenderCount).toBe(0); - expect(compInstance.afterRenderCount).toBe(0); + expect(compInstance.afterRenderCount).toBe(1); // Running change detection at the dynamicCompRef level dynamicCompRef.changeDetectorRef.detectChanges(); expect(dynamicCompRef.instance.afterRenderCount).toBe(0); - expect(compInstance.afterRenderCount).toBe(0); + expect(compInstance.afterRenderCount).toBe(1); // Running change detection at the compInstance level compInstance.changeDetectorRef.detectChanges(); expect(dynamicCompRef.instance.afterRenderCount).toBe(0); - expect(compInstance.afterRenderCount).toBe(0); + expect(compInstance.afterRenderCount).toBe(1); // Running change detection at the Application level fixture.detectChanges(); expect(dynamicCompRef.instance.afterRenderCount).toBe(1); - expect(compInstance.afterRenderCount).toBe(1); + expect(compInstance.afterRenderCount).toBe(2); // Running change detection after removing view. viewContainerRef.remove(); fixture.detectChanges(); expect(dynamicCompRef.instance.afterRenderCount).toBe(1); - expect(compInstance.afterRenderCount).toBe(2); + expect(compInstance.afterRenderCount).toBe(3); }); it('should run all hooks after outer change detection', () => { @@ -232,7 +231,7 @@ describe('after render hooks', () => { expect(log).toEqual([]); TestBed.inject(ApplicationRef).tick(); - expect(log).toEqual(['pre-cd', 'post-cd', 'child-comp', 'parent-comp']); + expect(log).toEqual(['pre-cd', 'post-cd', 'parent-comp', 'child-comp']); }); it('should run hooks once after tick even if there are multiple root views', () => { @@ -297,6 +296,56 @@ 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[] = []; @@ -924,7 +973,7 @@ describe('after render hooks', () => { expect(log).toEqual([]); TestBed.inject(ApplicationRef).tick(); - expect(log).toEqual(['pre-cd', 'post-cd', 'child-comp', 'parent-comp']); + expect(log).toEqual(['pre-cd', 'post-cd', 'parent-comp', 'child-comp']); }); it('should unsubscribe when calling destroy', () => { @@ -994,24 +1043,24 @@ describe('after render hooks', () => { ); }); - it('should process inner hook within same tick with CD in between', () => { + it('should defer nested hooks to the next cycle', () => { + let outerHookCount = 0; + let innerHookCount = 0; + @Component({ selector: 'comp', standalone: false, - template: `{{outerHookCount()}}:{{innerHookCount}}`, - changeDetection: ChangeDetectionStrategy.OnPush, }) class Comp { injector = inject(Injector); - outerHookCount = signal(0); - innerHookCount = 0; constructor() { afterNextRender(() => { - this.outerHookCount.update((v) => v + 1); + outerHookCount++; + afterNextRender( () => { - this.innerHookCount++; + innerHookCount++; }, {injector: this.injector}, ); @@ -1023,77 +1072,26 @@ describe('after render hooks', () => { declarations: [Comp], ...COMMON_CONFIGURATION, }); - const ref = createAndAttachComponent(Comp); - const instance = ref.instance; + createAndAttachComponent(Comp); // It hasn't run at all - expect(instance.outerHookCount()).toBe(0); - expect(instance.innerHookCount).toBe(0); + expect(outerHookCount).toBe(0); + expect(innerHookCount).toBe(0); // Running change detection (first time) TestBed.inject(ApplicationRef).tick(); - 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'); + expect(outerHookCount).toBe(1); + expect(innerHookCount).toBe(0); // Running change detection (second time) TestBed.inject(ApplicationRef).tick(); - 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']); + expect(outerHookCount).toBe(1); + expect(innerHookCount).toBe(1); - // Re-attach component and run change detection. - ref.instance.changeDetectorRef.reattach(); + // Running change detection (third time) TestBed.inject(ApplicationRef).tick(); - expect(log).toEqual(['env hook', 'comp hook']); + expect(outerHookCount).toBe(1); + expect(innerHookCount).toBe(1); }); 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 533624c21ead..5acf143394fa 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,15 +85,9 @@ describe('TracingService', () => { } } - 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, - ]); + TestBed.createComponent(App); + expect(mockTracingService.snapshot).toHaveBeenCalledTimes(2); + expect(actions).toEqual([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 76e075c14d29..8a87f31dbe3f 100644 --- a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json @@ -199,7 +199,6 @@ "_platformInjector", "_wasLastNodeCreated", "activeConsumer", - "addAfterRenderSequencesForView", "addClass", "addPropertyBinding", "addToEndOfViewTree", diff --git a/packages/core/test/bundling/animations/bundle.golden_symbols.json b/packages/core/test/bundling/animations/bundle.golden_symbols.json index 93ed4b8e31d0..740e55719b0f 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 @@ "_testabilityGetter", "_wasLastNodeCreated", "activeConsumer", - "addAfterRenderSequencesForView", "addClass", "addPropertyBinding", "addToEndOfViewTree", 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 85db2f696e7d..3b4ffbb56007 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -166,7 +166,6 @@ "_testabilityGetter", "_wasLastNodeCreated", "activeConsumer", - "addAfterRenderSequencesForView", "addPropertyBinding", "addToEndOfViewTree", "allocExpando", diff --git a/packages/core/test/bundling/defer/bundle.golden_symbols.json b/packages/core/test/bundling/defer/bundle.golden_symbols.json index 70c6defa4127..4a893cbb6199 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -204,7 +204,6 @@ "_retrieveHydrationInfoImpl", "_wasLastNodeCreated", "activeConsumer", - "addAfterRenderSequencesForView", "addDepsToRegistry", "addPropertyBinding", "addToEndOfViewTree", @@ -724,7 +723,6 @@ "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 010c42a9a290..3d4ae74ec6f7 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -236,7 +236,6 @@ "_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 0a17d416bccb..5725362e1cc8 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 @@ -230,7 +230,6 @@ "_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 611c535d1382..068f9e07976c 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 @@ "_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 29727aeb828c..2571522c11d9 100644 --- a/packages/core/test/bundling/hydration/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hydration/bundle.golden_symbols.json @@ -170,7 +170,6 @@ "_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 9aa97309c7b1..c64db860890a 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -277,7 +277,6 @@ "_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 19874c9a0f39..c72a093c813c 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 @@ "_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 a1f81dbaa1b3..60c9fcaffd31 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -195,7 +195,6 @@ "_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 5f28d71609cd..b8d518a321e0 100644 --- a/packages/platform-server/test/full_app_hydration_spec.ts +++ b/packages/platform-server/test/full_app_hydration_spec.ts @@ -60,12 +60,10 @@ import { stripUtilAttributes, } from './dom_utils'; import { - clearConsole, EMPTY_TEXT_NODE_COMMENT, getComponentRef, getHydrationInfoFromTransferState, NGH_ATTR_NAME, - resetNgDevModeCounters, ssr, stripExcessiveSpaces, stripSsrIntegrityMarker, @@ -75,7 +73,6 @@ import { verifyAllChildNodesClaimedForHydration, verifyAllNodesClaimedForHydration, verifyClientAndSSRContentsMatch, - verifyEmptyConsole, verifyHasLog, verifyHasNoLog, verifyNodeHasMismatchInfo, @@ -83,6 +80,9 @@ import { verifyNoNodesWereClaimedForHydration, withDebugConsole, withNoopErrorHandler, + verifyEmptyConsole, + clearConsole, + resetNgDevModeCounters, } from './hydration_utils'; import {CLIENT_RENDER_MODE_FLAG} from '@angular/core/src/hydration/api'; @@ -2071,7 +2071,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', ); }); @@ -2125,7 +2125,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', ); }); @@ -2366,7 +2366,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 c1bc06c337761a427eb3a54b09ec3a7e9c261818 Mon Sep 17 00:00:00 2001 From: Doug Parker Date: Thu, 9 Jan 2025 10:43:39 -0800 Subject: [PATCH 0033/1220] release: bump Angular DevTools version to 1.0.20 (#59454) PR Close #59454 --- .../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 bc7f82ca9b78..995bfafce2ec 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.19", - "version_name": "1.0.19", + "version": "1.0.20", + "version_name": "1.0.20", "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 9e00df987b39..3743dd37d862 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.19", + "version": "1.0.20", "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'", "icons": { "16": "assets/icon16.png", From d51d67b725727c36f6def7b111cd9816525a966c Mon Sep 17 00:00:00 2001 From: arturovt Date: Wed, 8 Jan 2025 08:43:07 +0200 Subject: [PATCH 0034/1220] refactor(common): prevent duplicating `X-Request-URL` (#59420) The `X-Request-URL` string is duplicated in multiple places. It is worth moving it to a shared constant that would be minified to something like `const a = "X-Request-URL"` and referenced in all the used places. PR Close #59420 --- packages/common/http/src/fetch.ts | 6 ++---- packages/common/http/src/request.ts | 7 +++++++ packages/common/http/src/xhr.ts | 8 +++++--- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/packages/common/http/src/fetch.ts b/packages/common/http/src/fetch.ts index cef621d3aaac..8920032112d1 100644 --- a/packages/common/http/src/fetch.ts +++ b/packages/common/http/src/fetch.ts @@ -11,7 +11,7 @@ import {Observable, Observer} from 'rxjs'; import {HttpBackend} from './backend'; import {HttpHeaders} from './headers'; -import {HttpRequest} from './request'; +import {HttpRequest, X_REQUEST_URL_HEADER} from './request'; import { HTTP_STATUS_CODE_OK, HttpDownloadProgressEvent, @@ -24,8 +24,6 @@ import { const XSSI_PREFIX = /^\)\]\}',?\n/; -const REQUEST_URL_HEADER = `X-Request-URL`; - /** * Determine an appropriate URL for the response, by checking either * response url or the X-Request-URL header. @@ -35,7 +33,7 @@ function getResponseUrl(response: Response): string | null { return response.url; } // stored as lowercase in the map - const xRequestUrl = REQUEST_URL_HEADER.toLocaleLowerCase(); + const xRequestUrl = X_REQUEST_URL_HEADER.toLocaleLowerCase(); return response.headers.get(xRequestUrl); } diff --git a/packages/common/http/src/request.ts b/packages/common/http/src/request.ts index fe900d36d150..c1344d02e40f 100644 --- a/packages/common/http/src/request.ts +++ b/packages/common/http/src/request.ts @@ -77,6 +77,13 @@ function isUrlSearchParams(value: any): value is URLSearchParams { return typeof URLSearchParams !== 'undefined' && value instanceof URLSearchParams; } +/** + * `X-Request-URL` is a custom HTTP header used in older browser versions, + * including Firefox (< 32), Chrome (< 37), Safari (< 8), and Internet Explorer, + * to include the full URL of the request in cross-origin requests. + */ +export const X_REQUEST_URL_HEADER = 'X-Request-URL'; + /** * An outgoing HTTP request with an optional typed body. * diff --git a/packages/common/http/src/xhr.ts b/packages/common/http/src/xhr.ts index d6896793cd43..179bd735e9a9 100644 --- a/packages/common/http/src/xhr.ts +++ b/packages/common/http/src/xhr.ts @@ -14,7 +14,7 @@ import {switchMap} from 'rxjs/operators'; import {HttpBackend} from './backend'; import {RuntimeErrorCode} from './errors'; import {HttpHeaders} from './headers'; -import {HttpRequest} from './request'; +import {HttpRequest, X_REQUEST_URL_HEADER} from './request'; import { HTTP_STATUS_CODE_NO_CONTENT, HTTP_STATUS_CODE_OK, @@ -30,6 +30,8 @@ import { const XSSI_PREFIX = /^\)\]\}',?\n/; +const X_REQUEST_URL_REGEXP = RegExp(`^${X_REQUEST_URL_HEADER}:`, 'm'); + /** * Determine an appropriate URL for the response, by checking either * XMLHttpRequest.responseURL or the X-Request-URL header. @@ -38,8 +40,8 @@ function getResponseUrl(xhr: any): string | null { if ('responseURL' in xhr && xhr.responseURL) { return xhr.responseURL; } - if (/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())) { - return xhr.getResponseHeader('X-Request-URL'); + if (X_REQUEST_URL_REGEXP.test(xhr.getAllResponseHeaders())) { + return xhr.getResponseHeader(X_REQUEST_URL_HEADER); } return null; } From a4164141a38e03becad32b9e71d1f4243cc06461 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Thu, 9 Jan 2025 16:24:07 -0500 Subject: [PATCH 0035/1220] fix(compiler): use chunk origin in template HMR request URL (#59459) The URL that is dynamically imported to fetch a potential component update for HMR is now based on the value of `import.meta.url`. This ensures that the request is sent to the same location that was used to retrieve the application code. For some development server setups the HTML base HREF may not be the location of the Angular development server. By using the application code location which was generated by the development server, HMR requests can continue to work as expected in these scenarios. In most common cases, this change will not have any effect as the HTML base HREF aligns with the location of the application code files. PR Close #59459 --- packages/compiler-cli/test/ngtsc/hmr_spec.ts | 4 ++-- packages/compiler/src/render3/r3_hmr_compiler.ts | 10 ++++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/compiler-cli/test/ngtsc/hmr_spec.ts b/packages/compiler-cli/test/ngtsc/hmr_spec.ts index 57cf34aea966..419a13b4d887 100644 --- a/packages/compiler-cli/test/ngtsc/hmr_spec.ts +++ b/packages/compiler-cli/test/ngtsc/hmr_spec.ts @@ -106,7 +106,7 @@ runInEachFileSystem(() => { expect(jsContents).toContain(`import * as i0 from "@angular/core";`); expect(jsContents).toContain('function Cmp_HmrLoad(t) {'); expect(jsContents).toContain( - 'import(/* @vite-ignore */\n"/@ng/component?c=test.ts%40Cmp&t=" + encodeURIComponent(t))', + 'import(/* @vite-ignore */\nnew URL("/@ng/component?c=test.ts%40Cmp&t=" + encodeURIComponent(t), import.meta.url).href)', ); expect(jsContents).toContain( ').then(m => m.default && i0.ɵɵreplaceMetadata(Cmp, m.default, [i0], ' + @@ -173,7 +173,7 @@ runInEachFileSystem(() => { expect(jsContents).toContain(`import * as i1 from "./dep";`); expect(jsContents).toContain('function Cmp_HmrLoad(t) {'); expect(jsContents).toContain( - 'import(/* @vite-ignore */\n"/@ng/component?c=test.ts%40Cmp&t=" + encodeURIComponent(t))', + 'import(/* @vite-ignore */\nnew URL("/@ng/component?c=test.ts%40Cmp&t=" + encodeURIComponent(t), import.meta.url).href)', ); expect(jsContents).toContain( ').then(m => m.default && i0.ɵɵreplaceMetadata(Cmp, m.default, [i0, i1], ' + diff --git a/packages/compiler/src/render3/r3_hmr_compiler.ts b/packages/compiler/src/render3/r3_hmr_compiler.ts index e99034147da6..d353a0e910c7 100644 --- a/packages/compiler/src/render3/r3_hmr_compiler.ts +++ b/packages/compiler/src/render3/r3_hmr_compiler.ts @@ -80,8 +80,14 @@ export function compileHmrInitializer(meta: R3HmrMetadata): o.Expression { .literal(urlPartial) .plus(o.variable('encodeURIComponent').callFn([o.variable(timestampName)])); + // import.meta.url + const urlBase = o.variable('import').prop('meta').prop('url'); + + // new URL(urlValue, urlBase).href + const urlHref = new o.InstantiateExpr(o.variable('URL'), [urlValue, urlBase]).prop('href'); + // function Cmp_HmrLoad(t) { - // import(/* @vite-ignore */ url).then((m) => m.default && replaceMetadata(...)); + // import(/* @vite-ignore */ urlHref).then((m) => m.default && replaceMetadata(...)); // } const importCallback = new o.DeclareFunctionStmt( importCallbackName, @@ -90,7 +96,7 @@ export function compileHmrInitializer(meta: R3HmrMetadata): o.Expression { // The vite-ignore special comment is required to prevent Vite from generating a superfluous // warning for each usage within the development code. If Vite provides a method to // programmatically avoid this warning in the future, this added comment can be removed here. - new o.DynamicImportExpr(urlValue, null, '@vite-ignore') + new o.DynamicImportExpr(urlHref, null, '@vite-ignore') .prop('then') .callFn([replaceCallback]) .toStmt(), From e178cbb8b75285b054a25684410acd5ac4bf353d Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Fri, 10 Jan 2025 14:14:38 +0000 Subject: [PATCH 0036/1220] build: update cross-repo angular dependencies (#59464) See associated pull request for more information. PR Close #59464 --- .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 | 4 +- yarn.lock | 16 ++++---- 15 files changed, 69 insertions(+), 69 deletions(-) diff --git a/.github/actions/saucelabs-legacy/action.yml b/.github/actions/saucelabs-legacy/action.yml index 360f465e5f18..82904df8928f 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@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/bazel/setup@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - name: Setup Saucelabs Variables - uses: angular/dev-infra/github-actions/saucelabs@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/saucelabs@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - 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 eca301689788..caccd75c9dbb 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@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/bazel/setup@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/bazel/configure-remote@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - 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@5b4b2a6258dece411626435f680d2818769f469a + - uses: angular/dev-infra/github-actions/previews/pack-and-upload-artifact@7863aba23429b9cdb432a63cb688dd4c61f51ce6 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 e5d96ce2f2f3..9145a242d08b 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@5b4b2a6258dece411626435f680d2818769f469a + - uses: angular/dev-infra/github-actions/previews/upload-artifacts-to-firebase@7863aba23429b9cdb432a63cb688dd4c61f51ce6 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 9178d4101d1f..037d2c84a9ee 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@5b4b2a6258dece411626435f680d2818769f469a + - uses: angular/dev-infra/github-actions/branch-manager@7863aba23429b9cdb432a63cb688dd4c61f51ce6 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/benchmark-compare.yml b/.github/workflows/benchmark-compare.yml index 613d304a7a6e..6e447c39fc9d 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@5b4b2a6258dece411626435f680d2818769f469a + - uses: angular/dev-infra/github-actions/bazel/configure-remote@7863aba23429b9cdb432a63cb688dd4c61f51ce6 with: bazelrc: ./.bazelrc.user diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9f08219858f8..aa2ed79493e6 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@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@7863aba23429b9cdb432a63cb688dd4c61f51ce6 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@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@7863aba23429b9cdb432a63cb688dd4c61f51ce6 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/bazel/setup@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/bazel/configure-remote@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - 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@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@7863aba23429b9cdb432a63cb688dd4c61f51ce6 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/bazel/setup@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/bazel/configure-remote@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - 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@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/bazel/setup@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/bazel/configure-remote@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - 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@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@7863aba23429b9cdb432a63cb688dd4c61f51ce6 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/bazel/setup@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/bazel/configure-remote@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - 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@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@7863aba23429b9cdb432a63cb688dd4c61f51ce6 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@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/bazel/setup@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/bazel/configure-remote@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - 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@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@7863aba23429b9cdb432a63cb688dd4c61f51ce6 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@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/bazel/setup@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/bazel/configure-remote@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - 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 3dac4b9d0c59..fecbdb0add1a 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@5b4b2a6258dece411626435f680d2818769f469a + - uses: angular/dev-infra/github-actions/commit-message-based-labels@7863aba23429b9cdb432a63cb688dd4c61f51ce6 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@5b4b2a6258dece411626435f680d2818769f469a + - uses: angular/dev-infra/github-actions/post-approval-changes@7863aba23429b9cdb432a63cb688dd4c61f51ce6 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 4021688193fc..b0e5323e7b85 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@5b4b2a6258dece411626435f680d2818769f469a + - uses: angular/dev-infra/github-actions/google-internal-tests@7863aba23429b9cdb432a63cb688dd4c61f51ce6 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 f82b80981cd1..558446427d2c 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@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@7863aba23429b9cdb432a63cb688dd4c61f51ce6 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@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/bazel/setup@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/bazel/configure-remote@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - name: Setup Saucelabs Variables - uses: angular/dev-infra/github-actions/saucelabs@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/saucelabs@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - 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 47e8acb04bbb..66a6f296855d 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@5b4b2a6258dece411626435f680d2818769f469a + - uses: angular/dev-infra/github-actions/unified-status-check@7863aba23429b9cdb432a63cb688dd4c61f51ce6 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/perf.yml b/.github/workflows/perf.yml index 8448a58c15ef..4f0601e62424 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@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - 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@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/bazel/setup@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - 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 4765eafe4e2e..bd077a851714 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@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@7863aba23429b9cdb432a63cb688dd4c61f51ce6 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@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/linting/licenses@7863aba23429b9cdb432a63cb688dd4c61f51ce6 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@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@7863aba23429b9cdb432a63cb688dd4c61f51ce6 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/bazel/setup@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/bazel/configure-remote@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - 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@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@7863aba23429b9cdb432a63cb688dd4c61f51ce6 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/bazel/setup@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/bazel/configure-remote@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - 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@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@7863aba23429b9cdb432a63cb688dd4c61f51ce6 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/bazel/setup@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/bazel/configure-remote@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - 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@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/bazel/setup@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/bazel/configure-remote@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - 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@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@7863aba23429b9cdb432a63cb688dd4c61f51ce6 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@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/bazel/setup@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/bazel/configure-remote@7863aba23429b9cdb432a63cb688dd4c61f51ce6 - 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@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@7863aba23429b9cdb432a63cb688dd4c61f51ce6 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 a26c3dc4875e..dbc929cec3af 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@5b4b2a6258dece411626435f680d2818769f469a + uses: angular/dev-infra/github-actions/create-pr-for-changes@7863aba23429b9cdb432a63cb688dd4c61f51ce6 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 23a5a253b5af..9e77c82cd38c 100644 --- a/package.json +++ b/package.json @@ -160,9 +160,9 @@ "@actions/github": "^6.0.0", "@angular-devkit/architect-cli": "0.1901.0-rc.0", "@angular/animations": "^19.1.0-next", - "@angular/build-tooling": "https://github.com/angular/dev-infra-private-build-tooling-builds.git#4b0419ce0fea35aa1ad3e92a882f93ba41199ace", + "@angular/build-tooling": "https://github.com/angular/dev-infra-private-build-tooling-builds.git#fcc6e12b5199f40b8560c218196afba6f74e8370", "@angular/core": "^19.1.0-next", - "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#5d1a3e42cd27a30b988a5d0e40fca332c7a10aa0", + "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#2dde6a7f809c2928ab1c7b85afb7fec0c49beafc", "@bazel/bazelisk": "^1.7.5", "@bazel/buildifier": "^8.0.0", "@bazel/ibazel": "^0.25.0", diff --git a/yarn.lock b/yarn.lock index fe765f9bda81..f17526331fbc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -303,10 +303,10 @@ "@angular/core" "^13.0.0 || ^14.0.0-0" reflect-metadata "^0.1.13" -"@angular/build-tooling@https://github.com/angular/dev-infra-private-build-tooling-builds.git#4b0419ce0fea35aa1ad3e92a882f93ba41199ace": - version "0.0.0-5b4b2a6258dece411626435f680d2818769f469a" - uid "4b0419ce0fea35aa1ad3e92a882f93ba41199ace" - resolved "https://github.com/angular/dev-infra-private-build-tooling-builds.git#4b0419ce0fea35aa1ad3e92a882f93ba41199ace" +"@angular/build-tooling@https://github.com/angular/dev-infra-private-build-tooling-builds.git#fcc6e12b5199f40b8560c218196afba6f74e8370": + version "0.0.0-7863aba23429b9cdb432a63cb688dd4c61f51ce6" + uid fcc6e12b5199f40b8560c218196afba6f74e8370 + resolved "https://github.com/angular/dev-infra-private-build-tooling-builds.git#fcc6e12b5199f40b8560c218196afba6f74e8370" dependencies: "@angular/benchpress" "0.3.0" "@angular/build" "19.1.0-rc.0" @@ -427,10 +427,10 @@ dependencies: tslib "^2.3.0" -"@angular/ng-dev@https://github.com/angular/dev-infra-private-ng-dev-builds.git#5d1a3e42cd27a30b988a5d0e40fca332c7a10aa0": - version "0.0.0-5b4b2a6258dece411626435f680d2818769f469a" - uid "5d1a3e42cd27a30b988a5d0e40fca332c7a10aa0" - resolved "https://github.com/angular/dev-infra-private-ng-dev-builds.git#5d1a3e42cd27a30b988a5d0e40fca332c7a10aa0" +"@angular/ng-dev@https://github.com/angular/dev-infra-private-ng-dev-builds.git#2dde6a7f809c2928ab1c7b85afb7fec0c49beafc": + version "0.0.0-7863aba23429b9cdb432a63cb688dd4c61f51ce6" + uid "2dde6a7f809c2928ab1c7b85afb7fec0c49beafc" + resolved "https://github.com/angular/dev-infra-private-ng-dev-builds.git#2dde6a7f809c2928ab1c7b85afb7fec0c49beafc" dependencies: "@google-cloud/spanner" "7.17.1" "@octokit/rest" "21.1.0" From 676357dbe0ef84c5b19035d2aaddde0bad8457d7 Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Tue, 17 Dec 2024 17:49:06 +0100 Subject: [PATCH 0037/1220] docs: update `linkedSignal`. (#59221) The commit adds the mention that it is intentionnal that the computation is reactive even if there is an explicit `source`. fixes #59094 PR Close #59221 --- adev/src/content/guide/signals/linked-signal.md | 8 +++----- packages/core/src/render3/reactivity/linked_signal.ts | 3 +++ 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/adev/src/content/guide/signals/linked-signal.md b/adev/src/content/guide/signals/linked-signal.md index d1ab6f18b05c..1e8393e3ef6b 100644 --- a/adev/src/content/guide/signals/linked-signal.md +++ b/adev/src/content/guide/signals/linked-signal.md @@ -90,19 +90,17 @@ The `computation` is a function that receives the new value of `source` and a `p `linkedSignal` updates to the result of the computation every time its linked state changes. By default, Angular uses referential equality to determine if the linked state has changed. You can alternatively provide a custom equality function. ```typescript -const activeUser = signal({id: 123, name: 'Morgan'}); -const email = linkedSignal(() => `${activeUser().name}@example.com`, { +const activeUser = signal({id: 123, name: 'Morgan', isAdmin: true}); +const email = linkedSignal(() => ({id:`${activeUser().name}@example.com`}), { // Consider the user as the same if it's the same `id`. equal: (a, b) => a.id === b.id, }); - // Or, if separating `source` and `computation` const alternateEmail = linkedSignal({ source: activeUser, - computation: user => `${user.name}@example.com`, + computation: user => ({id:`${user.name}@example.com`}), equal: (a, b) => a.id === b.id, }); - // This update to `activeUser` does not cause `email` or `alternateEmail` // to update because the `id` is the same. activeUser.set({id: 123, name: 'Morgan', isAdmin: false}); diff --git a/packages/core/src/render3/reactivity/linked_signal.ts b/packages/core/src/render3/reactivity/linked_signal.ts index 0e3bf65a7eec..45f8f10581dc 100644 --- a/packages/core/src/render3/reactivity/linked_signal.ts +++ b/packages/core/src/render3/reactivity/linked_signal.ts @@ -118,6 +118,8 @@ export function linkedSignal( * Creates a writable signals whose value is initialized and reset by the linked, reactive computation. * This is an advanced API form where the computation has access to the previous value of the signal and the computation result. * + * Note: The computation is reactive, meaning the linked signal will automatically update whenever any of the signals used within the computation change. + * * @developerPreview */ export function linkedSignal(options: { @@ -125,6 +127,7 @@ export function linkedSignal(options: { computation: (source: NoInfer, previous?: {source: NoInfer; value: NoInfer}) => D; equal?: ValueEqualityFn>; }): WritableSignal; + export function linkedSignal( optionsOrComputation: | { From 966a370390a6b15e31335eb06850977a04d48484 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Thu, 9 Jan 2025 15:42:10 +0100 Subject: [PATCH 0038/1220] fix(migrations): resolve text replacement issue (#59452) Based on https://github.com/angular/angular/pull/59353#issuecomment-2580320424, fixes a text replacement issue that seems to cause code to be duplicated in some setups. PR Close #59452 --- .../core/schematics/ng-generate/cleanup-unused-imports/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/schematics/ng-generate/cleanup-unused-imports/index.ts b/packages/core/schematics/ng-generate/cleanup-unused-imports/index.ts index cb84a4e14e38..70cd7898d68e 100644 --- a/packages/core/schematics/ng-generate/cleanup-unused-imports/index.ts +++ b/packages/core/schematics/ng-generate/cleanup-unused-imports/index.ts @@ -67,7 +67,7 @@ export function migrate(): Rule { for (const c of changes) { recorder .remove(c.data.position, c.data.end - c.data.position) - .insertLeft(c.data.position, c.data.toInsert); + .insertRight(c.data.position, c.data.toInsert); } tree.commitUpdate(recorder); } From e8df77014125bf3240162fba7c0b04162cc0fd95 Mon Sep 17 00:00:00 2001 From: Aristeidis Bampakos Date: Fri, 10 Jan 2025 11:13:07 +0200 Subject: [PATCH 0039/1220] docs: update component scenarios guide (#59461) PR Close #59461 --- adev/src/content/guide/testing/components-scenarios.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adev/src/content/guide/testing/components-scenarios.md b/adev/src/content/guide/testing/components-scenarios.md index 14b3bfb5b6da..ff10991b42ae 100644 --- a/adev/src/content/guide/testing/components-scenarios.md +++ b/adev/src/content/guide/testing/components-scenarios.md @@ -554,7 +554,7 @@ It confirms that the selected `DashboardHeroComponent` hero really does find its A *routing component* is a component that tells the `Router` to navigate to another component. The `DashboardComponent` is a *routing component* because the user can navigate to the `HeroDetailComponent` by clicking on one of the *hero buttons* on the dashboard. -Angular provides test helpers to reduce boilerplate and more effectively test code which depends HttpClient. The `provideRouter` function can be used directly in the test module as well. +Angular provides test helpers to reduce boilerplate and more effectively test code which depends `HttpClient`. The `provideRouter` function can be used directly in the test module as well. From 17510becb0f50a02ecae9757d2fb2596fb2fb02c Mon Sep 17 00:00:00 2001 From: arturovt Date: Tue, 7 Jan 2025 19:18:57 +0200 Subject: [PATCH 0040/1220] refactor(platform-browser): drop `BROWSER_MODULE_PROVIDERS_MARKER` in production (#59412) In this commit, we switch from decorators (which also produce redundant metadata, such as in the `declareFactory` instruction) to the `inject` function to drop the `BROWSER_MODULE_PROVIDERS_MARKER` token in production. This token is actually provided only in development mode but is still referenced in the constructor due to the `@Inject(BROWSER_MODULE_PROVIDERS_MARKER)` decorator. PR Close #59412 --- .../public-api/platform-browser/index.api.md | 4 +-- .../animations/bundle.golden_symbols.json | 1 - .../cyclic_import/bundle.golden_symbols.json | 1 - .../forms_reactive/bundle.golden_symbols.json | 1 - .../bundle.golden_symbols.json | 1 - .../bundling/todo/bundle.golden_symbols.json | 1 - packages/platform-browser/src/browser.ts | 32 +++++++++---------- 7 files changed, 17 insertions(+), 24 deletions(-) diff --git a/goldens/public-api/platform-browser/index.api.md b/goldens/public-api/platform-browser/index.api.md index 2b6b6a090066..5cd1b53f0145 100644 --- a/goldens/public-api/platform-browser/index.api.md +++ b/goldens/public-api/platform-browser/index.api.md @@ -33,9 +33,9 @@ export function bootstrapApplication(rootComponent: Type, options?: App // @public export class BrowserModule { - constructor(providersAlreadyPresent: boolean | null); + constructor(); // (undocumented) - static ɵfac: i0.ɵɵFactoryDeclaration; + static ɵfac: i0.ɵɵFactoryDeclaration; // (undocumented) static ɵinj: i0.ɵɵInjectorDeclaration; // (undocumented) diff --git a/packages/core/test/bundling/animations/bundle.golden_symbols.json b/packages/core/test/bundling/animations/bundle.golden_symbols.json index 740e55719b0f..a5b955213032 100644 --- a/packages/core/test/bundling/animations/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations/bundle.golden_symbols.json @@ -28,7 +28,6 @@ "ApplicationRef", "BROWSER_ANIMATIONS_PROVIDERS", "BROWSER_MODULE_PROVIDERS", - "BROWSER_MODULE_PROVIDERS_MARKER", "BROWSER_NOOP_ANIMATIONS_PROVIDERS", "BaseAnimationRenderer", "BehaviorSubject", 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 3b4ffbb56007..74f1193c5e0e 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -9,7 +9,6 @@ "ApplicationModule", "ApplicationRef", "BROWSER_MODULE_PROVIDERS", - "BROWSER_MODULE_PROVIDERS_MARKER", "BehaviorSubject", "BrowserDomAdapter", "BrowserModule", 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 3d4ae74ec6f7..f72f5eb32e55 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -13,7 +13,6 @@ "ApplicationModule", "ApplicationRef", "BROWSER_MODULE_PROVIDERS", - "BROWSER_MODULE_PROVIDERS_MARKER", "BaseControlValueAccessor", "BehaviorSubject", "BrowserDomAdapter", 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 5725362e1cc8..9fd6584ca4c1 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 @@ -14,7 +14,6 @@ "ApplicationModule", "ApplicationRef", "BROWSER_MODULE_PROVIDERS", - "BROWSER_MODULE_PROVIDERS_MARKER", "BaseControlValueAccessor", "BehaviorSubject", "BrowserDomAdapter", diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index 60c9fcaffd31..d2c8cc77d000 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -9,7 +9,6 @@ "ApplicationModule", "ApplicationRef", "BROWSER_MODULE_PROVIDERS", - "BROWSER_MODULE_PROVIDERS_MARKER", "BehaviorSubject", "BrowserDomAdapter", "BrowserModule", diff --git a/packages/platform-browser/src/browser.ts b/packages/platform-browser/src/browser.ts index 5e489398e2bc..6b924de7261b 100644 --- a/packages/platform-browser/src/browser.ts +++ b/packages/platform-browser/src/browser.ts @@ -13,25 +13,20 @@ import { ɵPLATFORM_BROWSER_ID as PLATFORM_BROWSER_ID, } from '@angular/common'; import { - APP_ID, ApplicationConfig as ApplicationConfigFromCore, ApplicationModule, ApplicationRef, createPlatformFactory, ErrorHandler, - Inject, InjectionToken, - ModuleWithProviders, NgModule, NgZone, - Optional, PLATFORM_ID, PLATFORM_INITIALIZER, platformCore, PlatformRef, Provider, RendererFactory2, - SkipSelf, StaticProvider, Testability, TestabilityRegistry, @@ -42,6 +37,7 @@ import { ɵsetDocument, ɵTESTABILITY as TESTABILITY, ɵTESTABILITY_GETTER as TESTABILITY_GETTER, + inject, } from '@angular/core'; import {BrowserDomAdapter} from './browser/browser_adapter'; @@ -264,18 +260,20 @@ const BROWSER_MODULE_PROVIDERS: Provider[] = [ exports: [CommonModule, ApplicationModule], }) export class BrowserModule { - constructor( - @Optional() - @SkipSelf() - @Inject(BROWSER_MODULE_PROVIDERS_MARKER) - providersAlreadyPresent: boolean | null, - ) { - if ((typeof ngDevMode === 'undefined' || ngDevMode) && providersAlreadyPresent) { - throw new RuntimeError( - RuntimeErrorCode.BROWSER_MODULE_ALREADY_LOADED, - `Providers from the \`BrowserModule\` have already been loaded. If you need access ` + - `to common directives such as NgIf and NgFor, import the \`CommonModule\` instead.`, - ); + constructor() { + if (typeof ngDevMode === 'undefined' || ngDevMode) { + const providersAlreadyPresent = inject(BROWSER_MODULE_PROVIDERS_MARKER, { + optional: true, + skipSelf: true, + }); + + if (providersAlreadyPresent) { + throw new RuntimeError( + RuntimeErrorCode.BROWSER_MODULE_ALREADY_LOADED, + `Providers from the \`BrowserModule\` have already been loaded. If you need access ` + + `to common directives such as NgIf and NgFor, import the \`CommonModule\` instead.`, + ); + } } } } From 24f383ab4fd50ad51437c226d4e51c78380c2ed8 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Fri, 10 Jan 2025 12:43:00 +0000 Subject: [PATCH 0041/1220] test: improve typescript version coverage for signal input migration (#59463) This ensures the migration works for these TypeScript versions. The migration is very sensitive to the TS version and its internals; so it makes sense to test all of these. PR Close #59463 --- .../test/ts-versions/index.bzl | 8 ++++++-- .../test/ts-versions/package.json | 8 ++++++-- .../test/ts-versions/yarn.lock | 20 +++++++++++++++++++ 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/packages/core/schematics/migrations/signal-migration/test/ts-versions/index.bzl b/packages/core/schematics/migrations/signal-migration/test/ts-versions/index.bzl index 2608a9c0f7be..07a0439839ae 100644 --- a/packages/core/schematics/migrations/signal-migration/test/ts-versions/index.bzl +++ b/packages/core/schematics/migrations/signal-migration/test/ts-versions/index.bzl @@ -1,7 +1,11 @@ """Exposes information about the tested TS versions.""" TS_VERSIONS = [ - "typescript-5.5.4", - "typescript-5.5.3", "typescript-5.5.2", + "typescript-5.5.3", + "typescript-5.5.4", + "typescript-5.6.2", + "typescript-5.6.3", + "typescript-5.7.2", + "typescript-5.7.3", ] diff --git a/packages/core/schematics/migrations/signal-migration/test/ts-versions/package.json b/packages/core/schematics/migrations/signal-migration/test/ts-versions/package.json index 8688445c9668..dbe9b20b49ae 100644 --- a/packages/core/schematics/migrations/signal-migration/test/ts-versions/package.json +++ b/packages/core/schematics/migrations/signal-migration/test/ts-versions/package.json @@ -2,8 +2,12 @@ "name": "ts-versions", "license": "MIT", "dependencies": { - "typescript-5.5.4": "npm:typescript@5.5.4", + "typescript-5.5.2": "npm:typescript@5.5.2", "typescript-5.5.3": "npm:typescript@5.5.3", - "typescript-5.5.2": "npm:typescript@5.5.2" + "typescript-5.5.4": "npm:typescript@5.5.4", + "typescript-5.6.2": "npm:typescript@5.6.2", + "typescript-5.6.3": "npm:typescript@5.6.3", + "typescript-5.7.2": "npm:typescript@5.7.2", + "typescript-5.7.3": "npm:typescript@5.7.3" } } diff --git a/packages/core/schematics/migrations/signal-migration/test/ts-versions/yarn.lock b/packages/core/schematics/migrations/signal-migration/test/ts-versions/yarn.lock index b8df1705d318..8ad6ea1dfe9a 100644 --- a/packages/core/schematics/migrations/signal-migration/test/ts-versions/yarn.lock +++ b/packages/core/schematics/migrations/signal-migration/test/ts-versions/yarn.lock @@ -16,3 +16,23 @@ version "5.5.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== + +"typescript-5.6.2@npm:typescript@5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.2.tgz#d1de67b6bef77c41823f822df8f0b3bcff60a5a0" + integrity sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw== + +"typescript-5.6.3@npm:typescript@5.6.3": + version "5.6.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" + integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== + +"typescript-5.7.2@npm:typescript@5.7.2": + version "5.7.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6" + integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== + +"typescript-5.7.3@npm: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== From 86cbaaa2a2aa4705783c08c1856c456d4eaccfb7 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Fri, 10 Jan 2025 13:12:14 +0000 Subject: [PATCH 0042/1220] test: add test to verify extending tsconfig works in signal input migration (#59463) Related to https://github.com/angular/angular/issues/59348 PR Close #59463 --- packages/core/schematics/test/BUILD.bazel | 1 + .../test/signal_input_migration_spec.ts | 97 +++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 packages/core/schematics/test/signal_input_migration_spec.ts diff --git a/packages/core/schematics/test/BUILD.bazel b/packages/core/schematics/test/BUILD.bazel index a4626cd36ea4..c84f22e44092 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/signal-input-migration:static_files", "//packages/core/schematics/ng-generate/signal-queries-migration:static_files", "//packages/core/schematics/ng-generate/signals:static_files", "//packages/core/schematics/ng-generate/standalone-migration:static_files", diff --git a/packages/core/schematics/test/signal_input_migration_spec.ts b/packages/core/schematics/test/signal_input_migration_spec.ts new file mode 100644 index 000000000000..b008d409213e --- /dev/null +++ b/packages/core/schematics/test/signal_input_migration_spec.ts @@ -0,0 +1,97 @@ +/** + * @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('signal input 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('signal-input-migration', 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( + '/index.ts', + ` + import {Input, Directive} from '@angular/core'; + + @Directive({}) + export class SomeDirective { + @Input({required: true}) name = ''; + }`, + ); + + await runMigration(); + + const content = tree.readContent('/index.ts').replace(/\s+/g, ' '); + expect(content).toContain('readonly name = input.required()'); + }); + + it('should work when extending tsconfig from node_modules', async () => { + writeFile(`node_modules/@tsconfig/strictest/tsconfig.json`, `{}`); + writeFile( + `tsconfig.json`, + JSON.stringify({ + extends: `@tsconfig/strictest/tsconfig.json`, + }), + ); + writeFile( + '/index.ts', + ` + import {Input, Directive} from '@angular/core'; + + @Directive({}) + export class SomeDirective { + @Input({required: true}) name = ''; + }`, + ); + + await runMigration(); + + const content = tree.readContent('/index.ts').replace(/\s+/g, ' '); + expect(content).toContain('readonly name = input.required()'); + }); +}); From 8496fb16bc081a19cd55b26dd7bf86d96dd18114 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Fri, 10 Jan 2025 14:18:17 +0000 Subject: [PATCH 0043/1220] fix(migrations): incorrect stats when migrating queries with best effort mode (#59463) We previously did count forcibly ignored queries as incompatible. This resulted in incorrect migration stats that are printed upon migration completion. See: #58657 PR Close #59463 --- .../signal-queries-migration/migration.ts | 10 +++ .../schematics/test/queries_migration_spec.ts | 66 ++++++++++++++++++- .../test/signal_input_migration_spec.ts | 66 ++++++++++++++++++- 3 files changed, 140 insertions(+), 2 deletions(-) diff --git a/packages/core/schematics/migrations/signal-queries-migration/migration.ts b/packages/core/schematics/migrations/signal-queries-migration/migration.ts index 765b5dc916d8..94473c363605 100644 --- a/packages/core/schematics/migrations/signal-queries-migration/migration.ts +++ b/packages/core/schematics/migrations/signal-queries-migration/migration.ts @@ -25,6 +25,7 @@ import { ClassFieldDescriptor, ClassIncompatibilityReason, FieldIncompatibilityReason, + nonIgnorableFieldIncompatibilities, } from '../signal-migration/src'; import {checkIncompatiblePatterns} from '../signal-migration/src/passes/problematic_patterns/common_incompatible_patterns'; import {migrateHostBindings} from '../signal-migration/src/passes/reference_migration/migrate_host_bindings'; @@ -617,6 +618,15 @@ export class SignalQueriesMigration extends TsurgeComplexMigration< continue; } + // Do not count queries that were forcibly ignored via best effort mode. + if ( + this.config.bestEffortMode && + (info.fieldReason === null || + !nonIgnorableFieldIncompatibilities.includes(info.fieldReason)) + ) { + continue; + } + incompatibleQueries++; if (info.classReason !== null) { diff --git a/packages/core/schematics/test/queries_migration_spec.ts b/packages/core/schematics/test/queries_migration_spec.ts index 2da2005f7be4..0dd7dea0706d 100644 --- a/packages/core/schematics/test/queries_migration_spec.ts +++ b/packages/core/schematics/test/queries_migration_spec.ts @@ -24,7 +24,7 @@ describe('signal queries migration', () => { host.sync.write(normalize(filePath), virtualFs.stringToFileBuffer(contents)); } - function runMigration(options?: {path?: string}) { + function runMigration(options?: {bestEffortMode?: boolean}) { return runner.runSchematic('signal-queries-migration', options, tree); } @@ -69,4 +69,68 @@ describe('signal queries migration', () => { const content = tree.readContent('/index.ts').replace(/\s+/g, ' '); expect(content).toContain("readonly ref = contentChild.required('ref');"); }); + + it('should report correct statistics', async () => { + writeFile(`node_modules/@tsconfig/strictest/tsconfig.json`, `{}`); + writeFile( + `tsconfig.json`, + JSON.stringify({ + extends: `@tsconfig/strictest/tsconfig.json`, + }), + ); + writeFile( + '/index.ts', + ` + import {ContentChild, ElementRef, Directive} from '@angular/core'; + + @Directive({}) + export class SomeDirective { + @ContentChild('ref') ref!: ElementRef; + @ContentChild('ref') ref2: ElementRef|null = null; + + someFn() { + this.ref2 = null; + } + }`, + ); + + const messages: string[] = []; + runner.logger.subscribe((m) => messages.push(m.message)); + + await runMigration(); + + expect(messages).toContain(` -> Migrated 1/2 queries.`); + }); + + it('should report correct statistics with best effort mode', async () => { + writeFile(`node_modules/@tsconfig/strictest/tsconfig.json`, `{}`); + writeFile( + `tsconfig.json`, + JSON.stringify({ + extends: `@tsconfig/strictest/tsconfig.json`, + }), + ); + writeFile( + '/index.ts', + ` + import {ContentChild, ElementRef, Directive} from '@angular/core'; + + @Directive({}) + export class SomeDirective { + @ContentChild('ref') ref!: ElementRef; + @ContentChild('ref') ref2: ElementRef|null = null; + + someFn() { + this.ref2 = null; + } + }`, + ); + + const messages: string[] = []; + runner.logger.subscribe((m) => messages.push(m.message)); + + await runMigration({bestEffortMode: true}); + + expect(messages).toContain(` -> Migrated 2/2 queries.`); + }); }); diff --git a/packages/core/schematics/test/signal_input_migration_spec.ts b/packages/core/schematics/test/signal_input_migration_spec.ts index b008d409213e..91c2b4669438 100644 --- a/packages/core/schematics/test/signal_input_migration_spec.ts +++ b/packages/core/schematics/test/signal_input_migration_spec.ts @@ -24,7 +24,7 @@ describe('signal input migration', () => { host.sync.write(normalize(filePath), virtualFs.stringToFileBuffer(contents)); } - function runMigration(options?: {path?: string}) { + function runMigration(options?: {bestEffortMode?: boolean}) { return runner.runSchematic('signal-input-migration', options, tree); } @@ -94,4 +94,68 @@ describe('signal input migration', () => { const content = tree.readContent('/index.ts').replace(/\s+/g, ' '); expect(content).toContain('readonly name = input.required()'); }); + + it('should report correct statistics', async () => { + writeFile(`node_modules/@tsconfig/strictest/tsconfig.json`, `{}`); + writeFile( + `tsconfig.json`, + JSON.stringify({ + extends: `@tsconfig/strictest/tsconfig.json`, + }), + ); + writeFile( + '/index.ts', + ` + import {Input, Directive} from '@angular/core'; + + @Directive({}) + export class SomeDirective { + @Input({required: true}) name = ''; + @Input({required: true}) lastName = ''; + + someFn() { + this.lastName = 'other name'; + } + }`, + ); + + const messages: string[] = []; + runner.logger.subscribe((m) => messages.push(m.message)); + + await runMigration(); + + expect(messages).toContain(` -> Migrated 1/2 inputs.`); + }); + + it('should report correct statistics with best effort mode', async () => { + writeFile(`node_modules/@tsconfig/strictest/tsconfig.json`, `{}`); + writeFile( + `tsconfig.json`, + JSON.stringify({ + extends: `@tsconfig/strictest/tsconfig.json`, + }), + ); + writeFile( + '/index.ts', + ` + import {Input, Directive} from '@angular/core'; + + @Directive({}) + export class SomeDirective { + @Input({required: true}) name = ''; + @Input({required: true}) lastName = ''; + + someFn() { + this.lastName = 'other name'; + } + }`, + ); + + const messages: string[] = []; + runner.logger.subscribe((m) => messages.push(m.message)); + + await runMigration({bestEffortMode: true}); + + expect(messages).toContain(` -> Migrated 2/2 inputs.`); + }); }); From 49dbf093eb245710acbc52932749e7386d942597 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Fri, 10 Jan 2025 16:54:09 +0000 Subject: [PATCH 0044/1220] build: update cross-repo angular dependencies (#59470) See associated pull request for more information. PR Close #59470 --- .github/actions/deploy-docs-site/main.js | 18 +++- .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 | 4 +- yarn.lock | 82 +++++++++++++++---- 16 files changed, 140 insertions(+), 82 deletions(-) diff --git a/.github/actions/deploy-docs-site/main.js b/.github/actions/deploy-docs-site/main.js index 1faad35c65e9..0c5c85b4c1b2 100644 --- a/.github/actions/deploy-docs-site/main.js +++ b/.github/actions/deploy-docs-site/main.js @@ -10633,19 +10633,31 @@ var managedLabels = createTypedObject(ManagedLabel)({ DETECTED_HTTP_CHANGE: { description: "Issues related to HTTP and HTTP Client", name: "area: common/http", - commitCheck: (c) => c.type === "common/http" || c.type === "http", + commitCheck: (c) => c.scope === "common/http" || c.scope === "http", repositories: [ManagedRepositories.ANGULAR] }, DETECTED_COMPILER_CHANGE: { description: "Issues related to `ngc`, Angular's template compiler", name: "area: compiler", - commitCheck: (c) => c.type === "compiler" || c.type === "compiler-cli", + commitCheck: (c) => c.scope === "compiler" || c.scope === "compiler-cli", repositories: [ManagedRepositories.ANGULAR] }, DETECTED_PLATFORM_BROWSER_CHANGE: { description: "Issues related to the framework runtime", name: "area: core", - commitCheck: (c) => c.type === "platform-browser" || c.type === "core", + commitCheck: (c) => c.scope === "platform-browser" || c.scope === "core" || c.scope === "platform-browser-dynamic", + repositories: [ManagedRepositories.ANGULAR] + }, + DETECTED_PLATFORM_SERVER_CHANGE: { + description: "Issues related to server-side rendering", + name: "area: server", + commitCheck: (c) => c.scope === "platform-server", + repositories: [ManagedRepositories.ANGULAR] + }, + DETECTED_ZONES_CHANGE: { + description: "Issues related to zone.js", + name: "area: zones", + commitCheck: (c) => c.scope === "zone.js", repositories: [ManagedRepositories.ANGULAR] } }); diff --git a/.github/actions/saucelabs-legacy/action.yml b/.github/actions/saucelabs-legacy/action.yml index 82904df8928f..29a99577bffe 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/bazel/setup@8076a69c44ddeb30662e1621860a2d04d57534a2 - name: Setup Saucelabs Variables - uses: angular/dev-infra/github-actions/saucelabs@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/saucelabs@8076a69c44ddeb30662e1621860a2d04d57534a2 - 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 caccd75c9dbb..a4d35ed7d4db 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8076a69c44ddeb30662e1621860a2d04d57534a2 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/bazel/setup@8076a69c44ddeb30662e1621860a2d04d57534a2 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@8076a69c44ddeb30662e1621860a2d04d57534a2 - 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + - uses: angular/dev-infra/github-actions/previews/pack-and-upload-artifact@8076a69c44ddeb30662e1621860a2d04d57534a2 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 9145a242d08b..3025234a557e 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + - uses: angular/dev-infra/github-actions/previews/upload-artifacts-to-firebase@8076a69c44ddeb30662e1621860a2d04d57534a2 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 037d2c84a9ee..632f44585347 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + - uses: angular/dev-infra/github-actions/branch-manager@8076a69c44ddeb30662e1621860a2d04d57534a2 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/benchmark-compare.yml b/.github/workflows/benchmark-compare.yml index 6e447c39fc9d..96914028a6f5 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + - uses: angular/dev-infra/github-actions/bazel/configure-remote@8076a69c44ddeb30662e1621860a2d04d57534a2 with: bazelrc: ./.bazelrc.user diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index aa2ed79493e6..694fa50dacfb 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8076a69c44ddeb30662e1621860a2d04d57534a2 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8076a69c44ddeb30662e1621860a2d04d57534a2 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/bazel/setup@8076a69c44ddeb30662e1621860a2d04d57534a2 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@8076a69c44ddeb30662e1621860a2d04d57534a2 - 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8076a69c44ddeb30662e1621860a2d04d57534a2 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/bazel/setup@8076a69c44ddeb30662e1621860a2d04d57534a2 - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@8076a69c44ddeb30662e1621860a2d04d57534a2 - 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8076a69c44ddeb30662e1621860a2d04d57534a2 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/bazel/setup@8076a69c44ddeb30662e1621860a2d04d57534a2 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@8076a69c44ddeb30662e1621860a2d04d57534a2 - 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8076a69c44ddeb30662e1621860a2d04d57534a2 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/bazel/setup@8076a69c44ddeb30662e1621860a2d04d57534a2 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@8076a69c44ddeb30662e1621860a2d04d57534a2 - 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8076a69c44ddeb30662e1621860a2d04d57534a2 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/bazel/setup@8076a69c44ddeb30662e1621860a2d04d57534a2 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@8076a69c44ddeb30662e1621860a2d04d57534a2 - 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8076a69c44ddeb30662e1621860a2d04d57534a2 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8076a69c44ddeb30662e1621860a2d04d57534a2 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/bazel/setup@8076a69c44ddeb30662e1621860a2d04d57534a2 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@8076a69c44ddeb30662e1621860a2d04d57534a2 - 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 fecbdb0add1a..da7f5ffc0727 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + - uses: angular/dev-infra/github-actions/commit-message-based-labels@8076a69c44ddeb30662e1621860a2d04d57534a2 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + - uses: angular/dev-infra/github-actions/post-approval-changes@8076a69c44ddeb30662e1621860a2d04d57534a2 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 b0e5323e7b85..fb583c03afff 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + - uses: angular/dev-infra/github-actions/google-internal-tests@8076a69c44ddeb30662e1621860a2d04d57534a2 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 558446427d2c..30b9cb1db288 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8076a69c44ddeb30662e1621860a2d04d57534a2 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/bazel/setup@8076a69c44ddeb30662e1621860a2d04d57534a2 - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@8076a69c44ddeb30662e1621860a2d04d57534a2 - name: Setup Saucelabs Variables - uses: angular/dev-infra/github-actions/saucelabs@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/saucelabs@8076a69c44ddeb30662e1621860a2d04d57534a2 - 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 66a6f296855d..dad3edb24378 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + - uses: angular/dev-infra/github-actions/unified-status-check@8076a69c44ddeb30662e1621860a2d04d57534a2 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/perf.yml b/.github/workflows/perf.yml index 4f0601e62424..d427bf419b5e 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8076a69c44ddeb30662e1621860a2d04d57534a2 - 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8076a69c44ddeb30662e1621860a2d04d57534a2 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/bazel/setup@8076a69c44ddeb30662e1621860a2d04d57534a2 - 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 bd077a851714..8625c93f5d88 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8076a69c44ddeb30662e1621860a2d04d57534a2 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/linting/licenses@8076a69c44ddeb30662e1621860a2d04d57534a2 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8076a69c44ddeb30662e1621860a2d04d57534a2 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/bazel/setup@8076a69c44ddeb30662e1621860a2d04d57534a2 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@8076a69c44ddeb30662e1621860a2d04d57534a2 - 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8076a69c44ddeb30662e1621860a2d04d57534a2 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/bazel/setup@8076a69c44ddeb30662e1621860a2d04d57534a2 - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@8076a69c44ddeb30662e1621860a2d04d57534a2 - 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8076a69c44ddeb30662e1621860a2d04d57534a2 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/bazel/setup@8076a69c44ddeb30662e1621860a2d04d57534a2 - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@8076a69c44ddeb30662e1621860a2d04d57534a2 - 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8076a69c44ddeb30662e1621860a2d04d57534a2 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/bazel/setup@8076a69c44ddeb30662e1621860a2d04d57534a2 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@8076a69c44ddeb30662e1621860a2d04d57534a2 - 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8076a69c44ddeb30662e1621860a2d04d57534a2 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/bazel/setup@8076a69c44ddeb30662e1621860a2d04d57534a2 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@8076a69c44ddeb30662e1621860a2d04d57534a2 - 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@8076a69c44ddeb30662e1621860a2d04d57534a2 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 dbc929cec3af..14d5d04dcf03 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@7863aba23429b9cdb432a63cb688dd4c61f51ce6 + uses: angular/dev-infra/github-actions/create-pr-for-changes@8076a69c44ddeb30662e1621860a2d04d57534a2 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 9e77c82cd38c..6e3fcd653646 100644 --- a/package.json +++ b/package.json @@ -160,9 +160,9 @@ "@actions/github": "^6.0.0", "@angular-devkit/architect-cli": "0.1901.0-rc.0", "@angular/animations": "^19.1.0-next", - "@angular/build-tooling": "https://github.com/angular/dev-infra-private-build-tooling-builds.git#fcc6e12b5199f40b8560c218196afba6f74e8370", + "@angular/build-tooling": "https://github.com/angular/dev-infra-private-build-tooling-builds.git#e112feeb45ba449f0446c550a500397b5f433404", "@angular/core": "^19.1.0-next", - "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#2dde6a7f809c2928ab1c7b85afb7fec0c49beafc", + "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#ac7126d99730a943edc762017282381fe2b075de", "@bazel/bazelisk": "^1.7.5", "@bazel/buildifier": "^8.0.0", "@bazel/ibazel": "^0.25.0", diff --git a/yarn.lock b/yarn.lock index f17526331fbc..033f6e572e47 100644 --- a/yarn.lock +++ b/yarn.lock @@ -303,10 +303,10 @@ "@angular/core" "^13.0.0 || ^14.0.0-0" reflect-metadata "^0.1.13" -"@angular/build-tooling@https://github.com/angular/dev-infra-private-build-tooling-builds.git#fcc6e12b5199f40b8560c218196afba6f74e8370": - version "0.0.0-7863aba23429b9cdb432a63cb688dd4c61f51ce6" - uid fcc6e12b5199f40b8560c218196afba6f74e8370 - resolved "https://github.com/angular/dev-infra-private-build-tooling-builds.git#fcc6e12b5199f40b8560c218196afba6f74e8370" +"@angular/build-tooling@https://github.com/angular/dev-infra-private-build-tooling-builds.git#e112feeb45ba449f0446c550a500397b5f433404": + version "0.0.0-8076a69c44ddeb30662e1621860a2d04d57534a2" + uid e112feeb45ba449f0446c550a500397b5f433404 + resolved "https://github.com/angular/dev-infra-private-build-tooling-builds.git#e112feeb45ba449f0446c550a500397b5f433404" dependencies: "@angular/benchpress" "0.3.0" "@angular/build" "19.1.0-rc.0" @@ -319,7 +319,7 @@ "@bazel/runfiles" "5.8.1" "@bazel/terser" "5.8.1" "@bazel/typescript" "5.8.1" - "@microsoft/api-extractor" "7.49.0" + "@microsoft/api-extractor" "7.49.1" "@types/browser-sync" "^2.26.3" "@types/minimatch" "^5.1.2" "@types/node" "^18.19.21" @@ -337,7 +337,7 @@ tmp "^0.2.1" "true-case-path" "^2.2.1" tslib "^2.5.2" - typescript "5.7.2" + typescript "5.7.3" uuid "^11.0.0" yargs "^17.0.0" @@ -427,10 +427,10 @@ dependencies: tslib "^2.3.0" -"@angular/ng-dev@https://github.com/angular/dev-infra-private-ng-dev-builds.git#2dde6a7f809c2928ab1c7b85afb7fec0c49beafc": - version "0.0.0-7863aba23429b9cdb432a63cb688dd4c61f51ce6" - uid "2dde6a7f809c2928ab1c7b85afb7fec0c49beafc" - resolved "https://github.com/angular/dev-infra-private-ng-dev-builds.git#2dde6a7f809c2928ab1c7b85afb7fec0c49beafc" +"@angular/ng-dev@https://github.com/angular/dev-infra-private-ng-dev-builds.git#ac7126d99730a943edc762017282381fe2b075de": + version "0.0.0-8076a69c44ddeb30662e1621860a2d04d57534a2" + uid ac7126d99730a943edc762017282381fe2b075de + resolved "https://github.com/angular/dev-infra-private-ng-dev-builds.git#ac7126d99730a943edc762017282381fe2b075de" dependencies: "@google-cloud/spanner" "7.17.1" "@octokit/rest" "21.1.0" @@ -2398,18 +2398,27 @@ "@microsoft/tsdoc-config" "~0.17.1" "@rushstack/node-core-library" "5.10.1" -"@microsoft/api-extractor@7.49.0": - version "7.49.0" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.49.0.tgz#0cd36b62acb9481d81388cb8314d980461fb809b" - integrity sha512-X5b462k0/yl8qWdGx3siq5vyI8fTDU9fRnwqTMlGHqFhLxpASmLWA2EU6nft+ZG8cQM2HRZlr4HSo62UqiAnug== +"@microsoft/api-extractor-model@7.30.2": + version "7.30.2" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.30.2.tgz#9c0b2446f6bbcdd0159e16b0e8f8694d645ce257" + integrity sha512-3/t2F+WhkJgBzSNwlkTIL0tBgUoBqDqL66pT+nh2mPbM0NIDGVGtpqbGWPgHIzn/mn7kGS/Ep8D8po58e8UUIw== dependencies: - "@microsoft/api-extractor-model" "7.30.1" "@microsoft/tsdoc" "~0.15.1" "@microsoft/tsdoc-config" "~0.17.1" - "@rushstack/node-core-library" "5.10.1" + "@rushstack/node-core-library" "5.10.2" + +"@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== + dependencies: + "@microsoft/api-extractor-model" "7.30.2" + "@microsoft/tsdoc" "~0.15.1" + "@microsoft/tsdoc-config" "~0.17.1" + "@rushstack/node-core-library" "5.10.2" "@rushstack/rig-package" "0.5.3" - "@rushstack/terminal" "0.14.4" - "@rushstack/ts-command-line" "4.23.2" + "@rushstack/terminal" "0.14.5" + "@rushstack/ts-command-line" "4.23.3" lodash "~4.17.15" minimatch "~3.0.3" resolve "~1.22.1" @@ -3365,6 +3374,20 @@ resolve "~1.22.1" semver "~7.5.4" +"@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" + integrity sha512-xOF/2gVJZTfjTxbo4BDj9RtQq/HFnrrKdtem4JkyRLnwsRz2UDTg8gA1/et10fBx5RxmZD9bYVGST69W8ME5OQ== + dependencies: + ajv "~8.13.0" + ajv-draft-04 "~1.0.0" + ajv-formats "~3.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/rig-package@0.5.3": version "0.5.3" resolved "https://registry.yarnpkg.com/@rushstack/rig-package/-/rig-package-0.5.3.tgz#ea4d8a3458540b1295500149c04e645f23134e5d" @@ -3381,6 +3404,14 @@ "@rushstack/node-core-library" "5.10.1" supports-color "~8.1.1" +"@rushstack/terminal@0.14.5": + version "0.14.5" + resolved "https://registry.yarnpkg.com/@rushstack/terminal/-/terminal-0.14.5.tgz#4b0e79b139b4372901956f920b5a4a405a1d09d8" + integrity sha512-TEOpNwwmsZVrkp0omnuTUTGZRJKTr6n6m4OITiNjkqzLAkcazVpwR1SOtBg6uzpkIBLgrcNHETqI8rbw3uiUfw== + dependencies: + "@rushstack/node-core-library" "5.10.2" + supports-color "~8.1.1" + "@rushstack/ts-command-line@4.23.2": version "4.23.2" resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.23.2.tgz#37b28a418db84d04f6a1c787390dd02ad8dfadf0" @@ -3391,6 +3422,16 @@ argparse "~1.0.9" string-argv "~0.3.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" + integrity sha512-HazKL8fv4HMQMzrKJCrOrhyBPPdzk7iajUXgsASwjQ8ROo1cmgyqxt/k9+SdmrNLGE1zATgRqMUH3s/6smbRMA== + dependencies: + "@rushstack/terminal" "0.14.5" + "@types/argparse" "1.0.38" + argparse "~1.0.9" + string-argv "~0.3.1" + "@schematics/angular@19.1.0-rc.0": version "19.1.0-rc.0" resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-19.1.0-rc.0.tgz#9192d8f26d0c26b0ffc895d9392a7d7746ec1408" @@ -16817,6 +16858,11 @@ typescript@5.7.2, typescript@^5.4.4, typescript@^5.4.5, typescript@^5.5.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6" integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== +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== + typescript@~4.9.0: version "4.9.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" From 7d5d693eda6155362492c0f1c94f64a47cb55abd Mon Sep 17 00:00:00 2001 From: Jessica Janiuk Date: Fri, 10 Jan 2025 13:00:27 -0500 Subject: [PATCH 0045/1220] fix(dev-infra): remove no longer necessary scope (#59472) We no longer have need for the view engine scope. PR Close #59472 --- .ng-dev/commit-message.mts | 1 - 1 file changed, 1 deletion(-) diff --git a/.ng-dev/commit-message.mts b/.ng-dev/commit-message.mts index 5dd41e73e532..5284f4fa0c29 100644 --- a/.ng-dev/commit-message.mts +++ b/.ng-dev/commit-message.mts @@ -32,7 +32,6 @@ export const commitMessage: CommitMessageConfig = { 'router', 'service-worker', 'upgrade', - 've', 'zone.js', ], }; From f978cdef63033d9bb6f0533a54448abcf80bfa1a Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Fri, 10 Jan 2025 18:12:51 +0000 Subject: [PATCH 0046/1220] build: update cross-repo angular dependencies (#59473) See associated pull request for more information. PR Close #59473 --- .github/actions/deploy-docs-site/main.js | 6 +++ .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 | 4 +- yarn.lock | 16 ++++---- 16 files changed, 75 insertions(+), 69 deletions(-) diff --git a/.github/actions/deploy-docs-site/main.js b/.github/actions/deploy-docs-site/main.js index 0c5c85b4c1b2..e7c05e60eb54 100644 --- a/.github/actions/deploy-docs-site/main.js +++ b/.github/actions/deploy-docs-site/main.js @@ -10659,6 +10659,12 @@ var managedLabels = createTypedObject(ManagedLabel)({ name: "area: zones", commitCheck: (c) => c.scope === "zone.js", repositories: [ManagedRepositories.ANGULAR] + }, + DETECTED_LOCALIZE_CHANGE: { + description: "Issues related to localization and internationalization", + name: "area: i18n", + commitCheck: (c) => c.scope === "localize", + repositories: [ManagedRepositories.ANGULAR] } }); diff --git a/.github/actions/saucelabs-legacy/action.yml b/.github/actions/saucelabs-legacy/action.yml index 29a99577bffe..39ecbeca1f6a 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/bazel/setup@639449b40067b3c087bcda04e5eab41a3839c736 - name: Setup Saucelabs Variables - uses: angular/dev-infra/github-actions/saucelabs@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/saucelabs@639449b40067b3c087bcda04e5eab41a3839c736 - 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 a4d35ed7d4db..6bf6c4e1813b 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@639449b40067b3c087bcda04e5eab41a3839c736 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/bazel/setup@639449b40067b3c087bcda04e5eab41a3839c736 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/bazel/configure-remote@639449b40067b3c087bcda04e5eab41a3839c736 - 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + - uses: angular/dev-infra/github-actions/previews/pack-and-upload-artifact@639449b40067b3c087bcda04e5eab41a3839c736 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 3025234a557e..7494cce07293 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + - uses: angular/dev-infra/github-actions/previews/upload-artifacts-to-firebase@639449b40067b3c087bcda04e5eab41a3839c736 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 632f44585347..b640d718cf38 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + - uses: angular/dev-infra/github-actions/branch-manager@639449b40067b3c087bcda04e5eab41a3839c736 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/benchmark-compare.yml b/.github/workflows/benchmark-compare.yml index 96914028a6f5..d9408cec6dbc 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + - uses: angular/dev-infra/github-actions/bazel/configure-remote@639449b40067b3c087bcda04e5eab41a3839c736 with: bazelrc: ./.bazelrc.user diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 694fa50dacfb..e99be0bdb60f 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@639449b40067b3c087bcda04e5eab41a3839c736 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@639449b40067b3c087bcda04e5eab41a3839c736 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/bazel/setup@639449b40067b3c087bcda04e5eab41a3839c736 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/bazel/configure-remote@639449b40067b3c087bcda04e5eab41a3839c736 - 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@639449b40067b3c087bcda04e5eab41a3839c736 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/bazel/setup@639449b40067b3c087bcda04e5eab41a3839c736 - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/bazel/configure-remote@639449b40067b3c087bcda04e5eab41a3839c736 - 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@639449b40067b3c087bcda04e5eab41a3839c736 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/bazel/setup@639449b40067b3c087bcda04e5eab41a3839c736 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/bazel/configure-remote@639449b40067b3c087bcda04e5eab41a3839c736 - 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@639449b40067b3c087bcda04e5eab41a3839c736 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/bazel/setup@639449b40067b3c087bcda04e5eab41a3839c736 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/bazel/configure-remote@639449b40067b3c087bcda04e5eab41a3839c736 - 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@639449b40067b3c087bcda04e5eab41a3839c736 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/bazel/setup@639449b40067b3c087bcda04e5eab41a3839c736 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/bazel/configure-remote@639449b40067b3c087bcda04e5eab41a3839c736 - 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@639449b40067b3c087bcda04e5eab41a3839c736 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@639449b40067b3c087bcda04e5eab41a3839c736 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/bazel/setup@639449b40067b3c087bcda04e5eab41a3839c736 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/bazel/configure-remote@639449b40067b3c087bcda04e5eab41a3839c736 - 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 da7f5ffc0727..025092adbf24 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + - uses: angular/dev-infra/github-actions/commit-message-based-labels@639449b40067b3c087bcda04e5eab41a3839c736 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + - uses: angular/dev-infra/github-actions/post-approval-changes@639449b40067b3c087bcda04e5eab41a3839c736 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 fb583c03afff..7a462cac013e 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + - uses: angular/dev-infra/github-actions/google-internal-tests@639449b40067b3c087bcda04e5eab41a3839c736 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 30b9cb1db288..602211aa28cf 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@639449b40067b3c087bcda04e5eab41a3839c736 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/bazel/setup@639449b40067b3c087bcda04e5eab41a3839c736 - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/bazel/configure-remote@639449b40067b3c087bcda04e5eab41a3839c736 - name: Setup Saucelabs Variables - uses: angular/dev-infra/github-actions/saucelabs@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/saucelabs@639449b40067b3c087bcda04e5eab41a3839c736 - 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 dad3edb24378..2252a7fadacb 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + - uses: angular/dev-infra/github-actions/unified-status-check@639449b40067b3c087bcda04e5eab41a3839c736 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/perf.yml b/.github/workflows/perf.yml index d427bf419b5e..f8d12e9b4b35 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@639449b40067b3c087bcda04e5eab41a3839c736 - 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@639449b40067b3c087bcda04e5eab41a3839c736 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/bazel/setup@639449b40067b3c087bcda04e5eab41a3839c736 - 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 8625c93f5d88..612c88c2548e 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@639449b40067b3c087bcda04e5eab41a3839c736 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/linting/licenses@639449b40067b3c087bcda04e5eab41a3839c736 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@639449b40067b3c087bcda04e5eab41a3839c736 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/bazel/setup@639449b40067b3c087bcda04e5eab41a3839c736 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/bazel/configure-remote@639449b40067b3c087bcda04e5eab41a3839c736 - 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@639449b40067b3c087bcda04e5eab41a3839c736 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/bazel/setup@639449b40067b3c087bcda04e5eab41a3839c736 - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/bazel/configure-remote@639449b40067b3c087bcda04e5eab41a3839c736 - 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@639449b40067b3c087bcda04e5eab41a3839c736 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/bazel/setup@639449b40067b3c087bcda04e5eab41a3839c736 - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/bazel/configure-remote@639449b40067b3c087bcda04e5eab41a3839c736 - 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@639449b40067b3c087bcda04e5eab41a3839c736 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/bazel/setup@639449b40067b3c087bcda04e5eab41a3839c736 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/bazel/configure-remote@639449b40067b3c087bcda04e5eab41a3839c736 - 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@639449b40067b3c087bcda04e5eab41a3839c736 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/bazel/setup@639449b40067b3c087bcda04e5eab41a3839c736 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/bazel/configure-remote@639449b40067b3c087bcda04e5eab41a3839c736 - 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@639449b40067b3c087bcda04e5eab41a3839c736 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 14d5d04dcf03..7e20756dfe2b 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@8076a69c44ddeb30662e1621860a2d04d57534a2 + uses: angular/dev-infra/github-actions/create-pr-for-changes@639449b40067b3c087bcda04e5eab41a3839c736 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 6e3fcd653646..d6d12cfa4748 100644 --- a/package.json +++ b/package.json @@ -160,9 +160,9 @@ "@actions/github": "^6.0.0", "@angular-devkit/architect-cli": "0.1901.0-rc.0", "@angular/animations": "^19.1.0-next", - "@angular/build-tooling": "https://github.com/angular/dev-infra-private-build-tooling-builds.git#e112feeb45ba449f0446c550a500397b5f433404", + "@angular/build-tooling": "https://github.com/angular/dev-infra-private-build-tooling-builds.git#11de733259a10bd9fc4079afdfe5733aec6383a1", "@angular/core": "^19.1.0-next", - "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#ac7126d99730a943edc762017282381fe2b075de", + "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#af7ab37bf65d005745d676f30d9a9759a1757067", "@bazel/bazelisk": "^1.7.5", "@bazel/buildifier": "^8.0.0", "@bazel/ibazel": "^0.25.0", diff --git a/yarn.lock b/yarn.lock index 033f6e572e47..d5cf116ad962 100644 --- a/yarn.lock +++ b/yarn.lock @@ -303,10 +303,10 @@ "@angular/core" "^13.0.0 || ^14.0.0-0" reflect-metadata "^0.1.13" -"@angular/build-tooling@https://github.com/angular/dev-infra-private-build-tooling-builds.git#e112feeb45ba449f0446c550a500397b5f433404": - version "0.0.0-8076a69c44ddeb30662e1621860a2d04d57534a2" - uid e112feeb45ba449f0446c550a500397b5f433404 - resolved "https://github.com/angular/dev-infra-private-build-tooling-builds.git#e112feeb45ba449f0446c550a500397b5f433404" +"@angular/build-tooling@https://github.com/angular/dev-infra-private-build-tooling-builds.git#11de733259a10bd9fc4079afdfe5733aec6383a1": + version "0.0.0-639449b40067b3c087bcda04e5eab41a3839c736" + uid "11de733259a10bd9fc4079afdfe5733aec6383a1" + resolved "https://github.com/angular/dev-infra-private-build-tooling-builds.git#11de733259a10bd9fc4079afdfe5733aec6383a1" dependencies: "@angular/benchpress" "0.3.0" "@angular/build" "19.1.0-rc.0" @@ -427,10 +427,10 @@ dependencies: tslib "^2.3.0" -"@angular/ng-dev@https://github.com/angular/dev-infra-private-ng-dev-builds.git#ac7126d99730a943edc762017282381fe2b075de": - version "0.0.0-8076a69c44ddeb30662e1621860a2d04d57534a2" - uid ac7126d99730a943edc762017282381fe2b075de - resolved "https://github.com/angular/dev-infra-private-ng-dev-builds.git#ac7126d99730a943edc762017282381fe2b075de" +"@angular/ng-dev@https://github.com/angular/dev-infra-private-ng-dev-builds.git#af7ab37bf65d005745d676f30d9a9759a1757067": + version "0.0.0-639449b40067b3c087bcda04e5eab41a3839c736" + uid af7ab37bf65d005745d676f30d9a9759a1757067 + resolved "https://github.com/angular/dev-infra-private-ng-dev-builds.git#af7ab37bf65d005745d676f30d9a9759a1757067" dependencies: "@google-cloud/spanner" "7.17.1" "@octokit/rest" "21.1.0" From 40e7904bd897bc12a85b2a03694ffe6a2a395cf4 Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Fri, 10 Jan 2025 05:41:05 +0100 Subject: [PATCH 0047/1220] docs(docs-infra): prevent the host class from being replaced (#59460) When removing the binding, the class defined on the host element is being replaced fixes #59442 PR Close #59460 --- .../viewers/docs-viewer/docs-viewer.component.spec.ts | 7 +++++++ .../viewers/docs-viewer/docs-viewer.component.ts | 9 ++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/adev/shared-docs/components/viewers/docs-viewer/docs-viewer.component.spec.ts b/adev/shared-docs/components/viewers/docs-viewer/docs-viewer.component.spec.ts index 737f3538bf74..bc9dfa4bb52b 100644 --- a/adev/shared-docs/components/viewers/docs-viewer/docs-viewer.component.spec.ts +++ b/adev/shared-docs/components/viewers/docs-viewer/docs-viewer.component.spec.ts @@ -112,6 +112,13 @@ describe('DocViewer', () => { expect(exampleViewer).not.toBeNull(); expect(exampleViewer.componentInstance.view()).toBe(CodeExampleViewMode.SNIPPET); + + const checkIcon = fixture.debugElement.query(By.directive(IconComponent)); + expect((checkIcon.nativeElement as HTMLElement).classList).toContain( + `material-symbols-outlined`, + ); + expect((checkIcon.nativeElement as HTMLElement).classList).toContain(`docs-check`); + expect(checkIcon.nativeElement.innerHTML).toBe('check'); }); it('should display example viewer in multi file mode when user clicks expand', async () => { 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 3a33715c2a23..2a7e41043901 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 @@ -265,9 +265,12 @@ export class DocViewer implements OnChanges { } private loadIcons(element: HTMLElement): void { - element.querySelectorAll('docs-icon').forEach((iconsPlaceholder) => { - this.renderComponent(IconComponent, iconsPlaceholder as HTMLElement); - }); + // We need to make sure that we don't reload the icons in loadCopySourceCodeButtons + element + .querySelectorAll('docs-icon:not([docs-copy-source-code] docs-icon)') + .forEach((iconsPlaceholder) => { + this.renderComponent(IconComponent, iconsPlaceholder as HTMLElement); + }); } /** From 4c12f07970f133c81bf47397ab1186d50aa041bc Mon Sep 17 00:00:00 2001 From: PhilippMDoerner Date: Sun, 12 Jan 2025 17:55:09 +0100 Subject: [PATCH 0048/1220] docs: Adjust lines of server.ts example in server-side-rendering docs (#59490) docs: Adjust lines of server.ts example in ssr docs The server.ts excerpt used in the server-side-rendering docs (https://angular.dev/guide/ssr#configure-server-side-rendering) does not fully encapsulate the commonEngine code-block. It begins too early in line 31, leading to the inclusions of lines from another codeblock that is not intended to be shown here: ``` ); // All regular routes use the Angular engine ``` It should be beginning with the line `// All regular routes use the Angular engine`. It also ends too soon, cutting off these parts of the code-block: ``` .catch((err) => next(err)); }); ``` PR Close #59490 --- adev/src/content/guide/ssr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adev/src/content/guide/ssr.md b/adev/src/content/guide/ssr.md index 9f2f711b0e4a..d093f0dded3a 100644 --- a/adev/src/content/guide/ssr.md +++ b/adev/src/content/guide/ssr.md @@ -45,7 +45,7 @@ Note: In Angular v17 and later, `server.ts` is no longer used by `ng serve`. The The `server.ts` file configures a Node.js Express server and Angular server-side rendering. `CommonEngine` is used to render an Angular application. - + Angular CLI will scaffold an initial server implementation focused on server-side rendering your Angular application. This server can be extended to support other features such as API routes, redirects, static assets, and more. See [Express documentation](https://expressjs.com/) for more details. From 69aa4e91f5edd4c42cdfa6d29e6fef796e9df66c Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Wed, 8 Jan 2025 16:32:05 +0100 Subject: [PATCH 0049/1220] docs(docs-infra): remove sorting from API manager (#59427) fixes #59423 PR Close #59427 --- .../api-reference-manager.service.ts | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/adev/src/app/features/references/api-reference-list/api-reference-manager.service.ts b/adev/src/app/features/references/api-reference-list/api-reference-manager.service.ts index ba1f9dd2b705..0af4d7e5cf32 100644 --- a/adev/src/app/features/references/api-reference-list/api-reference-manager.service.ts +++ b/adev/src/app/features/references/api-reference-list/api-reference-manager.service.ts @@ -28,17 +28,15 @@ export class ApiReferenceManager { groups.push({ title: module.moduleLabel.replace('@angular/', ''), id: module.normalizedModuleName, - items: module.entries - .map((api) => { - const url = getApiUrl(module, api.name); - return { - itemType: api.type, - title: api.name, - isDeprecated: !!api.isDeprecated, - url, - }; - }) - .sort((a, b) => a.title.localeCompare(b.title)), + items: module.entries.map((api) => { + const url = getApiUrl(module, api.name); + return { + itemType: api.type, + title: api.name, + isDeprecated: !!api.isDeprecated, + url, + }; + }), }); } From dd8b6517944d504c15644ea83bf204382f28a9a6 Mon Sep 17 00:00:00 2001 From: RafaelJCamara Date: Mon, 6 Jan 2025 20:09:38 +0100 Subject: [PATCH 0050/1220] docs: add $default to path (#59383) Closes: #59378 PR Close #59383 --- .../projects/my-lib/schematics/my-service/schema.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/adev/src/content/examples/schematics-for-libraries/projects/my-lib/schematics/my-service/schema.json b/adev/src/content/examples/schematics-for-libraries/projects/my-lib/schematics/my-service/schema.json index 672069b27fa8..5409153a867c 100644 --- a/adev/src/content/examples/schematics-for-libraries/projects/my-lib/schematics/my-service/schema.json +++ b/adev/src/content/examples/schematics-for-libraries/projects/my-lib/schematics/my-service/schema.json @@ -12,7 +12,10 @@ "type": "string", "format": "path", "description": "The path to create the service.", - "visible": false + "visible": false, + "$default": { + "$source": "workingDirectory" + } }, "project": { "type": "string", From cb30fecdd4c3eca5a97f5a28ee3106f36f4df100 Mon Sep 17 00:00:00 2001 From: Bobokhuja <65486207+Bobokhuja@users.noreply.github.com> Date: Fri, 27 Dec 2024 09:54:24 +0500 Subject: [PATCH 0051/1220] docs: fix typo example code in pipes documentation (#59312) PR Close #59312 --- adev/src/content/guide/templates/pipes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adev/src/content/guide/templates/pipes.md b/adev/src/content/guide/templates/pipes.md index 40cd296da2dd..0caaa06f7486 100644 --- a/adev/src/content/guide/templates/pipes.md +++ b/adev/src/content/guide/templates/pipes.md @@ -260,7 +260,7 @@ export class MyCustomTransformationPipe implements PipeTransform { if (format === 'uppercase') { return msg.toUpperCase() - else { + } else { return msg } } From fdbb57f79859ef6df7e9293754dde95ae2472e39 Mon Sep 17 00:00:00 2001 From: arturovt Date: Sun, 12 Jan 2025 20:22:42 +0200 Subject: [PATCH 0052/1220] refactor(docs-infra): lazy-load `EmbeddedTutorialManager` in home editor (#59491) In this commit, we lazy-load `EmbeddedTutorialManager` in the home editor component via `injectAsync` as done in other parts of the code. PR Close #59491 --- adev/src/app/editor/index.ts | 2 ++ .../editor/inject-embedded-tutorial-manager.ts | 17 +++++++++++++++++ .../home/components/home-editor.component.ts | 18 ++++++++++++------ 3 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 adev/src/app/editor/inject-embedded-tutorial-manager.ts diff --git a/adev/src/app/editor/index.ts b/adev/src/app/editor/index.ts index 84428e2231d2..45fc90986a84 100644 --- a/adev/src/app/editor/index.ts +++ b/adev/src/app/editor/index.ts @@ -13,3 +13,5 @@ export {NodeRuntimeState} from './node-runtime-state.service'; export {NodeRuntimeSandbox} from './node-runtime-sandbox.service'; export {EmbeddedEditor, EMBEDDED_EDITOR_SELECTOR} from './embedded-editor.component'; + +export {injectEmbeddedTutorialManager} from './inject-embedded-tutorial-manager'; diff --git a/adev/src/app/editor/inject-embedded-tutorial-manager.ts b/adev/src/app/editor/inject-embedded-tutorial-manager.ts new file mode 100644 index 000000000000..d1f79d19b411 --- /dev/null +++ b/adev/src/app/editor/inject-embedded-tutorial-manager.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 injectEmbeddedTutorialManager(injector: EnvironmentInjector) { + return injectAsync(injector, () => + import('./embedded-tutorial-manager.service').then((c) => c.EmbeddedTutorialManager), + ); +} 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 d8e2cf7f25ec..4846f32a9a3f 100644 --- a/adev/src/app/features/home/components/home-editor.component.ts +++ b/adev/src/app/features/home/components/home-editor.component.ts @@ -17,10 +17,10 @@ import { OnInit, } from '@angular/core'; import {takeUntilDestroyed} from '@angular/core/rxjs-interop'; -import {forkJoin} from 'rxjs'; +import {forkJoin, switchMap} from 'rxjs'; import {injectAsync} from '../../../core/services/inject-async'; -import {EmbeddedEditor, EmbeddedTutorialManager} from '../../../editor'; +import {EmbeddedEditor, injectEmbeddedTutorialManager} from '../../../editor'; @Component({ selector: 'adev-code-editor', @@ -32,7 +32,6 @@ import {EmbeddedEditor, EmbeddedTutorialManager} from '../../../editor'; }) export class CodeEditorComponent implements OnInit { private readonly cdRef = inject(ChangeDetectorRef); - private readonly embeddedTutorialManager = inject(EmbeddedTutorialManager); private readonly environmentInjector = inject(EnvironmentInjector); private readonly destroyRef = inject(DestroyRef); @@ -50,10 +49,17 @@ export class CodeEditorComponent implements OnInit { injectAsync(this.environmentInjector, () => import('../../../editor/index').then((c) => c.NodeRuntimeSandbox), ), - this.embeddedTutorialManager.fetchAndSetTutorialFiles(this.tutorialFiles), + injectEmbeddedTutorialManager(this.environmentInjector), ]) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(([nodeRuntimeSandbox]) => { + .pipe( + switchMap(([nodeRuntimeSandbox, embeddedTutorialManager]) => + embeddedTutorialManager + .fetchAndSetTutorialFiles(this.tutorialFiles) + .then(() => nodeRuntimeSandbox), + ), + takeUntilDestroyed(this.destroyRef), + ) + .subscribe((nodeRuntimeSandbox) => { this.cdRef.markForCheck(); nodeRuntimeSandbox.init(); }); From 790221b1d2e73b9974cb84987d6b3f9e4b9758fe Mon Sep 17 00:00:00 2001 From: Amy Sorto <8575252+amysorto@users.noreply.github.com> Date: Thu, 5 Dec 2024 17:32:31 +0000 Subject: [PATCH 0053/1220] docs: add component harnesses guides (#59078) PR Close #59078 --- adev/src/app/sub-navigation-data.ts | 20 ++ .../testing/component-harnesses-overview.md | 30 ++ ...omponent-harnesses-testing-environments.md | 59 ++++ .../testing/creating-component-harnesses.md | 276 ++++++++++++++++++ .../testing/using-component-harnesses.md | 207 +++++++++++++ 5 files changed, 592 insertions(+) create mode 100644 adev/src/content/guide/testing/component-harnesses-overview.md create mode 100644 adev/src/content/guide/testing/component-harnesses-testing-environments.md create mode 100644 adev/src/content/guide/testing/creating-component-harnesses.md create mode 100644 adev/src/content/guide/testing/using-component-harnesses.md diff --git a/adev/src/app/sub-navigation-data.ts b/adev/src/app/sub-navigation-data.ts index 9cdd596611ff..65800271831b 100644 --- a/adev/src/app/sub-navigation-data.ts +++ b/adev/src/app/sub-navigation-data.ts @@ -499,6 +499,26 @@ const DOCS_SUB_NAVIGATION_DATA: NavigationItem[] = [ path: 'guide/testing/utility-apis', contentPath: 'guide/testing/utility-apis', }, + { + label: 'Component harnesses overview', + path: 'guide/testing/component-harnesses-overview', + contentPath: 'guide/testing/component-harnesses-overview', + }, + { + label: 'Using component harnesses in tests', + path: 'guide/testing/using-component-harnesses', + contentPath: 'guide/testing/using-component-harnesses', + }, + { + label: 'Creating harnesses for your components', + path: 'guide/testing/creating-component-harnesses', + contentPath: 'guide/testing/creating-component-harnesses', + }, + { + label: 'Adding harness support for additional testing environments', + path: 'guide/testing/component-harnesses-testing-environments', + contentPath: 'guide/testing/component-harnesses-testing-environments', + }, ], }, { diff --git a/adev/src/content/guide/testing/component-harnesses-overview.md b/adev/src/content/guide/testing/component-harnesses-overview.md new file mode 100644 index 000000000000..a6ebb4ab7604 --- /dev/null +++ b/adev/src/content/guide/testing/component-harnesses-overview.md @@ -0,0 +1,30 @@ +# Component harnesses overview + +A component harness is a class that allows tests to interact with components the way an end user does via a supported API. You can create test harnesses for any component, ranging from small reusable widgets to full pages. + +Harnesses offer several benefits: +- They make tests less brittle by insulating themselves against implementation details of a component, such as its DOM structure +- They make tests become more readable and easier to maintain +- They can be used across multiple testing environments + + +// Example of test with a harness for a component called MyButtonComponent +it('should load button with exact text', async () => { + const button = await loader.getHarness(MyButtonComponentHarness); + expect(await button.getText()).toBe('Confirm'); +}); + + +Component harnesses are especially useful for shared UI widgets. Developers often write tests that depend on private implementation details of widgets, such as DOM structure and CSS classes. Those dependencies make tests brittle and hard to maintain. Harnesses offer an alternative— a supported API that interacts with the widget the same way an end-user does. Widget implementation changes now become less likely to break user tests. For example, [Angular Material](https://material.angular.io/components/categories) provides a test harness for each component in the library. + +Component harnesses support multiple testing environments. You can use the same harness implementation in both unit and end-to-end tests. Test authors only need to learn one API and component authors don't have to maintain separate unit and end-to-end test implementations. + +Many developers can be categorized by one of the following developer type categories: test authors, component harness authors, and harness environment authors. Use the table below to find the most relevant section in this guide based on these categories: + +| Developer Type | Description | Relevant Section | +|:--- | :--- | :--- | +| Test Authors | Developers that use component harnesses written by someone else to test their application. For example, this could be an app developer who uses a third-party menu component and needs to interact with the menu in a unit test. | [Using component harnesses in tests](guide/testing/using-component-harnesses) | +| Component harness authors | Developers who maintain some reusable Angular components and want to create a test harness for its users to use in their tests. For example, an author of a third party Angular component library or a developer who maintains a set of common components for a large Angular application. | [Creating component harnesses for your components](guide/testing/creating-component-harnesses ) | +| Harness environment authors | Developers who want to add support for using component harnesses in additional testing environments. For information on supported testing environments out-of-the-box, see the [test harness environments and loaders](guide/testing/using-component-harnesses#test-harness-environments-and-loaders). | [Adding support for additional testing environments](guide/testing/component-harnesses-testing-environments) | + +For the full API reference, please see the [Angular CDK's component harness API reference page](https://material.angular.io/cdk/test-harnesses/api). diff --git a/adev/src/content/guide/testing/component-harnesses-testing-environments.md b/adev/src/content/guide/testing/component-harnesses-testing-environments.md new file mode 100644 index 000000000000..157ce6ba6dc0 --- /dev/null +++ b/adev/src/content/guide/testing/component-harnesses-testing-environments.md @@ -0,0 +1,59 @@ +# Adding harness support for additional testing environments + +## Before you start + +Tip: This guide assumes you've already read the [component harnesses overview guide](guide/testing/component-harnesses-overview). Read that first if you're new to using component harnesses. + +### When does adding support for a test environment make sense? + +To use component harnesses in the following environments, you can use Angular CDK's two built-in environments: +- Unit tests +- WebDriver end-to-end tests + +To use a supported testing environment, read the [Creating harnesses for your components guide](guide/testing/creating-component-harnesses). + +Otherwise, to add support for other environments, you need to define how to interact with a DOM element and how DOM interactions work in your environment. Continue reading to learn more. + +### CDK Installation + +The [Component Dev Kit (CDK)](https://material.angular.io/cdk/categories) is a set of behavior primitives for building components. To use the component harnesses, first install `@angular/cdk` from npm. You can do this from your terminal using the Angular CLI: + + + ng add @angular/cdk + + +## Creating a `TestElement` implementation + +Every test environment must define a `TestElement` implementation. The `TestElement` interface serves as an environment-agnostic representation of a DOM element. It enables harnesses to interact with DOM elements regardless of the underlying environment. Because some environments don't support interacting with DOM elements synchronously (e.g. WebDriver), all `TestElement` methods are asynchronous, returning a `Promise` with the result of the operation. + +`TestElement` offers a number of methods to interact with the underlying DOM such as `blur()`, `click()`, `getAttribute()`, and more. See the [TestElement API reference page](https://material.angular.io/cdk/test-harnesses/api#TestElement) for the full list of methods. + +The `TestElement` interface consists largely of methods that resemble methods available on `HTMLElement`. Similar methods exist in most test environments, which makes implementing the methods fairly straightforward. However, one important difference to note when implementing the `sendKeys` method, is that the key codes in the `TestKey` enum likely differ from the key codes used in the test environment. Environment authors should maintain a mapping from `TestKey` codes to the codes used in the particular testing environment. + +The [UnitTestElement](https://github.com/angular/components/blob/main/src/cdk/testing/testbed/unit-test-element.ts#L33) and [SeleniumWebDriverElement](https://github.com/angular/components/blob/main/src/cdk/testing/selenium-webdriver/selenium-webdriver-keys.ts#L16) implementations in Angular CDK serve as good examples of implementations of this interface. + +## Creating a `HarnessEnvironment` implementation +Test authors use `HarnessEnvironment` to create component harness instances for use in tests. `HarnessEnvironment` is an abstract class that must be extended to create a concrete subclass for the new environment. When supporting a new test environment, create a `HarnessEnvironment` subclass that adds concrete implementations for all abstract members. + +`HarnessEnvironment` has a generic type parameter: `HarnessEnvironment`. This parameter, `E`, represents the raw element type of the environment. For example, this parameter is Element for unit test environments. + +The following are the abstract methods that must be implemented: + +| Method | Description | +|:--- | :--- | +| `abstract getDocumentRoot(): E` | Gets the root element for the environment (e.g. `document.body`). | +| `abstract createTestElement(element: E): TestElement` | Creates a `TestElement` for the given raw element. | +| `abstract createEnvironment(element: E): HarnessEnvironment` | Creates a `HarnessEnvironment` rooted at the given raw element. | +| `abstract getAllRawElements(selector: string): Promise` | Gets all of the raw elements under the root element of the environment matching the given selector. | +| `abstract forceStabilize(): Promise` | Gets a `Promise` that resolves when the `NgZone` is stable. Additionally, if applicable, tells `NgZone` to stabilize (e.g. calling `flush()` in a `fakeAsync` test). | +| `abstract waitForTasksOutsideAngular(): Promise` | Gets a `Promise` that resolves when the parent zone of `NgZone` is stable. | + +In addition to implementing the missing methods, this class should provide a way for test authors to get `ComponentHarness` instances. You should define a protected constructor and provide a static method called `loader` that returns a `HarnessLoader` instance. This allows test authors to write code like: `SomeHarnessEnvironment.loader().getHarness(...)`. Depending on the needs of the particular environment, the class may provide several different static methods or require arguments to be passed. (e.g. the `loader` method on `TestbedHarnessEnvironment` takes a `ComponentFixture`, and the class provides additional static methods called `documentRootLoader` and `harnessForFixture`). + +The [`TestbedHarnessEnvironment`](https://github.com/angular/components/blob/main/src/cdk/testing/testbed/testbed-harness-environment.ts#L89) and [SeleniumWebDriverHarnessEnvironment](https://github.com/angular/components/blob/main/src/cdk/testing/selenium-webdriver/selenium-web-driver-harness-environment.ts#L71) implementations in Angular CDK serve as good examples of implementations of this interface. + +## Handling auto change detection +In order to support the `manualChangeDetection` and parallel APIs, your environment should install a handler for the auto change detection status. + +When your environment wants to start handling the auto change detection status it can call `handleAutoChangeDetectionStatus(handler)`. The handler function will receive a `AutoChangeDetectionStatus` which has two properties `isDisabled` and `onDetectChangesNow()`. See the [AutoChangeDetectionStatus API reference page](https://material.angular.io/cdk/test-harnesses/api#AutoChangeDetectionStatus) for more information. +If your environment wants to stop handling auto change detection status it can call `stopHandlingAutoChangeDetectionStatus()`. diff --git a/adev/src/content/guide/testing/creating-component-harnesses.md b/adev/src/content/guide/testing/creating-component-harnesses.md new file mode 100644 index 000000000000..c412dd9f0e59 --- /dev/null +++ b/adev/src/content/guide/testing/creating-component-harnesses.md @@ -0,0 +1,276 @@ +# Creating harnesses for your components + +## Before you start + +Tip: This guide assumes you've already read the [component harnesses overview guide](guide/testing/component-harnesses-overview). Read that first if you're new to using component harnesses. + +### When does creating a test harness make sense? + +The Angular team recommends creating component test harnesses for shared components that are used in many places and have some user interactivity. This most commonly applies to widget libraries and similar reusable components. Harnesses are valuable for these cases because they provide the consumers of these shared components a well- supported API for interacting with a component. Tests that use harnesses can avoid depending on unreliable implementation details of these shared components, such as DOM structure and specific event listeners. + +For components that appear in only one place, such as a page in an application, harnesses don't provide as much benefit. In these situations, a component's tests can reasonably depend on the implementation details of this component, as the tests and components are updated at the same time. However, harnesses still provide some value if you would use the harness in both unit and end-to-end tests. + +### CDK Installation + +The [Component Dev Kit (CDK)](https://material.angular.io/cdk/categories) is a set of behavior primitives for building components. To use the component harnesses, first install `@angular/cdk` from npm. You can do this from your terminal using the Angular CLI: + + + ng add @angular/cdk + + +## Extending `ComponentHarness` + +The abstract `ComponentHarness` class is the base class for all component harnesses. To create a custom component harness, extend `ComponentHarness` and implement the static property `hostSelector`. + +The `hostSelector` property identifies elements in the DOM that match this harness subclass. In most cases, the `hostSelector` should be the same as the selector of the corresponding `Component` or `Directive`. For example, consider a simple popup component: + + +@Component({ + selector: 'my-popup', + template: ` + + @if (isOpen()) { +
+ } + ` +}) +class MyPopup { + triggerText = input(''); + + isOpen = signal(false); + + toggle() { + this.isOpen.update((value) => !value); + } +} +
+ +In this case, a minimal harness for the component would look like the following: + + +class MyPopupHarness extends ComponentHarness { + static hostSelector = 'my-popup'; +} + + +While `ComponentHarness` subclasses require only the `hostSelector` property, most harnesses should also implement a static `with` method to generate `HarnessPredicate` instances. The [filtering harnesses section](guide/testing/using-component-harnesses#filtering-harnesses) covers this in more detail. + +## Finding elements in the component's DOM + +Each instance of a `ComponentHarness` subclass represents a particular instance of the corresponding component. You can access the component's host element via the `host() `method from the `ComponentHarness` base class. + +`ComponentHarness` also offers several methods for locating elements within the component's DOM. These methods are `locatorFor()`, `locatorForOptional()`, and `locatorForAll()`. These methods create functions that find elements, they do not directly find elements. This approach safeguards against caching references to out-of-date elements. For example, when an `ngIf` hides and then shows an element, the result is a new DOM element; using functions ensures that tests always reference the current state of the DOM. + +See the [ComponentHarness API reference page](https://material.angular.io/cdk/test-harnesses/api#ComponentHarness) for the full list details of the different `locatorFor` methods. + +For example, the `MyPopupHarness` example discussed above could provide methods to get the trigger and content elements as follows: + + +class MyPopupHarness extends ComponentHarness { + static hostSelector = 'my-popup'; + + /** Gets the trigger element */ + getTriggerElement = this.locatorFor('button'); + + /** Gets the content element. */ + getContentElement = this.locatorForOptional('.my-popup-content'); +} + + +## Working with `TestElement` instances + +`TestElement` is an abstraction designed to work across different test environments (Unit tests, WebDriver, etc). When using harnesses, you should perform all DOM interaction via this interface. Other means of accessing DOM elements, such as `document.querySelector()`, do not work in all test environments. + +`TestElement` has a number of methods to interact with the underlying DOM, such as `blur()`, `click()`, `getAttribute()`, and more. See the [TestElement API reference page](https://material.angular.io/cdk/test-harnesses/api#TestElement) for the full list of methods. + +Do not expose `TestElement` instances to harness users unless it's an element the component consumer defines directly, such as the component's host element. Exposing `TestElement` instances for internal elements leads users to depend on a component's internal DOM structure. + +Instead, provide more narrow-focused methods for specific actions the end-user may take or particular state they may observe. For example, `MyPopupHarness` from previous sections could provide methods like `toggle` and `isOpen`: + + +class MyPopupHarness extends ComponentHarness { + static hostSelector = 'my-popup'; + + protected getTriggerElement = this.locatorFor('button'); + protected getContentElement = this.locatorForOptional('.my-popup-content'); + + /** Toggles the open state of the popup. */ + async toggle() { + const trigger = await this.getTriggerElement(); + return trigger.click(); + } + + /** Checks if the popup us open. */ + async isOpen() { + const content = await this.getContentElement(); + return !!content; + } +} + + +## Loading harnesses for subcomponents + +Larger components often compose sub-components. You can reflect this structure in a component's harness as well. Each of the `locatorFor` methods on `ComponentHarness` has an alternate signature that can be used for locating sub-harnesses rather than elements. + +See the [ComponentHarness API reference page](https://material.angular.io/cdk/test-harnesses/api#ComponentHarness) for the full list of the different locatorFor methods. + +For example, consider a menu build using the popup from above: + + +@Directive({ + selector: 'my-menu-item' +}) +class MyMenuItem {} + +@Component({ + selector: 'my-menu', + template: ` + + + + ` +}) +class MyMenu { + triggerText = input(''); + + @ContentChildren(MyMenuItem) items: QueryList; +} + + +The harness for `MyMenu` can then take advantage of other harnesses for `MyPopup` and `MyMenuItem`: + + +class MyMenuHarness extends ComponentHarness { + static hostSelector = 'my-menu'; + + protected getPopupHarness = this.locatorFor(MyPopupHarness); + + /** Gets the currently shown menu items (empty list if menu is closed). */ + getItems = this.locatorForAll(MyMenuItemHarness); + + /** Toggles open state of the menu. */ + async toggle() { + const popupHarness = await this.getPopupHarness(); + return popupHarness.toggle(); + } +} + +class MyMenuItemHarness extends ComponentHarness { + static hostSelector = 'my-menu-item'; +} + + +## Filtering harness instances with `HarnessPredicate` +When a page contains multiple instances of a particular component, you may want to filter based on some property of the component to get a particular component instance. For example, you may want a button with some specific text, or a menu with a specific ID. The `HarnessPredicate` class can capture criteria like this for a `ComponentHarness` subclass. While the test author is able to construct `HarnessPredicate` instances manually, it's easier when the `ComponentHarness` subclass provides a helper method to construct predicates for common filters. + +You should create a static `with()` method on each `ComponentHarness` subclass that returns a `HarnessPredicate` for that class. This allows test authors to write easily understandable code, e.g. `loader.getHarness(MyMenuHarness.with({selector: '#menu1'}))`. In addition to the standard selector and ancestor options, the `with` method should add any other options that make sense for the particular subclass. + +Harnesses that need to add additional options should extend the `BaseHarnessFilters` interface and additional optional properties as needed. `HarnessPredicate` provides several convenience methods for adding options: `stringMatches()`, `addOption()`, and `add()`. See the [HarnessPredicate API page](https://material.angular.io/cdk/test-harnesses/api#HarnessPredicate) for the full description. + +For example, when working with a menu it is useful to filter based on trigger text and to filter menu items based on their text: + + +interface MyMenuHarnessFilters extends BaseHarnessFilters { + /** Filters based on the trigger text for the menu. */ + triggerText?: string | RegExp; +} + +interface MyMenuItemHarnessFilters extends BaseHarnessFilters { + /** Filters based on the text of the menu item. */ + text?: string | RegExp; +} + +class MyMenuHarness extends ComponentHarness { + static hostSelector = 'my-menu'; + + /** Creates a `HarnessPredicate` used to locate a particular `MyMenuHarness`. */ + static with(options: MyMenuHarnessFilters): HarnessPredicate { + return new HarnessPredicate(MyMenuHarness, options) + .addOption('trigger text', options.triggerText, + (harness, text) => HarnessPredicate.stringMatches(harness.getTriggerText(), text)); + } + + protected getPopupHarness = this.locatorFor(MyPopupHarness); + + /** Gets the text of the menu trigger. */ + async getTriggerText(): Promise { + const popupHarness = await this.getPopupHarness(); + return popupHarness.getTriggerText(); + } + ... +} + +class MyMenuItemHarness extends ComponentHarness { + static hostSelector = 'my-menu-item'; + + /** Creates a `HarnessPredicate` used to locate a particular `MyMenuItemHarness`. */ + static with(options: MyMenuItemHarnessFilters): HarnessPredicate { + return new HarnessPredicate(MyMenuItemHarness, options) + .addOption('text', options.text, + (harness, text) => HarnessPredicate.stringMatches(harness.getText(), text)); + } + + /** Gets the text of the menu item. */ + async getText(): Promise { + const host = await this.host(); + return host.text(); + } +} + + +You can pass a `HarnessPredicate` instead of a `ComponentHarness` class to any of the APIs on `HarnessLoader`, `LocatorFactory`, or `ComponentHarness`. This allows test authors to easily target a particular component instance when creating a harness instance. It also allows the harness author to leverage the same `HarnessPredicate` to enable more powerful APIs on their harness class. For example, consider the `getItems` method on the `MyMenuHarness` shown above. Adding a filtering API allows users of the harness to search for particular menu items: + + +class MyMenuHarness extends ComponentHarness { + static hostSelector = 'my-menu'; + + /** Gets a list of items in the menu, optionally filtered based on the given criteria. */ + async getItems(filters: MyMenuItemHarnessFilters = {}): Promise { + const getFilteredItems = this.locatorForAll(MyMenuItemHarness.with(filters)); + return getFilteredItems(); + } + ... +} + + +## Creating `HarnessLoader` for elements that use content projection + +Some components project additional content into the component's template. See the [content projection guide](guide/components/content-projection) for more information. + +Add a `HarnessLoader` instance scoped to the element containing the `` when you create a harness for a component that uses content projection. This allows the user of the harness to load additional harnesses for whatever components were passed in as content. `ComponentHarness` has several methods that can be used to create HarnessLoader instances for cases like this: `harnessLoaderFor()`, `harnessLoaderForOptional()`, `harnessLoaderForAll()`. See the [HarnessLoader interface API reference page](https://material.angular.io/cdk/test-harnesses/api#HarnessLoader) for more details. + +For example, the `MyPopupHarness` example from above can extend `ContentContainerComponentHarness` to add support to load harnesses within the `` of the component. + + +class MyPopupHarness extends ContentContainerComponentHarness { + static hostSelector = 'my-popup'; +} + + +## Accessing elements outside of the component's host element + +There are times when a component harness might need to access elements outside of its corresponding component's host element. For example, code that displays a floating element or pop-up often attaches DOM elements directly to the document body, such as the `Overlay` service in Angular CDK. + +In this case, `ComponentHarness` provides a method that can be used to get a `LocatorFactory` for the root element of the document. The `LocatorFactory` supports most of the same APIs as the `ComponentHarness` base class, and can then be used to query relative to the document's root element. + +Consider if the `MyPopup` component above used the CDK overlay for the popup content, rather than an element in its own template. In this case, `MyPopupHarness` would have to access the content element via `documentRootLocatorFactory()` method that gets a locator factory rooted at the document root. + + +class MyPopupHarness extends ComponentHarness { + static hostSelector = 'my-popup'; + + /** Gets a `HarnessLoader` whose root element is the popup's content element. */ + async getHarnessLoaderForContent(): Promise { + const rootLocator = this.documentRootLocatorFactory(); + return rootLocator.harnessLoaderFor('my-popup-content'); + } +} + + +## Waiting for asynchronous tasks + +The methods on `TestElement` automatically trigger Angular's change detection and wait for tasks inside the `NgZone`. In most cases no special effort is required for harness authors to wait on asynchronous tasks. However, there are some edge cases where this may not be sufficient. + +Under some circumstances, Angular animations may require a second cycle of change detection and subsequent `NgZone` stabilization before animation events are fully flushed. In cases where this is needed, the `ComponentHarness` offers a `forceStabilize()` method that can be called to do the second round. + +You can use `NgZone.runOutsideAngular()` to schedule tasks outside of NgZone. Call the `waitForTasksOutsideAngular()` method on the corresponding harness if you need to explicitly wait for tasks outside `NgZone` since this does not happen automatically. diff --git a/adev/src/content/guide/testing/using-component-harnesses.md b/adev/src/content/guide/testing/using-component-harnesses.md new file mode 100644 index 000000000000..3eaae5847f42 --- /dev/null +++ b/adev/src/content/guide/testing/using-component-harnesses.md @@ -0,0 +1,207 @@ +# Using component harnesses in tests + +## Before you start + +Tip: This guide assumes you've already read the [component harnesses overview guide](guide/testing/component-harnesses-overview). Read that first if you're new to using component harnesses. + +### CDK Installation + +The [Component Dev Kit (CDK)](https://material.angular.io/cdk/categories) is a set of behavior primitives for building components. To use the component harnesses, first install `@angular/cdk` from npm. You can do this from your terminal using the Angular CLI: + + + ng add @angular/cdk + + +## Test harness environments and loaders + +You can use component test harnesses in different test environments. Angular CDK supports two built-in environments: +- Unit tests with Angular's `TestBed` +- End-to-end tests with [WebDriver](https://developer.mozilla.org/en-US/docs/Web/WebDriver) + + +Each environment provides a harness loader. The loader creates the harness instances you use throughout your tests. See below for more specific guidance on supported testing environments. + +Additional testing environments require custom bindings. See the [adding harness support for additional testing environments guide](guide/testing/component-harnesses-testing-environments) for more information. + +### Using the loader from `TestbedHarnessEnvironment` for unit tests + +For unit tests you can create a harness loader from [TestbedHarnessEnvironment](https://material.angular.io/cdk/test-harnesses/api#TestbedHarnessEnvironment). This environment uses a [component fixture](api/core/testing/ComponentFixture) created by Angular's `TestBed`. + +To create a harness loader rooted at the fixture's root element, use the `loader()` method: + + +const fixture = TestBed.createComponent(MyComponent); + +// Create a harness loader from the fixture +const loader = TestbedHarnessEnvironment.loader(fixture); +... + +// Use the loader to get harness instances +const myComponentHarness = await loader.getHarness(MyComponent); + + +To create a harness loader for harnesses for elements that fall outside the fixture, use the `documentRootLoader()` method. For example, code that displays a floating element or pop-up often attaches DOM elements directly to the document body, such as the `Overlay` service in Angular CDK. + +You can also create a harness loader directly with `harnessForFixture()` for a harness at that fixture's root element directly. + +### Using the loader from `SeleniumWebDriverHarnessEnvironment` for end-to-end tests + +For WebDriver-based end-to-end tests you can create a harness loader with `SeleniumWebDriverHarnessEnvironment`. + +Use the `loader()` method to get the harness loader instance for the current HTML document, rooted at the document's root element. This environment uses a WebDriver client. + + +let wd: webdriver.WebDriver = getMyWebDriverClient(); +const loader = SeleniumWebDriverHarnessEnvironment.loader(wd); +... +const myComponentHarness = await loader.getHarness(MyComponent); + + +## Using a harness loader + +Harness loader instances correspond to a specific DOM element and are used to create component harness instances for elements under that specific element. + +To get `ComponentHarness` for the first instance of the element, use the `getHarness()` method. You get all `ComponentHarness` instances, use the `getAllHarnesses()` method. + + +// Get harness for first instance of the element +const myComponentHarness = await loader.getHarness(MyComponent); + +// Get harnesses for all instances of the element +const myComponentHarnesses = await loader.getHarnesses(MyComponent); + + +As an example, consider a reusable dialog-button component that opens a dialog on click. It contains the following components, each with a corresponding harness: +- `MyDialogButton` (composes the `MyButton` and `MyDialog` with a convenient API) +- `MyButton` (a standard button component) +- `MyDialog` (a dialog appended to `document.body` by `MyDialogButton` upon click) + +The following test loads harnesses for each of these components: + + +let fixture: ComponentFixture; +let loader: HarnessLoader; +let rootLoader: HarnessLoader; + +beforeEach(() => { + fixture = TestBed.createComponent(MyDialogButton); + loader = TestbedHarnessEnvironment.loader(fixture); + rootLoader = TestbedHarnessEnvironment.documentRootLoader(fixture); +}); + +it('loads harnesses', async () => { + // Load a harness for the bootstrapped component with `harnessForFixture` + dialogButtonHarness = + await TestbedHarnessEnvironment.harnessForFixture(fixture, MyDialogButtonHarness); + // The button element is inside the fixture's root element, so we use `loader`. + const buttonHarness = await loader.getHarness(MyButtonHarness); + // Click the button to open the dialog + await buttonHarness.click(); + // The dialog is appended to `document.body`, outside of the fixture's root element, + // so we use `rootLoader` in this case. + const dialogHarness = await rootLoader.getHarness(MyDialogHarness); + // ... make some assertions +}); + + +### Harness behavior in different environments + +Harnesses may not behave exactly the same in all environments. Some differences are unavoidable between the real user interaction versus the simulated events generated in unit tests. Angular CDK makes a best effort to normalize the behavior to the extent possible. + +### Interacting with child elements + +To interact with elements below the root element of this harness loader, use the `HarnessLoader` instance of a child element. For the first instance of the child element, use the `getChildLoader()` method. For all instances of the child element, use the `getAllChildLoaders()` method. + + +const myComponentHarness = await loader.getHarness(MyComponent); + +// Get loader for first instance of child element with '.child' selector +const childLoader = await myComponentHarness.getLoader('.child'); + +// Get loaders for all instances of child elements with '.child' selector +const allChildLoaders = await myComponentHarness.getAllChildLoaders('.child'); + + +### Filtering harnesses + +When a page contains multiple instances of a particular component, you may want to filter based on some property of the component to get a particular component instance. You can use a harness predicate, a class used to associate a `ComponentHarness` class with predicates functions that can be used to filter component instances, to do so. + +When you ask a `HarnessLoader` for a harness, you're actually providing a HarnessQuery. A query can be one of two things: +- A harness constructor. This just gets that harness +- A `HarnessPredicate`, which gets harnesses that are filtered based on one or more conditions + +`HarnessPredicate` does support some base filters (selector, ancestor) that work on anything that extends `ComponentHarness`. + + +// Example of loading a MyButtonComponentHarness with a harness predicate +const disabledButtonPredicate = new HarnessPredicate(MyButtonComponentHarness, {selector: '[disabled]'}); +const disabledButton = await loader.getHarness(disabledButtonPredicate); + + +However it's common for harnesses to implement a static `with()` method that accepts component-specific filtering options and returns a `HarnessPredicate`. + + +// Example of loading a MyButtonComponentHarness with a specific selector +const button = await loader.getHarness(MyButtonComponentHarness.with({selector: 'btn'})) + + +For more details refer to the specific harness documentation since additional filtering options are specific to each harness implementation. + +## Using test harness APIs + +While every harness defines an API specific to its corresponding component, they all share a common base class, [ComponentHarness](https://material.angular.io/cdk/test-harnesses/api#ComponentHarness). This base class defines a static property, `hostSelector`, that matches the harness class to instances of the component in the DOM. + +Beyond that, the API of any given harness is specific to its corresponding component; refer to the component's documentation to learn how to use a specific harness. + +As an example, the following is a test for a component that uses the [Angular Material slider component harness](https://material.angular.io/components/slider/api#MatSliderHarness): + + +it('should get value of slider thumb', async () => { + const slider = await loader.getHarness(MatSliderHarness); + const thumb = await slider.getEndThumb(); + expect(await thumb.getValue()).toBe(50); +}); + + +## Interop with Angular change detection + +By default, test harnesses runs Angular's [change detection](https://angular.dev/best-practices/runtime-performance) before reading the state of a DOM element and after interacting with a DOM element. + +There may be times that you need finer-grained control over change detection in your tests. such as checking the state of a component while an async operation is pending. In these cases use the `manualChangeDetection` function to disable automatic handling of change detection for a block of code. + + +it('checks state while async action is in progress', async () => { + const buttonHarness = loader.getHarness(MyButtonHarness); + await manualChangeDetection(async () => { + await buttonHarness.click(); + fixture.detectChanges(); + // Check expectations while async click operation is in progress. + expect(isProgressSpinnerVisible()).toBe(true); + await fixture.whenStable(); + // Check expectations after async click operation complete. + expect(isProgressSpinnerVisible()).toBe(false); + }); +}); + + +Almost all harness methods are asynchronous and return a `Promise` to support the following: +- Support for unit tests +- Support for end-to-end tests +- Insulate tests against changes in asynchronous behavior + +The Angular team recommends using [await](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function) to improve the test readability. Calling `await` blocks the execution of your test until the associated `Promise` resolves. + +Occasionally, you may want to perform multiple actions simultaneously and wait until they're all done rather than performing each action sequentially. For example, read multiple properties of a single component. In these situations use the `parallel` function to parallelize the operations. The parallel function works similarly to `Promise.all`, while also optimizing change detection checks. + + +it('reads properties in parallel', async () => { + const checkboxHarness = loader.getHarness(MyCheckboxHarness); + // Read the checked and intermediate properties simultaneously. + const [checked, indeterminate] = await parallel(() => [ + checkboxHarness.isChecked(), + checkboxHarness.isIndeterminate() + ]); + expect(checked).toBe(false); + expect(indeterminate).toBe(true); +}); + From c4ad8fb2e7e18d6c32ccc1918fb94fd09680cd75 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Fri, 20 Dec 2024 17:21:27 +0100 Subject: [PATCH 0054/1220] refactor(core): profiler takes null as a default instance (#59233) Several profiler calls don't have any meaningful instance when producing a profiling event. This commit changes the default instance value to null to sreamline profiler invocations. PR Close #59233 --- .../ng-devtools-backend/src/lib/hooks/profiler/native.ts | 2 +- packages/core/src/render3/profiler.ts | 2 +- packages/core/src/render3/profiler_types.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/devtools/projects/ng-devtools-backend/src/lib/hooks/profiler/native.ts b/devtools/projects/ng-devtools-backend/src/lib/hooks/profiler/native.ts index 7f474baea23f..c9e05625fedb 100644 --- a/devtools/projects/ng-devtools-backend/src/lib/hooks/profiler/native.ts +++ b/devtools/projects/ng-devtools-backend/src/lib/hooks/profiler/native.ts @@ -43,7 +43,7 @@ export class NgProfiler extends Profiler { private _initialize(): void { ngDebugClient().ɵsetProfiler( - (event: ɵProfilerEvent, instanceOrLView: {} | null, hookOrListener: any) => + (event: ɵProfilerEvent, instanceOrLView: {} | null = null, hookOrListener: any) => this._callbacks.forEach((cb) => cb(event, instanceOrLView, hookOrListener)), ); } diff --git a/packages/core/src/render3/profiler.ts b/packages/core/src/render3/profiler.ts index 4684e1e42be2..d52d232e00a9 100644 --- a/packages/core/src/render3/profiler.ts +++ b/packages/core/src/render3/profiler.ts @@ -33,7 +33,7 @@ export const setProfiler = (profiler: Profiler | null) => { * execution context * @returns */ -export const profiler: Profiler = function (event, instance, hookOrListener) { +export const profiler: Profiler = function (event, instance = null, hookOrListener) { if (profilerCallback != null /* both `null` and `undefined` */) { profilerCallback(event, instance, hookOrListener); } diff --git a/packages/core/src/render3/profiler_types.ts b/packages/core/src/render3/profiler_types.ts index 5e7d155b55ae..f8a42a2d8447 100644 --- a/packages/core/src/render3/profiler_types.ts +++ b/packages/core/src/render3/profiler_types.ts @@ -160,5 +160,5 @@ export const enum ProfilerEvent { * Profiler function which the runtime will invoke before and after user code. */ export interface Profiler { - (event: ProfilerEvent, instance: {} | null, hookOrListener?: (e?: any) => any): void; + (event: ProfilerEvent, instance?: {} | null, hookOrListener?: (e?: any) => any): void; } From 435d31ed5f632f5e7e8702c2dc225df6eda1ffbe Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Wed, 18 Dec 2024 11:56:31 +0100 Subject: [PATCH 0055/1220] refactor(core): add profiler calls for tne newly introduced events (#59233) The set of profiler events was recently extended. This commit plugs newly created events dispatch into the approriate places of the Angular core. PR Close #59233 --- .../core/src/application/application_ref.ts | 14 +- .../src/application/create_application.ts | 6 +- packages/core/src/defer/rendering.ts | 6 + .../core/src/render3/after_render/manager.ts | 25 ++- packages/core/src/render3/component_ref.ts | 5 + .../render3/instructions/change_detection.ts | 6 + .../core/src/render3/instructions/render.ts | 6 + .../core/src/render3/instructions/shared.ts | 3 + .../core/test/acceptance/profiler_spec.ts | 150 ++++++++++++++++-- 9 files changed, 200 insertions(+), 21 deletions(-) diff --git a/packages/core/src/application/application_ref.ts b/packages/core/src/application/application_ref.ts index 349f5de9657c..50bc3e24ffb3 100644 --- a/packages/core/src/application/application_ref.ts +++ b/packages/core/src/application/application_ref.ts @@ -47,6 +47,8 @@ import {NgZone} from '../zone/ng_zone'; 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 @@ -531,6 +533,8 @@ export class ApplicationRef { componentOrFactory: ComponentFactory | Type, rootSelectorOrNode?: string | any, ): ComponentRef { + profiler(ProfilerEvent.BootstrapComponentStart); + (typeof ngDevMode === 'undefined' || ngDevMode) && warnIfDestroyed(this._destroyed); const isComponentFactory = componentOrFactory instanceof ComponentFactory; const initStatus = this._injector.get(ApplicationInitStatus); @@ -576,6 +580,9 @@ export class ApplicationRef { const _console = this._injector.get(Console); _console.log(`Angular is running in development mode.`); } + + profiler(ProfilerEvent.BootstrapComponentEnd, compRef); + return compRef; } @@ -598,6 +605,8 @@ export class ApplicationRef { /** @internal */ _tick = (): void => { + profiler(ProfilerEvent.ChangeDetectionStart); + if (this.tracingSnapshot !== null) { const snapshot = this.tracingSnapshot; this.tracingSnapshot = null; @@ -622,7 +631,6 @@ export class ApplicationRef { try { this._runningTick = true; this.synchronize(); - if (typeof ngDevMode === 'undefined' || ngDevMode) { for (let view of this.allViews) { view.checkNoChanges(); @@ -635,6 +643,8 @@ export class ApplicationRef { this._runningTick = false; setActiveConsumer(prevConsumer); this.afterTick.next(); + + profiler(ProfilerEvent.ChangeDetectionEnd); } }; @@ -653,7 +663,9 @@ export class ApplicationRef { let runs = 0; while (this.dirtyFlags !== ApplicationRefDirtyFlags.None && runs++ < MAXIMUM_REFRESH_RERUNS) { + profiler(ProfilerEvent.ChangeDetectionSyncStart); this.synchronizeOnce(); + profiler(ProfilerEvent.ChangeDetectionSyncEnd); } if ((typeof ngDevMode === 'undefined' || ngDevMode) && runs >= MAXIMUM_REFRESH_RERUNS) { diff --git a/packages/core/src/application/create_application.ts b/packages/core/src/application/create_application.ts index 83d276b11b16..0656d8bad741 100644 --- a/packages/core/src/application/create_application.ts +++ b/packages/core/src/application/create_application.ts @@ -13,12 +13,13 @@ import {Type} from '../interface/type'; import {createOrReusePlatformInjector} from '../platform/platform'; import {assertStandaloneComponentType} from '../render3/errors'; import {EnvironmentNgModuleRefAdapter} from '../render3/ng_module_ref'; -import {NgZone} from '../zone/ng_zone'; import {_callAndReportToErrorHandler, 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'; +import {profiler} from '../render3/profiler'; +import {ProfilerEvent} from '../render3/profiler_types'; /** * Internal create application API that implements the core application creation logic and optional @@ -37,6 +38,7 @@ export function internalCreateApplication(config: { appProviders?: Array; platformProviders?: Provider[]; }): Promise { + profiler(ProfilerEvent.BootstrapApplicationStart); try { const {rootComponent, appProviders, platformProviders} = config; @@ -69,5 +71,7 @@ export function internalCreateApplication(config: { }); } catch (e) { return Promise.reject(e); + } finally { + profiler(ProfilerEvent.BootstrapApplicationEnd); } } diff --git a/packages/core/src/defer/rendering.ts b/packages/core/src/defer/rendering.ts index 4a3e6cc0a60a..b6a4c3939532 100644 --- a/packages/core/src/defer/rendering.ts +++ b/packages/core/src/defer/rendering.ts @@ -56,6 +56,8 @@ import { getTDeferBlockDetails, getTemplateIndexForState, } from './utils'; +import {profiler} from '../render3/profiler'; +import {ProfilerEvent} from '../render3/profiler_types'; /** * **INTERNAL**, avoid referencing it in application code. @@ -243,6 +245,8 @@ function applyDeferBlockState( tNode: TNode, hostLView: LView, ) { + profiler(ProfilerEvent.DeferBlockStateStart); + const stateTmplIndex = getTemplateIndexForState(newState, hostLView, tNode); if (stateTmplIndex !== null) { @@ -306,6 +310,8 @@ function applyDeferBlockState( lDetails[ON_COMPLETE_FNS] = null; } } + + profiler(ProfilerEvent.DeferBlockStateEnd); } /** diff --git a/packages/core/src/render3/after_render/manager.ts b/packages/core/src/render3/after_render/manager.ts index 8472188da363..ed7c0670e18f 100644 --- a/packages/core/src/render3/after_render/manager.ts +++ b/packages/core/src/render3/after_render/manager.ts @@ -17,6 +17,8 @@ import { } from '../../change_detection/scheduling/zoneless_scheduling'; import {type DestroyRef} from '../../linker/destroy_ref'; import {TracingAction, TracingService, TracingSnapshot} from '../../application/tracing'; +import {profiler} from '../profiler'; +import {ProfilerEvent} from '../profiler_types'; export class AfterRenderManager { impl: AfterRenderImpl | null = null; @@ -65,6 +67,12 @@ export class AfterRenderImpl { * might be scheduled. */ execute(): void { + const hasSequencesToExecute = this.sequences.size > 0; + + if (hasSequencesToExecute) { + profiler(ProfilerEvent.AfterRenderHooksStart); + } + this.executing = true; for (const phase of AFTER_RENDER_PHASES) { for (const sequence of this.sequences) { @@ -74,10 +82,15 @@ export class AfterRenderImpl { try { sequence.pipelinedValue = this.ngZone.runOutsideAngular(() => - this.maybeTrace( - () => sequence.hooks[phase]!(sequence.pipelinedValue), - sequence.snapshot, - ), + this.maybeTrace(() => { + const hookFn = sequence.hooks[phase]!; + + profiler(ProfilerEvent.LifecycleHookStart, null, hookFn); + const value = hookFn(sequence.pipelinedValue); + profiler(ProfilerEvent.LifecycleHookEnd, null, hookFn); + + return value; + }, sequence.snapshot), ); } catch (err) { sequence.erroredOrDestroyed = true; @@ -105,6 +118,10 @@ export class AfterRenderImpl { this.scheduler.notify(NotificationSource.DeferredRenderHook); } this.deferredRegistrations.clear(); + + if (hasSequencesToExecute) { + profiler(ProfilerEvent.AfterRenderHooksEnd); + } } register(sequence: AfterRenderSequence): void { diff --git a/packages/core/src/render3/component_ref.ts b/packages/core/src/render3/component_ref.ts index 80862a6a44ed..11b317733944 100644 --- a/packages/core/src/render3/component_ref.ts +++ b/packages/core/src/render3/component_ref.ts @@ -89,6 +89,8 @@ import {getComponentLViewByIndex, getNativeByTNode, getTNode} from './util/view_ import {ViewRef} from './view_ref'; import {ChainedInjector} from './chained_injector'; import {unregisterLView} from './interfaces/lview_tracking'; +import {profiler} from './profiler'; +import {ProfilerEvent} from './profiler_types'; export class ComponentFactoryResolver extends AbstractComponentFactoryResolver { /** @@ -214,6 +216,8 @@ export class ComponentFactory extends AbstractComponentFactory { rootSelectorOrNode?: any, environmentInjector?: NgModuleRef | EnvironmentInjector | undefined, ): AbstractComponentRef { + profiler(ProfilerEvent.DynamicComponentStart); + const prevConsumer = setActiveConsumer(null); try { // Check if the component is orphan @@ -397,6 +401,7 @@ export class ComponentFactory extends AbstractComponentFactory { unregisterLView(rootLView); throw e; } finally { + profiler(ProfilerEvent.DynamicComponentEnd); leaveView(); } diff --git a/packages/core/src/render3/instructions/change_detection.ts b/packages/core/src/render3/instructions/change_detection.ts index 06fe193302da..514cc9eb8af8 100644 --- a/packages/core/src/render3/instructions/change_detection.ts +++ b/packages/core/src/render3/instructions/change_detection.ts @@ -70,6 +70,8 @@ import { } from './shared'; import {runEffectsInView} from '../reactivity/view_effect_runner'; import {isDestroyed} from '../interfaces/type_checks'; +import {ProfilerEvent} from '../profiler_types'; +import {profiler} from '../profiler'; /** * The maximum number of times the change detection traversal will rerun before throwing an error. @@ -428,8 +430,12 @@ function detectChangesInComponent( mode: ChangeDetectionMode, ): void { ngDevMode && assertEqual(isCreationMode(hostLView), false, 'Should be run in update mode'); + profiler(ProfilerEvent.ComponentStart); + const componentView = getComponentLViewByIndex(componentHostIdx, hostLView); detectChangesInViewIfAttached(componentView, mode); + + profiler(ProfilerEvent.ComponentEnd, componentView[CONTEXT] as any as {}); } /** diff --git a/packages/core/src/render3/instructions/render.ts b/packages/core/src/render3/instructions/render.ts index c4806cf5efec..df95d36b0659 100644 --- a/packages/core/src/render3/instructions/render.ts +++ b/packages/core/src/render3/instructions/render.ts @@ -21,6 +21,8 @@ import { TVIEW, TView, } from '../interfaces/view'; +import {profiler} from '../profiler'; +import {ProfilerEvent} from '../profiler_types'; import {enterView, leaveView} from '../state'; import {getComponentLViewByIndex, isCreationMode} from '../util/view_utils'; @@ -38,7 +40,11 @@ export function renderComponent(hostLView: LView, componentHostIdx: number) { componentView[HYDRATION] = retrieveHydrationInfo(hostRNode, componentView[INJECTOR]); } + profiler(ProfilerEvent.ComponentStart); + renderView(componentTView, componentView, componentView[CONTEXT]); + + profiler(ProfilerEvent.ComponentEnd, componentView[CONTEXT] as any as {}); } /** diff --git a/packages/core/src/render3/instructions/shared.ts b/packages/core/src/render3/instructions/shared.ts index 729b2fca26cf..aa542fdf8d1d 100644 --- a/packages/core/src/render3/instructions/shared.ts +++ b/packages/core/src/render3/instructions/shared.ts @@ -182,7 +182,10 @@ export function processHostBindingOpCodes(tView: TView, lView: LView): void { const hostBindingFn = hostBindingOpCodes[++i] as HostBindingsFunction; setBindingRootForHostBindings(bindingRootIndx, directiveIdx); const context = lView[directiveIdx]; + + profiler(ProfilerEvent.HostBindingsUpdateStart, context); hostBindingFn(RenderFlags.Update, context); + profiler(ProfilerEvent.HostBindingsUpdateEnd, context); } } } finally { diff --git a/packages/core/test/acceptance/profiler_spec.ts b/packages/core/test/acceptance/profiler_spec.ts index 1d77e9568a3f..52bdc41fbbf1 100644 --- a/packages/core/test/acceptance/profiler_spec.ts +++ b/packages/core/test/acceptance/profiler_spec.ts @@ -13,6 +13,7 @@ import {TestBed} from '@angular/core/testing'; import { AfterContentChecked, AfterContentInit, + afterRender, AfterViewChecked, AfterViewInit, Component, @@ -28,14 +29,14 @@ import { } from '../../src/core'; describe('profiler', () => { - class Profiler { + class TestProfiler { profile() {} } let profilerSpy: jasmine.Spy; beforeEach(() => { - const profiler = new Profiler(); + const profiler = new TestProfiler(); profilerSpy = spyOn(profiler, 'profile').and.callThrough(); setProfiler(profiler.profile); }); @@ -400,27 +401,146 @@ describe('profiler', () => { expect(serviceNgOnDestroyStart).toBeTruthy(); expect(serviceNgOnDestroyEnd).toBeTruthy(); }); + + it('should call the profiler on lifecycle execution even after error', () => { + @Component({selector: 'my-comp', template: '', standalone: false}) + class MyComponent implements OnInit { + ngOnInit() { + throw new Error(); + } + } + + TestBed.configureTestingModule({declarations: [MyComponent]}); + const fixture = TestBed.createComponent(MyComponent); + + expect(() => { + fixture.detectChanges(); + }).toThrow(); + + const lifecycleStart = findProfilerCall(ProfilerEvent.LifecycleHookStart); + const lifecycleEnd = findProfilerCall(ProfilerEvent.LifecycleHookEnd); + + expect(lifecycleStart).toBeTruthy(); + expect(lifecycleEnd).toBeTruthy(); + }); }); - it('should call the profiler on lifecycle execution even after error', () => { - @Component({selector: 'my-comp', template: '', standalone: false}) - class MyComponent implements OnInit { - ngOnInit() { - throw new Error(); + describe('entry point events', () => { + class EventRecordingProfiler { + events: ProfilerEvent[] = []; + + clearEvents() { + this.events.length = 0; } + + hasEvents(...events: ProfilerEvent[]): boolean { + for (const e of events) { + if (this.events.indexOf(e) === -1) { + return false; + } + } + + return true; + } + + profile = ( + event: ProfilerEvent, + instance?: {} | null, + hookOrListener?: (e?: any) => any, + ): void => { + this.events.push(event); + }; } - TestBed.configureTestingModule({declarations: [MyComponent]}); - const fixture = TestBed.createComponent(MyComponent); + let p: EventRecordingProfiler; - expect(() => { + beforeEach(() => { + p = new EventRecordingProfiler(); + setProfiler(p.profile); + }); + + afterEach(() => { + setProfiler(null); + }); + + it('should capture component creation and change detection entry points', () => { + @Component({selector: 'my-comp', template: ''}) + class MyComponent {} + + const fixture = TestBed.createComponent(MyComponent); + expect(p.events).toEqual([ + ProfilerEvent.DynamicComponentStart, + ProfilerEvent.ComponentStart, + ProfilerEvent.TemplateCreateStart, + ProfilerEvent.TemplateCreateEnd, + ProfilerEvent.ComponentEnd, + ProfilerEvent.DynamicComponentEnd, + ProfilerEvent.ChangeDetectionStart, + ProfilerEvent.ChangeDetectionSyncStart, + ProfilerEvent.ChangeDetectionSyncEnd, + ProfilerEvent.ChangeDetectionEnd, + ]); + + p.clearEvents(); + fixture.detectChanges(false); + + expect( + p.hasEvents(ProfilerEvent.TemplateUpdateStart, ProfilerEvent.TemplateUpdateEnd), + ).toBeTrue(); + }); + + it('should invoke a profiler when host bindings are evaluated', () => { + @Component({ + selector: 'my-comp', + host: { + '[id]': '"someId"', + }, + template: '', + }) + class MyComponent {} + + const fixture = TestBed.createComponent(MyComponent); + fixture.detectChanges(); + + expect( + p.hasEvents(ProfilerEvent.HostBindingsUpdateStart, ProfilerEvent.HostBindingsUpdateEnd), + ).toBeTrue(); + }); + + it('should invoke a profiler when after render hooks are executing', () => { + @Component({ + selector: 'my-comp', + template: '', + }) + class MyComponent { + arRef = afterRender(() => {}); + } + + const fixture = TestBed.createComponent(MyComponent); fixture.detectChanges(); - }).toThrow(); - const lifecycleStart = findProfilerCall(ProfilerEvent.LifecycleHookStart); - const lifecycleEnd = findProfilerCall(ProfilerEvent.LifecycleHookEnd); + expect( + p.hasEvents(ProfilerEvent.AfterRenderHooksStart, ProfilerEvent.AfterRenderHooksEnd), + ).toBeTrue(); + }); - expect(lifecycleStart).toBeTruthy(); - expect(lifecycleEnd).toBeTruthy(); + it('should invoke a profiler when defer block transitions between states', () => { + @Component({ + selector: 'my-comp', + template: ` + @defer (on immediate) { + nothing to see here... + } + `, + }) + class MyComponent {} + + const fixture = TestBed.createComponent(MyComponent); + fixture.detectChanges(); + + expect( + p.hasEvents(ProfilerEvent.DeferBlockStateStart, ProfilerEvent.DeferBlockStateEnd), + ).toBeTrue(); + }); }); }); From 915593ad25c4f4e373f34fcbc794cfebb0a22260 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Sat, 11 Jan 2025 09:18:50 +0100 Subject: [PATCH 0056/1220] refactor(compiler): fix typo in method name (#59479) Fixes a typo in the `AstVisitor.visitTypeofExpresion` method's name. PR Close #59479 --- .../compiler-cli/src/ngtsc/typecheck/src/expression.ts | 4 ++-- packages/compiler/src/expression_parser/ast.ts | 10 +++++----- packages/compiler/src/expression_parser/serializer.ts | 2 +- .../compiler/test/expression_parser/utils/unparser.ts | 2 +- .../compiler/test/expression_parser/utils/validator.ts | 4 ++-- packages/compiler/test/render3/util/expression.ts | 4 ++-- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/compiler-cli/src/ngtsc/typecheck/src/expression.ts b/packages/compiler-cli/src/ngtsc/typecheck/src/expression.ts index f6ebcde33b35..99cfa57585e4 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/src/expression.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/src/expression.ts @@ -276,7 +276,7 @@ class AstTranslator implements AstVisitor { return node; } - visitTypeofExpresion(ast: TypeofExpression): ts.Expression { + visitTypeofExpression(ast: TypeofExpression): ts.Expression { const expression = wrapForDiagnostics(this.translate(ast.expression)); const node = ts.factory.createTypeOfExpression(expression); addParseSpanInfo(node, ast.sourceSpan); @@ -549,7 +549,7 @@ class VeSafeLhsInferenceBugDetector implements AstVisitor { visitPrefixNot(ast: PrefixNot): boolean { return ast.expression.visit(this); } - visitTypeofExpresion(ast: PrefixNot): boolean { + visitTypeofExpression(ast: PrefixNot): boolean { return ast.expression.visit(this); } visitNonNullAssert(ast: PrefixNot): boolean { diff --git a/packages/compiler/src/expression_parser/ast.ts b/packages/compiler/src/expression_parser/ast.ts index 89259539cb48..cab6103e2cde 100644 --- a/packages/compiler/src/expression_parser/ast.ts +++ b/packages/compiler/src/expression_parser/ast.ts @@ -382,7 +382,7 @@ export class TypeofExpression extends AST { super(span, sourceSpan); } override visit(visitor: AstVisitor, context: any = null): any { - return visitor.visitTypeofExpresion(this, context); + return visitor.visitTypeofExpression(this, context); } } @@ -547,7 +547,7 @@ export interface AstVisitor { visitLiteralPrimitive(ast: LiteralPrimitive, context: any): any; visitPipe(ast: BindingPipe, context: any): any; visitPrefixNot(ast: PrefixNot, context: any): any; - visitTypeofExpresion(ast: TypeofExpression, context: any): any; + visitTypeofExpression(ast: TypeofExpression, context: any): any; visitNonNullAssert(ast: NonNullAssert, context: any): any; visitPropertyRead(ast: PropertyRead, context: any): any; visitPropertyWrite(ast: PropertyWrite, context: any): any; @@ -615,7 +615,7 @@ export class RecursiveAstVisitor implements AstVisitor { visitPrefixNot(ast: PrefixNot, context: any): any { this.visit(ast.expression, context); } - visitTypeofExpresion(ast: TypeofExpression, context: any) { + visitTypeofExpression(ast: TypeofExpression, context: any) { this.visit(ast.expression, context); } visitNonNullAssert(ast: NonNullAssert, context: any): any { @@ -732,7 +732,7 @@ export class AstTransformer implements AstVisitor { return new PrefixNot(ast.span, ast.sourceSpan, ast.expression.visit(this)); } - visitTypeofExpresion(ast: TypeofExpression, context: any): AST { + visitTypeofExpression(ast: TypeofExpression, context: any): AST { return new TypeofExpression(ast.span, ast.sourceSpan, ast.expression.visit(this)); } @@ -912,7 +912,7 @@ export class AstMemoryEfficientTransformer implements AstVisitor { return ast; } - visitTypeofExpresion(ast: TypeofExpression, context: any): AST { + visitTypeofExpression(ast: TypeofExpression, context: any): AST { const expression = ast.expression.visit(this); if (expression !== ast.expression) { return new TypeofExpression(ast.span, ast.sourceSpan, expression); diff --git a/packages/compiler/src/expression_parser/serializer.ts b/packages/compiler/src/expression_parser/serializer.ts index 6cc2dc670c34..6e65754ce468 100644 --- a/packages/compiler/src/expression_parser/serializer.ts +++ b/packages/compiler/src/expression_parser/serializer.ts @@ -136,7 +136,7 @@ class SerializeExpressionVisitor implements expr.AstVisitor { .join(', ')})`; } - visitTypeofExpresion(ast: expr.TypeofExpression, context: any) { + visitTypeofExpression(ast: expr.TypeofExpression, context: any) { return `typeof ${ast.expression.visit(this, context)}`; } diff --git a/packages/compiler/test/expression_parser/utils/unparser.ts b/packages/compiler/test/expression_parser/utils/unparser.ts index 4e6fbab9d977..e90b29f0bcaf 100644 --- a/packages/compiler/test/expression_parser/utils/unparser.ts +++ b/packages/compiler/test/expression_parser/utils/unparser.ts @@ -193,7 +193,7 @@ class Unparser implements AstVisitor { this._visit(ast.expression); } - visitTypeofExpresion(ast: TypeofExpression, context: any) { + visitTypeofExpression(ast: TypeofExpression, context: any) { this._expression += 'typeof '; this._visit(ast.expression); } diff --git a/packages/compiler/test/expression_parser/utils/validator.ts b/packages/compiler/test/expression_parser/utils/validator.ts index 4f915a552d3a..cbd3a674ef8c 100644 --- a/packages/compiler/test/expression_parser/utils/validator.ts +++ b/packages/compiler/test/expression_parser/utils/validator.ts @@ -113,8 +113,8 @@ class ASTValidator extends RecursiveAstVisitor { this.validate(ast, () => super.visitPrefixNot(ast, context)); } - override visitTypeofExpresion(ast: TypeofExpression, context: any): any { - this.validate(ast, () => super.visitTypeofExpresion(ast, context)); + override visitTypeofExpression(ast: TypeofExpression, context: any): any { + this.validate(ast, () => super.visitTypeofExpression(ast, context)); } override visitPropertyRead(ast: PropertyRead, context: any): any { diff --git a/packages/compiler/test/render3/util/expression.ts b/packages/compiler/test/render3/util/expression.ts index 69bb4c3dd943..26c7de479937 100644 --- a/packages/compiler/test/render3/util/expression.ts +++ b/packages/compiler/test/render3/util/expression.ts @@ -87,9 +87,9 @@ class ExpressionSourceHumanizer extends e.RecursiveAstVisitor implements t.Visit this.recordAst(ast); super.visitPrefixNot(ast, null); } - override visitTypeofExpresion(ast: e.TypeofExpression) { + override visitTypeofExpression(ast: e.TypeofExpression) { this.recordAst(ast); - super.visitTypeofExpresion(ast, null); + super.visitTypeofExpression(ast, null); } override visitPropertyRead(ast: e.PropertyRead) { this.recordAst(ast); From 9931030b0ef27b4dcfcb609cc1a614a9c120259a Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Mon, 13 Jan 2025 13:39:44 +0100 Subject: [PATCH 0057/1220] test(migrations): add test for earlier fix (#59497) Adds a test for the fix from #59452 now that we know what caused the issue. PR Close #59497 --- .../cleanup_unused_imports_migration_spec.ts | 54 +++++++++++++++---- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/packages/core/schematics/test/cleanup_unused_imports_migration_spec.ts b/packages/core/schematics/test/cleanup_unused_imports_migration_spec.ts index bdb9877dc765..0ac3649c7cf8 100644 --- a/packages/core/schematics/test/cleanup_unused_imports_migration_spec.ts +++ b/packages/core/schematics/test/cleanup_unused_imports_migration_spec.ts @@ -37,16 +37,7 @@ describe('cleanup unused imports schematic', () => { host = new TempScopedNodeJsSyncHost(); tree = new UnitTestTree(new HostTree(host)); - writeFile( - '/tsconfig.json', - JSON.stringify({ - compilerOptions: { - lib: ['es2015'], - strictNullChecks: true, - }, - }), - ); - + writeFile('/tsconfig.json', '{}'); writeFile( '/angular.json', JSON.stringify({ @@ -253,4 +244,47 @@ describe('cleanup unused imports schematic', () => { expect(tree.readContent('comp.ts')).toBe(initialContent); }); + + it('should handle a file that is present in multiple projects', async () => { + writeFile('/tsconfig-2.json', '{}'); + writeFile( + '/angular.json', + JSON.stringify({ + version: 1, + projects: { + a: {root: '', architect: {build: {options: {tsConfig: './tsconfig.json'}}}}, + b: {root: '', architect: {build: {options: {tsConfig: './tsconfig-2.json'}}}}, + }, + }), + ); + + writeFile( + 'comp.ts', + ` + import {Component} from '@angular/core'; + import {One, Two, Three} from './directives'; + + @Component({ + imports: [Three, One, Two], + template: '
', + }) + export class Comp {} + `, + ); + + await runMigration(); + + expect(stripWhitespace(tree.readContent('comp.ts'))).toBe( + stripWhitespace(` + import {Component} from '@angular/core'; + import {One} from './directives'; + + @Component({ + imports: [One], + template: '
', + }) + export class Comp {} + `), + ); + }); }); From 783c5bb586e24d5a1618dc427213328fa56be58a Mon Sep 17 00:00:00 2001 From: arturovt Date: Fri, 10 Jan 2025 18:40:47 +0200 Subject: [PATCH 0058/1220] refactor(core): change node navigation step to plain const (#59469) We change the `enum` to a plain `const` to eliminate extra bytes, as `enum` is not really required. We might not be able to switch to `const enum` due to single-file compilation restrictions. PR Close #59469 --- packages/core/src/hydration/interfaces.ts | 12 ++++++++---- packages/core/src/hydration/node_lookup_utils.ts | 12 +++++++----- .../bundling/hydration/bundle.golden_symbols.json | 1 - packages/core/test/hydration/compression_spec.ts | 6 ++++-- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/packages/core/src/hydration/interfaces.ts b/packages/core/src/hydration/interfaces.ts index 5808b1795710..42a051e8e4d3 100644 --- a/packages/core/src/hydration/interfaces.ts +++ b/packages/core/src/hydration/interfaces.ts @@ -19,11 +19,15 @@ export const REFERENCE_NODE_BODY = 'b'; /** * Describes navigation steps that the runtime logic need to perform, * starting from a given (known) element. + * We're not using enum `NodeNavigationStep` because it produces more code overhead; + * thus, using plain `const` eliminates extra bytes. We can't use `const enum` due + * to single-file compilation restrictions. */ -export enum NodeNavigationStep { - FirstChild = 'f', - NextSibling = 'n', -} + +export type NodeNavigationStep = 'f' | 'n'; + +export const NODE_NAVIGATION_STEP_FIRST_CHILD = 'f'; +export const NODE_NAVIGATION_STEP_NEXT_SIBLING = 'n'; /** * Keys within serialized view data structure to represent various diff --git a/packages/core/src/hydration/node_lookup_utils.ts b/packages/core/src/hydration/node_lookup_utils.ts index 48a26b4d5f64..f3b73c794cc4 100644 --- a/packages/core/src/hydration/node_lookup_utils.ts +++ b/packages/core/src/hydration/node_lookup_utils.ts @@ -29,6 +29,8 @@ import { } from './error_handling'; import { DehydratedView, + NODE_NAVIGATION_STEP_FIRST_CHILD, + NODE_NAVIGATION_STEP_NEXT_SIBLING, NodeNavigationStep, NODES, REFERENCE_NODE_BODY, @@ -198,7 +200,7 @@ function stringifyNavigationInstructions(instructions: (number | NodeNavigationS const step = instructions[i]; const repeat = instructions[i + 1] as number; for (let r = 0; r < repeat; r++) { - container.push(step === NodeNavigationStep.FirstChild ? 'firstChild' : 'nextSibling'); + container.push(step === NODE_NAVIGATION_STEP_FIRST_CHILD ? 'firstChild' : 'nextSibling'); } } return container.join('.'); @@ -218,10 +220,10 @@ function navigateToNode(from: Node, instructions: (number | NodeNavigationStep)[ throw nodeNotFoundAtPathError(from, stringifyNavigationInstructions(instructions)); } switch (step) { - case NodeNavigationStep.FirstChild: + case NODE_NAVIGATION_STEP_FIRST_CHILD: node = node.firstChild!; break; - case NodeNavigationStep.NextSibling: + case NODE_NAVIGATION_STEP_NEXT_SIBLING: node = node.nextSibling!; break; } @@ -279,7 +281,7 @@ export function navigateBetween(start: Node, finish: Node): NodeNavigationStep[] // First navigate to `finish`'s parent ...parentPath, // Then to its first child. - NodeNavigationStep.FirstChild, + NODE_NAVIGATION_STEP_FIRST_CHILD, // And finally from that node to `finish` (maybe a no-op if we're already there). ...childPath, ]; @@ -294,7 +296,7 @@ function navigateBetweenSiblings(start: Node, finish: Node): NodeNavigationStep[ const nav: NodeNavigationStep[] = []; let node: Node | null = null; for (node = start; node != null && node !== finish; node = node.nextSibling) { - nav.push(NodeNavigationStep.NextSibling); + nav.push(NODE_NAVIGATION_STEP_NEXT_SIBLING); } // If the `node` becomes `null` or `undefined` at the end, that means that we // didn't find the `end` node, thus return `null` (which would trigger serialization diff --git a/packages/core/test/bundling/hydration/bundle.golden_symbols.json b/packages/core/test/bundling/hydration/bundle.golden_symbols.json index 2571522c11d9..4697b77f39b0 100644 --- a/packages/core/test/bundling/hydration/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hydration/bundle.golden_symbols.json @@ -100,7 +100,6 @@ "NodeInjector", "NodeInjectorDestroyRef", "NodeInjectorFactory", - "NodeNavigationStep", "NoneEncapsulationDomRenderer", "NoopNgZone", "NullInjector", diff --git a/packages/core/test/hydration/compression_spec.ts b/packages/core/test/hydration/compression_spec.ts index bfb68fb45f32..6c95d6e56811 100644 --- a/packages/core/test/hydration/compression_spec.ts +++ b/packages/core/test/hydration/compression_spec.ts @@ -8,6 +8,8 @@ import {compressNodeLocation, decompressNodeLocation} from '../../src/hydration/compression'; import { + NODE_NAVIGATION_STEP_FIRST_CHILD, + NODE_NAVIGATION_STEP_NEXT_SIBLING, NodeNavigationStep, REFERENCE_NODE_BODY, REFERENCE_NODE_HOST, @@ -15,8 +17,8 @@ import { describe('compression of node location', () => { it('should handle basic cases', () => { - const fc = NodeNavigationStep.FirstChild; - const ns = NodeNavigationStep.NextSibling; + const fc = NODE_NAVIGATION_STEP_FIRST_CHILD; + const ns = NODE_NAVIGATION_STEP_NEXT_SIBLING; const cases = [ [[REFERENCE_NODE_HOST, fc, 1], 'hf'], [[REFERENCE_NODE_BODY, fc, 1], 'bf'], From 4491704fbaec02db8eec5845ffbb200dbf2a0bf6 Mon Sep 17 00:00:00 2001 From: arturovt Date: Fri, 10 Jan 2025 18:31:57 +0200 Subject: [PATCH 0059/1220] refactor(common): drop enums by changing to `const enum` (#59468) Note: this enums are not a part of the public API. Prior to this commit, the compiler produced: ```js var DateType; (function (DateType) { DateType[DateType["FullYear"] = 0] = "FullYear"; DateType[DateType["Month"] = 1] = "Month"; DateType[DateType["Date"] = 2] = "Date"; DateType[DateType["Hours"] = 3] = "Hours"; DateType[DateType["Minutes"] = 4] = "Minutes"; DateType[DateType["Seconds"] = 5] = "Seconds"; DateType[DateType["FractionalSeconds"] = 6] = "FractionalSeconds"; DateType[DateType["Day"] = 7] = "Day"; })(DateType || (DateType = {})); ``` With these changes, we allow objects to be dropped entirely and inlined. PR Close #59468 --- packages/common/src/i18n/format_date.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/common/src/i18n/format_date.ts b/packages/common/src/i18n/format_date.ts index 2e9ba2d7cc48..34a3e3bd2ed1 100644 --- a/packages/common/src/i18n/format_date.ts +++ b/packages/common/src/i18n/format_date.ts @@ -32,14 +32,14 @@ const NAMED_FORMATS: {[localeId: string]: {[format: string]: string}} = {}; const DATE_FORMATS_SPLIT = /((?:[^BEGHLMOSWYZabcdhmswyz']+)|(?:'(?:[^']|'')*')|(?:G{1,5}|y{1,4}|Y{1,4}|M{1,5}|L{1,5}|w{1,2}|W{1}|d{1,2}|E{1,6}|c{1,6}|a{1,5}|b{1,5}|B{1,5}|h{1,2}|H{1,2}|m{1,2}|s{1,2}|S{1,3}|z{1,4}|Z{1,5}|O{1,4}))([\s\S]*)/; -enum ZoneWidth { +const enum ZoneWidth { Short, ShortGMT, Long, Extended, } -enum DateType { +const enum DateType { FullYear, Month, Date, @@ -50,7 +50,7 @@ enum DateType { Day, } -enum TranslationType { +const enum TranslationType { DayPeriods, Days, Months, From 5d6358168ae87b821f18218160b6f4c796db150c Mon Sep 17 00:00:00 2001 From: arturovt Date: Fri, 10 Jan 2025 18:13:50 +0200 Subject: [PATCH 0060/1220] refactor(common): prevent duplicating `Accept` header (#59467) In this commit, we extract content types into a variable to eliminate extra bytes, as these values are duplicated in multiple places. PR Close #59467 --- packages/common/http/src/fetch.ts | 4 ++-- packages/common/http/src/request.ts | 25 +++++++++++++++++++++++-- packages/common/http/src/xhr.ts | 4 ++-- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/packages/common/http/src/fetch.ts b/packages/common/http/src/fetch.ts index 8920032112d1..c865e0baefc8 100644 --- a/packages/common/http/src/fetch.ts +++ b/packages/common/http/src/fetch.ts @@ -11,7 +11,7 @@ import {Observable, Observer} from 'rxjs'; import {HttpBackend} from './backend'; import {HttpHeaders} from './headers'; -import {HttpRequest, X_REQUEST_URL_HEADER} from './request'; +import {ACCEPT_HEADER, HttpRequest, X_REQUEST_URL_HEADER} from './request'; import { HTTP_STATUS_CODE_OK, HttpDownloadProgressEvent, @@ -259,7 +259,7 @@ export class FetchBackend implements HttpBackend { // Add an Accept header if one isn't present already. if (!req.headers.has('Accept')) { - headers['Accept'] = 'application/json, text/plain, */*'; + headers['Accept'] = ACCEPT_HEADER; } // Auto-detect the Content-Type header if one isn't present already. diff --git a/packages/common/http/src/request.ts b/packages/common/http/src/request.ts index c1344d02e40f..25cc495e49a9 100644 --- a/packages/common/http/src/request.ts +++ b/packages/common/http/src/request.ts @@ -84,6 +84,27 @@ function isUrlSearchParams(value: any): value is URLSearchParams { */ export const X_REQUEST_URL_HEADER = 'X-Request-URL'; +/** + * `text/plain` is a content type used to indicate that the content being + * sent is plain text with no special formatting or structured data + * like HTML, XML, or JSON. + */ +export const TEXT_CONTENT_TYPE = 'text/plain'; + +/** + * `application/json` is a content type used to indicate that the content + * being sent is in the JSON format. + */ +export const JSON_CONTENT_TYPE = 'application/json'; + +/** + * `application/json, text/plain, *\/*` is a content negotiation string often seen in the + * Accept header of HTTP requests. It indicates the types of content the client is willing + * to accept from the server, with a preference for `application/json` and `text/plain`, + * but also accepting any other type (*\/*). + */ +export const ACCEPT_HEADER = `${JSON_CONTENT_TYPE}, ${TEXT_CONTENT_TYPE}, */*`; + /** * An outgoing HTTP request with an optional typed body. * @@ -420,7 +441,7 @@ export class HttpRequest { // Technically, strings could be a form of JSON data, but it's safe enough // to assume they're plain strings. if (typeof this.body === 'string') { - return 'text/plain'; + return TEXT_CONTENT_TYPE; } // `HttpUrlEncodedParams` has its own content-type. if (this.body instanceof HttpParams) { @@ -432,7 +453,7 @@ export class HttpRequest { typeof this.body === 'number' || typeof this.body === 'boolean' ) { - return 'application/json'; + return JSON_CONTENT_TYPE; } // No type could be inferred. return null; diff --git a/packages/common/http/src/xhr.ts b/packages/common/http/src/xhr.ts index 179bd735e9a9..a5b10b754f94 100644 --- a/packages/common/http/src/xhr.ts +++ b/packages/common/http/src/xhr.ts @@ -14,7 +14,7 @@ import {switchMap} from 'rxjs/operators'; import {HttpBackend} from './backend'; import {RuntimeErrorCode} from './errors'; import {HttpHeaders} from './headers'; -import {HttpRequest, X_REQUEST_URL_HEADER} from './request'; +import {ACCEPT_HEADER, HttpRequest, X_REQUEST_URL_HEADER} from './request'; import { HTTP_STATUS_CODE_NO_CONTENT, HTTP_STATUS_CODE_OK, @@ -98,7 +98,7 @@ export class HttpXhrBackend implements HttpBackend { // Add an Accept header if one isn't present already. if (!req.headers.has('Accept')) { - xhr.setRequestHeader('Accept', 'application/json, text/plain, */*'); + xhr.setRequestHeader('Accept', ACCEPT_HEADER); } // Auto-detect the Content-Type header if one isn't present already. From 368d69e11554d6f16c75d604716bc43b12f6ef87 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Mon, 13 Jan 2025 17:11:44 +0000 Subject: [PATCH 0061/1220] build: update cross-repo angular dependencies (#59474) See associated pull request for more information. PR Close #59474 --- .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 | 4 +- yarn.lock | 16 ++++---- 15 files changed, 69 insertions(+), 69 deletions(-) diff --git a/.github/actions/saucelabs-legacy/action.yml b/.github/actions/saucelabs-legacy/action.yml index 39ecbeca1f6a..18ab7e039c13 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@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/bazel/setup@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - name: Setup Saucelabs Variables - uses: angular/dev-infra/github-actions/saucelabs@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/saucelabs@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - 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 6bf6c4e1813b..b61d986599e1 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@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/bazel/setup@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/bazel/configure-remote@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - 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@639449b40067b3c087bcda04e5eab41a3839c736 + - uses: angular/dev-infra/github-actions/previews/pack-and-upload-artifact@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b 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 7494cce07293..b1bc8b3e7420 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@639449b40067b3c087bcda04e5eab41a3839c736 + - uses: angular/dev-infra/github-actions/previews/upload-artifacts-to-firebase@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b 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 b640d718cf38..dd23937bc701 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@639449b40067b3c087bcda04e5eab41a3839c736 + - uses: angular/dev-infra/github-actions/branch-manager@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/benchmark-compare.yml b/.github/workflows/benchmark-compare.yml index d9408cec6dbc..5993a09fdae0 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@639449b40067b3c087bcda04e5eab41a3839c736 + - uses: angular/dev-infra/github-actions/bazel/configure-remote@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b with: bazelrc: ./.bazelrc.user diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e99be0bdb60f..bcc7cb57d8c1 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@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b 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@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/bazel/setup@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/bazel/configure-remote@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - 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@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/bazel/setup@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/bazel/configure-remote@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - 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@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/bazel/setup@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/bazel/configure-remote@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - 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@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/bazel/setup@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/bazel/configure-remote@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - 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@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b 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@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/bazel/setup@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/bazel/configure-remote@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - 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@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b 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@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/bazel/setup@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/bazel/configure-remote@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - 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 025092adbf24..1cc3d8a6088f 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@639449b40067b3c087bcda04e5eab41a3839c736 + - uses: angular/dev-infra/github-actions/commit-message-based-labels@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b 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@639449b40067b3c087bcda04e5eab41a3839c736 + - uses: angular/dev-infra/github-actions/post-approval-changes@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b 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 7a462cac013e..545cfa66df98 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@639449b40067b3c087bcda04e5eab41a3839c736 + - uses: angular/dev-infra/github-actions/google-internal-tests@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b 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 602211aa28cf..baecbd8cf042 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@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b 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@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/bazel/setup@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/bazel/configure-remote@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - name: Setup Saucelabs Variables - uses: angular/dev-infra/github-actions/saucelabs@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/saucelabs@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - 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 2252a7fadacb..10497129e42b 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@639449b40067b3c087bcda04e5eab41a3839c736 + - uses: angular/dev-infra/github-actions/unified-status-check@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/perf.yml b/.github/workflows/perf.yml index f8d12e9b4b35..7c89e30580eb 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@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - 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@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/bazel/setup@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - 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 612c88c2548e..3b8c852b7a7d 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@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b 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@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/linting/licenses@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b 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@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/bazel/setup@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/bazel/configure-remote@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - 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@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/bazel/setup@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/bazel/configure-remote@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - 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@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/bazel/setup@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/bazel/configure-remote@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - 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@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/bazel/setup@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/bazel/configure-remote@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - 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@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b 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@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/bazel/setup@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/bazel/configure-remote@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b - 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@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b 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 7e20756dfe2b..9b4119fd30a2 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@639449b40067b3c087bcda04e5eab41a3839c736 + uses: angular/dev-infra/github-actions/create-pr-for-changes@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b 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 d6d12cfa4748..1321c860e199 100644 --- a/package.json +++ b/package.json @@ -160,9 +160,9 @@ "@actions/github": "^6.0.0", "@angular-devkit/architect-cli": "0.1901.0-rc.0", "@angular/animations": "^19.1.0-next", - "@angular/build-tooling": "https://github.com/angular/dev-infra-private-build-tooling-builds.git#11de733259a10bd9fc4079afdfe5733aec6383a1", + "@angular/build-tooling": "https://github.com/angular/dev-infra-private-build-tooling-builds.git#4c48faf6dd5765b85e4a9cb9fd84ad2fb813a93e", "@angular/core": "^19.1.0-next", - "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#af7ab37bf65d005745d676f30d9a9759a1757067", + "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#34526428373727797ec4e28ef2ca2de795af5076", "@bazel/bazelisk": "^1.7.5", "@bazel/buildifier": "^8.0.0", "@bazel/ibazel": "^0.25.0", diff --git a/yarn.lock b/yarn.lock index d5cf116ad962..bf1be22a580d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -303,10 +303,10 @@ "@angular/core" "^13.0.0 || ^14.0.0-0" reflect-metadata "^0.1.13" -"@angular/build-tooling@https://github.com/angular/dev-infra-private-build-tooling-builds.git#11de733259a10bd9fc4079afdfe5733aec6383a1": - version "0.0.0-639449b40067b3c087bcda04e5eab41a3839c736" - uid "11de733259a10bd9fc4079afdfe5733aec6383a1" - resolved "https://github.com/angular/dev-infra-private-build-tooling-builds.git#11de733259a10bd9fc4079afdfe5733aec6383a1" +"@angular/build-tooling@https://github.com/angular/dev-infra-private-build-tooling-builds.git#4c48faf6dd5765b85e4a9cb9fd84ad2fb813a93e": + version "0.0.0-2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b" + uid "4c48faf6dd5765b85e4a9cb9fd84ad2fb813a93e" + resolved "https://github.com/angular/dev-infra-private-build-tooling-builds.git#4c48faf6dd5765b85e4a9cb9fd84ad2fb813a93e" dependencies: "@angular/benchpress" "0.3.0" "@angular/build" "19.1.0-rc.0" @@ -427,10 +427,10 @@ dependencies: tslib "^2.3.0" -"@angular/ng-dev@https://github.com/angular/dev-infra-private-ng-dev-builds.git#af7ab37bf65d005745d676f30d9a9759a1757067": - version "0.0.0-639449b40067b3c087bcda04e5eab41a3839c736" - uid af7ab37bf65d005745d676f30d9a9759a1757067 - resolved "https://github.com/angular/dev-infra-private-ng-dev-builds.git#af7ab37bf65d005745d676f30d9a9759a1757067" +"@angular/ng-dev@https://github.com/angular/dev-infra-private-ng-dev-builds.git#34526428373727797ec4e28ef2ca2de795af5076": + version "0.0.0-2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b" + uid "34526428373727797ec4e28ef2ca2de795af5076" + resolved "https://github.com/angular/dev-infra-private-ng-dev-builds.git#34526428373727797ec4e28ef2ca2de795af5076" dependencies: "@google-cloud/spanner" "7.17.1" "@octokit/rest" "21.1.0" From 065e1187fce66b201732eadf8f6683a3a79664fa Mon Sep 17 00:00:00 2001 From: AleksanderBodurri Date: Mon, 13 Jan 2025 01:56:42 -0500 Subject: [PATCH 0062/1220] fix(devtools): remove property tab css that is hiding directive metadata (#59493) It looks like this height property was redundant prior to upgrading to angular/material 19.1.0-rc.0. An interaction between this property and that update caused elements inside of material expansion panels to be hidden. This PR removes this unnecessary height assignment entirely. PR Close #59493 --- .../property-tab/property-view/property-view-tree.component.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-tree.component.scss b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-tree.component.scss index d63bad02ea72..546a76257833 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-tree.component.scss +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-tree.component.scss @@ -2,7 +2,6 @@ width: 100%; display: block; overflow: auto; - height: calc(100% - 24px); mat-tree { display: table; From 47e48b44dcc5a4d41f9b371a1dc00aebf7fa1812 Mon Sep 17 00:00:00 2001 From: arturovt Date: Mon, 13 Jan 2025 21:26:58 +0200 Subject: [PATCH 0063/1220] refactor(docs-infra): lazy-load `EmbeddedTutorialManager` in code editor (#59505) In this commit, we lazy-load the `EmbeddedTutorialManager` in the code editor component as done in other parts of the code. PR Close #59505 --- .../code-editor/code-editor.component.spec.ts | 3 +++ .../code-editor/code-editor.component.ts | 20 +++++++++++++------ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/adev/src/app/editor/code-editor/code-editor.component.spec.ts b/adev/src/app/editor/code-editor/code-editor.component.spec.ts index a124a623bced..55922866192e 100644 --- a/adev/src/app/editor/code-editor/code-editor.component.spec.ts +++ b/adev/src/app/editor/code-editor/code-editor.component.spec.ts @@ -148,6 +148,9 @@ describe('CodeEditor', () => { }); it('should focused on a new tab when adding a new file', async () => { + // Wait until the asynchronous injection stuff is done. + await fixture.whenStable(); + const button = fixture.debugElement.query(By.css('button.adev-add-file')).nativeElement; button.click(); diff --git a/adev/src/app/editor/code-editor/code-editor.component.ts b/adev/src/app/editor/code-editor/code-editor.component.ts index f9c02a305e80..f360e9d65191 100644 --- a/adev/src/app/editor/code-editor/code-editor.component.ts +++ b/adev/src/app/editor/code-editor/code-editor.component.ts @@ -13,6 +13,7 @@ import { Component, DestroyRef, ElementRef, + EnvironmentInjector, OnDestroy, ViewChild, inject, @@ -21,10 +22,9 @@ import { import {takeUntilDestroyed} from '@angular/core/rxjs-interop'; import {MatTabGroup, MatTabsModule} from '@angular/material/tabs'; import {Title} from '@angular/platform-browser'; -import {debounceTime, map} from 'rxjs'; +import {debounceTime, from, map, switchMap} from 'rxjs'; import {TerminalType} from '../terminal/terminal-handler.service'; -import {EmbeddedTutorialManager} from '../embedded-tutorial-manager.service'; import {CodeMirrorEditor} from './code-mirror-editor.service'; import {DiagnosticWithLocation, DiagnosticsState} from './services/diagnostics-state.service'; @@ -34,6 +34,7 @@ import {ClickOutside, IconComponent} from '@angular/docs'; import {CdkMenu, CdkMenuItem, CdkMenuTrigger} from '@angular/cdk/menu'; import {IDXLauncher} from '../idx-launcher.service'; import {MatTooltip} from '@angular/material/tooltip'; +import {injectEmbeddedTutorialManager} from '../inject-embedded-tutorial-manager'; export const REQUIRED_FILES = new Set([ 'src/main.ts', @@ -91,7 +92,7 @@ export class CodeEditor implements AfterViewInit, OnDestroy { private readonly idxLauncher = inject(IDXLauncher); private readonly title = inject(Title); private readonly location = inject(Location); - private readonly embeddedTutorialManager = inject(EmbeddedTutorialManager); + private readonly environmentInjector = inject(EnvironmentInjector); private readonly errors$ = this.diagnosticsState.diagnostics$.pipe( // Display errors one second after code update @@ -142,7 +143,8 @@ export class CodeEditor implements AfterViewInit, OnDestroy { } async downloadCurrentCodeEditorState(): Promise { - const name = this.embeddedTutorialManager.tutorialId(); + const embeddedTutorialManager = await injectEmbeddedTutorialManager(this.environmentInjector); + const name = embeddedTutorialManager.tutorialId(); await this.downloadManager.downloadCurrentStateOfTheSolution(name); } @@ -236,8 +238,14 @@ export class CodeEditor implements AfterViewInit, OnDestroy { } private setSelectedTabOnTutorialChange() { - this.embeddedTutorialManager.tutorialChanged$ - .pipe(takeUntilDestroyed(this.destroyRef)) + // Using `from` to prevent injecting the embedded tutorial manager once the + // injector is destroyed (this may happen in unit tests when the test ends + // before `injectAsync` runs, causing an error). + from(injectEmbeddedTutorialManager(this.environmentInjector)) + .pipe( + switchMap((embeddedTutorialManager) => embeddedTutorialManager.tutorialChanged$), + takeUntilDestroyed(this.destroyRef), + ) .subscribe(() => { // selected file on project change is always the first this.matTabGroup.selectedIndex = 0; From 0bb81c5ab4e869691c3bf2e87d2f2a17c3d9e53e Mon Sep 17 00:00:00 2001 From: hawkgs Date: Fri, 10 Jan 2025 17:15:38 +0200 Subject: [PATCH 0064/1220] feat(devtools): tone down obtrusive elements in the Injector Tree tab (#59499) Some of the elements are a bit too large so they have been shrunken to fit in with the rest of the UI. PR Close #59499 --- .../devtools-tabs/injector-tree/BUILD.bazel | 21 +- .../injector-providers.component.ts | 205 ------------------ .../injector-providers/BUILD.bazel | 32 +++ .../injector-providers.component.html | 65 ++++++ .../injector-providers.component.scss | 89 ++++++++ .../injector-providers.component.ts | 77 +++++++ .../injector-tree.component.html | 16 +- .../injector-tree.component.scss | 38 +++- .../injector-tree/injector-tree.component.ts | 2 +- 9 files changed, 313 insertions(+), 232 deletions(-) delete mode 100644 devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers.component.ts create mode 100644 devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers/BUILD.bazel create mode 100644 devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers/injector-providers.component.html create mode 100644 devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers/injector-providers.component.scss create mode 100644 devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers/injector-providers.component.ts diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/BUILD.bazel b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/BUILD.bazel index bfc097a3e50a..942e155b4f33 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/BUILD.bazel +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/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_library", "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_library", "ts_test_library") package(default_visibility = ["//:__subpackages__"]) @@ -20,10 +20,10 @@ ng_module( "injector-tree.component.html", ], deps = [ - ":injector_providers", ":injector_tree_fns", "//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/injector-tree/injector-providers", "//devtools/projects/ng-devtools/src/lib/vendor/angular-split", "//devtools/projects/protocol", "//packages/common", @@ -35,21 +35,6 @@ ng_module( ], ) -ng_module( - name = "injector_providers", - srcs = [ - "injector-providers.component.ts", - ], - deps = [ - "//devtools/projects/ng-devtools/src/lib/devtools-tabs/dependency-injection:resolution_path", - "//devtools/projects/protocol", - "//packages/animations", - "//packages/common", - "//packages/core", - "@npm//@angular/material", - ], -) - karma_web_test_suite( name = "test", deps = [ diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers.component.ts deleted file mode 100644 index 3653fc885cab..000000000000 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers.component.ts +++ /dev/null @@ -1,205 +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 {Component, computed, inject, input, signal} from '@angular/core'; -import {MatOption} from '@angular/material/core'; -import {MatFormField, MatLabel} from '@angular/material/form-field'; -import {MatIcon} from '@angular/material/icon'; -import {MatInput} from '@angular/material/input'; -import {MatSelect} from '@angular/material/select'; -import {MatTableModule} from '@angular/material/table'; -import {MatTooltip} from '@angular/material/tooltip'; -import {Events, MessageBus, SerializedInjector, SerializedProviderRecord} from 'protocol'; - -@Component({ - selector: 'ng-injector-providers', - template: ` -

Providers for {{ injector()?.name }}

- @if (injector()) { -
- - Search by token - - close - - - Search by type - - None - @for (type of providerTypes; track type) { - {{ $any(providerTypeToLabel)[type] }} - } - - - @if (visibleProviders().length > 0) { - - - - - - - - - - - - - - - - - - - -

Token

{{ provider.token }}

Type

- @if (provider.type === 'multi') { multi (x{{ provider.index.length }}) } @else { - {{ $any(providerTypeToLabel)[provider.type] }} - } -

Is View Provider

- {{ provider.isViewProvider ? 'check_circle' : 'cancel' }} -

- send -
- } -
- } - `, - styles: [ - ` - .select { - cursor: pointer; - } - - :host { - display: block; - padding: 16px; - } - - .form-field-spacer { - margin: 0 4px 0 4px; - } - - table { - width: 100%; - } - - .column-title { - margin: 0; - } - - tr.example-detail-row { - height: 0; - } - - .example-element-row td { - border-bottom-width: 0; - cursor: pointer; - } - - .example-element-detail { - overflow: hidden; - display: flex; - } - - .example-element-diagram { - min-width: 80px; - border: 2px solid black; - padding: 8px; - font-weight: lighter; - margin: 8px 0; - height: 104px; - } - - .example-element-symbol { - font-weight: bold; - font-size: 40px; - line-height: normal; - } - - .example-element-description { - padding: 16px; - } - - .example-element-description-attribution { - opacity: 0.5; - } - - :host-context(.dark-theme) { - .providers-title { - color: #ffffff; - } - } - `, - ], - imports: [ - MatTableModule, - MatIcon, - MatTooltip, - MatInput, - MatSelect, - MatFormField, - MatLabel, - MatOption, - ], -}) -export class InjectorProvidersComponent { - readonly injector = input.required(); - readonly providers = input([]); - - readonly searchToken = signal(''); - readonly searchType = signal(''); - readonly visibleProviders = computed(() => { - const searchToken = this.searchToken().toLowerCase(); - const searchType = this.searchType(); - - const predicates: ((provider: SerializedProviderRecord) => boolean)[] = []; - searchToken && - predicates.push((provider) => provider.token.toLowerCase().includes(searchToken)); - searchType && predicates.push((provider) => provider.type === searchType); - - return this.providers().filter((provider) => - predicates.every((predicate) => predicate(provider)), - ); - }); - - providerTypeToLabel = { - type: 'Type', - existing: 'useExisting', - factory: 'useFactory', - class: 'useClass', - value: 'useValue', - }; - - providerTypes = Object.keys(this.providerTypeToLabel); - - messageBus = inject>(MessageBus); - - select(row: SerializedProviderRecord) { - const {id, type, name} = this.injector(); - this.messageBus.emit('logProvider', [{id, type, name}, row]); - } - - get displayedColumns(): string[] { - if (this.injector()?.type === 'element') { - return ['token', 'type', 'isViewProvider', 'log']; - } - return ['token', 'type', 'log']; - } -} 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 new file mode 100644 index 000000000000..31cd6c2b28ee --- /dev/null +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers/BUILD.bazel @@ -0,0 +1,32 @@ +load("@io_bazel_rules_sass//:defs.bzl", "sass_binary") +load("//devtools/tools:ng_module.bzl", "ng_module") + +package(default_visibility = ["//visibility:public"]) + +sass_binary( + name = "injector_providers_component_styles", + src = "injector-providers.component.scss", + include_paths = [ + "external/npm/node_modules", + ], + deps = ["//devtools:material_sass_deps"], +) + +ng_module( + name = "injector-providers", + srcs = [ + "injector-providers.component.ts", + ], + angular_assets = [ + "injector-providers.component.html", + ":injector_providers_component_styles", + ], + deps = [ + "//devtools/projects/ng-devtools/src/lib/devtools-tabs/dependency-injection:resolution_path", + "//devtools/projects/protocol", + "//packages/animations", + "//packages/common", + "//packages/core", + "@npm//@angular/material", + ], +) diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers/injector-providers.component.html b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers/injector-providers.component.html new file mode 100644 index 000000000000..aa022c8ea8c3 --- /dev/null +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers/injector-providers.component.html @@ -0,0 +1,65 @@ +

Providers for {{ injector()?.name }}

+@if (injector()) { +
+
+ + Search by token + + close + + + Search by type + + None + @for (type of providerTypes; track type) { + {{ $any(providerTypeToLabel)[type] }} + } + + +
+ @if (visibleProviders().length > 0) { + + + + + + + + + + + + + + + + + + + +

Token

{{ provider.token }}

Type

+ @if (provider.type === 'multi') { + multi (x{{ provider.index.length }}) + } @else { + {{ $any(providerTypeToLabel)[provider.type] }} + } +

Is View Provider

+ {{ provider.isViewProvider ? 'check_circle' : 'cancel' }} +

+ send +
+ } +
+} diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers/injector-providers.component.scss b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers/injector-providers.component.scss new file mode 100644 index 000000000000..a5867686b199 --- /dev/null +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers/injector-providers.component.scss @@ -0,0 +1,89 @@ +@use '@angular/material' as mat; + +h2 { + font-size: 0.875rem; +} + +.select { + cursor: pointer; +} + +:host { + display: block; + padding: 16px; +} + +.filter { + display: flex; + gap: 0.5rem; + + mat-form-field { + @include mat.form-field-density(-5); + @include mat.form-field-overrides( + ( + container-text-size: 0.8rem, + outlined-label-text-size: 0.8rem, + ) + ); + + &:first-child { + flex: 1; + } + } +} + +table { + width: 100%; + --mat-table-row-item-label-text-size: 0.8rem; + --mat-table-header-container-height: 42px; + --mat-table-row-item-container-height: 42px; +} + +.column-title { + margin: 0; + font-size: 0.8rem; + font-weight: bold; +} + +tr.example-detail-row { + height: 0; +} + +.example-element-row td { + border-bottom-width: 0; + cursor: pointer; +} + +.example-element-detail { + overflow: hidden; + display: flex; +} + +.example-element-diagram { + min-width: 80px; + border: 2px solid black; + padding: 8px; + font-weight: lighter; + margin: 8px 0; + height: 104px; +} + +.example-element-symbol { + font-weight: bold; + font-size: 40px; + line-height: normal; +} + +.example-element-description { + padding: 16px; +} + +.example-element-description-attribution { + opacity: 0.5; +} + +:host-context(.dark-theme) { + .providers-title { + color: #ffffff; + } +} diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers/injector-providers.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers/injector-providers.component.ts new file mode 100644 index 000000000000..1299a2c4ad5b --- /dev/null +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers/injector-providers.component.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 {Component, computed, inject, input, signal} from '@angular/core'; +import {MatOption} from '@angular/material/core'; +import {MatFormField, MatLabel} from '@angular/material/form-field'; +import {MatIcon} from '@angular/material/icon'; +import {MatInput} from '@angular/material/input'; +import {MatSelect} from '@angular/material/select'; +import {MatTableModule} from '@angular/material/table'; +import {MatTooltip} from '@angular/material/tooltip'; +import {Events, MessageBus, SerializedInjector, SerializedProviderRecord} from 'protocol'; + +@Component({ + selector: 'ng-injector-providers', + templateUrl: './injector-providers.component.html', + styleUrl: './injector-providers.component.scss', + imports: [ + MatTableModule, + MatIcon, + MatTooltip, + MatInput, + MatSelect, + MatFormField, + MatLabel, + MatOption, + ], +}) +export class InjectorProvidersComponent { + readonly injector = input.required(); + readonly providers = input([]); + + readonly searchToken = signal(''); + readonly searchType = signal(''); + readonly visibleProviders = computed(() => { + const searchToken = this.searchToken().toLowerCase(); + const searchType = this.searchType(); + + const predicates: ((provider: SerializedProviderRecord) => boolean)[] = []; + searchToken && + predicates.push((provider) => provider.token.toLowerCase().includes(searchToken)); + searchType && predicates.push((provider) => provider.type === searchType); + + return this.providers().filter((provider) => + predicates.every((predicate) => predicate(provider)), + ); + }); + + providerTypeToLabel = { + type: 'Type', + existing: 'useExisting', + factory: 'useFactory', + class: 'useClass', + value: 'useValue', + }; + + providerTypes = Object.keys(this.providerTypeToLabel); + + messageBus = inject>(MessageBus); + + select(row: SerializedProviderRecord) { + const {id, type, name} = this.injector(); + this.messageBus.emit('logProvider', [{id, type, name}, row]); + } + + get displayedColumns(): string[] { + if (this.injector()?.type === 'element') { + return ['token', 'type', 'isViewProvider', 'log']; + } + return ['token', 'type', 'log']; + } +} diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-tree.component.html b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-tree.component.html index 45cbbaacb832..a044dc3676ba 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-tree.component.html +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-tree.component.html @@ -11,10 +11,14 @@ [disabled]="true" > - - Hide injectors with no providers - - Hide framework injectors +
+ + Hide injectors with no providers + + + Hide framework injectors + +
@@ -23,7 +27,7 @@

- Environment Hierarchy + Environment Hierarchy

- Element Hierarchy + Element Hierarchy Date: Mon, 13 Jan 2025 13:39:00 -0800 Subject: [PATCH 0065/1220] Revert "refactor(core): add profiler calls for tne newly introduced events (#59233)" (#59506) This reverts commit 435d31ed5f632f5e7e8702c2dc225df6eda1ffbe. PR Close #59506 --- .../core/src/application/application_ref.ts | 14 +- .../src/application/create_application.ts | 6 +- packages/core/src/defer/rendering.ts | 6 - .../core/src/render3/after_render/manager.ts | 25 +-- packages/core/src/render3/component_ref.ts | 5 - .../render3/instructions/change_detection.ts | 6 - .../core/src/render3/instructions/render.ts | 6 - .../core/src/render3/instructions/shared.ts | 3 - .../core/test/acceptance/profiler_spec.ts | 150 ++---------------- 9 files changed, 21 insertions(+), 200 deletions(-) diff --git a/packages/core/src/application/application_ref.ts b/packages/core/src/application/application_ref.ts index 50bc3e24ffb3..349f5de9657c 100644 --- a/packages/core/src/application/application_ref.ts +++ b/packages/core/src/application/application_ref.ts @@ -47,8 +47,6 @@ import {NgZone} from '../zone/ng_zone'; 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 @@ -533,8 +531,6 @@ export class ApplicationRef { componentOrFactory: ComponentFactory | Type, rootSelectorOrNode?: string | any, ): ComponentRef { - profiler(ProfilerEvent.BootstrapComponentStart); - (typeof ngDevMode === 'undefined' || ngDevMode) && warnIfDestroyed(this._destroyed); const isComponentFactory = componentOrFactory instanceof ComponentFactory; const initStatus = this._injector.get(ApplicationInitStatus); @@ -580,9 +576,6 @@ export class ApplicationRef { const _console = this._injector.get(Console); _console.log(`Angular is running in development mode.`); } - - profiler(ProfilerEvent.BootstrapComponentEnd, compRef); - return compRef; } @@ -605,8 +598,6 @@ export class ApplicationRef { /** @internal */ _tick = (): void => { - profiler(ProfilerEvent.ChangeDetectionStart); - if (this.tracingSnapshot !== null) { const snapshot = this.tracingSnapshot; this.tracingSnapshot = null; @@ -631,6 +622,7 @@ export class ApplicationRef { try { this._runningTick = true; this.synchronize(); + if (typeof ngDevMode === 'undefined' || ngDevMode) { for (let view of this.allViews) { view.checkNoChanges(); @@ -643,8 +635,6 @@ export class ApplicationRef { this._runningTick = false; setActiveConsumer(prevConsumer); this.afterTick.next(); - - profiler(ProfilerEvent.ChangeDetectionEnd); } }; @@ -663,9 +653,7 @@ export class ApplicationRef { let runs = 0; while (this.dirtyFlags !== ApplicationRefDirtyFlags.None && runs++ < MAXIMUM_REFRESH_RERUNS) { - profiler(ProfilerEvent.ChangeDetectionSyncStart); this.synchronizeOnce(); - profiler(ProfilerEvent.ChangeDetectionSyncEnd); } if ((typeof ngDevMode === 'undefined' || ngDevMode) && runs >= MAXIMUM_REFRESH_RERUNS) { diff --git a/packages/core/src/application/create_application.ts b/packages/core/src/application/create_application.ts index 0656d8bad741..83d276b11b16 100644 --- a/packages/core/src/application/create_application.ts +++ b/packages/core/src/application/create_application.ts @@ -13,13 +13,12 @@ import {Type} from '../interface/type'; import {createOrReusePlatformInjector} from '../platform/platform'; import {assertStandaloneComponentType} from '../render3/errors'; import {EnvironmentNgModuleRefAdapter} from '../render3/ng_module_ref'; +import {NgZone} from '../zone/ng_zone'; import {_callAndReportToErrorHandler, 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'; -import {profiler} from '../render3/profiler'; -import {ProfilerEvent} from '../render3/profiler_types'; /** * Internal create application API that implements the core application creation logic and optional @@ -38,7 +37,6 @@ export function internalCreateApplication(config: { appProviders?: Array; platformProviders?: Provider[]; }): Promise { - profiler(ProfilerEvent.BootstrapApplicationStart); try { const {rootComponent, appProviders, platformProviders} = config; @@ -71,7 +69,5 @@ export function internalCreateApplication(config: { }); } catch (e) { return Promise.reject(e); - } finally { - profiler(ProfilerEvent.BootstrapApplicationEnd); } } diff --git a/packages/core/src/defer/rendering.ts b/packages/core/src/defer/rendering.ts index b6a4c3939532..4a3e6cc0a60a 100644 --- a/packages/core/src/defer/rendering.ts +++ b/packages/core/src/defer/rendering.ts @@ -56,8 +56,6 @@ import { getTDeferBlockDetails, getTemplateIndexForState, } from './utils'; -import {profiler} from '../render3/profiler'; -import {ProfilerEvent} from '../render3/profiler_types'; /** * **INTERNAL**, avoid referencing it in application code. @@ -245,8 +243,6 @@ function applyDeferBlockState( tNode: TNode, hostLView: LView, ) { - profiler(ProfilerEvent.DeferBlockStateStart); - const stateTmplIndex = getTemplateIndexForState(newState, hostLView, tNode); if (stateTmplIndex !== null) { @@ -310,8 +306,6 @@ function applyDeferBlockState( lDetails[ON_COMPLETE_FNS] = null; } } - - profiler(ProfilerEvent.DeferBlockStateEnd); } /** diff --git a/packages/core/src/render3/after_render/manager.ts b/packages/core/src/render3/after_render/manager.ts index ed7c0670e18f..8472188da363 100644 --- a/packages/core/src/render3/after_render/manager.ts +++ b/packages/core/src/render3/after_render/manager.ts @@ -17,8 +17,6 @@ import { } from '../../change_detection/scheduling/zoneless_scheduling'; import {type DestroyRef} from '../../linker/destroy_ref'; import {TracingAction, TracingService, TracingSnapshot} from '../../application/tracing'; -import {profiler} from '../profiler'; -import {ProfilerEvent} from '../profiler_types'; export class AfterRenderManager { impl: AfterRenderImpl | null = null; @@ -67,12 +65,6 @@ export class AfterRenderImpl { * might be scheduled. */ execute(): void { - const hasSequencesToExecute = this.sequences.size > 0; - - if (hasSequencesToExecute) { - profiler(ProfilerEvent.AfterRenderHooksStart); - } - this.executing = true; for (const phase of AFTER_RENDER_PHASES) { for (const sequence of this.sequences) { @@ -82,15 +74,10 @@ export class AfterRenderImpl { try { sequence.pipelinedValue = this.ngZone.runOutsideAngular(() => - this.maybeTrace(() => { - const hookFn = sequence.hooks[phase]!; - - profiler(ProfilerEvent.LifecycleHookStart, null, hookFn); - const value = hookFn(sequence.pipelinedValue); - profiler(ProfilerEvent.LifecycleHookEnd, null, hookFn); - - return value; - }, sequence.snapshot), + this.maybeTrace( + () => sequence.hooks[phase]!(sequence.pipelinedValue), + sequence.snapshot, + ), ); } catch (err) { sequence.erroredOrDestroyed = true; @@ -118,10 +105,6 @@ export class AfterRenderImpl { this.scheduler.notify(NotificationSource.DeferredRenderHook); } this.deferredRegistrations.clear(); - - if (hasSequencesToExecute) { - profiler(ProfilerEvent.AfterRenderHooksEnd); - } } register(sequence: AfterRenderSequence): void { diff --git a/packages/core/src/render3/component_ref.ts b/packages/core/src/render3/component_ref.ts index 11b317733944..80862a6a44ed 100644 --- a/packages/core/src/render3/component_ref.ts +++ b/packages/core/src/render3/component_ref.ts @@ -89,8 +89,6 @@ import {getComponentLViewByIndex, getNativeByTNode, getTNode} from './util/view_ import {ViewRef} from './view_ref'; import {ChainedInjector} from './chained_injector'; import {unregisterLView} from './interfaces/lview_tracking'; -import {profiler} from './profiler'; -import {ProfilerEvent} from './profiler_types'; export class ComponentFactoryResolver extends AbstractComponentFactoryResolver { /** @@ -216,8 +214,6 @@ export class ComponentFactory extends AbstractComponentFactory { rootSelectorOrNode?: any, environmentInjector?: NgModuleRef | EnvironmentInjector | undefined, ): AbstractComponentRef { - profiler(ProfilerEvent.DynamicComponentStart); - const prevConsumer = setActiveConsumer(null); try { // Check if the component is orphan @@ -401,7 +397,6 @@ export class ComponentFactory extends AbstractComponentFactory { unregisterLView(rootLView); throw e; } finally { - profiler(ProfilerEvent.DynamicComponentEnd); leaveView(); } diff --git a/packages/core/src/render3/instructions/change_detection.ts b/packages/core/src/render3/instructions/change_detection.ts index 514cc9eb8af8..06fe193302da 100644 --- a/packages/core/src/render3/instructions/change_detection.ts +++ b/packages/core/src/render3/instructions/change_detection.ts @@ -70,8 +70,6 @@ import { } from './shared'; import {runEffectsInView} from '../reactivity/view_effect_runner'; import {isDestroyed} from '../interfaces/type_checks'; -import {ProfilerEvent} from '../profiler_types'; -import {profiler} from '../profiler'; /** * The maximum number of times the change detection traversal will rerun before throwing an error. @@ -430,12 +428,8 @@ function detectChangesInComponent( mode: ChangeDetectionMode, ): void { ngDevMode && assertEqual(isCreationMode(hostLView), false, 'Should be run in update mode'); - profiler(ProfilerEvent.ComponentStart); - const componentView = getComponentLViewByIndex(componentHostIdx, hostLView); detectChangesInViewIfAttached(componentView, mode); - - profiler(ProfilerEvent.ComponentEnd, componentView[CONTEXT] as any as {}); } /** diff --git a/packages/core/src/render3/instructions/render.ts b/packages/core/src/render3/instructions/render.ts index df95d36b0659..c4806cf5efec 100644 --- a/packages/core/src/render3/instructions/render.ts +++ b/packages/core/src/render3/instructions/render.ts @@ -21,8 +21,6 @@ import { TVIEW, TView, } from '../interfaces/view'; -import {profiler} from '../profiler'; -import {ProfilerEvent} from '../profiler_types'; import {enterView, leaveView} from '../state'; import {getComponentLViewByIndex, isCreationMode} from '../util/view_utils'; @@ -40,11 +38,7 @@ export function renderComponent(hostLView: LView, componentHostIdx: number) { componentView[HYDRATION] = retrieveHydrationInfo(hostRNode, componentView[INJECTOR]); } - profiler(ProfilerEvent.ComponentStart); - renderView(componentTView, componentView, componentView[CONTEXT]); - - profiler(ProfilerEvent.ComponentEnd, componentView[CONTEXT] as any as {}); } /** diff --git a/packages/core/src/render3/instructions/shared.ts b/packages/core/src/render3/instructions/shared.ts index aa542fdf8d1d..729b2fca26cf 100644 --- a/packages/core/src/render3/instructions/shared.ts +++ b/packages/core/src/render3/instructions/shared.ts @@ -182,10 +182,7 @@ export function processHostBindingOpCodes(tView: TView, lView: LView): void { const hostBindingFn = hostBindingOpCodes[++i] as HostBindingsFunction; setBindingRootForHostBindings(bindingRootIndx, directiveIdx); const context = lView[directiveIdx]; - - profiler(ProfilerEvent.HostBindingsUpdateStart, context); hostBindingFn(RenderFlags.Update, context); - profiler(ProfilerEvent.HostBindingsUpdateEnd, context); } } } finally { diff --git a/packages/core/test/acceptance/profiler_spec.ts b/packages/core/test/acceptance/profiler_spec.ts index 52bdc41fbbf1..1d77e9568a3f 100644 --- a/packages/core/test/acceptance/profiler_spec.ts +++ b/packages/core/test/acceptance/profiler_spec.ts @@ -13,7 +13,6 @@ import {TestBed} from '@angular/core/testing'; import { AfterContentChecked, AfterContentInit, - afterRender, AfterViewChecked, AfterViewInit, Component, @@ -29,14 +28,14 @@ import { } from '../../src/core'; describe('profiler', () => { - class TestProfiler { + class Profiler { profile() {} } let profilerSpy: jasmine.Spy; beforeEach(() => { - const profiler = new TestProfiler(); + const profiler = new Profiler(); profilerSpy = spyOn(profiler, 'profile').and.callThrough(); setProfiler(profiler.profile); }); @@ -401,146 +400,27 @@ describe('profiler', () => { expect(serviceNgOnDestroyStart).toBeTruthy(); expect(serviceNgOnDestroyEnd).toBeTruthy(); }); - - it('should call the profiler on lifecycle execution even after error', () => { - @Component({selector: 'my-comp', template: '', standalone: false}) - class MyComponent implements OnInit { - ngOnInit() { - throw new Error(); - } - } - - TestBed.configureTestingModule({declarations: [MyComponent]}); - const fixture = TestBed.createComponent(MyComponent); - - expect(() => { - fixture.detectChanges(); - }).toThrow(); - - const lifecycleStart = findProfilerCall(ProfilerEvent.LifecycleHookStart); - const lifecycleEnd = findProfilerCall(ProfilerEvent.LifecycleHookEnd); - - expect(lifecycleStart).toBeTruthy(); - expect(lifecycleEnd).toBeTruthy(); - }); }); - describe('entry point events', () => { - class EventRecordingProfiler { - events: ProfilerEvent[] = []; - - clearEvents() { - this.events.length = 0; + it('should call the profiler on lifecycle execution even after error', () => { + @Component({selector: 'my-comp', template: '', standalone: false}) + class MyComponent implements OnInit { + ngOnInit() { + throw new Error(); } - - hasEvents(...events: ProfilerEvent[]): boolean { - for (const e of events) { - if (this.events.indexOf(e) === -1) { - return false; - } - } - - return true; - } - - profile = ( - event: ProfilerEvent, - instance?: {} | null, - hookOrListener?: (e?: any) => any, - ): void => { - this.events.push(event); - }; } - let p: EventRecordingProfiler; + TestBed.configureTestingModule({declarations: [MyComponent]}); + const fixture = TestBed.createComponent(MyComponent); - beforeEach(() => { - p = new EventRecordingProfiler(); - setProfiler(p.profile); - }); - - afterEach(() => { - setProfiler(null); - }); - - it('should capture component creation and change detection entry points', () => { - @Component({selector: 'my-comp', template: ''}) - class MyComponent {} - - const fixture = TestBed.createComponent(MyComponent); - expect(p.events).toEqual([ - ProfilerEvent.DynamicComponentStart, - ProfilerEvent.ComponentStart, - ProfilerEvent.TemplateCreateStart, - ProfilerEvent.TemplateCreateEnd, - ProfilerEvent.ComponentEnd, - ProfilerEvent.DynamicComponentEnd, - ProfilerEvent.ChangeDetectionStart, - ProfilerEvent.ChangeDetectionSyncStart, - ProfilerEvent.ChangeDetectionSyncEnd, - ProfilerEvent.ChangeDetectionEnd, - ]); - - p.clearEvents(); - fixture.detectChanges(false); - - expect( - p.hasEvents(ProfilerEvent.TemplateUpdateStart, ProfilerEvent.TemplateUpdateEnd), - ).toBeTrue(); - }); - - it('should invoke a profiler when host bindings are evaluated', () => { - @Component({ - selector: 'my-comp', - host: { - '[id]': '"someId"', - }, - template: '', - }) - class MyComponent {} - - const fixture = TestBed.createComponent(MyComponent); - fixture.detectChanges(); - - expect( - p.hasEvents(ProfilerEvent.HostBindingsUpdateStart, ProfilerEvent.HostBindingsUpdateEnd), - ).toBeTrue(); - }); - - it('should invoke a profiler when after render hooks are executing', () => { - @Component({ - selector: 'my-comp', - template: '', - }) - class MyComponent { - arRef = afterRender(() => {}); - } - - const fixture = TestBed.createComponent(MyComponent); + expect(() => { fixture.detectChanges(); + }).toThrow(); - expect( - p.hasEvents(ProfilerEvent.AfterRenderHooksStart, ProfilerEvent.AfterRenderHooksEnd), - ).toBeTrue(); - }); + const lifecycleStart = findProfilerCall(ProfilerEvent.LifecycleHookStart); + const lifecycleEnd = findProfilerCall(ProfilerEvent.LifecycleHookEnd); - it('should invoke a profiler when defer block transitions between states', () => { - @Component({ - selector: 'my-comp', - template: ` - @defer (on immediate) { - nothing to see here... - } - `, - }) - class MyComponent {} - - const fixture = TestBed.createComponent(MyComponent); - fixture.detectChanges(); - - expect( - p.hasEvents(ProfilerEvent.DeferBlockStateStart, ProfilerEvent.DeferBlockStateEnd), - ).toBeTrue(); - }); + expect(lifecycleStart).toBeTruthy(); + expect(lifecycleEnd).toBeTruthy(); }); }); From 412ac303bc926d8e929361cc776505bb0d8b4da4 Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Mon, 13 Jan 2025 13:39:14 -0800 Subject: [PATCH 0066/1220] Revert "refactor(core): profiler takes null as a default instance (#59233)" (#59506) This reverts commit c4ad8fb2e7e18d6c32ccc1918fb94fd09680cd75. PR Close #59506 --- .../ng-devtools-backend/src/lib/hooks/profiler/native.ts | 2 +- packages/core/src/render3/profiler.ts | 2 +- packages/core/src/render3/profiler_types.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/devtools/projects/ng-devtools-backend/src/lib/hooks/profiler/native.ts b/devtools/projects/ng-devtools-backend/src/lib/hooks/profiler/native.ts index c9e05625fedb..7f474baea23f 100644 --- a/devtools/projects/ng-devtools-backend/src/lib/hooks/profiler/native.ts +++ b/devtools/projects/ng-devtools-backend/src/lib/hooks/profiler/native.ts @@ -43,7 +43,7 @@ export class NgProfiler extends Profiler { private _initialize(): void { ngDebugClient().ɵsetProfiler( - (event: ɵProfilerEvent, instanceOrLView: {} | null = null, hookOrListener: any) => + (event: ɵProfilerEvent, instanceOrLView: {} | null, hookOrListener: any) => this._callbacks.forEach((cb) => cb(event, instanceOrLView, hookOrListener)), ); } diff --git a/packages/core/src/render3/profiler.ts b/packages/core/src/render3/profiler.ts index d52d232e00a9..4684e1e42be2 100644 --- a/packages/core/src/render3/profiler.ts +++ b/packages/core/src/render3/profiler.ts @@ -33,7 +33,7 @@ export const setProfiler = (profiler: Profiler | null) => { * execution context * @returns */ -export const profiler: Profiler = function (event, instance = null, hookOrListener) { +export const profiler: Profiler = function (event, instance, hookOrListener) { if (profilerCallback != null /* both `null` and `undefined` */) { profilerCallback(event, instance, hookOrListener); } diff --git a/packages/core/src/render3/profiler_types.ts b/packages/core/src/render3/profiler_types.ts index f8a42a2d8447..5e7d155b55ae 100644 --- a/packages/core/src/render3/profiler_types.ts +++ b/packages/core/src/render3/profiler_types.ts @@ -160,5 +160,5 @@ export const enum ProfilerEvent { * Profiler function which the runtime will invoke before and after user code. */ export interface Profiler { - (event: ProfilerEvent, instance?: {} | null, hookOrListener?: (e?: any) => any): void; + (event: ProfilerEvent, instance: {} | null, hookOrListener?: (e?: any) => any): void; } From 9963a7369978ffbf796117732f476408951f3191 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Mon, 13 Jan 2025 11:34:04 -0500 Subject: [PATCH 0067/1220] docs: update component HMR to fully stable (#59503) As of 19.1, component HMR for both styles and templates is considered stable and enabled by default. This includes support for both inline and file-based component styles/templates. PR Close #59503 --- .../tools/cli/build-system-migration.md | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/adev/src/content/tools/cli/build-system-migration.md b/adev/src/content/tools/cli/build-system-migration.md index dde2fbd8d56f..f8f53e2fef82 100644 --- a/adev/src/content/tools/cli/build-system-migration.md +++ b/adev/src/content/tools/cli/build-system-migration.md @@ -188,14 +188,13 @@ This will not occur in builds outside the development server. Hot Module Replacement (HMR) is a technique used by development servers to avoid reloading the entire page when only part of an application is changed. The changes in many cases can be immediately shown in the browser which allows for an improved edit/refresh cycle while developing an application. While general JavaScript-based hot module replacement (HMR) is currently not supported, several more specific forms of HMR are available: -- **global stylesheets** (default) -- **component stylesheet** (default) -- **component template** (experimental opt-in) +- **global stylesheet** (`styles` build option) +- **component stylesheet** (inline and file-based) +- **component template** (inline and file-based) -The stylesheet HMR capabilities are automatically enabled and require no code or configuration changes to use. -Angular provides HMR support for both file-based (`styleUrl`/`styleUrls`) and inline (`styles`) component styles. +The HMR capabilities are automatically enabled and require no code or configuration changes to use. +Angular provides HMR support for both file-based (`templateUrl`/`styleUrl`/`styleUrls`) and inline (`template`/`styles`) component styles and templates. The build system will attempt to compile and process the minimal amount of application code when it detects a stylesheet only change. -In many cases, no JavaScript/TypeScript processing will be required. If preferred, the HMR capabilities can be disabled by setting the `hmr` development server option to `false`. This can also be changed on the command line via: @@ -206,14 +205,6 @@ ng serve --no-hmr -In addition to fully supported component stylesheet HMR, Angular provides **experimental** support for component template HMR. -Template HMR also requires no application code changes but currently requires the use of the `NG_HMR_TEMPLATES=1` environment variable to enable. - -IMPORTANT: Component **template** HMR is experimental and is not enabled by default. -Currently, only file-based (`styleUrl`) templates are supported and any inline template changes will cause a full page reload. -When manually enabled, there may be cases where the browser is not fully synchronized with the application code and a restart of the development server may be required. -If you encounter an issue while using this feature, please [report the bug](https://github.com/angular/angular-cli/issues) to help the Angular team stabilize the feature. - ### Vite as a development server The usage of Vite in the Angular CLI is currently within a _development server capacity only_. Even without using the underlying Vite build system, Vite provides a full-featured development server with client side support that has been bundled into a low dependency npm package. This makes it an ideal candidate to provide comprehensive development server functionality. The current development server process uses the new build system to generate a development build of the application in memory and passes the results to Vite to serve the application. The usage of Vite, much like the Webpack-based development server, is encapsulated within the Angular CLI `dev-server` builder and currently cannot be directly configured. From d038b3cdd1687582fd5761a10214ffc7bcd52dd6 Mon Sep 17 00:00:00 2001 From: arturovt Date: Tue, 14 Jan 2025 06:53:24 +0200 Subject: [PATCH 0068/1220] refactor(docs-infra): lazy-load `EmbeddedTutorialManager` in editor UI state (#59509) In this commit, we lazy-load the `EmbeddedTutorialManager` in the editor UI state as done in other parts of the code. PR Close #59509 --- adev/src/app/editor/editor-ui-state.service.ts | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/adev/src/app/editor/editor-ui-state.service.ts b/adev/src/app/editor/editor-ui-state.service.ts index b1b3ea7af831..de0dafd2c062 100644 --- a/adev/src/app/editor/editor-ui-state.service.ts +++ b/adev/src/app/editor/editor-ui-state.service.ts @@ -6,13 +6,13 @@ * found in the LICENSE file at https://angular.dev/license */ -import {DestroyRef, inject, Injectable, signal} from '@angular/core'; +import {EnvironmentInjector, inject, Injectable, signal} from '@angular/core'; import {takeUntilDestroyed} from '@angular/core/rxjs-interop'; -import {filter, map, Subject} from 'rxjs'; +import {filter, from, map, Subject, switchMap} from 'rxjs'; import {TutorialMetadata, TutorialType} from '@angular/docs'; -import {EmbeddedTutorialManager} from './embedded-tutorial-manager.service'; +import {injectEmbeddedTutorialManager} from './inject-embedded-tutorial-manager'; export interface EditorUiStateConfig { displayOnlyInteractiveTerminal: boolean; @@ -23,8 +23,7 @@ export const DEFAULT_EDITOR_UI_STATE: EditorUiStateConfig = { @Injectable() export class EditorUiState { - private readonly embeddedTutorialManager = inject(EmbeddedTutorialManager); - private readonly destroyRef = inject(DestroyRef); + private readonly environmentInjector = inject(EnvironmentInjector); private readonly stateChanged = new Subject(); @@ -41,11 +40,13 @@ export class EditorUiState { } private handleTutorialChange() { - this.embeddedTutorialManager.tutorialChanged$ + from(injectEmbeddedTutorialManager(this.environmentInjector)) .pipe( - map(() => this.embeddedTutorialManager.type()), + switchMap((embeddedTutorialManager) => + embeddedTutorialManager.tutorialChanged$.pipe(map(() => embeddedTutorialManager.type())), + ), filter((tutorialType): tutorialType is TutorialMetadata['type'] => Boolean(tutorialType)), - takeUntilDestroyed(this.destroyRef), + takeUntilDestroyed(), ) .subscribe((tutorialType) => { if (tutorialType === TutorialType.CLI) { From e15226a444a3cf34feea226976c489735feb963e Mon Sep 17 00:00:00 2001 From: RafaelJCamara Date: Fri, 20 Dec 2024 20:25:11 -0100 Subject: [PATCH 0069/1220] refactor: initialize headers map directly in HttpHeaders class (#59268) Improved the initialization of the headers map to enhance performance and code readability. No breaking changes. PR Close #59268 --- packages/common/http/src/headers.ts | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/packages/common/http/src/headers.ts b/packages/common/http/src/headers.ts index 6b137c1562a0..ab9b46eb6c75 100644 --- a/packages/common/http/src/headers.ts +++ b/packages/common/http/src/headers.ts @@ -23,8 +23,7 @@ export class HttpHeaders { /** * Internal map of lowercase header names to values. */ - // TODO(issue/24571): remove '!'. - private headers!: Map; + private headers: Map = new Map(); /** * Internal map of lowercased header names to the normalized @@ -47,11 +46,9 @@ export class HttpHeaders { constructor( headers?: string | {[name: string]: string | number | (string | number)[]} | Headers, ) { - if (!headers) { - this.headers = new Map(); - } else if (typeof headers === 'string') { + if (!headers) return; + if (typeof headers === 'string') { this.lazyInit = () => { - this.headers = new Map(); headers.split('\n').forEach((line) => { const index = line.indexOf(':'); if (index > 0) { @@ -62,7 +59,6 @@ export class HttpHeaders { }); }; } else if (typeof Headers !== 'undefined' && headers instanceof Headers) { - this.headers = new Map(); headers.forEach((value: string, name: string) => { this.addHeaderEntry(name, value); }); @@ -71,7 +67,6 @@ export class HttpHeaders { if (typeof ngDevMode === 'undefined' || ngDevMode) { assertValidHeaders(headers); } - this.headers = new Map(); Object.entries(headers).forEach(([name, values]) => { this.setHeaderEntries(name, values); }); From 3d1496274c8aba8e51d7fa29213eebb998294784 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Tue, 14 Jan 2025 16:17:53 +0100 Subject: [PATCH 0070/1220] ci: update Ethan Cline GitHub user name (#59516) Use case-sensitive user name. PR Close #59516 --- .pullapprove.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pullapprove.yml b/.pullapprove.yml index 01b35ac42af3..8c2a456aa41c 100644 --- a/.pullapprove.yml +++ b/.pullapprove.yml @@ -516,7 +516,7 @@ groups: - iteriani # Thomas Nguyen - tbondwilkinson # Tom Wilkinson - rahatarmanahmed # Rahat Ahmed - - enaml # Ethan Cline + - ENAML # Ethan Cline labels: pending: 'requires: TGP' approved: 'requires: TGP' From 5462c640479489950e8e26a418b9ca0114ed0ea0 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Tue, 14 Jan 2025 07:14:46 +0000 Subject: [PATCH 0071/1220] build: update scorecard action dependencies (#59513) See associated pull request for more information. PR Close #59513 --- .github/workflows/scorecard.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 970aefa63a76..dd9e04b93552 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -39,7 +39,7 @@ jobs: # Upload the results as artifacts. - name: 'Upload artifact' - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: SARIF file path: results.sarif @@ -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@48ab28a6f5dbc2a99bf1e0131198dd8f1df78169 # v3.28.0 + uses: github/codeql-action/upload-sarif@b6a472f63d85b9c78a3ac5e89422239fc15e9b3c # v3.28.1 with: sarif_file: results.sarif From 2c8f199cf7889a5314d84fe39fe62d68e60eb03b Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Tue, 14 Jan 2025 06:14:51 +0000 Subject: [PATCH 0072/1220] build: update dependency @babel/generator to v7.26.5 (#59511) See associated pull request for more information. PR Close #59511 --- package.json | 2 +- yarn.lock | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 1321c860e199..7b075fd4c20b 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "@angular/ssr": "19.1.0-rc.0", "@babel/cli": "7.26.4", "@babel/core": "7.26.0", - "@babel/generator": "7.26.3", + "@babel/generator": "7.26.5", "@bazel/concatjs": "5.8.1", "@bazel/esbuild": "5.8.1", "@bazel/jasmine": "5.8.1", diff --git a/yarn.lock b/yarn.lock index bf1be22a580d..b6a28b7658e2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -536,6 +536,17 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" +"@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" @@ -703,6 +714,13 @@ dependencies: "@babel/types" "^7.26.3" +"@babel/parser@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.5.tgz#6fec9aebddef25ca57a935c86dbb915ae2da3e1f" + integrity sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw== + dependencies: + "@babel/types" "^7.26.5" + "@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" @@ -1306,6 +1324,14 @@ "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" +"@babel/types@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.5.tgz#7a1e1c01d28e26d1fe7f8ec9567b3b92b9d07747" + integrity sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg== + 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 1f4c9ec2cfa41ebf2caffd77bd844337ba6b0bbd Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Tue, 14 Jan 2025 07:12:58 +0000 Subject: [PATCH 0073/1220] build: update all non-major dependencies (#59510) See associated pull request for more information. PR Close #59510 --- .github/workflows/pr.yml | 2 +- package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 3b8c852b7a7d..4d991be9c39b 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -95,7 +95,7 @@ jobs: - name: Run CI tests for framework run: yarn tsx ./scripts/build/build-packages-dist.mts - name: Archive build artifacts - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: pr-artifacts-${{ github.event.number }} path: dist/packages-dist/ diff --git a/package.json b/package.json index 7b075fd4c20b..62bbcf7b07a9 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.290", + "@types/chrome": "^0.0.294", "@types/convert-source-map": "^2.0.0", "@types/diff": "^7.0.0", "@types/dom-view-transitions": "^1.0.1", diff --git a/yarn.lock b/yarn.lock index b6a28b7658e2..10d6a364b73a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3766,10 +3766,10 @@ resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.5.tgz#db9468cb1b1b5a925b8f34822f1669df0c5472f5" integrity sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg== -"@types/chrome@^0.0.290": - version "0.0.290" - resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.290.tgz#570e511360d1b92cf24773af0c3b23b6e1f13152" - integrity sha512-N92vsAdlwoWameDQ8D4K0EZXXvxsJ1+gJg+4TWjUUsZ6gpontVmwl1XVtysA3mso45Fcn5UPiX/yqiT8GcBV3A== +"@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== dependencies: "@types/filesystem" "*" "@types/har-format" "*" From 220608e4cc6d412d219941b4dc328de1c73a8a28 Mon Sep 17 00:00:00 2001 From: hawkgs Date: Fri, 20 Dec 2024 13:44:55 +0200 Subject: [PATCH 0074/1220] docs(docs-infra): generate errors and extended-diagnostics route NavigationItem-s (#59355) Generate the `NavigationItem`-s as part of adev/shared-docs pipeline and use the output JSON files instead of the hardcoded objects in the `sub-navigation-data.ts`. PR Close #59355 --- adev/shared-docs/index.bzl | 4 +- adev/shared-docs/pipeline/BUILD.bazel | 19 ++ adev/shared-docs/pipeline/_navigation.bzl | 61 +++++ .../pipeline/navigation/BUILD.bazel | 36 +++ adev/shared-docs/pipeline/navigation/index.ts | 26 ++ .../pipeline/navigation/nav-items-gen.ts | 59 ++++ .../pipeline/navigation/strategies.ts | 54 ++++ .../pipeline/navigation/test/BUILD.bazel | 17 ++ .../navigation/test/nav-items-gen.spec.ts | 50 ++++ adev/shared-docs/pipeline/navigation/types.ts | 22 ++ .../pipeline/tutorials/BUILD.bazel | 1 - adev/shared-docs/utils/BUILD.bazel | 2 - adev/src/app/sub-navigation-data.ts | 259 +----------------- adev/src/assets/BUILD.bazel | 2 + adev/src/content/reference/errors/BUILD.bazel | 31 ++- .../extended-diagnostics/BUILD.bazel | 31 ++- 16 files changed, 405 insertions(+), 269 deletions(-) create mode 100644 adev/shared-docs/pipeline/_navigation.bzl create mode 100644 adev/shared-docs/pipeline/navigation/BUILD.bazel create mode 100644 adev/shared-docs/pipeline/navigation/index.ts create mode 100644 adev/shared-docs/pipeline/navigation/nav-items-gen.ts create mode 100644 adev/shared-docs/pipeline/navigation/strategies.ts create mode 100644 adev/shared-docs/pipeline/navigation/test/BUILD.bazel create mode 100644 adev/shared-docs/pipeline/navigation/test/nav-items-gen.spec.ts create mode 100644 adev/shared-docs/pipeline/navigation/types.ts diff --git a/adev/shared-docs/index.bzl b/adev/shared-docs/index.bzl index d5f9adecde90..f910c2911a11 100644 --- a/adev/shared-docs/index.bzl +++ b/adev/shared-docs/index.bzl @@ -1,9 +1,11 @@ load("//adev/shared-docs/pipeline:_guides.bzl", _generate_guides = "generate_guides") -load("//adev/shared-docs/pipeline:_stackblitz.bzl", _generate_stackblitz = "generate_stackblitz") +load("//adev/shared-docs/pipeline:_navigation.bzl", _generate_nav_items = "generate_nav_items") load("//adev/shared-docs/pipeline:_playground.bzl", _generate_playground = "generate_playground") +load("//adev/shared-docs/pipeline:_stackblitz.bzl", _generate_stackblitz = "generate_stackblitz") load("//adev/shared-docs/pipeline:_tutorial.bzl", _generate_tutorial = "generate_tutorial") generate_guides = _generate_guides generate_stackblitz = _generate_stackblitz generate_playground = _generate_playground generate_tutorial = _generate_tutorial +generate_nav_items = _generate_nav_items diff --git a/adev/shared-docs/pipeline/BUILD.bazel b/adev/shared-docs/pipeline/BUILD.bazel index 92accc4468f6..2473df567718 100644 --- a/adev/shared-docs/pipeline/BUILD.bazel +++ b/adev/shared-docs/pipeline/BUILD.bazel @@ -97,11 +97,24 @@ esbuild_esm_bundle( ], ) +esbuild_esm_bundle( + name = "navigation-bundle", + entry_point = "//adev/shared-docs/pipeline/navigation:index.ts", + output = "navigation.mjs", + platform = "node", + target = "es2022", + visibility = ["//visibility:public"], + deps = [ + "//adev/shared-docs/pipeline/navigation", + ], +) + exports_files([ "_guides.bzl", "_stackblitz.bzl", "_playground.bzl", "_tutorial.bzl", + "_navigation.bzl", "BUILD.bazel", ]) @@ -160,3 +173,9 @@ nodejs_binary( entry_point = "//adev/shared-docs/pipeline:tutorial.mjs", visibility = ["//visibility:public"], ) + +nodejs_binary( + name = "navigation", + entry_point = "//adev/shared-docs/pipeline:navigation.mjs", + visibility = ["//visibility:public"], +) diff --git a/adev/shared-docs/pipeline/_navigation.bzl b/adev/shared-docs/pipeline/_navigation.bzl new file mode 100644 index 000000000000..d61f0ce2c12a --- /dev/null +++ b/adev/shared-docs/pipeline/_navigation.bzl @@ -0,0 +1,61 @@ +load("@build_bazel_rules_nodejs//:providers.bzl", "run_node") + +def _generate_nav_items(ctx): + """Implementation of the navigation items data generator rule""" + + # Set the arguments for the actions inputs and output location. + args = ctx.actions.args() + + # Use a param file because we may have a large number of inputs. + args.set_param_file_format("multiline") + args.use_param_file("%s", use_always = True) + + # Pass the set of source files. + args.add_joined(ctx.files.srcs, join_with = ",") + + # Add BUILD file path to the arguments. + args.add(ctx.label.package) + + # Add the nav item generation strategy to thte arguments. + args.add(ctx.attr.strategy) + + # File declaration of the generated JSON file. + json_output = ctx.actions.declare_file("routes.json") + + # Add the path to the output file to the arguments. + args.add(json_output.path) + + run_node( + ctx = ctx, + inputs = depset(ctx.files.srcs), + executable = "_generate_nav_items", + outputs = [json_output], + arguments = [args], + ) + + # The return value describes what the rule is producing. In this case we need to specify + # the "DefaultInfo" with the output json file. + return [DefaultInfo(files = depset([json_output]))] + +generate_nav_items = rule( + # Point to the starlark function that will execute for this rule. + implementation = _generate_nav_items, + doc = """Rule that generates navigation items data.""", + + # The attributes that can be set to this rule. + attrs = { + "srcs": attr.label_list( + doc = """Markdown files that represent the page contents.""", + allow_empty = False, + allow_files = True, + ), + "strategy": attr.string( + doc = """Represents the navigation items generation strategy.""", + ), + "_generate_nav_items": attr.label( + default = Label("//adev/shared-docs/pipeline:navigation"), + executable = True, + cfg = "exec", + ), + }, +) diff --git a/adev/shared-docs/pipeline/navigation/BUILD.bazel b/adev/shared-docs/pipeline/navigation/BUILD.bazel new file mode 100644 index 000000000000..aa01af2889b2 --- /dev/null +++ b/adev/shared-docs/pipeline/navigation/BUILD.bazel @@ -0,0 +1,36 @@ +load("//tools:defaults.bzl", "ts_library") + +package(default_visibility = ["//visibility:public"]) + +ts_library( + name = "lib", + srcs = glob( + [ + "*.ts", + ], + exclude = [ + "index.ts", + ], + ), + deps = [ + "//adev/shared-docs/interfaces", + "@npm//@types/node", + "@npm//@webcontainer/api", + "@npm//fast-glob", + ], +) + +ts_library( + name = "navigation", + srcs = [ + "index.ts", + ], + visibility = [ + "//adev/shared-docs:__subpackages__", + ], + deps = [ + ":lib", + "//adev/shared-docs/interfaces", + "@npm//@types/node", + ], +) diff --git a/adev/shared-docs/pipeline/navigation/index.ts b/adev/shared-docs/pipeline/navigation/index.ts new file mode 100644 index 000000000000..38583b76d95b --- /dev/null +++ b/adev/shared-docs/pipeline/navigation/index.ts @@ -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 {readFileSync, writeFileSync} from 'fs'; +import {generateNavItems} from './nav-items-gen'; +import {getNavItemGenStrategy} from './strategies'; + +async function main() { + const [paramFilePath] = process.argv.slice(2); + const rawParamLines = readFileSync(paramFilePath, {encoding: 'utf8'}).split('\n'); + const [joinedSrcs, packageDir, strategy, outputFilePath] = rawParamLines; + + const srcs = joinedSrcs.split(','); + + // Generate navigation data + const navData = await generateNavItems(srcs, getNavItemGenStrategy(strategy, packageDir)); + + writeFileSync(outputFilePath, JSON.stringify(navData)); +} + +await main(); diff --git a/adev/shared-docs/pipeline/navigation/nav-items-gen.ts b/adev/shared-docs/pipeline/navigation/nav-items-gen.ts new file mode 100644 index 000000000000..0e6e58f23eaf --- /dev/null +++ b/adev/shared-docs/pipeline/navigation/nav-items-gen.ts @@ -0,0 +1,59 @@ +/*! + * @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 fs from 'fs'; +import readline from 'readline'; +import {basename, dirname, resolve} from 'path'; + +import {NavigationItem} from '../../interfaces'; +import {NavigationItemGenerationStrategy} from './types'; + +/** + * Generate navigations items by a provided strategy. + * + * @param mdFilesPaths Paths to the Markdown files that represent the page contents + * @param strategy Strategy + * @returns An array with navigation items + */ +export async function generateNavItems( + mdFilesPaths: string[], + strategy: NavigationItemGenerationStrategy, +): Promise { + const navItems: NavigationItem[] = []; + const {labelGeneratorFn, pathPrefix, contentPath} = strategy; + + for (const path of mdFilesPaths) { + const fullPath = resolve(dirname(path), basename(path)); + const name = path.split('/').pop()?.replace('.md', '')!; + const firstLine = await getMdFileHeading(fullPath); + + navItems.push({ + label: labelGeneratorFn(name, firstLine), + path: `${pathPrefix}/${name}`, + contentPath: `${contentPath}/${name}`, + }); + } + + return navItems; +} + +/** Extract the first heading from a Markdown file. */ +async function getMdFileHeading(filePath: string): Promise { + const readStream = fs.createReadStream(filePath); + const rl = readline.createInterface({input: readStream}); + + for await (const line of rl) { + if (line.trim().startsWith('#')) { + rl.close(); + readStream.destroy(); + return line.replace(/^#+[ \t]+/, ''); + } + } + + return ''; +} diff --git a/adev/shared-docs/pipeline/navigation/strategies.ts b/adev/shared-docs/pipeline/navigation/strategies.ts new file mode 100644 index 000000000000..f817fcdf6778 --- /dev/null +++ b/adev/shared-docs/pipeline/navigation/strategies.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 {NavigationItemGenerationStrategy, Strategy} from './types'; + +// Should point to the website content. +// Update, if the location is updated or shared-docs is extracted from `adev/`. +const CONTENT_FOLDER_PATH = 'adev/src/content/'; + +// Ensure that all Strategy-ies are part of SUPPORTED_STRATEGIES by using a key-typed object. +const strategiesObj: {[key in Strategy]: null} = {errors: null, 'extended-diagnostics': null}; +const SUPPORTED_STRATEGIES = Object.keys(strategiesObj); + +/** Get navigation item generation strategy by a provided strategy string. */ +export function getNavItemGenStrategy( + strategy: string, + packageDir: string, +): NavigationItemGenerationStrategy { + if (SUPPORTED_STRATEGIES.indexOf(strategy) === -1) { + throw new Error( + `Unsupported NavigationItem generation strategy "${strategy}". Supported: ${SUPPORTED_STRATEGIES.join(', ')}`, + ); + } + + switch (strategy as Strategy) { + case 'errors': + return errorsStrategy(packageDir); + case 'extended-diagnostics': + return extendedDiagnosticsStrategy(packageDir); + } +} + +// "Errors" navigation items generation strategy +function errorsStrategy(packageDir: string): NavigationItemGenerationStrategy { + return { + pathPrefix: 'errors', + contentPath: packageDir.replace(CONTENT_FOLDER_PATH, ''), + labelGeneratorFn: (fileName, firstLine) => fileName + ': ' + firstLine, + }; +} + +// "Extended diagnostics" items generation strategy +function extendedDiagnosticsStrategy(packageDir: string): NavigationItemGenerationStrategy { + return { + pathPrefix: 'extended-diagnostics', + contentPath: packageDir.replace(CONTENT_FOLDER_PATH, ''), + labelGeneratorFn: (fileName, firstLine) => fileName + ': ' + firstLine, + }; +} diff --git a/adev/shared-docs/pipeline/navigation/test/BUILD.bazel b/adev/shared-docs/pipeline/navigation/test/BUILD.bazel new file mode 100644 index 000000000000..b7472dbe0265 --- /dev/null +++ b/adev/shared-docs/pipeline/navigation/test/BUILD.bazel @@ -0,0 +1,17 @@ +load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") + +package(default_visibility = ["//adev/shared-docs/pipeline/navigation:__subpackages__"]) + +ts_library( + name = "unit_test_lib", + testonly = True, + srcs = glob(["*.spec.ts"]), + deps = [ + "//adev/shared-docs/pipeline/navigation:lib", + ], +) + +jasmine_node_test( + name = "unit_tests", + deps = [":unit_test_lib"], +) diff --git a/adev/shared-docs/pipeline/navigation/test/nav-items-gen.spec.ts b/adev/shared-docs/pipeline/navigation/test/nav-items-gen.spec.ts new file mode 100644 index 000000000000..0612521bf05a --- /dev/null +++ b/adev/shared-docs/pipeline/navigation/test/nav-items-gen.spec.ts @@ -0,0 +1,50 @@ +/** + * @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 {generateNavItems} from '../nav-items-gen'; +import {NavigationItemGenerationStrategy} from '../types'; +import fs from 'fs'; +import readline from 'readline'; + +const readlineInterfaceMock = { + close: () => {}, + async *[Symbol.asyncIterator]() { + yield ''; + yield 'Some random text'; + yield '## Heading'; + yield 'Some text'; + }, +}; + +describe('generateNavItems', () => { + it('should test the default case', async () => { + spyOn(fs, 'createReadStream').and.returnValue({destroy: () => null} as any); + spyOn(readline, 'createInterface').and.returnValue(readlineInterfaceMock as any); + + const strategy: NavigationItemGenerationStrategy = { + pathPrefix: 'page', + contentPath: 'content/directory', + labelGeneratorFn: (fileName, firstLine) => fileName + ' // ' + firstLine, + }; + + const navItems = await generateNavItems(['directory/home.md', 'directory/about.md'], strategy); + + expect(navItems).toEqual([ + { + label: 'home // Heading', + path: 'page/home', + contentPath: 'content/directory/home', + }, + { + label: 'about // Heading', + path: 'page/about', + contentPath: 'content/directory/about', + }, + ]); + }); +}); diff --git a/adev/shared-docs/pipeline/navigation/types.ts b/adev/shared-docs/pipeline/navigation/types.ts new file mode 100644 index 000000000000..f92e5db9e005 --- /dev/null +++ b/adev/shared-docs/pipeline/navigation/types.ts @@ -0,0 +1,22 @@ +/*! + * @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 + */ + +/** + * `NavigationItem` generation strategy + */ +export type NavigationItemGenerationStrategy = { + /** App route path prefix. */ + pathPrefix: string; + /** Content path where the source files are kept. */ + contentPath: string; + /** Page/route label generator function. */ + labelGeneratorFn: (fileName: string, firstLine: string) => string; +}; + +/** Strategy for navigation item generation. */ +export type Strategy = 'errors' | 'extended-diagnostics'; diff --git a/adev/shared-docs/pipeline/tutorials/BUILD.bazel b/adev/shared-docs/pipeline/tutorials/BUILD.bazel index 40e1384f93c0..a7faa454b246 100644 --- a/adev/shared-docs/pipeline/tutorials/BUILD.bazel +++ b/adev/shared-docs/pipeline/tutorials/BUILD.bazel @@ -33,7 +33,6 @@ ts_library( ":editor", "//adev/shared-docs/interfaces", "@npm//@types/node", - "@npm//fast-glob", ], ) diff --git a/adev/shared-docs/utils/BUILD.bazel b/adev/shared-docs/utils/BUILD.bazel index 133d2d0b348f..3d277f55f488 100644 --- a/adev/shared-docs/utils/BUILD.bazel +++ b/adev/shared-docs/utils/BUILD.bazel @@ -29,8 +29,6 @@ ts_library( "//adev/shared-docs/providers", "//packages/core", "//packages/router", - "@npm//@types/node", - "@npm//@webcontainer/api", "@npm//fflate", ], ) diff --git a/adev/src/app/sub-navigation-data.ts b/adev/src/app/sub-navigation-data.ts index 65800271831b..2aa7db92b06f 100644 --- a/adev/src/app/sub-navigation-data.ts +++ b/adev/src/app/sub-navigation-data.ts @@ -12,6 +12,8 @@ import {NavigationItem} from '@angular/docs'; import FIRST_APP_TUTORIAL_NAV_DATA from '../../src/assets/tutorials/first-app/routes.json'; import LEARN_ANGULAR_TUTORIAL_NAV_DATA from '../../src/assets/tutorials/learn-angular/routes.json'; import DEFERRABLE_VIEWS_TUTORIAL_NAV_DATA from '../../src/assets/tutorials/deferrable-views/routes.json'; +import ERRORS_NAV_DATA from '../../src/assets/content/reference/errors/routes.json'; +import EXT_DIAGNOSTICS_NAV_DATA from '../../src/assets/content/reference/extended-diagnostics/routes.json'; import {DefaultPage} from './core/enums/pages'; import {getApiNavigationItems} from './features/references/helpers/manifest.helper'; @@ -1130,206 +1132,7 @@ const REFERENCE_SUB_NAVIGATION_DATA: NavigationItem[] = [ path: 'errors', contentPath: 'reference/errors/overview', }, - { - label: 'NG0100: Expression Changed After Checked', - path: 'errors/NG0100', - contentPath: 'reference/errors/NG0100', - }, - { - label: 'NG01101: Wrong Async Validator Return Type', - path: 'errors/NG01101', - contentPath: 'reference/errors/NG01101', - }, - { - label: 'NG01203: Missing value accessor', - path: 'errors/NG01203', - contentPath: 'reference/errors/NG01203', - }, - { - label: 'NG0200: Circular Dependency in DI', - path: 'errors/NG0200', - contentPath: 'reference/errors/NG0200', - }, - { - label: 'NG0201: No Provider Found', - path: 'errors/NG0201', - contentPath: 'reference/errors/NG0201', - }, - { - label: 'NG0203: `inject()` must be called from an injection context', - path: 'errors/NG0203', - contentPath: 'reference/errors/NG0203', - }, - { - label: 'NG0209: Invalid multi provider', - path: 'errors/NG0209', - contentPath: 'reference/errors/NG0209', - }, - { - label: 'NG02200: Missing Iterable Differ', - path: 'errors/NG02200', - contentPath: 'reference/errors/NG02200', - }, - { - label: 'NG02800: JSONP support in HttpClient configuration', - path: 'errors/NG02800', - contentPath: 'reference/errors/NG02800', - }, - { - label: 'NG0300: Selector Collision', - path: 'errors/NG0300', - contentPath: 'reference/errors/NG0300', - }, - { - label: 'NG0301: Export Not Found', - path: 'errors/NG0301', - contentPath: 'reference/errors/NG0301', - }, - { - label: 'NG0302: Pipe Not Found', - path: 'errors/NG0302', - contentPath: 'reference/errors/NG0302', - }, - { - label: `NG0403: Bootstrapped NgModule doesn't specify which component to initialize`, - path: 'errors/NG0403', - contentPath: 'reference/errors/NG0403', - }, - { - label: 'NG0500: Hydration Node Mismatch', - path: 'errors/NG0500', - contentPath: 'reference/errors/NG0500', - }, - { - label: 'NG0501: Hydration Missing Siblings', - path: 'errors/NG0501', - contentPath: 'reference/errors/NG0501', - }, - { - label: 'NG0502: Hydration Missing Node', - path: 'errors/NG0502', - contentPath: 'reference/errors/NG0502', - }, - { - label: 'NG0503: Hydration Unsupported Projection of DOM Nodes', - path: 'errors/NG0503', - contentPath: 'reference/errors/NG0503', - }, - { - label: 'NG0504: Skip hydration flag is applied to an invalid node', - path: 'errors/NG0504', - contentPath: 'reference/errors/NG0504', - }, - { - label: 'NG0505: No hydration info in server response', - path: 'errors/NG0505', - contentPath: 'reference/errors/NG0505', - }, - { - label: 'NG0506: NgZone remains unstable', - path: 'errors/NG0506', - contentPath: 'reference/errors/NG0506', - }, - { - label: 'NG0507: HTML content was altered after server-side rendering', - path: 'errors/NG0507', - contentPath: 'reference/errors/NG0507', - }, - { - label: 'NG0602: Disallowed function call inside reactive context', - path: 'errors/NG0602', - contentPath: 'reference/errors/NG0602', - }, - { - label: 'NG05104: Root element was not found', - path: 'errors/NG05104', - contentPath: 'reference/errors/NG05104', - }, - { - label: 'NG0910: Unsafe bindings on an iframe element', - path: 'errors/NG0910', - contentPath: 'reference/errors/NG0910', - }, - { - label: 'NG0912: Component ID generation collision', - path: 'errors/NG0912', - contentPath: 'reference/errors/NG0912', - }, - { - label: 'NG0913: Runtime Performance Warnings', - path: 'errors/NG0913', - contentPath: 'reference/errors/NG0913', - }, - { - label: 'NG0950: Required input is accessed before a value is set.', - path: 'errors/NG0950', - contentPath: 'reference/errors/NG0950', - }, - { - label: 'NG0951: Child query result is required but no value is available.', - path: 'errors/NG0951', - contentPath: 'reference/errors/NG0951', - }, - { - label: 'NG0955: Track expression resulted in duplicated keys for a given collection', - path: 'errors/NG0955', - contentPath: 'reference/errors/NG0955', - }, - { - label: 'NG0956: Tracking expression caused re-creation of the DOM structure', - path: 'errors/NG0956', - contentPath: 'reference/errors/NG0956', - }, - { - label: 'NG1001: Argument Not Literal', - path: 'errors/NG1001', - contentPath: 'reference/errors/NG1001', - }, - { - label: 'NG2003: Missing Token', - path: 'errors/NG2003', - contentPath: 'reference/errors/NG2003', - }, - { - label: 'NG2009: Invalid Shadow DOM selector', - path: 'errors/NG2009', - contentPath: 'reference/errors/NG2009', - }, - { - label: 'NG3003: Import Cycle Detected', - path: 'errors/NG3003', - contentPath: 'reference/errors/NG3003', - }, - { - label: 'NG05000: Hydration with unsupported Zone.js instance.', - path: 'errors/NG05000', - contentPath: 'reference/errors/NG05000', - }, - { - label: 'NG0750: @defer dependencies failed to load', - path: 'errors/NG0750', - contentPath: 'reference/errors/NG0750', - }, - { - label: 'NG6100: NgModule.id Set to module.id anti-pattern', - path: 'errors/NG6100', - contentPath: 'reference/errors/NG6100', - }, - { - label: 'NG8001: Invalid Element', - path: 'errors/NG8001', - contentPath: 'reference/errors/NG8001', - }, - { - label: 'NG8002: Invalid Attribute', - path: 'errors/NG8002', - contentPath: 'reference/errors/NG8002', - }, - { - label: 'NG8003: Missing Reference Target', - path: 'errors/NG8003', - contentPath: 'reference/errors/NG8003', - }, + ...ERRORS_NAV_DATA, ], }, { @@ -1340,61 +1143,7 @@ const REFERENCE_SUB_NAVIGATION_DATA: NavigationItem[] = [ path: 'extended-diagnostics', contentPath: 'reference/extended-diagnostics/overview', }, - { - label: 'NG8101: Invalid Banana-in-Box', - path: 'extended-diagnostics/NG8101', - contentPath: 'reference/extended-diagnostics/NG8101', - }, - { - label: 'NG8102: Nullish coalescing not nullable', - path: 'extended-diagnostics/NG8102', - contentPath: 'reference/extended-diagnostics/NG8102', - }, - { - label: 'NG8103: Missing control flow directive', - path: 'extended-diagnostics/NG8103', - contentPath: 'reference/extended-diagnostics/NG8103', - }, - { - label: 'NG8104: Text attribute not binding', - path: 'extended-diagnostics/NG8104', - contentPath: 'reference/extended-diagnostics/NG8104', - }, - { - label: 'NG8105: Missing `let` keyword in an *ngFor expression', - path: 'extended-diagnostics/NG8105', - contentPath: 'reference/extended-diagnostics/NG8105', - }, - { - label: 'NG8106: Suffix not supported', - path: 'extended-diagnostics/NG8106', - contentPath: 'reference/extended-diagnostics/NG8106', - }, - { - label: 'NG8107: Optional chain not nullable', - path: 'extended-diagnostics/NG8107', - contentPath: 'reference/extended-diagnostics/NG8107', - }, - { - label: 'NG8108: ngSkipHydration should be a static attribute', - path: 'extended-diagnostics/NG8108', - contentPath: 'reference/extended-diagnostics/NG8108', - }, - { - label: 'NG8109: Signals must be invoked in template interpolations', - path: 'extended-diagnostics/NG8109', - contentPath: 'reference/extended-diagnostics/NG8109', - }, - { - label: 'NG8111: Functions must be invoked in event bindings', - path: 'extended-diagnostics/NG8111', - contentPath: 'reference/extended-diagnostics/NG8111', - }, - { - label: 'NG8113: Unused Standalone Imports', - path: 'extended-diagnostics/NG8113', - contentPath: 'reference/extended-diagnostics/NG8113', - }, + ...EXT_DIAGNOSTICS_NAV_DATA, ], }, { diff --git a/adev/src/assets/BUILD.bazel b/adev/src/assets/BUILD.bazel index 99599093c287..9b64479b2659 100644 --- a/adev/src/assets/BUILD.bazel +++ b/adev/src/assets/BUILD.bazel @@ -32,7 +32,9 @@ copy_to_directory( "//adev/src/content/reference/concepts", "//adev/src/content/reference/configs", "//adev/src/content/reference/errors", + "//adev/src/content/reference/errors:route-nav-items", "//adev/src/content/reference/extended-diagnostics", + "//adev/src/content/reference/extended-diagnostics:route-nav-items", "//adev/src/content/reference/migrations", "//adev/src/content/tools", "//adev/src/content/tools/cli", diff --git a/adev/src/content/reference/errors/BUILD.bazel b/adev/src/content/reference/errors/BUILD.bazel index c347eea407fc..fdfbb6a529be 100644 --- a/adev/src/content/reference/errors/BUILD.bazel +++ b/adev/src/content/reference/errors/BUILD.bazel @@ -1,13 +1,34 @@ -load("//adev/shared-docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides", "generate_nav_items") + +package(default_visibility = ["//adev:__subpackages__"]) + +filegroup( + name = "files", + srcs = glob( + [ + "*.md", + ], + exclude = [ + "overview.md", + ], + ), + visibility = ["//visibility:private"], +) generate_guides( name = "errors", - srcs = glob([ - "*.md", - ]), + srcs = [ + "overview.md", + ":files", + ], data = [ "//adev/src/content/examples/errors:cyclic-imports/child.component.ts", "//adev/src/content/examples/errors:cyclic-imports/parent.component.ts", ], - visibility = ["//adev:__subpackages__"], +) + +generate_nav_items( + name = "route-nav-items", + srcs = [":files"], + strategy = "errors", ) diff --git a/adev/src/content/reference/extended-diagnostics/BUILD.bazel b/adev/src/content/reference/extended-diagnostics/BUILD.bazel index b5f6f83e522e..2ad047e0be5f 100644 --- a/adev/src/content/reference/extended-diagnostics/BUILD.bazel +++ b/adev/src/content/reference/extended-diagnostics/BUILD.bazel @@ -1,9 +1,30 @@ -load("//adev/shared-docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides", "generate_nav_items") + +package(default_visibility = ["//adev:__subpackages__"]) + +filegroup( + name = "files", + srcs = glob( + [ + "*.md", + ], + exclude = [ + "overview.md", + ], + ), + visibility = ["//visibility:private"], +) generate_guides( name = "extended-diagnostics", - srcs = glob([ - "*.md", - ]), - visibility = ["//adev:__subpackages__"], + srcs = [ + "overview.md", + ":files", + ], +) + +generate_nav_items( + name = "route-nav-items", + srcs = [":files"], + strategy = "extended-diagnostics", ) From d19b7bbe4ea64a384d5826f646e8c5183afb654d Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Tue, 14 Jan 2025 07:11:19 +0000 Subject: [PATCH 0075/1220] build: update io_bazel_rules_sass digest to adeaf81 (#59508) See associated pull request for more information. PR Close #59508 --- WORKSPACE | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a5e48b4f1e27..a41f3729a613 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -143,10 +143,10 @@ cldr_xml_data_repository( # sass rules http_archive( name = "io_bazel_rules_sass", - sha256 = "0eae9a0c840e1e0d0b9ace056f8bde06384315315c4e2ebdb5cec722d1d4134b", - strip_prefix = "rules_sass-aff53ca13ff2af82d323adb02a83c45a301e9ae8", + sha256 = "1d840af29fe9b6dd1d3cebb31ca143450ab8d4036bff76f958c7873a770a46ba", + strip_prefix = "rules_sass-adeaf81181b25f15a2d1d1081630506cd6bd0045", urls = [ - "https://github.com/bazelbuild/rules_sass/archive/aff53ca13ff2af82d323adb02a83c45a301e9ae8.zip", + "https://github.com/bazelbuild/rules_sass/archive/adeaf81181b25f15a2d1d1081630506cd6bd0045.zip", ], ) From 9ae0d3e18906abda764b9e6d3853ff34ac0186e7 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Tue, 14 Jan 2025 06:21:04 +0000 Subject: [PATCH 0076/1220] build: update dependency typescript to v5.7.3 (#59512) See associated pull request for more information. PR Close #59512 --- adev/src/content/tutorials/deferrable-views/common/package.json | 2 +- adev/src/content/tutorials/first-app/common/package.json | 2 +- adev/src/content/tutorials/homepage/package.json | 2 +- adev/src/content/tutorials/learn-angular/common/package.json | 2 +- adev/src/content/tutorials/playground/common/package.json | 2 +- package.json | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/adev/src/content/tutorials/deferrable-views/common/package.json b/adev/src/content/tutorials/deferrable-views/common/package.json index 75c8c8e253e2..e44f62195c54 100644 --- a/adev/src/content/tutorials/deferrable-views/common/package.json +++ b/adev/src/content/tutorials/deferrable-views/common/package.json @@ -23,6 +23,6 @@ "@angular/build": "^19.0.0", "@angular/cli": "^19.0.0", "@angular/compiler-cli": "^19.0.0", - "typescript": "~5.6.3" + "typescript": "~5.7.0" } } diff --git a/adev/src/content/tutorials/first-app/common/package.json b/adev/src/content/tutorials/first-app/common/package.json index 0dfa7e512dd6..9b27e88186bd 100644 --- a/adev/src/content/tutorials/first-app/common/package.json +++ b/adev/src/content/tutorials/first-app/common/package.json @@ -37,6 +37,6 @@ "karma-jasmine-html-reporter": "~2.1.0", "protractor": "~7.0.0", "ts-node": "~10.9.0", - "typescript": "~5.6.3" + "typescript": "~5.7.0" } } diff --git a/adev/src/content/tutorials/homepage/package.json b/adev/src/content/tutorials/homepage/package.json index e8bdff5bb32b..c232d328d8fc 100644 --- a/adev/src/content/tutorials/homepage/package.json +++ b/adev/src/content/tutorials/homepage/package.json @@ -22,6 +22,6 @@ "@angular/build": "^19.0.0", "@angular/cli": "^19.0.0", "@angular/compiler-cli": "^19.0.0", - "typescript": "~5.6.3" + "typescript": "~5.7.0" } } diff --git a/adev/src/content/tutorials/learn-angular/common/package.json b/adev/src/content/tutorials/learn-angular/common/package.json index 75c8c8e253e2..e44f62195c54 100644 --- a/adev/src/content/tutorials/learn-angular/common/package.json +++ b/adev/src/content/tutorials/learn-angular/common/package.json @@ -23,6 +23,6 @@ "@angular/build": "^19.0.0", "@angular/cli": "^19.0.0", "@angular/compiler-cli": "^19.0.0", - "typescript": "~5.6.3" + "typescript": "~5.7.0" } } diff --git a/adev/src/content/tutorials/playground/common/package.json b/adev/src/content/tutorials/playground/common/package.json index 9db8ea0d201b..c4b60bf1edd9 100644 --- a/adev/src/content/tutorials/playground/common/package.json +++ b/adev/src/content/tutorials/playground/common/package.json @@ -25,6 +25,6 @@ "@angular/build": "^19.0.0", "@angular/cli": "^19.0.0", "@angular/compiler-cli": "^19.0.0", - "typescript": "~5.6.3" + "typescript": "~5.7.0" } } diff --git a/package.json b/package.json index 62bbcf7b07a9..5a2a7866e13a 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.2", + "typescript": "5.7.3", "webtreemap": "^2.0.1", "ws": "^8.15.0", "xhr2": "0.2.1", From ed05cb569555f6456590ede428ca6ce923bc1bb9 Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Fri, 13 Dec 2024 13:26:15 -0800 Subject: [PATCH 0077/1220] refactor(core): do not serialize parent block id for top level blocks (#59190) This commit updates incremental hydration-related annotation logic to avoid serializing parent block id when it's `null` (for top-level blocks). PR Close #59190 --- packages/core/src/hydration/annotate.ts | 6 ++- packages/core/src/hydration/interfaces.ts | 2 +- packages/core/src/hydration/utils.ts | 2 +- .../test/incremental_hydration_spec.ts | 39 ++++++++++++++++--- 4 files changed, 41 insertions(+), 8 deletions(-) diff --git a/packages/core/src/hydration/annotate.ts b/packages/core/src/hydration/annotate.ts index bcb042d1ad74..a55f15c9eadc 100644 --- a/packages/core/src/hydration/annotate.ts +++ b/packages/core/src/hydration/annotate.ts @@ -405,7 +405,6 @@ function serializeLContainer( // Add defer block into info context.deferBlocks const deferBlockInfo: SerializedDeferBlock = { - [DEFER_PARENT_BLOCK_ID]: parentDeferBlockId, [NUM_ROOT_NODES]: rootNodes.length, [DEFER_BLOCK_STATE]: lDetails[CURRENT_DEFER_BLOCK_STATE], }; @@ -415,6 +414,11 @@ function serializeLContainer( deferBlockInfo[DEFER_HYDRATE_TRIGGERS] = serializedTriggers; } + if (parentDeferBlockId !== null) { + // Serialize parent id only when it's present. + deferBlockInfo[DEFER_PARENT_BLOCK_ID] = parentDeferBlockId; + } + context.deferBlocks.set(deferBlockId, deferBlockInfo); const node = unwrapRNode(lContainer); diff --git a/packages/core/src/hydration/interfaces.ts b/packages/core/src/hydration/interfaces.ts index 42a051e8e4d3..f1ef831ec31c 100644 --- a/packages/core/src/hydration/interfaces.ts +++ b/packages/core/src/hydration/interfaces.ts @@ -162,7 +162,7 @@ export interface SerializedDeferBlock { /** * This contains the unique id of this defer block's parent, if it exists. */ - [DEFER_PARENT_BLOCK_ID]: string | null; + [DEFER_PARENT_BLOCK_ID]?: string; /** * This field represents a status, based on the `DeferBlockState` enum. diff --git a/packages/core/src/hydration/utils.ts b/packages/core/src/hydration/utils.ts index eb9b549d3598..49ee3b126e46 100644 --- a/packages/core/src/hydration/utils.ts +++ b/packages/core/src/hydration/utils.ts @@ -571,7 +571,7 @@ export function getParentBlockHydrationQueue( const deferBlockParents = transferState.get(NGH_DEFER_BLOCKS_KEY, {}); let isTopMostDeferBlock = false; - let currentBlockId: string | null = deferBlockId; + let currentBlockId: string | undefined = deferBlockId; let parentBlockPromise: Promise | null = null; const hydrationQueue: string[] = []; diff --git a/packages/platform-server/test/incremental_hydration_spec.ts b/packages/platform-server/test/incremental_hydration_spec.ts index d6bdcd1a78fe..7c55819c70f0 100644 --- a/packages/platform-server/test/incremental_hydration_spec.ts +++ b/packages/platform-server/test/incremental_hydration_spec.ts @@ -222,7 +222,7 @@ describe('platform-server partial hydration integration', () => { const ssrContents = getAppContents(html); expect(ssrContents).toContain( - '"__nghDeferData__":{"d0":{"p":null,"r":1,"s":2},"d1":{"p":"d0","r":2,"s":2}}', + '"__nghDeferData__":{"d0":{"r":1,"s":2},"d1":{"r":2,"s":2,"p":"d0"}}', ); }); @@ -285,9 +285,38 @@ describe('platform-server partial hydration integration', () => { const ssrContents = getAppContents(html); expect(ssrContents).toContain( - '"__nghDeferData__":{"d0":{"p":null,"r":1,"s":2},"d1":{"p":"d0","r":2,"s":2,"t":[2]}}', + '"__nghDeferData__":{"d0":{"r":1,"s":2},"d1":{"r":2,"s":2,"t":[2],"p":"d0"}}', ); }); + + it('should not include parent id in serialized data for top-level `@defer` blocks', async () => { + @Component({ + selector: 'app', + template: ` + @defer (on viewport; hydrate on interaction) { + Hello world! + } @placeholder { + Placeholder + } + `, + }) + class SimpleComponent {} + + 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); + + // Assert that the serialized data doesn't contain the "p" field, + // which contains parent id (which is not needed for top-level blocks). + expect(ssrContents).toContain('"__nghDeferData__":{"d0":{"r":1,"s":2}}}'); + }); }); describe('basic hydration behavior', () => { @@ -347,7 +376,7 @@ describe('platform-server partial hydration integration', () => { expect(ssrContents).toContain('

{ expect(ssrContents).toContain('

{ //

is inside a nested defer block -> different namespace. // expect(ssrContents).toContain('

Date: Tue, 24 Dec 2024 04:57:37 +0100 Subject: [PATCH 0078/1220] refactor(compiler): remove unused AstVisitors (#59297) Those 2 clases weren't imported anywhere. PR Close #59297 --- .../compiler/src/expression_parser/ast.ts | 363 ------------------ 1 file changed, 363 deletions(-) diff --git a/packages/compiler/src/expression_parser/ast.ts b/packages/compiler/src/expression_parser/ast.ts index cab6103e2cde..97b55f5553a2 100644 --- a/packages/compiler/src/expression_parser/ast.ts +++ b/packages/compiler/src/expression_parser/ast.ts @@ -651,369 +651,6 @@ export class RecursiveAstVisitor implements AstVisitor { } } -export class AstTransformer implements AstVisitor { - visitImplicitReceiver(ast: ImplicitReceiver, context: any): AST { - return ast; - } - - visitThisReceiver(ast: ThisReceiver, context: any): AST { - return ast; - } - - visitInterpolation(ast: Interpolation, context: any): AST { - return new Interpolation(ast.span, ast.sourceSpan, ast.strings, this.visitAll(ast.expressions)); - } - - visitLiteralPrimitive(ast: LiteralPrimitive, context: any): AST { - return new LiteralPrimitive(ast.span, ast.sourceSpan, ast.value); - } - - visitPropertyRead(ast: PropertyRead, context: any): AST { - return new PropertyRead( - ast.span, - ast.sourceSpan, - ast.nameSpan, - ast.receiver.visit(this), - ast.name, - ); - } - - visitPropertyWrite(ast: PropertyWrite, context: any): AST { - return new PropertyWrite( - ast.span, - ast.sourceSpan, - ast.nameSpan, - ast.receiver.visit(this), - ast.name, - ast.value.visit(this), - ); - } - - visitSafePropertyRead(ast: SafePropertyRead, context: any): AST { - return new SafePropertyRead( - ast.span, - ast.sourceSpan, - ast.nameSpan, - ast.receiver.visit(this), - ast.name, - ); - } - - visitLiteralArray(ast: LiteralArray, context: any): AST { - return new LiteralArray(ast.span, ast.sourceSpan, this.visitAll(ast.expressions)); - } - - visitLiteralMap(ast: LiteralMap, context: any): AST { - return new LiteralMap(ast.span, ast.sourceSpan, ast.keys, this.visitAll(ast.values)); - } - - visitUnary(ast: Unary, context: any): AST { - switch (ast.operator) { - case '+': - return Unary.createPlus(ast.span, ast.sourceSpan, ast.expr.visit(this)); - case '-': - return Unary.createMinus(ast.span, ast.sourceSpan, ast.expr.visit(this)); - default: - throw new Error(`Unknown unary operator ${ast.operator}`); - } - } - - visitBinary(ast: Binary, context: any): AST { - return new Binary( - ast.span, - ast.sourceSpan, - ast.operation, - ast.left.visit(this), - ast.right.visit(this), - ); - } - - visitPrefixNot(ast: PrefixNot, context: any): AST { - return new PrefixNot(ast.span, ast.sourceSpan, ast.expression.visit(this)); - } - - visitTypeofExpression(ast: TypeofExpression, context: any): AST { - return new TypeofExpression(ast.span, ast.sourceSpan, ast.expression.visit(this)); - } - - visitNonNullAssert(ast: NonNullAssert, context: any): AST { - return new NonNullAssert(ast.span, ast.sourceSpan, ast.expression.visit(this)); - } - - visitConditional(ast: Conditional, context: any): AST { - return new Conditional( - ast.span, - ast.sourceSpan, - ast.condition.visit(this), - ast.trueExp.visit(this), - ast.falseExp.visit(this), - ); - } - - visitPipe(ast: BindingPipe, context: any): AST { - return new BindingPipe( - ast.span, - ast.sourceSpan, - ast.exp.visit(this), - ast.name, - this.visitAll(ast.args), - ast.nameSpan, - ); - } - - visitKeyedRead(ast: KeyedRead, context: any): AST { - return new KeyedRead(ast.span, ast.sourceSpan, ast.receiver.visit(this), ast.key.visit(this)); - } - - visitKeyedWrite(ast: KeyedWrite, context: any): AST { - return new KeyedWrite( - ast.span, - ast.sourceSpan, - ast.receiver.visit(this), - ast.key.visit(this), - ast.value.visit(this), - ); - } - - visitCall(ast: Call, context: any): AST { - return new Call( - ast.span, - ast.sourceSpan, - ast.receiver.visit(this), - this.visitAll(ast.args), - ast.argumentSpan, - ); - } - - visitSafeCall(ast: SafeCall, context: any): AST { - return new SafeCall( - ast.span, - ast.sourceSpan, - ast.receiver.visit(this), - this.visitAll(ast.args), - ast.argumentSpan, - ); - } - - visitAll(asts: any[]): any[] { - const res = []; - for (let i = 0; i < asts.length; ++i) { - res[i] = asts[i].visit(this); - } - return res; - } - - visitChain(ast: Chain, context: any): AST { - return new Chain(ast.span, ast.sourceSpan, this.visitAll(ast.expressions)); - } - - visitSafeKeyedRead(ast: SafeKeyedRead, context: any): AST { - return new SafeKeyedRead( - ast.span, - ast.sourceSpan, - ast.receiver.visit(this), - ast.key.visit(this), - ); - } -} - -// A transformer that only creates new nodes if the transformer makes a change or -// a change is made a child node. -export class AstMemoryEfficientTransformer implements AstVisitor { - visitImplicitReceiver(ast: ImplicitReceiver, context: any): AST { - return ast; - } - - visitThisReceiver(ast: ThisReceiver, context: any): AST { - return ast; - } - - visitInterpolation(ast: Interpolation, context: any): Interpolation { - const expressions = this.visitAll(ast.expressions); - if (expressions !== ast.expressions) - return new Interpolation(ast.span, ast.sourceSpan, ast.strings, expressions); - return ast; - } - - visitLiteralPrimitive(ast: LiteralPrimitive, context: any): AST { - return ast; - } - - visitPropertyRead(ast: PropertyRead, context: any): AST { - const receiver = ast.receiver.visit(this); - if (receiver !== ast.receiver) { - return new PropertyRead(ast.span, ast.sourceSpan, ast.nameSpan, receiver, ast.name); - } - return ast; - } - - visitPropertyWrite(ast: PropertyWrite, context: any): AST { - const receiver = ast.receiver.visit(this); - const value = ast.value.visit(this); - if (receiver !== ast.receiver || value !== ast.value) { - return new PropertyWrite(ast.span, ast.sourceSpan, ast.nameSpan, receiver, ast.name, value); - } - return ast; - } - - visitSafePropertyRead(ast: SafePropertyRead, context: any): AST { - const receiver = ast.receiver.visit(this); - if (receiver !== ast.receiver) { - return new SafePropertyRead(ast.span, ast.sourceSpan, ast.nameSpan, receiver, ast.name); - } - return ast; - } - - visitLiteralArray(ast: LiteralArray, context: any): AST { - const expressions = this.visitAll(ast.expressions); - if (expressions !== ast.expressions) { - return new LiteralArray(ast.span, ast.sourceSpan, expressions); - } - return ast; - } - - visitLiteralMap(ast: LiteralMap, context: any): AST { - const values = this.visitAll(ast.values); - if (values !== ast.values) { - return new LiteralMap(ast.span, ast.sourceSpan, ast.keys, values); - } - return ast; - } - - visitUnary(ast: Unary, context: any): AST { - const expr = ast.expr.visit(this); - if (expr !== ast.expr) { - switch (ast.operator) { - case '+': - return Unary.createPlus(ast.span, ast.sourceSpan, expr); - case '-': - return Unary.createMinus(ast.span, ast.sourceSpan, expr); - default: - throw new Error(`Unknown unary operator ${ast.operator}`); - } - } - return ast; - } - - visitBinary(ast: Binary, context: any): AST { - const left = ast.left.visit(this); - const right = ast.right.visit(this); - if (left !== ast.left || right !== ast.right) { - return new Binary(ast.span, ast.sourceSpan, ast.operation, left, right); - } - return ast; - } - - visitPrefixNot(ast: PrefixNot, context: any): AST { - const expression = ast.expression.visit(this); - if (expression !== ast.expression) { - return new PrefixNot(ast.span, ast.sourceSpan, expression); - } - return ast; - } - - visitTypeofExpression(ast: TypeofExpression, context: any): AST { - const expression = ast.expression.visit(this); - if (expression !== ast.expression) { - return new TypeofExpression(ast.span, ast.sourceSpan, expression); - } - return ast; - } - - visitNonNullAssert(ast: NonNullAssert, context: any): AST { - const expression = ast.expression.visit(this); - if (expression !== ast.expression) { - return new NonNullAssert(ast.span, ast.sourceSpan, expression); - } - return ast; - } - - visitConditional(ast: Conditional, context: any): AST { - const condition = ast.condition.visit(this); - const trueExp = ast.trueExp.visit(this); - const falseExp = ast.falseExp.visit(this); - if (condition !== ast.condition || trueExp !== ast.trueExp || falseExp !== ast.falseExp) { - return new Conditional(ast.span, ast.sourceSpan, condition, trueExp, falseExp); - } - return ast; - } - - visitPipe(ast: BindingPipe, context: any): AST { - const exp = ast.exp.visit(this); - const args = this.visitAll(ast.args); - if (exp !== ast.exp || args !== ast.args) { - return new BindingPipe(ast.span, ast.sourceSpan, exp, ast.name, args, ast.nameSpan); - } - return ast; - } - - visitKeyedRead(ast: KeyedRead, context: any): AST { - const obj = ast.receiver.visit(this); - const key = ast.key.visit(this); - if (obj !== ast.receiver || key !== ast.key) { - return new KeyedRead(ast.span, ast.sourceSpan, obj, key); - } - return ast; - } - - visitKeyedWrite(ast: KeyedWrite, context: any): AST { - const obj = ast.receiver.visit(this); - const key = ast.key.visit(this); - const value = ast.value.visit(this); - if (obj !== ast.receiver || key !== ast.key || value !== ast.value) { - return new KeyedWrite(ast.span, ast.sourceSpan, obj, key, value); - } - return ast; - } - - visitAll(asts: any[]): any[] { - const res = []; - let modified = false; - for (let i = 0; i < asts.length; ++i) { - const original = asts[i]; - const value = original.visit(this); - res[i] = value; - modified = modified || value !== original; - } - return modified ? res : asts; - } - - visitChain(ast: Chain, context: any): AST { - const expressions = this.visitAll(ast.expressions); - if (expressions !== ast.expressions) { - return new Chain(ast.span, ast.sourceSpan, expressions); - } - return ast; - } - - visitCall(ast: Call, context: any): AST { - const receiver = ast.receiver.visit(this); - const args = this.visitAll(ast.args); - if (receiver !== ast.receiver || args !== ast.args) { - return new Call(ast.span, ast.sourceSpan, receiver, args, ast.argumentSpan); - } - return ast; - } - - visitSafeCall(ast: SafeCall, context: any): AST { - const receiver = ast.receiver.visit(this); - const args = this.visitAll(ast.args); - if (receiver !== ast.receiver || args !== ast.args) { - return new SafeCall(ast.span, ast.sourceSpan, receiver, args, ast.argumentSpan); - } - return ast; - } - - visitSafeKeyedRead(ast: SafeKeyedRead, context: any): AST { - const obj = ast.receiver.visit(this); - const key = ast.key.visit(this); - if (obj !== ast.receiver || key !== ast.key) { - return new SafeKeyedRead(ast.span, ast.sourceSpan, obj, key); - } - return ast; - } -} - // Bindings export class ParsedProperty { From 6cd6780d38ab339cad7366ff4af549e13f8742ad Mon Sep 17 00:00:00 2001 From: hawkgs Date: Mon, 9 Dec 2024 16:15:47 +0200 Subject: [PATCH 0079/1220] docs(docs-infra): fix SCSS build-time warnings (#59115) Fix SCSS "declarations after nested rules" and `@import` warnings. PR Close #59115 --- .../navigation-list.component.scss | 6 +- adev/shared-docs/styles/docs/_card.scss | 9 +- adev/src/local-styles.scss | 4 +- adev/src/styles/_xterm.scss | 194 +++++++++--------- 4 files changed, 110 insertions(+), 103 deletions(-) diff --git a/adev/shared-docs/components/navigation-list/navigation-list.component.scss b/adev/shared-docs/components/navigation-list/navigation-list.component.scss index 3a4c3097a304..9fb22c1290bb 100644 --- a/adev/shared-docs/components/navigation-list/navigation-list.component.scss +++ b/adev/shared-docs/components/navigation-list/navigation-list.component.scss @@ -24,13 +24,13 @@ } &::-webkit-scrollbar-thumb { + border-radius: 10px; + transition: background-color 0.3s ease; background-color: var(--septenary-contrast); + @include mq.for-tablet-landscape-down { background-color: var(--quinary-contrast); } - - border-radius: 10px; - transition: background-color 0.3s ease; } &::-webkit-scrollbar-thumb:hover { diff --git a/adev/shared-docs/styles/docs/_card.scss b/adev/shared-docs/styles/docs/_card.scss index deae64fe56d8..0286ec99afee 100644 --- a/adev/shared-docs/styles/docs/_card.scss +++ b/adev/shared-docs/styles/docs/_card.scss @@ -21,7 +21,9 @@ border: 1px solid var(--senary-contrast); border-radius: 0.25rem; overflow: hidden; - transition: border-color 0.3s ease, background-color 0.3s ease; + transition: + border-color 0.3s ease, + background-color 0.3s ease; p:first-of-type { margin-block-start: 1.5rem; @@ -54,6 +56,7 @@ flex-direction: column; justify-content: space-between; border-block-start: 1px solid var(--senary-contrast); + h3 { margin-bottom: 0; margin-block-start: 1rem; @@ -79,7 +82,6 @@ color: transparent; font-size: 0.875rem; margin-block: 0; - transition: background-position 1.8s ease-out; background-size: 200% 100%; background-position: 100% 0%; @@ -87,10 +89,11 @@ } &:hover { + background: var(--subtle-purple); + span { background-position: 0% 0%; } - background: var(--subtle-purple); } } diff --git a/adev/src/local-styles.scss b/adev/src/local-styles.scss index 4dcf2e82aa8b..2c83a2ad4a2e 100644 --- a/adev/src/local-styles.scss +++ b/adev/src/local-styles.scss @@ -1 +1,3 @@ -@import './styles/xterm'; \ No newline at end of file +@use './styles/xterm'; + +@include xterm.xterm(); diff --git a/adev/src/styles/_xterm.scss b/adev/src/styles/_xterm.scss index f016c44057c1..8b941f703f1c 100644 --- a/adev/src/styles/_xterm.scss +++ b/adev/src/styles/_xterm.scss @@ -1,121 +1,123 @@ -.xterm-viewport, -.xterm-screen { - &::-webkit-scrollbar-track { - background: rgba(0, 0, 0, 0); - cursor: pointer; - margin: 2px; +@mixin xterm() { + .xterm-viewport, + .xterm-screen { + &::-webkit-scrollbar-track { + background: rgba(0, 0, 0, 0); + cursor: pointer; + margin: 2px; + } + + &::-webkit-scrollbar { + width: 6px; + height: 6px; + } + + &::-webkit-scrollbar-thumb { + background-color: var(--senary-contrast); + border-radius: 10px; + transition: background-color 0.3s ease; + } + + &::-webkit-scrollbar-thumb:hover { + background-color: var(--quaternary-contrast); + } } - &::-webkit-scrollbar { - width: 6px; - height: 6px; + // Override terminal styles + .xterm { + height: 100%; + width: 100%; + padding: 10px; } - &::-webkit-scrollbar-thumb { - background-color: var(--senary-contrast); - border-radius: 10px; + .xterm-viewport { + overflow-y: auto !important; + height: 100% !important; + width: 100% !important; + background-color: var(--octonary-contrast) !important; transition: background-color 0.3s ease; } - &::-webkit-scrollbar-thumb:hover { - background-color: var(--quaternary-contrast); + .xterm-screen { + box-sizing: border-box; + overflow: visible !important; + height: 100% !important; + width: 100% !important; } -} - -// Override terminal styles -.xterm { - height: 100%; - width: 100%; - padding: 10px; -} -.xterm-viewport { - overflow-y: auto !important; - height: 100% !important; - width: 100% !important; - background-color: var(--octonary-contrast) !important; - transition: background-color 0.3s ease; -} - -.xterm-screen { - box-sizing: border-box; - overflow: visible !important; - height: 100% !important; - width: 100% !important; -} - -.xterm-rows { - height: 100% !important; - overflow: visible !important; - color: var(--primary-contrast) !important; - transition: color 0.3s ease; - // It is important to not alter the font-size or the selection would lose in precision - - .xterm-cursor { - &.xterm-cursor-outline { - outline-color: var(--primary-contrast) !important; - } - &.xterm-cursor-block { - background: var(--primary-contrast) !important; + .xterm-rows { + height: 100% !important; + overflow: visible !important; + color: var(--primary-contrast) !important; + transition: color 0.3s ease; + // It is important to not alter the font-size or the selection would lose in precision + + .xterm-cursor { + &.xterm-cursor-outline { + outline-color: var(--primary-contrast) !important; + } + &.xterm-cursor-block { + background: var(--primary-contrast) !important; + } } } -} -.xterm-selection { - top: 10px !important; - left: 10px !important; - div { - background-color: transparent !important; + .xterm-selection { + top: 10px !important; + left: 10px !important; + div { + background-color: transparent !important; + } } -} -.xterm-decoration-top { - background-color: var(--quinary-contrast) !important; -} + .xterm-decoration-top { + background-color: var(--quinary-contrast) !important; + } -.xterm-fg-11 { - color: var(--electric-violet) !important; -} + .xterm-fg-11 { + color: var(--electric-violet) !important; + } -.xterm-fg-4 { - color: var(--bright-blue) !important; -} + .xterm-fg-4 { + color: var(--bright-blue) !important; + } -// progress ### -.xterm-fg-15 { - color: var(--secondary-contrast) !important; -} + // progress ### + .xterm-fg-15 { + color: var(--secondary-contrast) !important; + } -.xterm-fg-14 { - color: var(--vivid-pink) !important; -} + .xterm-fg-14 { + color: var(--vivid-pink) !important; + } -// > in terminal -.xterm-fg-5 { - color: var(--electric-violet) !important; -} + // > in terminal + .xterm-fg-5 { + color: var(--electric-violet) !important; + } -// error text, warning text -.xterm-fg-9, -.xterm-fg-3 { - color: var(--vivid-pink) !important; -} + // error text, warning text + .xterm-fg-9, + .xterm-fg-3 { + color: var(--vivid-pink) !important; + } -.xterm-fg-10, -.xterm-fg-2 { - color: var(--symbolic-green) !important; -} + .xterm-fg-10, + .xterm-fg-2 { + color: var(--symbolic-green) !important; + } -// error bg -.xterm-bg-1 { - background-color: var(--orange-red) !important; -} + // error bg + .xterm-bg-1 { + background-color: var(--orange-red) !important; + } -// error text -.xterm-fg-257 { - color: var(--octonary-contrast) !important; -} + // error text + .xterm-fg-257 { + color: var(--octonary-contrast) !important; + } -.xterm-fg-8 { - color: var(--tertiary-contrast) !important; + .xterm-fg-8 { + color: var(--tertiary-contrast) !important; + } } From 803358f0a3f6619a8fcc04e4de392bcbf70f9da4 Mon Sep 17 00:00:00 2001 From: hawkgs Date: Thu, 14 Nov 2024 13:22:51 +0200 Subject: [PATCH 0080/1220] docs(docs-infra): change API reference list items order to top-down (#58655) Change the order from left-right to top-down (columns) and additionally make columns equal width. PR Close #58655 --- adev/shared-docs/styles/_api-item-label.scss | 1 + .../api-items-section.component.html | 2 +- .../api-items-section.component.scss | 18 ++++++++++++------ .../api-reference-list.component.scss | 8 ++++++-- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/adev/shared-docs/styles/_api-item-label.scss b/adev/shared-docs/styles/_api-item-label.scss index 9373a8c4025f..23ce9df532e2 100644 --- a/adev/shared-docs/styles/_api-item-label.scss +++ b/adev/shared-docs/styles/_api-item-label.scss @@ -17,6 +17,7 @@ &:not(.full) { height: 22px; width: 22px; + flex: 0 0 22px; } &.full { 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 3b0ec811cfbb..45c2a24f5b8a 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 @@ -26,7 +26,7 @@

class="docs-api-item-label" aria-hidden="true" /> - {{ apiItem.title }} + {{ 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 dec2b9080fc1..6790c0c65f4c 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 @@ -28,33 +28,39 @@ } .adev-api-items-section-grid { - display: grid; - grid-template-columns: 1fr 1fr 1fr; + column-count: 3; + column-gap: 0.5rem; padding: 0; @container api-ref-page (max-width: 798px) { - grid-template-columns: 1fr 1fr; + column-count: 2; } @container api-ref-page (max-width: 600px) { - grid-template-columns: 1fr; + column-count: 1; } li { - display: flex; + display: inline-flex; align-items: center; border-inline-start: 1px solid var(--senary-contrast); padding: 0.3rem; padding-inline-start: 0.75rem; font-size: 0.875rem; + text-overflow: ellipsis; + box-sizing: border-box; + width: 100%; a { color: var(--quaternary-contrast); display: flex; align-items: center; + overflow: hidden; + padding-block: 2px; } .adev-item-title { - margin-block-start: 3px; + overflow: hidden; + text-overflow: ellipsis; } &:hover { diff --git a/adev/src/app/features/references/api-reference-list/api-reference-list.component.scss b/adev/src/app/features/references/api-reference-list/api-reference-list.component.scss index f66c591508d9..374b16b89726 100644 --- a/adev/src/app/features/references/api-reference-list/api-reference-list.component.scss +++ b/adev/src/app/features/references/api-reference-list/api-reference-list.component.scss @@ -79,6 +79,10 @@ border: 1px solid var(--quinary-contrast); color: var(--primary-contrast); } + + .docs-api-item-label-full { + white-space: nowrap; + } } } @@ -100,7 +104,7 @@ } } - .docs-api-item-label-full { - white-space: nowrap; + adev-api-items-section { + width: 100%; } } From 2ca258705f65c0c92c7f4017ce058807e300c5e3 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Tue, 14 Jan 2025 09:54:15 +0100 Subject: [PATCH 0081/1220] fix(core): destroy renderer when replacing styles during HMR (#59514) Currently when we swap out the component during HMR, we remove the renderer from the cache, but we never destroy it which means that its styles are still in the DOM. This can cause the old styles to leak into the component after they're replaced. These changes add a `destroy` call to ensure that they're removed. PR Close #59514 --- packages/core/src/render3/hmr.ts | 36 +++++++++++-------- .../platform-browser/src/dom/dom_renderer.ts | 3 ++ 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/packages/core/src/render3/hmr.ts b/packages/core/src/render3/hmr.ts index 274933a6b37c..0d567ed1d2ea 100644 --- a/packages/core/src/render3/hmr.ts +++ b/packages/core/src/render3/hmr.ts @@ -7,7 +7,7 @@ */ import {Type} from '../interface/type'; -import {assertDefined} from '../util/assert'; +import {assertDefined, assertNotEqual} from '../util/assert'; import {assertLView} from './assert'; import {getComponentDef} from './def_getters'; import {assertComponentDef} from './errors'; @@ -82,13 +82,13 @@ export function ɵɵreplaceMetadata( /** * Finds all LViews matching a specific component definition and recreates them. - * @param def Component definition to search for. + * @param oldDef Component definition to search for. * @param rootLView View from which to start the search. */ -function recreateMatchingLViews(def: ComponentDef, rootLView: LView): void { +function recreateMatchingLViews(oldDef: ComponentDef, rootLView: LView): void { ngDevMode && assertDefined( - def.tView, + oldDef.tView, 'Expected a component definition that has been instantiated at least once', ); @@ -96,9 +96,9 @@ function recreateMatchingLViews(def: ComponentDef, rootLView: LView): v // Use `tView` to match the LView since `instanceof` can // produce false positives when using inheritance. - if (tView === def.tView) { - ngDevMode && assertComponentDef(def.type); - recreateLView(getComponentDef(def.type)!, rootLView); + if (tView === oldDef.tView) { + ngDevMode && assertComponentDef(oldDef.type); + recreateLView(getComponentDef(oldDef.type)!, oldDef, rootLView); return; } @@ -107,10 +107,10 @@ function recreateMatchingLViews(def: ComponentDef, rootLView: LView): v if (isLContainer(current)) { for (let i = CONTAINER_HEADER_OFFSET; i < current.length; i++) { - recreateMatchingLViews(def, current[i]); + recreateMatchingLViews(oldDef, current[i]); } } else if (isLView(current)) { - recreateMatchingLViews(def, current); + recreateMatchingLViews(oldDef, current); } } } @@ -131,10 +131,15 @@ function clearRendererCache(factory: RendererFactory, def: ComponentDef /** * Recreates an LView in-place from a new component definition. - * @param def Definition from which to recreate the view. + * @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(def: ComponentDef, lView: LView): void { +function recreateLView( + newDef: ComponentDef, + oldDef: ComponentDef, + lView: LView, +): void { const instance = lView[CONTEXT]; const host = lView[HOST]!; // In theory the parent can also be an LContainer, but it appears like that's @@ -143,25 +148,26 @@ function recreateLView(def: ComponentDef, lView: LView): void ngDevMode && assertLView(parentLView); const tNode = lView[T_HOST] as TElementNode; ngDevMode && assertTNodeType(tNode, TNodeType.Element); + ngDevMode && assertNotEqual(newDef, oldDef, 'Expected different component definition'); // Recreate the TView since the template might've changed. - const newTView = getOrCreateComponentTView(def); + const newTView = getOrCreateComponentTView(newDef); // Always force the creation of a new renderer to ensure state captured during construction // stays consistent with the new component definition by clearing any old cached factories. const rendererFactory = lView[ENVIRONMENT].rendererFactory; - clearRendererCache(rendererFactory, def); + clearRendererCache(rendererFactory, oldDef); // Create a new LView from the new TView, but reusing the existing TNode and DOM node. const newLView = createLView( parentLView, newTView, instance, - getInitialLViewFlagsFromDef(def), + getInitialLViewFlagsFromDef(newDef), host, tNode, null, - rendererFactory.createRenderer(host, def), + rendererFactory.createRenderer(host, newDef), null, null, null, diff --git a/packages/platform-browser/src/dom/dom_renderer.ts b/packages/platform-browser/src/dom/dom_renderer.ts index f0d1da86c95a..0c93eedaef2e 100644 --- a/packages/platform-browser/src/dom/dom_renderer.ts +++ b/packages/platform-browser/src/dom/dom_renderer.ts @@ -201,6 +201,9 @@ export class DomRendererFactory2 implements RendererFactory2, OnDestroy { * @param componentId ID of the component that is being replaced. */ protected componentReplaced(componentId: string) { + // Destroy the renderer so the styles get removed from the DOM, otherwise + // they may leak back into the component together with the new ones. + this.rendererByCompId.get(componentId)?.destroy(); this.rendererByCompId.delete(componentId); } } From 9c835e89fea7267bb03313234016c1043bc7cfad Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Fri, 20 Dec 2024 17:21:27 +0100 Subject: [PATCH 0082/1220] refactor(core): profiler takes null as a default instance (#59233) Several profiler calls don't have any meaningful instance when producing a profiling event. This commit changes the default instance value to null to sreamline profiler invocations. PR Close #59233 --- .../ng-devtools-backend/src/lib/hooks/profiler/native.ts | 2 +- packages/core/src/render3/profiler.ts | 2 +- packages/core/src/render3/profiler_types.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/devtools/projects/ng-devtools-backend/src/lib/hooks/profiler/native.ts b/devtools/projects/ng-devtools-backend/src/lib/hooks/profiler/native.ts index 7f474baea23f..c9e05625fedb 100644 --- a/devtools/projects/ng-devtools-backend/src/lib/hooks/profiler/native.ts +++ b/devtools/projects/ng-devtools-backend/src/lib/hooks/profiler/native.ts @@ -43,7 +43,7 @@ export class NgProfiler extends Profiler { private _initialize(): void { ngDebugClient().ɵsetProfiler( - (event: ɵProfilerEvent, instanceOrLView: {} | null, hookOrListener: any) => + (event: ɵProfilerEvent, instanceOrLView: {} | null = null, hookOrListener: any) => this._callbacks.forEach((cb) => cb(event, instanceOrLView, hookOrListener)), ); } diff --git a/packages/core/src/render3/profiler.ts b/packages/core/src/render3/profiler.ts index 4684e1e42be2..d52d232e00a9 100644 --- a/packages/core/src/render3/profiler.ts +++ b/packages/core/src/render3/profiler.ts @@ -33,7 +33,7 @@ export const setProfiler = (profiler: Profiler | null) => { * execution context * @returns */ -export const profiler: Profiler = function (event, instance, hookOrListener) { +export const profiler: Profiler = function (event, instance = null, hookOrListener) { if (profilerCallback != null /* both `null` and `undefined` */) { profilerCallback(event, instance, hookOrListener); } diff --git a/packages/core/src/render3/profiler_types.ts b/packages/core/src/render3/profiler_types.ts index 5e7d155b55ae..f8a42a2d8447 100644 --- a/packages/core/src/render3/profiler_types.ts +++ b/packages/core/src/render3/profiler_types.ts @@ -160,5 +160,5 @@ export const enum ProfilerEvent { * Profiler function which the runtime will invoke before and after user code. */ export interface Profiler { - (event: ProfilerEvent, instance: {} | null, hookOrListener?: (e?: any) => any): void; + (event: ProfilerEvent, instance?: {} | null, hookOrListener?: (e?: any) => any): void; } From 815f1b1457d34732fe77253b6684e113ad688f59 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Wed, 18 Dec 2024 11:56:31 +0100 Subject: [PATCH 0083/1220] refactor(core): add profiler calls for tne newly introduced events (#59233) The set of profiler events was recently extended. This commit plugs newly created events dispatch into the approriate places of the Angular core. PR Close #59233 --- .../core/src/application/application_ref.ts | 14 +- .../src/application/create_application.ts | 6 +- packages/core/src/defer/rendering.ts | 6 + .../core/src/render3/after_render/manager.ts | 21 ++- packages/core/src/render3/component_ref.ts | 5 + .../render3/instructions/change_detection.ts | 6 + .../core/src/render3/instructions/render.ts | 6 + .../core/src/render3/instructions/shared.ts | 3 + .../core/test/acceptance/profiler_spec.ts | 150 ++++++++++++++++-- 9 files changed, 196 insertions(+), 21 deletions(-) diff --git a/packages/core/src/application/application_ref.ts b/packages/core/src/application/application_ref.ts index 349f5de9657c..50bc3e24ffb3 100644 --- a/packages/core/src/application/application_ref.ts +++ b/packages/core/src/application/application_ref.ts @@ -47,6 +47,8 @@ import {NgZone} from '../zone/ng_zone'; 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 @@ -531,6 +533,8 @@ export class ApplicationRef { componentOrFactory: ComponentFactory | Type, rootSelectorOrNode?: string | any, ): ComponentRef { + profiler(ProfilerEvent.BootstrapComponentStart); + (typeof ngDevMode === 'undefined' || ngDevMode) && warnIfDestroyed(this._destroyed); const isComponentFactory = componentOrFactory instanceof ComponentFactory; const initStatus = this._injector.get(ApplicationInitStatus); @@ -576,6 +580,9 @@ export class ApplicationRef { const _console = this._injector.get(Console); _console.log(`Angular is running in development mode.`); } + + profiler(ProfilerEvent.BootstrapComponentEnd, compRef); + return compRef; } @@ -598,6 +605,8 @@ export class ApplicationRef { /** @internal */ _tick = (): void => { + profiler(ProfilerEvent.ChangeDetectionStart); + if (this.tracingSnapshot !== null) { const snapshot = this.tracingSnapshot; this.tracingSnapshot = null; @@ -622,7 +631,6 @@ export class ApplicationRef { try { this._runningTick = true; this.synchronize(); - if (typeof ngDevMode === 'undefined' || ngDevMode) { for (let view of this.allViews) { view.checkNoChanges(); @@ -635,6 +643,8 @@ export class ApplicationRef { this._runningTick = false; setActiveConsumer(prevConsumer); this.afterTick.next(); + + profiler(ProfilerEvent.ChangeDetectionEnd); } }; @@ -653,7 +663,9 @@ export class ApplicationRef { let runs = 0; while (this.dirtyFlags !== ApplicationRefDirtyFlags.None && runs++ < MAXIMUM_REFRESH_RERUNS) { + profiler(ProfilerEvent.ChangeDetectionSyncStart); this.synchronizeOnce(); + profiler(ProfilerEvent.ChangeDetectionSyncEnd); } if ((typeof ngDevMode === 'undefined' || ngDevMode) && runs >= MAXIMUM_REFRESH_RERUNS) { diff --git a/packages/core/src/application/create_application.ts b/packages/core/src/application/create_application.ts index 83d276b11b16..0656d8bad741 100644 --- a/packages/core/src/application/create_application.ts +++ b/packages/core/src/application/create_application.ts @@ -13,12 +13,13 @@ import {Type} from '../interface/type'; import {createOrReusePlatformInjector} from '../platform/platform'; import {assertStandaloneComponentType} from '../render3/errors'; import {EnvironmentNgModuleRefAdapter} from '../render3/ng_module_ref'; -import {NgZone} from '../zone/ng_zone'; import {_callAndReportToErrorHandler, 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'; +import {profiler} from '../render3/profiler'; +import {ProfilerEvent} from '../render3/profiler_types'; /** * Internal create application API that implements the core application creation logic and optional @@ -37,6 +38,7 @@ export function internalCreateApplication(config: { appProviders?: Array; platformProviders?: Provider[]; }): Promise { + profiler(ProfilerEvent.BootstrapApplicationStart); try { const {rootComponent, appProviders, platformProviders} = config; @@ -69,5 +71,7 @@ export function internalCreateApplication(config: { }); } catch (e) { return Promise.reject(e); + } finally { + profiler(ProfilerEvent.BootstrapApplicationEnd); } } diff --git a/packages/core/src/defer/rendering.ts b/packages/core/src/defer/rendering.ts index 4a3e6cc0a60a..b6a4c3939532 100644 --- a/packages/core/src/defer/rendering.ts +++ b/packages/core/src/defer/rendering.ts @@ -56,6 +56,8 @@ import { getTDeferBlockDetails, getTemplateIndexForState, } from './utils'; +import {profiler} from '../render3/profiler'; +import {ProfilerEvent} from '../render3/profiler_types'; /** * **INTERNAL**, avoid referencing it in application code. @@ -243,6 +245,8 @@ function applyDeferBlockState( tNode: TNode, hostLView: LView, ) { + profiler(ProfilerEvent.DeferBlockStateStart); + const stateTmplIndex = getTemplateIndexForState(newState, hostLView, tNode); if (stateTmplIndex !== null) { @@ -306,6 +310,8 @@ function applyDeferBlockState( lDetails[ON_COMPLETE_FNS] = null; } } + + profiler(ProfilerEvent.DeferBlockStateEnd); } /** diff --git a/packages/core/src/render3/after_render/manager.ts b/packages/core/src/render3/after_render/manager.ts index 8472188da363..5a5986d00870 100644 --- a/packages/core/src/render3/after_render/manager.ts +++ b/packages/core/src/render3/after_render/manager.ts @@ -17,6 +17,8 @@ import { } from '../../change_detection/scheduling/zoneless_scheduling'; import {type DestroyRef} from '../../linker/destroy_ref'; import {TracingAction, TracingService, TracingSnapshot} from '../../application/tracing'; +import {profiler} from '../profiler'; +import {ProfilerEvent} from '../profiler_types'; export class AfterRenderManager { impl: AfterRenderImpl | null = null; @@ -65,6 +67,12 @@ export class AfterRenderImpl { * might be scheduled. */ execute(): void { + const hasSequencesToExecute = this.sequences.size > 0; + + if (hasSequencesToExecute) { + profiler(ProfilerEvent.AfterRenderHooksStart); + } + this.executing = true; for (const phase of AFTER_RENDER_PHASES) { for (const sequence of this.sequences) { @@ -74,10 +82,11 @@ export class AfterRenderImpl { try { sequence.pipelinedValue = this.ngZone.runOutsideAngular(() => - this.maybeTrace( - () => sequence.hooks[phase]!(sequence.pipelinedValue), - sequence.snapshot, - ), + this.maybeTrace(() => { + const hookFn = sequence.hooks[phase]!; + const value = hookFn(sequence.pipelinedValue); + return value; + }, sequence.snapshot), ); } catch (err) { sequence.erroredOrDestroyed = true; @@ -105,6 +114,10 @@ export class AfterRenderImpl { this.scheduler.notify(NotificationSource.DeferredRenderHook); } this.deferredRegistrations.clear(); + + if (hasSequencesToExecute) { + profiler(ProfilerEvent.AfterRenderHooksEnd); + } } register(sequence: AfterRenderSequence): void { diff --git a/packages/core/src/render3/component_ref.ts b/packages/core/src/render3/component_ref.ts index 80862a6a44ed..11b317733944 100644 --- a/packages/core/src/render3/component_ref.ts +++ b/packages/core/src/render3/component_ref.ts @@ -89,6 +89,8 @@ import {getComponentLViewByIndex, getNativeByTNode, getTNode} from './util/view_ import {ViewRef} from './view_ref'; import {ChainedInjector} from './chained_injector'; import {unregisterLView} from './interfaces/lview_tracking'; +import {profiler} from './profiler'; +import {ProfilerEvent} from './profiler_types'; export class ComponentFactoryResolver extends AbstractComponentFactoryResolver { /** @@ -214,6 +216,8 @@ export class ComponentFactory extends AbstractComponentFactory { rootSelectorOrNode?: any, environmentInjector?: NgModuleRef | EnvironmentInjector | undefined, ): AbstractComponentRef { + profiler(ProfilerEvent.DynamicComponentStart); + const prevConsumer = setActiveConsumer(null); try { // Check if the component is orphan @@ -397,6 +401,7 @@ export class ComponentFactory extends AbstractComponentFactory { unregisterLView(rootLView); throw e; } finally { + profiler(ProfilerEvent.DynamicComponentEnd); leaveView(); } diff --git a/packages/core/src/render3/instructions/change_detection.ts b/packages/core/src/render3/instructions/change_detection.ts index 06fe193302da..514cc9eb8af8 100644 --- a/packages/core/src/render3/instructions/change_detection.ts +++ b/packages/core/src/render3/instructions/change_detection.ts @@ -70,6 +70,8 @@ import { } from './shared'; import {runEffectsInView} from '../reactivity/view_effect_runner'; import {isDestroyed} from '../interfaces/type_checks'; +import {ProfilerEvent} from '../profiler_types'; +import {profiler} from '../profiler'; /** * The maximum number of times the change detection traversal will rerun before throwing an error. @@ -428,8 +430,12 @@ function detectChangesInComponent( mode: ChangeDetectionMode, ): void { ngDevMode && assertEqual(isCreationMode(hostLView), false, 'Should be run in update mode'); + profiler(ProfilerEvent.ComponentStart); + const componentView = getComponentLViewByIndex(componentHostIdx, hostLView); detectChangesInViewIfAttached(componentView, mode); + + profiler(ProfilerEvent.ComponentEnd, componentView[CONTEXT] as any as {}); } /** diff --git a/packages/core/src/render3/instructions/render.ts b/packages/core/src/render3/instructions/render.ts index c4806cf5efec..df95d36b0659 100644 --- a/packages/core/src/render3/instructions/render.ts +++ b/packages/core/src/render3/instructions/render.ts @@ -21,6 +21,8 @@ import { TVIEW, TView, } from '../interfaces/view'; +import {profiler} from '../profiler'; +import {ProfilerEvent} from '../profiler_types'; import {enterView, leaveView} from '../state'; import {getComponentLViewByIndex, isCreationMode} from '../util/view_utils'; @@ -38,7 +40,11 @@ export function renderComponent(hostLView: LView, componentHostIdx: number) { componentView[HYDRATION] = retrieveHydrationInfo(hostRNode, componentView[INJECTOR]); } + profiler(ProfilerEvent.ComponentStart); + renderView(componentTView, componentView, componentView[CONTEXT]); + + profiler(ProfilerEvent.ComponentEnd, componentView[CONTEXT] as any as {}); } /** diff --git a/packages/core/src/render3/instructions/shared.ts b/packages/core/src/render3/instructions/shared.ts index 729b2fca26cf..aa542fdf8d1d 100644 --- a/packages/core/src/render3/instructions/shared.ts +++ b/packages/core/src/render3/instructions/shared.ts @@ -182,7 +182,10 @@ export function processHostBindingOpCodes(tView: TView, lView: LView): void { const hostBindingFn = hostBindingOpCodes[++i] as HostBindingsFunction; setBindingRootForHostBindings(bindingRootIndx, directiveIdx); const context = lView[directiveIdx]; + + profiler(ProfilerEvent.HostBindingsUpdateStart, context); hostBindingFn(RenderFlags.Update, context); + profiler(ProfilerEvent.HostBindingsUpdateEnd, context); } } } finally { diff --git a/packages/core/test/acceptance/profiler_spec.ts b/packages/core/test/acceptance/profiler_spec.ts index 1d77e9568a3f..52bdc41fbbf1 100644 --- a/packages/core/test/acceptance/profiler_spec.ts +++ b/packages/core/test/acceptance/profiler_spec.ts @@ -13,6 +13,7 @@ import {TestBed} from '@angular/core/testing'; import { AfterContentChecked, AfterContentInit, + afterRender, AfterViewChecked, AfterViewInit, Component, @@ -28,14 +29,14 @@ import { } from '../../src/core'; describe('profiler', () => { - class Profiler { + class TestProfiler { profile() {} } let profilerSpy: jasmine.Spy; beforeEach(() => { - const profiler = new Profiler(); + const profiler = new TestProfiler(); profilerSpy = spyOn(profiler, 'profile').and.callThrough(); setProfiler(profiler.profile); }); @@ -400,27 +401,146 @@ describe('profiler', () => { expect(serviceNgOnDestroyStart).toBeTruthy(); expect(serviceNgOnDestroyEnd).toBeTruthy(); }); + + it('should call the profiler on lifecycle execution even after error', () => { + @Component({selector: 'my-comp', template: '', standalone: false}) + class MyComponent implements OnInit { + ngOnInit() { + throw new Error(); + } + } + + TestBed.configureTestingModule({declarations: [MyComponent]}); + const fixture = TestBed.createComponent(MyComponent); + + expect(() => { + fixture.detectChanges(); + }).toThrow(); + + const lifecycleStart = findProfilerCall(ProfilerEvent.LifecycleHookStart); + const lifecycleEnd = findProfilerCall(ProfilerEvent.LifecycleHookEnd); + + expect(lifecycleStart).toBeTruthy(); + expect(lifecycleEnd).toBeTruthy(); + }); }); - it('should call the profiler on lifecycle execution even after error', () => { - @Component({selector: 'my-comp', template: '', standalone: false}) - class MyComponent implements OnInit { - ngOnInit() { - throw new Error(); + describe('entry point events', () => { + class EventRecordingProfiler { + events: ProfilerEvent[] = []; + + clearEvents() { + this.events.length = 0; } + + hasEvents(...events: ProfilerEvent[]): boolean { + for (const e of events) { + if (this.events.indexOf(e) === -1) { + return false; + } + } + + return true; + } + + profile = ( + event: ProfilerEvent, + instance?: {} | null, + hookOrListener?: (e?: any) => any, + ): void => { + this.events.push(event); + }; } - TestBed.configureTestingModule({declarations: [MyComponent]}); - const fixture = TestBed.createComponent(MyComponent); + let p: EventRecordingProfiler; - expect(() => { + beforeEach(() => { + p = new EventRecordingProfiler(); + setProfiler(p.profile); + }); + + afterEach(() => { + setProfiler(null); + }); + + it('should capture component creation and change detection entry points', () => { + @Component({selector: 'my-comp', template: ''}) + class MyComponent {} + + const fixture = TestBed.createComponent(MyComponent); + expect(p.events).toEqual([ + ProfilerEvent.DynamicComponentStart, + ProfilerEvent.ComponentStart, + ProfilerEvent.TemplateCreateStart, + ProfilerEvent.TemplateCreateEnd, + ProfilerEvent.ComponentEnd, + ProfilerEvent.DynamicComponentEnd, + ProfilerEvent.ChangeDetectionStart, + ProfilerEvent.ChangeDetectionSyncStart, + ProfilerEvent.ChangeDetectionSyncEnd, + ProfilerEvent.ChangeDetectionEnd, + ]); + + p.clearEvents(); + fixture.detectChanges(false); + + expect( + p.hasEvents(ProfilerEvent.TemplateUpdateStart, ProfilerEvent.TemplateUpdateEnd), + ).toBeTrue(); + }); + + it('should invoke a profiler when host bindings are evaluated', () => { + @Component({ + selector: 'my-comp', + host: { + '[id]': '"someId"', + }, + template: '', + }) + class MyComponent {} + + const fixture = TestBed.createComponent(MyComponent); + fixture.detectChanges(); + + expect( + p.hasEvents(ProfilerEvent.HostBindingsUpdateStart, ProfilerEvent.HostBindingsUpdateEnd), + ).toBeTrue(); + }); + + it('should invoke a profiler when after render hooks are executing', () => { + @Component({ + selector: 'my-comp', + template: '', + }) + class MyComponent { + arRef = afterRender(() => {}); + } + + const fixture = TestBed.createComponent(MyComponent); fixture.detectChanges(); - }).toThrow(); - const lifecycleStart = findProfilerCall(ProfilerEvent.LifecycleHookStart); - const lifecycleEnd = findProfilerCall(ProfilerEvent.LifecycleHookEnd); + expect( + p.hasEvents(ProfilerEvent.AfterRenderHooksStart, ProfilerEvent.AfterRenderHooksEnd), + ).toBeTrue(); + }); - expect(lifecycleStart).toBeTruthy(); - expect(lifecycleEnd).toBeTruthy(); + it('should invoke a profiler when defer block transitions between states', () => { + @Component({ + selector: 'my-comp', + template: ` + @defer (on immediate) { + nothing to see here... + } + `, + }) + class MyComponent {} + + const fixture = TestBed.createComponent(MyComponent); + fixture.detectChanges(); + + expect( + p.hasEvents(ProfilerEvent.DeferBlockStateStart, ProfilerEvent.DeferBlockStateEnd), + ).toBeTrue(); + }); }); }); From 1ff5cd690660fd5c6f5c69c378b8c16dc1c27fa2 Mon Sep 17 00:00:00 2001 From: arturovt Date: Thu, 9 Jan 2025 00:32:42 +0200 Subject: [PATCH 0084/1220] refactor(common): tree-shake transfer cache interceptor stuff (#59439) In this commit, we replace `isPlatformServer` runtime call with the `ngServerMode` in the `transferCacheInterceptorFn` in order to make the functionality tree-shakable between client and server bundles. PR Close #59439 --- packages/common/http/src/transfer_cache.ts | 13 +++++++------ packages/common/http/test/transfer_cache_spec.ts | 16 ++++++++++++++++ packages/platform-browser/test/hydration_spec.ts | 8 ++++++++ 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/packages/common/http/src/transfer_cache.ts b/packages/common/http/src/transfer_cache.ts index 09d37e2e85bc..3d0966066410 100644 --- a/packages/common/http/src/transfer_cache.ts +++ b/packages/common/http/src/transfer_cache.ts @@ -12,7 +12,6 @@ import { inject, InjectionToken, makeStateKey, - PLATFORM_ID, Provider, StateKey, TransferState, @@ -21,7 +20,6 @@ import { ɵtruncateMiddle as truncateMiddle, ɵRuntimeError as RuntimeError, } from '@angular/core'; -import {isPlatformServer} from '@angular/common'; import {Observable, of} from 'rxjs'; import {tap} from 'rxjs/operators'; @@ -149,8 +147,8 @@ export function transferCacheInterceptorFn( const originMap: Record | null = inject(HTTP_TRANSFER_CACHE_ORIGIN_MAP, { optional: true, }); - const isServer = isPlatformServer(inject(PLATFORM_ID)); - if (originMap && !isServer) { + + if (typeof ngServerMode !== 'undefined' && !ngServerMode && originMap) { throw new RuntimeError( RuntimeErrorCode.HTTP_ORIGIN_MAP_USED_IN_CLIENT, ngDevMode && @@ -160,7 +158,10 @@ export function transferCacheInterceptorFn( ); } - const requestUrl = isServer && originMap ? mapRequestOriginUrl(req.url, originMap) : req.url; + const requestUrl = + typeof ngServerMode !== 'undefined' && ngServerMode && originMap + ? mapRequestOriginUrl(req.url, originMap) + : req.url; const storeKey = makeCacheKey(req, requestUrl); const response = transferState.get(storeKey, null); @@ -217,7 +218,7 @@ export function transferCacheInterceptorFn( // Request not found in cache. Make the request and cache it if on the server. return next(req).pipe( tap((event: HttpEvent) => { - if (event instanceof HttpResponse && isServer) { + if (event instanceof HttpResponse && typeof ngServerMode !== 'undefined' && ngServerMode) { transferState.set(storeKey, { [BODY]: event.body, [HEADERS]: getFilteredHeaders(event.headers, headersToInclude), diff --git a/packages/common/http/test/transfer_cache_spec.ts b/packages/common/http/test/transfer_cache_spec.ts index e0e22368be6e..dc882e95a2de 100644 --- a/packages/common/http/test/transfer_cache_spec.ts +++ b/packages/common/http/test/transfer_cache_spec.ts @@ -88,6 +88,14 @@ describe('TransferCache', () => { return response; } + beforeEach(() => { + globalThis['ngServerMode'] = true; + }); + + afterEach(() => { + globalThis['ngServerMode'] = undefined; + }); + beforeEach( withBody('', () => { TestBed.resetTestingModule(); @@ -323,6 +331,14 @@ describe('TransferCache', () => { }); describe('caching in browser context', () => { + beforeEach(() => { + globalThis['ngServerMode'] = false; + }); + + afterEach(() => { + globalThis['ngServerMode'] = undefined; + }); + beforeEach( withBody('', () => { TestBed.resetTestingModule(); diff --git a/packages/platform-browser/test/hydration_spec.ts b/packages/platform-browser/test/hydration_spec.ts index 90066475d808..92d0d360db44 100644 --- a/packages/platform-browser/test/hydration_spec.ts +++ b/packages/platform-browser/test/hydration_spec.ts @@ -53,6 +53,14 @@ describe('provideClientHydration', () => { override isStable = new BehaviorSubject(false); } + beforeEach(() => { + globalThis['ngServerMode'] = true; + }); + + afterEach(() => { + globalThis['ngServerMode'] = undefined; + }); + describe('default', () => { beforeEach( withBody( From 19d224117edf4c2d82b71be07c5f4793b1bdba5f Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Tue, 14 Jan 2025 16:23:39 +0000 Subject: [PATCH 0085/1220] build: lock file maintenance (#59519) See associated pull request for more information. Closes #59494 as a takeover pull request PR Close #59519 --- .../deferrable-views/common/package-lock.json | 318 ++--- .../first-app/common/package-lock.json | 438 +++---- .../tutorials/homepage/package-lock.json | 306 ++--- .../learn-angular/common/package-lock.json | 318 ++--- .../playground/common/package-lock.json | 328 ++--- packages/zone.js/yarn.lock | 98 +- yarn.lock | 1108 +++++++---------- 7 files changed, 1371 insertions(+), 1543 deletions(-) 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 b39c3cc8971e..734e85fab027 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.1900.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1900.6.tgz", - "integrity": "sha512-w11bAXQnNWBawTJfQPjvaTRrzrqsOUm9tK9WNvaia/xjiRFpmO0CfmKtn3axNSEJM8jb/czaNQrgTwG+TGc/8g==", + "version": "0.1900.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1900.7.tgz", + "integrity": "sha512-3dRV0IB+MbNYbAGbYEFMcABkMphqcTvn5MG79dQkwcf2a9QZxCq2slwf/rIleWoDUcFm9r1NnVPYrTYNYJaqQg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", + "@angular-devkit/core": "19.0.7", "rxjs": "7.8.1" }, "engines": { @@ -56,9 +56,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.6.tgz", - "integrity": "sha512-WUWJhzQDsovfMY6jtb9Ktz/5sJszsaErj+XV2aXab85f1OweI/Iv2urPZnJwUSilvVN5Ok/fy3IJ6SuihK4Ceg==", + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.7.tgz", + "integrity": "sha512-VyuORSitT6LIaGUEF0KEnv2TwNaeWl6L3/4L4stok0BJ23B4joVca2DYVcrLC1hSzz8V4dwVgSlbNIgjgGdVpg==", "dev": true, "license": "MIT", "dependencies": { @@ -84,13 +84,13 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.6.tgz", - "integrity": "sha512-R9hlHfAh1HKoIWgnYJlOEKhUezhTNl0fpUmHxG2252JSY5FLRxmYArTtJYYmbNdBbsBLNg3UHyM/GBPvJSA3NQ==", + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.7.tgz", + "integrity": "sha512-BHXQv6kMc9xo4TH9lhwMv8nrZXHkLioQvLun2qYjwvOsyzt3qd+sUM9wpHwbG6t+01+FIQ05iNN9ox+Cvpndgg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", + "@angular-devkit/core": "19.0.7", "jsonc-parser": "3.3.1", "magic-string": "0.30.12", "ora": "5.4.1", @@ -103,14 +103,14 @@ } }, "node_modules/@angular/build": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.0.6.tgz", - "integrity": "sha512-KEVNLgTZUF2dfpOYQn+yR2HONHUTxq/2rFVhiK9qAvrm/m+uKJNEXx7hGtbRyoqenZff4ScJq+7feITUldfX8g==", + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.0.7.tgz", + "integrity": "sha512-AFvhRa6sfXG8NmS8AN7TvE8q2kVcMw+zXMZzo981cqwnOwJy4VHU0htqm5OZQnohVJM0pP8SBAuROWO4yRrxCA==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1900.6", + "@angular-devkit/architect": "0.1900.7", "@babel/core": "7.26.0", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", @@ -149,7 +149,7 @@ "@angular/localize": "^19.0.0", "@angular/platform-server": "^19.0.0", "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.0.6", + "@angular/ssr": "^19.0.7", "less": "^4.2.0", "postcss": "^8.4.0", "tailwindcss": "^2.0.0 || ^3.0.0", @@ -180,18 +180,18 @@ } }, "node_modules/@angular/cli": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.0.6.tgz", - "integrity": "sha512-ZEHhgRRVIdn10dbsAjB8TE9Co32hfuL9/im5Jcfa1yrn6KJefmigz6KN8Xu7FXMH5FkdqfQ11QpLBxJSPb9aww==", + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.0.7.tgz", + "integrity": "sha512-y6C4B4XdiZwe2+OADLWXyKqUVvW/XDzTuJ2mZ5PhTnSiiXDN4zRWId1F5wA8ve8vlbUKApPHXRQuaqiQJmA24g==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1900.6", - "@angular-devkit/core": "19.0.6", - "@angular-devkit/schematics": "19.0.6", + "@angular-devkit/architect": "0.1900.7", + "@angular-devkit/core": "19.0.7", + "@angular-devkit/schematics": "19.0.7", "@inquirer/prompts": "7.1.0", "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.0.6", + "@schematics/angular": "19.0.7", "@yarnpkg/lockfile": "1.1.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", @@ -214,9 +214,9 @@ } }, "node_modules/@angular/common": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.0.5.tgz", - "integrity": "sha512-fFK+euCj1AjBHBCpj9VnduMSeqoMRhZZHbhPYiND7tucRRJ8vwGU0sYK2KI/Ko+fsrNIXL/0O4F36jVPl09Smg==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.0.6.tgz", + "integrity": "sha512-r9IDD0+UGkrQkjyX+pApeDmIJ9INpr1uYlgmmlWNBJCVNr9SKKIVZV60sssgadew6bGynKN9dW4mGsmEzzb5BA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -225,14 +225,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.5", + "@angular/core": "19.0.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.0.5.tgz", - "integrity": "sha512-S8ku5Ljp0kqX3shfmE9DVo09629jeYJSlBRGbj2Glb92dd+VQZPOz7KxqKRTwmAl7lQIV/+4Lr6G/GVTsoC4vg==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.0.6.tgz", + "integrity": "sha512-g8A6QOsiCJnRi5Hz0sASIpRQoAGxEgnjz0JanfrMNRedY4MpdIS1V0AeCSKTsMRlV7tQl3ng2Gse/tsb51HI3Q==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -241,7 +241,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.5" + "@angular/core": "19.0.6" }, "peerDependenciesMeta": { "@angular/core": { @@ -250,9 +250,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.0.5.tgz", - "integrity": "sha512-KSzuWCTZlvJsoAenxM9cjTOzNM8mrFxDBInj0KVPz7QU83amGS4rcv1pWO/QGYQcErfskcN84TAdMegaRWWCmA==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.0.6.tgz", + "integrity": "sha512-fHtwI5rCe3LmKDoaqlqLAPdNmLrbeCiMYVe+X1BHgApaqNCyAwcuJxuf8Q5R5su7nHiLmlmB74o1ZS/V+0cQ+g==", "dev": true, "license": "MIT", "dependencies": { @@ -274,14 +274,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.0.5", + "@angular/compiler": "19.0.6", "typescript": ">=5.5 <5.7" } }, "node_modules/@angular/core": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.0.5.tgz", - "integrity": "sha512-Ywc6sPO6G/Y1stfk3y/MallV/h0yzQ0vdOHRWueLrk5kD1DTdbolV4X03Cs3PuVvravgcSVE3nnuuHFuH32emQ==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.0.6.tgz", + "integrity": "sha512-9N7FmdRHtS7zfXC/wnyap/reX7fgiOrWpVivayHjWP4RkLYXJAzJIpLyew0jrx4vf8r3lZnC0Zmq0PW007Ngjw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -295,9 +295,9 @@ } }, "node_modules/@angular/forms": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.0.5.tgz", - "integrity": "sha512-OhNFkfOoguqCDq07vNBV28FFrmTM8S11Z3Cd6PQZJJF9TgAtpV5KtF7A3eXBCN92W4pmqluomPjfK7YyImzIYQ==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.0.6.tgz", + "integrity": "sha512-HogauPvgDQHw2xxqKBaFgKTRRcc1xWeI/PByDCf3U6YsaqpF53Mz2CJh8X2bg2bY1RGKb67MZw7DBGFRvXx4bg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -306,16 +306,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.5", - "@angular/core": "19.0.5", - "@angular/platform-browser": "19.0.5", + "@angular/common": "19.0.6", + "@angular/core": "19.0.6", + "@angular/platform-browser": "19.0.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.0.5.tgz", - "integrity": "sha512-41+Jo5DEil4Ifvv+UE/p1l9YJtYN+xfhx+/C9cahVgvV5D2q+givyK73d0Mnb6XOfe1q+hoV5lZ+XhQYp21//g==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.0.6.tgz", + "integrity": "sha512-MWiToGy7Pa0rR61sgnEuu7dfZXpAw0g7nkSnw4xdjUf974OOOfI1LS9O9YevJibtdW8sPa1HaoXXwcb7N03B5A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -324,9 +324,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "19.0.5", - "@angular/common": "19.0.5", - "@angular/core": "19.0.5" + "@angular/animations": "19.0.6", + "@angular/common": "19.0.6", + "@angular/core": "19.0.6" }, "peerDependenciesMeta": { "@angular/animations": { @@ -335,9 +335,9 @@ } }, "node_modules/@angular/router": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.0.5.tgz", - "integrity": "sha512-6tNubVVj/rRyTg+OXjQxACfufvCLHAwDQtv9wqt6q/3OYSnysHTik3ho3FaFPwu7fXJ+6p9Rjzkh2VY9QMk4bw==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.0.6.tgz", + "integrity": "sha512-G1oz+TclPk48h6b6B4s5J3DfrDVJrrxKOA+KWeVQP4e1B8ld7/dCMf5nn3yqS4BGs4yLecxMxyvbOvOiZ//lxw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -346,9 +346,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.5", - "@angular/core": "19.0.5", - "@angular/platform-browser": "19.0.5", + "@angular/common": "19.0.6", + "@angular/core": "19.0.6", + "@angular/platform-browser": "19.0.6", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -368,9 +368,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", + "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", "dev": true, "license": "MIT", "engines": { @@ -426,14 +426,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", + "@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" @@ -456,13 +456,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "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.25.9", + "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -515,9 +515,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, "license": "MIT", "engines": { @@ -582,13 +582,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", + "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.3" + "@babel/types": "^7.26.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -629,17 +629,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz", + "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.5", "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", + "@babel/types": "^7.26.5", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -648,9 +648,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", + "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", "dev": true, "license": "MIT", "dependencies": { @@ -1070,13 +1070,13 @@ } }, "node_modules/@inquirer/checkbox": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.4.tgz", - "integrity": "sha512-fYAKCAcGNMdfjL6hZTRUwkIByQ8EIZCXKrIQZH7XjADnN/xvRUhj8UdBbpC4zoUzvChhkSC/zRKaP/tDs3dZpg==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.6.tgz", + "integrity": "sha512-PgP35JfmGjHU0LSXOyRew0zHuA9N6OJwOlos1fZ20b7j8ISeAdib3L+n0jIxBtX958UeEpte6xhG/gxJ5iUqMw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/figures": "^1.0.9", "@inquirer/type": "^3.0.2", "ansi-escapes": "^4.3.2", @@ -1107,9 +1107,9 @@ } }, "node_modules/@inquirer/core": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.2.tgz", - "integrity": "sha512-bHd96F3ezHg1mf/J0Rb4CV8ndCN0v28kUlrHqP7+ECm1C/A+paB7Xh2lbMk6x+kweQC+rZOxM/YeKikzxco8bQ==", + "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": { @@ -1128,13 +1128,13 @@ } }, "node_modules/@inquirer/editor": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.1.tgz", - "integrity": "sha512-xn9aDaiP6nFa432i68JCaL302FyL6y/6EG97nAtfIPnWZ+mWPgCMLGc4XZ2QQMsZtu9q3Jd5AzBPjXh10aX9kA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.3.tgz", + "integrity": "sha512-S9KnIOJuTZpb9upeRSBBhoDZv7aSV3pG9TECrBj0f+ZsFwccz886hzKBrChGrXMJwd4NKY+pOA9Vy72uqnd6Eg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2", "external-editor": "^3.1.0" }, @@ -1146,13 +1146,13 @@ } }, "node_modules/@inquirer/expand": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.4.tgz", - "integrity": "sha512-GYocr+BPyxKPxQ4UZyNMqZFSGKScSUc0Vk17II3J+0bDcgGsQm0KYQNooN1Q5iBfXsy3x/VWmHGh20QnzsaHwg==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.6.tgz", + "integrity": "sha512-TRTfi1mv1GeIZGyi9PQmvAaH65ZlG4/FACq6wSzs7Vvf1z5dnNWsAAXBjWMHt76l+1hUY8teIqJFrWBk5N6gsg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2", "yoctocolors-cjs": "^2.1.2" }, @@ -1174,13 +1174,13 @@ } }, "node_modules/@inquirer/input": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.1.tgz", - "integrity": "sha512-nAXAHQndZcXB+7CyjIW3XuQZZHbQQ0q8LX6miY6bqAWwDzNa9JUioDBYrFmOUNIsuF08o1WT/m2gbBXvBhYVxg==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.3.tgz", + "integrity": "sha512-zeo++6f7hxaEe7OjtMzdGZPHiawsfmCZxWB9X1NpmYgbeoyerIbWemvlBxxl+sQIlHC0WuSAG19ibMq3gbhaqQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2" }, "engines": { @@ -1191,13 +1191,13 @@ } }, "node_modules/@inquirer/number": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.4.tgz", - "integrity": "sha512-DX7a6IXRPU0j8kr2ovf+QaaDiIf+zEKaZVzCWdLOTk7XigqSXvoh4cul7x68xp54WTQrgSnW7P1WBJDbyY3GhA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.6.tgz", + "integrity": "sha512-xO07lftUHk1rs1gR0KbqB+LJPhkUNkyzV/KhH+937hdkMazmAYHLm1OIrNKpPelppeV1FgWrgFDjdUD8mM+XUg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2" }, "engines": { @@ -1208,13 +1208,13 @@ } }, "node_modules/@inquirer/password": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.4.tgz", - "integrity": "sha512-wiliQOWdjM8FnBmdIHtQV2Ca3S1+tMBUerhyjkRCv1g+4jSvEweGu9GCcvVEgKDhTBT15nrxvk5/bVrGUqSs1w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.6.tgz", + "integrity": "sha512-QLF0HmMpHZPPMp10WGXh6F+ZPvzWE7LX6rNoccdktv/Rov0B+0f+eyXkAcgqy5cH9V+WSpbLxu2lo3ysEVK91w==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2", "ansi-escapes": "^4.3.2" }, @@ -1251,13 +1251,13 @@ } }, "node_modules/@inquirer/rawlist": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.4.tgz", - "integrity": "sha512-IsVN2EZdNHsmFdKWx9HaXb8T/s3FlR/U1QPt9dwbSyPtjFbMTlW9CRFvnn0bm/QIsrMRD2oMZqrQpSWPQVbXXg==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.6.tgz", + "integrity": "sha512-QoE4s1SsIPx27FO4L1b1mUjVcoHm1pWE/oCmm4z/Hl+V1Aw5IXl8FYYzGmfXaBT0l/sWr49XmNSiq7kg3Kd/Lg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2", "yoctocolors-cjs": "^2.1.2" }, @@ -1269,13 +1269,13 @@ } }, "node_modules/@inquirer/search": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.4.tgz", - "integrity": "sha512-tSkJk2SDmC2MEdTIjknXWmCnmPr5owTs9/xjfa14ol1Oh95n6xW7SYn5fiPk4/vrJPys0ggSWiISdPze4LTa7A==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/figures": "^1.0.9", "@inquirer/type": "^3.0.2", "yoctocolors-cjs": "^2.1.2" @@ -1288,13 +1288,13 @@ } }, "node_modules/@inquirer/select": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.4.tgz", - "integrity": "sha512-ZzYLuLoUzTIW9EJm++jBpRiTshGqS3Q1o5qOEQqgzaBlmdsjQr6pA4TUNkwu6OBYgM2mIRbCz6mUhFDfl/GF+w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.6.tgz", + "integrity": "sha512-yANzIiNZ8fhMm4NORm+a74+KFYHmf7BZphSOBovIzYPVLquseTGEkU5l2UTnBOf5k0VLmTgPighNDLE9QtbViQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/figures": "^1.0.9", "@inquirer/type": "^3.0.2", "ansi-escapes": "^4.3.2", @@ -2797,14 +2797,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.0.6.tgz", - "integrity": "sha512-HicclmbW/+mlljU7a4PzbyIWG+7tognoL5LsgMFJQUDzJXHNjRt1riL0vk57o8Pcprnz9FheeWZXO1KRhXkQuw==", + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.0.7.tgz", + "integrity": "sha512-1WtTqKFPuEaV99VIP+y/gf/XW3TVJh/NbJbbEF4qYpp7qQiJ4ntF4klVZmsJcQzFucZSzlg91QVMPQKev5WZGA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", - "@angular-devkit/schematics": "19.0.6", + "@angular-devkit/core": "19.0.7", + "@angular-devkit/schematics": "19.0.7", "jsonc-parser": "3.3.1" }, "engines": { @@ -2837,13 +2837,13 @@ } }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", - "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.3.tgz", + "integrity": "sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@sigstore/sign": { @@ -2925,9 +2925,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz", - "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", + "version": "22.10.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.6.tgz", + "integrity": "sha512-qNiuwC4ZDAUNcY47xgaSuS92cjf8JbSUoaKS77bmLG1rU7MlATVSiw/IlrjtIyyskXBZ8KkNfjK/P5na7rgXbQ==", "dev": true, "license": "MIT", "peer": true, @@ -3140,9 +3140,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", - "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ { @@ -3283,9 +3283,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001690", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", - "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", + "version": "1.0.30001692", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz", + "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==", "dev": true, "funding": [ { @@ -3673,9 +3673,9 @@ } }, "node_modules/domutils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.1.tgz", - "integrity": "sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -3695,9 +3695,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.76", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz", - "integrity": "sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==", + "version": "1.5.82", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.82.tgz", + "integrity": "sha512-Zq16uk1hfQhyGx5GpwPAYDwddJuSGhtRhgOA2mCxANYaDT79nAeGnaXogMGng4KqLaJUVnOnuL0+TDop9nLOiA==", "dev": true, "license": "ISC" }, @@ -5625,9 +5625,9 @@ } }, "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", + "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", "dev": true, "funding": [ { @@ -5645,7 +5645,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", + "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -5728,13 +5728,13 @@ } }, "node_modules/readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz", + "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 14.16.0" + "node": ">= 14.18.0" }, "funding": { "type": "individual", @@ -6531,9 +6531,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "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, "funding": [ { @@ -6552,7 +6552,7 @@ "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" 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 77ad45508d2b..7495374c0f1a 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.1900.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1900.6.tgz", - "integrity": "sha512-w11bAXQnNWBawTJfQPjvaTRrzrqsOUm9tK9WNvaia/xjiRFpmO0CfmKtn3axNSEJM8jb/czaNQrgTwG+TGc/8g==", + "version": "0.1900.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1900.7.tgz", + "integrity": "sha512-3dRV0IB+MbNYbAGbYEFMcABkMphqcTvn5MG79dQkwcf2a9QZxCq2slwf/rIleWoDUcFm9r1NnVPYrTYNYJaqQg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", + "@angular-devkit/core": "19.0.7", "rxjs": "7.8.1" }, "engines": { @@ -70,17 +70,17 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.0.6.tgz", - "integrity": "sha512-dWTAsE6BSI8z0xglQdYBdqTBwg1Q+RWE3OrmlGs+520Dcoq/F0Z41Y1F3MiuHuQPdDAIQr88iB0APkIRW4clMg==", + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.0.7.tgz", + "integrity": "sha512-R0vpJ+P5xBqF82zOMq2FvOP7pJz5NZ7PwHAIFuQ6z50SHLW/VcUA19ZoFKwxBX6A/Soyb66QXTcjZ5wbRqMm8w==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1900.6", - "@angular-devkit/build-webpack": "0.1900.6", - "@angular-devkit/core": "19.0.6", - "@angular/build": "19.0.6", + "@angular-devkit/architect": "0.1900.7", + "@angular-devkit/build-webpack": "0.1900.7", + "@angular-devkit/core": "19.0.7", + "@angular/build": "19.0.7", "@babel/core": "7.26.0", "@babel/generator": "7.26.2", "@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.0.6", + "@ngtools/webpack": "19.0.7", "@vitejs/plugin-basic-ssl": "1.1.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.0.6", + "@angular/ssr": "^19.0.7", "@web/test-runner": "^0.19.0", "browser-sync": "^3.0.2", "jest": "^29.5.0", @@ -610,9 +610,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@types/node": { - "version": "22.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz", - "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", + "version": "22.10.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.6.tgz", + "integrity": "sha512-qNiuwC4ZDAUNcY47xgaSuS92cjf8JbSUoaKS77bmLG1rU7MlATVSiw/IlrjtIyyskXBZ8KkNfjK/P5na7rgXbQ==", "dev": true, "license": "MIT", "optional": true, @@ -736,13 +736,13 @@ } }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1900.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1900.6.tgz", - "integrity": "sha512-WehtVrbBow4fc7hsaUKb+BZ6MDE5lO98/tgv7GR5PkRdGKnyLA0pW1AfPLJJQDgcaKjneramMhDFNc1eGSX0mQ==", + "version": "0.1900.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1900.7.tgz", + "integrity": "sha512-F0S0iyspo/9w9rP5F9wmL+ZkBr48YQIWiFu+PaQ0in/lcdRmY/FjVHTMa5BMnlew9VCtFHPvpoN9x4u8AIoWXA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1900.6", + "@angular-devkit/architect": "0.1900.7", "rxjs": "7.8.1" }, "engines": { @@ -756,9 +756,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.6.tgz", - "integrity": "sha512-WUWJhzQDsovfMY6jtb9Ktz/5sJszsaErj+XV2aXab85f1OweI/Iv2urPZnJwUSilvVN5Ok/fy3IJ6SuihK4Ceg==", + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.7.tgz", + "integrity": "sha512-VyuORSitT6LIaGUEF0KEnv2TwNaeWl6L3/4L4stok0BJ23B4joVca2DYVcrLC1hSzz8V4dwVgSlbNIgjgGdVpg==", "dev": true, "license": "MIT", "dependencies": { @@ -784,13 +784,13 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.6.tgz", - "integrity": "sha512-R9hlHfAh1HKoIWgnYJlOEKhUezhTNl0fpUmHxG2252JSY5FLRxmYArTtJYYmbNdBbsBLNg3UHyM/GBPvJSA3NQ==", + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.7.tgz", + "integrity": "sha512-BHXQv6kMc9xo4TH9lhwMv8nrZXHkLioQvLun2qYjwvOsyzt3qd+sUM9wpHwbG6t+01+FIQ05iNN9ox+Cvpndgg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", + "@angular-devkit/core": "19.0.7", "jsonc-parser": "3.3.1", "magic-string": "0.30.12", "ora": "5.4.1", @@ -803,9 +803,9 @@ } }, "node_modules/@angular/animations": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.0.5.tgz", - "integrity": "sha512-HCOF2CrhUvjoZWusd4nh32VOxpUrg6bV+3Z8Q36Ix3aZdni8v0qoP2rl5wGbotaPtYg5RtyDH60Z2AOPKqlrZg==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.0.6.tgz", + "integrity": "sha512-dlXrFcw7RQNze1zjmrbwqcFd6zgEuqKwuExtEN1Fy26kQ+wqKIhYO6IG7PZGef53XpwN5DT16yve6UihJ2XeNg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -814,18 +814,18 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.5" + "@angular/core": "19.0.6" } }, "node_modules/@angular/build": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.0.6.tgz", - "integrity": "sha512-KEVNLgTZUF2dfpOYQn+yR2HONHUTxq/2rFVhiK9qAvrm/m+uKJNEXx7hGtbRyoqenZff4ScJq+7feITUldfX8g==", + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.0.7.tgz", + "integrity": "sha512-AFvhRa6sfXG8NmS8AN7TvE8q2kVcMw+zXMZzo981cqwnOwJy4VHU0htqm5OZQnohVJM0pP8SBAuROWO4yRrxCA==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1900.6", + "@angular-devkit/architect": "0.1900.7", "@babel/core": "7.26.0", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", @@ -864,7 +864,7 @@ "@angular/localize": "^19.0.0", "@angular/platform-server": "^19.0.0", "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.0.6", + "@angular/ssr": "^19.0.7", "less": "^4.2.0", "postcss": "^8.4.0", "tailwindcss": "^2.0.0 || ^3.0.0", @@ -1316,9 +1316,9 @@ } }, "node_modules/@angular/build/node_modules/@types/node": { - "version": "22.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz", - "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", + "version": "22.10.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.6.tgz", + "integrity": "sha512-qNiuwC4ZDAUNcY47xgaSuS92cjf8JbSUoaKS77bmLG1rU7MlATVSiw/IlrjtIyyskXBZ8KkNfjK/P5na7rgXbQ==", "dev": true, "license": "MIT", "peer": true, @@ -1439,18 +1439,18 @@ } }, "node_modules/@angular/cli": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.0.6.tgz", - "integrity": "sha512-ZEHhgRRVIdn10dbsAjB8TE9Co32hfuL9/im5Jcfa1yrn6KJefmigz6KN8Xu7FXMH5FkdqfQ11QpLBxJSPb9aww==", + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.0.7.tgz", + "integrity": "sha512-y6C4B4XdiZwe2+OADLWXyKqUVvW/XDzTuJ2mZ5PhTnSiiXDN4zRWId1F5wA8ve8vlbUKApPHXRQuaqiQJmA24g==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1900.6", - "@angular-devkit/core": "19.0.6", - "@angular-devkit/schematics": "19.0.6", + "@angular-devkit/architect": "0.1900.7", + "@angular-devkit/core": "19.0.7", + "@angular-devkit/schematics": "19.0.7", "@inquirer/prompts": "7.1.0", "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.0.6", + "@schematics/angular": "19.0.7", "@yarnpkg/lockfile": "1.1.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", @@ -1473,13 +1473,13 @@ } }, "node_modules/@angular/cli/node_modules/@inquirer/checkbox": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.4.tgz", - "integrity": "sha512-fYAKCAcGNMdfjL6hZTRUwkIByQ8EIZCXKrIQZH7XjADnN/xvRUhj8UdBbpC4zoUzvChhkSC/zRKaP/tDs3dZpg==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.6.tgz", + "integrity": "sha512-PgP35JfmGjHU0LSXOyRew0zHuA9N6OJwOlos1fZ20b7j8ISeAdib3L+n0jIxBtX958UeEpte6xhG/gxJ5iUqMw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/figures": "^1.0.9", "@inquirer/type": "^3.0.2", "ansi-escapes": "^4.3.2", @@ -1493,13 +1493,13 @@ } }, "node_modules/@angular/cli/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==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.3.tgz", + "integrity": "sha512-fuF9laMmHoOgWapF9h9hv6opA5WvmGFHsTYGCmuFxcghIhEhb3dN0CdQR4BUMqa2H506NCj8cGX4jwMsE4t6dA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2" }, "engines": { @@ -1510,13 +1510,13 @@ } }, "node_modules/@angular/cli/node_modules/@inquirer/editor": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.1.tgz", - "integrity": "sha512-xn9aDaiP6nFa432i68JCaL302FyL6y/6EG97nAtfIPnWZ+mWPgCMLGc4XZ2QQMsZtu9q3Jd5AzBPjXh10aX9kA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.3.tgz", + "integrity": "sha512-S9KnIOJuTZpb9upeRSBBhoDZv7aSV3pG9TECrBj0f+ZsFwccz886hzKBrChGrXMJwd4NKY+pOA9Vy72uqnd6Eg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2", "external-editor": "^3.1.0" }, @@ -1528,13 +1528,13 @@ } }, "node_modules/@angular/cli/node_modules/@inquirer/expand": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.4.tgz", - "integrity": "sha512-GYocr+BPyxKPxQ4UZyNMqZFSGKScSUc0Vk17II3J+0bDcgGsQm0KYQNooN1Q5iBfXsy3x/VWmHGh20QnzsaHwg==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.6.tgz", + "integrity": "sha512-TRTfi1mv1GeIZGyi9PQmvAaH65ZlG4/FACq6wSzs7Vvf1z5dnNWsAAXBjWMHt76l+1hUY8teIqJFrWBk5N6gsg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2", "yoctocolors-cjs": "^2.1.2" }, @@ -1546,13 +1546,13 @@ } }, "node_modules/@angular/cli/node_modules/@inquirer/input": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.1.tgz", - "integrity": "sha512-nAXAHQndZcXB+7CyjIW3XuQZZHbQQ0q8LX6miY6bqAWwDzNa9JUioDBYrFmOUNIsuF08o1WT/m2gbBXvBhYVxg==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.3.tgz", + "integrity": "sha512-zeo++6f7hxaEe7OjtMzdGZPHiawsfmCZxWB9X1NpmYgbeoyerIbWemvlBxxl+sQIlHC0WuSAG19ibMq3gbhaqQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2" }, "engines": { @@ -1563,13 +1563,13 @@ } }, "node_modules/@angular/cli/node_modules/@inquirer/number": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.4.tgz", - "integrity": "sha512-DX7a6IXRPU0j8kr2ovf+QaaDiIf+zEKaZVzCWdLOTk7XigqSXvoh4cul7x68xp54WTQrgSnW7P1WBJDbyY3GhA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.6.tgz", + "integrity": "sha512-xO07lftUHk1rs1gR0KbqB+LJPhkUNkyzV/KhH+937hdkMazmAYHLm1OIrNKpPelppeV1FgWrgFDjdUD8mM+XUg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2" }, "engines": { @@ -1580,13 +1580,13 @@ } }, "node_modules/@angular/cli/node_modules/@inquirer/password": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.4.tgz", - "integrity": "sha512-wiliQOWdjM8FnBmdIHtQV2Ca3S1+tMBUerhyjkRCv1g+4jSvEweGu9GCcvVEgKDhTBT15nrxvk5/bVrGUqSs1w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.6.tgz", + "integrity": "sha512-QLF0HmMpHZPPMp10WGXh6F+ZPvzWE7LX6rNoccdktv/Rov0B+0f+eyXkAcgqy5cH9V+WSpbLxu2lo3ysEVK91w==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2", "ansi-escapes": "^4.3.2" }, @@ -1623,13 +1623,13 @@ } }, "node_modules/@angular/cli/node_modules/@inquirer/rawlist": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.4.tgz", - "integrity": "sha512-IsVN2EZdNHsmFdKWx9HaXb8T/s3FlR/U1QPt9dwbSyPtjFbMTlW9CRFvnn0bm/QIsrMRD2oMZqrQpSWPQVbXXg==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.6.tgz", + "integrity": "sha512-QoE4s1SsIPx27FO4L1b1mUjVcoHm1pWE/oCmm4z/Hl+V1Aw5IXl8FYYzGmfXaBT0l/sWr49XmNSiq7kg3Kd/Lg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2", "yoctocolors-cjs": "^2.1.2" }, @@ -1641,13 +1641,13 @@ } }, "node_modules/@angular/cli/node_modules/@inquirer/search": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.4.tgz", - "integrity": "sha512-tSkJk2SDmC2MEdTIjknXWmCnmPr5owTs9/xjfa14ol1Oh95n6xW7SYn5fiPk4/vrJPys0ggSWiISdPze4LTa7A==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/figures": "^1.0.9", "@inquirer/type": "^3.0.2", "yoctocolors-cjs": "^2.1.2" @@ -1660,13 +1660,13 @@ } }, "node_modules/@angular/cli/node_modules/@inquirer/select": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.4.tgz", - "integrity": "sha512-ZzYLuLoUzTIW9EJm++jBpRiTshGqS3Q1o5qOEQqgzaBlmdsjQr6pA4TUNkwu6OBYgM2mIRbCz6mUhFDfl/GF+w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.6.tgz", + "integrity": "sha512-yANzIiNZ8fhMm4NORm+a74+KFYHmf7BZphSOBovIzYPVLquseTGEkU5l2UTnBOf5k0VLmTgPighNDLE9QtbViQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/figures": "^1.0.9", "@inquirer/type": "^3.0.2", "ansi-escapes": "^4.3.2", @@ -1722,9 +1722,9 @@ } }, "node_modules/@angular/cli/node_modules/@types/node": { - "version": "22.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz", - "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", + "version": "22.10.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.6.tgz", + "integrity": "sha512-qNiuwC4ZDAUNcY47xgaSuS92cjf8JbSUoaKS77bmLG1rU7MlATVSiw/IlrjtIyyskXBZ8KkNfjK/P5na7rgXbQ==", "dev": true, "license": "MIT", "peer": true, @@ -1759,9 +1759,9 @@ } }, "node_modules/@angular/common": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.0.5.tgz", - "integrity": "sha512-fFK+euCj1AjBHBCpj9VnduMSeqoMRhZZHbhPYiND7tucRRJ8vwGU0sYK2KI/Ko+fsrNIXL/0O4F36jVPl09Smg==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.0.6.tgz", + "integrity": "sha512-r9IDD0+UGkrQkjyX+pApeDmIJ9INpr1uYlgmmlWNBJCVNr9SKKIVZV60sssgadew6bGynKN9dW4mGsmEzzb5BA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1770,14 +1770,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.5", + "@angular/core": "19.0.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.0.5.tgz", - "integrity": "sha512-S8ku5Ljp0kqX3shfmE9DVo09629jeYJSlBRGbj2Glb92dd+VQZPOz7KxqKRTwmAl7lQIV/+4Lr6G/GVTsoC4vg==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.0.6.tgz", + "integrity": "sha512-g8A6QOsiCJnRi5Hz0sASIpRQoAGxEgnjz0JanfrMNRedY4MpdIS1V0AeCSKTsMRlV7tQl3ng2Gse/tsb51HI3Q==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1786,7 +1786,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.5" + "@angular/core": "19.0.6" }, "peerDependenciesMeta": { "@angular/core": { @@ -1795,9 +1795,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.0.5.tgz", - "integrity": "sha512-KSzuWCTZlvJsoAenxM9cjTOzNM8mrFxDBInj0KVPz7QU83amGS4rcv1pWO/QGYQcErfskcN84TAdMegaRWWCmA==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.0.6.tgz", + "integrity": "sha512-fHtwI5rCe3LmKDoaqlqLAPdNmLrbeCiMYVe+X1BHgApaqNCyAwcuJxuf8Q5R5su7nHiLmlmB74o1ZS/V+0cQ+g==", "dev": true, "license": "MIT", "dependencies": { @@ -1819,14 +1819,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.0.5", + "@angular/compiler": "19.0.6", "typescript": ">=5.5 <5.7" } }, "node_modules/@angular/core": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.0.5.tgz", - "integrity": "sha512-Ywc6sPO6G/Y1stfk3y/MallV/h0yzQ0vdOHRWueLrk5kD1DTdbolV4X03Cs3PuVvravgcSVE3nnuuHFuH32emQ==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.0.6.tgz", + "integrity": "sha512-9N7FmdRHtS7zfXC/wnyap/reX7fgiOrWpVivayHjWP4RkLYXJAzJIpLyew0jrx4vf8r3lZnC0Zmq0PW007Ngjw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1840,9 +1840,9 @@ } }, "node_modules/@angular/forms": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.0.5.tgz", - "integrity": "sha512-OhNFkfOoguqCDq07vNBV28FFrmTM8S11Z3Cd6PQZJJF9TgAtpV5KtF7A3eXBCN92W4pmqluomPjfK7YyImzIYQ==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.0.6.tgz", + "integrity": "sha512-HogauPvgDQHw2xxqKBaFgKTRRcc1xWeI/PByDCf3U6YsaqpF53Mz2CJh8X2bg2bY1RGKb67MZw7DBGFRvXx4bg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1851,16 +1851,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.5", - "@angular/core": "19.0.5", - "@angular/platform-browser": "19.0.5", + "@angular/common": "19.0.6", + "@angular/core": "19.0.6", + "@angular/platform-browser": "19.0.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.0.5.tgz", - "integrity": "sha512-41+Jo5DEil4Ifvv+UE/p1l9YJtYN+xfhx+/C9cahVgvV5D2q+givyK73d0Mnb6XOfe1q+hoV5lZ+XhQYp21//g==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.0.6.tgz", + "integrity": "sha512-MWiToGy7Pa0rR61sgnEuu7dfZXpAw0g7nkSnw4xdjUf974OOOfI1LS9O9YevJibtdW8sPa1HaoXXwcb7N03B5A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1869,9 +1869,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "19.0.5", - "@angular/common": "19.0.5", - "@angular/core": "19.0.5" + "@angular/animations": "19.0.6", + "@angular/common": "19.0.6", + "@angular/core": "19.0.6" }, "peerDependenciesMeta": { "@angular/animations": { @@ -1880,9 +1880,9 @@ } }, "node_modules/@angular/router": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.0.5.tgz", - "integrity": "sha512-6tNubVVj/rRyTg+OXjQxACfufvCLHAwDQtv9wqt6q/3OYSnysHTik3ho3FaFPwu7fXJ+6p9Rjzkh2VY9QMk4bw==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.0.6.tgz", + "integrity": "sha512-G1oz+TclPk48h6b6B4s5J3DfrDVJrrxKOA+KWeVQP4e1B8ld7/dCMf5nn3yqS4BGs4yLecxMxyvbOvOiZ//lxw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1891,9 +1891,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.5", - "@angular/core": "19.0.5", - "@angular/platform-browser": "19.0.5", + "@angular/common": "19.0.6", + "@angular/core": "19.0.6", + "@angular/platform-browser": "19.0.6", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -1913,9 +1913,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", + "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", "dev": true, "license": "MIT", "engines": { @@ -2001,13 +2001,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "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.25.9", + "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -2164,9 +2164,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, "license": "MIT", "engines": { @@ -2192,15 +2192,15 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", - "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", + "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-member-expression-to-functions": "^7.25.9", "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/traverse": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -2296,13 +2296,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", + "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.3" + "@babel/types": "^7.26.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -2510,13 +2510,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", - "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", + "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -2930,13 +2930,13 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", - "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", + "version": "7.26.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", + "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -3463,17 +3463,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz", + "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.5", "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", + "@babel/types": "^7.26.5", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -3482,14 +3482,14 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", + "@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" @@ -3499,9 +3499,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", + "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", "dev": true, "license": "MIT", "dependencies": { @@ -3965,9 +3965,9 @@ } }, "node_modules/@inquirer/core": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.2.tgz", - "integrity": "sha512-bHd96F3ezHg1mf/J0Rb4CV8ndCN0v28kUlrHqP7+ECm1C/A+paB7Xh2lbMk6x+kweQC+rZOxM/YeKikzxco8bQ==", + "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": { @@ -3999,9 +3999,9 @@ } }, "node_modules/@inquirer/core/node_modules/@types/node": { - "version": "22.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz", - "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", + "version": "22.10.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.6.tgz", + "integrity": "sha512-qNiuwC4ZDAUNcY47xgaSuS92cjf8JbSUoaKS77bmLG1rU7MlATVSiw/IlrjtIyyskXBZ8KkNfjK/P5na7rgXbQ==", "dev": true, "license": "MIT", "peer": true, @@ -4804,9 +4804,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.0.6.tgz", - "integrity": "sha512-eWrIb0tS1CK6+JvFS4GgTD4fN9TtmApKrlaj3pPQXKXKKd42361ec85fuQQXdb4G8eEEq0vyd/bn4NJllh/3vw==", + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.0.7.tgz", + "integrity": "sha512-jWyMuqtLKZB8Jnuqo27mG2cCQdl71lhM1oEdq3x7Z/QOrm2I+8EfyAzOLxB1f1vXt85O1bz3nf66CkuVCVGGTQ==", "dev": true, "license": "MIT", "engines": { @@ -5731,14 +5731,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.0.6.tgz", - "integrity": "sha512-HicclmbW/+mlljU7a4PzbyIWG+7tognoL5LsgMFJQUDzJXHNjRt1riL0vk57o8Pcprnz9FheeWZXO1KRhXkQuw==", + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.0.7.tgz", + "integrity": "sha512-1WtTqKFPuEaV99VIP+y/gf/XW3TVJh/NbJbbEF4qYpp7qQiJ4ntF4klVZmsJcQzFucZSzlg91QVMPQKev5WZGA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", - "@angular-devkit/schematics": "19.0.6", + "@angular-devkit/core": "19.0.7", + "@angular-devkit/schematics": "19.0.7", "jsonc-parser": "3.3.1" }, "engines": { @@ -5771,13 +5771,13 @@ } }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", - "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.3.tgz", + "integrity": "sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@sigstore/sign": { @@ -6027,9 +6027,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.3.tgz", - "integrity": "sha512-JEhMNwUJt7bw728CydvYzntD0XJeTmDnvwLlbfbAhE7Tbslm/ax6bdIiUwTgeVlZTsJQPwZwKpAkyDtIjsvx3g==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.4.tgz", + "integrity": "sha512-5kz9ScmzBdzTgB/3susoCgfqNDzBjvLL4taparufgSvlwjdLy6UyUy9T/tCpYd2GIdIilCatC4iSQS0QSYHt0w==", "dev": true, "license": "MIT", "dependencies": { @@ -6115,9 +6115,9 @@ "license": "MIT" }, "node_modules/@types/qs": { - "version": "6.9.17", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", - "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", + "version": "6.9.18", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", + "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", "dev": true, "license": "MIT" }, @@ -7068,9 +7068,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", - "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ { @@ -7389,9 +7389,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001690", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", - "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", + "version": "1.0.30001692", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz", + "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==", "dev": true, "funding": [ { @@ -8051,13 +8051,13 @@ } }, "node_modules/core-js-compat": { - "version": "3.39.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", - "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.40.0.tgz", + "integrity": "sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.24.2" + "browserslist": "^4.24.3" }, "funding": { "type": "opencollective", @@ -8531,9 +8531,9 @@ } }, "node_modules/domutils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.1.tgz", - "integrity": "sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -8593,9 +8593,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.76", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz", - "integrity": "sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==", + "version": "1.5.82", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.82.tgz", + "integrity": "sha512-Zq16uk1hfQhyGx5GpwPAYDwddJuSGhtRhgOA2mCxANYaDT79nAeGnaXogMGng4KqLaJUVnOnuL0+TDop9nLOiA==", "dev": true, "license": "ISC" }, @@ -8826,9 +8826,9 @@ "license": "MIT" }, "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.0.tgz", + "integrity": "sha512-Ujz8Al/KfOVR7fkaghAB1WvnLsdYxHDWmfoi2vlA2jZWRg31XhIC1a4B+/I24muD8iSbHxJ1JkrfqmWb65P/Mw==", "dev": true, "license": "MIT", "dependencies": { @@ -10012,9 +10012,9 @@ } }, "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==", + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.9.tgz", + "integrity": "sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==", "dev": true, "license": "MIT" }, @@ -11795,9 +11795,9 @@ } }, "node_modules/memfs": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.15.3.tgz", - "integrity": "sha512-vR/g1SgqvKJgAyYla+06G4p/EOcEmwhYuVb1yc1ixcKf8o/sh7Zngv63957ZSNd1xrZJoinmNyDf2LzuP8WJXw==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.0.tgz", + "integrity": "sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -14083,13 +14083,13 @@ } }, "node_modules/readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz", + "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 14.16.0" + "node": ">= 14.18.0" }, "funding": { "type": "individual", @@ -16320,9 +16320,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "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, "funding": [ { @@ -16341,7 +16341,7 @@ "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" diff --git a/adev/src/content/tutorials/homepage/package-lock.json b/adev/src/content/tutorials/homepage/package-lock.json index 905976928e16..7d99537eb96f 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.1900.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1900.6.tgz", - "integrity": "sha512-w11bAXQnNWBawTJfQPjvaTRrzrqsOUm9tK9WNvaia/xjiRFpmO0CfmKtn3axNSEJM8jb/czaNQrgTwG+TGc/8g==", + "version": "0.1900.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1900.7.tgz", + "integrity": "sha512-3dRV0IB+MbNYbAGbYEFMcABkMphqcTvn5MG79dQkwcf2a9QZxCq2slwf/rIleWoDUcFm9r1NnVPYrTYNYJaqQg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", + "@angular-devkit/core": "19.0.7", "rxjs": "7.8.1" }, "engines": { @@ -55,9 +55,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.6.tgz", - "integrity": "sha512-WUWJhzQDsovfMY6jtb9Ktz/5sJszsaErj+XV2aXab85f1OweI/Iv2urPZnJwUSilvVN5Ok/fy3IJ6SuihK4Ceg==", + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.7.tgz", + "integrity": "sha512-VyuORSitT6LIaGUEF0KEnv2TwNaeWl6L3/4L4stok0BJ23B4joVca2DYVcrLC1hSzz8V4dwVgSlbNIgjgGdVpg==", "dev": true, "license": "MIT", "dependencies": { @@ -83,13 +83,13 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.6.tgz", - "integrity": "sha512-R9hlHfAh1HKoIWgnYJlOEKhUezhTNl0fpUmHxG2252JSY5FLRxmYArTtJYYmbNdBbsBLNg3UHyM/GBPvJSA3NQ==", + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.7.tgz", + "integrity": "sha512-BHXQv6kMc9xo4TH9lhwMv8nrZXHkLioQvLun2qYjwvOsyzt3qd+sUM9wpHwbG6t+01+FIQ05iNN9ox+Cvpndgg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", + "@angular-devkit/core": "19.0.7", "jsonc-parser": "3.3.1", "magic-string": "0.30.12", "ora": "5.4.1", @@ -102,14 +102,14 @@ } }, "node_modules/@angular/build": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.0.6.tgz", - "integrity": "sha512-KEVNLgTZUF2dfpOYQn+yR2HONHUTxq/2rFVhiK9qAvrm/m+uKJNEXx7hGtbRyoqenZff4ScJq+7feITUldfX8g==", + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.0.7.tgz", + "integrity": "sha512-AFvhRa6sfXG8NmS8AN7TvE8q2kVcMw+zXMZzo981cqwnOwJy4VHU0htqm5OZQnohVJM0pP8SBAuROWO4yRrxCA==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1900.6", + "@angular-devkit/architect": "0.1900.7", "@babel/core": "7.26.0", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", @@ -148,7 +148,7 @@ "@angular/localize": "^19.0.0", "@angular/platform-server": "^19.0.0", "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.0.6", + "@angular/ssr": "^19.0.7", "less": "^4.2.0", "postcss": "^8.4.0", "tailwindcss": "^2.0.0 || ^3.0.0", @@ -179,18 +179,18 @@ } }, "node_modules/@angular/cli": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.0.6.tgz", - "integrity": "sha512-ZEHhgRRVIdn10dbsAjB8TE9Co32hfuL9/im5Jcfa1yrn6KJefmigz6KN8Xu7FXMH5FkdqfQ11QpLBxJSPb9aww==", + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.0.7.tgz", + "integrity": "sha512-y6C4B4XdiZwe2+OADLWXyKqUVvW/XDzTuJ2mZ5PhTnSiiXDN4zRWId1F5wA8ve8vlbUKApPHXRQuaqiQJmA24g==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1900.6", - "@angular-devkit/core": "19.0.6", - "@angular-devkit/schematics": "19.0.6", + "@angular-devkit/architect": "0.1900.7", + "@angular-devkit/core": "19.0.7", + "@angular-devkit/schematics": "19.0.7", "@inquirer/prompts": "7.1.0", "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.0.6", + "@schematics/angular": "19.0.7", "@yarnpkg/lockfile": "1.1.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", @@ -213,9 +213,9 @@ } }, "node_modules/@angular/common": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.0.5.tgz", - "integrity": "sha512-fFK+euCj1AjBHBCpj9VnduMSeqoMRhZZHbhPYiND7tucRRJ8vwGU0sYK2KI/Ko+fsrNIXL/0O4F36jVPl09Smg==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.0.6.tgz", + "integrity": "sha512-r9IDD0+UGkrQkjyX+pApeDmIJ9INpr1uYlgmmlWNBJCVNr9SKKIVZV60sssgadew6bGynKN9dW4mGsmEzzb5BA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -224,14 +224,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.5", + "@angular/core": "19.0.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.0.5.tgz", - "integrity": "sha512-S8ku5Ljp0kqX3shfmE9DVo09629jeYJSlBRGbj2Glb92dd+VQZPOz7KxqKRTwmAl7lQIV/+4Lr6G/GVTsoC4vg==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.0.6.tgz", + "integrity": "sha512-g8A6QOsiCJnRi5Hz0sASIpRQoAGxEgnjz0JanfrMNRedY4MpdIS1V0AeCSKTsMRlV7tQl3ng2Gse/tsb51HI3Q==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -240,7 +240,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.5" + "@angular/core": "19.0.6" }, "peerDependenciesMeta": { "@angular/core": { @@ -249,9 +249,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.0.5.tgz", - "integrity": "sha512-KSzuWCTZlvJsoAenxM9cjTOzNM8mrFxDBInj0KVPz7QU83amGS4rcv1pWO/QGYQcErfskcN84TAdMegaRWWCmA==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.0.6.tgz", + "integrity": "sha512-fHtwI5rCe3LmKDoaqlqLAPdNmLrbeCiMYVe+X1BHgApaqNCyAwcuJxuf8Q5R5su7nHiLmlmB74o1ZS/V+0cQ+g==", "dev": true, "license": "MIT", "dependencies": { @@ -273,14 +273,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.0.5", + "@angular/compiler": "19.0.6", "typescript": ">=5.5 <5.7" } }, "node_modules/@angular/core": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.0.5.tgz", - "integrity": "sha512-Ywc6sPO6G/Y1stfk3y/MallV/h0yzQ0vdOHRWueLrk5kD1DTdbolV4X03Cs3PuVvravgcSVE3nnuuHFuH32emQ==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.0.6.tgz", + "integrity": "sha512-9N7FmdRHtS7zfXC/wnyap/reX7fgiOrWpVivayHjWP4RkLYXJAzJIpLyew0jrx4vf8r3lZnC0Zmq0PW007Ngjw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -294,9 +294,9 @@ } }, "node_modules/@angular/forms": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.0.5.tgz", - "integrity": "sha512-OhNFkfOoguqCDq07vNBV28FFrmTM8S11Z3Cd6PQZJJF9TgAtpV5KtF7A3eXBCN92W4pmqluomPjfK7YyImzIYQ==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.0.6.tgz", + "integrity": "sha512-HogauPvgDQHw2xxqKBaFgKTRRcc1xWeI/PByDCf3U6YsaqpF53Mz2CJh8X2bg2bY1RGKb67MZw7DBGFRvXx4bg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -305,16 +305,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.5", - "@angular/core": "19.0.5", - "@angular/platform-browser": "19.0.5", + "@angular/common": "19.0.6", + "@angular/core": "19.0.6", + "@angular/platform-browser": "19.0.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.0.5.tgz", - "integrity": "sha512-41+Jo5DEil4Ifvv+UE/p1l9YJtYN+xfhx+/C9cahVgvV5D2q+givyK73d0Mnb6XOfe1q+hoV5lZ+XhQYp21//g==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.0.6.tgz", + "integrity": "sha512-MWiToGy7Pa0rR61sgnEuu7dfZXpAw0g7nkSnw4xdjUf974OOOfI1LS9O9YevJibtdW8sPa1HaoXXwcb7N03B5A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -323,9 +323,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "19.0.5", - "@angular/common": "19.0.5", - "@angular/core": "19.0.5" + "@angular/animations": "19.0.6", + "@angular/common": "19.0.6", + "@angular/core": "19.0.6" }, "peerDependenciesMeta": { "@angular/animations": { @@ -349,9 +349,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", + "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", "dev": true, "license": "MIT", "engines": { @@ -407,14 +407,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", + "@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" @@ -437,13 +437,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "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.25.9", + "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -496,9 +496,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, "license": "MIT", "engines": { @@ -563,13 +563,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", + "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.3" + "@babel/types": "^7.26.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -610,17 +610,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz", + "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.5", "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", + "@babel/types": "^7.26.5", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -629,9 +629,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", + "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", "dev": true, "license": "MIT", "dependencies": { @@ -1051,13 +1051,13 @@ } }, "node_modules/@inquirer/checkbox": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.4.tgz", - "integrity": "sha512-fYAKCAcGNMdfjL6hZTRUwkIByQ8EIZCXKrIQZH7XjADnN/xvRUhj8UdBbpC4zoUzvChhkSC/zRKaP/tDs3dZpg==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.6.tgz", + "integrity": "sha512-PgP35JfmGjHU0LSXOyRew0zHuA9N6OJwOlos1fZ20b7j8ISeAdib3L+n0jIxBtX958UeEpte6xhG/gxJ5iUqMw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/figures": "^1.0.9", "@inquirer/type": "^3.0.2", "ansi-escapes": "^4.3.2", @@ -1088,9 +1088,9 @@ } }, "node_modules/@inquirer/core": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.2.tgz", - "integrity": "sha512-bHd96F3ezHg1mf/J0Rb4CV8ndCN0v28kUlrHqP7+ECm1C/A+paB7Xh2lbMk6x+kweQC+rZOxM/YeKikzxco8bQ==", + "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": { @@ -1109,13 +1109,13 @@ } }, "node_modules/@inquirer/editor": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.1.tgz", - "integrity": "sha512-xn9aDaiP6nFa432i68JCaL302FyL6y/6EG97nAtfIPnWZ+mWPgCMLGc4XZ2QQMsZtu9q3Jd5AzBPjXh10aX9kA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.3.tgz", + "integrity": "sha512-S9KnIOJuTZpb9upeRSBBhoDZv7aSV3pG9TECrBj0f+ZsFwccz886hzKBrChGrXMJwd4NKY+pOA9Vy72uqnd6Eg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2", "external-editor": "^3.1.0" }, @@ -1127,13 +1127,13 @@ } }, "node_modules/@inquirer/expand": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.4.tgz", - "integrity": "sha512-GYocr+BPyxKPxQ4UZyNMqZFSGKScSUc0Vk17II3J+0bDcgGsQm0KYQNooN1Q5iBfXsy3x/VWmHGh20QnzsaHwg==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.6.tgz", + "integrity": "sha512-TRTfi1mv1GeIZGyi9PQmvAaH65ZlG4/FACq6wSzs7Vvf1z5dnNWsAAXBjWMHt76l+1hUY8teIqJFrWBk5N6gsg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2", "yoctocolors-cjs": "^2.1.2" }, @@ -1155,13 +1155,13 @@ } }, "node_modules/@inquirer/input": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.1.tgz", - "integrity": "sha512-nAXAHQndZcXB+7CyjIW3XuQZZHbQQ0q8LX6miY6bqAWwDzNa9JUioDBYrFmOUNIsuF08o1WT/m2gbBXvBhYVxg==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.3.tgz", + "integrity": "sha512-zeo++6f7hxaEe7OjtMzdGZPHiawsfmCZxWB9X1NpmYgbeoyerIbWemvlBxxl+sQIlHC0WuSAG19ibMq3gbhaqQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2" }, "engines": { @@ -1172,13 +1172,13 @@ } }, "node_modules/@inquirer/number": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.4.tgz", - "integrity": "sha512-DX7a6IXRPU0j8kr2ovf+QaaDiIf+zEKaZVzCWdLOTk7XigqSXvoh4cul7x68xp54WTQrgSnW7P1WBJDbyY3GhA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.6.tgz", + "integrity": "sha512-xO07lftUHk1rs1gR0KbqB+LJPhkUNkyzV/KhH+937hdkMazmAYHLm1OIrNKpPelppeV1FgWrgFDjdUD8mM+XUg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2" }, "engines": { @@ -1189,13 +1189,13 @@ } }, "node_modules/@inquirer/password": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.4.tgz", - "integrity": "sha512-wiliQOWdjM8FnBmdIHtQV2Ca3S1+tMBUerhyjkRCv1g+4jSvEweGu9GCcvVEgKDhTBT15nrxvk5/bVrGUqSs1w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.6.tgz", + "integrity": "sha512-QLF0HmMpHZPPMp10WGXh6F+ZPvzWE7LX6rNoccdktv/Rov0B+0f+eyXkAcgqy5cH9V+WSpbLxu2lo3ysEVK91w==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2", "ansi-escapes": "^4.3.2" }, @@ -1232,13 +1232,13 @@ } }, "node_modules/@inquirer/rawlist": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.4.tgz", - "integrity": "sha512-IsVN2EZdNHsmFdKWx9HaXb8T/s3FlR/U1QPt9dwbSyPtjFbMTlW9CRFvnn0bm/QIsrMRD2oMZqrQpSWPQVbXXg==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.6.tgz", + "integrity": "sha512-QoE4s1SsIPx27FO4L1b1mUjVcoHm1pWE/oCmm4z/Hl+V1Aw5IXl8FYYzGmfXaBT0l/sWr49XmNSiq7kg3Kd/Lg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2", "yoctocolors-cjs": "^2.1.2" }, @@ -1250,13 +1250,13 @@ } }, "node_modules/@inquirer/search": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.4.tgz", - "integrity": "sha512-tSkJk2SDmC2MEdTIjknXWmCnmPr5owTs9/xjfa14ol1Oh95n6xW7SYn5fiPk4/vrJPys0ggSWiISdPze4LTa7A==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/figures": "^1.0.9", "@inquirer/type": "^3.0.2", "yoctocolors-cjs": "^2.1.2" @@ -1269,13 +1269,13 @@ } }, "node_modules/@inquirer/select": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.4.tgz", - "integrity": "sha512-ZzYLuLoUzTIW9EJm++jBpRiTshGqS3Q1o5qOEQqgzaBlmdsjQr6pA4TUNkwu6OBYgM2mIRbCz6mUhFDfl/GF+w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.6.tgz", + "integrity": "sha512-yANzIiNZ8fhMm4NORm+a74+KFYHmf7BZphSOBovIzYPVLquseTGEkU5l2UTnBOf5k0VLmTgPighNDLE9QtbViQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/figures": "^1.0.9", "@inquirer/type": "^3.0.2", "ansi-escapes": "^4.3.2", @@ -2778,14 +2778,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.0.6.tgz", - "integrity": "sha512-HicclmbW/+mlljU7a4PzbyIWG+7tognoL5LsgMFJQUDzJXHNjRt1riL0vk57o8Pcprnz9FheeWZXO1KRhXkQuw==", + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.0.7.tgz", + "integrity": "sha512-1WtTqKFPuEaV99VIP+y/gf/XW3TVJh/NbJbbEF4qYpp7qQiJ4ntF4klVZmsJcQzFucZSzlg91QVMPQKev5WZGA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", - "@angular-devkit/schematics": "19.0.6", + "@angular-devkit/core": "19.0.7", + "@angular-devkit/schematics": "19.0.7", "jsonc-parser": "3.3.1" }, "engines": { @@ -2818,13 +2818,13 @@ } }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", - "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.3.tgz", + "integrity": "sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@sigstore/sign": { @@ -2906,9 +2906,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz", - "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", + "version": "22.10.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.6.tgz", + "integrity": "sha512-qNiuwC4ZDAUNcY47xgaSuS92cjf8JbSUoaKS77bmLG1rU7MlATVSiw/IlrjtIyyskXBZ8KkNfjK/P5na7rgXbQ==", "dev": true, "license": "MIT", "peer": true, @@ -3121,9 +3121,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", - "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ { @@ -3264,9 +3264,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001690", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", - "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", + "version": "1.0.30001692", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz", + "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==", "dev": true, "funding": [ { @@ -3654,9 +3654,9 @@ } }, "node_modules/domutils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.1.tgz", - "integrity": "sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -3676,9 +3676,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.76", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz", - "integrity": "sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==", + "version": "1.5.82", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.82.tgz", + "integrity": "sha512-Zq16uk1hfQhyGx5GpwPAYDwddJuSGhtRhgOA2mCxANYaDT79nAeGnaXogMGng4KqLaJUVnOnuL0+TDop9nLOiA==", "dev": true, "license": "ISC" }, @@ -5606,9 +5606,9 @@ } }, "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", + "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", "dev": true, "funding": [ { @@ -5626,7 +5626,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", + "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -5709,13 +5709,13 @@ } }, "node_modules/readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz", + "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 14.16.0" + "node": ">= 14.18.0" }, "funding": { "type": "individual", @@ -6512,9 +6512,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "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, "funding": [ { @@ -6533,7 +6533,7 @@ "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" 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 b39c3cc8971e..734e85fab027 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.1900.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1900.6.tgz", - "integrity": "sha512-w11bAXQnNWBawTJfQPjvaTRrzrqsOUm9tK9WNvaia/xjiRFpmO0CfmKtn3axNSEJM8jb/czaNQrgTwG+TGc/8g==", + "version": "0.1900.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1900.7.tgz", + "integrity": "sha512-3dRV0IB+MbNYbAGbYEFMcABkMphqcTvn5MG79dQkwcf2a9QZxCq2slwf/rIleWoDUcFm9r1NnVPYrTYNYJaqQg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", + "@angular-devkit/core": "19.0.7", "rxjs": "7.8.1" }, "engines": { @@ -56,9 +56,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.6.tgz", - "integrity": "sha512-WUWJhzQDsovfMY6jtb9Ktz/5sJszsaErj+XV2aXab85f1OweI/Iv2urPZnJwUSilvVN5Ok/fy3IJ6SuihK4Ceg==", + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.7.tgz", + "integrity": "sha512-VyuORSitT6LIaGUEF0KEnv2TwNaeWl6L3/4L4stok0BJ23B4joVca2DYVcrLC1hSzz8V4dwVgSlbNIgjgGdVpg==", "dev": true, "license": "MIT", "dependencies": { @@ -84,13 +84,13 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.6.tgz", - "integrity": "sha512-R9hlHfAh1HKoIWgnYJlOEKhUezhTNl0fpUmHxG2252JSY5FLRxmYArTtJYYmbNdBbsBLNg3UHyM/GBPvJSA3NQ==", + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.7.tgz", + "integrity": "sha512-BHXQv6kMc9xo4TH9lhwMv8nrZXHkLioQvLun2qYjwvOsyzt3qd+sUM9wpHwbG6t+01+FIQ05iNN9ox+Cvpndgg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", + "@angular-devkit/core": "19.0.7", "jsonc-parser": "3.3.1", "magic-string": "0.30.12", "ora": "5.4.1", @@ -103,14 +103,14 @@ } }, "node_modules/@angular/build": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.0.6.tgz", - "integrity": "sha512-KEVNLgTZUF2dfpOYQn+yR2HONHUTxq/2rFVhiK9qAvrm/m+uKJNEXx7hGtbRyoqenZff4ScJq+7feITUldfX8g==", + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.0.7.tgz", + "integrity": "sha512-AFvhRa6sfXG8NmS8AN7TvE8q2kVcMw+zXMZzo981cqwnOwJy4VHU0htqm5OZQnohVJM0pP8SBAuROWO4yRrxCA==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1900.6", + "@angular-devkit/architect": "0.1900.7", "@babel/core": "7.26.0", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", @@ -149,7 +149,7 @@ "@angular/localize": "^19.0.0", "@angular/platform-server": "^19.0.0", "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.0.6", + "@angular/ssr": "^19.0.7", "less": "^4.2.0", "postcss": "^8.4.0", "tailwindcss": "^2.0.0 || ^3.0.0", @@ -180,18 +180,18 @@ } }, "node_modules/@angular/cli": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.0.6.tgz", - "integrity": "sha512-ZEHhgRRVIdn10dbsAjB8TE9Co32hfuL9/im5Jcfa1yrn6KJefmigz6KN8Xu7FXMH5FkdqfQ11QpLBxJSPb9aww==", + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.0.7.tgz", + "integrity": "sha512-y6C4B4XdiZwe2+OADLWXyKqUVvW/XDzTuJ2mZ5PhTnSiiXDN4zRWId1F5wA8ve8vlbUKApPHXRQuaqiQJmA24g==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1900.6", - "@angular-devkit/core": "19.0.6", - "@angular-devkit/schematics": "19.0.6", + "@angular-devkit/architect": "0.1900.7", + "@angular-devkit/core": "19.0.7", + "@angular-devkit/schematics": "19.0.7", "@inquirer/prompts": "7.1.0", "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.0.6", + "@schematics/angular": "19.0.7", "@yarnpkg/lockfile": "1.1.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", @@ -214,9 +214,9 @@ } }, "node_modules/@angular/common": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.0.5.tgz", - "integrity": "sha512-fFK+euCj1AjBHBCpj9VnduMSeqoMRhZZHbhPYiND7tucRRJ8vwGU0sYK2KI/Ko+fsrNIXL/0O4F36jVPl09Smg==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.0.6.tgz", + "integrity": "sha512-r9IDD0+UGkrQkjyX+pApeDmIJ9INpr1uYlgmmlWNBJCVNr9SKKIVZV60sssgadew6bGynKN9dW4mGsmEzzb5BA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -225,14 +225,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.5", + "@angular/core": "19.0.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.0.5.tgz", - "integrity": "sha512-S8ku5Ljp0kqX3shfmE9DVo09629jeYJSlBRGbj2Glb92dd+VQZPOz7KxqKRTwmAl7lQIV/+4Lr6G/GVTsoC4vg==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.0.6.tgz", + "integrity": "sha512-g8A6QOsiCJnRi5Hz0sASIpRQoAGxEgnjz0JanfrMNRedY4MpdIS1V0AeCSKTsMRlV7tQl3ng2Gse/tsb51HI3Q==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -241,7 +241,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.5" + "@angular/core": "19.0.6" }, "peerDependenciesMeta": { "@angular/core": { @@ -250,9 +250,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.0.5.tgz", - "integrity": "sha512-KSzuWCTZlvJsoAenxM9cjTOzNM8mrFxDBInj0KVPz7QU83amGS4rcv1pWO/QGYQcErfskcN84TAdMegaRWWCmA==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.0.6.tgz", + "integrity": "sha512-fHtwI5rCe3LmKDoaqlqLAPdNmLrbeCiMYVe+X1BHgApaqNCyAwcuJxuf8Q5R5su7nHiLmlmB74o1ZS/V+0cQ+g==", "dev": true, "license": "MIT", "dependencies": { @@ -274,14 +274,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.0.5", + "@angular/compiler": "19.0.6", "typescript": ">=5.5 <5.7" } }, "node_modules/@angular/core": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.0.5.tgz", - "integrity": "sha512-Ywc6sPO6G/Y1stfk3y/MallV/h0yzQ0vdOHRWueLrk5kD1DTdbolV4X03Cs3PuVvravgcSVE3nnuuHFuH32emQ==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.0.6.tgz", + "integrity": "sha512-9N7FmdRHtS7zfXC/wnyap/reX7fgiOrWpVivayHjWP4RkLYXJAzJIpLyew0jrx4vf8r3lZnC0Zmq0PW007Ngjw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -295,9 +295,9 @@ } }, "node_modules/@angular/forms": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.0.5.tgz", - "integrity": "sha512-OhNFkfOoguqCDq07vNBV28FFrmTM8S11Z3Cd6PQZJJF9TgAtpV5KtF7A3eXBCN92W4pmqluomPjfK7YyImzIYQ==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.0.6.tgz", + "integrity": "sha512-HogauPvgDQHw2xxqKBaFgKTRRcc1xWeI/PByDCf3U6YsaqpF53Mz2CJh8X2bg2bY1RGKb67MZw7DBGFRvXx4bg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -306,16 +306,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.5", - "@angular/core": "19.0.5", - "@angular/platform-browser": "19.0.5", + "@angular/common": "19.0.6", + "@angular/core": "19.0.6", + "@angular/platform-browser": "19.0.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.0.5.tgz", - "integrity": "sha512-41+Jo5DEil4Ifvv+UE/p1l9YJtYN+xfhx+/C9cahVgvV5D2q+givyK73d0Mnb6XOfe1q+hoV5lZ+XhQYp21//g==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.0.6.tgz", + "integrity": "sha512-MWiToGy7Pa0rR61sgnEuu7dfZXpAw0g7nkSnw4xdjUf974OOOfI1LS9O9YevJibtdW8sPa1HaoXXwcb7N03B5A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -324,9 +324,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "19.0.5", - "@angular/common": "19.0.5", - "@angular/core": "19.0.5" + "@angular/animations": "19.0.6", + "@angular/common": "19.0.6", + "@angular/core": "19.0.6" }, "peerDependenciesMeta": { "@angular/animations": { @@ -335,9 +335,9 @@ } }, "node_modules/@angular/router": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.0.5.tgz", - "integrity": "sha512-6tNubVVj/rRyTg+OXjQxACfufvCLHAwDQtv9wqt6q/3OYSnysHTik3ho3FaFPwu7fXJ+6p9Rjzkh2VY9QMk4bw==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.0.6.tgz", + "integrity": "sha512-G1oz+TclPk48h6b6B4s5J3DfrDVJrrxKOA+KWeVQP4e1B8ld7/dCMf5nn3yqS4BGs4yLecxMxyvbOvOiZ//lxw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -346,9 +346,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.5", - "@angular/core": "19.0.5", - "@angular/platform-browser": "19.0.5", + "@angular/common": "19.0.6", + "@angular/core": "19.0.6", + "@angular/platform-browser": "19.0.6", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -368,9 +368,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", + "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", "dev": true, "license": "MIT", "engines": { @@ -426,14 +426,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", + "@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" @@ -456,13 +456,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "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.25.9", + "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -515,9 +515,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, "license": "MIT", "engines": { @@ -582,13 +582,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", + "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.3" + "@babel/types": "^7.26.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -629,17 +629,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz", + "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.5", "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", + "@babel/types": "^7.26.5", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -648,9 +648,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", + "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", "dev": true, "license": "MIT", "dependencies": { @@ -1070,13 +1070,13 @@ } }, "node_modules/@inquirer/checkbox": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.4.tgz", - "integrity": "sha512-fYAKCAcGNMdfjL6hZTRUwkIByQ8EIZCXKrIQZH7XjADnN/xvRUhj8UdBbpC4zoUzvChhkSC/zRKaP/tDs3dZpg==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.6.tgz", + "integrity": "sha512-PgP35JfmGjHU0LSXOyRew0zHuA9N6OJwOlos1fZ20b7j8ISeAdib3L+n0jIxBtX958UeEpte6xhG/gxJ5iUqMw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/figures": "^1.0.9", "@inquirer/type": "^3.0.2", "ansi-escapes": "^4.3.2", @@ -1107,9 +1107,9 @@ } }, "node_modules/@inquirer/core": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.2.tgz", - "integrity": "sha512-bHd96F3ezHg1mf/J0Rb4CV8ndCN0v28kUlrHqP7+ECm1C/A+paB7Xh2lbMk6x+kweQC+rZOxM/YeKikzxco8bQ==", + "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": { @@ -1128,13 +1128,13 @@ } }, "node_modules/@inquirer/editor": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.1.tgz", - "integrity": "sha512-xn9aDaiP6nFa432i68JCaL302FyL6y/6EG97nAtfIPnWZ+mWPgCMLGc4XZ2QQMsZtu9q3Jd5AzBPjXh10aX9kA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.3.tgz", + "integrity": "sha512-S9KnIOJuTZpb9upeRSBBhoDZv7aSV3pG9TECrBj0f+ZsFwccz886hzKBrChGrXMJwd4NKY+pOA9Vy72uqnd6Eg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2", "external-editor": "^3.1.0" }, @@ -1146,13 +1146,13 @@ } }, "node_modules/@inquirer/expand": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.4.tgz", - "integrity": "sha512-GYocr+BPyxKPxQ4UZyNMqZFSGKScSUc0Vk17II3J+0bDcgGsQm0KYQNooN1Q5iBfXsy3x/VWmHGh20QnzsaHwg==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.6.tgz", + "integrity": "sha512-TRTfi1mv1GeIZGyi9PQmvAaH65ZlG4/FACq6wSzs7Vvf1z5dnNWsAAXBjWMHt76l+1hUY8teIqJFrWBk5N6gsg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2", "yoctocolors-cjs": "^2.1.2" }, @@ -1174,13 +1174,13 @@ } }, "node_modules/@inquirer/input": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.1.tgz", - "integrity": "sha512-nAXAHQndZcXB+7CyjIW3XuQZZHbQQ0q8LX6miY6bqAWwDzNa9JUioDBYrFmOUNIsuF08o1WT/m2gbBXvBhYVxg==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.3.tgz", + "integrity": "sha512-zeo++6f7hxaEe7OjtMzdGZPHiawsfmCZxWB9X1NpmYgbeoyerIbWemvlBxxl+sQIlHC0WuSAG19ibMq3gbhaqQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2" }, "engines": { @@ -1191,13 +1191,13 @@ } }, "node_modules/@inquirer/number": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.4.tgz", - "integrity": "sha512-DX7a6IXRPU0j8kr2ovf+QaaDiIf+zEKaZVzCWdLOTk7XigqSXvoh4cul7x68xp54WTQrgSnW7P1WBJDbyY3GhA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.6.tgz", + "integrity": "sha512-xO07lftUHk1rs1gR0KbqB+LJPhkUNkyzV/KhH+937hdkMazmAYHLm1OIrNKpPelppeV1FgWrgFDjdUD8mM+XUg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2" }, "engines": { @@ -1208,13 +1208,13 @@ } }, "node_modules/@inquirer/password": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.4.tgz", - "integrity": "sha512-wiliQOWdjM8FnBmdIHtQV2Ca3S1+tMBUerhyjkRCv1g+4jSvEweGu9GCcvVEgKDhTBT15nrxvk5/bVrGUqSs1w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.6.tgz", + "integrity": "sha512-QLF0HmMpHZPPMp10WGXh6F+ZPvzWE7LX6rNoccdktv/Rov0B+0f+eyXkAcgqy5cH9V+WSpbLxu2lo3ysEVK91w==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2", "ansi-escapes": "^4.3.2" }, @@ -1251,13 +1251,13 @@ } }, "node_modules/@inquirer/rawlist": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.4.tgz", - "integrity": "sha512-IsVN2EZdNHsmFdKWx9HaXb8T/s3FlR/U1QPt9dwbSyPtjFbMTlW9CRFvnn0bm/QIsrMRD2oMZqrQpSWPQVbXXg==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.6.tgz", + "integrity": "sha512-QoE4s1SsIPx27FO4L1b1mUjVcoHm1pWE/oCmm4z/Hl+V1Aw5IXl8FYYzGmfXaBT0l/sWr49XmNSiq7kg3Kd/Lg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2", "yoctocolors-cjs": "^2.1.2" }, @@ -1269,13 +1269,13 @@ } }, "node_modules/@inquirer/search": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.4.tgz", - "integrity": "sha512-tSkJk2SDmC2MEdTIjknXWmCnmPr5owTs9/xjfa14ol1Oh95n6xW7SYn5fiPk4/vrJPys0ggSWiISdPze4LTa7A==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/figures": "^1.0.9", "@inquirer/type": "^3.0.2", "yoctocolors-cjs": "^2.1.2" @@ -1288,13 +1288,13 @@ } }, "node_modules/@inquirer/select": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.4.tgz", - "integrity": "sha512-ZzYLuLoUzTIW9EJm++jBpRiTshGqS3Q1o5qOEQqgzaBlmdsjQr6pA4TUNkwu6OBYgM2mIRbCz6mUhFDfl/GF+w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.6.tgz", + "integrity": "sha512-yANzIiNZ8fhMm4NORm+a74+KFYHmf7BZphSOBovIzYPVLquseTGEkU5l2UTnBOf5k0VLmTgPighNDLE9QtbViQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/figures": "^1.0.9", "@inquirer/type": "^3.0.2", "ansi-escapes": "^4.3.2", @@ -2797,14 +2797,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.0.6.tgz", - "integrity": "sha512-HicclmbW/+mlljU7a4PzbyIWG+7tognoL5LsgMFJQUDzJXHNjRt1riL0vk57o8Pcprnz9FheeWZXO1KRhXkQuw==", + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.0.7.tgz", + "integrity": "sha512-1WtTqKFPuEaV99VIP+y/gf/XW3TVJh/NbJbbEF4qYpp7qQiJ4ntF4klVZmsJcQzFucZSzlg91QVMPQKev5WZGA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", - "@angular-devkit/schematics": "19.0.6", + "@angular-devkit/core": "19.0.7", + "@angular-devkit/schematics": "19.0.7", "jsonc-parser": "3.3.1" }, "engines": { @@ -2837,13 +2837,13 @@ } }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", - "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.3.tgz", + "integrity": "sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@sigstore/sign": { @@ -2925,9 +2925,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz", - "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", + "version": "22.10.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.6.tgz", + "integrity": "sha512-qNiuwC4ZDAUNcY47xgaSuS92cjf8JbSUoaKS77bmLG1rU7MlATVSiw/IlrjtIyyskXBZ8KkNfjK/P5na7rgXbQ==", "dev": true, "license": "MIT", "peer": true, @@ -3140,9 +3140,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", - "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ { @@ -3283,9 +3283,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001690", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", - "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", + "version": "1.0.30001692", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz", + "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==", "dev": true, "funding": [ { @@ -3673,9 +3673,9 @@ } }, "node_modules/domutils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.1.tgz", - "integrity": "sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -3695,9 +3695,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.76", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz", - "integrity": "sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==", + "version": "1.5.82", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.82.tgz", + "integrity": "sha512-Zq16uk1hfQhyGx5GpwPAYDwddJuSGhtRhgOA2mCxANYaDT79nAeGnaXogMGng4KqLaJUVnOnuL0+TDop9nLOiA==", "dev": true, "license": "ISC" }, @@ -5625,9 +5625,9 @@ } }, "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", + "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", "dev": true, "funding": [ { @@ -5645,7 +5645,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", + "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -5728,13 +5728,13 @@ } }, "node_modules/readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz", + "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 14.16.0" + "node": ">= 14.18.0" }, "funding": { "type": "individual", @@ -6531,9 +6531,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "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, "funding": [ { @@ -6552,7 +6552,7 @@ "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" diff --git a/adev/src/content/tutorials/playground/common/package-lock.json b/adev/src/content/tutorials/playground/common/package-lock.json index c3a4e0217157..1da33db22aa7 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.1900.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1900.6.tgz", - "integrity": "sha512-w11bAXQnNWBawTJfQPjvaTRrzrqsOUm9tK9WNvaia/xjiRFpmO0CfmKtn3axNSEJM8jb/czaNQrgTwG+TGc/8g==", + "version": "0.1900.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1900.7.tgz", + "integrity": "sha512-3dRV0IB+MbNYbAGbYEFMcABkMphqcTvn5MG79dQkwcf2a9QZxCq2slwf/rIleWoDUcFm9r1NnVPYrTYNYJaqQg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", + "@angular-devkit/core": "19.0.7", "rxjs": "7.8.1" }, "engines": { @@ -58,9 +58,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.6.tgz", - "integrity": "sha512-WUWJhzQDsovfMY6jtb9Ktz/5sJszsaErj+XV2aXab85f1OweI/Iv2urPZnJwUSilvVN5Ok/fy3IJ6SuihK4Ceg==", + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.7.tgz", + "integrity": "sha512-VyuORSitT6LIaGUEF0KEnv2TwNaeWl6L3/4L4stok0BJ23B4joVca2DYVcrLC1hSzz8V4dwVgSlbNIgjgGdVpg==", "dev": true, "license": "MIT", "dependencies": { @@ -86,13 +86,13 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.6.tgz", - "integrity": "sha512-R9hlHfAh1HKoIWgnYJlOEKhUezhTNl0fpUmHxG2252JSY5FLRxmYArTtJYYmbNdBbsBLNg3UHyM/GBPvJSA3NQ==", + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.7.tgz", + "integrity": "sha512-BHXQv6kMc9xo4TH9lhwMv8nrZXHkLioQvLun2qYjwvOsyzt3qd+sUM9wpHwbG6t+01+FIQ05iNN9ox+Cvpndgg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", + "@angular-devkit/core": "19.0.7", "jsonc-parser": "3.3.1", "magic-string": "0.30.12", "ora": "5.4.1", @@ -105,9 +105,9 @@ } }, "node_modules/@angular/animations": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.0.5.tgz", - "integrity": "sha512-HCOF2CrhUvjoZWusd4nh32VOxpUrg6bV+3Z8Q36Ix3aZdni8v0qoP2rl5wGbotaPtYg5RtyDH60Z2AOPKqlrZg==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.0.6.tgz", + "integrity": "sha512-dlXrFcw7RQNze1zjmrbwqcFd6zgEuqKwuExtEN1Fy26kQ+wqKIhYO6IG7PZGef53XpwN5DT16yve6UihJ2XeNg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -116,18 +116,18 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.5" + "@angular/core": "19.0.6" } }, "node_modules/@angular/build": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.0.6.tgz", - "integrity": "sha512-KEVNLgTZUF2dfpOYQn+yR2HONHUTxq/2rFVhiK9qAvrm/m+uKJNEXx7hGtbRyoqenZff4ScJq+7feITUldfX8g==", + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.0.7.tgz", + "integrity": "sha512-AFvhRa6sfXG8NmS8AN7TvE8q2kVcMw+zXMZzo981cqwnOwJy4VHU0htqm5OZQnohVJM0pP8SBAuROWO4yRrxCA==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1900.6", + "@angular-devkit/architect": "0.1900.7", "@babel/core": "7.26.0", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", @@ -166,7 +166,7 @@ "@angular/localize": "^19.0.0", "@angular/platform-server": "^19.0.0", "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.0.6", + "@angular/ssr": "^19.0.7", "less": "^4.2.0", "postcss": "^8.4.0", "tailwindcss": "^2.0.0 || ^3.0.0", @@ -197,9 +197,9 @@ } }, "node_modules/@angular/cdk": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.0.4.tgz", - "integrity": "sha512-P8V1n6AFFjBUJG3YRgw8DiiNDWPZVrwQ42wbwgZxd4s2TQAuNFg3YY8h/DSMVxt2sXpavrshZsoLtP9yLKZjHA==", + "version": "19.0.5", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.0.5.tgz", + "integrity": "sha512-+D++QUrJlDuwk5RhQBDTejQseb0ZP6c6S4r8wBBab7UPtrwigySudSb0PxhiAzp2YHr5Ch3klhkTf/NSWeUXUQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -214,18 +214,18 @@ } }, "node_modules/@angular/cli": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.0.6.tgz", - "integrity": "sha512-ZEHhgRRVIdn10dbsAjB8TE9Co32hfuL9/im5Jcfa1yrn6KJefmigz6KN8Xu7FXMH5FkdqfQ11QpLBxJSPb9aww==", + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.0.7.tgz", + "integrity": "sha512-y6C4B4XdiZwe2+OADLWXyKqUVvW/XDzTuJ2mZ5PhTnSiiXDN4zRWId1F5wA8ve8vlbUKApPHXRQuaqiQJmA24g==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1900.6", - "@angular-devkit/core": "19.0.6", - "@angular-devkit/schematics": "19.0.6", + "@angular-devkit/architect": "0.1900.7", + "@angular-devkit/core": "19.0.7", + "@angular-devkit/schematics": "19.0.7", "@inquirer/prompts": "7.1.0", "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.0.6", + "@schematics/angular": "19.0.7", "@yarnpkg/lockfile": "1.1.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", @@ -248,9 +248,9 @@ } }, "node_modules/@angular/common": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.0.5.tgz", - "integrity": "sha512-fFK+euCj1AjBHBCpj9VnduMSeqoMRhZZHbhPYiND7tucRRJ8vwGU0sYK2KI/Ko+fsrNIXL/0O4F36jVPl09Smg==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.0.6.tgz", + "integrity": "sha512-r9IDD0+UGkrQkjyX+pApeDmIJ9INpr1uYlgmmlWNBJCVNr9SKKIVZV60sssgadew6bGynKN9dW4mGsmEzzb5BA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -259,14 +259,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.5", + "@angular/core": "19.0.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.0.5.tgz", - "integrity": "sha512-S8ku5Ljp0kqX3shfmE9DVo09629jeYJSlBRGbj2Glb92dd+VQZPOz7KxqKRTwmAl7lQIV/+4Lr6G/GVTsoC4vg==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.0.6.tgz", + "integrity": "sha512-g8A6QOsiCJnRi5Hz0sASIpRQoAGxEgnjz0JanfrMNRedY4MpdIS1V0AeCSKTsMRlV7tQl3ng2Gse/tsb51HI3Q==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -275,7 +275,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.5" + "@angular/core": "19.0.6" }, "peerDependenciesMeta": { "@angular/core": { @@ -284,9 +284,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.0.5.tgz", - "integrity": "sha512-KSzuWCTZlvJsoAenxM9cjTOzNM8mrFxDBInj0KVPz7QU83amGS4rcv1pWO/QGYQcErfskcN84TAdMegaRWWCmA==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.0.6.tgz", + "integrity": "sha512-fHtwI5rCe3LmKDoaqlqLAPdNmLrbeCiMYVe+X1BHgApaqNCyAwcuJxuf8Q5R5su7nHiLmlmB74o1ZS/V+0cQ+g==", "dev": true, "license": "MIT", "dependencies": { @@ -308,14 +308,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.0.5", + "@angular/compiler": "19.0.6", "typescript": ">=5.5 <5.7" } }, "node_modules/@angular/core": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.0.5.tgz", - "integrity": "sha512-Ywc6sPO6G/Y1stfk3y/MallV/h0yzQ0vdOHRWueLrk5kD1DTdbolV4X03Cs3PuVvravgcSVE3nnuuHFuH32emQ==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.0.6.tgz", + "integrity": "sha512-9N7FmdRHtS7zfXC/wnyap/reX7fgiOrWpVivayHjWP4RkLYXJAzJIpLyew0jrx4vf8r3lZnC0Zmq0PW007Ngjw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -329,9 +329,9 @@ } }, "node_modules/@angular/forms": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.0.5.tgz", - "integrity": "sha512-OhNFkfOoguqCDq07vNBV28FFrmTM8S11Z3Cd6PQZJJF9TgAtpV5KtF7A3eXBCN92W4pmqluomPjfK7YyImzIYQ==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.0.6.tgz", + "integrity": "sha512-HogauPvgDQHw2xxqKBaFgKTRRcc1xWeI/PByDCf3U6YsaqpF53Mz2CJh8X2bg2bY1RGKb67MZw7DBGFRvXx4bg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -340,23 +340,23 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.5", - "@angular/core": "19.0.5", - "@angular/platform-browser": "19.0.5", + "@angular/common": "19.0.6", + "@angular/core": "19.0.6", + "@angular/platform-browser": "19.0.6", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/material": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-19.0.4.tgz", - "integrity": "sha512-8WRMbN1+oRXx1ZFLni+BRz60F4FWzJPFORsQ8qAvY3sHWzyjunsYZkpbze3uiZO6bu3hiyQCU6g+k/58Qc6kkw==", + "version": "19.0.5", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-19.0.5.tgz", + "integrity": "sha512-yiW/ZJNkOPlQdqgj5U8DHTu3r7OHMI5R1cAbCpOmHlsVHEoc/Vw4V3RFUgpWLqCGgdRIkayoilMAooT52gG2Dg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/animations": "^19.0.0 || ^20.0.0", - "@angular/cdk": "19.0.4", + "@angular/cdk": "19.0.5", "@angular/common": "^19.0.0 || ^20.0.0", "@angular/core": "^19.0.0 || ^20.0.0", "@angular/forms": "^19.0.0 || ^20.0.0", @@ -365,9 +365,9 @@ } }, "node_modules/@angular/platform-browser": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.0.5.tgz", - "integrity": "sha512-41+Jo5DEil4Ifvv+UE/p1l9YJtYN+xfhx+/C9cahVgvV5D2q+givyK73d0Mnb6XOfe1q+hoV5lZ+XhQYp21//g==", + "version": "19.0.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.0.6.tgz", + "integrity": "sha512-MWiToGy7Pa0rR61sgnEuu7dfZXpAw0g7nkSnw4xdjUf974OOOfI1LS9O9YevJibtdW8sPa1HaoXXwcb7N03B5A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -376,9 +376,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "19.0.5", - "@angular/common": "19.0.5", - "@angular/core": "19.0.5" + "@angular/animations": "19.0.6", + "@angular/common": "19.0.6", + "@angular/core": "19.0.6" }, "peerDependenciesMeta": { "@angular/animations": { @@ -402,9 +402,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", + "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", "dev": true, "license": "MIT", "engines": { @@ -460,14 +460,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", + "@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" @@ -490,13 +490,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "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.25.9", + "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -549,9 +549,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, "license": "MIT", "engines": { @@ -616,13 +616,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", + "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.3" + "@babel/types": "^7.26.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -663,17 +663,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz", + "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.5", "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", + "@babel/types": "^7.26.5", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -682,9 +682,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", + "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", "dev": true, "license": "MIT", "dependencies": { @@ -1104,13 +1104,13 @@ } }, "node_modules/@inquirer/checkbox": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.4.tgz", - "integrity": "sha512-fYAKCAcGNMdfjL6hZTRUwkIByQ8EIZCXKrIQZH7XjADnN/xvRUhj8UdBbpC4zoUzvChhkSC/zRKaP/tDs3dZpg==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.6.tgz", + "integrity": "sha512-PgP35JfmGjHU0LSXOyRew0zHuA9N6OJwOlos1fZ20b7j8ISeAdib3L+n0jIxBtX958UeEpte6xhG/gxJ5iUqMw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/figures": "^1.0.9", "@inquirer/type": "^3.0.2", "ansi-escapes": "^4.3.2", @@ -1141,9 +1141,9 @@ } }, "node_modules/@inquirer/core": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.2.tgz", - "integrity": "sha512-bHd96F3ezHg1mf/J0Rb4CV8ndCN0v28kUlrHqP7+ECm1C/A+paB7Xh2lbMk6x+kweQC+rZOxM/YeKikzxco8bQ==", + "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": { @@ -1162,13 +1162,13 @@ } }, "node_modules/@inquirer/editor": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.1.tgz", - "integrity": "sha512-xn9aDaiP6nFa432i68JCaL302FyL6y/6EG97nAtfIPnWZ+mWPgCMLGc4XZ2QQMsZtu9q3Jd5AzBPjXh10aX9kA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.3.tgz", + "integrity": "sha512-S9KnIOJuTZpb9upeRSBBhoDZv7aSV3pG9TECrBj0f+ZsFwccz886hzKBrChGrXMJwd4NKY+pOA9Vy72uqnd6Eg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2", "external-editor": "^3.1.0" }, @@ -1180,13 +1180,13 @@ } }, "node_modules/@inquirer/expand": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.4.tgz", - "integrity": "sha512-GYocr+BPyxKPxQ4UZyNMqZFSGKScSUc0Vk17II3J+0bDcgGsQm0KYQNooN1Q5iBfXsy3x/VWmHGh20QnzsaHwg==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.6.tgz", + "integrity": "sha512-TRTfi1mv1GeIZGyi9PQmvAaH65ZlG4/FACq6wSzs7Vvf1z5dnNWsAAXBjWMHt76l+1hUY8teIqJFrWBk5N6gsg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2", "yoctocolors-cjs": "^2.1.2" }, @@ -1208,13 +1208,13 @@ } }, "node_modules/@inquirer/input": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.1.tgz", - "integrity": "sha512-nAXAHQndZcXB+7CyjIW3XuQZZHbQQ0q8LX6miY6bqAWwDzNa9JUioDBYrFmOUNIsuF08o1WT/m2gbBXvBhYVxg==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.3.tgz", + "integrity": "sha512-zeo++6f7hxaEe7OjtMzdGZPHiawsfmCZxWB9X1NpmYgbeoyerIbWemvlBxxl+sQIlHC0WuSAG19ibMq3gbhaqQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2" }, "engines": { @@ -1225,13 +1225,13 @@ } }, "node_modules/@inquirer/number": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.4.tgz", - "integrity": "sha512-DX7a6IXRPU0j8kr2ovf+QaaDiIf+zEKaZVzCWdLOTk7XigqSXvoh4cul7x68xp54WTQrgSnW7P1WBJDbyY3GhA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.6.tgz", + "integrity": "sha512-xO07lftUHk1rs1gR0KbqB+LJPhkUNkyzV/KhH+937hdkMazmAYHLm1OIrNKpPelppeV1FgWrgFDjdUD8mM+XUg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2" }, "engines": { @@ -1242,13 +1242,13 @@ } }, "node_modules/@inquirer/password": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.4.tgz", - "integrity": "sha512-wiliQOWdjM8FnBmdIHtQV2Ca3S1+tMBUerhyjkRCv1g+4jSvEweGu9GCcvVEgKDhTBT15nrxvk5/bVrGUqSs1w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.6.tgz", + "integrity": "sha512-QLF0HmMpHZPPMp10WGXh6F+ZPvzWE7LX6rNoccdktv/Rov0B+0f+eyXkAcgqy5cH9V+WSpbLxu2lo3ysEVK91w==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2", "ansi-escapes": "^4.3.2" }, @@ -1285,13 +1285,13 @@ } }, "node_modules/@inquirer/rawlist": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.4.tgz", - "integrity": "sha512-IsVN2EZdNHsmFdKWx9HaXb8T/s3FlR/U1QPt9dwbSyPtjFbMTlW9CRFvnn0bm/QIsrMRD2oMZqrQpSWPQVbXXg==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.6.tgz", + "integrity": "sha512-QoE4s1SsIPx27FO4L1b1mUjVcoHm1pWE/oCmm4z/Hl+V1Aw5IXl8FYYzGmfXaBT0l/sWr49XmNSiq7kg3Kd/Lg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/type": "^3.0.2", "yoctocolors-cjs": "^2.1.2" }, @@ -1303,13 +1303,13 @@ } }, "node_modules/@inquirer/search": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.4.tgz", - "integrity": "sha512-tSkJk2SDmC2MEdTIjknXWmCnmPr5owTs9/xjfa14ol1Oh95n6xW7SYn5fiPk4/vrJPys0ggSWiISdPze4LTa7A==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/figures": "^1.0.9", "@inquirer/type": "^3.0.2", "yoctocolors-cjs": "^2.1.2" @@ -1322,13 +1322,13 @@ } }, "node_modules/@inquirer/select": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.4.tgz", - "integrity": "sha512-ZzYLuLoUzTIW9EJm++jBpRiTshGqS3Q1o5qOEQqgzaBlmdsjQr6pA4TUNkwu6OBYgM2mIRbCz6mUhFDfl/GF+w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.6.tgz", + "integrity": "sha512-yANzIiNZ8fhMm4NORm+a74+KFYHmf7BZphSOBovIzYPVLquseTGEkU5l2UTnBOf5k0VLmTgPighNDLE9QtbViQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.2", + "@inquirer/core": "^10.1.4", "@inquirer/figures": "^1.0.9", "@inquirer/type": "^3.0.2", "ansi-escapes": "^4.3.2", @@ -2831,14 +2831,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.0.6.tgz", - "integrity": "sha512-HicclmbW/+mlljU7a4PzbyIWG+7tognoL5LsgMFJQUDzJXHNjRt1riL0vk57o8Pcprnz9FheeWZXO1KRhXkQuw==", + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.0.7.tgz", + "integrity": "sha512-1WtTqKFPuEaV99VIP+y/gf/XW3TVJh/NbJbbEF4qYpp7qQiJ4ntF4klVZmsJcQzFucZSzlg91QVMPQKev5WZGA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.6", - "@angular-devkit/schematics": "19.0.6", + "@angular-devkit/core": "19.0.7", + "@angular-devkit/schematics": "19.0.7", "jsonc-parser": "3.3.1" }, "engines": { @@ -2871,13 +2871,13 @@ } }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", - "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.3.tgz", + "integrity": "sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@sigstore/sign": { @@ -2959,9 +2959,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz", - "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", + "version": "22.10.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.6.tgz", + "integrity": "sha512-qNiuwC4ZDAUNcY47xgaSuS92cjf8JbSUoaKS77bmLG1rU7MlATVSiw/IlrjtIyyskXBZ8KkNfjK/P5na7rgXbQ==", "dev": true, "license": "MIT", "peer": true, @@ -3174,9 +3174,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", - "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ { @@ -3317,9 +3317,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001690", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", - "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", + "version": "1.0.30001692", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz", + "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==", "dev": true, "funding": [ { @@ -3707,9 +3707,9 @@ } }, "node_modules/domutils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.1.tgz", - "integrity": "sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -3729,9 +3729,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.76", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz", - "integrity": "sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==", + "version": "1.5.82", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.82.tgz", + "integrity": "sha512-Zq16uk1hfQhyGx5GpwPAYDwddJuSGhtRhgOA2mCxANYaDT79nAeGnaXogMGng4KqLaJUVnOnuL0+TDop9nLOiA==", "dev": true, "license": "ISC" }, @@ -5659,9 +5659,9 @@ } }, "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", + "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", "dev": true, "funding": [ { @@ -5679,7 +5679,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", + "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -5762,13 +5762,13 @@ } }, "node_modules/readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz", + "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 14.16.0" + "node": ">= 14.18.0" }, "funding": { "type": "individual", @@ -6565,9 +6565,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "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, "funding": [ { @@ -6586,7 +6586,7 @@ "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" diff --git a/packages/zone.js/yarn.lock b/packages/zone.js/yarn.lock index 1b24ffbd1c26..b2b1e42388ac 100644 --- a/packages/zone.js/yarn.lock +++ b/packages/zone.js/yarn.lock @@ -19,10 +19,10 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/compat-data@^7.25.9": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.3.tgz#99488264a56b2aded63983abd6a417f03b92ed02" - integrity sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g== +"@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/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": version "7.26.0" @@ -45,23 +45,23 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.26.0", "@babel/generator@^7.26.3", "@babel/generator@^7.7.2": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019" - integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ== +"@babel/generator@^7.26.0", "@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== dependencies: - "@babel/parser" "^7.26.3" - "@babel/types" "^7.26.3" + "@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-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== + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz#75d92bb8d8d51301c0d49e52a65c9a7fe94514d8" + integrity sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA== dependencies: - "@babel/compat-data" "^7.25.9" + "@babel/compat-data" "^7.26.5" "@babel/helper-validator-option" "^7.25.9" browserslist "^4.24.0" lru-cache "^5.1.1" @@ -85,9 +85,9 @@ "@babel/traverse" "^7.25.9" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46" - integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz#18580d00c9934117ad719392c4f6585c9333cc35" + integrity sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg== "@babel/helper-string-parser@^7.25.9": version "7.25.9" @@ -112,12 +112,12 @@ "@babel/template" "^7.25.9" "@babel/types" "^7.26.0" -"@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.0", "@babel/parser@^7.26.3": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234" - integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA== +"@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.0", "@babel/parser@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.5.tgz#6fec9aebddef25ca57a935c86dbb915ae2da3e1f" + integrity sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw== dependencies: - "@babel/types" "^7.26.3" + "@babel/types" "^7.26.5" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -248,22 +248,22 @@ "@babel/types" "^7.25.9" "@babel/traverse@^7.25.9": - version "7.26.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.4.tgz#ac3a2a84b908dde6d463c3bfa2c5fdc1653574bd" - integrity sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w== + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.5.tgz#6d0be3e772ff786456c1a37538208286f6e79021" + integrity sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ== dependencies: "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.3" - "@babel/parser" "^7.26.3" + "@babel/generator" "^7.26.5" + "@babel/parser" "^7.26.5" "@babel/template" "^7.25.9" - "@babel/types" "^7.26.3" + "@babel/types" "^7.26.5" 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.0", "@babel/types@^7.26.3", "@babel/types@^7.3.3": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.3.tgz#37e79830f04c2b5687acc77db97fbc75fb81f3c0" - integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.5", "@babel/types@^7.3.3": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.5.tgz#7a1e1c01d28e26d1fe7f8ec9567b3b92b9d07747" + integrity sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg== 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.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.5.tgz#95af89a3fb74a2bb41ef9927f206e6472026e48b" - integrity sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ== + version "22.10.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.6.tgz#5c6795e71635876039f853cbccd59f523d9e4239" + integrity sha512-qNiuwC4ZDAUNcY47xgaSuS92cjf8JbSUoaKS77bmLG1rU7MlATVSiw/IlrjtIyyskXBZ8KkNfjK/P5na7rgXbQ== dependencies: undici-types "~6.20.0" @@ -858,9 +858,9 @@ browser-stdout@^1.3.1: integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== browserslist@^4.24.0: - version "4.24.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.3.tgz#5fc2725ca8fb3c1432e13dac278c7cc103e026d2" - integrity sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA== + version "4.24.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b" + integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== dependencies: caniuse-lite "^1.0.30001688" electron-to-chromium "^1.5.73" @@ -895,9 +895,9 @@ camelcase@^6.0.0, camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001688: - version "1.0.30001690" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz#f2d15e3aaf8e18f76b2b8c1481abde063b8104c8" - integrity sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w== + version "1.0.30001692" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz#4585729d95e6b95be5b439da6ab55250cd125bf9" + integrity sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A== chalk@4.x, chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" @@ -1135,9 +1135,9 @@ eastasianwidth@^0.2.0: integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== electron-to-chromium@^1.5.73: - version "1.5.76" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz#db20295c5061b68f07c8ea4dfcbd701485d94a3d" - integrity sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ== + version "1.5.82" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.82.tgz#b9116ac6d6b6346c2baa49f14c1272ba2ce1ccdb" + integrity sha512-Zq16uk1hfQhyGx5GpwPAYDwddJuSGhtRhgOA2mCxANYaDT79nAeGnaXogMGng4KqLaJUVnOnuL0+TDop9nLOiA== emittery@^0.13.1: version "0.13.1" @@ -2371,7 +2371,7 @@ path-scurry@^1.11.1: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" -picocolors@^1.0.0, picocolors@^1.1.0: +picocolors@^1.0.0, picocolors@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== @@ -2782,12 +2782,12 @@ universalify@^0.2.0: integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== 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== + version "1.1.2" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz#97e9c96ab0ae7bcac08e9ae5151d26e6bc6b5580" + integrity sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg== dependencies: escalade "^3.2.0" - picocolors "^1.1.0" + picocolors "^1.1.1" url-parse@^1.5.3: version "1.5.10" diff --git a/yarn.lock b/yarn.lock index 10d6a364b73a..e9ceeffa3386 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.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@algolia/client-abtesting/-/client-abtesting-5.18.0.tgz#1bc368444d08b6e48ce56f1d5c935bfb9f658a98" - integrity sha512-DLIrAukjsSrdMNNDx1ZTks72o4RH/1kOn8Wx5zZm8nnqFexG+JzY4SANnCNEjnFQPJTTvC+KpgiNW/CP2lumng== - dependencies: - "@algolia/client-common" "5.18.0" - "@algolia/requester-browser-xhr" "5.18.0" - "@algolia/requester-fetch" "5.18.0" - "@algolia/requester-node-http" "5.18.0" - -"@algolia/client-analytics@5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-5.18.0.tgz#de0dc80011fdbaa9853adbdb836e0a80f08f53df" - integrity sha512-0VpGG2uQW+h2aejxbG8VbnMCQ9ary9/ot7OASXi6OjE0SRkYQ/+pkW+q09+IScif3pmsVVYggmlMPtAsmYWHng== - dependencies: - "@algolia/client-common" "5.18.0" - "@algolia/requester-browser-xhr" "5.18.0" - "@algolia/requester-fetch" "5.18.0" - "@algolia/requester-node-http" "5.18.0" - -"@algolia/client-common@5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-5.18.0.tgz#8de3991b25ff3c9bbf5ef06c19f6a4a4fa64f328" - integrity sha512-X1WMSC+1ve2qlMsemyTF5bIjwipOT+m99Ng1Tyl36ZjQKTa54oajBKE0BrmM8LD8jGdtukAgkUhFoYOaRbMcmQ== - -"@algolia/client-insights@5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@algolia/client-insights/-/client-insights-5.18.0.tgz#2c6f158e57265fd0888f5b84fe7302d6d659c0ff" - integrity sha512-FAJRNANUOSs/FgYOJ/Njqp+YTe4TMz2GkeZtfsw1TMiA5mVNRS/nnMpxas9771aJz7KTEWvK9GwqPs0K6RMYWg== - dependencies: - "@algolia/client-common" "5.18.0" - "@algolia/requester-browser-xhr" "5.18.0" - "@algolia/requester-fetch" "5.18.0" - "@algolia/requester-node-http" "5.18.0" - -"@algolia/client-personalization@5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-5.18.0.tgz#26128f6a1aef523ae32f29ef9afd18fd2f159b98" - integrity sha512-I2dc94Oiwic3SEbrRp8kvTZtYpJjGtg5y5XnqubgnA15AgX59YIY8frKsFG8SOH1n2rIhUClcuDkxYQNXJLg+w== - dependencies: - "@algolia/client-common" "5.18.0" - "@algolia/requester-browser-xhr" "5.18.0" - "@algolia/requester-fetch" "5.18.0" - "@algolia/requester-node-http" "5.18.0" - -"@algolia/client-query-suggestions@5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@algolia/client-query-suggestions/-/client-query-suggestions-5.18.0.tgz#9911560aa2dd26984a6d3f9803f14aecc2f1d10e" - integrity sha512-x6XKIQgKFTgK/bMasXhghoEjHhmgoP61pFPb9+TaUJ32aKOGc65b12usiGJ9A84yS73UDkXS452NjyP50Knh/g== - dependencies: - "@algolia/client-common" "5.18.0" - "@algolia/requester-browser-xhr" "5.18.0" - "@algolia/requester-fetch" "5.18.0" - "@algolia/requester-node-http" "5.18.0" - -"@algolia/client-search@5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-5.18.0.tgz#26a3b55b6783cf7eaa8c28b48b891ed245c7e708" - integrity sha512-qI3LcFsVgtvpsBGR7aNSJYxhsR+Zl46+958ODzg8aCxIcdxiK7QEVLMJMZAR57jGqW0Lg/vrjtuLFDMfSE53qA== - dependencies: - "@algolia/client-common" "5.18.0" - "@algolia/requester-browser-xhr" "5.18.0" - "@algolia/requester-fetch" "5.18.0" - "@algolia/requester-node-http" "5.18.0" - -"@algolia/ingestion@1.18.0": - version "1.18.0" - resolved "https://registry.yarnpkg.com/@algolia/ingestion/-/ingestion-1.18.0.tgz#023e2fda366655b0e8f2cdddd98666412815429d" - integrity sha512-bGvJg7HnGGm+XWYMDruZXWgMDPVt4yCbBqq8DM6EoaMBK71SYC4WMfIdJaw+ABqttjBhe6aKNRkWf/bbvYOGyw== - dependencies: - "@algolia/client-common" "5.18.0" - "@algolia/requester-browser-xhr" "5.18.0" - "@algolia/requester-fetch" "5.18.0" - "@algolia/requester-node-http" "5.18.0" - -"@algolia/monitoring@1.18.0": - version "1.18.0" - resolved "https://registry.yarnpkg.com/@algolia/monitoring/-/monitoring-1.18.0.tgz#e94a4c436be0d8c1e9d19c69aeff8e67d0237736" - integrity sha512-lBssglINIeGIR+8KyzH05NAgAmn1BCrm5D2T6pMtr/8kbTHvvrm1Zvcltc5dKUQEFyyx3J5+MhNc7kfi8LdjVw== - dependencies: - "@algolia/client-common" "5.18.0" - "@algolia/requester-browser-xhr" "5.18.0" - "@algolia/requester-fetch" "5.18.0" - "@algolia/requester-node-http" "5.18.0" - -"@algolia/recommend@5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-5.18.0.tgz#bd07d3057dd2030718c6707a4fe247b871f1834d" - integrity sha512-uSnkm0cdAuFwdMp4pGT5vHVQ84T6AYpTZ3I0b3k/M3wg4zXDhl3aCiY8NzokEyRLezz/kHLEEcgb/tTTobOYVw== - dependencies: - "@algolia/client-common" "5.18.0" - "@algolia/requester-browser-xhr" "5.18.0" - "@algolia/requester-fetch" "5.18.0" - "@algolia/requester-node-http" "5.18.0" - -"@algolia/requester-browser-xhr@5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.18.0.tgz#6e7e56bb687904a01c91988393f5c1969944ee3d" - integrity sha512-1XFjW0C3pV0dS/9zXbV44cKI+QM4ZIz9cpatXpsjRlq6SUCpLID3DZHsXyE6sTb8IhyPaUjk78GEJT8/3hviqg== - dependencies: - "@algolia/client-common" "5.18.0" - -"@algolia/requester-fetch@5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-fetch/-/requester-fetch-5.18.0.tgz#fcccc76bd7d16fb54c56d15baa6b5f657b17ca71" - integrity sha512-0uodeNdAHz1YbzJh6C5xeQ4T6x5WGiUxUq3GOaT/R4njh5t78dq+Rb187elr7KtnjUmETVVuCvmEYaThfTHzNg== - dependencies: - "@algolia/client-common" "5.18.0" - -"@algolia/requester-node-http@5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-5.18.0.tgz#c5b16de53d83276067583e7b2f56b09eac938435" - integrity sha512-tZCqDrqJ2YE2I5ukCQrYN8oiF6u3JIdCxrtKq+eniuLkjkO78TKRnXrVcKZTmfFJyyDK8q47SfDcHzAA3nHi6w== - dependencies: - "@algolia/client-common" "5.18.0" +"@algolia/client-abtesting@5.19.0": + version "5.19.0" + resolved "https://registry.yarnpkg.com/@algolia/client-abtesting/-/client-abtesting-5.19.0.tgz#0a6e73da05decc8f1bbcd7e5b9a82a8d876e7bf5" + integrity sha512-dMHwy2+nBL0SnIsC1iHvkBao64h4z+roGelOz11cxrDBrAdASxLxmfVMop8gmodQ2yZSacX0Rzevtxa+9SqxCw== + dependencies: + "@algolia/client-common" "5.19.0" + "@algolia/requester-browser-xhr" "5.19.0" + "@algolia/requester-fetch" "5.19.0" + "@algolia/requester-node-http" "5.19.0" + +"@algolia/client-analytics@5.19.0": + version "5.19.0" + resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-5.19.0.tgz#45e33343fd4517e05a340a97bb37bebb4466000e" + integrity sha512-CDW4RwnCHzU10upPJqS6N6YwDpDHno7w6/qXT9KPbPbt8szIIzCHrva4O9KIfx1OhdsHzfGSI5hMAiOOYl4DEQ== + dependencies: + "@algolia/client-common" "5.19.0" + "@algolia/requester-browser-xhr" "5.19.0" + "@algolia/requester-fetch" "5.19.0" + "@algolia/requester-node-http" "5.19.0" + +"@algolia/client-common@5.19.0": + version "5.19.0" + resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-5.19.0.tgz#efddaaf28f0f478117c2aab22d19c99b06f99761" + integrity sha512-2ERRbICHXvtj5kfFpY5r8qu9pJII/NAHsdgUXnUitQFwPdPL7wXiupcvZJC7DSntOnE8AE0lM7oDsPhrJfj5nQ== + +"@algolia/client-insights@5.19.0": + version "5.19.0" + resolved "https://registry.yarnpkg.com/@algolia/client-insights/-/client-insights-5.19.0.tgz#81ff8eb3df724f6dd8ea3f423966b9ef7d36f903" + integrity sha512-xPOiGjo6I9mfjdJO7Y+p035aWePcbsItizIp+qVyfkfZiGgD+TbNxM12g7QhFAHIkx/mlYaocxPY/TmwPzTe+A== + dependencies: + "@algolia/client-common" "5.19.0" + "@algolia/requester-browser-xhr" "5.19.0" + "@algolia/requester-fetch" "5.19.0" + "@algolia/requester-node-http" "5.19.0" + +"@algolia/client-personalization@5.19.0": + version "5.19.0" + resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-5.19.0.tgz#9a75230b9dec490a1e0851539a40a9371c8cd987" + integrity sha512-B9eoce/fk8NLboGje+pMr72pw+PV7c5Z01On477heTZ7jkxoZ4X92dobeGuEQop61cJ93Gaevd1of4mBr4hu2A== + dependencies: + "@algolia/client-common" "5.19.0" + "@algolia/requester-browser-xhr" "5.19.0" + "@algolia/requester-fetch" "5.19.0" + "@algolia/requester-node-http" "5.19.0" + +"@algolia/client-query-suggestions@5.19.0": + version "5.19.0" + resolved "https://registry.yarnpkg.com/@algolia/client-query-suggestions/-/client-query-suggestions-5.19.0.tgz#007d1b09818d6a225fbfdf93bbcb2edf8ab17da0" + integrity sha512-6fcP8d4S8XRDtVogrDvmSM6g5g6DndLc0pEm1GCKe9/ZkAzCmM3ZmW1wFYYPxdjMeifWy1vVEDMJK7sbE4W7MA== + dependencies: + "@algolia/client-common" "5.19.0" + "@algolia/requester-browser-xhr" "5.19.0" + "@algolia/requester-fetch" "5.19.0" + "@algolia/requester-node-http" "5.19.0" + +"@algolia/client-search@5.19.0": + version "5.19.0" + resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-5.19.0.tgz#04fc5d7e26d41c99144eb33eedb0ea6f9b1c0056" + integrity sha512-Ctg3xXD/1VtcwmkulR5+cKGOMj4r0wC49Y/KZdGQcqpydKn+e86F6l3tb3utLJQVq4lpEJud6kdRykFgcNsp8Q== + dependencies: + "@algolia/client-common" "5.19.0" + "@algolia/requester-browser-xhr" "5.19.0" + "@algolia/requester-fetch" "5.19.0" + "@algolia/requester-node-http" "5.19.0" + +"@algolia/ingestion@1.19.0": + version "1.19.0" + resolved "https://registry.yarnpkg.com/@algolia/ingestion/-/ingestion-1.19.0.tgz#b481bd2283866a1df18af9babba0ecb3f1d1d675" + integrity sha512-LO7w1MDV+ZLESwfPmXkp+KLeYeFrYEgtbCZG6buWjddhYraPQ9MuQWLhLLiaMlKxZ/sZvFTcZYuyI6Jx4WBhcg== + dependencies: + "@algolia/client-common" "5.19.0" + "@algolia/requester-browser-xhr" "5.19.0" + "@algolia/requester-fetch" "5.19.0" + "@algolia/requester-node-http" "5.19.0" + +"@algolia/monitoring@1.19.0": + version "1.19.0" + resolved "https://registry.yarnpkg.com/@algolia/monitoring/-/monitoring-1.19.0.tgz#abc85ac073c25233c7f8dae3000cc0821d582514" + integrity sha512-Mg4uoS0aIKeTpu6iv6O0Hj81s8UHagi5TLm9k2mLIib4vmMtX7WgIAHAcFIaqIZp5D6s5EVy1BaDOoZ7buuJHA== + dependencies: + "@algolia/client-common" "5.19.0" + "@algolia/requester-browser-xhr" "5.19.0" + "@algolia/requester-fetch" "5.19.0" + "@algolia/requester-node-http" "5.19.0" + +"@algolia/recommend@5.19.0": + version "5.19.0" + resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-5.19.0.tgz#5898219e9457853c563eb527f0d1cbfcb8998c87" + integrity sha512-PbgrMTbUPlmwfJsxjFhal4XqZO2kpBNRjemLVTkUiti4w/+kzcYO4Hg5zaBgVqPwvFDNQ8JS4SS3TBBem88u+g== + dependencies: + "@algolia/client-common" "5.19.0" + "@algolia/requester-browser-xhr" "5.19.0" + "@algolia/requester-fetch" "5.19.0" + "@algolia/requester-node-http" "5.19.0" + +"@algolia/requester-browser-xhr@5.19.0": + version "5.19.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.19.0.tgz#979a340a81a381214c0dbdd235b51204098e3b4a" + integrity sha512-GfnhnQBT23mW/VMNs7m1qyEyZzhZz093aY2x8p0era96MMyNv8+FxGek5pjVX0b57tmSCZPf4EqNCpkGcGsmbw== + dependencies: + "@algolia/client-common" "5.19.0" + +"@algolia/requester-fetch@5.19.0": + version "5.19.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-fetch/-/requester-fetch-5.19.0.tgz#59fe52733a718fc23bde548b377b52baf7228993" + integrity sha512-oyTt8ZJ4T4fYvW5avAnuEc6Laedcme9fAFryMD9ndUTIUe/P0kn3BuGcCLFjN3FDmdrETHSFkgPPf1hGy3sLCw== + dependencies: + "@algolia/client-common" "5.19.0" + +"@algolia/requester-node-http@5.19.0": + version "5.19.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-5.19.0.tgz#edbd58158d9dec774d608fbf2b2196d0ca4b257c" + integrity sha512-p6t8ue0XZNjcRiqNkb5QAM0qQRAKsCiebZ6n9JjWA+p8fWf8BvnhO55y2fO28g3GW0Imj7PrAuyBuxq8aDVQwQ== + dependencies: + "@algolia/client-common" "5.19.0" "@ampproject/remapping@2.3.0", "@ampproject/remapping@^2.2.0": version "2.3.0" @@ -289,9 +289,9 @@ rxjs "7.8.1" "@angular/animations@^19.1.0-next": - version "19.1.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-19.1.0-next.4.tgz#62dff46f056e3533bd1ef73253dfc81364080d82" - integrity sha512-UJQVQsMSloo+1IITfE3pqQL/Gmm7nt5XtKaz+cXUGeTPS5szDFrUjmFJSWVmcj595FmqaiFBL8fuxgWv+Qmvlg== + version "19.1.0-rc.0" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-19.1.0-rc.0.tgz#08d5b25f3b57eb8acc9cc8fd2d188d0c76bf31b8" + integrity sha512-CAbv8Zr7RLYUFh6afw/3k7OHXvpxJvXDl5YeXWw5gBC7j1zHWochCVcEZVqBnrumGllVhxctM7L6gCI0x+EG/g== dependencies: tslib "^2.3.0" @@ -305,7 +305,6 @@ "@angular/build-tooling@https://github.com/angular/dev-infra-private-build-tooling-builds.git#4c48faf6dd5765b85e4a9cb9fd84ad2fb813a93e": version "0.0.0-2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b" - uid "4c48faf6dd5765b85e4a9cb9fd84ad2fb813a93e" resolved "https://github.com/angular/dev-infra-private-build-tooling-builds.git#4c48faf6dd5765b85e4a9cb9fd84ad2fb813a93e" dependencies: "@angular/benchpress" "0.3.0" @@ -414,9 +413,9 @@ tslib "^2.3.0" "@angular/core@^19.1.0-next": - version "19.1.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-19.1.0-next.4.tgz#02c60c0f40c970a55786ef310c53d711c8b1c8ce" - integrity sha512-TxgjuK2VZPSWP3Wn8EzWZphyOXz8Mwq/OKSBkPKfUkgM8fxZAZ/kORFu+Db96Ov3SgCvDYy5mmDCoCgC8IKGbg== + version "19.1.0-rc.0" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-19.1.0-rc.0.tgz#303dcf8ee8ed8aa196eb71de43eecb291e8d82d9" + integrity sha512-t4zWPx+EyKi7qIjBo+dBhmkk8nZVB88YBj+et5oklG1CNL8//w7q/b8bmmirT+/JGHsB9E044skeMohhayCJ3A== dependencies: tslib "^2.3.0" @@ -429,7 +428,6 @@ "@angular/ng-dev@https://github.com/angular/dev-infra-private-ng-dev-builds.git#34526428373727797ec4e28ef2ca2de795af5076": version "0.0.0-2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b" - uid "34526428373727797ec4e28ef2ca2de795af5076" resolved "https://github.com/angular/dev-infra-private-ng-dev-builds.git#34526428373727797ec4e28ef2ca2de795af5076" dependencies: "@google-cloud/spanner" "7.17.1" @@ -499,10 +497,10 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.9", "@babel/compat-data@^7.26.0": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.3.tgz#99488264a56b2aded63983abd6a417f03b92ed02" - integrity sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.26.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== "@babel/core@7.26.0", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.23.9": version "7.26.0" @@ -525,7 +523,7 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@7.26.3", "@babel/generator@^7.26.0", "@babel/generator@^7.26.3": +"@babel/generator@7.26.3": version "7.26.3" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019" integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ== @@ -536,7 +534,7 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" -"@babel/generator@7.26.5": +"@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== @@ -555,11 +553,11 @@ "@babel/types" "^7.25.9" "@babel/helper-compilation-targets@^7.22.6", "@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== + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz#75d92bb8d8d51301c0d49e52a65c9a7fe94514d8" + integrity sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA== dependencies: - "@babel/compat-data" "^7.25.9" + "@babel/compat-data" "^7.26.5" "@babel/helper-validator-option" "^7.25.9" browserslist "^4.24.0" lru-cache "^5.1.1" @@ -637,10 +635,10 @@ dependencies: "@babel/types" "^7.25.9" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46" - integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.26.5", "@babel/helper-plugin-utils@^7.8.0": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz#18580d00c9934117ad719392c4f6585c9333cc35" + integrity sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg== "@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.25.9": version "7.25.9" @@ -652,13 +650,13 @@ "@babel/traverse" "^7.25.9" "@babel/helper-replace-supers@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz#ba447224798c3da3f8713fc272b145e33da6a5c5" - integrity sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ== + 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== dependencies: "@babel/helper-member-expression-to-functions" "^7.25.9" "@babel/helper-optimise-call-expression" "^7.25.9" - "@babel/traverse" "^7.25.9" + "@babel/traverse" "^7.26.5" "@babel/helper-skip-transparent-expression-wrappers@^7.25.9": version "7.25.9" @@ -707,14 +705,7 @@ "@babel/template" "^7.25.9" "@babel/types" "^7.26.0" -"@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.3": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234" - integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA== - dependencies: - "@babel/types" "^7.26.3" - -"@babel/parser@^7.26.5": +"@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.3", "@babel/parser@^7.26.5": version "7.26.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.5.tgz#6fec9aebddef25ca57a935c86dbb915ae2da3e1f" integrity sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw== @@ -830,11 +821,11 @@ "@babel/helper-remap-async-to-generator" "^7.25.9" "@babel/plugin-transform-block-scoped-functions@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz#5700691dbd7abb93de300ca7be94203764fce458" - integrity sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA== + 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== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.26.5" "@babel/plugin-transform-block-scoping@^7.25.9": version "7.25.9" @@ -1025,11 +1016,11 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-nullish-coalescing-operator@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz#bcb1b0d9e948168102d5f7104375ca21c3266949" - integrity sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog== + 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== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.26.5" "@babel/plugin-transform-numeric-separator@^7.25.9": version "7.25.9" @@ -1303,28 +1294,20 @@ "@babel/parser" "^7.25.9" "@babel/types" "^7.25.9" -"@babel/traverse@^7.25.9": - version "7.26.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.4.tgz#ac3a2a84b908dde6d463c3bfa2c5fdc1653574bd" - integrity sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w== +"@babel/traverse@^7.25.9", "@babel/traverse@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.5.tgz#6d0be3e772ff786456c1a37538208286f6e79021" + integrity sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ== dependencies: "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.3" - "@babel/parser" "^7.26.3" + "@babel/generator" "^7.26.5" + "@babel/parser" "^7.26.5" "@babel/template" "^7.25.9" - "@babel/types" "^7.26.3" + "@babel/types" "^7.26.5" 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.3", "@babel/types@^7.4.4": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.3.tgz#37e79830f04c2b5687acc77db97fbc75fb81f3c0" - integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA== - dependencies: - "@babel/helper-string-parser" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" - -"@babel/types@^7.26.5": +"@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.3", "@babel/types@^7.26.5", "@babel/types@^7.4.4": version "7.26.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.5.tgz#7a1e1c01d28e26d1fe7f8ec9567b3b92b9d07747" integrity sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg== @@ -1471,9 +1454,9 @@ "@lezer/common" "^1.0.0" "@codemirror/commands@^6.3.2": - version "6.7.1" - resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-6.7.1.tgz#04561e95bc0779eaa49efd63e916c4efb3bbf6d6" - integrity sha512-llTrboQYw5H4THfhN4U3qCnSZ1SOJ60ohhz+SzU0ADGtwlc533DtklQP0vSFaQuCPDn3BPpOd1GbbnUtwNjsrw== + version "6.8.0" + resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-6.8.0.tgz#92f200b66f852939bd6ebb90d48c2d9e9c813d64" + integrity sha512-q8VPEFaEP4ikSlt6ZxjB3zW72+7osfAYW9i8Zu943uqbKuz6utc1+F170hyLUCUltXORjQXRyYQNfkckzA/bPQ== dependencies: "@codemirror/language" "^6.0.0" "@codemirror/state" "^6.4.0" @@ -1573,16 +1556,16 @@ 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.0" - resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.5.0.tgz#e98dde85620618651543152fe1c2483300a0ccc9" - integrity sha512-MwBHVK60IiIHDcoMet78lxt6iw5gJOGSbNbOIVBHWVXIH4/Nq1+GQgLLGgI1KlnN86WDXsPudVaqYHKBIx7Eyw== + version "6.5.1" + resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.5.1.tgz#e5c0599f7b43cf03f19e05861317df5425c07904" + integrity sha512-3rA9lcwciEB47ZevqvD8qgbzhM9qMb8vCcQCNmDfVRPQG4JT9mSb0Jg8H7YjKGGQcFnLN323fj9jdnG59Kx6bg== dependencies: "@marijn/find-cluster-break" "^1.0.0" "@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.22.2", "@codemirror/view@^6.23.0", "@codemirror/view@^6.27.0", "@codemirror/view@^6.35.0": - version "6.36.1" - resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.36.1.tgz#3c543b8fd72c96b30c4b2b1464d1ebce7e0c5c4b" - integrity sha512-miD1nyT4m4uopZaDdO2uXU/LLHliKNYL9kB1C1wJHrunHLm/rpkb5QVSokqgw9hFqEZakrdlb/VGWX8aYZTslQ== + version "6.36.2" + resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.36.2.tgz#aeb644e161440734ac5a153bf6e5b4a4355047be" + integrity sha512-DZ6ONbs8qdJK0fdN7AB82CgI6tYXf4HWk1wSVa0+9bhVznCuuvhQtX8bFBoy3dv8rZSQqUd8GvhVAcielcidrA== dependencies: "@codemirror/state" "^6.5.0" style-mod "^4.1.0" @@ -2064,18 +2047,18 @@ local-pkg "^0.5.1" mlly "^1.7.3" -"@inquirer/checkbox@^4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@inquirer/checkbox/-/checkbox-4.0.4.tgz#e7335f9c23f4100f789a8fceb26417c9a74a6dee" - integrity sha512-fYAKCAcGNMdfjL6hZTRUwkIByQ8EIZCXKrIQZH7XjADnN/xvRUhj8UdBbpC4zoUzvChhkSC/zRKaP/tDs3dZpg== +"@inquirer/checkbox@^4.0.4", "@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.2" + "@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/confirm@5.1.1", "@inquirer/confirm@^5.1.1": +"@inquirer/confirm@5.1.1": version "5.1.1" resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.1.1.tgz#18385064b8275eb79fdba505ce527801804eea04" integrity sha512-vVLSbGci+IKQvDOtzpPTCOiEJCNidHcAq9JYVoWTW0svb5FiwSLotkM+JXNXejfjnzVYV9n0DTBythl9+XgTxg== @@ -2083,10 +2066,18 @@ "@inquirer/core" "^10.1.2" "@inquirer/type" "^3.0.2" -"@inquirer/core@^10.1.2": - version "10.1.2" - resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.1.2.tgz#a9c5b9ed814a636e99b5c0a8ca4f1626d99fd75d" - integrity sha512-bHd96F3ezHg1mf/J0Rb4CV8ndCN0v28kUlrHqP7+ECm1C/A+paB7Xh2lbMk6x+kweQC+rZOxM/YeKikzxco8bQ== +"@inquirer/confirm@^5.1.1", "@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.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" @@ -2098,21 +2089,21 @@ wrap-ansi "^6.2.0" yoctocolors-cjs "^2.1.2" -"@inquirer/editor@^4.2.1": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@inquirer/editor/-/editor-4.2.1.tgz#9887e95aa28a52eb20e9e08d85cb3698ef404601" - integrity sha512-xn9aDaiP6nFa432i68JCaL302FyL6y/6EG97nAtfIPnWZ+mWPgCMLGc4XZ2QQMsZtu9q3Jd5AzBPjXh10aX9kA== +"@inquirer/editor@^4.2.1", "@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.2" + "@inquirer/core" "^10.1.4" "@inquirer/type" "^3.0.2" external-editor "^3.1.0" -"@inquirer/expand@^4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-4.0.4.tgz#e3b052835e48fd4ebcf71813b7eae8b03c729d1b" - integrity sha512-GYocr+BPyxKPxQ4UZyNMqZFSGKScSUc0Vk17II3J+0bDcgGsQm0KYQNooN1Q5iBfXsy3x/VWmHGh20QnzsaHwg== +"@inquirer/expand@^4.0.4", "@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.2" + "@inquirer/core" "^10.1.4" "@inquirer/type" "^3.0.2" yoctocolors-cjs "^2.1.2" @@ -2121,32 +2112,32 @@ resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.9.tgz#9d8128f8274cde4ca009ca8547337cab3f37a4a3" integrity sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ== -"@inquirer/input@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-4.1.1.tgz#aea2e463087c6aae57b9801e1ae5648f50d0d22e" - integrity sha512-nAXAHQndZcXB+7CyjIW3XuQZZHbQQ0q8LX6miY6bqAWwDzNa9JUioDBYrFmOUNIsuF08o1WT/m2gbBXvBhYVxg== +"@inquirer/input@^4.1.1", "@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.2" + "@inquirer/core" "^10.1.4" "@inquirer/type" "^3.0.2" -"@inquirer/number@^3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@inquirer/number/-/number-3.0.4.tgz#090dcac6886d0cddc255f6624b61fb4461747fee" - integrity sha512-DX7a6IXRPU0j8kr2ovf+QaaDiIf+zEKaZVzCWdLOTk7XigqSXvoh4cul7x68xp54WTQrgSnW7P1WBJDbyY3GhA== +"@inquirer/number@^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.2" + "@inquirer/core" "^10.1.4" "@inquirer/type" "^3.0.2" -"@inquirer/password@^4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-4.0.4.tgz#77891ae3ed5736607e6e942993ac40ca00411a2c" - integrity sha512-wiliQOWdjM8FnBmdIHtQV2Ca3S1+tMBUerhyjkRCv1g+4jSvEweGu9GCcvVEgKDhTBT15nrxvk5/bVrGUqSs1w== +"@inquirer/password@^4.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.2" + "@inquirer/core" "^10.1.4" "@inquirer/type" "^3.0.2" ansi-escapes "^4.3.2" -"@inquirer/prompts@7.2.1", "@inquirer/prompts@^7.0.0": +"@inquirer/prompts@7.2.1": version "7.2.1" resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-7.2.1.tgz#f00fbcf06998a07faebc10741efa289384529950" integrity sha512-v2JSGri6/HXSfoGIwuKEn8sNCQK6nsB2BNpy2lSX6QH9bsECrMv93QHnj5+f+1ZWpF/VNioIV2B/PDox8EvGuQ== @@ -2162,31 +2153,47 @@ "@inquirer/search" "^3.0.4" "@inquirer/select" "^4.0.4" -"@inquirer/rawlist@^4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@inquirer/rawlist/-/rawlist-4.0.4.tgz#d10bbd6c529cd468d3d764c19de21334a01fa6d9" - integrity sha512-IsVN2EZdNHsmFdKWx9HaXb8T/s3FlR/U1QPt9dwbSyPtjFbMTlW9CRFvnn0bm/QIsrMRD2oMZqrQpSWPQVbXXg== +"@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.4", "@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.2" + "@inquirer/core" "^10.1.4" "@inquirer/type" "^3.0.2" yoctocolors-cjs "^2.1.2" -"@inquirer/search@^3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@inquirer/search/-/search-3.0.4.tgz#fcf51a853536add37491920634a182ecc9f5524b" - integrity sha512-tSkJk2SDmC2MEdTIjknXWmCnmPr5owTs9/xjfa14ol1Oh95n6xW7SYn5fiPk4/vrJPys0ggSWiISdPze4LTa7A== +"@inquirer/search@^3.0.4", "@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.2" + "@inquirer/core" "^10.1.4" "@inquirer/figures" "^1.0.9" "@inquirer/type" "^3.0.2" yoctocolors-cjs "^2.1.2" -"@inquirer/select@^4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-4.0.4.tgz#026ada15754def1cd3fbc01efc56eae45ccc7de4" - integrity sha512-ZzYLuLoUzTIW9EJm++jBpRiTshGqS3Q1o5qOEQqgzaBlmdsjQr6pA4TUNkwu6OBYgM2mIRbCz6mUhFDfl/GF+w== +"@inquirer/select@^4.0.4", "@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.2" + "@inquirer/core" "^10.1.4" "@inquirer/figures" "^1.0.9" "@inquirer/type" "^3.0.2" ansi-escapes "^4.3.2" @@ -2415,15 +2422,6 @@ dependencies: langium "3.0.0" -"@microsoft/api-extractor-model@7.30.1": - version "7.30.1" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.30.1.tgz#719e2ab8afe8fe3a5dd65aaa8783dbba90f7c802" - integrity sha512-CTS2PlASJHxVY8hqHORVb1HdECWOEMcMnM6/kDkPr0RZapAFSIHhg9D4jxuE8g+OWYHtPc10LCpmde5pylTRlA== - dependencies: - "@microsoft/tsdoc" "~0.15.1" - "@microsoft/tsdoc-config" "~0.17.1" - "@rushstack/node-core-library" "5.10.1" - "@microsoft/api-extractor-model@7.30.2": version "7.30.2" resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.30.2.tgz#9c0b2446f6bbcdd0159e16b0e8f8694d645ce257" @@ -2433,7 +2431,7 @@ "@microsoft/tsdoc-config" "~0.17.1" "@rushstack/node-core-library" "5.10.2" -"@microsoft/api-extractor@7.49.1": +"@microsoft/api-extractor@7.49.1", "@microsoft/api-extractor@^7.24.2": 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== @@ -2452,25 +2450,6 @@ source-map "~0.6.1" typescript "5.7.2" -"@microsoft/api-extractor@^7.24.2": - version "7.48.1" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.48.1.tgz#792197cfc5113cd2efc04524c065d682ef58d2ba" - integrity sha512-HN9Osa1WxqLM66RaqB5nPAadx+nTIQmY/XtkFdaJvusjG8Tus++QqZtD7KPZDSkhEMGHsYeSyeU8qUzCDUXPjg== - dependencies: - "@microsoft/api-extractor-model" "7.30.1" - "@microsoft/tsdoc" "~0.15.1" - "@microsoft/tsdoc-config" "~0.17.1" - "@rushstack/node-core-library" "5.10.1" - "@rushstack/rig-package" "0.5.3" - "@rushstack/terminal" "0.14.4" - "@rushstack/ts-command-line" "4.23.2" - lodash "~4.17.15" - minimatch "~3.0.3" - resolve "~1.22.1" - semver "~7.5.4" - source-map "~0.6.1" - typescript "5.4.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" @@ -2825,11 +2804,6 @@ resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-20.0.0.tgz#9ec2daa0090eeb865ee147636e0c00f73790c6e5" integrity sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA== -"@octokit/openapi-types@^22.2.0": - version "22.2.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-22.2.0.tgz#75aa7dcd440821d99def6a60b5f014207ae4968e" - integrity sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg== - "@octokit/openapi-types@^23.0.1": version "23.0.1" resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-23.0.1.tgz#3721646ecd36b596ddb12650e0e89d3ebb2dd50e" @@ -2922,14 +2896,7 @@ dependencies: "@octokit/openapi-types" "^20.0.0" -"@octokit/types@^13.0.0", "@octokit/types@^13.1.0", "@octokit/types@^13.6.2": - version "13.6.2" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-13.6.2.tgz#e10fc4d2bdd65d836d1ced223b03ad4cfdb525bd" - integrity sha512-WpbZfZUcZU77DrSW4wbsSgTPfKcp286q3ItaIgvSbBpZJlu6mnYXAkjZz6LVZPXkEvLIM8McanyZejKTYUHipA== - dependencies: - "@octokit/openapi-types" "^22.2.0" - -"@octokit/types@^13.7.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== @@ -2942,14 +2909,14 @@ integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg== "@opentelemetry/context-async-hooks@^1.26.0": - version "1.30.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/context-async-hooks/-/context-async-hooks-1.30.0.tgz#5639c8a7d19c6fe04a44b86aa302cb09008f6db9" - integrity sha512-roCetrG/cz0r/gugQm/jFo75UxblVvHaNSRoR0kSSRSzXFAiIBqFCZuH458BHBNRtRe+0yJdIJ21L9t94bw7+g== + version "1.30.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/context-async-hooks/-/context-async-hooks-1.30.1.tgz#4f76280691a742597fd0bf682982126857622948" + integrity sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA== "@opentelemetry/core@^1.27.0": - version "1.30.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.30.0.tgz#ef959e11e137d72466e566e375ecc5a82e922b86" - integrity sha512-Q/3u/K73KUjTCnFUP97ZY+pBjQ1kPEgjOfXj/bJl8zW7GbXdkw6cwuyZk6ZTXkVgCBsYRYUzx4fvYK1jxdb9MA== + version "1.30.1" + resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.30.1.tgz#a0b468bb396358df801881709ea38299fc30ab27" + integrity sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ== dependencies: "@opentelemetry/semantic-conventions" "1.28.0" @@ -3131,10 +3098,10 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== -"@puppeteer/browsers@2.6.1": - version "2.6.1" - resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-2.6.1.tgz#d75aec5010cae377c5e4742bf5e4f62a79c21315" - integrity sha512-aBSREisdsGH890S2rQqK82qmQYU3uFpSH8wcZWHgHzl3LfzsxAKbLNiAG9mO8v1Y0UICBeClICxPJvyr0rcuxg== +"@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== dependencies: debug "^4.4.0" extract-zip "^2.0.1" @@ -3196,210 +3163,101 @@ estree-walker "^2.0.2" picomatch "^4.0.2" -"@rollup/rollup-android-arm-eabi@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.0.tgz#f2552f6984cfae52784b2fbf0e47633f38955d66" - integrity sha512-qFcFto9figFLz2g25DxJ1WWL9+c91fTxnGuwhToCl8BaqDsDYMl/kOnBXAyAqkkzAWimYMSWNPWEjt+ADAHuoQ== - "@rollup/rollup-android-arm-eabi@4.30.1": version "4.30.1" 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-arm64@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.0.tgz#7e5764268d3049b7341c60f1c650f1d71760a5b2" - integrity sha512-vqrQdusvVl7dthqNjWCL043qelBK+gv9v3ZiqdxgaJvmZyIAAXMjeGVSqZynKq69T7062T5VrVTuikKSAAVP6A== - "@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-darwin-arm64@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.0.tgz#c9245577f673802f0f6de0d46ee776691d77552e" - integrity sha512-617pd92LhdA9+wpixnzsyhVft3szYiN16aNUMzVkf2N+yAk8UXY226Bfp36LvxYTUt7MO/ycqGFjQgJ0wlMaWQ== - "@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-x64@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.0.tgz#e492705339542f8b54fa66f630c9d820bc708693" - integrity sha512-Y3b4oDoaEhCypg8ajPqigKDcpi5ZZovemQl9Edpem0uNv6UUjXv7iySBpGIUTSs2ovWOzYpfw9EbFJXF/fJHWw== - "@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-freebsd-arm64@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.0.tgz#3e13b5d4d44ea87598d5d4db97181db1174fb3c8" - integrity sha512-3REQJ4f90sFIBfa0BUokiCdrV/E4uIjhkWe1bMgCkhFXbf4D8YN6C4zwJL881GM818qVYE9BO3dGwjKhpo2ABA== - "@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-x64@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.0.tgz#138daa08d1b345d605f57b4dedd18a50420488e7" - integrity sha512-ZtY3Y8icbe3Cc+uQicsXG5L+CRGUfLZjW6j2gn5ikpltt3Whqjfo5mkyZ86UiuHF9Q3ZsaQeW7YswlHnN+lAcg== - "@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-linux-arm-gnueabihf@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.0.tgz#bdaece34f93c3dfd521e9ab8f5c740121862468e" - integrity sha512-bsPGGzfiHXMhQGuFGpmo2PyTwcrh2otL6ycSZAFTESviUoBOuxF7iBbAL5IJXc/69peXl5rAtbewBFeASZ9O0g== - "@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-musleabihf@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.0.tgz#1804c6ec49be21521eac612513e0666cdde2188c" - integrity sha512-kvyIECEhs2DrrdfQf++maCWJIQ974EI4txlz1nNSBaCdtf7i5Xf1AQCEJWOC5rEBisdaMFFnOWNLYt7KpFqy5A== - "@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-arm64-gnu@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.0.tgz#2c4bd90f77fcf769502743ec38f184c00a087e08" - integrity sha512-CFE7zDNrokaotXu+shwIrmWrFxllg79vciH4E/zeK7NitVuWEaXRzS0mFfFvyhZfn8WfVOG/1E9u8/DFEgK7WQ== - "@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-musl@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.0.tgz#63eadee20f220d28e85cbd10aba671ada8e89c84" - integrity sha512-MctNTBlvMcIBP0t8lV/NXiUwFg9oK5F79CxLU+a3xgrdJjfBLVIEHSAjQ9+ipofN2GKaMLnFFXLltg1HEEPaGQ== - "@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-loongarch64-gnu@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.0.tgz#1c2c2bb30f61cbbc0fcf4e6c359777fcdb7108cc" - integrity sha512-fBpoYwLEPivL3q368+gwn4qnYnr7GVwM6NnMo8rJ4wb0p/Y5lg88vQRRP077gf+tc25akuqd+1Sxbn9meODhwA== - "@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-powerpc64le-gnu@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.0.tgz#cea71e0359f086a01c57cf312bef9ec9cc3ba010" - integrity sha512-1hiHPV6dUaqIMXrIjN+vgJqtfkLpqHS1Xsg0oUfUVD98xGp1wX89PIXgDF2DWra1nxAd8dfE0Dk59MyeKaBVAw== - "@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-riscv64-gnu@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.0.tgz#25ab4a6dbcbd27f4a68382f7963363f886a237aa" - integrity sha512-U0xcC80SMpEbvvLw92emHrNjlS3OXjAM0aVzlWfar6PR0ODWCTQtKeeB+tlAPGfZQXicv1SpWwRz9Hyzq3Jx3g== - "@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-s390x-gnu@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.0.tgz#7054b237152d9e36c51194532a6b70ca1a62a487" - integrity sha512-VU/P/IODrNPasgZDLIFJmMiLGez+BN11DQWfTVlViJVabyF3JaeaJkP6teI8760f18BMGCQOW9gOmuzFaI1pUw== - "@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-x64-gnu@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.0.tgz#3656a8341a6048f2111f423301aaad8e84a5fe90" - integrity sha512-laQVRvdbKmjXuFA3ZiZj7+U24FcmoPlXEi2OyLfbpY2MW1oxLt9Au8q9eHd0x6Pw/Kw4oe9gwVXWwIf2PVqblg== - "@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-musl@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.0.tgz#cf8ae018ea6ff65eb36722a28beb93a20a6047f0" - integrity sha512-3wzKzduS7jzxqcOvy/ocU/gMR3/QrHEFLge5CD7Si9fyHuoXcidyYZ6jyx8OPYmCcGm3uKTUl+9jUSAY74Ln5A== - "@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-win32-arm64-msvc@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.0.tgz#6b968f5b068469db16eac743811ee6c040671042" - integrity sha512-jROwnI1+wPyuv696rAFHp5+6RFhXGGwgmgSfzE8e4xfit6oLRg7GyMArVUoM3ChS045OwWr9aTnU+2c1UdBMyw== - "@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-ia32-msvc@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.0.tgz#0321de1a0540dd402e8e523d90cbd9d16f1b9e96" - integrity sha512-duzweyup5WELhcXx5H1jokpr13i3BV9b48FMiikYAwk/MT1LrMYYk2TzenBd0jj4ivQIt58JWSxc19y4SvLP4g== - "@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-x64-msvc@4.30.0": - version "4.30.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.0.tgz#7384b359bb45c0c3c76ba2c7aaec1d047305efcb" - integrity sha512-DYvxS0M07PvgvavMIybCOBYheyrqlui6ZQBHJs6GqduVzHSZ06TPPvlfvnYstjODHQ8UUXFwt5YE+h0jFI8kwg== - "@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== -"@rushstack/node-core-library@5.10.1": - version "5.10.1" - resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-5.10.1.tgz#14c10c918ed12da003c21af9d5bf0e76633215d2" - integrity sha512-BSb/KcyBHmUQwINrgtzo6jiH0HlGFmrUy33vO6unmceuVKTEyL2q+P0fQq2oB5hvXVWOEUhxB2QvlkZluvUEmg== - dependencies: - ajv "~8.13.0" - ajv-draft-04 "~1.0.0" - ajv-formats "~3.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.10.2": version "5.10.2" resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-5.10.2.tgz#8d12bc5bd9244ea57f441877246efb0a1b7b7df6" @@ -3422,14 +3280,6 @@ resolve "~1.22.1" strip-json-comments "~3.1.1" -"@rushstack/terminal@0.14.4": - version "0.14.4" - resolved "https://registry.yarnpkg.com/@rushstack/terminal/-/terminal-0.14.4.tgz#37e160b0878a324cf3e0fecab25fe48a030e29ed" - integrity sha512-NxACqERW0PHq8Rpq1V6v5iTHEwkRGxenjEW+VWqRYQ8T9puUzgmGHmEZUaUEDHAe9Qyvp0/Ew04sAiQw9XjhJg== - dependencies: - "@rushstack/node-core-library" "5.10.1" - supports-color "~8.1.1" - "@rushstack/terminal@0.14.5": version "0.14.5" resolved "https://registry.yarnpkg.com/@rushstack/terminal/-/terminal-0.14.5.tgz#4b0e79b139b4372901956f920b5a4a405a1d09d8" @@ -3438,16 +3288,6 @@ "@rushstack/node-core-library" "5.10.2" supports-color "~8.1.1" -"@rushstack/ts-command-line@4.23.2": - version "4.23.2" - resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.23.2.tgz#37b28a418db84d04f6a1c787390dd02ad8dfadf0" - integrity sha512-JJ7XZX5K3ThBBva38aomgsPv1L7FV6XmSOcR6HtM7HDFZJkepqT65imw26h9ggGqMjsY0R9jcl30tzKcVj9aOQ== - dependencies: - "@rushstack/terminal" "0.14.4" - "@types/argparse" "1.0.38" - argparse "~1.0.9" - string-argv "~0.3.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" @@ -3467,53 +3307,53 @@ "@angular-devkit/schematics" "19.1.0-rc.0" jsonc-parser "3.3.1" -"@shikijs/core@1.26.1": - version "1.26.1" - resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-1.26.1.tgz#ba7399bee73148575277780c9fe4df656d582a65" - integrity sha512-yeo7sG+WZQblKPclUOKRPwkv1PyoHYkJ4gP9DzhFJbTdueKR7wYTI1vfF/bFi1NTgc545yG/DzvVhZgueVOXMA== +"@shikijs/core@1.27.0": + version "1.27.0" + resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-1.27.0.tgz#2245681160cf43d2bc45bc3013937c4fac8f9109" + integrity sha512-2RkIwaXVWxJQQw8JvqikTVe4gBxS3elH3qF3b7Ews1KdJc+TH9/nsVEftrtPn0bLOkdlMaGj5H2RBHpfWmRIcA== dependencies: - "@shikijs/engine-javascript" "1.26.1" - "@shikijs/engine-oniguruma" "1.26.1" - "@shikijs/types" "1.26.1" + "@shikijs/engine-javascript" "1.27.0" + "@shikijs/engine-oniguruma" "1.27.0" + "@shikijs/types" "1.27.0" "@shikijs/vscode-textmate" "^10.0.1" "@types/hast" "^3.0.4" hast-util-to-html "^9.0.4" -"@shikijs/engine-javascript@1.26.1": - version "1.26.1" - resolved "https://registry.yarnpkg.com/@shikijs/engine-javascript/-/engine-javascript-1.26.1.tgz#0881250e4a39a52b49cb50600f41bb19e429dcdb" - integrity sha512-CRhA0b8CaSLxS0E9A4Bzcb3LKBNpykfo9F85ozlNyArxjo2NkijtiwrJZ6eHa+NT5I9Kox2IXVdjUsP4dilsmw== +"@shikijs/engine-javascript@1.27.0": + version "1.27.0" + resolved "https://registry.yarnpkg.com/@shikijs/engine-javascript/-/engine-javascript-1.27.0.tgz#dcef0280092c49a1fe9130b693fb9ca16abf1e2d" + integrity sha512-1nzz37go+wb6uR97QSRtU4GEwx99efuucB6QI4R682wmPbti6LeWe5VcMNy8LJJt02GEYcZeJK6Lvq8YXBVNXA== dependencies: - "@shikijs/types" "1.26.1" + "@shikijs/types" "1.27.0" "@shikijs/vscode-textmate" "^10.0.1" - oniguruma-to-es "0.10.0" + oniguruma-to-es "^1.0.0" -"@shikijs/engine-oniguruma@1.26.1": - version "1.26.1" - resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-1.26.1.tgz#f9de733e2473e693b3d10bff32bb9761746c1d71" - integrity sha512-F5XuxN1HljLuvfXv7d+mlTkV7XukC1cawdtOo+7pKgPD83CAB1Sf8uHqP3PK0u7njFH0ZhoXE1r+0JzEgAQ+kg== +"@shikijs/engine-oniguruma@1.27.0": + version "1.27.0" + resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-1.27.0.tgz#4c34c92bee5adf8627243fdc70bf7aa84715adc3" + integrity sha512-x1XMJvQuToX2KhESav2cnaTFDEwpJ1bcczaXy8wlRWhPVVAGR/MxlWnJbhHFe+ETerQgdpLZN8l+EgO0rVfEFQ== dependencies: - "@shikijs/types" "1.26.1" + "@shikijs/types" "1.27.0" "@shikijs/vscode-textmate" "^10.0.1" -"@shikijs/langs@1.26.1": - version "1.26.1" - resolved "https://registry.yarnpkg.com/@shikijs/langs/-/langs-1.26.1.tgz#5365530e04715b21e40242eb331291712bdf7306" - integrity sha512-oz/TQiIqZejEIZbGtn68hbJijAOTtYH4TMMSWkWYozwqdpKR3EXgILneQy26WItmJjp3xVspHdiUxUCws4gtuw== +"@shikijs/langs@1.27.0": + version "1.27.0" + resolved "https://registry.yarnpkg.com/@shikijs/langs/-/langs-1.27.0.tgz#8457f8d9ca305dee01c9faa5bcb505e722bbdbdc" + integrity sha512-6fBE0OL17XGYlNj8IuHfKtTALLk6+CVAXw8Rj2y/K8NP646/hows9+XwzIFcvFo3wZ0fPAcPKQ9pwG6a1FBevw== dependencies: - "@shikijs/types" "1.26.1" + "@shikijs/types" "1.27.0" -"@shikijs/themes@1.26.1": - version "1.26.1" - resolved "https://registry.yarnpkg.com/@shikijs/themes/-/themes-1.26.1.tgz#6f6ee538dc1383b8a971464c5cecda06b1a6db0d" - integrity sha512-JDxVn+z+wgLCiUhBGx2OQrLCkKZQGzNH3nAxFir4PjUcYiyD8Jdms9izyxIogYmSwmoPTatFTdzyrRKbKlSfPA== +"@shikijs/themes@1.27.0": + version "1.27.0" + resolved "https://registry.yarnpkg.com/@shikijs/themes/-/themes-1.27.0.tgz#4c860c533a3bd5b05b9b7edc168cb9c73c7c21c8" + integrity sha512-L21LFq8hdsrBUXLh0fxKRURwE1brSlofK3Onutpwk71/EddfPqv60PG+Cg/KawPi8B04Mwp66EWw1shQjcYfBQ== dependencies: - "@shikijs/types" "1.26.1" + "@shikijs/types" "1.27.0" -"@shikijs/types@1.26.1": - version "1.26.1" - resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-1.26.1.tgz#b5ece69e21000f53d65d15ddae33d9ad9c3763ad" - integrity sha512-d4B00TKKAMaHuFYgRf3L0gwtvqpW4hVdVwKcZYbBfAAQXspgkbWqnFfuFl3MDH6gLbsubOcr+prcnsqah3ny7Q== +"@shikijs/types@1.27.0": + version "1.27.0" + resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-1.27.0.tgz#d649f5bd5e0e126ddf05f78b419dc41f9c3959b9" + integrity sha512-oOJdIeOnGo+hbM7MH+Ejpksse2ASex4DVHdvBoKyY3+26GEzG9PwM85BeXNGxUZuVxtVKo43sZl0qtJs/K2Zow== dependencies: "@shikijs/vscode-textmate" "^10.0.1" "@types/hast" "^3.0.4" @@ -3536,9 +3376,9 @@ integrity sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg== "@sigstore/protobuf-specs@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz#5becf88e494a920f548d0163e2978f81b44b7d6f" - integrity sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw== + version "0.3.3" + resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.3.3.tgz#7dd46d68b76c322873a2ef7581ed955af6f4dcde" + integrity sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ== "@sigstore/sign@^3.0.0": version "3.0.0" @@ -4065,9 +3905,9 @@ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.3.tgz#04174d3f0836863467b7fbcbbbcd69441d205715" - integrity sha512-JEhMNwUJt7bw728CydvYzntD0XJeTmDnvwLlbfbAhE7Tbslm/ax6bdIiUwTgeVlZTsJQPwZwKpAkyDtIjsvx3g== + version "5.0.4" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.4.tgz#88c29e3052cec3536d64b6ce5015a30dfcbefca7" + integrity sha512-5kz9ScmzBdzTgB/3susoCgfqNDzBjvLL4taparufgSvlwjdLy6UyUy9T/tCpYd2GIdIilCatC4iSQS0QSYHt0w== dependencies: "@types/node" "*" "@types/qs" "*" @@ -4253,9 +4093,9 @@ "@types/node" "*" "@types/node@*", "@types/node@>=10.0.0", "@types/node@>=13.7.0": - version "22.10.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.5.tgz#95af89a3fb74a2bb41ef9927f206e6472026e48b" - integrity sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ== + version "22.10.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.6.tgz#5c6795e71635876039f853cbccd59f523d9e4239" + integrity sha512-qNiuwC4ZDAUNcY47xgaSuS92cjf8JbSUoaKS77bmLG1rU7MlATVSiw/IlrjtIyyskXBZ8KkNfjK/P5na7rgXbQ== dependencies: undici-types "~6.20.0" @@ -4314,9 +4154,9 @@ integrity sha512-qYi3YV9inU/REEfxwVcGZzbS3KG/Xs90lv0Pr+lDtuVjBPGd1A+eciXzVSaRvLify132BfcvhvEjeVahrUl0Ug== "@types/qs@*": - version "6.9.17" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.17.tgz#fc560f60946d0aeff2f914eb41679659d3310e1a" - integrity sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ== + version "6.9.18" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.18.tgz#877292caa91f7c1b213032b34626505b746624c2" + integrity sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA== "@types/range-parser@*": version "1.2.7" @@ -4378,9 +4218,9 @@ integrity sha512-dyIGFKXfUFiwkMfNGn1+F6b80ZjR3uSYv1j6xVJSDlft5waZ2cwkHW4e7zNzvq7hiEackcgvBpmnXZrI1GltPg== "@types/selenium-webdriver@^4.1.21": - version "4.1.27" - resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-4.1.27.tgz#e08000d649df6f099b4099432bd2fece9f50ea7b" - integrity sha512-ALqsj8D7Swb6MnBQuAQ58J3KC3yh6fLGtAmpBmnZX8j+0kmP7NaLt56CuzBw2W2bXPrvHFTgn8iekOQFUKXEQA== + version "4.1.28" + resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-4.1.28.tgz#7b4f3c50a67494f8fd6d396a2eaab7d9df1f9f34" + integrity sha512-Au7CXegiS7oapbB16zxPToY4Cjzi9UQQMf3W2ZZM8PigMLTGR3iUAHjPUTddyE5g1SBjT/qpmvlsAQLBfNAdKg== dependencies: "@types/node" "*" "@types/ws" "*" @@ -4932,23 +4772,23 @@ ajv@~8.13.0: uri-js "^4.4.1" algoliasearch@^5.0.0: - version "5.18.0" - resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-5.18.0.tgz#2023232151f2ee9a580ea84d4a36676871979ce4" - integrity sha512-/tfpK2A4FpS0o+S78o3YSdlqXr0MavJIDlFK3XZrlXLy7vaRXJvW5jYg3v5e/wCaF8y0IpMjkYLhoV6QqfpOgw== - dependencies: - "@algolia/client-abtesting" "5.18.0" - "@algolia/client-analytics" "5.18.0" - "@algolia/client-common" "5.18.0" - "@algolia/client-insights" "5.18.0" - "@algolia/client-personalization" "5.18.0" - "@algolia/client-query-suggestions" "5.18.0" - "@algolia/client-search" "5.18.0" - "@algolia/ingestion" "1.18.0" - "@algolia/monitoring" "1.18.0" - "@algolia/recommend" "5.18.0" - "@algolia/requester-browser-xhr" "5.18.0" - "@algolia/requester-fetch" "5.18.0" - "@algolia/requester-node-http" "5.18.0" + version "5.19.0" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-5.19.0.tgz#2a1490bb46a937515797fac30b2d1503fb028536" + integrity sha512-zrLtGhC63z3sVLDDKGW+SlCRN9eJHFTgdEmoAOpsVh6wgGL1GgTTDou7tpCBjevzgIvi3AIyDAQO3Xjbg5eqZg== + dependencies: + "@algolia/client-abtesting" "5.19.0" + "@algolia/client-analytics" "5.19.0" + "@algolia/client-common" "5.19.0" + "@algolia/client-insights" "5.19.0" + "@algolia/client-personalization" "5.19.0" + "@algolia/client-query-suggestions" "5.19.0" + "@algolia/client-search" "5.19.0" + "@algolia/ingestion" "1.19.0" + "@algolia/monitoring" "1.19.0" + "@algolia/recommend" "5.19.0" + "@algolia/requester-browser-xhr" "5.19.0" + "@algolia/requester-fetch" "5.19.0" + "@algolia/requester-node-http" "5.19.0" "angular-1.5@npm:angular@1.5": version "1.5.11" @@ -5471,9 +5311,9 @@ balanced-match@^1.0.0: integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== bare-events@^2.0.0, bare-events@^2.2.0: - version "2.5.2" - resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.5.2.tgz#b161b0f4931038fff0a234d18d897851cc8e3554" - integrity sha512-KSdMqLj1ZERZMP1PTmnLK7SqJu9z9/SbwUUPZly2puMtfVcytC+jl6mb/9XYiqq0PXcx1rNDS+Qvl1g54Lho6A== + version "2.5.4" + resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.5.4.tgz#16143d435e1ed9eafd1ab85f12b89b3357a41745" + integrity sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA== bare-fs@^2.1.1: version "2.3.5" @@ -5497,9 +5337,9 @@ bare-path@^2.0.0, bare-path@^2.1.0: bare-os "^2.1.0" bare-stream@^2.0.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.6.1.tgz#b3b9874fab05b662c9aea2706a12fb0698c46836" - integrity sha512-eVZbtKM+4uehzrsj49KtCy3Pbg7kO1pJ3SKZ1SFrIH/0pnj9scuGGgUlNDf/7qS8WKtGdiJY5Kyhs/ivYPTB/g== + version "2.6.3" + resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.6.3.tgz#de1110df3b2374109cd88e01fa4a0cffc82efd64" + integrity sha512-AiqV593yTkEU3Lka0Sn+UT8X8U5hZ713RHa5Dg88GtJRite8TeD0oBOESNY6LnaBXTK0LjAW82OVhws+7L4JGA== dependencies: streamx "^2.21.0" @@ -5800,10 +5640,10 @@ browser-sync@^3.0.0: ua-parser-js "^1.0.33" yargs "^17.3.1" -browserslist@^4.21.5, browserslist@^4.23.0, browserslist@^4.23.3, browserslist@^4.24.0, browserslist@^4.24.2: - version "4.24.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.3.tgz#5fc2725ca8fb3c1432e13dac278c7cc103e026d2" - integrity sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA== +browserslist@^4.21.5, browserslist@^4.23.0, browserslist@^4.23.3, browserslist@^4.24.0, browserslist@^4.24.3: + version "4.24.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b" + integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== dependencies: caniuse-lite "^1.0.30001688" electron-to-chromium "^1.5.73" @@ -6041,9 +5881,9 @@ camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001688: - version "1.0.30001690" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz#f2d15e3aaf8e18f76b2b8c1481abde063b8104c8" - integrity sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w== + version "1.0.30001692" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz#4585729d95e6b95be5b439da6ab55250cd125bf9" + integrity sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A== canonical-path@1.0.0: version "1.0.0" @@ -6270,6 +6110,14 @@ chromium-bidi@0.11.0: mitt "3.0.1" zod "3.23.8" +chromium-bidi@0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.12.0.tgz#f4a34a821151086a7fe97f6d537819cefcf66820" + integrity sha512-xzXveJmX826GGq1MeE5okD8XxaDT8172CXByhFJ687eY65rbjOIebdbUuQh+jXKaNyGKI14Veb3KjLLmSueaxA== + dependencies: + mitt "3.0.1" + zod "3.24.1" + ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" @@ -6913,16 +6761,16 @@ copy-webpack-plugin@12.0.2: serialize-javascript "^6.0.2" core-js-compat@^3.38.0, core-js-compat@^3.38.1: - version "3.39.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.39.0.tgz#b12dccb495f2601dc860bdbe7b4e3ffa8ba63f61" - integrity sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw== + version "3.40.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.40.0.tgz#7485912a5a4a4315c2fdb2cbdc623e6881c88b38" + integrity sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ== dependencies: - browserslist "^4.24.2" + browserslist "^4.24.3" core-js@^3.6.5: - version "3.39.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.39.0.tgz#57f7647f4d2d030c32a72ea23a0555b2eaa30f83" - integrity sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g== + version "3.40.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.40.0.tgz#2773f6b06877d8eda102fc42f828176437062476" + integrity sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ== core-util-is@1.0.2: version "1.0.2" @@ -7079,7 +6927,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.1.0, cssstyle@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-4.1.0.tgz#161faee382af1bafadb6d3867a92a19bcb4aea70" integrity sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA== @@ -7111,9 +6959,9 @@ cytoscape-fcose@^2.2.0: cose-base "^2.2.0" cytoscape@^3.29.2: - version "3.30.4" - resolved "https://registry.yarnpkg.com/cytoscape/-/cytoscape-3.30.4.tgz#3404da0a159c00a1a3df2c85b2b43fdc66a0e28e" - integrity sha512-OxtlZwQl1WbwMmLiyPSEBuzeTIQnwZhJYYWFzZ2PhEHVFwpeaqNIkUzSiso00D98qk60l8Gwon2RP304d3BJ1A== + version "3.31.0" + resolved "https://registry.yarnpkg.com/cytoscape/-/cytoscape-3.31.0.tgz#cffbbb8ca51db01cbf360e0cf59088db6d429837" + integrity sha512-zDGn1K/tfZwEnoGOcHc0H4XazqAAXAuDpcYw9mUnUjATjqljyCNGJv8uEvbvxGaGHaVshxMecyl6oc6uKzRfbw== "d3-array@1 - 2": version "2.12.1" @@ -7882,8 +7730,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: @@ -7894,9 +7741,9 @@ dompurify@^3.2.1: "@types/trusted-types" "^2.0.7" domutils@^3.0.1, domutils@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.1.tgz#b39f4c390a1ae6f6a2c56a5f5a16d6438b6bce28" - integrity sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw== + version "3.2.2" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78" + integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw== dependencies: dom-serializer "^2.0.0" domelementtype "^2.3.0" @@ -8007,9 +7854,9 @@ ee-first@1.1.1: integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.5.73: - version "1.5.76" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz#db20295c5061b68f07c8ea4dfcbd701485d94a3d" - integrity sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ== + version "1.5.82" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.82.tgz#b9116ac6d6b6346c2baa49f14c1272ba2ce1ccdb" + integrity sha512-Zq16uk1hfQhyGx5GpwPAYDwddJuSGhtRhgOA2mCxANYaDT79nAeGnaXogMGng4KqLaJUVnOnuL0+TDop9nLOiA== emoji-regex-xs@^1.0.0: version "1.0.0" @@ -8232,9 +8079,9 @@ es-module-lexer@^1.2.1: integrity sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ== es-object-atoms@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" - integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.0.tgz#095de9ecceeb2ca79668212b60ead450ffd323bf" + integrity sha512-Ujz8Al/KfOVR7fkaghAB1WvnLsdYxHDWmfoi2vlA2jZWRg31XhIC1a4B+/I24muD8iSbHxJ1JkrfqmWb65P/Mw== dependencies: es-errors "^1.3.0" @@ -10030,9 +9877,9 @@ http-errors@~1.6.2: statuses ">= 1.4.0 < 2" http-parser-js@>=0.5.1: - version "0.5.8" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" - integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== + version "0.5.9" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.9.tgz#b817b3ca0edea6236225000d795378707c169cec" + integrity sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw== http-proxy-agent@^5.0.0: version "5.0.0" @@ -11432,9 +11279,9 @@ karma@~6.4.0: yargs "^16.1.1" katex@^0.16.9: - version "0.16.19" - resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.19.tgz#698e026188876f9c8c93d3ecb27b212aaa056d0a" - integrity sha512-3IA6DYVhxhBabjSLTNO9S4+OliA3Qvb8pBQXMfC4WxXJgLwZgnfDl0BmB4z6nBMdznBsZ+CGM8DrGZ5hcguDZg== + version "0.16.20" + resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.20.tgz#75c741ded0f7ee8d896a1d31bac307e61af863c3" + integrity sha512-jjuLaMGD/7P8jUTpdKhA9IoqnH+yMFB3sdAFtq5QdAqeP2PjiSbnC3EaguKPNtv6dXXanHxp1ckwvF4a86LBig== dependencies: commander "^8.3.0" @@ -11902,9 +11749,9 @@ long@^4.0.0: integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== long@^5.0.0: - version "5.2.3" - resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" - integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== + version "5.2.4" + resolved "https://registry.yarnpkg.com/long/-/long-5.2.4.tgz#ee651d5c7c25901cfca5e67220ae9911695e99b2" + integrity sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg== lower-case@^2.0.2: version "2.0.2" @@ -12127,9 +11974,9 @@ media-typer@0.3.0: integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== memfs@^4.6.0: - version "4.15.3" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.15.3.tgz#c4f9a5027dc0ac0b006f8d5a63aee128c829a37d" - integrity sha512-vR/g1SgqvKJgAyYla+06G4p/EOcEmwhYuVb1yc1ixcKf8o/sh7Zngv63957ZSNd1xrZJoinmNyDf2LzuP8WJXw== + version "4.17.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.17.0.tgz#a3c4b5490b9b1e7df5d433adc163e08208ce7ca2" + integrity sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg== dependencies: "@jsonjoy.com/json-pack" "^1.0.3" "@jsonjoy.com/util" "^1.3.0" @@ -12482,14 +12329,14 @@ mkdirp@^3.0.1: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50" integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== -mlly@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.7.3.tgz#d86c0fcd8ad8e16395eb764a5f4b831590cee48c" - integrity sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A== +mlly@^1.7.3, mlly@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.7.4.tgz#3d7295ea2358ec7a271eaa5d000a0f84febe100f" + integrity sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw== dependencies: acorn "^8.14.0" - pathe "^1.1.2" - pkg-types "^1.2.1" + pathe "^2.0.1" + pkg-types "^1.3.0" ufo "^1.5.4" module-definition@^6.0.0: @@ -12609,7 +12456,7 @@ nan@^2.12.1, nan@^2.20.0: resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.0.tgz#31bc433fc33213c97bad36404bb68063de604de3" integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw== -nanoid@^3.3.7: +nanoid@^3.3.7, nanoid@^3.3.8: version "3.3.8" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== @@ -12993,9 +12840,9 @@ obuf@^1.0.0, obuf@^1.1.2: integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== ogl@^1.0.3: - version "1.0.9" - resolved "https://registry.yarnpkg.com/ogl/-/ogl-1.0.9.tgz#92798375651f2b4df63031a3c884bee4e85076e2" - integrity sha512-nvalTfOqyxXKcSCOwxrJ/hFX/UjAj6mH5sFL7V7LZCNhkBd6j+hTiBzEa8etX1WH2oUmnZKi0e/748D9Dag+SA== + 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" @@ -13044,10 +12891,10 @@ onetime@^7.0.0: dependencies: mimic-function "^5.0.0" -oniguruma-to-es@0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/oniguruma-to-es/-/oniguruma-to-es-0.10.0.tgz#a696b95e6c523f5521d8ee7af5f4a54f1582febd" - integrity sha512-zapyOUOCJxt+xhiNRPPMtfJkHGsZ98HHB9qJEkdT8BGytO/+kpe4m1Ngf0MzbzTmhacn11w9yGeDP6tzDhnCdg== +oniguruma-to-es@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/oniguruma-to-es/-/oniguruma-to-es-1.0.0.tgz#6f7104cf0492e25d42b203d892b6d2d5f5f4d2e7" + integrity sha512-kihvp0O4lFwf5tZMkfanwQLIZ9ORe9OeOFgZonH0BQeThgwfJiaZFeOfvvJVnJIM9TiVmx0RDD35hUJDR0++rQ== dependencies: emoji-regex-xs "^1.0.0" regex "^5.1.1" @@ -13547,10 +13394,10 @@ path-type@^5.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-5.0.0.tgz#14b01ed7aea7ddf9c7c3f46181d4d04f9c785bb8" integrity sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg== -pathe@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" - integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== +pathe@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.1.tgz#ee1e6965c5ccfc98dc5a4b366a6ba6dd624a33d6" + integrity sha512-6jpjMpOth5S9ITVu5clZ7NOgHNsv5vRQdheL9ztp2vZmM6fRbLvyua1tiBIL4lk8SAe3ARzeXEly6siXCjDHDw== pause-stream@0.0.11: version "0.0.11" @@ -13630,7 +13477,7 @@ pgpass@1.x: dependencies: split2 "^4.1.0" -picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.0, picocolors@^1.1.1: +picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== @@ -13688,14 +13535,14 @@ pkg-dir@^7.0.0: dependencies: find-up "^6.3.0" -pkg-types@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.3.0.tgz#53d915eb99485798c554ad8eb2dc2af7c03006eb" - integrity sha512-kS7yWjVFCkIw9hqdJBoMxDdzEngmkr5FXeWZZfQ6GoYacjVnsW6l2CcYW/0ThD0vF4LPJgVYnrg4d0uuhwYQbg== +pkg-types@^1.2.1, 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== dependencies: confbox "^0.1.8" - mlly "^1.7.3" - pathe "^1.1.2" + mlly "^1.7.4" + pathe "^2.0.1" playwright-core@^1.41.2: version "1.49.1" @@ -13818,7 +13665,7 @@ postcss-values-parser@^6.0.2: is-url-superb "^4.0.0" quote-unquote "^1.0.0" -postcss@8.4.49, postcss@^8.2.14, postcss@^8.4.33, postcss@^8.4.40, postcss@^8.4.48, postcss@^8.4.49: +postcss@8.4.49: version "8.4.49" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19" integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== @@ -13827,6 +13674,15 @@ postcss@8.4.49, postcss@^8.2.14, postcss@^8.4.33, postcss@^8.4.40, postcss@^8.4. 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" @@ -13850,9 +13706,9 @@ postgres-interval@^1.1.0: xtend "^4.0.0" preact-render-to-string@^6.2.1: - version "6.5.12" - resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-6.5.12.tgz#57578b652d50294ae8084650e144e83a2bdb2217" - integrity sha512-FpU7/cRipZo4diSWQq7gZWVp+Px76CtVduJZNvQwVzynDsAIxKteMrjCCGPbM2oEasReoDffaeMCMlaur9ohIg== + version "6.5.13" + resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-6.5.13.tgz#cb9eb4a0df3576e7bfd78ef5f3d3bd57480e79ee" + integrity sha512-iGPd+hKPMFKsfpR2vL4kJ6ZPcFIoWZEcBf0Dpm3zOpdVvj77aY8RlLiQji5OMrngEyaxGogeakTb54uS2FvA6w== preact@^10.17.1: version "10.25.4" @@ -14096,12 +13952,12 @@ pupa@^2.1.1: dependencies: escape-goat "^2.0.0" -puppeteer-core@23.11.1: - version "23.11.1" - resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-23.11.1.tgz#3e064de11b3cb3a2df1a8060ff2d05b41be583db" - integrity sha512-3HZ2/7hdDKZvZQ7dhhITOUg4/wOrDRjyK2ZBllRB0ZCOi9u0cwq1ACHDjBB+nX+7+kltHjQvBRdeY7+W0T+7Gg== +puppeteer-core@24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-24.0.0.tgz#a9671518ac4ed0998db153e72c5dbe09170bba40" + integrity sha512-bHVXmnkYnMVSbsD+pJGt8fmGZLaVYOAieVnJcDxtLIVTMq0s5RfYdzN4xVlFoBQ3T06/sPkXxca3VLVfaqLxzg== dependencies: - "@puppeteer/browsers" "2.6.1" + "@puppeteer/browsers" "2.7.0" chromium-bidi "0.11.0" debug "^4.4.0" devtools-protocol "0.0.1367902" @@ -14127,15 +13983,15 @@ puppeteer-core@^5.1.0: ws "^7.2.3" puppeteer@*: - version "23.11.1" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-23.11.1.tgz#98fd9040786b1219b1a4f639c270377586e8899c" - integrity sha512-53uIX3KR5en8l7Vd8n5DUv90Ae9QDQsyIthaUFVzwV6yU750RjqRznEtNMBT20VthqAdemnJN+hxVdmMHKt7Zw== + version "24.0.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-24.0.0.tgz#d95d0765d5ff29dc50865e591e8676a9d4d9c5db" + integrity sha512-KRF2iWdHGSZkQ8pqftR5XR1jqnTqKRVZghMGJfJ665zS8++0cErRG2tXWfp98YqvMzsVLHfzBtTQlk0MMhCxzg== dependencies: - "@puppeteer/browsers" "2.6.1" - chromium-bidi "0.11.0" + "@puppeteer/browsers" "2.7.0" + chromium-bidi "0.12.0" cosmiconfig "^9.0.0" devtools-protocol "0.0.1367902" - puppeteer-core "23.11.1" + puppeteer-core "24.0.0" typed-query-selector "^2.12.0" q@1.4.1: @@ -14299,9 +14155,9 @@ readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable util-deprecate "~1.0.1" readable-stream@^4.0.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.6.0.tgz#ce412dfb19c04efde1c5936d99c27f37a1ff94c9" - integrity sha512-cbAdYt0VcnpN2Bekq7PU+k363ZRsPwJoEEJOEtSJQlJXzwaxt3FIo/uL+KeDSGIjJqtkwyge4KQgD2S2kd+CQw== + version "4.7.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.7.0.tgz#cedbd8a1146c13dfff8dab14068028d58c15ac91" + integrity sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg== dependencies: abort-controller "^3.0.0" buffer "^6.0.3" @@ -14326,9 +14182,9 @@ readdirp@^2.2.1: readable-stream "^2.0.2" 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== + version "4.1.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.1.tgz#bd115327129672dc47f87408f05df9bd9ca3ef55" + integrity sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw== readdirp@~3.6.0: version "3.6.0" @@ -14776,7 +14632,7 @@ rollup-plugin-terser@^7.0.1: serialize-javascript "^4.0.0" terser "^5.0.0" -rollup@4.30.1: +rollup@4.30.1, rollup@^4.23.0: version "4.30.1" resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.30.1.tgz#d5c3d066055259366cdc3eb6f1d051c5d6afaf74" integrity sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w== @@ -14804,34 +14660,6 @@ rollup@4.30.1: "@rollup/rollup-win32-x64-msvc" "4.30.1" fsevents "~2.3.2" -rollup@^4.23.0: - version "4.30.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.30.0.tgz#44ae4260029a8362113ef2a0cee7e02f3f740274" - integrity sha512-sDnr1pcjTgUT69qBksNF1N1anwfbyYG6TBQ22b03bII8EdiUQ7J0TlozVaTMjT/eEJAO49e1ndV7t+UZfL1+vA== - dependencies: - "@types/estree" "1.0.6" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.30.0" - "@rollup/rollup-android-arm64" "4.30.0" - "@rollup/rollup-darwin-arm64" "4.30.0" - "@rollup/rollup-darwin-x64" "4.30.0" - "@rollup/rollup-freebsd-arm64" "4.30.0" - "@rollup/rollup-freebsd-x64" "4.30.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.30.0" - "@rollup/rollup-linux-arm-musleabihf" "4.30.0" - "@rollup/rollup-linux-arm64-gnu" "4.30.0" - "@rollup/rollup-linux-arm64-musl" "4.30.0" - "@rollup/rollup-linux-loongarch64-gnu" "4.30.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.30.0" - "@rollup/rollup-linux-riscv64-gnu" "4.30.0" - "@rollup/rollup-linux-s390x-gnu" "4.30.0" - "@rollup/rollup-linux-x64-gnu" "4.30.0" - "@rollup/rollup-linux-x64-musl" "4.30.0" - "@rollup/rollup-win32-arm64-msvc" "4.30.0" - "@rollup/rollup-win32-ia32-msvc" "4.30.0" - "@rollup/rollup-win32-x64-msvc" "4.30.0" - fsevents "~2.3.2" - rollup@~1.11.3: version "1.11.3" resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.11.3.tgz#6f436db2a2d6b63f808bf60ad01a177643dedb81" @@ -15382,16 +15210,16 @@ shelljs@^0.8.5: rechoir "^0.6.2" shiki@^1.11.1: - version "1.26.1" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-1.26.1.tgz#eedb5f192a4d980a3e8bdd850ee390eef05cc386" - integrity sha512-Gqg6DSTk3wYqaZ5OaYtzjcdxcBvX5kCy24yvRJEgjT5U+WHlmqCThLuBUx0juyxQBi+6ug53IGeuQS07DWwpcw== - dependencies: - "@shikijs/core" "1.26.1" - "@shikijs/engine-javascript" "1.26.1" - "@shikijs/engine-oniguruma" "1.26.1" - "@shikijs/langs" "1.26.1" - "@shikijs/themes" "1.26.1" - "@shikijs/types" "1.26.1" + version "1.27.0" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-1.27.0.tgz#ae973e1c352bcc06def9c7454957e4b8210e8e96" + integrity sha512-PdrOqs36vGmftWETJJF6IJAUDS0ERYOYofHCBTHpLTvWLC8E/E6lyh+Xm1lMIZ/sBWT5uJSmri6NNW5ZDglMqQ== + dependencies: + "@shikijs/core" "1.27.0" + "@shikijs/engine-javascript" "1.27.0" + "@shikijs/engine-oniguruma" "1.27.0" + "@shikijs/langs" "1.27.0" + "@shikijs/themes" "1.27.0" + "@shikijs/types" "1.27.0" "@shikijs/vscode-textmate" "^10.0.1" "@types/hast" "^3.0.4" @@ -16127,9 +15955,9 @@ 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.4" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.4.tgz#ca5c6c4a35c4784e4e93a2a24dc4e9fa075250a4" - integrity sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now== + version "4.3.5" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.5.tgz#432cc99c81e28d7062c88d979d2163891e860489" + integrity sha512-K7npNOKGRYuhAFFzkzMGfxFDpN6gDwf8hcMiE+uveTVbBgm93HrNP3ZDUpKqzZ4pG7TP6fmb+EMAQPjq9FqqvA== stylus-lookup@^6.0.0: version "6.0.0" @@ -16239,9 +16067,9 @@ tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== tar-fs@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" - integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + version "2.1.2" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.2.tgz#425f154f3404cb16cb8ff6e671d45ab2ed9596c5" + integrity sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA== dependencies: chownr "^1.1.1" mkdirp-classic "^0.5.2" @@ -16249,9 +16077,9 @@ tar-fs@^2.0.0: tar-stream "^2.1.4" tar-fs@^3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.6.tgz#eaccd3a67d5672f09ca8e8f9c3d2b89fa173f217" - integrity sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w== + version "3.0.7" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.7.tgz#b8ecd22f9452e5116b93273a754a1f835edb5319" + integrity sha512-2sAfoF/zw/2n8goUGnGRZTWTD4INtnScPZvyYBI6BDlJ3wNR5o1dw03EfBvuhG6GBLvC4J+C7j7W+64aZ0ogQA== dependencies: pump "^3.0.0" tar-stream "^3.1.5" @@ -16524,9 +16352,9 @@ toidentifier@1.0.1: integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== tough-cookie@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-5.0.0.tgz#6b6518e2b5c070cf742d872ee0f4f92d69eac1af" - integrity sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q== + version "5.1.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-5.1.0.tgz#0667b0f2fbb5901fe6f226c3e0b710a9a4292f87" + integrity sha512-rvZUv+7MoBYTiDmFPBrhL7Ujx9Sk+q9wwm22x8c8T5IJaR+Wsyc7TNxbVxo84kZoRJZZMazowFLqpankBEQrGg== dependencies: tldts "^6.1.32" @@ -16771,9 +16599,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.31.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.31.0.tgz#a3de630c96eb77c281b6ba2affa5dae5fb3c326c" - integrity sha512-yCxltHW07Nkhv/1F6wWBr8kz+5BGMfP+RbRSYFnegVb0qV/UMT0G0ElBloPVerqn4M2ZV80Ir1FtCcYv1cT6vQ== + version "4.32.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.32.0.tgz#55bacdd6f2cf1392b7e9cde894e9b1d726807e97" + integrity sha512-rfgpoi08xagF3JSdtJlCwMq9DGNDE0IMh3Mkpc1wUypg9vPi786AiqeBBKcqvIkq42azsBM85N490fyZjeUftw== type-is@~1.6.18: version "1.6.18" @@ -16874,17 +16702,12 @@ typescript@3.2.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.2.4.tgz#c585cb952912263d915b462726ce244ba510ef3d" integrity sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg== -typescript@5.4.2: - version "5.4.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.2.tgz#0ae9cebcfae970718474fe0da2c090cad6577372" - integrity sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ== - -typescript@5.7.2, typescript@^5.4.4, typescript@^5.4.5, typescript@^5.5.4: +typescript@5.7.2: version "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.7.3, typescript@^5.4.4, typescript@^5.4.5, typescript@^5.5.4: 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== @@ -17154,17 +16977,17 @@ upath@^1.1.1: integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== 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== + version "1.1.2" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz#97e9c96ab0ae7bcac08e9ae5151d26e6bc6b5580" + integrity sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg== dependencies: escalade "^3.2.0" - picocolors "^1.1.0" + picocolors "^1.1.1" update-notifier-cjs@^5.1.6: - version "5.1.6" - resolved "https://registry.yarnpkg.com/update-notifier-cjs/-/update-notifier-cjs-5.1.6.tgz#6e3aff745d1551b55bb0a0a5939b7e636d95877d" - integrity sha512-wgxdSBWv3x/YpMzsWz5G4p4ec7JWD0HCl8W6bmNB6E5Gwo+1ym5oN4hiXpLf0mPySVEJEIsYlkshnplkg2OP9A== + version "5.1.7" + resolved "https://registry.yarnpkg.com/update-notifier-cjs/-/update-notifier-cjs-5.1.7.tgz#995733b43bdaeb136b999d55061fc385ef787a7f" + integrity sha512-eZWTh8F+VCEoC4UIh0pKmh8h4izj65VvLhCpJpVefUxdYe0fU3GBrC4Sbh1AoWA/miNPAb6UVlp2fUQNsfp+3g== dependencies: boxen "^5.0.0" chalk "^4.1.0" @@ -17240,9 +17063,9 @@ utils-merge@1.0.1: integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== uuid@^11.0.0: - version "11.0.4" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.0.4.tgz#37943977894ef806d2919a7ca3f89d6e23c60bac" - integrity sha512-IzL6VtTTYcAhA/oghbFJ1Dkmqev+FpQWnCBaKq/gUluLxliWvO8DPFWfIviRmYbtaavtSQe4WBL++rFjdcGWEg== + version "11.0.5" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.0.5.tgz#07b46bdfa6310c92c3fb3953a8720f170427fc62" + integrity sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA== uuid@^3.0.0, uuid@^3.3.2: version "3.4.0" @@ -18134,6 +17957,11 @@ zod@3.23.8: resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== +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== + zwitch@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" From bc77f448024daef42fdb2a0313687e54f29acbc3 Mon Sep 17 00:00:00 2001 From: arturovt Date: Sat, 11 Jan 2025 14:20:38 +0200 Subject: [PATCH 0086/1220] refactor(common): tree-shake `lcpObserver` in `NgOptimizedImage` (#59481) Prior to this commit, the `this.lcpObserver?.updateImage` expression was still preserved in the production code because it wasn't wrapped with `ngDevMode`. The observer is injected only in development mode. Additionally, we moved the logic from `ngOnDestroy` to avoid having an empty method in production. PR Close #59481 --- goldens/public-api/common/index.api.md | 5 +- .../ng_optimized_image/ng_optimized_image.ts | 57 +++++++++++-------- 2 files changed, 34 insertions(+), 28 deletions(-) diff --git a/goldens/public-api/common/index.api.md b/goldens/public-api/common/index.api.md index bc3c75b958db..8029ec7aacee 100644 --- a/goldens/public-api/common/index.api.md +++ b/goldens/public-api/common/index.api.md @@ -601,7 +601,8 @@ export abstract class NgLocalization { } // @public -export class NgOptimizedImage implements OnInit, OnChanges, OnDestroy { +export class NgOptimizedImage implements OnInit, OnChanges { + constructor(); disableOptimizedSrcset: boolean; fill: boolean; height: number | undefined; @@ -626,8 +627,6 @@ export class NgOptimizedImage implements OnInit, OnChanges, OnDestroy { // (undocumented) ngOnChanges(changes: SimpleChanges): void; // (undocumented) - ngOnDestroy(): void; - // (undocumented) ngOnInit(): void; ngSrc: string; ngSrcset: string; diff --git a/packages/common/src/directives/ng_optimized_image/ng_optimized_image.ts b/packages/common/src/directives/ng_optimized_image/ng_optimized_image.ts index 6a822176371d..c7c347615cdb 100644 --- a/packages/common/src/directives/ng_optimized_image/ng_optimized_image.ts +++ b/packages/common/src/directives/ng_optimized_image/ng_optimized_image.ts @@ -16,7 +16,6 @@ import { NgZone, numberAttribute, OnChanges, - OnDestroy, OnInit, PLATFORM_ID, Renderer2, @@ -31,6 +30,7 @@ import { ɵunwrapSafeValue as unwrapSafeValue, ChangeDetectorRef, ApplicationRef, + DestroyRef, } from '@angular/core'; import {RuntimeErrorCode} from '../../errors'; @@ -284,7 +284,7 @@ export interface ImagePlaceholderConfig { '[style.filter]': `placeholder && shouldBlurPlaceholder(placeholderConfig) ? "blur(${PLACEHOLDER_BLUR_AMOUNT}px)" : null`, }, }) -export class NgOptimizedImage implements OnInit, OnChanges, OnDestroy { +export class NgOptimizedImage implements OnInit, OnChanges { private imageLoader = inject(IMAGE_LOADER); private config: ImageConfig = processConfig(inject(IMAGE_CONFIG)); private renderer = inject(Renderer2); @@ -293,8 +293,9 @@ export class NgOptimizedImage implements OnInit, OnChanges, OnDestroy { private readonly isServer = isPlatformServer(inject(PLATFORM_ID)); private readonly preloadLinkCreator = inject(PreloadLinkCreator); - // a LCP image observer - should be injected only in the dev mode - private lcpObserver = ngDevMode ? this.injector.get(LCPImageObserver) : null; + // An LCP image observer should be injected only in development mode. + // Do not assign it to `null` to avoid having a redundant property in the production bundle. + private lcpObserver?: LCPImageObserver; /** * Calculate the rewritten `src` once and store it. @@ -400,6 +401,21 @@ export class NgOptimizedImage implements OnInit, OnChanges, OnDestroy { */ @Input() srcset?: string; + constructor() { + if (ngDevMode) { + this.lcpObserver = this.injector.get(LCPImageObserver); + + // Using `DestroyRef` to avoid having an empty `ngOnDestroy` method since this + // is only run in development mode. + const destroyRef = inject(DestroyRef); + destroyRef.onDestroy(() => { + if (!this.priority && this._renderedSrc !== null) { + this.lcpObserver!.unregisterImage(this._renderedSrc); + } + }); + } + } + /** @nodoc */ ngOnInit() { performanceMarkFeature('NgOptimizedImage'); @@ -444,12 +460,9 @@ export class NgOptimizedImage implements OnInit, OnChanges, OnDestroy { assertNoNgSrcsetWithoutLoader(this, this.imageLoader); assertNoLoaderParamsWithoutLoader(this, this.imageLoader); - if (this.lcpObserver !== null) { - const ngZone = this.injector.get(NgZone); - ngZone.runOutsideAngular(() => { - this.lcpObserver!.registerImage(this.getRewrittenSrc(), this.ngSrc, this.priority); - }); - } + ngZone.runOutsideAngular(() => { + this.lcpObserver!.registerImage(this.getRewrittenSrc(), this.ngSrc, this.priority); + }); if (this.priority) { const checker = this.injector.get(PreconnectLinkChecker); @@ -532,12 +545,15 @@ export class NgOptimizedImage implements OnInit, OnChanges, OnDestroy { if (changes['ngSrc'] && !changes['ngSrc'].isFirstChange()) { const oldSrc = this._renderedSrc; this.updateSrcAndSrcset(true); - const newSrc = this._renderedSrc; - if (this.lcpObserver !== null && oldSrc && newSrc && oldSrc !== newSrc) { - const ngZone = this.injector.get(NgZone); - ngZone.runOutsideAngular(() => { - this.lcpObserver?.updateImage(oldSrc, newSrc); - }); + + if (ngDevMode) { + const newSrc = this._renderedSrc; + if (oldSrc && newSrc && oldSrc !== newSrc) { + const ngZone = this.injector.get(NgZone); + ngZone.runOutsideAngular(() => { + this.lcpObserver!.updateImage(oldSrc, newSrc); + }); + } } } @@ -709,15 +725,6 @@ export class NgOptimizedImage implements OnInit, OnChanges, OnDestroy { callOnLoadIfImageIsLoaded(img, callback); } - /** @nodoc */ - ngOnDestroy() { - if (ngDevMode) { - if (!this.priority && this._renderedSrc !== null && this.lcpObserver !== null) { - this.lcpObserver.unregisterImage(this._renderedSrc); - } - } - } - private setHostAttribute(name: string, value: string): void { this.renderer.setAttribute(this.imgElement, name, value); } From 265265a3f8ac7759fed9c0b368b5db466fffa431 Mon Sep 17 00:00:00 2001 From: hawkgs Date: Mon, 16 Dec 2024 18:56:53 +0200 Subject: [PATCH 0087/1220] docs(docs-infra): fix scrolling issues in the API reference (#59207) Fix issues related to scrolling in the API reference: - Scroll to the top of the page when navigating to the API details page - Preserve scroll position when navigating back from the API details page PR Close #59207 --- adev/src/app/app-scroller.ts | 4 +- .../api-reference-details-page.component.ts | 10 ---- .../api-reference-list.component.html | 7 ++- .../api-reference-list.component.spec.ts | 18 ++++--- .../api-reference-list.component.ts | 47 ++++++++++--------- .../reference-scroll-handler.service.ts | 2 +- 6 files changed, 46 insertions(+), 42 deletions(-) diff --git a/adev/src/app/app-scroller.ts b/adev/src/app/app-scroller.ts index 69a9df0bf3c1..a7b8eb8cf813 100644 --- a/adev/src/app/app-scroller.ts +++ b/adev/src/app/app-scroller.ts @@ -23,10 +23,11 @@ export class AppScroller { private readonly viewportScroller = inject(ViewportScroller); private readonly appRef = inject(ApplicationRef); private readonly injector = inject(EnvironmentInjector); - disableScrolling = false; + private _lastScrollEvent?: Scroll; private canScroll = false; private cancelScroll?: () => void; + get lastScrollEvent(): Scroll | undefined { return this._lastScrollEvent; } @@ -41,7 +42,6 @@ export class AppScroller { this.canScroll = true; this._lastScrollEvent = e; }), - filter(() => !this.disableScrolling), filter(() => { const info = this.router.lastSuccessfulNavigation?.extras.info as Record< 'disableScrolling', 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 5593f197fba6..6cd36d3d1a1f 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 @@ -21,7 +21,6 @@ import { API_TAB_CLASS_NAME, API_REFERENCE_TAB_URL_ATTRIBUTE, } from '../constants/api-reference-prerender.constants'; -import {AppScroller} from '../../../app-scroller'; @Component({ selector: 'adev-reference-page', @@ -36,7 +35,6 @@ export default class ApiReferenceDetailsPage { private readonly document = inject(DOCUMENT); private readonly router = inject(Router); private readonly scrollHandler = inject(ReferenceScrollHandler); - private readonly appScroller = inject(AppScroller); docContent = input(); tab = input(); @@ -96,14 +94,6 @@ export default class ApiReferenceDetailsPage { return activeTabTitle === API_REFERENCE_TAB_API_LABEL || activeTabTitle === 'CLI'; }); - constructor() { - this.appScroller.disableScrolling = true; - } - - ngOnDestroy() { - this.appScroller.disableScrolling = false; - } - membersCardsLoaded(): void { this.scrollHandler.setupListeners(API_TAB_CLASS_NAME); } diff --git a/adev/src/app/features/references/api-reference-list/api-reference-list.component.html b/adev/src/app/features/references/api-reference-list/api-reference-list.component.html index f8d9d9d14c62..e621558c8b97 100644 --- a/adev/src/app/features/references/api-reference-list/api-reference-list.component.html +++ b/adev/src/app/features/references/api-reference-list/api-reference-list.component.html @@ -4,7 +4,12 @@

API Reference

- + { let component: ApiReferenceList; @@ -103,7 +105,7 @@ describe('ApiReferenceList', () => { }); it('should set selected type when provided type is different than selected', async () => { - expect(component.type()).toBe(ALL_STATUSES_KEY); + expect(component.type()).toBe(ALL_TYPES_KEY); component.filterByItemType(ApiItemType.BLOCK); await RouterTestingHarness.create(`/api?type=${ApiItemType.BLOCK}`); expect(component.type()).toBe(ApiItemType.BLOCK); @@ -116,12 +118,15 @@ describe('ApiReferenceList', () => { component.filterByItemType(ApiItemType.BLOCK); harness.navigateByUrl(`/api`); - expect(component.type()).toBe(ALL_STATUSES_KEY); + expect(component.type()).toBe(ALL_TYPES_KEY); }); - it('should set the value of the queryParam equal to the query value', async () => { + it('should set the value of the queryParam equal to the query text field', async () => { const location = TestBed.inject(Location); - component.query.set('item1'); + + const textField = fixture.debugElement.query(By.directive(TextField)); + (textField.componentInstance as TextField).setValue('item1'); + await fixture.whenStable(); expect(location.path()).toBe(`?query=item1&type=All`); }); @@ -129,7 +134,8 @@ describe('ApiReferenceList', () => { it('should keep the values of existing queryParams and set new queryParam equal to the type', async () => { const location = TestBed.inject(Location); - component.query.set('item1'); + const textField = fixture.debugElement.query(By.directive(TextField)); + (textField.componentInstance as TextField).setValue('item1'); await fixture.whenStable(); expect(location.path()).toBe(`?query=item1&type=All`); diff --git a/adev/src/app/features/references/api-reference-list/api-reference-list.component.ts b/adev/src/app/features/references/api-reference-list/api-reference-list.component.ts index 78f6d0a7f042..95bbdd82d025 100644 --- a/adev/src/app/features/references/api-reference-list/api-reference-list.component.ts +++ b/adev/src/app/features/references/api-reference-list/api-reference-list.component.ts @@ -11,7 +11,6 @@ import { Component, ElementRef, computed, - effect, inject, model, signal, @@ -28,7 +27,7 @@ import ApiItemLabel from '../api-item-label/api-item-label.component'; import {ApiLabel} from '../pipes/api-label.pipe'; import {ApiItemsGroup} from '../interfaces/api-items-group'; -export const ALL_STATUSES_KEY = 'All'; +export const ALL_TYPES_KEY = 'All'; @Component({ selector: 'adev-reference-list', @@ -44,7 +43,7 @@ export default class ApiReferenceList { // inputs query = model(''); - type = model(ALL_STATUSES_KEY); + type = model(ALL_TYPES_KEY); // const state itemTypes = Object.values(ApiItemType); @@ -61,26 +60,10 @@ export default class ApiReferenceList { // Use the CVA to focus when https://github.com/angular/angular/issues/31133 is implemented if (matchMedia('(hover: hover) and (pointer:fine)').matches) { scheduleOnIdle(() => { - this.filterInput().nativeElement.querySelector('input').focus(); + this.filterInput().nativeElement.querySelector('input').focus({preventScroll: true}); }); } }); - - effect(() => { - const params: Params = { - 'query': this.query() ?? null, - 'type': this.type() ?? null, - }; - - this.router.navigate([], { - queryParams: params, - replaceUrl: true, - preserveFragment: true, - info: { - disableScrolling: true, - }, - }); - }); } filteredGroups = computed((): ApiItemsGroup[] => { @@ -95,7 +78,7 @@ export default class ApiReferenceList { (query !== undefined ? apiItem.title.toLocaleLowerCase().includes(query) : true) && (this.includeDeprecated() ? true : apiItem.isDeprecated === this.includeDeprecated()) && (this.type() === undefined || - this.type() === ALL_STATUSES_KEY || + this.type() === ALL_TYPES_KEY || apiItem.itemType === this.type()) ); }), @@ -104,7 +87,27 @@ export default class ApiReferenceList { }); filterByItemType(itemType: ApiItemType): void { - this.type.update((currentType) => (currentType === itemType ? ALL_STATUSES_KEY : itemType)); + this.type.update((currentType) => (currentType === itemType ? ALL_TYPES_KEY : itemType)); + this.syncUrlWithFilters(); + } + + // Avoid calling in an `effect`. The `navigate` call will replace the state in + // the history which will nullify the `Scroll` position which, respectively, + // will break the scroll position restoration. Not only that but `disableScrolling=true`. + syncUrlWithFilters() { + const params: Params = { + 'query': this.query() ?? null, + 'type': this.type() ?? null, + }; + + this.router.navigate([], { + queryParams: params, + replaceUrl: true, + preserveFragment: true, + info: { + disableScrolling: true, + }, + }); } } 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 7dc77823fb87..b479de08d433 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 @@ -42,7 +42,7 @@ export class ReferenceScrollHandler { .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 handler scrolling instead of going to the fragment + // allow the scroller to handle scrolling instead of going to the fragment if (!fragment || this.appScroller.lastScrollEvent?.position) { this.appScroller.scroll(this.injector); return; From b9155b512175ede6ad56d69ccb04d556b293e589 Mon Sep 17 00:00:00 2001 From: hawkgs Date: Fri, 6 Dec 2024 14:55:46 +0200 Subject: [PATCH 0088/1220] docs: set syntax highlighting to the remaining Markdown code examples blocks (#59088) There are some code blocks that slipped through the initial Regex-es. Related to #59026 PR Close #59088 --- packages/common/http/src/request.ts | 2 +- .../ng_optimized_image/ng_optimized_image.ts | 2 +- .../src/ngtsc/diagnostics/src/error_code.ts | 2 +- .../src/ngtsc/reflection/src/host.ts | 8 ++-- .../src/ngtsc/reflection/src/typescript.ts | 4 +- .../src/ngtsc/typecheck/api/symbols.ts | 2 +- packages/compiler/src/core.ts | 23 +++++----- .../compiler/src/expression_parser/parser.ts | 6 +-- packages/compiler/src/render3/view/api.ts | 8 ++-- packages/compiler/src/shadow_css.ts | 8 ++-- .../src/template_parser/binding_parser.ts | 2 +- .../core/src/application/application_ref.ts | 4 +- .../differs/iterable_differs.ts | 2 +- .../differs/keyvalue_differs.ts | 2 +- .../scheduling/ng_zone_scheduling.ts | 4 +- packages/core/src/metadata/ng_module.ts | 2 +- packages/core/src/pending_tasks.ts | 4 +- packages/core/src/render3/definition.ts | 2 +- .../i18n_icu_container_visitor.ts | 2 +- .../render3/interfaces/attribute_marker.ts | 25 +++++------ .../core/src/render3/interfaces/injector.ts | 6 +-- packages/core/src/render3/interfaces/node.ts | 10 ++--- packages/core/src/render3/interfaces/view.ts | 10 ++--- packages/core/src/render3/state.ts | 4 +- .../directives/abstract_control_directive.ts | 4 +- packages/forms/src/model/abstract_model.ts | 6 +-- packages/forms/src/model/form_array.ts | 6 +-- packages/forms/src/model/form_group.ts | 6 +-- .../localize/src/localize/src/localize.ts | 2 +- .../platform-browser/animations/src/module.ts | 2 +- .../src/browser/tools/common_tools.ts | 2 +- .../src/directives/router_link_active.ts | 2 +- packages/router/src/models.ts | 14 +++---- packages/router/src/navigation_transition.ts | 2 +- packages/router/src/router.ts | 6 +-- packages/router/src/router_module.ts | 4 +- packages/router/src/router_state.ts | 2 +- .../src/dynamic/src/upgrade_adapter.ts | 14 +++---- .../zone.js/lib/zone.configurations.api.ts | 42 +++++++++---------- 39 files changed, 128 insertions(+), 130 deletions(-) diff --git a/packages/common/http/src/request.ts b/packages/common/http/src/request.ts index 25cc495e49a9..3ea5b63a73a1 100644 --- a/packages/common/http/src/request.ts +++ b/packages/common/http/src/request.ts @@ -170,7 +170,7 @@ export class HttpRequest { * To pass a string representation of HTTP parameters in the URL-query-string format, * the `HttpParamsOptions`' `fromString` may be used. For example: * - * ``` + * ```ts * new HttpParams({fromString: 'angular=awesome'}) * ``` */ diff --git a/packages/common/src/directives/ng_optimized_image/ng_optimized_image.ts b/packages/common/src/directives/ng_optimized_image/ng_optimized_image.ts index c7c347615cdb..99d3f87a5760 100644 --- a/packages/common/src/directives/ng_optimized_image/ng_optimized_image.ts +++ b/packages/common/src/directives/ng_optimized_image/ng_optimized_image.ts @@ -318,7 +318,7 @@ export class NgOptimizedImage implements OnInit, OnChanges { * descriptors to generate the final `srcset` property of the image. * * Example: - * ``` + * ```html * => * * ``` diff --git a/packages/compiler-cli/src/ngtsc/diagnostics/src/error_code.ts b/packages/compiler-cli/src/ngtsc/diagnostics/src/error_code.ts index 0240f4d65c60..a5013d246f95 100644 --- a/packages/compiler-cli/src/ngtsc/diagnostics/src/error_code.ts +++ b/packages/compiler-cli/src/ngtsc/diagnostics/src/error_code.ts @@ -273,7 +273,7 @@ export enum ErrorCode { * The left-hand side of an assignment expression was a template variable. Effectively, the * template looked like: * - * ``` + * ```html * * * diff --git a/packages/compiler-cli/src/ngtsc/reflection/src/host.ts b/packages/compiler-cli/src/ngtsc/reflection/src/host.ts index 9a13d26ff367..e3e02e09f145 100644 --- a/packages/compiler-cli/src/ngtsc/reflection/src/host.ts +++ b/packages/compiler-cli/src/ngtsc/reflection/src/host.ts @@ -153,7 +153,7 @@ export interface ClassMember { * * For example, the TS code: * - * ``` + * ```ts * class Clazz { * static get property(): string { * return 'value'; @@ -163,7 +163,7 @@ export interface ClassMember { * * Downlevels to: * - * ``` + * ```ts * var Clazz = (function () { * function Clazz() { * } @@ -182,7 +182,7 @@ export interface ClassMember { * Object.defineProperty ExpressionStatement, but the implementation would be this * FunctionDeclaration: * - * ``` + * ```ts * function () { * return 'value'; * }, @@ -624,7 +624,7 @@ export interface ReflectionHost { * If the declaration is in a different module, and that module is imported via an absolute path, * this method also returns the absolute path of the imported module. For example, if the code is: * - * ``` + * ```ts * import {RouterModule} from '@angular/core'; * * export const ROUTES = RouterModule.forRoot([...]); diff --git a/packages/compiler-cli/src/ngtsc/reflection/src/typescript.ts b/packages/compiler-cli/src/ngtsc/reflection/src/typescript.ts index 25034bb62016..afc16a40ce13 100644 --- a/packages/compiler-cli/src/ngtsc/reflection/src/typescript.ts +++ b/packages/compiler-cli/src/ngtsc/reflection/src/typescript.ts @@ -319,13 +319,13 @@ export class TypeScriptReflectionHost implements ReflectionHost { * * For example, if the identifier is the `Directive` part of a qualified type chain like: * - * ``` + * ```ts * core.Directive * ``` * * then it might be that `core` is a namespace import such as: * - * ``` + * ```ts * import * as core from 'tslib'; * ``` * diff --git a/packages/compiler-cli/src/ngtsc/typecheck/api/symbols.ts b/packages/compiler-cli/src/ngtsc/typecheck/api/symbols.ts index 7dc284733cba..935518f5cf31 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/api/symbols.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/api/symbols.ts @@ -190,7 +190,7 @@ export interface ReferenceSymbol { /** * The location in the shim file of a variable that holds the type of the local ref. * For example, a reference declaration like the following: - * ``` + * ```ts * var _t1 = document.createElement('div'); * var _t2 = _t1; // This is the reference declaration * ``` diff --git a/packages/compiler/src/core.ts b/packages/compiler/src/core.ts index 2af6d170b9aa..a0a2d6d352c5 100644 --- a/packages/compiler/src/core.ts +++ b/packages/compiler/src/core.ts @@ -221,12 +221,12 @@ export const enum AttributeMarker { * ## Example: * * Given: - * ``` - *
... + * ```html + *
...
* ``` * * the generated code is: - * ``` + * ```ts * var _c1 = [AttributeMarker.Classes, 'foo', 'bar', 'baz']; * ``` */ @@ -240,12 +240,12 @@ export const enum AttributeMarker { * ## Example: * * Given: - * ``` + * ```html *
...
* ``` * * the generated code is: - * ``` + * ```ts * var _c1 = [AttributeMarker.Styles, 'width', '100px', 'height'. '200px', 'color', 'red']; * ``` */ @@ -256,13 +256,13 @@ export const enum AttributeMarker { * * For example, given the following HTML: * - * ``` + * ```html *
* ``` * * the generated code is: * - * ``` + * ```ts * var _c1 = ['moo', 'car', AttributeMarker.Bindings, 'foo', 'bar']; * ``` */ @@ -273,7 +273,7 @@ export const enum AttributeMarker { * * For example, given the following HTML: * - * ``` + * ```html *
* ``` * @@ -298,7 +298,7 @@ export const enum AttributeMarker { * * For example, given the following HTML: * - * ``` + * ```html *

* ``` * @@ -315,14 +315,15 @@ export const enum AttributeMarker { * * For example, given the following HTML: * - * ``` + * ```html *
* ``` * * the generated code is: * - * ``` + * ```ts * var _c1 = ['moo', 'car', AttributeMarker.I18n, 'foo', 'bar']; + * ``` */ I18n = 6, } diff --git a/packages/compiler/src/expression_parser/parser.ts b/packages/compiler/src/expression_parser/parser.ts index 429626ff5ec2..7d0013e57efb 100644 --- a/packages/compiler/src/expression_parser/parser.ts +++ b/packages/compiler/src/expression_parser/parser.ts @@ -176,7 +176,7 @@ export class Parser { * parsing errors in case the given expression is invalid. * * For example, - * ``` + * ```html *
* ^ ^ absoluteValueOffset for `templateValue` * absoluteKeyOffset for `templateKey` @@ -187,7 +187,7 @@ export class Parser { * 3. ngForOf -> items * * This is apparent from the de-sugared template: - * ``` + * ```html * * ``` * @@ -1215,7 +1215,7 @@ class _ParseAST { * parsing errors in case the given expression is invalid. * * For example, - * ``` + * ```html *
* ``` * contains five bindings: diff --git a/packages/compiler/src/render3/view/api.ts b/packages/compiler/src/render3/view/api.ts index 3643d997aed6..dff2cfbd75ea 100644 --- a/packages/compiler/src/render3/view/api.ts +++ b/packages/compiler/src/render3/view/api.ts @@ -156,7 +156,7 @@ export const enum DeclarationListEmitMode { /** * The list of declarations is emitted into the generated code as is. * - * ``` + * ```ts * directives: [MyDir], * ``` */ @@ -166,7 +166,7 @@ export const enum DeclarationListEmitMode { * The list of declarations is emitted into the generated code wrapped inside a closure, which * is needed when at least one declaration is a forward reference. * - * ``` + * ```ts * directives: function () { return [MyDir, ForwardDir]; }, * ``` */ @@ -180,13 +180,13 @@ export const enum DeclarationListEmitMode { * any forward references within the list are resolved when the outer closure is invoked. * * Consider the case where the runtime has captured two declarations in two distinct values: - * ``` + * ```ts * const dirA = MyDir; * const dirB = forwardRef(function() { return ForwardRef; }); * ``` * * This mode would emit the declarations captured in `dirA` and `dirB` as follows: - * ``` + * ```ts * directives: function () { return [dirA, dirB].map(ng.resolveForwardRef); }, * ``` */ diff --git a/packages/compiler/src/shadow_css.ts b/packages/compiler/src/shadow_css.ts index 0a40a35f67f0..f8548db07f11 100644 --- a/packages/compiler/src/shadow_css.ts +++ b/packages/compiler/src/shadow_css.ts @@ -214,7 +214,7 @@ export class ShadowCss { * * For example, we convert this css: * - * ``` + * ```scss * .box { * animation: box-animation 1s forwards; * } @@ -228,7 +228,7 @@ export class ShadowCss { * * to this: * - * ``` + * ```scss * .box { * animation: scopeName_box-animation 1s forwards; * } @@ -262,7 +262,7 @@ export class ShadowCss { * * For example, it takes a rule such as: * - * ``` + * ```scss * @keyframes box-animation { * to { * background-color: green; @@ -272,7 +272,7 @@ export class ShadowCss { * * and returns: * - * ``` + * ```scss * @keyframes scopeName_box-animation { * to { * background-color: green; diff --git a/packages/compiler/src/template_parser/binding_parser.ts b/packages/compiler/src/template_parser/binding_parser.ts index 52ed145016c6..136b36a579d8 100644 --- a/packages/compiler/src/template_parser/binding_parser.ts +++ b/packages/compiler/src/template_parser/binding_parser.ts @@ -263,7 +263,7 @@ export class BindingParser { /** * Parses the bindings in a microsyntax expression, e.g. - * ``` + * ```html * * ``` * diff --git a/packages/core/src/application/application_ref.ts b/packages/core/src/application/application_ref.ts index 50bc3e24ffb3..c590a4b7eb5d 100644 --- a/packages/core/src/application/application_ref.ts +++ b/packages/core/src/application/application_ref.ts @@ -116,7 +116,7 @@ export interface BootstrapOptions { * Optionally specify coalescing event change detections or not. * Consider the following case. * - * ``` + * ```html *
* *
@@ -140,7 +140,7 @@ export interface BootstrapOptions { * into a single change detection. * * Consider the following case. - * ``` + * ```ts * for (let i = 0; i < 10; i ++) { * ngZone.run(() => { * // do something diff --git a/packages/core/src/change_detection/differs/iterable_differs.ts b/packages/core/src/change_detection/differs/iterable_differs.ts index 4e943c0f47c6..e212d4845ae8 100644 --- a/packages/core/src/change_detection/differs/iterable_differs.ts +++ b/packages/core/src/change_detection/differs/iterable_differs.ts @@ -222,7 +222,7 @@ export class IterableDiffers { * which will only be applied to the injector for this component and its children. * This step is all that's required to make a new {@link IterableDiffer} available. * - * ``` + * ```ts * @Component({ * viewProviders: [ * IterableDiffers.extend([new ImmutableListDiffer()]) diff --git a/packages/core/src/change_detection/differs/keyvalue_differs.ts b/packages/core/src/change_detection/differs/keyvalue_differs.ts index 11f74458148b..6656f4aad3af 100644 --- a/packages/core/src/change_detection/differs/keyvalue_differs.ts +++ b/packages/core/src/change_detection/differs/keyvalue_differs.ts @@ -155,7 +155,7 @@ export class KeyValueDiffers { * which will only be applied to the injector for this component and its children. * This step is all that's required to make a new {@link KeyValueDiffer} available. * - * ``` + * ```ts * @Component({ * viewProviders: [ * KeyValueDiffers.extend([new ImmutableMapDiffer()]) diff --git a/packages/core/src/change_detection/scheduling/ng_zone_scheduling.ts b/packages/core/src/change_detection/scheduling/ng_zone_scheduling.ts index 381d4b3191e3..add6171bab41 100644 --- a/packages/core/src/change_detection/scheduling/ng_zone_scheduling.ts +++ b/packages/core/src/change_detection/scheduling/ng_zone_scheduling.ts @@ -181,7 +181,7 @@ export interface NgZoneOptions { * Optionally specify coalescing event change detections or not. * Consider the following case. * - * ``` + * ```html *
* *
@@ -204,7 +204,7 @@ export interface NgZoneOptions { * into a single change detection. * * Consider the following case. - * ``` + * ```ts * for (let i = 0; i < 10; i ++) { * ngZone.run(() => { * // do something diff --git a/packages/core/src/metadata/ng_module.ts b/packages/core/src/metadata/ng_module.ts index 38d32839e282..841eb4aa39f2 100644 --- a/packages/core/src/metadata/ng_module.ts +++ b/packages/core/src/metadata/ng_module.ts @@ -57,7 +57,7 @@ export interface NgModule { * The following example defines a class that is injected in * the HelloWorld NgModule: * - * ``` + * ```ts * class Greeter { * greet(name:string) { * return 'Hello ' + name + '!'; diff --git a/packages/core/src/pending_tasks.ts b/packages/core/src/pending_tasks.ts index b9042a81bbec..fa859a54c9af 100644 --- a/packages/core/src/pending_tasks.ts +++ b/packages/core/src/pending_tasks.ts @@ -107,7 +107,7 @@ export class PendingTasks { /** * Runs an asynchronous function and blocks the application's stability until the function completes. * - * ``` + * ```ts * pendingTasks.run(async () => { * const userData = await fetch('/api/user'); * this.userData.set(userData); @@ -117,7 +117,7 @@ export class PendingTasks { * Application stability is at least delayed until the next tick after the `run` method resolves * so it is safe to make additional updates to application state that would require UI synchronization: * - * ``` + * ```ts * const userData = await pendingTasks.run(() => fetch('/api/user')); * this.userData.set(userData); * ``` diff --git a/packages/core/src/render3/definition.ts b/packages/core/src/render3/definition.ts index 6b022c06d144..946afb68a4f7 100644 --- a/packages/core/src/render3/definition.ts +++ b/packages/core/src/render3/definition.ts @@ -242,7 +242,7 @@ interface ComponentDefinition extends Omit, 'features' * * This function has following structure. * - * ``` + * ```ts * function Template(ctx:T, creationMode: boolean) { * if (creationMode) { * // Contains creation mode instructions. diff --git a/packages/core/src/render3/instructions/i18n_icu_container_visitor.ts b/packages/core/src/render3/instructions/i18n_icu_container_visitor.ts index 993a7afc7e84..111a3a720458 100644 --- a/packages/core/src/render3/instructions/i18n_icu_container_visitor.ts +++ b/packages/core/src/render3/instructions/i18n_icu_container_visitor.ts @@ -74,7 +74,7 @@ export function loadIcuContainerVisitor() { * to determine which root belong to the ICU. * * Example of usage. - * ``` + * ```ts * const nextRNode = icuContainerIteratorStart(tIcuContainerNode, lView); * let rNode: RNode|null; * while(rNode = nextRNode()) { diff --git a/packages/core/src/render3/interfaces/attribute_marker.ts b/packages/core/src/render3/interfaces/attribute_marker.ts index 4b2e4261c034..4be81ce23bb7 100644 --- a/packages/core/src/render3/interfaces/attribute_marker.ts +++ b/packages/core/src/render3/interfaces/attribute_marker.ts @@ -34,12 +34,12 @@ export const enum AttributeMarker { * ## Example: * * Given: - * ``` - *
... + * ```html + *
...
* ``` * * the generated code is: - * ``` + * ```ts * var _c1 = [AttributeMarker.Classes, 'foo', 'bar', 'baz']; * ``` */ @@ -53,12 +53,12 @@ export const enum AttributeMarker { * ## Example: * * Given: - * ``` + * ```html *
...
* ``` * * the generated code is: - * ``` + * ```ts * var _c1 = [AttributeMarker.Styles, 'width', '100px', 'height'. '200px', 'color', 'red']; * ``` */ @@ -69,13 +69,13 @@ export const enum AttributeMarker { * * For example, given the following HTML: * - * ``` + * ```html *
* ``` * * the generated code is: * - * ``` + * ```ts * var _c1 = ['moo', 'car', AttributeMarker.Bindings, 'foo', 'bar']; * ``` */ @@ -86,7 +86,7 @@ export const enum AttributeMarker { * * For example, given the following HTML: * - * ``` + * ```html *
* ``` * @@ -112,13 +112,13 @@ export const enum AttributeMarker { * * For example, given the following HTML: * - * ``` + * ```html *

* ``` * * the generated code for the `element()` instruction would include: * - * ``` + * ```ts * ['attr', 'value', AttributeMarker.ProjectAs, ['', 'title', '']] * ``` */ @@ -129,14 +129,15 @@ export const enum AttributeMarker { * * For example, given the following HTML: * - * ``` + * ```html *
* ``` * * the generated code is: * - * ``` + * ```ts * var _c1 = ['moo', 'car', AttributeMarker.I18n, 'foo', 'bar']; + * ``` */ I18n = 6, } diff --git a/packages/core/src/render3/interfaces/injector.ts b/packages/core/src/render3/interfaces/injector.ts index 6d51b13544c0..da035a2f9840 100644 --- a/packages/core/src/render3/interfaces/injector.ts +++ b/packages/core/src/render3/interfaces/injector.ts @@ -202,7 +202,7 @@ export class NodeInjectorFactory { * Example: * * If we have a component and directive active an a single element as declared here - * ``` + * ```ts * component: * providers: [ {provide: String, useValue: 'component', multi: true} ], * viewProviders: [ {provide: String, useValue: 'componentView', multi: true} ], @@ -213,7 +213,7 @@ export class NodeInjectorFactory { * * Then the expected results are: * - * ``` + * ```ts * providers: ['component', 'directive'] * viewProviders: ['component', 'componentView', 'directive'] * ``` @@ -238,7 +238,7 @@ export class NodeInjectorFactory { * Example: * * Given: - * ``` + * ```ts * providers: [ {provide: String, useValue: 'all', multi: true} ], * viewProviders: [ {provide: String, useValue: 'viewOnly', multi: true} ], * ``` diff --git a/packages/core/src/render3/interfaces/node.ts b/packages/core/src/render3/interfaces/node.ts index 62e94bd828a9..b106d0627038 100644 --- a/packages/core/src/render3/interfaces/node.ts +++ b/packages/core/src/render3/interfaces/node.ts @@ -244,7 +244,7 @@ export interface TNode { * such a case the value stores an array of text nodes to insert. * * Example: - * ``` + * ```html *
* Hello World! *
@@ -257,7 +257,7 @@ export interface TNode { * `` itself. * * Pseudo code: - * ``` + * ```ts * if (insertBeforeIndex === null) { * // append as normal * } else if (Array.isArray(insertBeforeIndex)) { @@ -490,12 +490,12 @@ export interface TNode { * * For easier discussion assume this example: * ``'s view definition: - * ``` + * ```html * content1 * content2 * ``` * ``'s view definition: - * ``` + * ```html * * ``` * @@ -558,7 +558,7 @@ export interface TNode { * styling than the instruction. * * Imagine: - * ``` + * ```angular-ts *
* * @Directive({ diff --git a/packages/core/src/render3/interfaces/view.ts b/packages/core/src/render3/interfaces/view.ts index 9a22a958927e..f9a76db109f0 100644 --- a/packages/core/src/render3/interfaces/view.ts +++ b/packages/core/src/render3/interfaces/view.ts @@ -139,7 +139,7 @@ export interface LView extends Array { * Store the `TNode` of the location where the current `LView` is inserted into. * * Given: - * ``` + * ```html *
* *
@@ -154,7 +154,7 @@ export interface LView extends Array { * insertion information in the `TView` and instead we must store it in the `LView[T_HOST]`. * * So to determine where is our insertion parent we would execute: - * ``` + * ```ts * const parentLView = lView[PARENT]; * const parentTNode = lView[T_HOST]; * const insertionParent = parentLView[parentTNode.index]; @@ -249,7 +249,7 @@ export interface LView extends Array { * `DECLARATION_VIEW`. * * Example: - * ``` + * ```html * <#VIEW #myComp> *
* ... @@ -274,7 +274,7 @@ export interface LView extends Array { * `DECLARATION_COMPONENT_VIEW` to differentiate them. As in this example. * * Example showing intra component `LView` movement. - * ``` + * ```html * <#VIEW #myComp> *
* Content to render when condition is true. @@ -284,7 +284,7 @@ export interface LView extends Array { * The `thenBlock` and `elseBlock` is moved but not transplanted. * * Example showing inter component `LView` movement (transplanted view). - * ``` + * ```html * <#VIEW #myComp> * ... * diff --git a/packages/core/src/render3/state.ts b/packages/core/src/render3/state.ts index 32c007a29ad2..53b719ee85a3 100644 --- a/packages/core/src/render3/state.ts +++ b/packages/core/src/render3/state.ts @@ -176,7 +176,7 @@ interface InstructionState { * directives on children of that element. * * Example: - * ``` + * ```html * * Should match component / directive. * @@ -193,7 +193,7 @@ interface InstructionState { * Stores the root TNode that has the 'ngSkipHydration' attribute on it for later reference. * * Example: - * ``` + * ```html * * Should reference this root node * diff --git a/packages/forms/src/directives/abstract_control_directive.ts b/packages/forms/src/directives/abstract_control_directive.ts index 120d33bae05b..fe0911ec3441 100644 --- a/packages/forms/src/directives/abstract_control_directive.ts +++ b/packages/forms/src/directives/abstract_control_directive.ts @@ -278,7 +278,7 @@ export abstract class AbstractControlDirective { * @usageNotes * For example, for the following `FormGroup`: * - * ``` + * ```ts * form = new FormGroup({ * address: new FormGroup({ street: new FormControl() }) * }); @@ -312,7 +312,7 @@ export abstract class AbstractControlDirective { * @usageNotes * For example, for the following `FormGroup`: * - * ``` + * ```ts * form = new FormGroup({ * address: new FormGroup({ street: new FormControl() }) * }); diff --git a/packages/forms/src/model/abstract_model.ts b/packages/forms/src/model/abstract_model.ts index c7d4360c133b..f5624933c1fd 100644 --- a/packages/forms/src/model/abstract_model.ts +++ b/packages/forms/src/model/abstract_model.ts @@ -1430,7 +1430,7 @@ export abstract class AbstractControl = any> extends Abst * @usageNotes * ### Set the values for the controls in the form array * - * ``` + * ```ts * const arr = new FormArray([ * new FormControl(), * new FormControl() @@ -322,7 +322,7 @@ export class FormArray = any> extends Abst * @usageNotes * ### Patch the values for controls in a form array * - * ``` + * ```ts * const arr = new FormArray([ * new FormControl(), * new FormControl() @@ -388,7 +388,7 @@ export class FormArray = any> extends Abst * * ### Reset the values in a form array and the disabled status for the first control * - * ``` + * ```ts * arr.reset([ * {value: 'name', disabled: true}, * 'last' diff --git a/packages/forms/src/model/form_group.ts b/packages/forms/src/model/form_group.ts index ab4d126857ed..9841893df00e 100644 --- a/packages/forms/src/model/form_group.ts +++ b/packages/forms/src/model/form_group.ts @@ -381,7 +381,7 @@ export class FormGroup< * @usageNotes * ### Set the complete value for the form group * - * ``` + * ```ts * const form = new FormGroup({ * first: new FormControl(), * last: new FormControl() @@ -437,7 +437,7 @@ export class FormGroup< * @usageNotes * ### Patch the value for a form group * - * ``` + * ```ts * const form = new FormGroup({ * first: new FormControl(), * last: new FormControl() @@ -528,7 +528,7 @@ export class FormGroup< * * ### Reset the form group values and disabled status * - * ``` + * ```ts * const form = new FormGroup({ * first: new FormControl('first name'), * last: new FormControl('last name') diff --git a/packages/localize/src/localize/src/localize.ts b/packages/localize/src/localize/src/localize.ts index e862d91a7f90..117f17486ec6 100644 --- a/packages/localize/src/localize/src/localize.ts +++ b/packages/localize/src/localize/src/localize.ts @@ -28,7 +28,7 @@ export interface LocalizeFn { * * The compile-time translation inliner is able to replace the following code: * - * ``` + * ```ts * typeof $localize !== "undefined" && $localize.locale * ``` * diff --git a/packages/platform-browser/animations/src/module.ts b/packages/platform-browser/animations/src/module.ts index 14d4a19a7a9c..9c514a6bcff3 100644 --- a/packages/platform-browser/animations/src/module.ts +++ b/packages/platform-browser/animations/src/module.ts @@ -46,7 +46,7 @@ export class BrowserAnimationsModule { * @usageNotes * When registering the `BrowserAnimationsModule`, you can use the `withConfig` * function as follows: - * ``` + * ```ts * @NgModule({ * imports: [BrowserAnimationsModule.withConfig(config)] * }) diff --git a/packages/platform-browser/src/browser/tools/common_tools.ts b/packages/platform-browser/src/browser/tools/common_tools.ts index bf3fc651f259..d9133c1a645e 100644 --- a/packages/platform-browser/src/browser/tools/common_tools.ts +++ b/packages/platform-browser/src/browser/tools/common_tools.ts @@ -39,7 +39,7 @@ export class AngularProfiler { * `record` (boolean) - causes the profiler to record a CPU profile while * it exercises the change detector. Example: * - * ``` + * ```ts * ng.profiler.timeChangeDetection({record: true}) * ``` */ diff --git a/packages/router/src/directives/router_link_active.ts b/packages/router/src/directives/router_link_active.ts index f6162f7ebb46..4d2f6b82f143 100644 --- a/packages/router/src/directives/router_link_active.ts +++ b/packages/router/src/directives/router_link_active.ts @@ -143,7 +143,7 @@ export class RouterLinkActive implements OnChanges, OnDestroy, AfterContentInit * true -> Route is active * false -> Route is inactive * - * ``` + * ```html * { * constructor(private permissions: Permissions, private currentUser: UserToken) {} @@ -1071,8 +1070,7 @@ export type CanDeactivateFn = ( * Here, the defined guard function is provided as part of the `Route` object * in the router configuration: * - * ``` - * + * ```ts * @NgModule({ * imports: [ * RouterModule.forRoot([ @@ -1151,8 +1149,7 @@ export type CanMatchFn = (route: Route, segments: UrlSegment[]) => MaybeAsync = ( * Here, the defined guard function is provided as part of the `Route` object * in the router configuration: * - * ``` - * + * ```ts * @NgModule({ * imports: [ * RouterModule.forRoot([ @@ -1497,7 +1493,7 @@ export interface NavigationBehaviorOptions { * This feature is useful for redirects, such as redirecting to an error page, without changing * the value that will be displayed in the browser's address bar. * - * ``` + * ```ts * const canActivate: CanActivateFn = (route: ActivatedRouteSnapshot) => { * const userService = inject(UserService); * const router = inject(Router); diff --git a/packages/router/src/navigation_transition.ts b/packages/router/src/navigation_transition.ts index f209a3a98546..e2d94d8ff3c1 100644 --- a/packages/router/src/navigation_transition.ts +++ b/packages/router/src/navigation_transition.ts @@ -124,7 +124,7 @@ export interface UrlCreationOptions { * The following `go()` function navigates to the `list` route by * interpreting the destination URI as relative to the activated `child` route * - * ``` + * ```ts * @Component({...}) * class ChildComponent { * constructor(private router: Router, private route: ActivatedRoute) {} diff --git a/packages/router/src/router.ts b/packages/router/src/router.ts index ca305559117a..12cb111ed113 100644 --- a/packages/router/src/router.ts +++ b/packages/router/src/router.ts @@ -355,7 +355,7 @@ export class Router { * * @usageNotes * - * ``` + * ```ts * router.resetConfig([ * { path: 'team/:id', component: TeamCmp, children: [ * { path: 'simple', component: SimpleCmp }, @@ -498,7 +498,7 @@ export class Router { * * The following calls request navigation to an absolute path. * - * ``` + * ```ts * router.navigateByUrl("/team/33/user/11"); * * // Navigate without updating the URL @@ -540,7 +540,7 @@ export class Router { * * The following calls request navigation to a dynamic route path relative to the current URL. * - * ``` + * ```ts * router.navigate(['team', 33, 'user', 11], {relativeTo: route}); * * // Navigate without updating the URL, overriding the default behavior diff --git a/packages/router/src/router_module.ts b/packages/router/src/router_module.ts index f1477362bb8c..7fe1bbf4fae9 100644 --- a/packages/router/src/router_module.ts +++ b/packages/router/src/router_module.ts @@ -120,7 +120,7 @@ export class RouterModule { * * When registering the NgModule at the root, import as follows: * - * ``` + * ```ts * @NgModule({ * imports: [RouterModule.forRoot(ROUTES)] * }) @@ -171,7 +171,7 @@ export class RouterModule { * without creating a new Router service. * When registering for submodules and lazy-loaded submodules, create the NgModule as follows: * - * ``` + * ```ts * @NgModule({ * imports: [RouterModule.forChild(ROUTES)] * }) diff --git a/packages/router/src/router_state.ts b/packages/router/src/router_state.ts index ea88e9850fa4..00deff77de2c 100644 --- a/packages/router/src/router_state.ts +++ b/packages/router/src/router_state.ts @@ -349,7 +349,7 @@ export class ActivatedRouteSnapshot { * You can compute all params (or data) in the router state or to get params outside * of an activated component by traversing the `RouterState` tree as in the following * example: - * ``` + * ```ts * collectRouteParams(router: Router) { * let params = {}; * let stack: ActivatedRouteSnapshot[] = [router.routerState.snapshot.root]; diff --git a/packages/upgrade/src/dynamic/src/upgrade_adapter.ts b/packages/upgrade/src/dynamic/src/upgrade_adapter.ts index 3d83bae47296..fda4d24d0f03 100644 --- a/packages/upgrade/src/dynamic/src/upgrade_adapter.ts +++ b/packages/upgrade/src/dynamic/src/upgrade_adapter.ts @@ -198,7 +198,7 @@ export class UpgradeAdapter { * * ### Example * - * ``` + * ```angular-ts * const adapter = new UpgradeAdapter(forwardRef(() => MyNg2Module)); * const module = angular.module('myExample', []); * module.directive('greet', adapter.downgradeNg2Component(Greeter)); @@ -277,7 +277,7 @@ export class UpgradeAdapter { * * ### Example * - * ``` + * ```angular-ts * const adapter = new UpgradeAdapter(forwardRef(() => MyNg2Module)); * const module = angular.module('myExample', []); * @@ -327,7 +327,7 @@ export class UpgradeAdapter { * @usageNotes * ### Example * - * ``` + * ```ts * const upgradeAdapter = new UpgradeAdapter(MyNg2Module); * * // configure the adapter with upgrade/downgrade components and services @@ -386,7 +386,7 @@ export class UpgradeAdapter { * @usageNotes * ### Example * - * ``` + * ```angular-ts * const adapter = new UpgradeAdapter(MyNg2Module); * const module = angular.module('myExample', []); * module.directive('ng2', adapter.downgradeNg2Component(Ng2)); @@ -467,7 +467,7 @@ export class UpgradeAdapter { * @usageNotes * ### Example * - * ``` + * ```ts * class Login { ... } * class Server { ... } * @@ -507,7 +507,7 @@ export class UpgradeAdapter { * @usageNotes * ### Example * - * ``` + * ```ts * class Example { * } * @@ -538,7 +538,7 @@ export class UpgradeAdapter { * @usageNotes * ### Example * - * ``` + * ```ts * const upgradeAdapter = new UpgradeAdapter(MyNg2Module); * upgradeAdapter.declareNg1Module(['heroApp']); * ``` diff --git a/packages/zone.js/lib/zone.configurations.api.ts b/packages/zone.js/lib/zone.configurations.api.ts index 6c2096253006..652c062cf555 100644 --- a/packages/zone.js/lib/zone.configurations.api.ts +++ b/packages/zone.js/lib/zone.configurations.api.ts @@ -22,7 +22,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * const EventEmitter = require('events'); * class MyEmitter extends EventEmitter {} * const myEmitter = new MyEmitter(); @@ -52,7 +52,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * const fs = require('fs'); * * const zone = Zone.current.fork({name: 'myZone'}); @@ -80,7 +80,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * const zone = Zone.current.fork({name: 'myZone'}); * zone.run(() => { * setTimeout(() => { @@ -106,7 +106,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * const zone = Zone.current.fork({name: 'myZone'}); * zone.run(() => { * process.nextTick(() => { @@ -132,7 +132,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * const crypto = require('crypto'); * * const zone = Zone.current.fork({name: 'myZone'}); @@ -182,7 +182,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * const proto = Object.create(HTMLElement.prototype); * proto.createdCallback = function() { * console.log('createdCallback is invoked in the zone', Zone.current.name); @@ -225,7 +225,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * const zone = Zone.current.fork({name: 'myZone'}); * zone.run(() => { * div.addEventListener('click', () => { @@ -251,7 +251,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * const zone = Zone.current.fork({name: 'myZone'}); * zone.run(() => { * setTimeout(() => { @@ -279,7 +279,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * const zone = Zone.current.fork({name: 'myZone'}); * zone.run(() => { * requestAnimationFrame(() => { @@ -310,7 +310,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * const zone = Zone.current.fork({name: 'myZone'}); * zone.run(() => { * queueMicrotask(() => { @@ -342,7 +342,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * const zone = Zone.current.fork({name: 'myZone'}); * zone.run(() => { * div.addEventListener('click', () => { @@ -382,7 +382,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * const zone = Zone.current.fork({name: 'myZone'}); * zone.run(() => { * div.onclick = () => { @@ -407,7 +407,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * class TestCustomElement extends HTMLElement { * constructor() { super(); } * connectedCallback() {} @@ -443,7 +443,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * const zone = Zone.current.fork({ * name: 'myZone', * onScheduleTask: (delegate, curr, target, task) => { @@ -477,7 +477,7 @@ declare global { * * Consider the following examples: * - * ``` + * ```ts * const zone = Zone.current.fork({ * name: 'myZone' * }); @@ -506,7 +506,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * const zone = Zone.current.fork({ * name: 'myZone' * }); @@ -533,7 +533,7 @@ declare global { * * Consider the following examples: * - * ``` + * ```ts * const zone = Zone.current.fork({name: 'myZone'}); * * const p = Promise.resolve(1); @@ -716,7 +716,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * describe('jasmine.clock integration', () => { * beforeEach(() => { * jasmine.clock().install(); @@ -749,7 +749,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * describe('jasmine.clock integration', () => { * beforeEach(() => { * jasmine.clock().install(); @@ -774,7 +774,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * describe('jasmine.clock integration', () => { * beforeEach(() => { * jasmine.clock().install(); @@ -803,7 +803,7 @@ declare global { * * Consider the following example: * - * ``` + * ```ts * describe('wait never resolved promise', () => { * it('async with never resolved promise test', async(() => { * const p = new Promise(() => {}); From 88305373d14d1e5e7f5ce098755d1f971ecb408a Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Tue, 14 Jan 2025 20:13:29 +0000 Subject: [PATCH 0089/1220] build: update cross-repo angular dependencies (#59520) See associated pull request for more information. PR Close #59520 --- .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 | 4 +- yarn.lock | 16 ++++---- 15 files changed, 70 insertions(+), 68 deletions(-) diff --git a/.github/actions/saucelabs-legacy/action.yml b/.github/actions/saucelabs-legacy/action.yml index 18ab7e039c13..d9fa5aa1a704 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/bazel/setup@e8d26efbaea89c31f1580c61c968c8119f5247a6 - name: Setup Saucelabs Variables - uses: angular/dev-infra/github-actions/saucelabs@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/saucelabs@e8d26efbaea89c31f1580c61c968c8119f5247a6 - 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 b61d986599e1..2512d249c322 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@e8d26efbaea89c31f1580c61c968c8119f5247a6 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/bazel/setup@e8d26efbaea89c31f1580c61c968c8119f5247a6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/bazel/configure-remote@e8d26efbaea89c31f1580c61c968c8119f5247a6 - 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + - uses: angular/dev-infra/github-actions/previews/pack-and-upload-artifact@e8d26efbaea89c31f1580c61c968c8119f5247a6 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 b1bc8b3e7420..18adeadbea09 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + - uses: angular/dev-infra/github-actions/previews/upload-artifacts-to-firebase@e8d26efbaea89c31f1580c61c968c8119f5247a6 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 dd23937bc701..805782f6f9a1 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + - uses: angular/dev-infra/github-actions/branch-manager@e8d26efbaea89c31f1580c61c968c8119f5247a6 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/benchmark-compare.yml b/.github/workflows/benchmark-compare.yml index 5993a09fdae0..28dee6c5c322 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + - uses: angular/dev-infra/github-actions/bazel/configure-remote@e8d26efbaea89c31f1580c61c968c8119f5247a6 with: bazelrc: ./.bazelrc.user diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bcc7cb57d8c1..0f532d7fa70a 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@e8d26efbaea89c31f1580c61c968c8119f5247a6 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@e8d26efbaea89c31f1580c61c968c8119f5247a6 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/bazel/setup@e8d26efbaea89c31f1580c61c968c8119f5247a6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/bazel/configure-remote@e8d26efbaea89c31f1580c61c968c8119f5247a6 - 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@e8d26efbaea89c31f1580c61c968c8119f5247a6 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/bazel/setup@e8d26efbaea89c31f1580c61c968c8119f5247a6 - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/bazel/configure-remote@e8d26efbaea89c31f1580c61c968c8119f5247a6 - 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@e8d26efbaea89c31f1580c61c968c8119f5247a6 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/bazel/setup@e8d26efbaea89c31f1580c61c968c8119f5247a6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/bazel/configure-remote@e8d26efbaea89c31f1580c61c968c8119f5247a6 - 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@e8d26efbaea89c31f1580c61c968c8119f5247a6 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/bazel/setup@e8d26efbaea89c31f1580c61c968c8119f5247a6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/bazel/configure-remote@e8d26efbaea89c31f1580c61c968c8119f5247a6 - 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@e8d26efbaea89c31f1580c61c968c8119f5247a6 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/bazel/setup@e8d26efbaea89c31f1580c61c968c8119f5247a6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/bazel/configure-remote@e8d26efbaea89c31f1580c61c968c8119f5247a6 - 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@e8d26efbaea89c31f1580c61c968c8119f5247a6 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@e8d26efbaea89c31f1580c61c968c8119f5247a6 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/bazel/setup@e8d26efbaea89c31f1580c61c968c8119f5247a6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/bazel/configure-remote@e8d26efbaea89c31f1580c61c968c8119f5247a6 - 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 1cc3d8a6088f..84259ca9a819 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + - uses: angular/dev-infra/github-actions/commit-message-based-labels@e8d26efbaea89c31f1580c61c968c8119f5247a6 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + - uses: angular/dev-infra/github-actions/post-approval-changes@e8d26efbaea89c31f1580c61c968c8119f5247a6 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 545cfa66df98..baadce3ba712 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + - uses: angular/dev-infra/github-actions/google-internal-tests@e8d26efbaea89c31f1580c61c968c8119f5247a6 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 baecbd8cf042..d2998a5f6a06 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@e8d26efbaea89c31f1580c61c968c8119f5247a6 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/bazel/setup@e8d26efbaea89c31f1580c61c968c8119f5247a6 - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/bazel/configure-remote@e8d26efbaea89c31f1580c61c968c8119f5247a6 - name: Setup Saucelabs Variables - uses: angular/dev-infra/github-actions/saucelabs@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/saucelabs@e8d26efbaea89c31f1580c61c968c8119f5247a6 - 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 10497129e42b..ab3d39fc3945 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + - uses: angular/dev-infra/github-actions/unified-status-check@e8d26efbaea89c31f1580c61c968c8119f5247a6 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/perf.yml b/.github/workflows/perf.yml index 7c89e30580eb..60a3fb73911c 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@e8d26efbaea89c31f1580c61c968c8119f5247a6 - 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@e8d26efbaea89c31f1580c61c968c8119f5247a6 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/bazel/setup@e8d26efbaea89c31f1580c61c968c8119f5247a6 - 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 4d991be9c39b..b89fd5af5b9b 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@e8d26efbaea89c31f1580c61c968c8119f5247a6 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/linting/licenses@e8d26efbaea89c31f1580c61c968c8119f5247a6 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@e8d26efbaea89c31f1580c61c968c8119f5247a6 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/bazel/setup@e8d26efbaea89c31f1580c61c968c8119f5247a6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/bazel/configure-remote@e8d26efbaea89c31f1580c61c968c8119f5247a6 - 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@e8d26efbaea89c31f1580c61c968c8119f5247a6 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/bazel/setup@e8d26efbaea89c31f1580c61c968c8119f5247a6 - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/bazel/configure-remote@e8d26efbaea89c31f1580c61c968c8119f5247a6 - 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@e8d26efbaea89c31f1580c61c968c8119f5247a6 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/bazel/setup@e8d26efbaea89c31f1580c61c968c8119f5247a6 - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/bazel/configure-remote@e8d26efbaea89c31f1580c61c968c8119f5247a6 - 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@e8d26efbaea89c31f1580c61c968c8119f5247a6 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/bazel/setup@e8d26efbaea89c31f1580c61c968c8119f5247a6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/bazel/configure-remote@e8d26efbaea89c31f1580c61c968c8119f5247a6 - 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@e8d26efbaea89c31f1580c61c968c8119f5247a6 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/bazel/setup@e8d26efbaea89c31f1580c61c968c8119f5247a6 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/bazel/configure-remote@e8d26efbaea89c31f1580c61c968c8119f5247a6 - 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@e8d26efbaea89c31f1580c61c968c8119f5247a6 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 9b4119fd30a2..e4e7cde06402 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@2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b + uses: angular/dev-infra/github-actions/create-pr-for-changes@e8d26efbaea89c31f1580c61c968c8119f5247a6 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 5a2a7866e13a..b250a5149ed4 100644 --- a/package.json +++ b/package.json @@ -160,9 +160,9 @@ "@actions/github": "^6.0.0", "@angular-devkit/architect-cli": "0.1901.0-rc.0", "@angular/animations": "^19.1.0-next", - "@angular/build-tooling": "https://github.com/angular/dev-infra-private-build-tooling-builds.git#4c48faf6dd5765b85e4a9cb9fd84ad2fb813a93e", + "@angular/build-tooling": "https://github.com/angular/dev-infra-private-build-tooling-builds.git#1298ed34f97ed13cce3177ffd25ac3292385b196", "@angular/core": "^19.1.0-next", - "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#34526428373727797ec4e28ef2ca2de795af5076", + "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#744e5a754635c8e8e008f957aba8f9dd8011cc8f", "@bazel/bazelisk": "^1.7.5", "@bazel/buildifier": "^8.0.0", "@bazel/ibazel": "^0.25.0", diff --git a/yarn.lock b/yarn.lock index e9ceeffa3386..12fb873ee5f0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -303,9 +303,10 @@ "@angular/core" "^13.0.0 || ^14.0.0-0" reflect-metadata "^0.1.13" -"@angular/build-tooling@https://github.com/angular/dev-infra-private-build-tooling-builds.git#4c48faf6dd5765b85e4a9cb9fd84ad2fb813a93e": - version "0.0.0-2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b" - resolved "https://github.com/angular/dev-infra-private-build-tooling-builds.git#4c48faf6dd5765b85e4a9cb9fd84ad2fb813a93e" +"@angular/build-tooling@https://github.com/angular/dev-infra-private-build-tooling-builds.git#1298ed34f97ed13cce3177ffd25ac3292385b196": + version "0.0.0-e8d26efbaea89c31f1580c61c968c8119f5247a6" + uid "1298ed34f97ed13cce3177ffd25ac3292385b196" + resolved "https://github.com/angular/dev-infra-private-build-tooling-builds.git#1298ed34f97ed13cce3177ffd25ac3292385b196" dependencies: "@angular/benchpress" "0.3.0" "@angular/build" "19.1.0-rc.0" @@ -426,9 +427,10 @@ dependencies: tslib "^2.3.0" -"@angular/ng-dev@https://github.com/angular/dev-infra-private-ng-dev-builds.git#34526428373727797ec4e28ef2ca2de795af5076": - version "0.0.0-2b88e32ff2651c2a8fbbe25c3e8b1c3696a4cc6b" - resolved "https://github.com/angular/dev-infra-private-ng-dev-builds.git#34526428373727797ec4e28ef2ca2de795af5076" +"@angular/ng-dev@https://github.com/angular/dev-infra-private-ng-dev-builds.git#744e5a754635c8e8e008f957aba8f9dd8011cc8f": + version "0.0.0-e8d26efbaea89c31f1580c61c968c8119f5247a6" + uid "744e5a754635c8e8e008f957aba8f9dd8011cc8f" + resolved "https://github.com/angular/dev-infra-private-ng-dev-builds.git#744e5a754635c8e8e008f957aba8f9dd8011cc8f" dependencies: "@google-cloud/spanner" "7.17.1" "@octokit/rest" "21.1.0" @@ -6927,7 +6929,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.1.0: +cssstyle@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-4.1.0.tgz#161faee382af1bafadb6d3867a92a19bcb4aea70" integrity sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA== From 9db23f9d12aea94aa6b7eb360ac2cf7f485e4883 Mon Sep 17 00:00:00 2001 From: Abdul Wahab Date: Wed, 15 Jan 2025 01:20:45 +0500 Subject: [PATCH 0090/1220] docs: fix property wrong usage inside afterNextRender in lifecycle.md (#59521) PR Close #59521 --- adev/src/content/guide/components/lifecycle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adev/src/content/guide/components/lifecycle.md b/adev/src/content/guide/components/lifecycle.md index e95fc7b9106d..c2285a425781 100644 --- a/adev/src/content/guide/components/lifecycle.md +++ b/adev/src/content/guide/components/lifecycle.md @@ -261,7 +261,7 @@ export class UserProfile { // Use the `Write` phase to write to a geometric property. write: () => { const padding = computePadding(); - const changed = padding !== prevPadding; + const changed = padding !== this.prevPadding; if (changed) { nativeElement.style.padding = padding; } From eadf6a35bbc7be94ae20c7989dd99a56060c0e2c Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Tue, 14 Jan 2025 14:15:03 -0800 Subject: [PATCH 0091/1220] Revert "refactor: initialize headers map directly in HttpHeaders class (#59268)" (#59523) This reverts commit e15226a444a3cf34feea226976c489735feb963e. PR Close #59523 --- packages/common/http/src/headers.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/common/http/src/headers.ts b/packages/common/http/src/headers.ts index ab9b46eb6c75..6b137c1562a0 100644 --- a/packages/common/http/src/headers.ts +++ b/packages/common/http/src/headers.ts @@ -23,7 +23,8 @@ export class HttpHeaders { /** * Internal map of lowercase header names to values. */ - private headers: Map = new Map(); + // TODO(issue/24571): remove '!'. + private headers!: Map; /** * Internal map of lowercased header names to the normalized @@ -46,9 +47,11 @@ export class HttpHeaders { constructor( headers?: string | {[name: string]: string | number | (string | number)[]} | Headers, ) { - if (!headers) return; - if (typeof headers === 'string') { + if (!headers) { + this.headers = new Map(); + } else if (typeof headers === 'string') { this.lazyInit = () => { + this.headers = new Map(); headers.split('\n').forEach((line) => { const index = line.indexOf(':'); if (index > 0) { @@ -59,6 +62,7 @@ export class HttpHeaders { }); }; } else if (typeof Headers !== 'undefined' && headers instanceof Headers) { + this.headers = new Map(); headers.forEach((value: string, name: string) => { this.addHeaderEntry(name, value); }); @@ -67,6 +71,7 @@ export class HttpHeaders { if (typeof ngDevMode === 'undefined' || ngDevMode) { assertValidHeaders(headers); } + this.headers = new Map(); Object.entries(headers).forEach(([name, values]) => { this.setHeaderEntries(name, values); }); From e702934080a569d9a5cb4e6d9bd7d4e6ffb4bc0c Mon Sep 17 00:00:00 2001 From: Sandeep Salwan Date: Tue, 14 Jan 2025 20:51:53 -0500 Subject: [PATCH 0092/1220] docs: fix typos in let.md (#59526) PR Close #59526 --- tools/manual_api_docs/blocks/let.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/manual_api_docs/blocks/let.md b/tools/manual_api_docs/blocks/let.md index 8b6d9778202a..cb76226d0598 100644 --- a/tools/manual_api_docs/blocks/let.md +++ b/tools/manual_api_docs/blocks/let.md @@ -45,4 +45,4 @@ The `@let` syntax is formally defined as: - Followed by an Angular expression which can be multi-line. - Terminated by the `;` symbol. -HELPFUL: A comprehensive description of the feature is availble on [the templates guide](guide/templates/variables#local-template-variables-with-let) +HELPFUL: A comprehensive description of the feature is available on [the templates guide](guide/templates/variables#local-template-variables-with-let) From 3e31438d59a4a0b0b0099e2cdf4f042eb457ef37 Mon Sep 17 00:00:00 2001 From: carimatics Date: Wed, 15 Jan 2025 00:25:00 +0900 Subject: [PATCH 0093/1220] docs(forms): escape inequality signs of input tags in flowchart (#59517) The input tags written within the flowcharts in the document were not being escaped, so we did that. This change will ensure that the flowcharts in the document are properly displayed. PR Close #59517 --- adev/src/content/guide/forms/overview.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/adev/src/content/guide/forms/overview.md b/adev/src/content/guide/forms/overview.md index 60a3ea327d3d..88d64454ddf8 100644 --- a/adev/src/content/guide/forms/overview.md +++ b/adev/src/content/guide/forms/overview.md @@ -110,7 +110,7 @@ The view-to-model diagram shows how data flows when an input field's value is ch ```mermaid flowchart TB U{User} - I("") + I("<input>") CVA(ControlValueAccessor) FC(FormControl) O(Observers) @@ -130,14 +130,14 @@ The model-to-view diagram shows how a programmatic change to the model is propag ```mermaid flowchart TB U{User} - I() + I("<input>") CVA(ControlValueAccessor) FC(FormControl) O(Observers) U-->|"Calls setValue() on the FormControl"|FC FC-->|Notifies the ControlValueAccessor|CVA FC-.->|Fires a 'valueChanges' event to observers|O - CVA-->|"Updates the value of the "|I + CVA-->|"Updates the value of the <input>"|I ``` ### Data flow in template-driven forms @@ -157,7 +157,7 @@ The view-to-model diagram shows how data flows when an input field's value is ch ```mermaid flowchart TB U{User} - I() + I("<input>") CVA(ControlValueAccessor) FC(FormControl) M(NgModel) @@ -207,7 +207,7 @@ flowchart TB FC2(FormControl) O(Observers) CVA(ControlValueAccessor) - I("") + I("<input>") FC2-.->|Fires a 'valueChanges' event to observers|O O-->|ControlValueAccessor receives valueChanges event|CVA CVA-->|Sets the value in the control|I From c38ea0767e507106bfb2b23bca538bc2ebc663e6 Mon Sep 17 00:00:00 2001 From: Jeremy Elbourn Date: Wed, 15 Jan 2025 08:23:12 -0800 Subject: [PATCH 0094/1220] docs: clarify that `@for` doesn't support break/continue (#59533) We recently saw some confusion around this, so it's worth adding a sentence to clarify PR Close #59533 --- adev/src/content/guide/templates/control-flow.md | 2 ++ tools/manual_api_docs/blocks/for.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/adev/src/content/guide/templates/control-flow.md b/adev/src/content/guide/templates/control-flow.md index 861d9247abcd..735b8a31a64c 100644 --- a/adev/src/content/guide/templates/control-flow.md +++ b/adev/src/content/guide/templates/control-flow.md @@ -50,6 +50,8 @@ A typical `@for` loop looks like: } ``` +Angular's `@for` block does not support flow-modifying statements like JavaScript's `continue` or `break`. + ### Why is `track` in `@for` blocks important? The `track` expression allows Angular to maintain a relationship between your data and the DOM nodes on the page. This allows Angular to optimize performance by executing the minimum necessary DOM operations when the data changes. diff --git a/tools/manual_api_docs/blocks/for.md b/tools/manual_api_docs/blocks/for.md index 2ad9fa9c6562..f3520567ff72 100644 --- a/tools/manual_api_docs/blocks/for.md +++ b/tools/manual_api_docs/blocks/for.md @@ -19,6 +19,8 @@ but there are performance advantages of using a regular `Array`. You can optionally include an `@empty` section immediately after the `@for` block content. The content of the `@empty` block displays when there are no items. +Angular's `@for` block does not support flow-modifying statements like JavaScript's `continue` or `break`. + ### `track` and objects identity The value of the `track` expression determines a key used to associate array items with the views in From 2a92dcf4b75b72753ccc17c2d12c0d0bf4f5a97d Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Wed, 15 Jan 2025 16:59:26 +0000 Subject: [PATCH 0095/1220] docs: update Angular CLI help [main] (#59535) Updated Angular CLI help contents. PR Close #59535 --- adev/src/content/cli/help/build-info.json | 2 +- adev/src/content/cli/help/generate.json | 240 +++++++++++----------- adev/src/content/cli/help/new.json | 38 ++-- adev/src/content/cli/help/serve.json | 4 +- 4 files changed, 142 insertions(+), 142 deletions(-) diff --git a/adev/src/content/cli/help/build-info.json b/adev/src/content/cli/help/build-info.json index 51ca1f2b7903..363d37326b30 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": "535acd73cae44750e5618de545a94ce2b2cd22b9" + "sha": "c1ba45fbdad011f8df4f2bc3cc03918a38026d0c" } \ No newline at end of file diff --git a/adev/src/content/cli/help/generate.json b/adev/src/content/cli/help/generate.json index afcd227fa3dd..127c04a74d7f 100644 --- a/adev/src/content/cli/help/generate.json +++ b/adev/src/content/cli/help/generate.json @@ -50,18 +50,18 @@ { "name": "app-shell", "command": "app-shell", - "shortDescription": "Generates an application shell for running a server-side version of an app.", + "shortDescription": "Configures your project to generate an app-shell during build time.", "options": [ { "name": "project", "type": "string", - "description": "The name of the related client app." + "description": "The name of the project where the app-shell should be generated." }, { "name": "server-routing", "type": "boolean", "default": false, - "description": "Creates a server application using the Server Routing API (Developer Preview)." + "description": "Set up a server application using the Server Routing and App Engine APIs (Developer Preview)." } ], "aliases": [], @@ -70,13 +70,13 @@ { "name": "application", "command": "application [name]", - "shortDescription": "Generates a new basic application definition in the \"projects\" subfolder of the workspace.", + "shortDescription": "Generates a new Angular application within your workspace. This schematic sets up the foundational structure of your project, including the root component, module, and configuration files. You can customize various aspects of the application, such as routing, styling, and testing.", "options": [ { "name": "experimental-zoneless", "type": "boolean", "default": false, - "description": "Create an application that does not utilize zone.js." + "description": "Generate an application that does not use `zone.js`." }, { "name": "inline-style", @@ -84,7 +84,7 @@ "aliases": [ "s" ], - "description": "Include styles inline in the root component.ts file. Only CSS styles can be included inline. Default is false, meaning that an external styles file is created and referenced in the root component.ts file." + "description": "Include the styles for the root component directly within the `app.component.ts` file. Only CSS styles can be included inline. By default, a separate stylesheet file (e.g., `app.component.css`) is created." }, { "name": "inline-template", @@ -92,18 +92,18 @@ "aliases": [ "t" ], - "description": "Include template inline in the root component.ts file. Default is false, meaning that an external template file is created and referenced in the root component.ts file. " + "description": "Include the HTML template for the root component directly within the `app.component.ts` file. By default, a separate template file (e.g., `app.component.html`) is created." }, { "name": "minimal", "type": "boolean", "default": false, - "description": "Create a bare-bones project without any testing frameworks. (Use for learning purposes only.)" + "description": "Generate a minimal project without any testing frameworks. This is intended for learning purposes and simple experimentation, not for production applications." }, { "name": "name", "type": "string", - "description": "The name of the new application.", + "description": "The name for the new application. This name will be used for the project directory and various identifiers throughout the application's code.", "positional": 0 }, { @@ -113,35 +113,35 @@ "p" ], "default": "app", - "description": "A prefix to apply to generated selectors." + "description": "A prefix to be added to the selectors of components generated within this application. For example, if the prefix is `my-app` and you generate a component named `my-component`, the selector will be `my-app-my-component`." }, { "name": "project-root", "type": "string", - "description": "The root directory of the new application." + "description": "The directory where the new application's files will be created, relative to the workspace root. If not specified, the application will be created in a subfolder within the `projects` directory, using the application's name." }, { "name": "routing", "type": "boolean", "default": true, - "description": "Creates an application with routing enabled." + "description": "Generate an application with routing already configured. This sets up the necessary files and modules for managing navigation between different views in your application." }, { "name": "server-routing", "type": "boolean", - "description": "Creates a server application using the Server Routing and App Engine APIs (Developer Preview)." + "description": "Set up a server application using the Server Routing and App Engine APIs (Developer Preview)." }, { "name": "skip-install", "type": "boolean", "default": false, - "description": "Skip installing dependency packages." + "description": "Skip the automatic installation of packages. You will need to manually install the dependencies later." }, { "name": "skip-package-json", "type": "boolean", "default": false, - "description": "Do not add dependencies to the \"package.json\" file." + "description": "Do not add dependencies to the `package.json` file." }, { "name": "skip-tests", @@ -150,25 +150,25 @@ "S" ], "default": false, - "description": "Do not create \"spec.ts\" test files for the application." + "description": "Skip the generation of a unit test files `spec.ts`." }, { "name": "ssr", "type": "boolean", "default": false, - "description": "Creates an application with Server-Side Rendering (SSR) and Static Site Generation (SSG/Prerendering) enabled." + "description": "Configure the application for Server-Side Rendering (SSR) and Static Site Generation (SSG/Prerendering)." }, { "name": "standalone", "type": "boolean", "default": true, - "description": "Creates an application based upon the standalone API, without NgModules." + "description": "Create an application that utilizes the standalone API, eliminating the need for NgModules. This can simplify the structure of your application." }, { "name": "strict", "type": "boolean", "default": true, - "description": "Creates an application with stricter bundle budgets settings." + "description": "Enable stricter bundle budget settings for the application. This helps to keep your application's bundle size small and improve performance. For more information, see https://angular.dev/tools/cli/template-typecheck#strict-mode" }, { "name": "style", @@ -180,7 +180,7 @@ "sass", "less" ], - "description": "The file extension or preprocessor to use for style files." + "description": "The type of stylesheet files to be created for components in the application." }, { "name": "view-encapsulation", @@ -190,7 +190,7 @@ "None", "ShadowDom" ], - "description": "The view encapsulation strategy to use in the new application." + "description": "Sets the view encapsulation mode for the application's components. This determines how component styles are scoped and applied." } ], "aliases": [ @@ -201,29 +201,29 @@ { "name": "class", "command": "class [name]", - "shortDescription": "Creates a new, generic class definition in the given project.", + "shortDescription": "Creates a new class in your project. Classes are the fundamental building blocks for object-oriented programming in TypeScript. They provide a blueprint for creating objects with properties and methods. This schematic helps you generate a new class with the basic structure and optional test files.", "options": [ { "name": "name", "type": "string", - "description": "The name of the new class.", + "description": "The name for the new class. This will be used to create the class file (e.g., `my-class.ts`) and, if enabled, the corresponding test file `my-class.spec.ts`.", "positional": 0 }, { "name": "project", "type": "string", - "description": "The name of the project." + "description": "The name of the project where the class should be added. If not specified, the CLI will determine the project from the current directory." }, { "name": "skip-tests", "type": "boolean", "default": false, - "description": "Do not create \"spec.ts\" test files for the new class." + "description": "Skip the generation of a unit test file `spec.ts` for the new class." }, { "name": "type", "type": "string", - "description": "Adds a developer-defined type to the filename, in the format \"name.type.ts\"." + "description": "Adds a custom type to the filename, allowing you to create more descriptive class names. For example, if you set the type to `helper`, the filename will be `my-class.helper.ts`." } ], "aliases": [ @@ -234,7 +234,7 @@ { "name": "component", "command": "component [name]", - "shortDescription": "Creates a new, generic component definition in the given project.", + "shortDescription": "Creates a new Angular component. Components are the basic building blocks of Angular applications. Each component consists of a TypeScript class, an HTML template, and an optional CSS stylesheet. Use this schematic to generate a new component in your project.", "options": [ { "name": "change-detection", @@ -247,7 +247,7 @@ "Default", "OnPush" ], - "description": "The change detection strategy to use in the new component." + "description": "Configures the change detection strategy for the component." }, { "name": "display-block", @@ -256,25 +256,25 @@ "b" ], "default": false, - "description": "Specifies if the style will contain `:host { display: block; }`." + "description": "Adds `:host { display: block; }` to the component's stylesheet, ensuring the component renders as a block-level element. This is useful for layout purposes." }, { "name": "export", "type": "boolean", "default": false, - "description": "The declaring NgModule exports this component." + "description": "Automatically export the component from the specified NgModule, making it accessible to other modules in the application." }, { "name": "export-default", "type": "boolean", "default": false, - "description": "Use default export for the component instead of a named export." + "description": "Use a default export for the component in its TypeScript file instead of a named export." }, { "name": "flat", "type": "boolean", "default": false, - "description": "Create the new files at the top level of the current project." + "description": "Create the component files directly in the project's `src/app` directory instead of creating a new folder for them." }, { "name": "inline-style", @@ -283,7 +283,7 @@ "s" ], "default": false, - "description": "Include styles inline in the component.ts file. Only CSS styles can be included inline. By default, an external styles file is created and referenced in the component.ts file." + "description": "Include the component's styles directly in the `component.ts` file. By default, a separate stylesheet file (e.g., `my-component.component.css`) is created." }, { "name": "inline-template", @@ -292,7 +292,7 @@ "t" ], "default": false, - "description": "Include template inline in the component.ts file. By default, an external template file is created and referenced in the component.ts file." + "description": "Include the component's HTML template directly in the `component.ts` file. By default, a separate template file (e.g., `my-component.component.html`) is created." }, { "name": "module", @@ -300,12 +300,12 @@ "aliases": [ "m" ], - "description": "The declaring NgModule." + "description": "Specify the NgModule where the component should be declared. If not provided, the CLI will attempt to find the closest NgModule in the component's path." }, { "name": "name", "type": "string", - "description": "The name of the component.", + "description": "The name for the new component. This will be used to create the component's class, template, and stylesheet files. For example, if you provide `my-component`, the files will be named `my-component.component.ts`, `my-component.component.html`, and `my-component.component.css`.", "positional": 0 }, { @@ -314,41 +314,41 @@ "aliases": [ "p" ], - "description": "The prefix to apply to the generated component selector." + "description": "A prefix to be added to the component's selector. For example, if the prefix is `app` and the component name is `my-component`, the selector will be `app-my-component`." }, { "name": "project", "type": "string", - "description": "The name of the project." + "description": "The name of the project where the component should be added. If not specified, the CLI will determine the project from the current directory." }, { "name": "selector", "type": "string", - "description": "The HTML selector to use for this component." + "description": "The HTML selector to use for this component. If not provided, a selector will be generated based on the component name (e.g., `app-my-component`)." }, { "name": "skip-import", "type": "boolean", "default": false, - "description": "Do not import this component into the owning NgModule." + "description": "Do not automatically import the new component into its closest NgModule." }, { "name": "skip-selector", "type": "boolean", "default": false, - "description": "Specifies if the component should have a selector or not." + "description": "Skip the generation of an HTML selector for the component." }, { "name": "skip-tests", "type": "boolean", "default": false, - "description": "Do not create \"spec.ts\" test files for the new component." + "description": "Skip the generation of unit test files `spec.ts`." }, { "name": "standalone", "type": "boolean", "default": true, - "description": "Whether the generated component is standalone." + "description": "Generate a standalone component. Standalone components are self-contained and don't need to be declared in an NgModule. They can be used independently or imported directly into other standalone components." }, { "name": "style", @@ -361,13 +361,13 @@ "less", "none" ], - "description": "The file extension or preprocessor to use for style files, or 'none' to skip generating the style file." + "description": "Specify the type of stylesheet to be created for the component, or `none` to skip creating a stylesheet." }, { "name": "type", "type": "string", "default": "Component", - "description": "Adds a developer-defined type to the filename, in the format \"name.type.ts\"." + "description": "Append a custom type to the component's filename. For example, if you set the type to `container`, the file will be named `my-component.container.ts`." }, { "name": "view-encapsulation", @@ -380,7 +380,7 @@ "None", "ShadowDom" ], - "description": "The view encapsulation strategy to use in the new component." + "description": "Sets the view encapsulation mode for the component. This determines how the component's styles are scoped and applied." } ], "aliases": [ @@ -391,12 +391,12 @@ { "name": "config", "command": "config [type]", - "shortDescription": "Generates a configuration file in the given project.", + "shortDescription": "Generates configuration files for your project. These files control various aspects of your project's build process, testing, and browser compatibility. This schematic helps you create or update essential configuration files with ease.", "options": [ { "name": "project", "type": "string", - "description": "The name of the project." + "description": "The name of the project where the configuration file should be created or updated." }, { "name": "type", @@ -405,7 +405,7 @@ "karma", "browserslist" ], - "description": "Specifies which type of configuration file to create.", + "description": "Specifies the type of configuration file to generate.", "positional": 0 } ], @@ -415,19 +415,19 @@ { "name": "directive", "command": "directive [name]", - "shortDescription": "Creates a new, generic directive definition in the given project.", + "shortDescription": "Creates a new directive in your project. Directives are used to extend the behavior or appearance of HTML elements and components. They allow you to manipulate the DOM, add custom attributes, and respond to events. This schematic generates the necessary files and boilerplate code for a new directive.", "options": [ { "name": "export", "type": "boolean", "default": false, - "description": "The declaring NgModule exports this directive." + "description": "Automatically export the directive from the specified NgModule, making it accessible to other modules in the application." }, { "name": "flat", "type": "boolean", "default": true, - "description": "When true (the default), creates the new files at the top level of the current project." + "description": "Creates the new directive files at the top level of the current project. If set to false, a new folder with the directive's name will be created to contain the files." }, { "name": "module", @@ -435,12 +435,12 @@ "aliases": [ "m" ], - "description": "The declaring NgModule." + "description": "Specify the NgModule where the directive should be declared. If not provided, the CLI will attempt to find the closest NgModule in the directive's path." }, { "name": "name", "type": "string", - "description": "The name of the new directive.", + "description": "The name for the new directive. This will be used to create the directive's class and spec files (e.g., `my-directive.directive.ts` and `my-directive.directive.spec.ts`).", "positional": 0 }, { @@ -449,35 +449,35 @@ "aliases": [ "p" ], - "description": "A prefix to apply to generated selectors." + "description": "A prefix to be added to the directive's selector. For example, if the prefix is `app` and the directive name is `highlight`, the selector will be `appHighlight`." }, { "name": "project", "type": "string", - "description": "The name of the project." + "description": "The name of the project where the directive should be added. If not specified, the CLI will determine the project from the current directory." }, { "name": "selector", "type": "string", - "description": "The HTML selector to use for this directive." + "description": "The HTML selector to use for this directive. If not provided, a selector will be generated based on the directive's name (e.g., `appHighlight`)." }, { "name": "skip-import", "type": "boolean", "default": false, - "description": "Do not import this directive into the owning NgModule." + "description": "Do not automatically import the new directive into its closest NgModule." }, { "name": "skip-tests", "type": "boolean", "default": false, - "description": "Do not create \"spec.ts\" test files for the new class." + "description": "Skip the generation of a unit test file `spec.ts` for the new directive." }, { "name": "standalone", "type": "boolean", "default": true, - "description": "Whether the generated directive is standalone." + "description": "Generate a standalone directive. Standalone directives are self-contained and don't need to be declared in an NgModule. They can be used independently or imported directly into other standalone components or directives." } ], "aliases": [ @@ -488,23 +488,23 @@ { "name": "enum", "command": "enum [name]", - "shortDescription": "Generates a new, generic enum definition in the given project.", + "shortDescription": "Creates a new enum in your project. Enums (enumerations) are a way to define a set of named constants, making your code more readable and maintainable. This schematic generates a new enum with the specified name and type.", "options": [ { "name": "name", "type": "string", - "description": "The name of the enum.", + "description": "The name for the new enum. This will be used to create the enum file (e.g., `my-enum.enum.ts`).", "positional": 0 }, { "name": "project", "type": "string", - "description": "The name of the project in which to create the enum. Default is the configured default project for the workspace." + "description": "The name of the project where the enum should be created. If not specified, the CLI will determine the project from the current directory." }, { "name": "type", "type": "string", - "description": "Adds a developer-defined type to the filename, in the format \"name.type.ts\"." + "description": "Adds a custom type to the filename, allowing you to create more descriptive enum names. For example, if you set the type to `status`, the filename will be `my-enum.status.ts`." } ], "aliases": [ @@ -515,12 +515,12 @@ { "name": "environments", "command": "environments", - "shortDescription": "Generates and configures environment files for a project.", + "shortDescription": "Generates and configures environment files for your project. Environment files allow you to define different settings and configurations for various environments, such as development, testing, and production. This schematic helps you create and manage these files, making it easier to customize your application's behavior for each environment.", "options": [ { "name": "project", "type": "string", - "description": "The name of the project." + "description": "The name of the project where the environment files should be created or updated." } ], "aliases": [], @@ -529,19 +529,19 @@ { "name": "guard", "command": "guard [name]", - "shortDescription": "Generates a new, generic route guard definition in the given project.", + "shortDescription": "Creates a new route guard in your project. Route guards are used to control access to parts of your application by checking certain conditions before a route is activated. This schematic generates a new guard with the specified name, type, and options.", "options": [ { "name": "flat", "type": "boolean", "default": true, - "description": "When true (the default), creates the new files at the top level of the current project." + "description": "Creates the new guard files at the top level of the current project. If set to false, a new folder with the guard's name will be created to contain the files." }, { "name": "functional", "type": "boolean", "default": true, - "description": "Specifies whether to generate a guard as a function." + "description": "Generate the guard as a function instead of a class. Functional guards can be simpler for basic scenarios." }, { "name": "implements", @@ -549,24 +549,24 @@ "aliases": [ "guardType" ], - "description": "Specifies which type of guard to create." + "description": "Specifies the type(s) of guard to create. You can choose one or more of the following: `CanActivate` (controls access to a route), `CanActivateChild` (controls access to child routes), `CanDeactivate` (asks for confirmation before leaving a route), `CanMatch` (determines if a route can be matched)." }, { "name": "name", "type": "string", - "description": "The name of the new route guard.", + "description": "The name for the new route guard. This will be used to create the guard's class and spec files (e.g., `my-guard.guard.ts` and `my-guard.guard.spec.ts`).", "positional": 0 }, { "name": "project", "type": "string", - "description": "The name of the project." + "description": "The name of the project where the guard should be created. If not specified, the CLI will determine the project from the current directory." }, { "name": "skip-tests", "type": "boolean", "default": false, - "description": "Do not create \"spec.ts\" test files for the new guard." + "description": "Skip the generation of a unit test file `spec.ts` for the new guard." } ], "aliases": [ @@ -577,36 +577,36 @@ { "name": "interceptor", "command": "interceptor [name]", - "shortDescription": "Creates a new, generic interceptor definition in the given project.", + "shortDescription": "Creates a new interceptor in your project. Interceptors are used to intercept and modify HTTP requests and responses before they reach their destination. This allows you to perform tasks like adding authentication headers, handling errors, or logging requests. This schematic generates the necessary files and boilerplate code for a new interceptor.", "options": [ { "name": "flat", "type": "boolean", "default": true, - "description": "When true (the default), creates files at the top level of the project." + "description": "Creates the new interceptor files at the top level of the current project. If set to false, a new folder with the interceptor's name will be created to contain the files." }, { "name": "functional", "type": "boolean", "default": true, - "description": "Creates the interceptor as a `HttpInterceptorFn`." + "description": "Creates the interceptor as a function `HttpInterceptorFn` instead of a class. Functional interceptors can be simpler for basic scenarios." }, { "name": "name", "type": "string", - "description": "The name of the interceptor.", + "description": "The name for the new interceptor. This will be used to create the interceptor's class and spec files (e.g., `my-interceptor.interceptor.ts` and `my-interceptor.interceptor.spec.ts`).", "positional": 0 }, { "name": "project", "type": "string", - "description": "The name of the project." + "description": "The name of the project where the interceptor should be created. If not specified, the CLI will determine the project from the current directory." }, { "name": "skip-tests", "type": "boolean", "default": false, - "description": "Do not create \"spec.ts\" test files for the new interceptor." + "description": "Skip the generation of a unit test file `spec.ts` for the new interceptor." } ], "aliases": [], @@ -615,28 +615,28 @@ { "name": "interface", "command": "interface [name] [type]", - "shortDescription": "Creates a new, generic interface definition in the given project.", + "shortDescription": "Creates a new interface in your project. Interfaces define the structure of objects in TypeScript, ensuring type safety and code clarity. This schematic generates a new interface with the specified name and type.", "options": [ { "name": "name", "type": "string", - "description": "The name of the interface.", + "description": "The name for the new interface. This will be used to create the interface file (e.g., `my-interface.interface.ts`).", "positional": 0 }, { "name": "prefix", "type": "string", - "description": "A prefix to apply to generated selectors." + "description": "A prefix to be added to the interface name. This is typically not used for interfaces, as they don't have selectors like components or directives." }, { "name": "project", "type": "string", - "description": "The name of the project." + "description": "The name of the project where the interface should be created. If not specified, the CLI will determine the project from the current directory." }, { "name": "type", "type": "string", - "description": "Adds a developer-defined type to the filename, in the format \"name.type.ts\".", + "description": "Adds a custom type to the filename, allowing you to create more descriptive interface names. For example, if you set the type to `data`, the filename will be `my-interface.data.ts`.", "positional": 1 } ], @@ -648,18 +648,18 @@ { "name": "library", "command": "library [name]", - "shortDescription": "Creates a new, generic library project in the current workspace.", + "shortDescription": "Creates a new library project in your Angular workspace. Libraries are reusable collections of components, services, and other Angular artifacts that can be shared across multiple applications. This schematic simplifies the process of generating a new library with the necessary files and configurations.", "options": [ { "name": "entry-file", "type": "string", "default": "public-api", - "description": "The path at which to create the library's public API file, relative to the workspace root." + "description": "The path to the library's public API file, relative to the workspace root. This file defines what parts of the library are accessible to applications that import it." }, { "name": "name", "type": "string", - "description": "The name of the library.", + "description": "The name for the new library. This name will be used for the project directory and various identifiers within the library's code.", "positional": 0 }, { @@ -669,36 +669,36 @@ "p" ], "default": "lib", - "description": "A prefix to apply to generated selectors." + "description": "A prefix to be added to the selectors of components generated within this library. For example, if the prefix is `my-lib` and you generate a component named `my-component`, the selector will be `my-lib-my-component`." }, { "name": "project-root", "type": "string", - "description": "The root directory of the new library." + "description": "The root directory for the new library, relative to the workspace root. If not specified, the library will be created in a subfolder within the `projects` directory, using the library's name." }, { "name": "skip-install", "type": "boolean", "default": false, - "description": "Do not install dependency packages." + "description": "Skip the automatic installation of packages. You will need to manually install the dependencies later." }, { "name": "skip-package-json", "type": "boolean", "default": false, - "description": "Do not add dependencies to the \"package.json\" file. " + "description": "Do not automatically add dependencies to the `package.json` file." }, { "name": "skip-ts-config", "type": "boolean", "default": false, - "description": "Do not update \"tsconfig.json\" to add a path mapping for the new library. The path mapping is needed to use the library in an app, but can be disabled here to simplify development." + "description": "Do not update the workspace `tsconfig.json` file to add a path mapping for the new library. The path mapping is needed to use the library in an application, but can be disabled here to simplify development." }, { "name": "standalone", "type": "boolean", "default": true, - "description": "Creates a library based upon the standalone API, without NgModules." + "description": "Create a library that utilizes the standalone API, eliminating the need for NgModules. This can simplify the structure of your library and its usage in applications." } ], "aliases": [ @@ -766,19 +766,19 @@ { "name": "pipe", "command": "pipe [name]", - "shortDescription": "Creates a new, generic pipe definition in the given project.", + "shortDescription": "Creates a new pipe in your project. Pipes are used to transform data for display in templates. They take input values and apply a specific transformation, such as formatting dates, currency, or filtering arrays. This schematic generates the necessary files and boilerplate code for a new pipe.", "options": [ { "name": "export", "type": "boolean", "default": false, - "description": "The declaring NgModule exports this pipe." + "description": "Automatically export the pipe from the specified NgModule, making it accessible to other modules in the application." }, { "name": "flat", "type": "boolean", "default": true, - "description": "When true (the default) creates files at the top level of the project." + "description": "Creates the new pipe files at the top level of the current project. If set to false, a new folder with the pipe's name will be created to contain the files." }, { "name": "module", @@ -786,36 +786,36 @@ "aliases": [ "m" ], - "description": "The declaring NgModule." + "description": "Specify the NgModule where the pipe should be declared. If not provided, the CLI will attempt to find the closest NgModule in the pipe's path." }, { "name": "name", "type": "string", - "description": "The name of the pipe.", + "description": "The name for the new pipe. This will be used to create the pipe's class and spec files (e.g., `my-pipe.pipe.ts` and `my-pipe.pipe.spec.ts`).", "positional": 0 }, { "name": "project", "type": "string", - "description": "The name of the project." + "description": "The name of the project where the pipe should be created. If not specified, the CLI will determine the project from the current directory." }, { "name": "skip-import", "type": "boolean", "default": false, - "description": "Do not import this pipe into the owning NgModule." + "description": "Do not automatically import the new pipe into its closest NgModule." }, { "name": "skip-tests", "type": "boolean", "default": false, - "description": "Do not create \"spec.ts\" test files for the new pipe." + "description": "Prevent the generation of a unit test file `spec.ts` for the new pipe." }, { "name": "standalone", "type": "boolean", "default": true, - "description": "Whether the generated pipe is standalone." + "description": "Generate a standalone pipe. Standalone pipes are self-contained and don't need to be declared in an NgModule. They can be used independently or imported directly into other standalone components, directives, or pipes." } ], "aliases": [ @@ -826,36 +826,36 @@ { "name": "resolver", "command": "resolver [name]", - "shortDescription": "Generates a new, generic resolver definition in the given project.", + "shortDescription": "Creates a new resolver in your project. Resolvers are used to pre-fetch data before a route is activated, ensuring that the necessary data is available before the component is displayed. This can improve the user experience by preventing delays and loading states. This schematic generates a new resolver with the specified name and options.", "options": [ { "name": "flat", "type": "boolean", "default": true, - "description": "When true (the default), creates the new files at the top level of the current project." + "description": "Creates the new resolver files at the top level of the current project. If set to false, a new folder with the resolver's name will be created to contain the files." }, { "name": "functional", "type": "boolean", "default": true, - "description": "Creates the resolver as a `ResolveFn`." + "description": "Creates the resolver as a function `ResolveFn` instead of a class. Functional resolvers can be simpler for basic scenarios." }, { "name": "name", "type": "string", - "description": "The name of the new resolver.", + "description": "The name for the new resolver. This will be used to create the resolver's class and spec files (e.g., `my-resolver.resolver.ts` and `my-resolver.resolver.spec.ts`).", "positional": 0 }, { "name": "project", "type": "string", - "description": "The name of the project." + "description": "The name of the project where the resolver should be created. If not specified, the CLI will determine the project from the current directory." }, { "name": "skip-tests", "type": "boolean", "default": false, - "description": "Do not create \"spec.ts\" test files for the new resolver." + "description": "Skip the generation of a unit test file `spec.ts` for the new resolver." } ], "aliases": [ @@ -866,30 +866,30 @@ { "name": "service", "command": "service [name]", - "shortDescription": "Creates a new, generic service definition in the given project.", + "shortDescription": "Creates a new service in your project. Services are used to encapsulate reusable logic, such as data access, API calls, or utility functions. This schematic simplifies the process of generating a new service with the necessary files and boilerplate code.", "options": [ { "name": "flat", "type": "boolean", "default": true, - "description": "When true (the default), creates files at the top level of the project." + "description": "Creates files at the top level of the project or the given path. If set to false, a new folder with the service's name will be created to contain the files." }, { "name": "name", "type": "string", - "description": "The name of the service.", + "description": "The name for the new service. This will be used to create the service's class and spec files (e.g., `my-service.service.ts` and `my-service.service.spec.ts`).", "positional": 0 }, { "name": "project", "type": "string", - "description": "The name of the project." + "description": "The name of the project where the service should be added. If not specified, the CLI will determine the project from the current directory." }, { "name": "skip-tests", "type": "boolean", "default": false, - "description": "Do not create \"spec.ts\" test files for the new service." + "description": "Skip the generation of a unit test file `spec.ts` for the service." } ], "aliases": [ @@ -900,18 +900,18 @@ { "name": "service-worker", "command": "service-worker", - "shortDescription": "Pass this schematic to the \"run\" command to create a service worker", + "shortDescription": "Adds a service worker to your project. Service workers enable your application to work offline or on low-quality networks by caching assets and intercepting network requests. This schematic configures your project to use a service worker.", "options": [ { "name": "project", "type": "string", - "description": "The name of the project." + "description": "The name of the project to add the service worker to. If not specified, the CLI will determine the project from the current directory." }, { "name": "target", "type": "string", "default": "build", - "description": "The target to apply service worker to." + "description": "The build target to apply the service worker to. This is typically `build`, indicating that the service worker should be generated during the standard build process." } ], "aliases": [], @@ -920,24 +920,24 @@ { "name": "web-worker", "command": "web-worker [name]", - "shortDescription": "Creates a new, generic web worker definition in the given project.", + "shortDescription": "Creates a new web worker in your project. Web workers allow you to run JavaScript code in the background, improving the performance and responsiveness of your application by offloading computationally intensive tasks. This schematic generates the necessary files for a new web worker and provides an optional code snippet to demonstrate its usage.", "options": [ { "name": "name", "type": "string", - "description": "The name of the worker.", + "description": "The name for the new web worker. This will be used to create the worker file (e.g., `my-worker.worker.ts`).", "positional": 0 }, { "name": "project", "type": "string", - "description": "The name of the project." + "description": "The name of the project where the web worker should be created. If not specified, the CLI will determine the project from the current directory." }, { "name": "snippet", "type": "boolean", "default": true, - "description": "Add a worker creation snippet in a sibling file of the same name." + "description": "Generate a code snippet that demonstrates how to create and use the new web worker." } ], "aliases": [], diff --git a/adev/src/content/cli/help/new.json b/adev/src/content/cli/help/new.json index 1f51828be7c4..6a856a2289e3 100644 --- a/adev/src/content/cli/help/new.json +++ b/adev/src/content/cli/help/new.json @@ -21,13 +21,13 @@ "name": "commit", "type": "boolean", "default": true, - "description": "Initial git repository commit information." + "description": "Configure the initial Git commit for the new repository." }, { "name": "create-application", "type": "boolean", "default": true, - "description": "Create a new initial application project in the 'src' folder of the new workspace. When false, creates an empty workspace with no initial application. You can then use the generate application command so that all applications are created in the projects folder." + "description": "Create a new initial application project in the new workspace. When false, creates an empty workspace with no initial application. You can then use the `ng generate application` command to create applications in the `projects` directory." }, { "name": "defaults", @@ -38,7 +38,7 @@ { "name": "directory", "type": "string", - "description": "The directory name to create the workspace in." + "description": "The directory where the new workspace and project should be created. If not specified, the workspace will be created in the current directory." }, { "name": "dry-run", @@ -53,7 +53,7 @@ "name": "experimental-zoneless", "type": "boolean", "default": false, - "description": "Create an application that does not utilize zone.js." + "description": "Create an initial application that does not utilize `zone.js`." }, { "name": "force", @@ -72,7 +72,7 @@ "aliases": [ "s" ], - "description": "Include styles inline in the component TS file. By default, an external styles file is created and referenced in the component TypeScript file." + "description": "Include the styles for the initial application's root component directly within the `app.component.ts` file. By default, a separate stylesheet file (e.g., `app.component.css`) is created." }, { "name": "inline-template", @@ -80,7 +80,7 @@ "aliases": [ "t" ], - "description": "Include template inline in the component TS file. By default, an external template file is created and referenced in the component TypeScript file." + "description": "Include the HTML template for the initial application's root component directly within the `app.component.ts` file. By default, a separate template file (e.g., `app.component.html`) is created." }, { "name": "interactive", @@ -92,19 +92,19 @@ "name": "minimal", "type": "boolean", "default": false, - "description": "Create a workspace without any testing frameworks. (Use for learning purposes only.)" + "description": "Generate a minimal Angular workspace without any testing frameworks. This is intended for learning purposes and simple experimentation, not for production applications." }, { "name": "name", "type": "string", - "description": "The name of the new workspace and initial project.", + "description": "The name for the new workspace and the initial project. This name will be used for the root directory and various identifiers throughout the project.", "positional": 0 }, { "name": "new-project-root", "type": "string", "default": "projects", - "description": "The path where new projects will be created, relative to the new workspace root." + "description": "The path where new projects will be created within the workspace, relative to the workspace root. By default, new projects are created in the `projects` directory." }, { "name": "package-manager", @@ -125,17 +125,17 @@ "p" ], "default": "app", - "description": "The prefix to apply to generated selectors for the initial project." + "description": "The prefix to apply to generated selectors for the initial project. For example, if the prefix is `my-app` and you generate a component named `my-component`, the selector will be `my-app-my-component`." }, { "name": "routing", "type": "boolean", - "description": "Enable routing in the initial project." + "description": "Enable routing in the initial application project. This sets up the necessary files and modules for managing navigation between different views in your application." }, { "name": "server-routing", "type": "boolean", - "description": "Creates a server application using the Server Routing and App Engine APIs (Developer Preview)." + "description": "Create a server application in the initial project using the Server Routing and App Engine APIs (Developer Preview)." }, { "name": "skip-git", @@ -144,13 +144,13 @@ "g" ], "default": false, - "description": "Do not initialize a git repository." + "description": "Do not initialize a Git repository in the new workspace. By default, a Git repository is initialized to help you track changes to your project." }, { "name": "skip-install", "type": "boolean", "default": false, - "description": "Do not install dependency packages." + "description": "Skip the automatic installation of packages. You will need to manually install the dependencies later." }, { "name": "skip-tests", @@ -159,12 +159,12 @@ "S" ], "default": false, - "description": "Do not generate \"spec.ts\" test files for the new project." + "description": "Skip the generation of unit test files `spec.ts`." }, { "name": "ssr", "type": "boolean", - "description": "Creates an application with Server-Side Rendering (SSR) and Static Site Generation (SSG/Prerendering) enabled." + "description": "Configure the initial application for Server-Side Rendering (SSR) and Static Site Generation (SSG/Prerendering)." }, { "name": "standalone", @@ -176,7 +176,7 @@ "name": "strict", "type": "boolean", "default": true, - "description": "Creates a workspace with stricter type checking and stricter bundle budgets settings. This setting helps improve maintainability and catch bugs ahead of time. For more information, see https://angular.dev/tools/cli/template-typecheck#strict-mode" + "description": "Enable stricter type checking and stricter bundle budgets settings. This setting helps improve maintainability and catch bugs ahead of time. For more information, see https://angular.dev/tools/cli/template-typecheck#strict-mode" }, { "name": "style", @@ -187,7 +187,7 @@ "sass", "less" ], - "description": "The file extension or preprocessor to use for style files." + "description": "The type of stylesheet files to be created for components in the initial project." }, { "name": "view-encapsulation", @@ -197,7 +197,7 @@ "None", "ShadowDom" ], - "description": "The view encapsulation strategy to use in the initial project." + "description": "Sets the view encapsulation mode for components in the initial project. This determines how component styles are scoped and applied. Options include: `Emulated` (default, styles are scoped to the component), `None` (styles are global), and `ShadowDom` (styles are encapsulated using Shadow DOM)." } ] } \ No newline at end of file diff --git a/adev/src/content/cli/help/serve.json b/adev/src/content/cli/help/serve.json index 0cf82f713239..4fd0b971b2f9 100644 --- a/adev/src/content/cli/help/serve.json +++ b/adev/src/content/cli/help/serve.json @@ -98,7 +98,7 @@ { "name": "prebundle", "type": "boolean", - "description": "Enable and control the Vite-based development server's prebundling capabilities. To enable prebundling, the Angular CLI cache must also be enabled. This option has no effect when using the 'browser' or other webpack-based builders." + "description": "Enable and control the Vite-based development server's prebundling capabilities. To enable prebundling, the Angular CLI cache must also be enabled. This option has no effect when using the 'browser' or other Webpack-based builders." }, { "name": "project", @@ -149,4 +149,4 @@ "description": "Rebuild on change." } ] -} +} \ No newline at end of file From d797c5cb94eec8462aa16827f4004e62c233fcb4 Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Thu, 19 Dec 2024 01:46:31 +0100 Subject: [PATCH 0096/1220] docs: update class & style binding recommendation (#59240) This commit introduces an update to the official recommendations when it comes to class & styles bindings. `[class]` & `[style]` bindings are now recommended for basic uses cases. `[ngClass]` and `[ngStyle]` allow more advanced bindings (like space separated keys) or keys with units (for `ngStyle`) which are not supported by the native bindings. They still require the dedicated directives. PR Close #59240 --- adev/src/content/guide/directives/overview.md | 2 ++ packages/common/src/directives/ng_class.ts | 23 ++++++++++++------- packages/common/src/directives/ng_style.ts | 17 +++++++++----- 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/adev/src/content/guide/directives/overview.md b/adev/src/content/guide/directives/overview.md index 9c223f4858a1..5e59ce2ce6c2 100644 --- a/adev/src/content/guide/directives/overview.md +++ b/adev/src/content/guide/directives/overview.md @@ -69,6 +69,8 @@ These steps are not necessary to implement `ngClass`. ## Setting inline styles with `NgStyle` +HELPFUL: To add or remove a _single_ style, use [style bindings](guide/templates/binding#css-class-and-style-property-bindings) rather than `NgStyle`. + ### Import `NgStyle` in the component To use `NgStyle`, add it to the component's `imports` list. diff --git a/packages/common/src/directives/ng_class.ts b/packages/common/src/directives/ng_class.ts index ddc81c9c154e..80db9c3da8dd 100644 --- a/packages/common/src/directives/ng_class.ts +++ b/packages/common/src/directives/ng_class.ts @@ -10,8 +10,6 @@ import { DoCheck, ElementRef, Input, - IterableDiffers, - KeyValueDiffers, Renderer2, ɵstringify as stringify, } from '@angular/core'; @@ -43,17 +41,23 @@ interface CssClassState { * * @usageNotes * ```html - * ... + * ... * - * ... + * ... + * ``` + * + * For more simple use cases you can use the [class bindings](/guide/templates/binding#css-class-and-style-property-bindings) directly. + * It doesn't require importing a directive. * - * ... + * ```html + * ... * - * ... + * ... * - * ... - * ``` + * ... * + * ... + * ``` * @description * * Adds and removes CSS classes on an HTML element. @@ -64,6 +68,9 @@ interface CssClassState { * - `Object` - keys are CSS classes that get added when the expression given in the value * evaluates to a truthy value, otherwise they are removed. * + * + * @see [Class bindings](/guide/templates/binding#css-class-and-style-property-bindings) + * * @publicApi */ @Directive({ diff --git a/packages/common/src/directives/ng_style.ts b/packages/common/src/directives/ng_style.ts index 4a48e1a00796..5e8ef0b319d0 100644 --- a/packages/common/src/directives/ng_style.ts +++ b/packages/common/src/directives/ng_style.ts @@ -22,12 +22,6 @@ import { * * @usageNotes * - * Set the font of the containing element to the result of an expression. - * - * ```html - * ... - * ``` - * * Set the width of the containing element to a pixel value returned by an expression. * * ```html @@ -40,6 +34,15 @@ import { * ... * ``` * + * For more simple use cases you can use the [style bindings](/guide/templates/binding#css-class-and-style-property-bindings) directly. + * It doesn't require importing a directive. + * + * Set the font of the containing element to the result of an expression. + * + * ```html + * ... + * ``` + * * @description * * An attribute directive that updates styles for the containing HTML element. @@ -51,6 +54,8 @@ import { * is assigned to the given style property. * If the result of evaluation is null, the corresponding style is removed. * + * @see [Style bindings](/guide/templates/binding#css-class-and-style-property-bindings) + * * @publicApi */ @Directive({ From 3b3040d32a01319e122aaf813e9cab9e9c914244 Mon Sep 17 00:00:00 2001 From: arturovt Date: Fri, 10 Jan 2025 19:56:23 +0200 Subject: [PATCH 0097/1220] refactor(common): drop error message in production (#59471) Switches to using `RuntimeError` and drops the error message in production by replacing it with an error code. PR Close #59471 --- goldens/public-api/common/http/errors.api.md | 2 ++ packages/common/http/src/errors.ts | 1 + packages/common/http/src/params.ts | 13 ++++++++++--- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/goldens/public-api/common/http/errors.api.md b/goldens/public-api/common/http/errors.api.md index 29528aa7c765..de8b1f7080e1 100644 --- a/goldens/public-api/common/http/errors.api.md +++ b/goldens/public-api/common/http/errors.api.md @@ -6,6 +6,8 @@ // @public export const enum RuntimeErrorCode { + // (undocumented) + CANNOT_SPECIFY_BOTH_FROM_STRING_AND_FROM_OBJECT = 2805, // (undocumented) HEADERS_ALTERED_BY_TRANSFER_CACHE = 2802, // (undocumented) diff --git a/packages/common/http/src/errors.ts b/packages/common/http/src/errors.ts index e480c83b0b4c..4b9344a5f948 100644 --- a/packages/common/http/src/errors.ts +++ b/packages/common/http/src/errors.ts @@ -16,4 +16,5 @@ export const enum RuntimeErrorCode { HEADERS_ALTERED_BY_TRANSFER_CACHE = 2802, HTTP_ORIGIN_MAP_USED_IN_CLIENT = 2803, HTTP_ORIGIN_MAP_CONTAINS_PATH = 2804, + CANNOT_SPECIFY_BOTH_FROM_STRING_AND_FROM_OBJECT = 2805, } diff --git a/packages/common/http/src/params.ts b/packages/common/http/src/params.ts index eb97af256b7d..4dc0a6b31806 100644 --- a/packages/common/http/src/params.ts +++ b/packages/common/http/src/params.ts @@ -6,6 +6,10 @@ * found in the LICENSE file at https://angular.dev/license */ +import {ɵRuntimeError as RuntimeError} from '@angular/core'; + +import {RuntimeErrorCode} from './errors'; + /** * A codec for encoding and decoding parameters in URLs. * @@ -159,9 +163,12 @@ export class HttpParams { constructor(options: HttpParamsOptions = {} as HttpParamsOptions) { this.encoder = options.encoder || new HttpUrlEncodingCodec(); - if (!!options.fromString) { - if (!!options.fromObject) { - throw new Error(`Cannot specify both fromString and fromObject.`); + if (options.fromString) { + if (options.fromObject) { + throw new RuntimeError( + RuntimeErrorCode.CANNOT_SPECIFY_BOTH_FROM_STRING_AND_FROM_OBJECT, + ngDevMode && 'Cannot specify both fromString and fromObject.', + ); } this.map = paramParser(options.fromString, this.encoder); } else if (!!options.fromObject) { From ed705a856a164f91d33e2173b4f371329d07c472 Mon Sep 17 00:00:00 2001 From: Kevin Brey Date: Thu, 9 Jan 2025 00:45:57 -0600 Subject: [PATCH 0098/1220] feat(compiler-cli): detect missing structural directive imports (#59443) Adds a new diagnostic that ensures that a standalone component using custom structural directives in a template has the necessary imports for those directives. Fixes #37322 PR Close #59443 --- .../reference/extended-diagnostics/NG8114.md | 61 +++++ .../extended-diagnostics/overview.md | 3 +- .../public-api/compiler-cli/error_code.api.md | 1 + .../extended_template_diagnostic_name.api.md | 2 + .../src/ngtsc/diagnostics/src/error_code.ts | 5 + .../src/extended_template_diagnostic_name.ts | 1 + .../src/ngtsc/typecheck/extended/BUILD.bazel | 1 + .../missing_structural_directive/BUILD.bazel | 15 ++ .../missing_structural_directive/index.ts | 91 ++++++++ .../src/ngtsc/typecheck/extended/index.ts | 2 + .../missing_structural_directive/BUILD.bazel | 30 +++ .../missing_structural_directive_spec.ts | 218 ++++++++++++++++++ 12 files changed, 429 insertions(+), 1 deletion(-) create mode 100644 adev/src/content/reference/extended-diagnostics/NG8114.md create mode 100644 packages/compiler-cli/src/ngtsc/typecheck/extended/checks/missing_structural_directive/BUILD.bazel create mode 100644 packages/compiler-cli/src/ngtsc/typecheck/extended/checks/missing_structural_directive/index.ts create mode 100644 packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/missing_structural_directive/BUILD.bazel create mode 100644 packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/missing_structural_directive/missing_structural_directive_spec.ts diff --git a/adev/src/content/reference/extended-diagnostics/NG8114.md b/adev/src/content/reference/extended-diagnostics/NG8114.md new file mode 100644 index 000000000000..49d832b7ad9a --- /dev/null +++ b/adev/src/content/reference/extended-diagnostics/NG8114.md @@ -0,0 +1,61 @@ +# Missing structural directive + +This diagnostic ensures that a standalone component using custom structural directives (e.g., `*select` or `*featureFlag`) in a template has the necessary imports for those directives. + + + +import {Component} from '@angular/core'; + +@Component({ + // Template uses `*select`, but no corresponding directive imported. + imports: [], + template: `

{{data}}

`, +}) +class MyComponent {} + +
+ +## What's wrong with that? + +Using a structural directive without importing it will fail at runtime, as Angular attempts to bind to a `select` property of the HTML element, which does not exist. + +## What should I do instead? + +Make sure that the corresponding structural directive is imported into the component: + + + +import {Component} from '@angular/core'; +import {SelectDirective} from 'my-directives'; + +@Component({ + // Add `SelectDirective` to the `imports` array to make it available in the template. + imports: [SelectDirective], + template: `

{{data}}

`, +}) +class MyComponent {} + +
+ +## Configuration requirements + +[`strictTemplates`](tools/cli/template-typecheck#strict-mode) must be enabled for any extended diagnostic to emit. +`missingStructuralDirective` has no additional requirements beyond `strictTemplates`. + +## What if I can't avoid this? + +This diagnostic can be disabled by editing the project's `tsconfig.json` file: + + +{ + "angularCompilerOptions": { + "extendedDiagnostics": { + "checks": { + "missingStructuralDirective": "suppress" + } + } + } +} + + +See [extended diagnostic configuration](extended-diagnostics#configuration) for more info. diff --git a/adev/src/content/reference/extended-diagnostics/overview.md b/adev/src/content/reference/extended-diagnostics/overview.md index 94714804e9d9..3e86e0cc872c 100644 --- a/adev/src/content/reference/extended-diagnostics/overview.md +++ b/adev/src/content/reference/extended-diagnostics/overview.md @@ -20,7 +20,8 @@ Currently, Angular supports the following extended diagnostics: | `NG8108` | [`skipHydrationNotStatic`](extended-diagnostics/NG8108) | | `NG8109` | [`interpolatedSignalNotInvoked`](extended-diagnostics/NG8109) | | `NG8111` | [`uninvokedFunctionInEventBinding`](extended-diagnostics/NG8111) | -| `NG8113` | [`unusedStandaloneImports`](extended-diagnostics/NG8113) | +| `NG8113` | [`unusedStandaloneImports`](extended-diagnostics/NG8113) | +| `NG8114` | [`missingStructuralDirective`](extended-diagnostics/NG8114) | ## Configuration diff --git a/goldens/public-api/compiler-cli/error_code.api.md b/goldens/public-api/compiler-cli/error_code.api.md index b8412619d50d..be713a7ebaba 100644 --- a/goldens/public-api/compiler-cli/error_code.api.md +++ b/goldens/public-api/compiler-cli/error_code.api.md @@ -75,6 +75,7 @@ export enum ErrorCode { MISSING_PIPE = 8004, MISSING_REFERENCE_TARGET = 8003, MISSING_REQUIRED_INPUTS = 8008, + MISSING_STRUCTURAL_DIRECTIVE = 8114, NGMODULE_BOOTSTRAP_IS_STANDALONE = 6009, NGMODULE_DECLARATION_IS_STANDALONE = 6008, NGMODULE_DECLARATION_NOT_UNIQUE = 6007, diff --git a/goldens/public-api/compiler-cli/extended_template_diagnostic_name.api.md b/goldens/public-api/compiler-cli/extended_template_diagnostic_name.api.md index ee99d7d58475..78546c0e15d6 100644 --- a/goldens/public-api/compiler-cli/extended_template_diagnostic_name.api.md +++ b/goldens/public-api/compiler-cli/extended_template_diagnostic_name.api.md @@ -17,6 +17,8 @@ export enum ExtendedTemplateDiagnosticName { // (undocumented) MISSING_NGFOROF_LET = "missingNgForOfLet", // (undocumented) + MISSING_STRUCTURAL_DIRECTIVE = "missingStructuralDirective", + // (undocumented) NULLISH_COALESCING_NOT_NULLABLE = "nullishCoalescingNotNullable", // (undocumented) OPTIONAL_CHAIN_NOT_NULLABLE = "optionalChainNotNullable", diff --git a/packages/compiler-cli/src/ngtsc/diagnostics/src/error_code.ts b/packages/compiler-cli/src/ngtsc/diagnostics/src/error_code.ts index a5013d246f95..e0797eb52352 100644 --- a/packages/compiler-cli/src/ngtsc/diagnostics/src/error_code.ts +++ b/packages/compiler-cli/src/ngtsc/diagnostics/src/error_code.ts @@ -518,6 +518,11 @@ export enum ErrorCode { */ UNUSED_STANDALONE_IMPORTS = 8113, + /** + * A structural directive is used in a template, but the directive is not imported. + */ + MISSING_STRUCTURAL_DIRECTIVE = 8114, + /** * The template type-checking engine would need to generate an inline type check block for a * component, but the current type-checking environment doesn't support it. diff --git a/packages/compiler-cli/src/ngtsc/diagnostics/src/extended_template_diagnostic_name.ts b/packages/compiler-cli/src/ngtsc/diagnostics/src/extended_template_diagnostic_name.ts index c79de4ce6af1..bec12d76866d 100644 --- a/packages/compiler-cli/src/ngtsc/diagnostics/src/extended_template_diagnostic_name.ts +++ b/packages/compiler-cli/src/ngtsc/diagnostics/src/extended_template_diagnostic_name.ts @@ -20,6 +20,7 @@ export enum ExtendedTemplateDiagnosticName { NULLISH_COALESCING_NOT_NULLABLE = 'nullishCoalescingNotNullable', OPTIONAL_CHAIN_NOT_NULLABLE = 'optionalChainNotNullable', MISSING_CONTROL_FLOW_DIRECTIVE = 'missingControlFlowDirective', + MISSING_STRUCTURAL_DIRECTIVE = 'missingStructuralDirective', TEXT_ATTRIBUTE_NOT_BINDING = 'textAttributeNotBinding', UNINVOKED_FUNCTION_IN_EVENT_BINDING = 'uninvokedFunctionInEventBinding', MISSING_NGFOROF_LET = 'missingNgForOfLet', diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/BUILD.bazel b/packages/compiler-cli/src/ngtsc/typecheck/extended/BUILD.bazel index f4527da5c181..18cd509c7a82 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/extended/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/typecheck/extended/BUILD.bazel @@ -16,6 +16,7 @@ ts_library( "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/invalid_banana_in_box", "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/missing_control_flow_directive", "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/missing_ngforof_let", + "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/missing_structural_directive", "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/nullish_coalescing_not_nullable", "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/optional_chain_not_nullable", "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/skip_hydration_not_static", diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/missing_structural_directive/BUILD.bazel b/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/missing_structural_directive/BUILD.bazel new file mode 100644 index 000000000000..a8e517f1d7c2 --- /dev/null +++ b/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/missing_structural_directive/BUILD.bazel @@ -0,0 +1,15 @@ +load("//tools:defaults.bzl", "ts_library") + +ts_library( + name = "missing_structural_directive", + srcs = ["index.ts"], + visibility = ["//packages/compiler-cli/src/ngtsc:__subpackages__"], + deps = [ + "//packages/compiler", + "//packages/compiler-cli/src/ngtsc/core:api", + "//packages/compiler-cli/src/ngtsc/diagnostics", + "//packages/compiler-cli/src/ngtsc/typecheck/api", + "//packages/compiler-cli/src/ngtsc/typecheck/extended/api", + "@npm//typescript", + ], +) diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/missing_structural_directive/index.ts b/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/missing_structural_directive/index.ts new file mode 100644 index 000000000000..2fcdeeeffe7e --- /dev/null +++ b/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/missing_structural_directive/index.ts @@ -0,0 +1,91 @@ +/** + * @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 {AST, TmplAstNode, TmplAstTemplate} from '@angular/compiler'; +import ts from 'typescript'; + +import {NgCompilerOptions} from '../../../../core/api'; +import {ErrorCode, ExtendedTemplateDiagnosticName} from '../../../../diagnostics'; +import {NgTemplateDiagnostic} from '../../../api'; +import {TemplateCheckFactory, TemplateCheckWithVisitor, TemplateContext} from '../../api'; + +/** + * The list of known control flow directives present in the `CommonModule`. + * + * If these control flow directives are missing they will be reported by a separate diagnostic. + */ +export const KNOWN_CONTROL_FLOW_DIRECTIVES = new Set([ + 'ngIf', + 'ngFor', + 'ngSwitch', + 'ngSwitchCase', + 'ngSwitchDefault', +]); + +/** + * Ensures that there are no structural directives (something like *select or *featureFlag) + * used in a template of a *standalone* component without importing the directive. Returns + * diagnostics in case such a directive is detected. + * + * Note: this check only handles the cases when structural directive syntax is used (e.g. `*featureFlag`). + * Regular binding syntax (e.g. `[featureFlag]`) is handled separately in type checker and treated as a + * hard error instead of a warning. + */ +class MissingStructuralDirectiveCheck extends TemplateCheckWithVisitor { + override code = ErrorCode.MISSING_STRUCTURAL_DIRECTIVE as const; + + override run( + ctx: TemplateContext, + component: ts.ClassDeclaration, + template: TmplAstNode[], + ) { + const componentMetadata = ctx.templateTypeChecker.getDirectiveMetadata(component); + // Avoid running this check for non-standalone components. + if (!componentMetadata || !componentMetadata.isStandalone) { + return []; + } + return super.run(ctx, component, template); + } + + override visitNode( + ctx: TemplateContext, + component: ts.ClassDeclaration, + node: TmplAstNode | AST, + ): NgTemplateDiagnostic[] { + if (!(node instanceof TmplAstTemplate)) return []; + + const customStructuralDirective = node.templateAttrs.find( + (attr) => !KNOWN_CONTROL_FLOW_DIRECTIVES.has(attr.name), + ); + if (!customStructuralDirective) return []; + + const symbol = ctx.templateTypeChecker.getSymbolOfNode(node, component); + if (symbol === null || symbol.directives.length > 0) { + return []; + } + + const sourceSpan = customStructuralDirective.keySpan || customStructuralDirective.sourceSpan; + const errorMessage = + `An unknown structural directive \`${customStructuralDirective.name}\` was used in the template, ` + + `without a corresponding import in the component. ` + + `Make sure that the directive is included in the \`@Component.imports\` array of this component.`; + const diagnostic = ctx.makeTemplateDiagnostic(sourceSpan, errorMessage); + return [diagnostic]; + } +} + +export const factory: TemplateCheckFactory< + ErrorCode.MISSING_STRUCTURAL_DIRECTIVE, + ExtendedTemplateDiagnosticName.MISSING_STRUCTURAL_DIRECTIVE +> = { + code: ErrorCode.MISSING_STRUCTURAL_DIRECTIVE, + name: ExtendedTemplateDiagnosticName.MISSING_STRUCTURAL_DIRECTIVE, + create: (options: NgCompilerOptions) => { + return new MissingStructuralDirectiveCheck(); + }, +}; diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/index.ts b/packages/compiler-cli/src/ngtsc/typecheck/extended/index.ts index 5cb45e946b00..f6553f327f65 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/extended/index.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/extended/index.ts @@ -13,6 +13,7 @@ import {factory as interpolatedSignalNotInvoked} from './checks/interpolated_sig import {factory as invalidBananaInBoxFactory} from './checks/invalid_banana_in_box'; import {factory as missingControlFlowDirectiveFactory} from './checks/missing_control_flow_directive'; import {factory as missingNgForOfLetFactory} from './checks/missing_ngforof_let'; +import {factory as missingStructuralDirectiveFactory} from './checks/missing_structural_directive'; import {factory as nullishCoalescingNotNullableFactory} from './checks/nullish_coalescing_not_nullable'; import {factory as optionalChainNotNullableFactory} from './checks/optional_chain_not_nullable'; import {factory as suffixNotSupportedFactory} from './checks/suffix_not_supported'; @@ -32,6 +33,7 @@ export const ALL_DIAGNOSTIC_FACTORIES: readonly TemplateCheckFactory< missingControlFlowDirectiveFactory, textAttributeNotBindingFactory, missingNgForOfLetFactory, + missingStructuralDirectiveFactory, suffixNotSupportedFactory, interpolatedSignalNotInvoked, uninvokedFunctionInEventBindingFactory, diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/missing_structural_directive/BUILD.bazel b/packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/missing_structural_directive/BUILD.bazel new file mode 100644 index 000000000000..0b630f974092 --- /dev/null +++ b/packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/missing_structural_directive/BUILD.bazel @@ -0,0 +1,30 @@ +load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") + +ts_library( + name = "test_lib", + testonly = True, + srcs = ["missing_structural_directive_spec.ts"], + deps = [ + "//packages/compiler", + "//packages/compiler-cli/src/ngtsc/core:api", + "//packages/compiler-cli/src/ngtsc/diagnostics", + "//packages/compiler-cli/src/ngtsc/file_system", + "//packages/compiler-cli/src/ngtsc/file_system/testing", + "//packages/compiler-cli/src/ngtsc/testing", + "//packages/compiler-cli/src/ngtsc/typecheck/extended", + "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/missing_structural_directive", + "//packages/compiler-cli/src/ngtsc/typecheck/testing", + "@npm//typescript", + ], +) + +jasmine_node_test( + name = "test", + bootstrap = ["//tools/testing:node_no_angular"], + data = [ + "//packages/core:npm_package", + ], + deps = [ + ":test_lib", + ], +) diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/missing_structural_directive/missing_structural_directive_spec.ts b/packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/missing_structural_directive/missing_structural_directive_spec.ts new file mode 100644 index 000000000000..437341009816 --- /dev/null +++ b/packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/missing_structural_directive/missing_structural_directive_spec.ts @@ -0,0 +1,218 @@ +/** + * @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 {ErrorCode, ngErrorCode} from '../../../../../diagnostics'; +import {absoluteFrom, getSourceFileOrError} from '../../../../../file_system'; +import {runInEachFileSystem} from '../../../../../file_system/testing'; +import {getClass, setup} from '../../../../testing'; +import {factory as missingStructuralDirectiveCheck} from '../../../checks/missing_structural_directive'; +import {ExtendedTemplateCheckerImpl} from '../../../src/extended_template_checker'; + +runInEachFileSystem(() => { + describe('missingStructuralDirectiveCheck', () => { + it('should produce a warning for missing unknown structural directives in standalone components', () => { + const fileName = absoluteFrom('/main.ts'); + const {program, templateTypeChecker} = setup([ + { + fileName, + templates: { + 'TestCmp': `
`, + }, + declarations: [ + { + name: 'TestCmp', + type: 'directive', + selector: `[test-cmp]`, + isStandalone: true, + }, + ], + }, + ]); + const sf = getSourceFileOrError(program, fileName); + const component = getClass(sf, 'TestCmp'); + const extendedTemplateChecker = new ExtendedTemplateCheckerImpl( + templateTypeChecker, + program.getTypeChecker(), + [missingStructuralDirectiveCheck], + {strictNullChecks: true} /* options */, + ); + const diags = extendedTemplateChecker.getDiagnosticsForComponent(component); + + expect(diags.length).toBe(1); + expect(diags[0].category).toBe(ts.DiagnosticCategory.Warning); + expect(diags[0].code).toBe(ngErrorCode(ErrorCode.MISSING_STRUCTURAL_DIRECTIVE)); + }); + + it('should *not* produce a warning for custom structural directives that are imported', () => { + const fileName = absoluteFrom('/main.ts'); + const {program, templateTypeChecker} = setup([ + { + fileName, + templates: { + 'TestCmp': `
`, + }, + source: ` + export class TestCmp {} + export class Foo {} + `, + declarations: [ + { + type: 'directive', + name: 'Foo', + selector: `[foo]`, + }, + { + name: 'TestCmp', + type: 'directive', + selector: `[test-cmp]`, + isStandalone: true, + }, + ], + }, + ]); + const sf = getSourceFileOrError(program, fileName); + const component = getClass(sf, 'TestCmp'); + const extendedTemplateChecker = new ExtendedTemplateCheckerImpl( + templateTypeChecker, + program.getTypeChecker(), + [missingStructuralDirectiveCheck], + {strictNullChecks: true} /* options */, + ); + const diags = extendedTemplateChecker.getDiagnosticsForComponent(component); + // No diagnostic messages are expected. + expect(diags.length).toBe(0); + }); + + it('should *not* produce a warning for non-standalone components', () => { + const fileName = absoluteFrom('/main.ts'); + + const {program, templateTypeChecker} = setup([ + { + fileName, + templates: { + 'TestCmp': `
`, + }, + declarations: [ + { + name: 'TestCmp', + type: 'directive', + selector: `[test-cmp]`, + isStandalone: false, + }, + ], + }, + ]); + const sf = getSourceFileOrError(program, fileName); + const component = getClass(sf, 'TestCmp'); + const extendedTemplateChecker = new ExtendedTemplateCheckerImpl( + templateTypeChecker, + program.getTypeChecker(), + [missingStructuralDirectiveCheck], + {strictNullChecks: true} /* options */, + ); + const diags = extendedTemplateChecker.getDiagnosticsForComponent(component); + // No diagnostic messages are expected. + expect(diags.length).toBe(0); + }); + + it('should *not* produce a warning for non-structural directives in standalone components', () => { + const fileName = absoluteFrom('/main.ts'); + const {program, templateTypeChecker} = setup([ + { + fileName, + templates: { + 'TestCmp': `
`, + }, + declarations: [ + { + name: 'TestCmp', + type: 'directive', + selector: `[test-cmp]`, + isStandalone: true, + }, + ], + }, + ]); + const sf = getSourceFileOrError(program, fileName); + const component = getClass(sf, 'TestCmp'); + const extendedTemplateChecker = new ExtendedTemplateCheckerImpl( + templateTypeChecker, + program.getTypeChecker(), + [missingStructuralDirectiveCheck], + {strictNullChecks: true} /* options */, + ); + const diags = extendedTemplateChecker.getDiagnosticsForComponent(component); + // No diagnostic messages are expected. + expect(diags.length).toBe(0); + }); + + it('should *not* produce a warning when known control flow directives are used', () => { + const fileName = absoluteFrom('/main.ts'); + const {program, templateTypeChecker} = setup([ + { + fileName, + templates: { + 'TestCmp': `
`, + }, + declarations: [ + { + name: 'TestCmp', + type: 'directive', + selector: `[test-cmp]`, + isStandalone: true, + }, + ], + }, + ]); + const sf = getSourceFileOrError(program, fileName); + const component = getClass(sf, 'TestCmp'); + const extendedTemplateChecker = new ExtendedTemplateCheckerImpl( + templateTypeChecker, + program.getTypeChecker(), + [missingStructuralDirectiveCheck], + {strictNullChecks: true} /* options */, + ); + const diags = extendedTemplateChecker.getDiagnosticsForComponent(component); + // No diagnostic messages are expected. + expect(diags.length).toBe(0); + }); + + it('should not warn for templates with no structural directives', () => { + const fileName = absoluteFrom('/main.ts'); + const {program, templateTypeChecker} = setup([ + { + fileName, + templates: { + 'TestCmp': `
`, + }, + declarations: [ + { + name: 'TestCmp', + type: 'directive', + selector: `[test-cmp]`, + isStandalone: true, + }, + ], + }, + ]); + const sf = getSourceFileOrError(program, fileName); + const component = getClass(sf, 'TestCmp'); + const extendedTemplateChecker = new ExtendedTemplateCheckerImpl( + templateTypeChecker, + program.getTypeChecker(), + [missingStructuralDirectiveCheck], + {strictNullChecks: true} /* options */, + ); + const diags = extendedTemplateChecker.getDiagnosticsForComponent(component); + // No diagnostic messages are expected. + expect(diags.length).toBe(0); + }); + }); +}); From b223f7e9c63f61adec5855e8d2a72f888f7318de Mon Sep 17 00:00:00 2001 From: kirjs Date: Wed, 15 Jan 2025 14:46:44 -0500 Subject: [PATCH 0099/1220] docs: release notes for the v19.0.7 release --- CHANGELOG.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7cb7b98ed6fa..828144e31201 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,20 @@ +
+# 19.0.7 (2025-01-15) +### compiler-cli +| Commit | Type | Description | +| -- | -- | -- | +| [2b4b7c3ebf](https://github.com/angular/angular/commit/2b4b7c3ebfb2d4f4fd96fd2f1890b67c832505fd) | fix | handle more node types when extracting dependencies ([#59445](https://github.com/angular/angular/pull/59445)) | +### core +| Commit | Type | Description | +| -- | -- | -- | +| [f893d07232](https://github.com/angular/angular/commit/f893d0723262d699979d55e43e4ddbcf64a3fc13) | fix | destroy renderer when replacing styles during HMR ([#59514](https://github.com/angular/angular/pull/59514)) | +### migrations +| Commit | Type | Description | +| -- | -- | -- | +| [eb2fcd1896](https://github.com/angular/angular/commit/eb2fcd1896e0b834b86fe79e8d806bdab24aabcc) | fix | incorrect stats when migrating queries with best effort mode ([#59463](https://github.com/angular/angular/pull/59463)) | + + + # 19.1.0-rc.0 (2025-01-08) ### compiler From e2925cccf8a87594af4096597c9f456440ac547d Mon Sep 17 00:00:00 2001 From: kirjs Date: Wed, 15 Jan 2025 14:59:02 -0500 Subject: [PATCH 0100/1220] docs: release notes for the v19.1.0 release --- CHANGELOG.md | 132 +++++++++++---------------------------------------- 1 file changed, 29 insertions(+), 103 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 828144e31201..0cf0fae81dd9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,54 +1,61 @@ - -# 19.0.7 (2025-01-15) -### compiler-cli -| Commit | Type | Description | -| -- | -- | -- | -| [2b4b7c3ebf](https://github.com/angular/angular/commit/2b4b7c3ebfb2d4f4fd96fd2f1890b67c832505fd) | fix | handle more node types when extracting dependencies ([#59445](https://github.com/angular/angular/pull/59445)) | -### core -| Commit | Type | Description | -| -- | -- | -- | -| [f893d07232](https://github.com/angular/angular/commit/f893d0723262d699979d55e43e4ddbcf64a3fc13) | fix | destroy renderer when replacing styles during HMR ([#59514](https://github.com/angular/angular/pull/59514)) | -### migrations + +# 19.1.0 (2025-01-15) +### common | Commit | Type | Description | | -- | -- | -- | -| [eb2fcd1896](https://github.com/angular/angular/commit/eb2fcd1896e0b834b86fe79e8d806bdab24aabcc) | fix | incorrect stats when migrating queries with best effort mode ([#59463](https://github.com/angular/angular/pull/59463)) | - - - - -# 19.1.0-rc.0 (2025-01-08) +| [e4c50b3bea](https://github.com/angular/angular/commit/e4c50b3bea22ca2afba74465893c36730952f4b9) | feat | expose component instance in NgComponentOutlet ([#58698](https://github.com/angular/angular/pull/58698)) | ### compiler | Commit | Type | Description | | -- | -- | -- | | [ceadd28ea1](https://github.com/angular/angular/commit/ceadd28ea12140e8e78cdb706aff0487f5a87a3c) | fix | allow $any in two-way bindings ([#59362](https://github.com/angular/angular/pull/59362)) | +| [aed49ddaaa](https://github.com/angular/angular/commit/aed49ddaaa40d6e6816198b47ceada4e98cd636c) | fix | use chunk origin in template HMR request URL ([#59459](https://github.com/angular/angular/pull/59459)) | ### compiler-cli | Commit | Type | Description | | -- | -- | -- | -| [ce3b6641fb](https://github.com/angular/angular/commit/ce3b6641fbbbc968ee2ddf037dbc5ea70b8f1b07) | fix | account for more expression types when determining HMR dependencies ([#59323](https://github.com/angular/angular/pull/59323)) | -| [ee99879fdc](https://github.com/angular/angular/commit/ee99879fdc66f98dca80524c702304066c9882d5) | fix | preserve defer block dependencies during HMR when class metadata is disabled ([#59313](https://github.com/angular/angular/pull/59313)) | +| [c5c20e9d86](https://github.com/angular/angular/commit/c5c20e9d86d72b33840dcf0adea02876437a589f) | fix | check event side of two-way bindings ([#59002](https://github.com/angular/angular/pull/59002)) | ### core | Commit | Type | Description | | -- | -- | -- | +| [d010e11b73](https://github.com/angular/angular/commit/d010e11b735562ded439989ddb84cc83c6c00e81) | feat | add event listener options to renderer ([#59092](https://github.com/angular/angular/pull/59092)) | +| [57f3550219](https://github.com/angular/angular/commit/57f3550219f2a57c7c26c9183e48ee66845e0439) | feat | add utility for resolving defer block information to ng global ([#59184](https://github.com/angular/angular/pull/59184)) | +| [22f191f763](https://github.com/angular/angular/commit/22f191f76339a08bb8f0f2dfbc60dde0f2e38e73) | feat | extend the set of profiler events ([#59183](https://github.com/angular/angular/pull/59183)) | +| [e894a5daea](https://github.com/angular/angular/commit/e894a5daea401b4e1173b0e66557ae40140eb9a0) | feat | set kind field on template and effect nodes ([#58865](https://github.com/angular/angular/pull/58865)) | +| [bd1f1294ae](https://github.com/angular/angular/commit/bd1f1294aeb0d47b24421b7b7a608988689a459f) | feat | support TypeScript 5.7 ([#58609](https://github.com/angular/angular/pull/58609)) | | [9870b643bf](https://github.com/angular/angular/commit/9870b643bff46f089a3f0a30514fb7e062a66d56) | fix | Defer afterRender until after first CD ([#58250](https://github.com/angular/angular/pull/58250)) | | [a5fc962094](https://github.com/angular/angular/commit/a5fc9620948c59da2146d46d27de388839b93254) | fix | Don't run effects in check no changes pass ([#58250](https://github.com/angular/angular/pull/58250)) | -| [5c0d68804e](https://github.com/angular/angular/commit/5c0d68804e03bcd425e5398e08d9cbe1846b21ca) | fix | Ensure that a destroyed `effect` never run. ([#59415](https://github.com/angular/angular/pull/59415)) | ### migrations | Commit | Type | Description | | -- | -- | -- | | [d298d25426](https://github.com/angular/angular/commit/d298d254269ff759111fbdef7736bc8b713638bc) | feat | add schematic to clean up unused imports ([#59353](https://github.com/angular/angular/pull/59353)) | +| [14fb8ce4c0](https://github.com/angular/angular/commit/14fb8ce4c00fc458cfbe1d7f2c85638c6165b636) | fix | resolve text replacement issue ([#59452](https://github.com/angular/angular/pull/59452)) | ### platform-browser | Commit | Type | Description | | -- | -- | -- | | [8c5db3cfb7](https://github.com/angular/angular/commit/8c5db3cfb75700dd64f4c8c073554c7086835950) | fix | avoid circular DI error in async renderer ([#59256](https://github.com/angular/angular/pull/59256)) | -| [0e23f20c41](https://github.com/angular/angular/commit/0e23f20c4117ffd5c871549a8012b8e22b03b5f4) | fix | styles not replaced during HMR when using animations renderer ([#59393](https://github.com/angular/angular/pull/59393)) | ### router | Commit | Type | Description | | -- | -- | -- | -| [5ac6f065ab](https://github.com/angular/angular/commit/5ac6f065ab370ae99657c7a230bfd7ebf1d2f587) | fix | avoid component ID collisions with user code ([#59300](https://github.com/angular/angular/pull/59300)) | | [52a6710f54](https://github.com/angular/angular/commit/52a6710f54bcec81f4cde23a78b9f78d038156c5) | fix | complete router `events` on dispose ([#59327](https://github.com/angular/angular/pull/59327)) | + +# 19.0.7 (2025-01-15) +### compiler-cli +| Commit | Type | Description | +| -- | -- | -- | +| [2b4b7c3ebf](https://github.com/angular/angular/commit/2b4b7c3ebfb2d4f4fd96fd2f1890b67c832505fd) | fix | handle more node types when extracting dependencies ([#59445](https://github.com/angular/angular/pull/59445)) | +### core +| Commit | Type | Description | +| -- | -- | -- | +| [f893d07232](https://github.com/angular/angular/commit/f893d0723262d699979d55e43e4ddbcf64a3fc13) | fix | destroy renderer when replacing styles during HMR ([#59514](https://github.com/angular/angular/pull/59514)) | +### migrations +| Commit | Type | Description | +| -- | -- | -- | +| [eb2fcd1896](https://github.com/angular/angular/commit/eb2fcd1896e0b834b86fe79e8d806bdab24aabcc) | fix | incorrect stats when migrating queries with best effort mode ([#59463](https://github.com/angular/angular/pull/59463)) | + + + # 19.0.6 (2025-01-08) ### compiler-cli @@ -72,22 +79,6 @@ - -# 19.1.0-next.4 (2024-12-18) -### core -| Commit | Type | Description | -| -- | -- | -- | -| [57f3550219](https://github.com/angular/angular/commit/57f3550219f2a57c7c26c9183e48ee66845e0439) | feat | add utility for resolving defer block information to ng global ([#59184](https://github.com/angular/angular/pull/59184)) | -| [22f191f763](https://github.com/angular/angular/commit/22f191f76339a08bb8f0f2dfbc60dde0f2e38e73) | feat | extend the set of profiler events ([#59183](https://github.com/angular/angular/pull/59183)) | -| [1f4ff2fa36](https://github.com/angular/angular/commit/1f4ff2fa36f5d6240cbc4a40839d3d89501519d8) | fix | avoid triggering `on timer` and `on idle` on the server ([#59177](https://github.com/angular/angular/pull/59177)) | -| [cf89f14766](https://github.com/angular/angular/commit/cf89f14766b0ed0204f7012d44a4732fccb35398) | fix | Fix nested timer serialization ([#59173](https://github.com/angular/angular/pull/59173)) | -### platform-server -| Commit | Type | Description | -| -- | -- | -- | -| [300b141cc8](https://github.com/angular/angular/commit/300b141cc8652fd714b02f05c943cb79167ea844) | fix | Warn user when transfer state happens more than once ([#58935](https://github.com/angular/angular/pull/58935)) | - - - # 19.0.5 (2024-12-18) ### core @@ -102,26 +93,6 @@ - -# 19.1.0-next.3 (2024-12-12) -### compiler-cli -| Commit | Type | Description | -| -- | -- | -- | -| [c5c20e9d86](https://github.com/angular/angular/commit/c5c20e9d86d72b33840dcf0adea02876437a589f) | fix | check event side of two-way bindings ([#59002](https://github.com/angular/angular/pull/59002)) | -| [0dee2681f7](https://github.com/angular/angular/commit/0dee2681f782106fdb0fdcf9bc6ad1bca562751d) | fix | consider pre-release versions when detecting feature support ([#59061](https://github.com/angular/angular/pull/59061)) | -| [1b9492edf8](https://github.com/angular/angular/commit/1b9492edf88f8a217c0fd1a8203df489d91b623b) | fix | error in unused standalone imports diagnostic ([#59064](https://github.com/angular/angular/pull/59064)) | -### core -| Commit | Type | Description | -| -- | -- | -- | -| [d010e11b73](https://github.com/angular/angular/commit/d010e11b735562ded439989ddb84cc83c6c00e81) | feat | add event listener options to renderer ([#59092](https://github.com/angular/angular/pull/59092)) | -| [30e676098d](https://github.com/angular/angular/commit/30e676098d72e9e11a6628b9716668df08f18c62) | fix | Fix a bug where snapshotted functions are being run twice if they return a nullish/falsey value. ([#59073](https://github.com/angular/angular/pull/59073)) | -### platform-browser -| Commit | Type | Description | -| -- | -- | -- | -| [52be35118f](https://github.com/angular/angular/commit/52be35118feee587d2efe5a6c55502c171caaa97) | fix | collect external component styles from server rendering ([#59031](https://github.com/angular/angular/pull/59031)) | - - - # 19.0.4 (2024-12-12) ### compiler-cli @@ -140,43 +111,11 @@ - -# 19.1.0-next.2 (2024-12-04) - - - # 19.0.3 (2024-12-04) - -# 19.1.0-next.1 (2024-12-04) -### compiler-cli -| Commit | Type | Description | -| -- | -- | -- | -| [f280467398](https://github.com/angular/angular/commit/f280467398c6980878b5e755a78606251814447b) | fix | account for multiple generated namespace imports in HMR ([#58924](https://github.com/angular/angular/pull/58924)) | -### core -| Commit | Type | Description | -| -- | -- | -- | -| [e894a5daea](https://github.com/angular/angular/commit/e894a5daea401b4e1173b0e66557ae40140eb9a0) | feat | set kind field on template and effect nodes ([#58865](https://github.com/angular/angular/pull/58865)) | -| [3b765367f3](https://github.com/angular/angular/commit/3b765367f31b6d1bb32406505f18151acdf1f2b2) | fix | Explicitly manage TracingSnapshot lifecycle and dispose of it once it's been used. ([#58929](https://github.com/angular/angular/pull/58929)) | -### migrations -| Commit | Type | Description | -| -- | -- | -- | -| [e31e52e177](https://github.com/angular/angular/commit/e31e52e1771ea565a6869b4ed252d6ff7097d4ad) | fix | class content being deleted in some edge cases ([#58959](https://github.com/angular/angular/pull/58959)) | -| [508d3a1b3b](https://github.com/angular/angular/commit/508d3a1b3bc5770f18e3e46e2105bf0ba6178a87) | fix | correctly strip away parameters surrounded by comments in inject migration ([#58959](https://github.com/angular/angular/pull/58959)) | -| [7191aa6e09](https://github.com/angular/angular/commit/7191aa6e09ca3b85efd3fd14a18944eac4384763) | fix | don't migrate classes with parameters that can't be injected ([#58959](https://github.com/angular/angular/pull/58959)) | -| [a4924af6d5](https://github.com/angular/angular/commit/a4924af6d580c5bdaa185c4c97277c4effb55af9) | fix | inject migration aggressively removing imports ([#58959](https://github.com/angular/angular/pull/58959)) | -| [35165d152d](https://github.com/angular/angular/commit/35165d152d7f9c3c8789ebdf792037aafdc1cc66) | fix | inject migration dropping code if everything except super is removed ([#58959](https://github.com/angular/angular/pull/58959)) | -| [68e5ba7a3a](https://github.com/angular/angular/commit/68e5ba7a3a44c2f1647c4c6cc7ed66b010f85d15) | fix | preserve type literals and tuples in inject migrations ([#58959](https://github.com/angular/angular/pull/58959)) | -### platform-server -| Commit | Type | Description | -| -- | -- | -- | -| [1cfbfc66d3](https://github.com/angular/angular/commit/1cfbfc66d3a24b6c41abf13550e7c2911e20b550) | fix | remove peer dependency on animations ([#58997](https://github.com/angular/angular/pull/58997)) | - - - # 19.0.2 (2024-12-04) ### compiler-cli @@ -212,19 +151,6 @@ - -# 19.1.0-next.0 (2024-11-26) -### common -| Commit | Type | Description | -| -- | -- | -- | -| [e4c50b3bea](https://github.com/angular/angular/commit/e4c50b3bea22ca2afba74465893c36730952f4b9) | feat | expose component instance in NgComponentOutlet ([#58698](https://github.com/angular/angular/pull/58698)) | -### core -| Commit | Type | Description | -| -- | -- | -- | -| [bd1f1294ae](https://github.com/angular/angular/commit/bd1f1294aeb0d47b24421b7b7a608988689a459f) | feat | support TypeScript 5.7 ([#58609](https://github.com/angular/angular/pull/58609)) | - - - # 19.0.1 (2024-11-26) ### compiler-cli From af99c6c1098f9219426e6a8073270fff43852c12 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Thu, 9 Jan 2025 18:30:31 +0100 Subject: [PATCH 0101/1220] refactor(core): move logic out of shared instructions code (#59453) This is first of a series of refactorings that moves code around such that logic from the shared instruction file is dispatched to the relevant functional parts. PR Close #59453 --- packages/core/src/authoring/queries.ts | 2 +- packages/core/src/render3/component_ref.ts | 2 +- .../render3/instructions/change_detection.ts | 50 ++++- .../core/src/render3/instructions/element.ts | 2 +- .../render3/instructions/element_container.ts | 2 +- .../core/src/render3/instructions/listener.ts | 13 +- .../core/src/render3/instructions/queries.ts | 2 +- .../render3/instructions/queries_signals.ts | 4 +- .../core/src/render3/instructions/render.ts | 3 +- .../core/src/render3/instructions/shared.ts | 177 +----------------- .../instructions/text_interpolation.ts | 18 +- .../core/src/render3/{ => queries}/query.ts | 34 ++-- .../src/render3/queries/query_execution.ts | 78 ++++++++ .../render3/{ => queries}/query_reactive.ts | 18 +- packages/core/src/render3/util/view_utils.ts | 47 +++++ .../bundling/defer/bundle.golden_symbols.json | 1 + 16 files changed, 228 insertions(+), 225 deletions(-) rename packages/core/src/render3/{ => queries}/query.ts (96%) create mode 100644 packages/core/src/render3/queries/query_execution.ts rename packages/core/src/render3/{ => queries}/query_reactive.ts (92%) diff --git a/packages/core/src/authoring/queries.ts b/packages/core/src/authoring/queries.ts index 91dbcecdfad1..03244b3c2fdc 100644 --- a/packages/core/src/authoring/queries.ts +++ b/packages/core/src/authoring/queries.ts @@ -12,7 +12,7 @@ import { createMultiResultQuerySignalFn, createSingleResultOptionalQuerySignalFn, createSingleResultRequiredQuerySignalFn, -} from '../render3/query_reactive'; +} from '../render3/queries/query_reactive'; import {Signal} from '../render3/reactivity/api'; function viewChildFn( diff --git a/packages/core/src/render3/component_ref.ts b/packages/core/src/render3/component_ref.ts index 11b317733944..78d4f98c5ef0 100644 --- a/packages/core/src/render3/component_ref.ts +++ b/packages/core/src/render3/component_ref.ts @@ -43,7 +43,6 @@ import { addToEndOfViewTree, createLView, createTView, - executeContentQueries, getInitialLViewFlagsFromDef, getOrCreateComponentTView, getOrCreateTNode, @@ -91,6 +90,7 @@ import {ChainedInjector} from './chained_injector'; import {unregisterLView} from './interfaces/lview_tracking'; import {profiler} from './profiler'; import {ProfilerEvent} from './profiler_types'; +import {executeContentQueries} from './queries/query_execution'; export class ComponentFactoryResolver extends AbstractComponentFactoryResolver { /** diff --git a/packages/core/src/render3/instructions/change_detection.ts b/packages/core/src/render3/instructions/change_detection.ts index 514cc9eb8af8..23526287d101 100644 --- a/packages/core/src/render3/instructions/change_detection.ts +++ b/packages/core/src/render3/instructions/change_detection.ts @@ -19,7 +19,7 @@ import {RuntimeError, RuntimeErrorCode} from '../../errors'; import {assertDefined, assertEqual} from '../../util/assert'; import {executeCheckHooks, executeInitAndCheckHooks, incrementInitPhaseFlags} from '../hooks'; import {CONTAINER_HEADER_OFFSET, LContainerFlags, MOVED_VIEWS} from '../interfaces/container'; -import {ComponentTemplate, RenderFlags} from '../interfaces/definition'; +import {ComponentTemplate, HostBindingsFunction, RenderFlags} from '../interfaces/definition'; import { CONTEXT, EFFECTS_TO_SCHEDULE, @@ -47,8 +47,10 @@ import { isRefreshingViews, leaveView, setBindingIndex, + setBindingRootForHostBindings, setIsInCheckNoChangesMode, setIsRefreshingViews, + setSelectedIndex, } from '../state'; import {getFirstLContainer, getNextLContainer} from '../util/view_traversal_utils'; import { @@ -61,17 +63,12 @@ import { viewAttachedToChangeDetector, } from '../util/view_utils'; -import { - executeTemplate, - executeViewQueryFn, - handleError, - processHostBindingOpCodes, - refreshContentQueries, -} from './shared'; -import {runEffectsInView} from '../reactivity/view_effect_runner'; import {isDestroyed} from '../interfaces/type_checks'; import {ProfilerEvent} from '../profiler_types'; import {profiler} from '../profiler'; +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. @@ -520,3 +517,38 @@ function detectChangesInChildComponents( detectChangesInComponent(hostLView, components[i], mode); } } + +/** + * Invoke `HostBindingsFunction`s for view. + * + * This methods executes `TView.hostBindingOpCodes`. It is used to execute the + * `HostBindingsFunction`s associated with the current `LView`. + * + * @param tView Current `TView`. + * @param lView Current `LView`. + */ +function processHostBindingOpCodes(tView: TView, lView: LView): void { + const hostBindingOpCodes = tView.hostBindingOpCodes; + if (hostBindingOpCodes === null) return; + try { + for (let i = 0; i < hostBindingOpCodes.length; i++) { + const opCode = hostBindingOpCodes[i] as number; + if (opCode < 0) { + // Negative numbers are element indexes. + setSelectedIndex(~opCode); + } else { + // Positive numbers are NumberTuple which store bindingRootIndex and directiveIndex. + const directiveIdx = opCode; + const bindingRootIndx = hostBindingOpCodes[++i] as number; + const hostBindingFn = hostBindingOpCodes[++i] as HostBindingsFunction; + setBindingRootForHostBindings(bindingRootIndx, directiveIdx); + const context = lView[directiveIdx]; + profiler(ProfilerEvent.HostBindingsUpdateStart, context); + hostBindingFn(RenderFlags.Update, context); + profiler(ProfilerEvent.HostBindingsUpdateEnd, context); + } + } + } finally { + setSelectedIndex(-1); + } +} diff --git a/packages/core/src/render3/instructions/element.ts b/packages/core/src/render3/instructions/element.ts index 45696b1fa778..44916fa4d265 100644 --- a/packages/core/src/render3/instructions/element.ts +++ b/packages/core/src/render3/instructions/element.ts @@ -48,6 +48,7 @@ import { createElementNode, setupStaticAttributes, } from '../node_manipulation'; +import {executeContentQueries} from '../queries/query_execution'; import { decreaseElementDepthCount, enterSkipHydrationBlock, @@ -74,7 +75,6 @@ import {validateElementIsKnown} from './element_validation'; import {setDirectiveInputsWhichShadowsStyling} from './property'; import { createDirectivesInstances, - executeContentQueries, getOrCreateTNode, resolveDirectives, saveResolvedLocalsInData, diff --git a/packages/core/src/render3/instructions/element_container.ts b/packages/core/src/render3/instructions/element_container.ts index 4800c8c3ab55..65e7fb0e9fbb 100644 --- a/packages/core/src/render3/instructions/element_container.ts +++ b/packages/core/src/render3/instructions/element_container.ts @@ -24,6 +24,7 @@ import {isContentQueryHost, isDirectiveHost} from '../interfaces/type_checks'; import {HEADER_OFFSET, HYDRATION, LView, RENDERER, TView} from '../interfaces/view'; import {assertTNodeType} from '../node_assert'; import {appendChild, createCommentNode} from '../node_manipulation'; +import {executeContentQueries} from '../queries/query_execution'; import { getBindingIndex, getCurrentTNode, @@ -41,7 +42,6 @@ import {getConstant} from '../util/view_utils'; import { createDirectivesInstances, - executeContentQueries, getOrCreateTNode, resolveDirectives, saveResolvedLocalsInData, diff --git a/packages/core/src/render3/instructions/listener.ts b/packages/core/src/render3/instructions/listener.ts index e4afa213be3e..cbfdfe92ed91 100644 --- a/packages/core/src/render3/instructions/listener.ts +++ b/packages/core/src/render3/instructions/listener.ts @@ -19,15 +19,16 @@ import {assertTNodeType} from '../node_assert'; import {profiler} from '../profiler'; import {ProfilerEvent} from '../profiler_types'; import {getCurrentDirectiveDef, getCurrentTNode, getLView, getTView} from '../state'; -import {getComponentLViewByIndex, getNativeByTNode, unwrapRNode} from '../util/view_utils'; - -import {markViewDirty} from './mark_view_dirty'; import { + getComponentLViewByIndex, + getNativeByTNode, getOrCreateLViewCleanup, getOrCreateTViewCleanup, - handleError, - loadComponentRenderer, -} from './shared'; + unwrapRNode, +} from '../util/view_utils'; + +import {markViewDirty} from './mark_view_dirty'; +import {handleError, loadComponentRenderer} from './shared'; /** * Contains a reference to a function that disables event replay feature diff --git a/packages/core/src/render3/instructions/queries.ts b/packages/core/src/render3/instructions/queries.ts index e69307f77086..6d91631d2b15 100644 --- a/packages/core/src/render3/instructions/queries.ts +++ b/packages/core/src/render3/instructions/queries.ts @@ -16,7 +16,7 @@ import { getQueryResults, getTQuery, loadQueryInternal, -} from '../query'; +} from '../queries/query'; import {getCurrentQueryIndex, getLView, getTView, setCurrentQueryIndex} from '../state'; import {isCreationMode} from '../util/view_utils'; diff --git a/packages/core/src/render3/instructions/queries_signals.ts b/packages/core/src/render3/instructions/queries_signals.ts index 1c4e9e45bcca..aaf3f2b7d535 100644 --- a/packages/core/src/render3/instructions/queries_signals.ts +++ b/packages/core/src/render3/instructions/queries_signals.ts @@ -8,8 +8,8 @@ import {ProviderToken} from '../../di/provider_token'; import {QueryFlags} from '../interfaces/query'; -import {createContentQuery, createViewQuery} from '../query'; -import {bindQueryToSignal} from '../query_reactive'; +import {createContentQuery, createViewQuery} from '../queries/query'; +import {bindQueryToSignal} from '../queries/query_reactive'; import {Signal} from '../reactivity/api'; import {getCurrentQueryIndex, setCurrentQueryIndex} from '../state'; diff --git a/packages/core/src/render3/instructions/render.ts b/packages/core/src/render3/instructions/render.ts index df95d36b0659..01270cb454e3 100644 --- a/packages/core/src/render3/instructions/render.ts +++ b/packages/core/src/render3/instructions/render.ts @@ -23,10 +23,11 @@ import { } from '../interfaces/view'; import {profiler} from '../profiler'; import {ProfilerEvent} from '../profiler_types'; +import {executeViewQueryFn, refreshContentQueries} from '../queries/query_execution'; import {enterView, leaveView} from '../state'; import {getComponentLViewByIndex, isCreationMode} from '../util/view_utils'; -import {executeTemplate, executeViewQueryFn, refreshContentQueries} from './shared'; +import {executeTemplate} from './shared'; export function renderComponent(hostLView: LView, componentHostIdx: number) { ngDevMode && assertEqual(isCreationMode(hostLView), true, 'Should be run in creation mode'); diff --git a/packages/core/src/render3/instructions/shared.ts b/packages/core/src/render3/instructions/shared.ts index aa542fdf8d1d..35ae97b0cf5f 100644 --- a/packages/core/src/render3/instructions/shared.ts +++ b/packages/core/src/render3/instructions/shared.ts @@ -6,8 +6,6 @@ * found in the LICENSE file at https://angular.dev/license */ -import {setActiveConsumer} from '@angular/core/primitives/signals'; - import {Injector} from '../../di/injector'; import {ErrorHandler} from '../../error_handler'; import {RuntimeError, RuntimeErrorCode} from '../../errors'; @@ -37,7 +35,6 @@ import { import {escapeCommentText} from '../../util/dom'; import {normalizeDebugBindingName, normalizeDebugBindingValue} from '../../util/ng_reflect'; import {stringify} from '../../util/stringify'; -import {applyValueToInputField} from '../apply_value_input_field'; import { assertFirstCreatePass, assertFirstUpdatePass, @@ -57,7 +54,6 @@ import { ComponentTemplate, DirectiveDef, DirectiveDefListOrFactory, - HostBindingsFunction, HostDirectiveBindingMap, HostDirectiveDefs, PipeDefListOrFactory, @@ -90,11 +86,10 @@ import {Renderer} from '../interfaces/renderer'; import {RComment, RElement, RNode, RText} from '../interfaces/renderer_dom'; import {SanitizerFn} from '../interfaces/sanitization'; import {TStylingRange} from '../interfaces/styling'; -import {isComponentDef, isComponentHost, isContentQueryHost} from '../interfaces/type_checks'; +import {isComponentDef, isComponentHost} from '../interfaces/type_checks'; import { CHILD_HEAD, CHILD_TAIL, - CLEANUP, CONTEXT, DECLARATION_COMPONENT_VIEW, DECLARATION_VIEW, @@ -120,7 +115,7 @@ import { TViewType, } from '../interfaces/view'; import {assertPureTNodeType, assertTNodeType} from '../node_assert'; -import {clearElementContents, updateTextNode} from '../node_manipulation'; +import {clearElementContents} from '../node_manipulation'; import {isInlineTemplate, isNodeMatchingSelectorList} from '../node_selector_matcher'; import {profiler} from '../profiler'; import {ProfilerEvent} from '../profiler_types'; @@ -134,9 +129,7 @@ import { isInCheckNoChangesMode, isInI18nBlock, isInSkipHydrationBlock, - setBindingRootForHostBindings, setCurrentDirectiveIndex, - setCurrentQueryIndex, setCurrentTNode, setSelectedIndex, } from '../state'; @@ -146,7 +139,6 @@ import {INTERPOLATION_DELIMITER} from '../util/misc_utils'; import {renderStringify} from '../util/stringify_utils'; import { getComponentLViewByIndex, - getNativeByIndex, getNativeByTNode, resetPreOrderHookFlags, unwrapLView, @@ -157,42 +149,6 @@ import {ɵɵdirectiveInject} from './di'; import {handleUnknownPropertyError, isPropertyValid, matchingSchemas} from './element_validation'; import {writeToDirectiveInput} from './write_to_directive_input'; -/** - * Invoke `HostBindingsFunction`s for view. - * - * This methods executes `TView.hostBindingOpCodes`. It is used to execute the - * `HostBindingsFunction`s associated with the current `LView`. - * - * @param tView Current `TView`. - * @param lView Current `LView`. - */ -export function processHostBindingOpCodes(tView: TView, lView: LView): void { - const hostBindingOpCodes = tView.hostBindingOpCodes; - if (hostBindingOpCodes === null) return; - try { - for (let i = 0; i < hostBindingOpCodes.length; i++) { - const opCode = hostBindingOpCodes[i] as number; - if (opCode < 0) { - // Negative numbers are element indexes. - setSelectedIndex(~opCode); - } else { - // Positive numbers are NumberTuple which store bindingRootIndex and directiveIndex. - const directiveIdx = opCode; - const bindingRootIndx = hostBindingOpCodes[++i] as number; - const hostBindingFn = hostBindingOpCodes[++i] as HostBindingsFunction; - setBindingRootForHostBindings(bindingRootIndx, directiveIdx); - const context = lView[directiveIdx]; - - profiler(ProfilerEvent.HostBindingsUpdateStart, context); - hostBindingFn(RenderFlags.Update, context); - profiler(ProfilerEvent.HostBindingsUpdateEnd, context); - } - } - } finally { - setSelectedIndex(-1); - } -} - export function createLView( parentLView: LView | null, tView: TView, @@ -457,34 +413,6 @@ export function executeTemplate( } } -////////////////////////// -//// Element -////////////////////////// - -export function executeContentQueries(tView: TView, tNode: TNode, lView: LView) { - if (isContentQueryHost(tNode)) { - const prevConsumer = setActiveConsumer(null); - try { - const start = tNode.directiveStart; - const end = tNode.directiveEnd; - for (let directiveIndex = start; directiveIndex < end; directiveIndex++) { - const def = tView.data[directiveIndex] as DirectiveDef; - if (def.contentQueries) { - const directiveInstance = lView[directiveIndex]; - ngDevMode && - assertDefined( - directiveIndex, - 'Incorrect reference to a directive defining a content query', - ); - def.contentQueries(RenderFlags.Create, directiveInstance, directiveIndex); - } - } - } finally { - setActiveConsumer(prevConsumer); - } - } -} - /** * Creates directive instances. */ @@ -716,43 +644,6 @@ export function enableApplyRootElementTransformImpl() { _applyRootElementTransformImpl = applyRootElementTransformImpl; } -/** - * Saves context for this cleanup function in LView.cleanupInstances. - * - * On the first template pass, saves in TView: - * - Cleanup function - * - Index of context we just saved in LView.cleanupInstances - */ -export function storeCleanupWithContext( - tView: TView, - lView: LView, - context: any, - cleanupFn: Function, -): void { - const lCleanup = getOrCreateLViewCleanup(lView); - - // Historically the `storeCleanupWithContext` was used to register both framework-level and - // user-defined cleanup callbacks, but over time those two types of cleanups were separated. - // This dev mode checks assures that user-level cleanup callbacks are _not_ stored in data - // structures reserved for framework-specific hooks. - ngDevMode && - assertDefined( - context, - 'Cleanup context is mandatory when registering framework-level destroy hooks', - ); - lCleanup.push(context); - - if (tView.firstCreatePass) { - getOrCreateTViewCleanup(tView).push(cleanupFn, lCleanup.length - 1); - } else { - // Make sure that no new framework-level cleanup functions are registered after the first - // template pass is done (and TView data structures are meant to fully constructed). - if (ngDevMode) { - Object.freeze(getOrCreateTViewCleanup(tView)); - } - } -} - /** * Constructs a TNode object from the arguments. * @@ -1870,30 +1761,6 @@ export function createLContainer( return lContainer; } -/** Refreshes all content queries declared by directives in a given view */ -export function refreshContentQueries(tView: TView, lView: LView): void { - const contentQueries = tView.contentQueries; - if (contentQueries !== null) { - const prevConsumer = setActiveConsumer(null); - try { - for (let i = 0; i < contentQueries.length; i += 2) { - const queryStartIdx = contentQueries[i]; - const directiveDefIdx = contentQueries[i + 1]; - if (directiveDefIdx !== -1) { - const directiveDef = tView.data[directiveDefIdx] as DirectiveDef; - ngDevMode && assertDefined(directiveDef, 'DirectiveDef not found.'); - ngDevMode && - assertDefined(directiveDef.contentQueries, 'contentQueries function should be defined'); - setCurrentQueryIndex(queryStartIdx); - directiveDef.contentQueries!(RenderFlags.Update, lView[directiveDefIdx], directiveDefIdx); - } - } - } finally { - setActiveConsumer(prevConsumer); - } - } -} - /** * Adds LView or LContainer to the end of the current view tree. * @@ -1922,25 +1789,6 @@ export function addToEndOfViewTree( return lViewOrLContainer; } -/////////////////////////////// -//// Change detection -/////////////////////////////// - -export function executeViewQueryFn( - flags: RenderFlags, - viewQueryFn: ViewQueriesFunction, - component: T, -): void { - ngDevMode && assertDefined(viewQueryFn, 'View queries function to execute must be defined.'); - setCurrentQueryIndex(0); - const prevConsumer = setActiveConsumer(null); - try { - viewQueryFn(flags, component); - } finally { - setActiveConsumer(prevConsumer); - } -} - /////////////////////////////// //// Bindings & interpolations /////////////////////////////// @@ -1990,15 +1838,6 @@ export function storePropertyBindingMetadata( } } -export function getOrCreateLViewCleanup(view: LView): any[] { - // top level variables should not be exported for performance reasons (PERF_NOTES.md) - return (view[CLEANUP] ??= []); -} - -export function getOrCreateTViewCleanup(tView: TView): any[] { - return (tView.cleanup ??= []); -} - /** * There are cases where the sub component's renderer needs to be included * instead of the current renderer (see the componentSyntheticHost* instructions). @@ -2054,15 +1893,3 @@ export function setInputsForProperty( writeToDirectiveInput(def, instance, publicName, privateName, flags, value); } } - -/** - * Updates a text binding at a given index in a given LView. - */ -export function textBindingInternal(lView: LView, index: number, value: string): void { - ngDevMode && assertString(value, 'Value should be a string'); - ngDevMode && assertNotSame(value, NO_CHANGE as any, 'value should not be NO_CHANGE'); - ngDevMode && assertIndexInRange(lView, index); - const element = getNativeByIndex(index, lView) as any as RText; - ngDevMode && assertDefined(element, 'native element should exist'); - updateTextNode(lView[RENDERER], element, value); -} diff --git a/packages/core/src/render3/instructions/text_interpolation.ts b/packages/core/src/render3/instructions/text_interpolation.ts index 85342cae3cbf..5c9625690e58 100644 --- a/packages/core/src/render3/instructions/text_interpolation.ts +++ b/packages/core/src/render3/instructions/text_interpolation.ts @@ -5,8 +5,13 @@ * 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 {assertDefined, assertIndexInRange, assertNotSame, assertString} from '../../util/assert'; +import {RText} from '../interfaces/renderer_dom'; +import {LView, RENDERER} from '../interfaces/view'; +import {updateTextNode} from '../node_manipulation'; import {getLView, getSelectedIndex} from '../state'; import {NO_CHANGE} from '../tokens'; +import {getNativeByIndex} from '../util/view_utils'; import { interpolation1, @@ -19,7 +24,6 @@ import { interpolation8, interpolationV, } from './interpolation'; -import {textBindingInternal} from './shared'; /** * @@ -449,3 +453,15 @@ export function ɵɵtextInterpolateV(values: any[]): typeof ɵɵtextInterpolateV } return ɵɵtextInterpolateV; } + +/** + * Updates a text binding at a given index in a given LView. + */ +function textBindingInternal(lView: LView, index: number, value: string): void { + ngDevMode && assertString(value, 'Value should be a string'); + ngDevMode && assertNotSame(value, NO_CHANGE as any, 'value should not be NO_CHANGE'); + ngDevMode && assertIndexInRange(lView, index); + const element = getNativeByIndex(index, lView) as any as RText; + ngDevMode && assertDefined(element, 'native element should exist'); + updateTextNode(lView[RENDERER], element, value); +} diff --git a/packages/core/src/render3/query.ts b/packages/core/src/render3/queries/query.ts similarity index 96% rename from packages/core/src/render3/query.ts rename to packages/core/src/render3/queries/query.ts index 2e181e235e21..3060c4f20168 100644 --- a/packages/core/src/render3/query.ts +++ b/packages/core/src/render3/queries/query.ts @@ -9,29 +9,29 @@ // We are temporarily importing the existing viewEngine_from core so we can be sure we are // correctly implementing its interfaces for backwards compatibility. -import {ProviderToken} from '../di/provider_token'; -import {createElementRef, ElementRef as ViewEngine_ElementRef} from '../linker/element_ref'; -import {QueryList} from '../linker/query_list'; -import {createTemplateRef, TemplateRef as ViewEngine_TemplateRef} from '../linker/template_ref'; -import {createContainerRef, ViewContainerRef} from '../linker/view_container_ref'; -import {assertDefined, assertIndexInRange, assertNumber, throwError} from '../util/assert'; -import {stringify} from '../util/stringify'; - -import {assertFirstCreatePass, assertLContainer} from './assert'; -import {getNodeInjectable, locateDirectiveOrProvider} from './di'; -import {storeCleanupWithContext} from './instructions/shared'; -import {CONTAINER_HEADER_OFFSET, LContainer, MOVED_VIEWS} from './interfaces/container'; +import {ProviderToken} from '../../di/provider_token'; +import {createElementRef, ElementRef as ViewEngine_ElementRef} from '../../linker/element_ref'; +import {QueryList} from '../../linker/query_list'; +import {createTemplateRef, TemplateRef as ViewEngine_TemplateRef} from '../../linker/template_ref'; +import {createContainerRef, ViewContainerRef} from '../../linker/view_container_ref'; +import {assertDefined, assertIndexInRange, assertNumber, throwError} from '../../util/assert'; +import {stringify} from '../../util/stringify'; + +import {assertFirstCreatePass, assertLContainer} from '../assert'; +import {getNodeInjectable, locateDirectiveOrProvider} from '../di'; +import {CONTAINER_HEADER_OFFSET, LContainer, MOVED_VIEWS} from '../interfaces/container'; import { TContainerNode, TElementContainerNode, TElementNode, TNode, TNodeType, -} from './interfaces/node'; -import {LQueries, LQuery, QueryFlags, TQueries, TQuery, TQueryMetadata} from './interfaces/query'; -import {DECLARATION_LCONTAINER, LView, PARENT, QUERIES, TVIEW, TView} from './interfaces/view'; -import {assertTNodeType} from './node_assert'; -import {getCurrentTNode, getLView, getTView} from './state'; +} from '../interfaces/node'; +import {LQueries, LQuery, QueryFlags, TQueries, TQuery, TQueryMetadata} from '../interfaces/query'; +import {DECLARATION_LCONTAINER, LView, PARENT, QUERIES, TVIEW, TView} from '../interfaces/view'; +import {assertTNodeType} from '../node_assert'; +import {getCurrentTNode, getLView, getTView} from '../state'; +import {storeCleanupWithContext} from '../util/view_utils'; class LQuery_ implements LQuery { matches: (T | null)[] | null = null; diff --git a/packages/core/src/render3/queries/query_execution.ts b/packages/core/src/render3/queries/query_execution.ts new file mode 100644 index 000000000000..3eada760eaa7 --- /dev/null +++ b/packages/core/src/render3/queries/query_execution.ts @@ -0,0 +1,78 @@ +/** + * @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 {setActiveConsumer} from '@angular/core/primitives/signals'; +import {LView, TView} from '../interfaces/view'; +import {DirectiveDef, RenderFlags, ViewQueriesFunction} from '../interfaces/definition'; +import {assertDefined} from '../../util/assert'; +import {setCurrentQueryIndex} from '../state'; +import {TNode} from '../interfaces/node'; +import {isContentQueryHost} from '../interfaces/type_checks'; + +/** Refreshes all content queries declared by directives in a given view */ +export function refreshContentQueries(tView: TView, lView: LView): void { + const contentQueries = tView.contentQueries; + if (contentQueries !== null) { + const prevConsumer = setActiveConsumer(null); + try { + for (let i = 0; i < contentQueries.length; i += 2) { + const queryStartIdx = contentQueries[i]; + const directiveDefIdx = contentQueries[i + 1]; + if (directiveDefIdx !== -1) { + const directiveDef = tView.data[directiveDefIdx] as DirectiveDef; + ngDevMode && assertDefined(directiveDef, 'DirectiveDef not found.'); + ngDevMode && + assertDefined(directiveDef.contentQueries, 'contentQueries function should be defined'); + setCurrentQueryIndex(queryStartIdx); + directiveDef.contentQueries!(RenderFlags.Update, lView[directiveDefIdx], directiveDefIdx); + } + } + } finally { + setActiveConsumer(prevConsumer); + } + } +} + +export function executeViewQueryFn( + flags: RenderFlags, + viewQueryFn: ViewQueriesFunction, + component: T, +): void { + ngDevMode && assertDefined(viewQueryFn, 'View queries function to execute must be defined.'); + setCurrentQueryIndex(0); + const prevConsumer = setActiveConsumer(null); + try { + viewQueryFn(flags, component); + } finally { + setActiveConsumer(prevConsumer); + } +} + +export function executeContentQueries(tView: TView, tNode: TNode, lView: LView) { + if (isContentQueryHost(tNode)) { + const prevConsumer = setActiveConsumer(null); + try { + const start = tNode.directiveStart; + const end = tNode.directiveEnd; + for (let directiveIndex = start; directiveIndex < end; directiveIndex++) { + const def = tView.data[directiveIndex] as DirectiveDef; + if (def.contentQueries) { + const directiveInstance = lView[directiveIndex]; + ngDevMode && + assertDefined( + directiveIndex, + 'Incorrect reference to a directive defining a content query', + ); + def.contentQueries(RenderFlags.Create, directiveInstance, directiveIndex); + } + } + } finally { + setActiveConsumer(prevConsumer); + } + } +} diff --git a/packages/core/src/render3/query_reactive.ts b/packages/core/src/render3/queries/query_reactive.ts similarity index 92% rename from packages/core/src/render3/query_reactive.ts rename to packages/core/src/render3/queries/query_reactive.ts index 0bf229c47352..0d062116e208 100644 --- a/packages/core/src/render3/query_reactive.ts +++ b/packages/core/src/render3/queries/query_reactive.ts @@ -8,16 +8,16 @@ import {ComputedNode, createComputed, SIGNAL} from '@angular/core/primitives/signals'; -import {RuntimeError, RuntimeErrorCode} from '../errors'; -import {unwrapElementRef} from '../linker/element_ref'; -import {QueryList} from '../linker/query_list'; -import {EMPTY_ARRAY} from '../util/empty'; - -import {FLAGS, LView, LViewFlags} from './interfaces/view'; +import {RuntimeError, RuntimeErrorCode} from '../../errors'; +import {unwrapElementRef} from '../../linker/element_ref'; +import {QueryList} from '../../linker/query_list'; +import {EMPTY_ARRAY} from '../../util/empty'; + +import {FLAGS, LView, LViewFlags} from '../interfaces/view'; +import {Signal} from '../reactivity/api'; +import {signal, WritableSignal} from '../reactivity/signal'; +import {getLView} from '../state'; import {getQueryResults, loadQueryInternal} from './query'; -import {Signal} from './reactivity/api'; -import {signal, WritableSignal} from './reactivity/signal'; -import {getLView} from './state'; interface QuerySignalNode extends ComputedNode> { _lView?: LView; diff --git a/packages/core/src/render3/util/view_utils.ts b/packages/core/src/render3/util/view_utils.ts index 1af2076b3ce9..901e28a01a0b 100644 --- a/packages/core/src/render3/util/view_utils.ts +++ b/packages/core/src/render3/util/view_utils.ts @@ -21,6 +21,7 @@ import {TConstants, TNode} from '../interfaces/node'; import {RNode} from '../interfaces/renderer_dom'; import {isDestroyed, isLContainer, isLView} from '../interfaces/type_checks'; import { + CLEANUP, DECLARATION_VIEW, ENVIRONMENT, FLAGS, @@ -305,3 +306,49 @@ export function getLViewParent(lView: LView): LView | null { const parent = lView[PARENT]; return isLContainer(parent) ? parent[PARENT] : parent; } + +export function getOrCreateLViewCleanup(view: LView): any[] { + // top level variables should not be exported for performance reasons (PERF_NOTES.md) + return (view[CLEANUP] ??= []); +} + +export function getOrCreateTViewCleanup(tView: TView): any[] { + return (tView.cleanup ??= []); +} + +/** + * Saves context for this cleanup function in LView.cleanupInstances. + * + * On the first template pass, saves in TView: + * - Cleanup function + * - Index of context we just saved in LView.cleanupInstances + */ +export function storeCleanupWithContext( + tView: TView, + lView: LView, + context: any, + cleanupFn: Function, +): void { + const lCleanup = getOrCreateLViewCleanup(lView); + + // Historically the `storeCleanupWithContext` was used to register both framework-level and + // user-defined cleanup callbacks, but over time those two types of cleanups were separated. + // This dev mode checks assures that user-level cleanup callbacks are _not_ stored in data + // structures reserved for framework-specific hooks. + ngDevMode && + assertDefined( + context, + 'Cleanup context is mandatory when registering framework-level destroy hooks', + ); + lCleanup.push(context); + + if (tView.firstCreatePass) { + getOrCreateTViewCleanup(tView).push(cleanupFn, lCleanup.length - 1); + } else { + // Make sure that no new framework-level cleanup functions are registered after the first + // template pass is done (and TView data structures are meant to fully constructed). + if (ngDevMode) { + Object.freeze(getOrCreateTViewCleanup(tView)); + } + } +} diff --git a/packages/core/test/bundling/defer/bundle.golden_symbols.json b/packages/core/test/bundling/defer/bundle.golden_symbols.json index 4a893cbb6199..d07cc8ed5325 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -651,6 +651,7 @@ "init_queries2", "init_queries_signals", "init_query", + "init_query_execution", "init_query_list", "init_query_reactive", "init_r3_injector", From 2e138e644cd9627f3967e11b3abe9525f10b6e41 Mon Sep 17 00:00:00 2001 From: arturovt Date: Tue, 14 Jan 2025 18:32:44 +0200 Subject: [PATCH 0102/1220] refactor(common): prevent duplicating `Content-Type` header (#59518) Drops some bytes by moving `Content-Type` into a variable, which is then minified to something like `var b="Content-Type"` and reused in all the places. PR Close #59518 --- packages/common/http/src/fetch.ts | 8 ++++---- packages/common/http/src/request.ts | 7 +++++++ packages/common/http/src/xhr.ts | 6 +++--- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/packages/common/http/src/fetch.ts b/packages/common/http/src/fetch.ts index c865e0baefc8..a5e05d9d199a 100644 --- a/packages/common/http/src/fetch.ts +++ b/packages/common/http/src/fetch.ts @@ -11,7 +11,7 @@ import {Observable, Observer} from 'rxjs'; import {HttpBackend} from './backend'; import {HttpHeaders} from './headers'; -import {ACCEPT_HEADER, HttpRequest, X_REQUEST_URL_HEADER} from './request'; +import {ACCEPT_HEADER, CONTENT_TYPE_HEADER, HttpRequest, X_REQUEST_URL_HEADER} from './request'; import { HTTP_STATUS_CODE_OK, HttpDownloadProgressEvent, @@ -174,7 +174,7 @@ export class FetchBackend implements HttpBackend { // Combine all chunks. const chunksAll = this.concatChunks(chunks, receivedLength); try { - const contentType = response.headers.get('Content-Type') ?? ''; + const contentType = response.headers.get(CONTENT_TYPE_HEADER) ?? ''; body = this.parseBody(request, chunksAll, contentType); } catch (error) { // Body loading or parsing failed @@ -263,11 +263,11 @@ export class FetchBackend implements HttpBackend { } // Auto-detect the Content-Type header if one isn't present already. - if (!req.headers.has('Content-Type')) { + if (!req.headers.has(CONTENT_TYPE_HEADER)) { const detectedType = req.detectContentTypeHeader(); // Sometimes Content-Type detection fails. if (detectedType !== null) { - headers['Content-Type'] = detectedType; + headers[CONTENT_TYPE_HEADER] = detectedType; } } diff --git a/packages/common/http/src/request.ts b/packages/common/http/src/request.ts index 3ea5b63a73a1..0e7b6d557828 100644 --- a/packages/common/http/src/request.ts +++ b/packages/common/http/src/request.ts @@ -77,6 +77,13 @@ function isUrlSearchParams(value: any): value is URLSearchParams { return typeof URLSearchParams !== 'undefined' && value instanceof URLSearchParams; } +/** + * `Content-Type` is an HTTP header used to indicate the media type + * (also known as MIME type) of the resource being sent to the client + * or received from the server. + */ +export const CONTENT_TYPE_HEADER = 'Content-Type'; + /** * `X-Request-URL` is a custom HTTP header used in older browser versions, * including Firefox (< 32), Chrome (< 37), Safari (< 8), and Internet Explorer, diff --git a/packages/common/http/src/xhr.ts b/packages/common/http/src/xhr.ts index a5b10b754f94..8c481e78b9c0 100644 --- a/packages/common/http/src/xhr.ts +++ b/packages/common/http/src/xhr.ts @@ -14,7 +14,7 @@ import {switchMap} from 'rxjs/operators'; import {HttpBackend} from './backend'; import {RuntimeErrorCode} from './errors'; import {HttpHeaders} from './headers'; -import {ACCEPT_HEADER, HttpRequest, X_REQUEST_URL_HEADER} from './request'; +import {ACCEPT_HEADER, CONTENT_TYPE_HEADER, HttpRequest, X_REQUEST_URL_HEADER} from './request'; import { HTTP_STATUS_CODE_NO_CONTENT, HTTP_STATUS_CODE_OK, @@ -102,11 +102,11 @@ export class HttpXhrBackend implements HttpBackend { } // Auto-detect the Content-Type header if one isn't present already. - if (!req.headers.has('Content-Type')) { + if (!req.headers.has(CONTENT_TYPE_HEADER)) { const detectedType = req.detectContentTypeHeader(); // Sometimes Content-Type detection fails. if (detectedType !== null) { - xhr.setRequestHeader('Content-Type', detectedType); + xhr.setRequestHeader(CONTENT_TYPE_HEADER, detectedType); } } From d0ad030ec7af94732e92d226dbec380c1a12c6cd Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Wed, 15 Jan 2025 13:12:26 -0800 Subject: [PATCH 0103/1220] Revert "feat(compiler-cli): detect missing structural directive imports (#59443)" (#59544) This reverts commit ed705a856a164f91d33e2173b4f371329d07c472. PR Close #59544 --- .../reference/extended-diagnostics/NG8114.md | 61 ----- .../extended-diagnostics/overview.md | 3 +- .../public-api/compiler-cli/error_code.api.md | 1 - .../extended_template_diagnostic_name.api.md | 2 - .../src/ngtsc/diagnostics/src/error_code.ts | 5 - .../src/extended_template_diagnostic_name.ts | 1 - .../src/ngtsc/typecheck/extended/BUILD.bazel | 1 - .../missing_structural_directive/BUILD.bazel | 15 -- .../missing_structural_directive/index.ts | 91 -------- .../src/ngtsc/typecheck/extended/index.ts | 2 - .../missing_structural_directive/BUILD.bazel | 30 --- .../missing_structural_directive_spec.ts | 218 ------------------ 12 files changed, 1 insertion(+), 429 deletions(-) delete mode 100644 adev/src/content/reference/extended-diagnostics/NG8114.md delete mode 100644 packages/compiler-cli/src/ngtsc/typecheck/extended/checks/missing_structural_directive/BUILD.bazel delete mode 100644 packages/compiler-cli/src/ngtsc/typecheck/extended/checks/missing_structural_directive/index.ts delete mode 100644 packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/missing_structural_directive/BUILD.bazel delete mode 100644 packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/missing_structural_directive/missing_structural_directive_spec.ts diff --git a/adev/src/content/reference/extended-diagnostics/NG8114.md b/adev/src/content/reference/extended-diagnostics/NG8114.md deleted file mode 100644 index 49d832b7ad9a..000000000000 --- a/adev/src/content/reference/extended-diagnostics/NG8114.md +++ /dev/null @@ -1,61 +0,0 @@ -# Missing structural directive - -This diagnostic ensures that a standalone component using custom structural directives (e.g., `*select` or `*featureFlag`) in a template has the necessary imports for those directives. - - - -import {Component} from '@angular/core'; - -@Component({ - // Template uses `*select`, but no corresponding directive imported. - imports: [], - template: `

{{data}}

`, -}) -class MyComponent {} - -
- -## What's wrong with that? - -Using a structural directive without importing it will fail at runtime, as Angular attempts to bind to a `select` property of the HTML element, which does not exist. - -## What should I do instead? - -Make sure that the corresponding structural directive is imported into the component: - - - -import {Component} from '@angular/core'; -import {SelectDirective} from 'my-directives'; - -@Component({ - // Add `SelectDirective` to the `imports` array to make it available in the template. - imports: [SelectDirective], - template: `

{{data}}

`, -}) -class MyComponent {} - -
- -## Configuration requirements - -[`strictTemplates`](tools/cli/template-typecheck#strict-mode) must be enabled for any extended diagnostic to emit. -`missingStructuralDirective` has no additional requirements beyond `strictTemplates`. - -## What if I can't avoid this? - -This diagnostic can be disabled by editing the project's `tsconfig.json` file: - - -{ - "angularCompilerOptions": { - "extendedDiagnostics": { - "checks": { - "missingStructuralDirective": "suppress" - } - } - } -} - - -See [extended diagnostic configuration](extended-diagnostics#configuration) for more info. diff --git a/adev/src/content/reference/extended-diagnostics/overview.md b/adev/src/content/reference/extended-diagnostics/overview.md index 3e86e0cc872c..94714804e9d9 100644 --- a/adev/src/content/reference/extended-diagnostics/overview.md +++ b/adev/src/content/reference/extended-diagnostics/overview.md @@ -20,8 +20,7 @@ Currently, Angular supports the following extended diagnostics: | `NG8108` | [`skipHydrationNotStatic`](extended-diagnostics/NG8108) | | `NG8109` | [`interpolatedSignalNotInvoked`](extended-diagnostics/NG8109) | | `NG8111` | [`uninvokedFunctionInEventBinding`](extended-diagnostics/NG8111) | -| `NG8113` | [`unusedStandaloneImports`](extended-diagnostics/NG8113) | -| `NG8114` | [`missingStructuralDirective`](extended-diagnostics/NG8114) | +| `NG8113` | [`unusedStandaloneImports`](extended-diagnostics/NG8113) | ## Configuration diff --git a/goldens/public-api/compiler-cli/error_code.api.md b/goldens/public-api/compiler-cli/error_code.api.md index be713a7ebaba..b8412619d50d 100644 --- a/goldens/public-api/compiler-cli/error_code.api.md +++ b/goldens/public-api/compiler-cli/error_code.api.md @@ -75,7 +75,6 @@ export enum ErrorCode { MISSING_PIPE = 8004, MISSING_REFERENCE_TARGET = 8003, MISSING_REQUIRED_INPUTS = 8008, - MISSING_STRUCTURAL_DIRECTIVE = 8114, NGMODULE_BOOTSTRAP_IS_STANDALONE = 6009, NGMODULE_DECLARATION_IS_STANDALONE = 6008, NGMODULE_DECLARATION_NOT_UNIQUE = 6007, diff --git a/goldens/public-api/compiler-cli/extended_template_diagnostic_name.api.md b/goldens/public-api/compiler-cli/extended_template_diagnostic_name.api.md index 78546c0e15d6..ee99d7d58475 100644 --- a/goldens/public-api/compiler-cli/extended_template_diagnostic_name.api.md +++ b/goldens/public-api/compiler-cli/extended_template_diagnostic_name.api.md @@ -17,8 +17,6 @@ export enum ExtendedTemplateDiagnosticName { // (undocumented) MISSING_NGFOROF_LET = "missingNgForOfLet", // (undocumented) - MISSING_STRUCTURAL_DIRECTIVE = "missingStructuralDirective", - // (undocumented) NULLISH_COALESCING_NOT_NULLABLE = "nullishCoalescingNotNullable", // (undocumented) OPTIONAL_CHAIN_NOT_NULLABLE = "optionalChainNotNullable", diff --git a/packages/compiler-cli/src/ngtsc/diagnostics/src/error_code.ts b/packages/compiler-cli/src/ngtsc/diagnostics/src/error_code.ts index e0797eb52352..a5013d246f95 100644 --- a/packages/compiler-cli/src/ngtsc/diagnostics/src/error_code.ts +++ b/packages/compiler-cli/src/ngtsc/diagnostics/src/error_code.ts @@ -518,11 +518,6 @@ export enum ErrorCode { */ UNUSED_STANDALONE_IMPORTS = 8113, - /** - * A structural directive is used in a template, but the directive is not imported. - */ - MISSING_STRUCTURAL_DIRECTIVE = 8114, - /** * The template type-checking engine would need to generate an inline type check block for a * component, but the current type-checking environment doesn't support it. diff --git a/packages/compiler-cli/src/ngtsc/diagnostics/src/extended_template_diagnostic_name.ts b/packages/compiler-cli/src/ngtsc/diagnostics/src/extended_template_diagnostic_name.ts index bec12d76866d..c79de4ce6af1 100644 --- a/packages/compiler-cli/src/ngtsc/diagnostics/src/extended_template_diagnostic_name.ts +++ b/packages/compiler-cli/src/ngtsc/diagnostics/src/extended_template_diagnostic_name.ts @@ -20,7 +20,6 @@ export enum ExtendedTemplateDiagnosticName { NULLISH_COALESCING_NOT_NULLABLE = 'nullishCoalescingNotNullable', OPTIONAL_CHAIN_NOT_NULLABLE = 'optionalChainNotNullable', MISSING_CONTROL_FLOW_DIRECTIVE = 'missingControlFlowDirective', - MISSING_STRUCTURAL_DIRECTIVE = 'missingStructuralDirective', TEXT_ATTRIBUTE_NOT_BINDING = 'textAttributeNotBinding', UNINVOKED_FUNCTION_IN_EVENT_BINDING = 'uninvokedFunctionInEventBinding', MISSING_NGFOROF_LET = 'missingNgForOfLet', diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/BUILD.bazel b/packages/compiler-cli/src/ngtsc/typecheck/extended/BUILD.bazel index 18cd509c7a82..f4527da5c181 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/extended/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/typecheck/extended/BUILD.bazel @@ -16,7 +16,6 @@ ts_library( "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/invalid_banana_in_box", "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/missing_control_flow_directive", "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/missing_ngforof_let", - "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/missing_structural_directive", "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/nullish_coalescing_not_nullable", "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/optional_chain_not_nullable", "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/skip_hydration_not_static", diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/missing_structural_directive/BUILD.bazel b/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/missing_structural_directive/BUILD.bazel deleted file mode 100644 index a8e517f1d7c2..000000000000 --- a/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/missing_structural_directive/BUILD.bazel +++ /dev/null @@ -1,15 +0,0 @@ -load("//tools:defaults.bzl", "ts_library") - -ts_library( - name = "missing_structural_directive", - srcs = ["index.ts"], - visibility = ["//packages/compiler-cli/src/ngtsc:__subpackages__"], - deps = [ - "//packages/compiler", - "//packages/compiler-cli/src/ngtsc/core:api", - "//packages/compiler-cli/src/ngtsc/diagnostics", - "//packages/compiler-cli/src/ngtsc/typecheck/api", - "//packages/compiler-cli/src/ngtsc/typecheck/extended/api", - "@npm//typescript", - ], -) diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/missing_structural_directive/index.ts b/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/missing_structural_directive/index.ts deleted file mode 100644 index 2fcdeeeffe7e..000000000000 --- a/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/missing_structural_directive/index.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 {AST, TmplAstNode, TmplAstTemplate} from '@angular/compiler'; -import ts from 'typescript'; - -import {NgCompilerOptions} from '../../../../core/api'; -import {ErrorCode, ExtendedTemplateDiagnosticName} from '../../../../diagnostics'; -import {NgTemplateDiagnostic} from '../../../api'; -import {TemplateCheckFactory, TemplateCheckWithVisitor, TemplateContext} from '../../api'; - -/** - * The list of known control flow directives present in the `CommonModule`. - * - * If these control flow directives are missing they will be reported by a separate diagnostic. - */ -export const KNOWN_CONTROL_FLOW_DIRECTIVES = new Set([ - 'ngIf', - 'ngFor', - 'ngSwitch', - 'ngSwitchCase', - 'ngSwitchDefault', -]); - -/** - * Ensures that there are no structural directives (something like *select or *featureFlag) - * used in a template of a *standalone* component without importing the directive. Returns - * diagnostics in case such a directive is detected. - * - * Note: this check only handles the cases when structural directive syntax is used (e.g. `*featureFlag`). - * Regular binding syntax (e.g. `[featureFlag]`) is handled separately in type checker and treated as a - * hard error instead of a warning. - */ -class MissingStructuralDirectiveCheck extends TemplateCheckWithVisitor { - override code = ErrorCode.MISSING_STRUCTURAL_DIRECTIVE as const; - - override run( - ctx: TemplateContext, - component: ts.ClassDeclaration, - template: TmplAstNode[], - ) { - const componentMetadata = ctx.templateTypeChecker.getDirectiveMetadata(component); - // Avoid running this check for non-standalone components. - if (!componentMetadata || !componentMetadata.isStandalone) { - return []; - } - return super.run(ctx, component, template); - } - - override visitNode( - ctx: TemplateContext, - component: ts.ClassDeclaration, - node: TmplAstNode | AST, - ): NgTemplateDiagnostic[] { - if (!(node instanceof TmplAstTemplate)) return []; - - const customStructuralDirective = node.templateAttrs.find( - (attr) => !KNOWN_CONTROL_FLOW_DIRECTIVES.has(attr.name), - ); - if (!customStructuralDirective) return []; - - const symbol = ctx.templateTypeChecker.getSymbolOfNode(node, component); - if (symbol === null || symbol.directives.length > 0) { - return []; - } - - const sourceSpan = customStructuralDirective.keySpan || customStructuralDirective.sourceSpan; - const errorMessage = - `An unknown structural directive \`${customStructuralDirective.name}\` was used in the template, ` + - `without a corresponding import in the component. ` + - `Make sure that the directive is included in the \`@Component.imports\` array of this component.`; - const diagnostic = ctx.makeTemplateDiagnostic(sourceSpan, errorMessage); - return [diagnostic]; - } -} - -export const factory: TemplateCheckFactory< - ErrorCode.MISSING_STRUCTURAL_DIRECTIVE, - ExtendedTemplateDiagnosticName.MISSING_STRUCTURAL_DIRECTIVE -> = { - code: ErrorCode.MISSING_STRUCTURAL_DIRECTIVE, - name: ExtendedTemplateDiagnosticName.MISSING_STRUCTURAL_DIRECTIVE, - create: (options: NgCompilerOptions) => { - return new MissingStructuralDirectiveCheck(); - }, -}; diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/index.ts b/packages/compiler-cli/src/ngtsc/typecheck/extended/index.ts index f6553f327f65..5cb45e946b00 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/extended/index.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/extended/index.ts @@ -13,7 +13,6 @@ import {factory as interpolatedSignalNotInvoked} from './checks/interpolated_sig import {factory as invalidBananaInBoxFactory} from './checks/invalid_banana_in_box'; import {factory as missingControlFlowDirectiveFactory} from './checks/missing_control_flow_directive'; import {factory as missingNgForOfLetFactory} from './checks/missing_ngforof_let'; -import {factory as missingStructuralDirectiveFactory} from './checks/missing_structural_directive'; import {factory as nullishCoalescingNotNullableFactory} from './checks/nullish_coalescing_not_nullable'; import {factory as optionalChainNotNullableFactory} from './checks/optional_chain_not_nullable'; import {factory as suffixNotSupportedFactory} from './checks/suffix_not_supported'; @@ -33,7 +32,6 @@ export const ALL_DIAGNOSTIC_FACTORIES: readonly TemplateCheckFactory< missingControlFlowDirectiveFactory, textAttributeNotBindingFactory, missingNgForOfLetFactory, - missingStructuralDirectiveFactory, suffixNotSupportedFactory, interpolatedSignalNotInvoked, uninvokedFunctionInEventBindingFactory, diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/missing_structural_directive/BUILD.bazel b/packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/missing_structural_directive/BUILD.bazel deleted file mode 100644 index 0b630f974092..000000000000 --- a/packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/missing_structural_directive/BUILD.bazel +++ /dev/null @@ -1,30 +0,0 @@ -load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") - -ts_library( - name = "test_lib", - testonly = True, - srcs = ["missing_structural_directive_spec.ts"], - deps = [ - "//packages/compiler", - "//packages/compiler-cli/src/ngtsc/core:api", - "//packages/compiler-cli/src/ngtsc/diagnostics", - "//packages/compiler-cli/src/ngtsc/file_system", - "//packages/compiler-cli/src/ngtsc/file_system/testing", - "//packages/compiler-cli/src/ngtsc/testing", - "//packages/compiler-cli/src/ngtsc/typecheck/extended", - "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/missing_structural_directive", - "//packages/compiler-cli/src/ngtsc/typecheck/testing", - "@npm//typescript", - ], -) - -jasmine_node_test( - name = "test", - bootstrap = ["//tools/testing:node_no_angular"], - data = [ - "//packages/core:npm_package", - ], - deps = [ - ":test_lib", - ], -) diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/missing_structural_directive/missing_structural_directive_spec.ts b/packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/missing_structural_directive/missing_structural_directive_spec.ts deleted file mode 100644 index 437341009816..000000000000 --- a/packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/missing_structural_directive/missing_structural_directive_spec.ts +++ /dev/null @@ -1,218 +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 ts from 'typescript'; - -import {ErrorCode, ngErrorCode} from '../../../../../diagnostics'; -import {absoluteFrom, getSourceFileOrError} from '../../../../../file_system'; -import {runInEachFileSystem} from '../../../../../file_system/testing'; -import {getClass, setup} from '../../../../testing'; -import {factory as missingStructuralDirectiveCheck} from '../../../checks/missing_structural_directive'; -import {ExtendedTemplateCheckerImpl} from '../../../src/extended_template_checker'; - -runInEachFileSystem(() => { - describe('missingStructuralDirectiveCheck', () => { - it('should produce a warning for missing unknown structural directives in standalone components', () => { - const fileName = absoluteFrom('/main.ts'); - const {program, templateTypeChecker} = setup([ - { - fileName, - templates: { - 'TestCmp': `
`, - }, - declarations: [ - { - name: 'TestCmp', - type: 'directive', - selector: `[test-cmp]`, - isStandalone: true, - }, - ], - }, - ]); - const sf = getSourceFileOrError(program, fileName); - const component = getClass(sf, 'TestCmp'); - const extendedTemplateChecker = new ExtendedTemplateCheckerImpl( - templateTypeChecker, - program.getTypeChecker(), - [missingStructuralDirectiveCheck], - {strictNullChecks: true} /* options */, - ); - const diags = extendedTemplateChecker.getDiagnosticsForComponent(component); - - expect(diags.length).toBe(1); - expect(diags[0].category).toBe(ts.DiagnosticCategory.Warning); - expect(diags[0].code).toBe(ngErrorCode(ErrorCode.MISSING_STRUCTURAL_DIRECTIVE)); - }); - - it('should *not* produce a warning for custom structural directives that are imported', () => { - const fileName = absoluteFrom('/main.ts'); - const {program, templateTypeChecker} = setup([ - { - fileName, - templates: { - 'TestCmp': `
`, - }, - source: ` - export class TestCmp {} - export class Foo {} - `, - declarations: [ - { - type: 'directive', - name: 'Foo', - selector: `[foo]`, - }, - { - name: 'TestCmp', - type: 'directive', - selector: `[test-cmp]`, - isStandalone: true, - }, - ], - }, - ]); - const sf = getSourceFileOrError(program, fileName); - const component = getClass(sf, 'TestCmp'); - const extendedTemplateChecker = new ExtendedTemplateCheckerImpl( - templateTypeChecker, - program.getTypeChecker(), - [missingStructuralDirectiveCheck], - {strictNullChecks: true} /* options */, - ); - const diags = extendedTemplateChecker.getDiagnosticsForComponent(component); - // No diagnostic messages are expected. - expect(diags.length).toBe(0); - }); - - it('should *not* produce a warning for non-standalone components', () => { - const fileName = absoluteFrom('/main.ts'); - - const {program, templateTypeChecker} = setup([ - { - fileName, - templates: { - 'TestCmp': `
`, - }, - declarations: [ - { - name: 'TestCmp', - type: 'directive', - selector: `[test-cmp]`, - isStandalone: false, - }, - ], - }, - ]); - const sf = getSourceFileOrError(program, fileName); - const component = getClass(sf, 'TestCmp'); - const extendedTemplateChecker = new ExtendedTemplateCheckerImpl( - templateTypeChecker, - program.getTypeChecker(), - [missingStructuralDirectiveCheck], - {strictNullChecks: true} /* options */, - ); - const diags = extendedTemplateChecker.getDiagnosticsForComponent(component); - // No diagnostic messages are expected. - expect(diags.length).toBe(0); - }); - - it('should *not* produce a warning for non-structural directives in standalone components', () => { - const fileName = absoluteFrom('/main.ts'); - const {program, templateTypeChecker} = setup([ - { - fileName, - templates: { - 'TestCmp': `
`, - }, - declarations: [ - { - name: 'TestCmp', - type: 'directive', - selector: `[test-cmp]`, - isStandalone: true, - }, - ], - }, - ]); - const sf = getSourceFileOrError(program, fileName); - const component = getClass(sf, 'TestCmp'); - const extendedTemplateChecker = new ExtendedTemplateCheckerImpl( - templateTypeChecker, - program.getTypeChecker(), - [missingStructuralDirectiveCheck], - {strictNullChecks: true} /* options */, - ); - const diags = extendedTemplateChecker.getDiagnosticsForComponent(component); - // No diagnostic messages are expected. - expect(diags.length).toBe(0); - }); - - it('should *not* produce a warning when known control flow directives are used', () => { - const fileName = absoluteFrom('/main.ts'); - const {program, templateTypeChecker} = setup([ - { - fileName, - templates: { - 'TestCmp': `
`, - }, - declarations: [ - { - name: 'TestCmp', - type: 'directive', - selector: `[test-cmp]`, - isStandalone: true, - }, - ], - }, - ]); - const sf = getSourceFileOrError(program, fileName); - const component = getClass(sf, 'TestCmp'); - const extendedTemplateChecker = new ExtendedTemplateCheckerImpl( - templateTypeChecker, - program.getTypeChecker(), - [missingStructuralDirectiveCheck], - {strictNullChecks: true} /* options */, - ); - const diags = extendedTemplateChecker.getDiagnosticsForComponent(component); - // No diagnostic messages are expected. - expect(diags.length).toBe(0); - }); - - it('should not warn for templates with no structural directives', () => { - const fileName = absoluteFrom('/main.ts'); - const {program, templateTypeChecker} = setup([ - { - fileName, - templates: { - 'TestCmp': `
`, - }, - declarations: [ - { - name: 'TestCmp', - type: 'directive', - selector: `[test-cmp]`, - isStandalone: true, - }, - ], - }, - ]); - const sf = getSourceFileOrError(program, fileName); - const component = getClass(sf, 'TestCmp'); - const extendedTemplateChecker = new ExtendedTemplateCheckerImpl( - templateTypeChecker, - program.getTypeChecker(), - [missingStructuralDirectiveCheck], - {strictNullChecks: true} /* options */, - ); - const diags = extendedTemplateChecker.getDiagnosticsForComponent(component); - // No diagnostic messages are expected. - expect(diags.length).toBe(0); - }); - }); -}); From c9eaf53b4ff1c84c51ca4d385d682ab3889087ea Mon Sep 17 00:00:00 2001 From: Doug Parker Date: Wed, 15 Jan 2025 13:22:45 -0800 Subject: [PATCH 0104/1220] release: bump Angular DevTools version to 1.0.21 (#59548) PR Close #59548 --- .../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 995bfafce2ec..086d65458bdd 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.20", - "version_name": "1.0.20", + "version": "1.0.21", + "version_name": "1.0.21", "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 3743dd37d862..04a5c883127a 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.20", + "version": "1.0.21", "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'", "icons": { "16": "assets/icon16.png", From db745cd75f959c4271299c9eb6d7764e459441b8 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Thu, 16 Jan 2025 10:48:05 +0100 Subject: [PATCH 0105/1220] test(devtools): disable flaky highlighter test (#59561) The test in question was very flaky on CI, example run: https://github.com/angular/angular/actions/runs/12805645683/job/35702462974?pr=59557 Disabling as it is causing productivity loose for the team. PR Close #59561 --- .../projects/ng-devtools-backend/src/lib/highlighter.spec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/devtools/projects/ng-devtools-backend/src/lib/highlighter.spec.ts b/devtools/projects/ng-devtools-backend/src/lib/highlighter.spec.ts index 63a733533d0f..2f35d38bb02a 100644 --- a/devtools/projects/ng-devtools-backend/src/lib/highlighter.spec.ts +++ b/devtools/projects/ng-devtools-backend/src/lib/highlighter.spec.ts @@ -100,7 +100,8 @@ describe('highlighter', () => { }); }); - describe('highlightHydrationElement', () => { + // Those test were disabled since very flaky on the CI - needs investigation before re-enabling + xdescribe('highlightHydrationElement', () => { afterEach(() => { document.body.innerHTML = ''; delete (window as any).ng; From 2fe54a11f4539a712452d5819d8b4deb691953c1 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Thu, 16 Jan 2025 11:54:23 +0100 Subject: [PATCH 0106/1220] fix(platform-browser): roll back HMR fix (#59557) Rolls back the changes from #59514 because they ended up being breaking in 1P. We can revisit the internal fix in a different way. Fixes #59558. PR Close #59557 --- packages/platform-browser/src/dom/dom_renderer.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/platform-browser/src/dom/dom_renderer.ts b/packages/platform-browser/src/dom/dom_renderer.ts index 0c93eedaef2e..f0d1da86c95a 100644 --- a/packages/platform-browser/src/dom/dom_renderer.ts +++ b/packages/platform-browser/src/dom/dom_renderer.ts @@ -201,9 +201,6 @@ export class DomRendererFactory2 implements RendererFactory2, OnDestroy { * @param componentId ID of the component that is being replaced. */ protected componentReplaced(componentId: string) { - // Destroy the renderer so the styles get removed from the DOM, otherwise - // they may leak back into the component together with the new ones. - this.rendererByCompId.get(componentId)?.destroy(); this.rendererByCompId.delete(componentId); } } From c9cd5585c25849546aa543f9ecb72211fb9ff265 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Thu, 16 Jan 2025 11:40:09 +0100 Subject: [PATCH 0107/1220] fix(core): run HMR replacement in the zone (#59562) Fixes that in some cases the HMR replacement function was being run outside the zone which meant that change detection would break down after a replacement. Fixes #59559. PR Close #59562 --- packages/core/src/render3/hmr.ts | 83 +++++++++++++---------- packages/core/test/acceptance/hmr_spec.ts | 43 ++++++++++++ 2 files changed, 90 insertions(+), 36 deletions(-) diff --git a/packages/core/src/render3/hmr.ts b/packages/core/src/render3/hmr.ts index 0d567ed1d2ea..d67f9fdc1aa8 100644 --- a/packages/core/src/render3/hmr.ts +++ b/packages/core/src/render3/hmr.ts @@ -31,6 +31,7 @@ import { FLAGS, HEADER_OFFSET, HOST, + INJECTOR, LView, LViewFlags, NEXT, @@ -41,6 +42,7 @@ import { import {assertTNodeType} from './node_assert'; import {destroyLView, removeViewFromDOM} from './node_manipulation'; import {RendererFactory} from './interfaces/renderer'; +import {NgZone} from '../zone'; /** * Replaces the metadata of a component type and re-renders all live instances of the component. @@ -149,51 +151,60 @@ function recreateLView( const tNode = lView[T_HOST] as TElementNode; ngDevMode && assertTNodeType(tNode, TNodeType.Element); ngDevMode && assertNotEqual(newDef, oldDef, 'Expected different component definition'); + const zone = lView[INJECTOR].get(NgZone, null); + const recreate = () => { + // Recreate the TView since the template might've changed. + const newTView = getOrCreateComponentTView(newDef); - // Recreate the TView since the template might've changed. - const newTView = getOrCreateComponentTView(newDef); + // Always force the creation of a new renderer to ensure state captured during construction + // stays consistent with the new component definition by clearing any old cached factories. + const rendererFactory = lView[ENVIRONMENT].rendererFactory; + clearRendererCache(rendererFactory, oldDef); - // Always force the creation of a new renderer to ensure state captured during construction - // stays consistent with the new component definition by clearing any old cached factories. - const rendererFactory = lView[ENVIRONMENT].rendererFactory; - clearRendererCache(rendererFactory, oldDef); + // Create a new LView from the new TView, but reusing the existing TNode and DOM node. + const newLView = createLView( + parentLView, + newTView, + instance, + getInitialLViewFlagsFromDef(newDef), + host, + tNode, + null, + rendererFactory.createRenderer(host, newDef), + null, + null, + null, + ); - // Create a new LView from the new TView, but reusing the existing TNode and DOM node. - const newLView = createLView( - parentLView, - newTView, - instance, - getInitialLViewFlagsFromDef(newDef), - host, - tNode, - null, - rendererFactory.createRenderer(host, newDef), - null, - null, - null, - ); + // Detach the LView from its current place in the tree so we don't + // start traversing any siblings and modifying their structure. + replaceLViewInTree(parentLView, lView, newLView, tNode.index); - // Detach the LView from its current place in the tree so we don't - // start traversing any siblings and modifying their structure. - replaceLViewInTree(parentLView, lView, newLView, tNode.index); + // Destroy the detached LView. + destroyLView(lView[TVIEW], lView); - // Destroy the detached LView. - destroyLView(lView[TVIEW], lView); + // Remove the nodes associated with the destroyed LView. This removes the + // descendants, but not the host which we want to stay in place. + removeViewFromDOM(lView[TVIEW], lView); - // Remove the nodes associated with the destroyed LView. This removes the - // descendants, but not the host which we want to stay in place. - removeViewFromDOM(lView[TVIEW], lView); + // Reset the content projection state of the TNode before the first render. + // Note that this has to happen after the LView has been destroyed or we + // risk some projected nodes not being removed correctly. + resetProjectionState(tNode); - // Reset the content projection state of the TNode before the first render. - // Note that this has to happen after the LView has been destroyed or we - // risk some projected nodes not being removed correctly. - resetProjectionState(tNode); + // Creation pass for the new view. + renderView(newTView, newLView, instance); - // Creation pass for the new view. - renderView(newTView, newLView, instance); + // Update pass for the new view. + refreshView(newTView, newLView, newTView.template, instance); + }; - // Update pass for the new view. - refreshView(newTView, newLView, newTView.template, instance); + // The callback isn't guaranteed to be inside the Zone so we need to bring it in ourselves. + if (zone === null) { + recreate(); + } else { + zone.run(recreate); + } } /** diff --git a/packages/core/test/acceptance/hmr_spec.ts b/packages/core/test/acceptance/hmr_spec.ts index 1f96662b85f9..558cc0eb4a4e 100644 --- a/packages/core/test/acceptance/hmr_spec.ts +++ b/packages/core/test/acceptance/hmr_spec.ts @@ -15,6 +15,7 @@ import { inject, InjectionToken, Input, + NgZone, OnChanges, OnDestroy, OnInit, @@ -32,6 +33,7 @@ import {compileComponent} from '@angular/core/src/render3/jit/directive'; import {angularCoreEnv} from '@angular/core/src/render3/jit/environment'; import {clearTranslations, loadTranslations} from '@angular/localize'; import {computeMsgId} from '@angular/compiler'; +import {EVENT_MANAGER_PLUGINS} from '@angular/platform-browser'; describe('hot module replacement', () => { it('should recreate a single usage of a basic component', () => { @@ -1213,6 +1215,47 @@ describe('hot module replacement', () => { fixture.detectChanges(); expect(count).toBe(2); }); + + it('should bind events inside the NgZone after a replacement', () => { + const calls: {name: string; inZone: boolean}[] = []; + + @Component({template: ``}) + class App { + clicked() {} + } + + TestBed.configureTestingModule({ + providers: [ + { + // Note: TestBed brings things into the zone even if they aren't which makes this + // test hard to write. We have to intercept the listener being bound at the renderer + // level in order to get a true sense if it'll be bound inside or outside the zone. + // We do so with a custom event manager. + provide: EVENT_MANAGER_PLUGINS, + multi: true, + useValue: { + supports: () => true, + addEventListener: (_: unknown, name: string) => { + calls.push({name, inZone: NgZone.isInAngularZone()}); + return () => {}; + }, + }, + }, + ], + }); + + const fixture = TestBed.createComponent(App); + fixture.detectChanges(); + expect(calls).toEqual([{name: 'click', inZone: true}]); + + replaceMetadata(App, {template: ''}); + fixture.detectChanges(); + + expect(calls).toEqual([ + {name: 'click', inZone: true}, + {name: 'click', inZone: true}, + ]); + }); }); describe('directives', () => { From aa45d44c5bee49638534895e8650dd3a9217e553 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Thu, 16 Jan 2025 13:18:51 +0100 Subject: [PATCH 0108/1220] docs: release notes for the v19.1.1 release --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0cf0fae81dd9..1306c9d01af2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ + +# 19.1.1 (2025-01-16) +### core +| Commit | Type | Description | +| -- | -- | -- | +| [357795cb96](https://github.com/angular/angular/commit/357795cb96a1cd138ec263c468c9de8ca8b2af9c) | fix | run HMR replacement in the zone ([#59562](https://github.com/angular/angular/pull/59562)) | +### platform-browser +| Commit | Type | Description | +| -- | -- | -- | +| [eb0b1851f4](https://github.com/angular/angular/commit/eb0b1851f494adfe72f583763a44bd2528a5956c) | fix | roll back HMR fix ([#59557](https://github.com/angular/angular/pull/59557)) | + + + # 19.1.0 (2025-01-15) ### common From e4dd1773db9f1b2daa942b0e0199eaf09fb87983 Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Wed, 15 Jan 2025 20:29:22 +0100 Subject: [PATCH 0109/1220] docs: update examples to the application builder (#59539) fixes #59538 PR Close #59539 --- .../pipeline/examples/template/angular.json | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/adev/shared-docs/pipeline/examples/template/angular.json b/adev/shared-docs/pipeline/examples/template/angular.json index 95567dd69a28..55f72afc3f92 100644 --- a/adev/shared-docs/pipeline/examples/template/angular.json +++ b/adev/shared-docs/pipeline/examples/template/angular.json @@ -21,14 +21,13 @@ "prefix": "app", "architect": { "build": { - "builder": "@angular-devkit/build-angular:browser", + "builder": "@angular-devkit/build-angular:application", "options": { "outputPath": "dist/example-app", "index": "src/index.html", - "main": "src/main.ts", + "browser": "src/main.ts", "polyfills": ["zone.js"], "tsConfig": "tsconfig.app.json", - "inlineStyleLanguage": "css", "assets": ["src/assets"], "styles": ["src/styles.css"], "stylePreprocessorOptions": { @@ -59,12 +58,9 @@ "outputHashing": "all" }, "development": { - "buildOptimizer": false, "optimization": false, - "vendorChunk": true, "extractLicenses": false, - "sourceMap": true, - "namedChunks": true + "sourceMap": true } }, "defaultConfiguration": "production" From 055624d0da31abcdb1f6d0a2d0d2c2013f9f2645 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Wed, 15 Jan 2025 16:11:25 +0100 Subject: [PATCH 0110/1220] docs: update linkedSignal documentation (#59532) This commit updates the linkedSignal documentation around the quality function option. Fixes #59094 PR Close #59532 --- .../content/guide/signals/linked-signal.md | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/adev/src/content/guide/signals/linked-signal.md b/adev/src/content/guide/signals/linked-signal.md index 1e8393e3ef6b..595d07d04723 100644 --- a/adev/src/content/guide/signals/linked-signal.md +++ b/adev/src/content/guide/signals/linked-signal.md @@ -16,7 +16,7 @@ export class ShippingMethodPicker { this.selectedOption.set(this.shippingOptions()[newOptionIndex]); } } -``` +``` In this example, the `selectedOption` defaults to the first option, but changes if the user selects another option. But `shippingOptions` is a signal— its value may change! If `shippingOptions` changes, `selectedOption` may contain a value that is no longer a valid option. @@ -62,7 +62,7 @@ In the example above, `selectedOption` always updates back to the first option w @Component({/* ... */}) export class ShippingMethodPicker { shippingOptions: Signal = getShippingOptions(); - + selectedOption = linkedSignal({ // `selectedOption` is set to the `computation` result whenever this `source` changes. source: this.shippingOptions, @@ -70,7 +70,7 @@ export class ShippingMethodPicker { // If the newOptions contain the previously selected option, preserve that selection. // Otherwise, default to the first option. return newOptions.find(opt => opt.id === previous?.value?.id) ?? newOptions[0]; - } + } }); changeShipping(newOptionIndex: number) { @@ -87,21 +87,20 @@ The `computation` is a function that receives the new value of `source` and a `p ## Custom equality comparison -`linkedSignal` updates to the result of the computation every time its linked state changes. By default, Angular uses referential equality to determine if the linked state has changed. You can alternatively provide a custom equality function. +`linkedSignal`, as any other signal, can be configured with a custom equality function. This function is used by downstream dependencies to determine if that value of the `linkedSignal` (result of a computation) changed: ```typescript const activeUser = signal({id: 123, name: 'Morgan', isAdmin: true}); -const email = linkedSignal(() => ({id:`${activeUser().name}@example.com`}), { + +const activeUserEditCopy = linkedSignal(() => activeUser()), { // Consider the user as the same if it's the same `id`. equal: (a, b) => a.id === b.id, }); + // Or, if separating `source` and `computation` -const alternateEmail = linkedSignal({ +const activeUserEditCopy = linkedSignal({ source: activeUser, - computation: user => ({id:`${user.name}@example.com`}), + computation: user => user, equal: (a, b) => a.id === b.id, }); -// This update to `activeUser` does not cause `email` or `alternateEmail` -// to update because the `id` is the same. -activeUser.set({id: 123, name: 'Morgan', isAdmin: false}); ``` From f8b8e80d7915f4eaaf8df49327f0bd6efe1f29e4 Mon Sep 17 00:00:00 2001 From: Leon Senft Date: Wed, 15 May 2024 14:11:35 -0700 Subject: [PATCH 0111/1220] fix(core): treat exceptions in `equal` as part of computation (#55818) Prevent leaking signal reads and exceptions from a custom `equal` function of a producer `computed()` to a consumer. Upstream https://github.com/tc39/proposal-signals/pull/90 with a notable change: Angular does **not** track reactive reads in custom `equal` implementations. PR Close #55818 --- .../core/primitives/signals/src/computed.ts | 17 ++- packages/core/test/signals/computed_spec.ts | 118 +++++++++++++++++- 2 files changed, 128 insertions(+), 7 deletions(-) diff --git a/packages/core/primitives/signals/src/computed.ts b/packages/core/primitives/signals/src/computed.ts index 40df317cb7d9..7afb19656164 100644 --- a/packages/core/primitives/signals/src/computed.ts +++ b/packages/core/primitives/signals/src/computed.ts @@ -14,6 +14,7 @@ import { producerUpdateValueVersion, REACTIVE_NODE, ReactiveNode, + setActiveConsumer, SIGNAL, } from './graph'; @@ -120,8 +121,17 @@ const COMPUTED_NODE = /* @__PURE__ */ (() => { const prevConsumer = consumerBeforeComputation(node); let newValue: unknown; + let wasEqual = false; try { newValue = node.computation(); + // We want to mark this node as errored if calling `equal` throws; however, we don't want + // to track any reactive reads inside `equal`. + setActiveConsumer(null); + wasEqual = + oldValue !== UNSET && + oldValue !== ERRORED && + newValue !== ERRORED && + node.equal(oldValue, newValue); } catch (err) { newValue = ERRORED; node.error = err; @@ -129,12 +139,7 @@ const COMPUTED_NODE = /* @__PURE__ */ (() => { consumerAfterComputation(node, prevConsumer); } - if ( - oldValue !== UNSET && - oldValue !== ERRORED && - newValue !== ERRORED && - node.equal(oldValue, newValue) - ) { + if (wasEqual) { // No change to `valueVersion` - old and new values are // semantically equivalent. node.value = oldValue; diff --git a/packages/core/test/signals/computed_spec.ts b/packages/core/test/signals/computed_spec.ts index e6a947f2a3c6..24243bb9d154 100644 --- a/packages/core/test/signals/computed_spec.ts +++ b/packages/core/test/signals/computed_spec.ts @@ -7,7 +7,7 @@ */ import {computed, signal} from '@angular/core'; -import {createWatch, ReactiveNode, SIGNAL} from '@angular/core/primitives/signals'; +import {createWatch, ReactiveNode, SIGNAL, defaultEquals} from '@angular/core/primitives/signals'; describe('computed', () => { it('should create computed', () => { @@ -201,4 +201,120 @@ describe('computed', () => { ] as ReactiveNode; expect(node.debugName).toBe('computedSignal'); }); + + describe('with custom equal', () => { + it('should cache exceptions thrown by equal', () => { + const s = signal(0); + + let computedRunCount = 0; + let equalRunCount = 0; + const c = computed( + () => { + computedRunCount++; + return s(); + }, + { + equal: () => { + equalRunCount++; + throw new Error('equal'); + }, + }, + ); + + // equal() isn't run for the initial computation. + expect(c()).toBe(0); + expect(computedRunCount).toBe(1); + expect(equalRunCount).toBe(0); + + s.set(1); + + // Error is thrown by equal(). + expect(() => c()).toThrowError('equal'); + expect(computedRunCount).toBe(2); + expect(equalRunCount).toBe(1); + + // Error is cached; c throws again without needing to rerun computation or equal(). + expect(() => c()).toThrowError('equal'); + expect(computedRunCount).toBe(2); + expect(equalRunCount).toBe(1); + }); + + it('should not track signal reads inside equal', () => { + const value = signal(1); + const epsilon = signal(0.5); + + let innerRunCount = 0; + let equalRunCount = 0; + const inner = computed( + () => { + innerRunCount++; + return value(); + }, + { + equal: (a, b) => { + equalRunCount++; + return Math.abs(a - b) < epsilon(); + }, + }, + ); + + let outerRunCount = 0; + const outer = computed(() => { + outerRunCount++; + return inner(); + }); + + // Everything runs the first time. + expect(outer()).toBe(1); + expect(innerRunCount).toBe(1); + expect(outerRunCount).toBe(1); + + // Difference is less than epsilon(). + value.set(1.2); + + // `inner` reruns because `value` was changed, and `equal` is called for the first time. + expect(outer()).toBe(1); + expect(innerRunCount).toBe(2); + expect(equalRunCount).toBe(1); + // `outer does not rerun because `equal` determined that `inner` had not changed. + expect(outerRunCount).toBe(1); + + // Previous difference is now greater than epsilon(). + epsilon.set(0.1); + + // While changing `epsilon` would change the outcome of the `inner`, we don't rerun it + // because we intentionally don't track reactive reads in `equal`. + expect(outer()).toBe(1); + expect(innerRunCount).toBe(2); + expect(equalRunCount).toBe(1); + // Equally important is that the signal read in `equal` doesn't leak into the outer reactive + // context either. + expect(outerRunCount).toBe(1); + }); + + it('should recover from exception', () => { + let shouldThrow = true; + const source = signal(0); + const derived = computed(source, { + equal: (a, b) => { + if (shouldThrow) { + throw new Error('equal'); + } + return defaultEquals(a, b); + }, + }); + + // Initial read doesn't throw because it doesn't call `equal`. + expect(derived()).toBe(0); + + // Update `source` to begin throwing. + source.set(1); + expect(() => derived()).toThrowError('equal'); + + // Stop throwing and update `source` to cause `derived` to recompute. + shouldThrow = false; + source.set(2); + expect(derived()).toBe(2); + }); + }); }); From 329cf9fbde24044315356a64579d08dc1059981e Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Mon, 2 Dec 2024 16:12:04 -0800 Subject: [PATCH 0112/1220] fix(core): change `Resource` to use explicit `undefined` in its typings (#59024) Originally the `T` in `Resource` represented the resolved type of the resource, and `undefined` was explicitly added to this type in the `.value` signal. This turned out to be problematic, as it wasn't possible to write a type for a resource which didn't return `undefined` values. Such a type is useful for 2 reasons: 1. to support narrowing of the resource type when `Resource.hasValue()` returns `true`. 2. for resources which use a different value instead of `undefined` to represent not having a value (for example, array resources which want to use `[]` as their default). Instead, this commit changes `resource()` and `rxResource()` to return an explicit `ResourceRef`, and removes the union with `undefined` from all types related to the resource's value. This way, it's trivially possible to write `Resource` to represent resources where `.value` only returns `T`. `hasValue()` then actually works to perform narrowing, by narrowing the resource type to `Exclude`. PR Close #59024 --- goldens/public-api/core/index.api.md | 18 +++---- .../public-api/core/rxjs-interop/index.api.md | 2 +- packages/core/rxjs-interop/src/rx_resource.ts | 2 +- packages/core/src/resource/api.ts | 12 ++--- packages/core/src/resource/resource.ts | 47 ++++++++++--------- 5 files changed, 40 insertions(+), 41 deletions(-) diff --git a/goldens/public-api/core/index.api.md b/goldens/public-api/core/index.api.md index a8c38f6f029e..c1558563964c 100644 --- a/goldens/public-api/core/index.api.md +++ b/goldens/public-api/core/index.api.md @@ -1585,17 +1585,15 @@ export function resolveForwardRef(type: T): T; // @public export interface Resource { readonly error: Signal; - hasValue(): this is Resource & { - value: Signal; - }; + hasValue(): this is Resource>; readonly isLoading: Signal; reload(): boolean; readonly status: Signal; - readonly value: Signal; + readonly value: Signal; } // @public -export function resource(options: ResourceOptions): ResourceRef; +export function resource(options: ResourceOptions): ResourceRef; // @public export type ResourceLoader = (param: ResourceLoaderParams) => PromiseLike; @@ -1984,13 +1982,11 @@ export interface WritableResource extends Resource { // (undocumented) asReadonly(): Resource; // (undocumented) - hasValue(): this is WritableResource & { - value: WritableSignal; - }; - set(value: T | undefined): void; - update(updater: (value: T | undefined) => T | undefined): void; + hasValue(): this is WritableResource>; + set(value: T): void; + update(updater: (value: T) => T): void; // (undocumented) - readonly value: WritableSignal; + readonly value: WritableSignal; } // @public diff --git a/goldens/public-api/core/rxjs-interop/index.api.md b/goldens/public-api/core/rxjs-interop/index.api.md index 272442ad7774..2541268868c1 100644 --- a/goldens/public-api/core/rxjs-interop/index.api.md +++ b/goldens/public-api/core/rxjs-interop/index.api.md @@ -27,7 +27,7 @@ export function outputToObservable(ref: OutputRef): Observable; export function pendingUntilEvent(injector?: Injector): MonoTypeOperatorFunction; // @public -export function rxResource(opts: RxResourceOptions): ResourceRef; +export function rxResource(opts: RxResourceOptions): ResourceRef; // @public export interface RxResourceOptions extends Omit, 'loader'> { diff --git a/packages/core/rxjs-interop/src/rx_resource.ts b/packages/core/rxjs-interop/src/rx_resource.ts index da509c3accf3..f6dae71f0ee2 100644 --- a/packages/core/rxjs-interop/src/rx_resource.ts +++ b/packages/core/rxjs-interop/src/rx_resource.ts @@ -31,7 +31,7 @@ export interface RxResourceOptions extends Omit, 'lo * * @experimental */ -export function rxResource(opts: RxResourceOptions): ResourceRef { +export function rxResource(opts: RxResourceOptions): ResourceRef { opts?.injector || assertInInjectionContext(rxResource); return resource({ ...opts, diff --git a/packages/core/src/resource/api.ts b/packages/core/src/resource/api.ts index 3006fa9151a7..c3ed5b346e14 100644 --- a/packages/core/src/resource/api.ts +++ b/packages/core/src/resource/api.ts @@ -68,7 +68,7 @@ export interface Resource { /** * The current value of the `Resource`, or `undefined` if there is no current value. */ - readonly value: Signal; + readonly value: Signal; /** * The current status of the `Resource`, which describes what the resource is currently doing and @@ -91,7 +91,7 @@ export interface Resource { * * This function is reactive. */ - hasValue(): this is Resource & {value: Signal}; + hasValue(): this is Resource>; /** * Instructs the resource to re-load any asynchronous dependency it may have. @@ -112,18 +112,18 @@ export interface Resource { * @experimental */ export interface WritableResource extends Resource { - readonly value: WritableSignal; - hasValue(): this is WritableResource & {value: WritableSignal}; + readonly value: WritableSignal; + hasValue(): this is WritableResource>; /** * Convenience wrapper for `value.set`. */ - set(value: T | undefined): void; + set(value: T): void; /** * Convenience wrapper for `value.update`. */ - update(updater: (value: T | undefined) => T | undefined): void; + update(updater: (value: T) => T): void; asReadonly(): Resource; } diff --git a/packages/core/src/resource/resource.ts b/packages/core/src/resource/resource.ts index b81b93e8160e..7c2221b4a2c4 100644 --- a/packages/core/src/resource/resource.ts +++ b/packages/core/src/resource/resource.ts @@ -36,10 +36,16 @@ import {DestroyRef} from '../linker'; * * @experimental */ -export function resource(options: ResourceOptions): ResourceRef { +export function resource(options: ResourceOptions): ResourceRef { options?.injector || assertInInjectionContext(resource); const request = (options.request ?? (() => null)) as () => R; - return new WritableResourceImpl(request, options.loader, options.equal, options.injector); + return new WritableResourceImpl( + request, + options.loader, + undefined, + options.equal ? wrapEqualityFn(options.equal) : undefined, + options.injector, + ); } /** @@ -49,23 +55,23 @@ export function resource(options: ResourceOptions): ResourceRef { * Mainly factored out for better readability. */ abstract class BaseWritableResource implements WritableResource { - readonly value: WritableSignal; + readonly value: WritableSignal; readonly status = signal(ResourceStatus.Idle); readonly error = signal(undefined); - protected readonly rawSetValue: (value: T | undefined) => void; + protected readonly rawSetValue: (value: T) => void; - constructor(equal: ValueEqualityFn | undefined) { - this.value = signal(undefined, { - equal: equal ? wrapEqualityFn(equal) : undefined, - }); + constructor( + protected defaultValue: T, + equal: ValueEqualityFn | undefined, + ) { + this.value = signal(this.defaultValue, {equal}); this.rawSetValue = this.value.set; - this.value.set = (value: T | undefined) => this.set(value); - this.value.update = (fn: (value: T | undefined) => T | undefined) => - this.set(fn(untracked(this.value))); + this.value.set = (value: T) => this.set(value); + this.value.update = (fn: (value: T) => T) => this.set(fn(untracked(this.value))); } - set(value: T | undefined): void { + set(value: T): void { // Set the value signal and check whether its `version` changes. This will tell us // if the value signal actually updated or not. const prevVersion = (this.value[SIGNAL] as SignalNode).version; @@ -82,7 +88,7 @@ abstract class BaseWritableResource implements WritableResource { this.error.set(undefined); } - update(updater: (value: T | undefined) => T | undefined): void { + update(updater: (value: T) => T): void { this.value.update(updater); } @@ -90,12 +96,8 @@ abstract class BaseWritableResource implements WritableResource { () => this.status() === ResourceStatus.Loading || this.status() === ResourceStatus.Reloading, ); - hasValue(): this is WritableResource & {value: WritableSignal} { - return ( - this.status() === ResourceStatus.Resolved || - this.status() === ResourceStatus.Local || - this.status() === ResourceStatus.Reloading - ); + hasValue(): this is WritableResource> { + return this.value() !== undefined; } asReadonly(): Resource { @@ -105,7 +107,7 @@ abstract class BaseWritableResource implements WritableResource { /** * Put the resource in a state with a given value. */ - protected setValueState(status: ResourceStatus, value: T | undefined = undefined): void { + protected setValueState(status: ResourceStatus, value: T = this.defaultValue): void { this.status.set(status); this.rawSetValue(value); this.error.set(undefined); @@ -115,7 +117,7 @@ abstract class BaseWritableResource implements WritableResource { * Put the resource into the error state. */ protected setErrorState(err: unknown): void { - this.value.set(undefined); + this.value.set(this.defaultValue); // The previous line will set the status to `Local`, so we need to update it. this.status.set(ResourceStatus.Error); this.error.set(err); @@ -142,10 +144,11 @@ class WritableResourceImpl extends BaseWritableResource implements Reso constructor( requestFn: () => R, private readonly loaderFn: ResourceLoader, + defaultValue: T, equal: ValueEqualityFn | undefined, injector: Injector | undefined, ) { - super(equal); + super(defaultValue, equal); injector = injector ?? inject(Injector); this.pendingTasks = injector.get(PendingTasks); From 01fffdb54778dea8e809354de8d75c40070bb0fe Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Mon, 2 Dec 2024 15:57:37 -0800 Subject: [PATCH 0113/1220] refactor(core): port resource() to linkedSignal() (#59024) When the reactive `request` of a resource() notifies, it transitions to the Loading state, fires the loader, and eventually transitions to Resolved. With the prior implementation, a change of the `request` will queue the effect, but the state remains unchanged until the effect actually runs. For a brief period, the resource is in a state where the request has changed, but the state has yet to update. This is problematic if we want to use resources in certain contexts where we care about the state of the resource in a synchronous way. For example, an async validator backed by a resource might be checked after an update: ``` value.set(123); if (validator.value()) { // value is still valid, even though the resource is dirty and will soon // flip to loading state (returning value(): undefined) while revalidating } ``` To address this timing concern, `linkedSignal()` is used within the `resource()` to synchronously transition the state in response to the request changing. This ensures any followup reads see a consistent view of the resource regardless of whether the effect has run. This also addresses a race condition where `.set()` behaves differently on a `resource()` depending on whether or not the effect has run. PR Close #59024 --- .../rxjs-interop/test/rx_resource_spec.ts | 15 +- packages/core/src/resource/resource.ts | 266 +++++++++++------- packages/core/test/resource/resource_spec.ts | 107 ++++++- 3 files changed, 266 insertions(+), 122 deletions(-) diff --git a/packages/core/rxjs-interop/test/rx_resource_spec.ts b/packages/core/rxjs-interop/test/rx_resource_spec.ts index 5673c67203b4..64cd2ba0168f 100644 --- a/packages/core/rxjs-interop/test/rx_resource_spec.ts +++ b/packages/core/rxjs-interop/test/rx_resource_spec.ts @@ -26,12 +26,14 @@ describe('rxResource()', () => { it('should cancel the fetch when a new request comes in', async () => { const injector = TestBed.inject(Injector); const appRef = TestBed.inject(ApplicationRef); - let unsub = false; const request = signal(1); - const res = rxResource({ + let unsub = false; + let lastSeenRequest: number = 0; + rxResource({ request, - loader: ({request}) => - new Observable((sub) => { + loader: ({request}) => { + lastSeenRequest = request; + return new Observable((sub) => { if (request === 2) { sub.next(true); } @@ -40,12 +42,13 @@ describe('rxResource()', () => { unsub = true; } }; - }), + }); + }, injector, }); // Wait for the resource to reach loading state. - await waitFor(() => res.isLoading()); + await waitFor(() => lastSeenRequest === 1); // Setting request = 2 should cancel request = 1 request.set(2); diff --git a/packages/core/src/resource/resource.ts b/packages/core/src/resource/resource.ts index 7c2221b4a2c4..e169a86c78f0 100644 --- a/packages/core/src/resource/resource.ts +++ b/packages/core/src/resource/resource.ts @@ -8,7 +8,7 @@ import {untracked} from '../render3/reactivity/untracked'; import {computed} from '../render3/reactivity/computed'; -import {signal, WritableSignal} from '../render3/reactivity/signal'; +import {signal, signalAsReadonlyFn, WritableSignal} from '../render3/reactivity/signal'; import {Signal} from '../render3/reactivity/api'; import {effect, EffectRef} from '../render3/reactivity/effect'; import { @@ -19,12 +19,13 @@ import { Resource, ResourceRef, } from './api'; -import {ValueEqualityFn, SIGNAL, SignalNode} from '@angular/core/primitives/signals'; +import {ValueEqualityFn} from '@angular/core/primitives/signals'; import {Injector} from '../di/injector'; import {assertInInjectionContext} from '../di/contextual'; import {inject} from '../di/injector_compatibility'; import {PendingTasks} from '../pending_tasks'; -import {DestroyRef} from '../linker'; +import {linkedSignal} from '../render3/reactivity/linked_signal'; +import {DestroyRef} from '../linker/destroy_ref'; /** * Constructs a `Resource` that projects a reactive request to an asynchronous operation defined by @@ -39,57 +40,45 @@ import {DestroyRef} from '../linker'; export function resource(options: ResourceOptions): ResourceRef { options?.injector || assertInInjectionContext(resource); const request = (options.request ?? (() => null)) as () => R; - return new WritableResourceImpl( + return new ResourceImpl( request, options.loader, undefined, options.equal ? wrapEqualityFn(options.equal) : undefined, - options.injector, + options.injector ?? inject(Injector), ); } /** - * Base class for `WritableResource` which handles the state operations and is unopinionated on the - * actual async operation. - * - * Mainly factored out for better readability. + * Internal state of a resource. + */ +interface ResourceState { + status: ResourceStatus; + previousStatus: ResourceStatus; + value: T; + error: unknown | undefined; +} + +/** + * Base class which implements `.value` as a `WritableSignal` by delegating `.set` and `.update`. */ abstract class BaseWritableResource implements WritableResource { readonly value: WritableSignal; - readonly status = signal(ResourceStatus.Idle); - readonly error = signal(undefined); - - protected readonly rawSetValue: (value: T) => void; - - constructor( - protected defaultValue: T, - equal: ValueEqualityFn | undefined, - ) { - this.value = signal(this.defaultValue, {equal}); - this.rawSetValue = this.value.set; - this.value.set = (value: T) => this.set(value); - this.value.update = (fn: (value: T) => T) => this.set(fn(untracked(this.value))); + abstract readonly status: Signal; + abstract readonly error: Signal; + abstract reload(): boolean; + + constructor(value: Signal) { + this.value = value as WritableSignal; + this.value.set = this.set.bind(this); + this.value.update = this.update.bind(this); + this.value.asReadonly = signalAsReadonlyFn; } - set(value: T): void { - // Set the value signal and check whether its `version` changes. This will tell us - // if the value signal actually updated or not. - const prevVersion = (this.value[SIGNAL] as SignalNode).version; - this.rawSetValue(value); - if ((this.value[SIGNAL] as SignalNode).version === prevVersion) { - // The value must've been equal to the previous, so no need to change states. - return; - } - - // We're departing from whatever state the resource was in previously, and entering - // Local state. - this.onLocalValue(); - this.status.set(ResourceStatus.Local); - this.error.set(undefined); - } + abstract set(value: T): void; - update(updater: (value: T) => T): void { - this.value.update(updater); + update(updateFn: (value: T) => T): void { + this.set(updateFn(untracked(this.value))); } readonly isLoading = computed( @@ -103,71 +92,117 @@ abstract class BaseWritableResource implements WritableResource { asReadonly(): Resource { return this; } +} +/** + * Implementation for `resource()` which uses a `linkedSignal` to manage the resource's state. + */ +class ResourceImpl extends BaseWritableResource implements ResourceRef { /** - * Put the resource in a state with a given value. - */ - protected setValueState(status: ResourceStatus, value: T = this.defaultValue): void { - this.status.set(status); - this.rawSetValue(value); - this.error.set(undefined); - } - - /** - * Put the resource into the error state. + * The current state of the resource. Status, value, and error are derived from this. */ - protected setErrorState(err: unknown): void { - this.value.set(this.defaultValue); - // The previous line will set the status to `Local`, so we need to update it. - this.status.set(ResourceStatus.Error); - this.error.set(err); - } + private readonly state: WritableSignal>; /** - * Called when the resource is transitioning to local state. - * - * For example, this can be used to cancel any in-progress loading operations. + * 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. */ - protected abstract onLocalValue(): void; - - public abstract reload(): boolean; -} + private readonly extendedRequest: Signal<{request: R; reload: WritableSignal}>; -class WritableResourceImpl extends BaseWritableResource implements ResourceRef { - private readonly request: Signal<{request: R; reload: WritableSignal}>; private readonly pendingTasks: PendingTasks; private readonly effectRef: EffectRef; private pendingController: AbortController | undefined; private resolvePendingTask: (() => void) | undefined = undefined; + private destroyed = false; constructor( - requestFn: () => R, + request: () => R, private readonly loaderFn: ResourceLoader, - defaultValue: T, - equal: ValueEqualityFn | undefined, - injector: Injector | undefined, + private readonly defaultValue: T, + private readonly equal: ValueEqualityFn | undefined, + injector: Injector, ) { - super(defaultValue, equal); - injector = injector ?? inject(Injector); + // Feed a computed signal for the value to `BaseWritableResource`, which will upgrade it to a + // `WritableSignal` that delegates to `ResourceImpl.set`. + super(computed(() => this.state().value, {equal})); this.pendingTasks = injector.get(PendingTasks); - this.request = computed(() => ({ - // The current request as defined for this resource. - request: requestFn(), - - // A counter signal which increments from 0, re-initialized for each request (similar to the - // `linkedSignal` pattern). A value other than 0 indicates a refresh operation. + // Extend `request()` to include a writable reload signal. + this.extendedRequest = computed(() => ({ + request: request(), reload: signal(0), })); - // The actual data-fetching effect. - this.effectRef = effect(this.loadEffect.bind(this), {injector, manualCleanup: true}); + // 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>({ + // 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; + } + 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: previous?.value.status ?? ResourceStatus.Idle, + // 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. + value: + previous && status === ResourceStatus.Reloading + ? previous.value.value + : this.defaultValue, + error: undefined, + }) satisfies ResourceState, + }); + + this.effectRef = effect(this.loadEffect.bind(this), { + injector, + manualCleanup: true, + }); // Cancel any pending request when the resource itself is destroyed. injector.get(DestroyRef).onDestroy(() => this.destroy()); } + override readonly status = computed(() => this.state().status); + override readonly error = computed(() => this.state().error); + + /** + * Called either directly via `WritableResource.set` or via `.value.set()`. + */ + override set(value: T): void { + if (this.destroyed) { + return; + } + + const currentState = untracked(this.state); + if (this.equal ? this.equal(currentState.value, value) : currentState.value === value) { + return; + } + + // Enter Local state with the user-defined value. + this.state.set({ + status: ResourceStatus.Local, + previousStatus: ResourceStatus.Local, + value, + error: undefined, + }); + + // We're departing from whatever state the resource was in previously, so cancel any in-progress + // loading operations. + this.abortInProgressLoad(); + } + override reload(): boolean { // We don't want to restart in-progress loads. const status = untracked(this.status); @@ -179,38 +214,50 @@ class WritableResourceImpl extends BaseWritableResource implements Reso return false; } - untracked(this.request).reload.update((v) => v + 1); + // Increment the reload signal to trigger the `state` linked signal to switch us to `Reload` + untracked(this.extendedRequest).reload.update((v) => v + 1); return true; } destroy(): void { + this.destroyed = true; this.effectRef.destroy(); - this.abortInProgressLoad(); - this.setValueState(ResourceStatus.Idle); + + // Destroyed resources enter Idle state. + this.state.set({ + status: ResourceStatus.Idle, + previousStatus: ResourceStatus.Idle, + value: this.defaultValue, + error: undefined, + }); } private async loadEffect(): Promise { - // Capture the status before any state transitions. - const previousStatus = untracked(this.status); + // 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: previousStatus} = untracked(this.state); - // Cancel any previous loading attempts. - this.abortInProgressLoad(); + 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(); - const request = this.request(); - if (request.request === undefined) { - // An undefined request means there's nothing to load. - this.setValueState(ResourceStatus.Idle); + if (request === undefined) { + // Nothing to load (and we should already be in a non-loading state). + return; + } else if ( + previousStatus !== ResourceStatus.Loading && + previousStatus !== 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. return; } - // Subscribing here allows us to refresh the load later by updating the refresh signal. At the - // same time, we update the status according to whether we're reloading or loading. - if (request.reload() === 0) { - this.setValueState(ResourceStatus.Loading); // value becomes undefined - } else { - this.status.set(ResourceStatus.Reloading); // value persists - } + // Cancel any previous loading attempts. + this.abortInProgressLoad(); // Capturing _this_ load's pending task in a local variable is important here. We may attempt to // resolve it twice: @@ -231,7 +278,7 @@ class WritableResourceImpl extends BaseWritableResource implements Reso const result = await untracked(() => this.loaderFn({ abortSignal, - request: request.request as Exclude, + request: request as Exclude, previous: { status: previousStatus, }, @@ -242,32 +289,41 @@ class WritableResourceImpl extends BaseWritableResource implements Reso return; } // Success :) - this.setValueState(ResourceStatus.Resolved, result); + this.state.set({ + status: ResourceStatus.Resolved, + previousStatus: ResourceStatus.Resolved, + value: result, + error: undefined, + }); } catch (err) { if (abortSignal.aborted) { // This load operation was cancelled. return; } // Fail :( - this.setErrorState(err); + this.state.set({ + status: ResourceStatus.Error, + previousStatus: ResourceStatus.Error, + value: this.defaultValue, + error: err, + }); } finally { // Resolve the pending task now that loading is done. resolvePendingTask(); + + // Free the abort controller to drop any registered 'abort' callbacks. + this.pendingController = undefined; } } private abortInProgressLoad(): void { - this.pendingController?.abort(); + untracked(() => this.pendingController?.abort()); this.pendingController = undefined; // Once the load is aborted, we no longer want to block stability on its resolution. this.resolvePendingTask?.(); this.resolvePendingTask = undefined; } - - protected override onLocalValue(): void { - this.abortInProgressLoad(); - } } /** diff --git a/packages/core/test/resource/resource_spec.ts b/packages/core/test/resource/resource_spec.ts index cb759a8e6c40..452418ea097a 100644 --- a/packages/core/test/resource/resource_spec.ts +++ b/packages/core/test/resource/resource_spec.ts @@ -7,6 +7,7 @@ */ import { + ApplicationRef, createEnvironmentInjector, EnvironmentInjector, Injector, @@ -81,22 +82,13 @@ describe('resource', () => { injector: TestBed.inject(Injector), }); - // a freshly created resource is in the idle state - expect(echoResource.status()).toBe(ResourceStatus.Idle); - expect(echoResource.isLoading()).toBeFalse(); - expect(echoResource.hasValue()).toBeFalse(); - expect(echoResource.value()).toBeUndefined(); - expect(echoResource.error()).toBe(undefined); - - // flush effect to kick off a request - // THINK: testing patterns around a resource? - TestBed.flushEffects(); + // a freshly created resource is in the loading state expect(echoResource.status()).toBe(ResourceStatus.Loading); expect(echoResource.isLoading()).toBeTrue(); expect(echoResource.hasValue()).toBeFalse(); expect(echoResource.value()).toBeUndefined(); expect(echoResource.error()).toBe(undefined); - + TestBed.flushEffects(); await backend.flush(); expect(echoResource.status()).toBe(ResourceStatus.Resolved); expect(echoResource.isLoading()).toBeFalse(); @@ -362,6 +354,9 @@ describe('resource', () => { expect(res.error()).toBe(undefined); res.reload(); + expect(res.status()).toBe(ResourceStatus.Reloading); + expect(res.value()).toBe('0:0'); + TestBed.flushEffects(); await backend.flush(); expect(res.status()).toBe(ResourceStatus.Resolved); @@ -411,4 +406,94 @@ describe('resource', () => { // @ts-expect-error readonlyRes.value.set; }); + + it('should synchronously change states', async () => { + const request = signal(undefined); + const backend = new MockEchoBackend(); + const echoResource = resource({ + request, + loader: (params) => backend.fetch(params.request), + injector: TestBed.inject(Injector), + }); + // Idle to start. + expect(echoResource.status()).toBe(ResourceStatus.Idle); + // Switch to loading state should be synchronous. + request.set(1); + expect(echoResource.status()).toBe(ResourceStatus.Loading); + // And back to idle. + request.set(undefined); + expect(echoResource.status()).toBe(ResourceStatus.Idle); + // Allow the load to proceed. + request.set(2); + TestBed.flushEffects(); + await backend.flush(); + expect(echoResource.status()).toBe(ResourceStatus.Resolved); + // Reload state should be synchronous. + echoResource.reload(); + expect(echoResource.status()).toBe(ResourceStatus.Reloading); + // Back to idle. + request.set(undefined); + expect(echoResource.status()).toBe(ResourceStatus.Idle); + }); + it('set() should abort a pending load', async () => { + const request = signal(1); + const backend = new MockEchoBackend(); + const echoResource = resource({ + request, + loader: (params) => backend.fetch(params.request), + injector: TestBed.inject(Injector), + }); + const appRef = TestBed.inject(ApplicationRef); + // Fully resolve the resource to start. + TestBed.flushEffects(); + await backend.flush(); + expect(echoResource.status()).toBe(ResourceStatus.Resolved); + // Trigger loading state. + request.set(2); + expect(echoResource.status()).toBe(ResourceStatus.Loading); + // Set the resource to a new value. + echoResource.set(3); + // Now run the effect, which should be a no-op as the resource was set to a local value. + TestBed.flushEffects(); + // We should still be in local state. + expect(echoResource.status()).toBe(ResourceStatus.Local); + expect(echoResource.value()).toBe(3); + // Flush the resource + await backend.flush(); + await appRef.whenStable(); + // We should still be in local state. + expect(echoResource.status()).toBe(ResourceStatus.Local); + expect(echoResource.value()).toBe(3); + }); + + it('set() should abort a pending reload', async () => { + const request = signal(1); + const backend = new MockEchoBackend(); + const echoResource = resource({ + request, + loader: (params) => backend.fetch(params.request), + injector: TestBed.inject(Injector), + }); + const appRef = TestBed.inject(ApplicationRef); + // Fully resolve the resource to start. + TestBed.flushEffects(); + await backend.flush(); + expect(echoResource.status()).toBe(ResourceStatus.Resolved); + // Trigger reloading state. + echoResource.reload(); + expect(echoResource.status()).toBe(ResourceStatus.Reloading); + // Set the resource to a new value. + echoResource.set(3); + // Now run the effect, which should be a no-op as the resource was set to a local value. + TestBed.flushEffects(); + // We should still be in local state. + expect(echoResource.status()).toBe(ResourceStatus.Local); + expect(echoResource.value()).toBe(3); + // Flush the resource + await backend.flush(); + await appRef.whenStable(); + // We should still be in local state. + expect(echoResource.status()).toBe(ResourceStatus.Local); + expect(echoResource.value()).toBe(3); + }); }); From 10f280a4d31f53b08d16986fa3bb6cb7d45ac764 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Fri, 10 Jan 2025 11:57:31 +0100 Subject: [PATCH 0114/1220] refactor(core): move DOM manipulation logic to its own file (#59462) This refactoring takes a step toward breaking down the node_manipulation file into smaller, more focused files. PR Close #59462 --- packages/core/src/hydration/cleanup.ts | 2 +- packages/core/src/hydration/i18n.ts | 3 +- .../core/src/linker/view_container_ref.ts | 13 +- packages/core/src/render3/component_ref.ts | 3 +- .../core/src/render3/dom_node_manipulation.ts | 102 +++++++++++++++ packages/core/src/render3/i18n/i18n_apply.ts | 5 +- .../core/src/render3/instructions/element.ts | 9 +- .../render3/instructions/element_container.ts | 3 +- .../core/src/render3/instructions/shared.ts | 2 +- .../core/src/render3/instructions/text.ts | 5 +- .../instructions/text_interpolation.ts | 2 +- .../core/src/render3/node_manipulation.ts | 116 ++---------------- .../src/render3/node_manipulation_i18n.ts | 5 +- .../core/src/render3/view_manipulation.ts | 3 +- .../sanitization/iframe_attrs_validation.ts | 2 +- .../bundling/defer/bundle.golden_symbols.json | 1 + .../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 - 20 files changed, 136 insertions(+), 144 deletions(-) create mode 100644 packages/core/src/render3/dom_node_manipulation.ts diff --git a/packages/core/src/hydration/cleanup.ts b/packages/core/src/hydration/cleanup.ts index f55911b831a2..7444e5b9d1cd 100644 --- a/packages/core/src/hydration/cleanup.ts +++ b/packages/core/src/hydration/cleanup.ts @@ -18,7 +18,7 @@ import {Renderer} from '../render3/interfaces/renderer'; import {RNode} from '../render3/interfaces/renderer_dom'; import {isLContainer, isLView} from '../render3/interfaces/type_checks'; import {HEADER_OFFSET, HOST, LView, PARENT, RENDERER, TVIEW} from '../render3/interfaces/view'; -import {nativeRemoveNode} from '../render3/node_manipulation'; +import {nativeRemoveNode} from '../render3/dom_node_manipulation'; import {validateSiblingNodeExists} from './error_handling'; import {cleanupI18nHydrationData} from './i18n'; diff --git a/packages/core/src/hydration/i18n.ts b/packages/core/src/hydration/i18n.ts index 4aa20960eec0..9b7569ddcbba 100644 --- a/packages/core/src/hydration/i18n.ts +++ b/packages/core/src/hydration/i18n.ts @@ -14,7 +14,8 @@ import {isTNodeShape, TNode, TNodeType} from '../render3/interfaces/node'; import type {Renderer} from '../render3/interfaces/renderer'; import type {RNode} from '../render3/interfaces/renderer_dom'; import {HEADER_OFFSET, HYDRATION, LView, RENDERER, TView, TVIEW} from '../render3/interfaces/view'; -import {getFirstNativeNode, nativeRemoveNode} from '../render3/node_manipulation'; +import {getFirstNativeNode} from '../render3/node_manipulation'; +import {nativeRemoveNode} from '../render3/dom_node_manipulation'; import {unwrapRNode} from '../render3/util/view_utils'; import {assertDefined, assertNotEqual} from '../util/assert'; diff --git a/packages/core/src/linker/view_container_ref.ts b/packages/core/src/linker/view_container_ref.ts index 76549fa754bd..fe53b6cc3507 100644 --- a/packages/core/src/linker/view_container_ref.ts +++ b/packages/core/src/linker/view_container_ref.ts @@ -51,13 +51,8 @@ import { TVIEW, } from '../render3/interfaces/view'; import {assertTNodeType} from '../render3/node_assert'; -import { - destroyLView, - detachView, - nativeInsertBefore, - nativeNextSibling, - nativeParentNode, -} from '../render3/node_manipulation'; +import {destroyLView, detachView} from '../render3/node_manipulation'; +import {nativeInsertBefore} from '../render3/dom_node_manipulation'; import {getCurrentTNode, getLView} from '../render3/state'; import { getParentInjectorIndex, @@ -723,12 +718,12 @@ function insertAnchorNode(hostLView: LView, hostTNode: TNode): RComment { const commentNode = renderer.createComment(ngDevMode ? 'container' : ''); const hostNative = getNativeByTNode(hostTNode, hostLView)!; - const parentOfHostNative = nativeParentNode(renderer, hostNative); + const parentOfHostNative = renderer.parentNode(hostNative); nativeInsertBefore( renderer, parentOfHostNative!, commentNode, - nativeNextSibling(renderer, hostNative), + renderer.nextSibling(hostNative), false, ); return commentNode; diff --git a/packages/core/src/render3/component_ref.ts b/packages/core/src/render3/component_ref.ts index 78d4f98c5ef0..8dd06b1e7e83 100644 --- a/packages/core/src/render3/component_ref.ts +++ b/packages/core/src/render3/component_ref.ts @@ -75,7 +75,7 @@ import { TViewType, } from './interfaces/view'; import {MATH_ML_NAMESPACE, SVG_NAMESPACE} from './namespaces'; -import {createElementNode, setupStaticAttributes, writeDirectClass} from './node_manipulation'; +import {setupStaticAttributes, writeDirectClass} from './node_manipulation'; import { extractAttrsAndClassesFromSelector, stringifyCSSSelectorList, @@ -91,6 +91,7 @@ import {unregisterLView} from './interfaces/lview_tracking'; import {profiler} from './profiler'; import {ProfilerEvent} from './profiler_types'; import {executeContentQueries} from './queries/query_execution'; +import {createElementNode} from './dom_node_manipulation'; export class ComponentFactoryResolver extends AbstractComponentFactoryResolver { /** diff --git a/packages/core/src/render3/dom_node_manipulation.ts b/packages/core/src/render3/dom_node_manipulation.ts new file mode 100644 index 000000000000..029376b8fef8 --- /dev/null +++ b/packages/core/src/render3/dom_node_manipulation.ts @@ -0,0 +1,102 @@ +/** + * @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 {Renderer} from './interfaces/renderer'; +import {RComment, RElement, RNode, RText} from './interfaces/renderer_dom'; +import {escapeCommentText} from '../util/dom'; +import {assertDefined} from '../util/assert'; + +export function createTextNode(renderer: Renderer, value: string): RText { + ngDevMode && ngDevMode.rendererCreateTextNode++; + ngDevMode && ngDevMode.rendererSetText++; + return renderer.createText(value); +} + +export function updateTextNode(renderer: Renderer, rNode: RText, value: string): void { + ngDevMode && ngDevMode.rendererSetText++; + renderer.setValue(rNode, value); +} + +export function createCommentNode(renderer: Renderer, value: string): RComment { + ngDevMode && ngDevMode.rendererCreateComment++; + return renderer.createComment(escapeCommentText(value)); +} + +/** + * Creates a native element from a tag name, using a renderer. + * @param renderer A renderer to use + * @param name the tag name + * @param namespace Optional namespace for element. + * @returns the element created + */ +export function createElementNode( + renderer: Renderer, + name: string, + namespace: string | null, +): RElement { + ngDevMode && ngDevMode.rendererCreateElement++; + return renderer.createElement(name, namespace); +} + +/** + * Inserts a native node before another native node for a given parent. + * This is a utility function that can be used when native nodes were determined. + */ +export function nativeInsertBefore( + renderer: Renderer, + parent: RElement, + child: RNode, + beforeNode: RNode | null, + isMove: boolean, +): void { + ngDevMode && ngDevMode.rendererInsertBefore++; + renderer.insertBefore(parent, child, beforeNode, isMove); +} + +export function nativeAppendChild(renderer: Renderer, parent: RElement, child: RNode): void { + ngDevMode && ngDevMode.rendererAppendChild++; + ngDevMode && assertDefined(parent, 'parent node must be defined'); + renderer.appendChild(parent, child); +} + +export function nativeAppendOrInsertBefore( + renderer: Renderer, + parent: RElement, + child: RNode, + beforeNode: RNode | null, + isMove: boolean, +) { + if (beforeNode !== null) { + nativeInsertBefore(renderer, parent, child, beforeNode, isMove); + } else { + nativeAppendChild(renderer, parent, child); + } +} + +/** + * Removes a native node itself using a given renderer. To remove the node we are looking up its + * parent from the native tree as not all platforms / browsers support the equivalent of + * node.remove(). + * + * @param renderer A renderer to be used + * @param rNode The native node that should be removed + * @param isHostElement A flag indicating if a node to be removed is a host of a component. + */ +export function nativeRemoveNode(renderer: Renderer, rNode: RNode, isHostElement?: boolean): void { + ngDevMode && ngDevMode.rendererRemoveNode++; + renderer.removeChild(null, rNode, isHostElement); +} + +/** + * Clears the contents of a given RElement. + * + * @param rElement the native RElement to be cleared + */ +export function clearElementContents(rElement: RElement): void { + rElement.textContent = ''; +} diff --git a/packages/core/src/render3/i18n/i18n_apply.ts b/packages/core/src/render3/i18n/i18n_apply.ts index 93c4a47981ba..09245a957059 100644 --- a/packages/core/src/render3/i18n/i18n_apply.ts +++ b/packages/core/src/render3/i18n/i18n_apply.ts @@ -44,10 +44,9 @@ import { createElementNode, createTextNode, nativeInsertBefore, - nativeParentNode, nativeRemoveNode, updateTextNode, -} from '../node_manipulation'; +} from '../dom_node_manipulation'; import { getBindingIndex, isInSkipHydrationBlock, @@ -272,7 +271,7 @@ export function applyMutableOpCodes( // must insert into the root. (Only subsequent operations can insert into a dynamic // parent) rootIdx = parentIdx; - rootRNode = nativeParentNode(renderer, anchorRNode); + rootRNode = renderer.parentNode(anchorRNode); } let insertInFrontOf: RNode | null; let parentRNode: RElement | null; diff --git a/packages/core/src/render3/instructions/element.ts b/packages/core/src/render3/instructions/element.ts index 44916fa4d265..a2e991eea7a7 100644 --- a/packages/core/src/render3/instructions/element.ts +++ b/packages/core/src/render3/instructions/element.ts @@ -34,7 +34,6 @@ import { TAttributes, TElementNode, TNode, - TNodeFlags, TNodeType, } from '../interfaces/node'; import {Renderer} from '../interfaces/renderer'; @@ -42,13 +41,9 @@ 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 { - appendChild, - clearElementContents, - createElementNode, - setupStaticAttributes, -} from '../node_manipulation'; import {executeContentQueries} from '../queries/query_execution'; +import {appendChild, setupStaticAttributes} from '../node_manipulation'; +import {clearElementContents, createElementNode} from '../dom_node_manipulation'; import { decreaseElementDepthCount, enterSkipHydrationBlock, diff --git a/packages/core/src/render3/instructions/element_container.ts b/packages/core/src/render3/instructions/element_container.ts index 65e7fb0e9fbb..d2e9b9782eac 100644 --- a/packages/core/src/render3/instructions/element_container.ts +++ b/packages/core/src/render3/instructions/element_container.ts @@ -23,8 +23,9 @@ 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 {appendChild, createCommentNode} from '../node_manipulation'; import {executeContentQueries} from '../queries/query_execution'; +import {appendChild} from '../node_manipulation'; +import {createCommentNode} from '../dom_node_manipulation'; import { getBindingIndex, getCurrentTNode, diff --git a/packages/core/src/render3/instructions/shared.ts b/packages/core/src/render3/instructions/shared.ts index 35ae97b0cf5f..29303e61cfdd 100644 --- a/packages/core/src/render3/instructions/shared.ts +++ b/packages/core/src/render3/instructions/shared.ts @@ -115,7 +115,6 @@ import { TViewType, } from '../interfaces/view'; import {assertPureTNodeType, assertTNodeType} from '../node_assert'; -import {clearElementContents} from '../node_manipulation'; import {isInlineTemplate, isNodeMatchingSelectorList} from '../node_selector_matcher'; import {profiler} from '../profiler'; import {ProfilerEvent} from '../profiler_types'; @@ -148,6 +147,7 @@ import {selectIndexInternal} from './advance'; import {ɵɵdirectiveInject} from './di'; import {handleUnknownPropertyError, isPropertyValid, matchingSchemas} from './element_validation'; import {writeToDirectiveInput} from './write_to_directive_input'; +import {clearElementContents, updateTextNode} from '../dom_node_manipulation'; export function createLView( parentLView: LView | null, diff --git a/packages/core/src/render3/instructions/text.ts b/packages/core/src/render3/instructions/text.ts index 13c52c295173..4d8e15ecc35f 100644 --- a/packages/core/src/render3/instructions/text.ts +++ b/packages/core/src/render3/instructions/text.ts @@ -12,8 +12,9 @@ import {isDetachedByI18n} from '../../i18n/utils'; import {assertEqual, assertIndexInRange} from '../../util/assert'; import {TElementNode, TNode, TNodeType} from '../interfaces/node'; import {RText} from '../interfaces/renderer_dom'; -import {HEADER_OFFSET, HYDRATION, LView, RENDERER, T_HOST, TView} from '../interfaces/view'; -import {appendChild, createTextNode} from '../node_manipulation'; +import {HEADER_OFFSET, HYDRATION, LView, RENDERER, TView} from '../interfaces/view'; +import {appendChild} from '../node_manipulation'; +import {createTextNode} from '../dom_node_manipulation'; import { getBindingIndex, getLView, diff --git a/packages/core/src/render3/instructions/text_interpolation.ts b/packages/core/src/render3/instructions/text_interpolation.ts index 5c9625690e58..c8afff83d992 100644 --- a/packages/core/src/render3/instructions/text_interpolation.ts +++ b/packages/core/src/render3/instructions/text_interpolation.ts @@ -8,7 +8,7 @@ import {assertDefined, assertIndexInRange, assertNotSame, assertString} from '../../util/assert'; import {RText} from '../interfaces/renderer_dom'; import {LView, RENDERER} from '../interfaces/view'; -import {updateTextNode} from '../node_manipulation'; +import {updateTextNode} from '../dom_node_manipulation'; import {getLView, getSelectedIndex} from '../state'; import {NO_CHANGE} from '../tokens'; import {getNativeByIndex} from '../util/view_utils'; diff --git a/packages/core/src/render3/node_manipulation.ts b/packages/core/src/render3/node_manipulation.ts index d4e1c4a9cce0..8b258f65a4cb 100644 --- a/packages/core/src/render3/node_manipulation.ts +++ b/packages/core/src/render3/node_manipulation.ts @@ -21,7 +21,6 @@ import { assertNumber, assertString, } from '../util/assert'; -import {escapeCommentText} from '../util/dom'; import { assertLContainer, @@ -51,7 +50,7 @@ import { TProjectionNode, } from './interfaces/node'; import {Renderer} from './interfaces/renderer'; -import {RComment, RElement, RNode, RText} from './interfaces/renderer_dom'; +import {RElement, RNode} from './interfaces/renderer_dom'; import {isDestroyed, isLContainer, isLView} from './interfaces/type_checks'; import { CHILD_HEAD, @@ -88,7 +87,12 @@ import { unwrapRNode, updateAncestorTraversalFlagsOnAttach, } from './util/view_utils'; -import {EMPTY_ARRAY} from '../util/empty'; +import { + nativeAppendChild, + nativeAppendOrInsertBefore, + nativeInsertBefore, + nativeRemoveNode, +} from './dom_node_manipulation'; const enum WalkTNodeTreeAction { /** node create in the native environment. Run on initial creation. */ @@ -157,38 +161,6 @@ function applyToElementOrContainer( } } -export function createTextNode(renderer: Renderer, value: string): RText { - ngDevMode && ngDevMode.rendererCreateTextNode++; - ngDevMode && ngDevMode.rendererSetText++; - return renderer.createText(value); -} - -export function updateTextNode(renderer: Renderer, rNode: RText, value: string): void { - ngDevMode && ngDevMode.rendererSetText++; - renderer.setValue(rNode, value); -} - -export function createCommentNode(renderer: Renderer, value: string): RComment { - ngDevMode && ngDevMode.rendererCreateComment++; - return renderer.createComment(escapeCommentText(value)); -} - -/** - * Creates a native element from a tag name, using a renderer. - * @param renderer A renderer to use - * @param name the tag name - * @param namespace Optional namespace for element. - * @returns the element created - */ -export function createElementNode( - renderer: Renderer, - name: string, - namespace: string | null, -): RElement { - ngDevMode && ngDevMode.rendererCreateElement++; - return renderer.createElement(name, namespace); -} - /** * Removes all DOM elements associated with a view. * @@ -685,55 +657,6 @@ export function getClosestRElement( } } -/** - * Inserts a native node before another native node for a given parent. - * This is a utility function that can be used when native nodes were determined. - */ -export function nativeInsertBefore( - renderer: Renderer, - parent: RElement, - child: RNode, - beforeNode: RNode | null, - isMove: boolean, -): void { - ngDevMode && ngDevMode.rendererInsertBefore++; - renderer.insertBefore(parent, child, beforeNode, isMove); -} - -function nativeAppendChild(renderer: Renderer, parent: RElement, child: RNode): void { - ngDevMode && ngDevMode.rendererAppendChild++; - ngDevMode && assertDefined(parent, 'parent node must be defined'); - renderer.appendChild(parent, child); -} - -function nativeAppendOrInsertBefore( - renderer: Renderer, - parent: RElement, - child: RNode, - beforeNode: RNode | null, - isMove: boolean, -) { - if (beforeNode !== null) { - nativeInsertBefore(renderer, parent, child, beforeNode, isMove); - } else { - nativeAppendChild(renderer, parent, child); - } -} - -/** - * Returns a native parent of a given native node. - */ -export function nativeParentNode(renderer: Renderer, node: RNode): RElement | null { - return renderer.parentNode(node); -} - -/** - * Returns a native sibling of a given native node. - */ -export function nativeNextSibling(renderer: Renderer, node: RNode): RNode | null { - return renderer.nextSibling(node); -} - /** * Find a node in front of which `currentTNode` should be inserted. * @@ -934,29 +857,6 @@ export function getBeforeNodeForView( return lContainer[NATIVE]; } -/** - * Removes a native node itself using a given renderer. To remove the node we are looking up its - * parent from the native tree as not all platforms / browsers support the equivalent of - * node.remove(). - * - * @param renderer A renderer to be used - * @param rNode The native node that should be removed - * @param isHostElement A flag indicating if a node to be removed is a host of a component. - */ -export function nativeRemoveNode(renderer: Renderer, rNode: RNode, isHostElement?: boolean): void { - ngDevMode && ngDevMode.rendererRemoveNode++; - renderer.removeChild(null, rNode, isHostElement); -} - -/** - * Clears the contents of a given RElement. - * - * @param rElement the native RElement to be cleared - */ -export function clearElementContents(rElement: RElement): void { - rElement.textContent = ''; -} - /** * Performs the operation of `action` on the node. Typically this involves inserting or removing * nodes on the LView or projection boundary. @@ -1253,7 +1153,7 @@ export function applyStyling( * @param element The element which needs to be updated. * @param newValue The new class list to write. */ -export function writeDirectStyle(renderer: Renderer, element: RElement, newValue: string) { +function writeDirectStyle(renderer: Renderer, element: RElement, newValue: string) { ngDevMode && assertString(newValue, "'newValue' should be a string"); renderer.setAttribute(element, 'style', newValue); ngDevMode && ngDevMode.rendererSetStyle++; diff --git a/packages/core/src/render3/node_manipulation_i18n.ts b/packages/core/src/render3/node_manipulation_i18n.ts index 6c46e723ef8e..5f313b86bc11 100644 --- a/packages/core/src/render3/node_manipulation_i18n.ts +++ b/packages/core/src/render3/node_manipulation_i18n.ts @@ -8,11 +8,12 @@ import {assertDomNode, assertIndexInRange} from '../util/assert'; -import {TNode, TNodeFlags, TNodeType} from './interfaces/node'; +import {TNode, TNodeType} from './interfaces/node'; import {Renderer} from './interfaces/renderer'; import {RElement, RNode} from './interfaces/renderer_dom'; import {LView} from './interfaces/view'; -import {getInsertInFrontOfRNodeWithNoI18n, nativeInsertBefore} from './node_manipulation'; +import {getInsertInFrontOfRNodeWithNoI18n} from './node_manipulation'; +import {nativeInsertBefore} from './dom_node_manipulation'; import {unwrapRNode} from './util/view_utils'; /** diff --git a/packages/core/src/render3/view_manipulation.ts b/packages/core/src/render3/view_manipulation.ts index 4b2e783c3c5f..a7cb29671ff2 100644 --- a/packages/core/src/render3/view_manipulation.ts +++ b/packages/core/src/render3/view_manipulation.ts @@ -36,7 +36,6 @@ import { detachView, getBeforeNodeForView, insertView, - nativeParentNode, } from './node_manipulation'; export function createAndRenderEmbeddedLView( @@ -135,7 +134,7 @@ export function addLViewToLContainer( if (addToDOM) { const beforeNode = getBeforeNodeForView(index, lContainer); const renderer = lView[RENDERER]; - const parentRNode = nativeParentNode(renderer, lContainer[NATIVE] as RElement | RComment); + const parentRNode = renderer.parentNode(lContainer[NATIVE] as RElement | RComment); if (parentRNode !== null) { addViewToDOM(tView, lContainer[T_HOST], renderer, lView, parentRNode, beforeNode); } diff --git a/packages/core/src/sanitization/iframe_attrs_validation.ts b/packages/core/src/sanitization/iframe_attrs_validation.ts index e74a099c0c4d..ea1f65698b42 100644 --- a/packages/core/src/sanitization/iframe_attrs_validation.ts +++ b/packages/core/src/sanitization/iframe_attrs_validation.ts @@ -11,7 +11,7 @@ import {getTemplateLocationDetails} from '../render3/instructions/element_valida import {TNodeType} from '../render3/interfaces/node'; import {RComment, RElement} from '../render3/interfaces/renderer_dom'; import {RENDERER} from '../render3/interfaces/view'; -import {nativeRemoveNode} from '../render3/node_manipulation'; +import {nativeRemoveNode} from '../render3/dom_node_manipulation'; import {getLView, getSelectedTNode} from '../render3/state'; import {getNativeByTNode} from '../render3/util/view_utils'; import {trustedHTMLFromString} from '../util/security/trusted_types'; diff --git a/packages/core/test/bundling/defer/bundle.golden_symbols.json b/packages/core/test/bundling/defer/bundle.golden_symbols.json index d07cc8ed5325..a7d6aaf880b6 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -469,6 +469,7 @@ "init_dispatcher", "init_document", "init_dom", + "init_dom_node_manipulation", "init_dom_triggers", "init_earlyeventcontract", "init_effect", 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 f72f5eb32e55..7f4a1c57a68a 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -521,7 +521,6 @@ "nativeAppendChild", "nativeAppendOrInsertBefore", "nativeInsertBefore", - "nativeParentNode", "nextNgElementId", "ngOnChangesSetInput", "ngZoneInstanceId", 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 9fd6584ca4c1..affc8faf5778 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 @@ -509,7 +509,6 @@ "nativeAppendChild", "nativeAppendOrInsertBefore", "nativeInsertBefore", - "nativeParentNode", "nextBindingIndex", "nextNgElementId", "ngOnChangesSetInput", diff --git a/packages/core/test/bundling/router/bundle.golden_symbols.json b/packages/core/test/bundling/router/bundle.golden_symbols.json index c64db860890a..344b048f3fb1 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -597,7 +597,6 @@ "nativeAppendChild", "nativeAppendOrInsertBefore", "nativeInsertBefore", - "nativeParentNode", "navigationCancelingError", "nextBindingIndex", "nextNgElementId", diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index d2c8cc77d000..aded62dbc779 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -419,7 +419,6 @@ "nativeAppendChild", "nativeAppendOrInsertBefore", "nativeInsertBefore", - "nativeParentNode", "nextBindingIndex", "nextNgElementId", "ngOnChangesSetInput", From 884e0b437a50129e44a6769f5144a46680b7fc62 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Thu, 16 Jan 2025 16:12:47 +0000 Subject: [PATCH 0115/1220] build: update cross-repo angular dependencies to v19.2.0-next.0 (#59571) See associated pull request for more information. PR Close #59571 --- adev/shared-docs/package.json | 4 ++-- package.json | 4 ++-- yarn.lock | 16 ++++++++-------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/adev/shared-docs/package.json b/adev/shared-docs/package.json index 01306e483a2e..91d2aa9c30aa 100644 --- a/adev/shared-docs/package.json +++ b/adev/shared-docs/package.json @@ -2,11 +2,11 @@ "name": "@angular/docs", "version": "0.0.0-PLACEHOLDER", "peerDependencies": { - "@angular/cdk": "^19.1.0-next", + "@angular/cdk": "^19.2.0-next", "@angular/common": "^19.1.0-next", "@angular/core": "^19.1.0-next", "@angular/forms": "^19.1.0-next", - "@angular/material": "^19.1.0-next", + "@angular/material": "^19.2.0-next", "@angular/platform-browser": "^19.1.0-next", "@angular/router": "^19.1.0-next", "@angular/ssr": "^19.1.0-next", diff --git a/package.json b/package.json index b250a5149ed4..38c72b59d5cd 100644 --- a/package.json +++ b/package.json @@ -52,9 +52,9 @@ "@angular-devkit/core": "19.1.0-rc.0", "@angular-devkit/schematics": "19.1.0-rc.0", "@angular/build": "19.1.0-rc.0", - "@angular/cdk": "19.1.0-rc.0", + "@angular/cdk": "19.2.0-next.0", "@angular/cli": "19.1.0-rc.0", - "@angular/material": "19.1.0-rc.0", + "@angular/material": "19.2.0-next.0", "@angular/ssr": "19.1.0-rc.0", "@babel/cli": "7.26.4", "@babel/core": "7.26.0", diff --git a/yarn.lock b/yarn.lock index 12fb873ee5f0..349bdf97bd6d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -374,10 +374,10 @@ optionalDependencies: lmdb "3.2.2" -"@angular/cdk@19.1.0-rc.0": - version "19.1.0-rc.0" - resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-19.1.0-rc.0.tgz#0ce5d350b6198d53a3e5e70f8a1d69836053279a" - integrity sha512-uU//V0eUFoC9m1iJX6np3z+Ss+uww/iEl+Qsfi1WnTWALt0lE2v+vyF9OmFJz6LnEZRTczcG+K/Aj1DcJE0CtA== +"@angular/cdk@19.2.0-next.0": + version "19.2.0-next.0" + resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-19.2.0-next.0.tgz#1ae58abf35f3b355feb5ace5bed35753eff1fca4" + integrity sha512-QtCNjgobncqbiVGEOfK3l5ieI6O5O4eMH/c7iZTQr+wThnoM9EX64D/GyzW1KbPR2P546EFmZqrTtu2HhBQX6A== dependencies: tslib "^2.3.0" optionalDependencies: @@ -420,10 +420,10 @@ dependencies: tslib "^2.3.0" -"@angular/material@19.1.0-rc.0": - version "19.1.0-rc.0" - resolved "https://registry.yarnpkg.com/@angular/material/-/material-19.1.0-rc.0.tgz#d7a63ab12df03e6bd755fc391e9cbf8faaeb87a1" - integrity sha512-mLobhkm2Cc6+QqiNQbZ/k8yfSyES02FXv/CoeZgrFINsmYHDuBTVbe0KsR4Xhs1lNYqalyLMvbypJ5WzWT3TYw== +"@angular/material@19.2.0-next.0": + version "19.2.0-next.0" + resolved "https://registry.yarnpkg.com/@angular/material/-/material-19.2.0-next.0.tgz#08f189a839dc61e72e58dc750ed88e7497a2918a" + integrity sha512-UNx+qtHyCGI0BL0IonAu0cwkoi7N8kT8JthuX5DTl+1Ks8CESnUxk/4dIzWGGObmbMXhNp92yyM29ncqTxb9Ag== dependencies: tslib "^2.3.0" From b76be83b4d311c8cae54c0c2e7553768946138eb Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Thu, 16 Jan 2025 19:41:38 +0100 Subject: [PATCH 0116/1220] fix(core): animation sometimes renderer not being destroyed during HMR (#59574) These changes aim to resolve the issue that prompted #59514. The animations module is a bit tricky for HMR, because it schedules the destruction of its renderer after the currently-running animations are done. If there are no running animations, the renderer gets destroyed next time around. This is a problem, because it means that the styles can stay around for a long time. These changes resolve the issue by: 1. Moving the cleanup of the renderer to after the destruction of the old view. This ensures that the usual clean up flow has been kicked off. 2. Flushing the animations when a component is replaced to ensure that the renderer is cleaned up in a timely manner. PR Close #59574 --- .../browser/src/render/animation_renderer.ts | 2 ++ packages/core/src/render3/hmr.ts | 17 +++++++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/packages/animations/browser/src/render/animation_renderer.ts b/packages/animations/browser/src/render/animation_renderer.ts index 6c13d9d51f60..8139f6bb597d 100644 --- a/packages/animations/browser/src/render/animation_renderer.ts +++ b/packages/animations/browser/src/render/animation_renderer.ts @@ -138,6 +138,8 @@ export class AnimationRendererFactory implements RendererFactory2 { * @param componentId ID of the component that is being replaced. */ protected componentReplaced(componentId: string) { + // Flush the engine since the renderer destruction waits for animations to be done. + this.engine.flush(); (this.delegate as {componentReplaced?: (id: string) => void}).componentReplaced?.(componentId); } } diff --git a/packages/core/src/render3/hmr.ts b/packages/core/src/render3/hmr.ts index d67f9fdc1aa8..982318183105 100644 --- a/packages/core/src/render3/hmr.ts +++ b/packages/core/src/render3/hmr.ts @@ -36,6 +36,7 @@ import { LViewFlags, NEXT, PARENT, + RENDERER, T_HOST, TVIEW, } from './interfaces/view'; @@ -156,11 +157,6 @@ function recreateLView( // Recreate the TView since the template might've changed. const newTView = getOrCreateComponentTView(newDef); - // Always force the creation of a new renderer to ensure state captured during construction - // stays consistent with the new component definition by clearing any old cached factories. - const rendererFactory = lView[ENVIRONMENT].rendererFactory; - clearRendererCache(rendererFactory, oldDef); - // Create a new LView from the new TView, but reusing the existing TNode and DOM node. const newLView = createLView( parentLView, @@ -170,7 +166,7 @@ function recreateLView( host, tNode, null, - rendererFactory.createRenderer(host, newDef), + null, // The renderer will be created a bit further down once the old one is destroyed. null, null, null, @@ -183,6 +179,15 @@ function recreateLView( // Destroy the detached LView. destroyLView(lView[TVIEW], lView); + // Always force the creation of a new renderer to ensure state captured during construction + // stays consistent with the new component definition by clearing any old ached factories. + const rendererFactory = lView[ENVIRONMENT].rendererFactory; + clearRendererCache(rendererFactory, oldDef); + + // Patch a brand-new renderer onto the new view only after the old + // view is destroyed so that the runtime doesn't try to reuse it. + newLView[RENDERER] = rendererFactory.createRenderer(host, newDef); + // Remove the nodes associated with the destroyed LView. This removes the // descendants, but not the host which we want to stay in place. removeViewFromDOM(lView[TVIEW], lView); From c51c66ef1e6123758832b4e3a1e8f9bc3663885c Mon Sep 17 00:00:00 2001 From: arturovt Date: Thu, 9 Jan 2025 22:10:59 +0200 Subject: [PATCH 0117/1220] refactor(router): drop forRoot guard in production (#59458) In this commit, we switch from decorators (which also produce redundant metadata, such as in the `declareFactory` instruction) to the `inject` function to drop the `ROUTER_FORROOT_GUARD` token in production. This token factory function is only in development mode but is still referenced in the constructor due to the `@Inject(ROUTER_FORROOT_GUARD)` decorator. PR Close #59458 --- goldens/public-api/router/index.api.md | 4 ++-- packages/router/src/router_module.ts | 24 ++++++++++++++---------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/goldens/public-api/router/index.api.md b/goldens/public-api/router/index.api.md index 51d17fc9fdf1..083eb4fe69a9 100644 --- a/goldens/public-api/router/index.api.md +++ b/goldens/public-api/router/index.api.md @@ -861,11 +861,11 @@ export class RouterLinkActive implements OnChanges, OnDestroy, AfterContentInit // @public export class RouterModule { - constructor(guard: any); + constructor(); static forChild(routes: Routes): ModuleWithProviders; static forRoot(routes: Routes, config?: ExtraOptions): ModuleWithProviders; // (undocumented) - static ɵfac: i0.ɵɵFactoryDeclaration; + static ɵfac: i0.ɵɵFactoryDeclaration; // (undocumented) static ɵinj: i0.ɵɵInjectorDeclaration; // (undocumented) diff --git a/packages/router/src/router_module.ts b/packages/router/src/router_module.ts index 7fe1bbf4fae9..165b84d8c888 100644 --- a/packages/router/src/router_module.ts +++ b/packages/router/src/router_module.ts @@ -63,9 +63,7 @@ const ROUTER_DIRECTIVES = [RouterOutlet, RouterLink, RouterLinkActive, EmptyOutl * @docsNotRequired */ export const ROUTER_FORROOT_GUARD = new InjectionToken( - typeof ngDevMode === 'undefined' || ngDevMode - ? 'router duplicate forRoot guard' - : 'ROUTER_FORROOT_GUARD', + typeof ngDevMode === 'undefined' || ngDevMode ? 'router duplicate forRoot guard' : '', ); // TODO(atscott): All of these except `ActivatedRoute` are `providedIn: 'root'`. They are only kept @@ -112,7 +110,11 @@ export const ROUTER_PROVIDERS: Provider[] = [ exports: ROUTER_DIRECTIVES, }) export class RouterModule { - constructor(@Optional() @Inject(ROUTER_FORROOT_GUARD) guard: any) {} + constructor() { + if (typeof ngDevMode === 'undefined' || ngDevMode) { + inject(ROUTER_FORROOT_GUARD, {optional: true}); + } + } /** * Creates and configures a module with all the router providers and directives. @@ -143,11 +145,13 @@ export class RouterModule { : [] : [], {provide: ROUTES, multi: true, useValue: routes}, - { - provide: ROUTER_FORROOT_GUARD, - useFactory: provideForRootGuard, - deps: [[Router, new Optional(), new SkipSelf()]], - }, + typeof ngDevMode === 'undefined' || ngDevMode + ? { + provide: ROUTER_FORROOT_GUARD, + useFactory: provideForRootGuard, + deps: [[Router, new Optional(), new SkipSelf()]], + } + : [], config?.errorHandler ? { provide: NAVIGATION_ERROR_HANDLER, @@ -224,7 +228,7 @@ function providePathLocationStrategy(): Provider { } export function provideForRootGuard(router: Router): any { - if ((typeof ngDevMode === 'undefined' || ngDevMode) && router) { + if (router) { throw new RuntimeError( RuntimeErrorCode.FOR_ROOT_CALLED_TWICE, `The Router was provided more than once. This can happen if 'forRoot' is used outside of the root injector.` + From f6e97763cfab9fa2bea6e6b1303b64f1b499c3ef Mon Sep 17 00:00:00 2001 From: arturovt Date: Sun, 12 Jan 2025 20:51:39 +0200 Subject: [PATCH 0118/1220] fix(core): cleanup `_ejsa` when app is destroyed (#59492) In this commit, we delete `_ejsa` when the app is destroyed, ensuring that no elements are still captured in the global list and are not prevented from being garbage collected. PR Close #59492 --- packages/core/src/hydration/event_replay.ts | 14 +++++++- .../platform-server/test/event_replay_spec.ts | 36 ++++++++++++++++++- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/packages/core/src/hydration/event_replay.ts b/packages/core/src/hydration/event_replay.ts index ce26374f0787..d1065ddea4ea 100644 --- a/packages/core/src/hydration/event_replay.ts +++ b/packages/core/src/hydration/event_replay.ts @@ -118,8 +118,10 @@ export function withEventReplay(): Provider[] { { provide: APP_BOOTSTRAP_LISTENER, useFactory: () => { + const appId = inject(APP_ID); const injector = inject(Injector); const appRef = inject(ApplicationRef); + return () => { // We have to check for the appRef here due to the possibility of multiple apps // being present on the same page. We only want to enable event replay for the @@ -129,7 +131,17 @@ export function withEventReplay(): Provider[] { } appsWithEventReplay.add(appRef); - appRef.onDestroy(() => appsWithEventReplay.delete(appRef)); + + appRef.onDestroy(() => { + appsWithEventReplay.delete(appRef); + // Ensure that we're always safe calling this in the browser. + if (typeof ngServerMode !== 'undefined' && !ngServerMode) { + // `_ejsa` should be deleted when the app is destroyed, ensuring that + // no elements are still captured in the global list and are not prevented + // from being garbage collected. + clearAppScopedEarlyEventContract(appId); + } + }); // Kick off event replay logic once hydration for the initial part // of the application is completed. This timing is similar to the unclaimed diff --git a/packages/platform-server/test/event_replay_spec.ts b/packages/platform-server/test/event_replay_spec.ts index 26700c7f29c8..0fafae9b3f69 100644 --- a/packages/platform-server/test/event_replay_spec.ts +++ b/packages/platform-server/test/event_replay_spec.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -import {Component, destroyPlatform, ErrorHandler, PLATFORM_ID, Type} from '@angular/core'; +import {APP_ID, Component, destroyPlatform, ErrorHandler, PLATFORM_ID, Type} from '@angular/core'; import { withEventReplay, bootstrapApplication, @@ -142,6 +142,40 @@ describe('event replay', () => { expect(onClickSpy).toHaveBeenCalled(); }); + it('should cleanup `window._ejsas[appId]` once app is destroyed', async () => { + @Component({ + selector: 'app', + standalone: true, + template: ` + + `, + }) + class AppComponent { + onClick() {} + } + + const html = await ssr(AppComponent); + const ssrContents = getAppContents(html); + const doc = getDocument(); + + prepareEnvironment(doc, ssrContents); + resetTViewsFor(AppComponent); + + const btn = doc.getElementById('btn')!; + btn.click(); + + const appRef = await hydrate(doc, AppComponent, { + hydrationFeatures: () => [withEventReplay()], + }); + appRef.tick(); + const appId = appRef.injector.get(APP_ID); + + appRef.destroy(); + // This ensure that `_ejsas` for the current application is cleaned up + // once the application is destroyed. + expect(window._ejsas![appId]).toBeUndefined(); + }); + it('should route to the appropriate component with content projection', async () => { const outerOnClickSpy = jasmine.createSpy(); const innerOnClickSpy = jasmine.createSpy(); From 8ea691a9d8af85ab03cc8a3039feaad3ed679889 Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Thu, 16 Jan 2025 18:11:30 -0800 Subject: [PATCH 0119/1220] test(platform-server): fix flaky hydration test (#59579) This commit updates testing setup logic to apply correct `document` reference, which should be used by the runtime. Previously, the timing of that operation was less predictable and in some cases led to reusing document state from previous tests. PR Close #59579 --- packages/platform-server/test/dom_utils.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/platform-server/test/dom_utils.ts b/packages/platform-server/test/dom_utils.ts index 20c42a755b73..57219253a44a 100644 --- a/packages/platform-server/test/dom_utils.ts +++ b/packages/platform-server/test/dom_utils.ts @@ -93,18 +93,20 @@ export function hydrate( hydrationFeatures?: () => HydrationFeature[]; } = {}, ) { - function _document(): any { - ɵsetDocument(doc); - global.document = doc; // needed for `DefaultDomRenderer2` - return doc; - } - const {envProviders = [], hydrationFeatures = () => []} = options; + // Apply correct reference to the `document` object, + // which will be used by runtime. + ɵsetDocument(doc); + + // Define `document` to make `DefaultDomRenderer2` work, since it + // references `document` directly to create style tags. + global.document = doc; + const providers = [ ...envProviders, {provide: PLATFORM_ID, useValue: 'browser'}, - {provide: DOCUMENT, useFactory: _document, deps: []}, + {provide: DOCUMENT, useFactory: () => doc}, provideClientHydration(...hydrationFeatures()), ]; From 4e6017a9f5cda389c5fbf4f2c1519ce1bba23e11 Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Thu, 16 Jan 2025 21:24:50 -0800 Subject: [PATCH 0120/1220] test(platform-server): fix flaky incremental hydration test (#59584) This commit updates a test setup to define a global `ngServerMode` correctly for a test that was emulating client-only behavior. The flag could've been set by prior tests and depending on its state, the test was acting differently. PR Close #59584 --- .../test/incremental_hydration_spec.ts | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/packages/platform-server/test/incremental_hydration_spec.ts b/packages/platform-server/test/incremental_hydration_spec.ts index 7c55819c70f0..4be2b69ef28f 100644 --- a/packages/platform-server/test/incremental_hydration_spec.ts +++ b/packages/platform-server/test/incremental_hydration_spec.ts @@ -1822,6 +1822,9 @@ describe('platform-server partial hydration integration', () => { describe('client side navigation', () => { beforeEach(() => { + // This test emulates client-side behavior, set global server mode flag to `false`. + globalThis['ngServerMode'] = false; + TestBed.configureTestingModule({ providers: [ {provide: PLATFORM_ID, useValue: PLATFORM_BROWSER_ID}, @@ -1830,32 +1833,28 @@ describe('platform-server partial hydration integration', () => { }); }); + afterEach(() => { + globalThis['ngServerMode'] = undefined; + }); + it('should not try to hydrate in CSR only cases', async () => { @Component({ selector: 'app', template: ` -
- @defer (hydrate when true) { -
- defer block rendered! - {{value()}} -
- } @placeholder { - Outer block placeholder - } -
+ @defer (hydrate when true; on interaction) { +

Defer block rendered!

+ } @placeholder { + Outer block placeholder + } `, }) - class SimpleComponent { - value = signal('start'); - fnA() {} - fnB() { - this.value.set('end'); - } - } + class SimpleComponent {} + const fixture = TestBed.createComponent(SimpleComponent); fixture.detectChanges(); + // Verify that `hydrate when true` doesn't trigger rendering of the main + // content in client-only use-cases (expecting to see placeholder content). expect(fixture.nativeElement.innerHTML).toContain('Outer block placeholder'); }); }); From 35e5bbb0dcc07563717617dc0d552884c88d515f Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Thu, 16 Jan 2025 18:03:12 +0100 Subject: [PATCH 0121/1220] refactor(core): reuse setupStaticAttributes in ComponentRef (#59572) This change refactor how the dynamically created component deals with attributes in order to reuse the existing setupStaticAttributes logic (instead of having specific and similar code). PR Close #59572 --- packages/core/src/render3/component_ref.ts | 101 +++++++----------- .../core/src/render3/node_manipulation.ts | 2 +- .../bundle.golden_symbols.json | 2 - .../animations/bundle.golden_symbols.json | 2 - .../cyclic_import/bundle.golden_symbols.json | 2 - .../bundling/defer/bundle.golden_symbols.json | 2 - .../forms_reactive/bundle.golden_symbols.json | 2 - .../bundle.golden_symbols.json | 2 - .../hello_world/bundle.golden_symbols.json | 2 - .../hydration/bundle.golden_symbols.json | 2 - .../router/bundle.golden_symbols.json | 2 - .../bundle.golden_symbols.json | 2 - .../bundling/todo/bundle.golden_symbols.json | 2 - .../platform-server/test/integration_spec.ts | 2 +- 14 files changed, 43 insertions(+), 84 deletions(-) diff --git a/packages/core/src/render3/component_ref.ts b/packages/core/src/render3/component_ref.ts index 8dd06b1e7e83..4c02e57e687a 100644 --- a/packages/core/src/render3/component_ref.ts +++ b/packages/core/src/render3/component_ref.ts @@ -26,7 +26,7 @@ import { import {ComponentFactoryResolver as AbstractComponentFactoryResolver} from '../linker/component_factory_resolver'; import {createElementRef, ElementRef} from '../linker/element_ref'; import {NgModuleRef} from '../linker/ng_module_factory'; -import {Renderer2, RendererFactory2} from '../render/api'; +import {RendererFactory2} from '../render/api'; import {Sanitizer} from '../sanitization/sanitizer'; import {assertDefined, assertGreaterThan, assertIndexInRange} from '../util/assert'; @@ -56,13 +56,13 @@ import {ComponentDef, DirectiveDef, HostDirectiveDefs} from './interfaces/defini import {InputFlags} from './interfaces/input_flags'; import { NodeInputBindings, + TAttributes, TContainerNode, TElementContainerNode, TElementNode, TNode, TNodeType, } from './interfaces/node'; -import {Renderer} from './interfaces/renderer'; import {RElement, RNode} from './interfaces/renderer_dom'; import { CONTEXT, @@ -75,14 +75,16 @@ import { TViewType, } from './interfaces/view'; import {MATH_ML_NAMESPACE, SVG_NAMESPACE} from './namespaces'; -import {setupStaticAttributes, writeDirectClass} from './node_manipulation'; + +import {createElementNode} from './dom_node_manipulation'; +import {setupStaticAttributes} from './node_manipulation'; import { extractAttrsAndClassesFromSelector, stringifyCSSSelectorList, } from './node_selector_matcher'; import {enterView, getCurrentTNode, getLView, leaveView} from './state'; import {computeStaticStyling} from './styling/static_styling'; -import {mergeHostAttrs, setUpAttributes} from './util/attrs_utils'; +import {mergeHostAttrs} from './util/attrs_utils'; import {debugStringifyTypeForError, stringifyForError} from './util/stringify_utils'; import {getComponentLViewByIndex, getNativeByTNode, getTNode} from './util/view_utils'; import {ViewRef} from './view_ref'; @@ -91,7 +93,8 @@ import {unregisterLView} from './interfaces/lview_tracking'; import {profiler} from './profiler'; import {ProfilerEvent} from './profiler_types'; import {executeContentQueries} from './queries/query_execution'; -import {createElementNode} from './dom_node_manipulation'; +import {AttributeMarker} from './interfaces/attribute_marker'; +import {CssSelector} from './interfaces/projection'; export class ComponentFactoryResolver extends AbstractComponentFactoryResolver { /** @@ -160,6 +163,18 @@ function getNamespace(elementName: string): string | null { return name === 'svg' ? SVG_NAMESPACE : name === 'math' ? MATH_ML_NAMESPACE : null; } +// TODO(pk): change the extractAttrsAndClassesFromSelector so it returns TAttributes already? +function getRootTAttributesFromSelector(selector: CssSelector) { + const {attrs, classes} = extractAttrsAndClassesFromSelector(selector); + + const tAtts: TAttributes = attrs; + if (classes.length) { + tAtts.push(AttributeMarker.Classes, ...classes); + } + + return tAtts; +} + /** * ComponentFactory interface implementation. */ @@ -359,6 +374,26 @@ export class ComponentFactory extends AbstractComponentFactory { } const hostTNode = createRootComponentTNode(rootLView, hostRNode); + // 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. + getRootTAttributesFromSelector(this.componentDef.selectors[0]); + + for (const def of rootDirectives) { + hostTNode.mergedAttrs = mergeHostAttrs(hostTNode.mergedAttrs, def.hostAttrs); + } + 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. + if (hostRNode) { + setupStaticAttributes(hostRenderer, hostRNode, hostTNode); + } + componentView = createRootComponentView( hostTNode, hostRNode, @@ -366,20 +401,12 @@ export class ComponentFactory extends AbstractComponentFactory { rootDirectives, rootLView, environment, - hostRenderer, ); tElementNode = getTNode(rootTView, HEADER_OFFSET) as TElementNode; - // 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) { - setRootNodeAttributes(hostRenderer, rootComponentDef, hostRNode, rootSelectorOrNode); - } - if (projectableNodes !== undefined) { - projectNodes(tElementNode, this.ngContentSelectors, projectableNodes); + projectNodes(hostTNode, this.ngContentSelectors, projectableNodes); } // TODO: should LifecycleHooksFeature and other host features be generated by the compiler @@ -528,10 +555,8 @@ function createRootComponentView( rootDirectives: DirectiveDef[], rootView: LView, environment: LViewEnvironment, - hostRenderer: Renderer, ): LView { const tView = rootView[TVIEW]; - applyRootComponentStyling(rootDirectives, tNode, hostRNode, hostRenderer); // Hydration info is on the host element and needs to be retrieved // and passed to the component LView. @@ -564,26 +589,6 @@ function createRootComponentView( return (rootView[tNode.index] = componentView); } -/** Sets up the styling information on a root component. */ -function applyRootComponentStyling( - rootDirectives: DirectiveDef[], - tNode: TElementNode, - rNode: RElement | null, - hostRenderer: Renderer, -): void { - for (const def of rootDirectives) { - tNode.mergedAttrs = mergeHostAttrs(tNode.mergedAttrs, def.hostAttrs); - } - - if (tNode.mergedAttrs !== null) { - computeStaticStyling(tNode, tNode.mergedAttrs, true); - - if (rNode !== null) { - setupStaticAttributes(hostRenderer, rNode, tNode); - } - } -} - /** * Creates a root component and sets it up with features and host bindings.Shared by * renderComponent() and ViewContainerRef.createComponent(). @@ -640,30 +645,6 @@ function createRootComponent( return component; } -/** Sets the static attributes on a root component. */ -function setRootNodeAttributes( - hostRenderer: Renderer2, - componentDef: ComponentDef, - hostRNode: RElement, - rootSelectorOrNode: any, -) { - if (rootSelectorOrNode) { - // The placeholder will be replaced with the actual version at build time. - setUpAttributes(hostRenderer, hostRNode, ['ng-version', '0.0.0-PLACEHOLDER']); - } else { - // If host element is created as a part of this function call (i.e. `rootSelectorOrNode` - // is not defined), also apply attributes and classes extracted from component selector. - // Extract attributes and classes from the first selector only to match VE behavior. - const {attrs, classes} = extractAttrsAndClassesFromSelector(componentDef.selectors[0]); - if (attrs) { - setUpAttributes(hostRenderer, hostRNode, attrs); - } - if (classes && classes.length > 0) { - writeDirectClass(hostRenderer, hostRNode, classes.join(' ')); - } - } -} - /** Projects the `projectableNodes` that were specified when creating a root component. */ function projectNodes( tNode: TElementNode, diff --git a/packages/core/src/render3/node_manipulation.ts b/packages/core/src/render3/node_manipulation.ts index 8b258f65a4cb..8bb89605c57e 100644 --- a/packages/core/src/render3/node_manipulation.ts +++ b/packages/core/src/render3/node_manipulation.ts @@ -1169,7 +1169,7 @@ function writeDirectStyle(renderer: Renderer, element: RElement, newValue: strin * @param element The element which needs to be updated. * @param newValue The new class list to write. */ -export function writeDirectClass(renderer: Renderer, element: RElement, newValue: string) { +function writeDirectClass(renderer: Renderer, element: RElement, newValue: string) { ngDevMode && assertString(newValue, "'newValue' should be a string"); if (newValue === '') { // There are tests in `google3` which expect `element.getAttribute('class')` to be `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 8a87f31dbe3f..eeaca8775b63 100644 --- a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json @@ -468,7 +468,6 @@ "setIsRefreshingViews", "setSelectedIndex", "setStyles", - "setUpAttributes", "setupStaticAttributes", "shimStylesContent", "shouldSearchParent", @@ -489,7 +488,6 @@ "viewShouldHaveReactiveConsumer", "visitDslNode", "walkProviderTree", - "writeDirectClass", "writeToDirectiveInput", "ɵɵdefineComponent", "ɵɵdefineInjectable", diff --git a/packages/core/test/bundling/animations/bundle.golden_symbols.json b/packages/core/test/bundling/animations/bundle.golden_symbols.json index a5b955213032..acbb5dddadc2 100644 --- a/packages/core/test/bundling/animations/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations/bundle.golden_symbols.json @@ -494,7 +494,6 @@ "setIsRefreshingViews", "setSelectedIndex", "setStyles", - "setUpAttributes", "setupStaticAttributes", "shimStylesContent", "shouldSearchParent", @@ -515,7 +514,6 @@ "viewShouldHaveReactiveConsumer", "visitDslNode", "walkProviderTree", - "writeDirectClass", "writeToDirectiveInput", "ɵɵdefineComponent", "ɵɵdefineInjectable", 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 74f1193c5e0e..84033396a41f 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -400,7 +400,6 @@ "setInputsFromAttrs", "setIsRefreshingViews", "setSelectedIndex", - "setUpAttributes", "setupStaticAttributes", "shimStylesContent", "shouldSearchParent", @@ -419,7 +418,6 @@ "viewShouldHaveReactiveConsumer", "walkProviderTree", "wasLastNodeCreated", - "writeDirectClass", "writeToDirectiveInput", "ɵɵdefineComponent", "ɵɵdefineInjectable", diff --git a/packages/core/test/bundling/defer/bundle.golden_symbols.json b/packages/core/test/bundling/defer/bundle.golden_symbols.json index a7d6aaf880b6..50f3d4a879c7 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -858,7 +858,6 @@ "setInputsFromAttrs", "setIsRefreshingViews", "setSelectedIndex", - "setUpAttributes", "setupStaticAttributes", "shimStylesContent", "shouldAttachRegularTrigger", @@ -880,7 +879,6 @@ "viewShouldHaveReactiveConsumer", "walkProviderTree", "wasLastNodeCreated", - "writeDirectClass", "writeToDirectiveInput", "ɵɵdefer", "ɵɵdefineComponent", 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 7f4a1c57a68a..0f35ebd2f784 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -596,7 +596,6 @@ "setTStylingRangeNext", "setTStylingRangeNextDuplicate", "setTStylingRangePrevDuplicate", - "setUpAttributes", "setUpControl", "setUpValidators", "setupStaticAttributes", @@ -630,7 +629,6 @@ "walkProviderTree", "wasLastNodeCreated", "wrapListener", - "writeDirectClass", "writeToDirectiveInput", "{getPrototypeOf:getPrototypeOf,prototype:objectProto,keys:getKeys}", "{isArray:isArray2}", 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 affc8faf5778..a61bf78ddd7c 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 @@ -589,7 +589,6 @@ "setTStylingRangeNext", "setTStylingRangeNextDuplicate", "setTStylingRangePrevDuplicate", - "setUpAttributes", "setUpControl", "setUpValidators", "setupStaticAttributes", @@ -623,7 +622,6 @@ "walkProviderTree", "wasLastNodeCreated", "wrapListener", - "writeDirectClass", "writeToDirectiveInput", "{getPrototypeOf:getPrototypeOf,prototype:objectProto,keys:getKeys}", "{isArray:isArray2}", 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 068f9e07976c..f267aee51667 100644 --- a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json @@ -314,7 +314,6 @@ "setInjectImplementation", "setIsRefreshingViews", "setSelectedIndex", - "setUpAttributes", "shouldSearchParent", "storeLViewOnDestroy", "stringify", @@ -330,7 +329,6 @@ "viewAttachedToChangeDetector", "viewShouldHaveReactiveConsumer", "walkProviderTree", - "writeDirectClass", "writeToDirectiveInput", "ɵɵdefineInjectable", "ɵɵdefineInjector", diff --git a/packages/core/test/bundling/hydration/bundle.golden_symbols.json b/packages/core/test/bundling/hydration/bundle.golden_symbols.json index 4697b77f39b0..e313ef71e5bc 100644 --- a/packages/core/test/bundling/hydration/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hydration/bundle.golden_symbols.json @@ -423,7 +423,6 @@ "setIsRefreshingViews", "setSegmentHead", "setSelectedIndex", - "setUpAttributes", "shimStylesContent", "shouldSearchParent", "siblingAfter", @@ -445,7 +444,6 @@ "viewShouldHaveReactiveConsumer", "walkProviderTree", "withDomHydration", - "writeDirectClass", "writeToDirectiveInput", "ɵɵdefineComponent", "ɵɵdefineInjectable", diff --git a/packages/core/test/bundling/router/bundle.golden_symbols.json b/packages/core/test/bundling/router/bundle.golden_symbols.json index 344b048f3fb1..64acc95337d4 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -677,7 +677,6 @@ "setIsRefreshingViews", "setRouterState", "setSelectedIndex", - "setUpAttributes", "setupStaticAttributes", "shallowEqual", "shimStylesContent", @@ -723,7 +722,6 @@ "wasLastNodeCreated", "wrapIntoObservable", "wrapListener", - "writeDirectClass", "writeToDirectiveInput", "{getPrototypeOf:getPrototypeOf,prototype:objectProto,keys:getKeys}", "{isArray:isArray2}", 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 c72a093c813c..0b5b4deb652b 100644 --- a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json +++ b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json @@ -349,7 +349,6 @@ "setInjectImplementation", "setIsRefreshingViews", "setSelectedIndex", - "setUpAttributes", "shimStylesContent", "shouldSearchParent", "storeLViewOnDestroy", @@ -366,7 +365,6 @@ "viewAttachedToChangeDetector", "viewShouldHaveReactiveConsumer", "walkProviderTree", - "writeDirectClass", "writeToDirectiveInput", "ɵɵdefineComponent", "ɵɵdefineInjectable", diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index aded62dbc779..4fe2dde60069 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -477,7 +477,6 @@ "setTStylingRangeNext", "setTStylingRangeNextDuplicate", "setTStylingRangePrevDuplicate", - "setUpAttributes", "setupStaticAttributes", "shimStylesContent", "shouldAddViewToDom", @@ -501,7 +500,6 @@ "walkProviderTree", "wasLastNodeCreated", "wrapListener", - "writeDirectClass", "writeToDirectiveInput", "ɵɵadvance", "ɵɵclassProp", diff --git a/packages/platform-server/test/integration_spec.ts b/packages/platform-server/test/integration_spec.ts index 153a5e512d5b..0505df4addc9 100644 --- a/packages/platform-server/test/integration_spec.ts +++ b/packages/platform-server/test/integration_spec.ts @@ -973,7 +973,7 @@ class HiddenModule {} }); const output = await bootstrap; expect(output).toMatch( - //, + //, ); }); From 14791f3e1200f3673aca772cede07338c8b05780 Mon Sep 17 00:00:00 2001 From: arturovt Date: Fri, 17 Jan 2025 16:49:49 +0200 Subject: [PATCH 0122/1220] fix(core): cleanup stash listener when app is destroyed (#59598) In this commit, we clean up the reference to the function set by the environment initializer, as the function closure may capture injected elements and prevent them from being properly garbage collected. PR Close #59598 --- packages/core/src/hydration/event_replay.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/core/src/hydration/event_replay.ts b/packages/core/src/hydration/event_replay.ts index d1065ddea4ea..93dca86a3cfe 100644 --- a/packages/core/src/hydration/event_replay.ts +++ b/packages/core/src/hydration/event_replay.ts @@ -140,6 +140,10 @@ export function withEventReplay(): Provider[] { // no elements are still captured in the global list and are not prevented // from being garbage collected. clearAppScopedEarlyEventContract(appId); + // Clean up the reference to the function set by the environment initializer, + // as the function closure may capture injected elements and prevent them + // from being properly garbage collected. + setStashFn(() => {}); } }); From 16b08853bcd3719aec1781949e8adcf0e558a033 Mon Sep 17 00:00:00 2001 From: Matt Janssen Date: Thu, 16 Jan 2025 14:53:29 +0100 Subject: [PATCH 0123/1220] docs(router): Fix small grammatical errors (#59568) Improves readability. PR Close #59568 --- packages/router/src/models.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/router/src/models.ts b/packages/router/src/models.ts index 5582666dd8c2..485bc7388da7 100644 --- a/packages/router/src/models.ts +++ b/packages/router/src/models.ts @@ -22,19 +22,19 @@ import type {UrlSegment, UrlSegmentGroup, UrlTree} from './url_tree'; /** * How to handle a navigation request to the current URL. One of: * - * - `'ignore'` : The router ignores the request it is the same as the current state. + * - `'ignore'` : The router ignores the request if it is the same as the current state. * - `'reload'` : The router processes the URL even if it is not different from the current state. - * One example of when you might want this option is if a `canMatch` guard depends on + * One example of when you might want to use this option is if a `canMatch` guard depends on the * application state and initially rejects navigation to a route. After fixing the state, you want - * to re-navigate to the same URL so the route with the `canMatch` guard can activate. + * to re-navigate to the same URL so that the route with the `canMatch` guard can activate. * - * Note that this only configures whether the Route reprocesses the URL and triggers related - * action and events like redirects, guards, and resolvers. By default, the router re-uses a + * Note that this only configures whether or not the Route reprocesses the URL and triggers related + * actions and events like redirects, guards, and resolvers. By default, the router re-uses a * component instance when it re-navigates to the same component type without visiting a different * component first. This behavior is configured by the `RouteReuseStrategy`. In order to reload * routed components on same url navigation, you need to set `onSameUrlNavigation` to `'reload'` * _and_ provide a `RouteReuseStrategy` which returns `false` for `shouldReuseRoute`. Additionally, - * resolvers and most guards for routes do not run unless the path or path params changed + * resolvers and most guards for routes do not run unless the path or path params have changed * (configured by `runGuardsAndResolvers`). * * @publicApi @@ -47,7 +47,7 @@ export type OnSameUrlNavigation = 'reload' | 'ignore'; /** * The `InjectionToken` and `@Injectable` classes for guards and resolvers are deprecated in favor - * of plain JavaScript functions instead.. Dependency injection can still be achieved using the + * of plain JavaScript functions instead. Dependency injection can still be achieved using the * [`inject`](api/core/inject) function from `@angular/core` and an injectable class can be used as * a functional guard using [`inject`](api/core/inject): `canActivate: [() => * inject(myGuard).canActivate()]`. From 2caa45a6e17cd304c9b815bad75b9e753f741645 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Fri, 17 Jan 2025 14:07:47 +0100 Subject: [PATCH 0124/1220] fix(core): HMR not matching component that injects ViewContainerRef (#59596) If a component injects `ViewContainerRef`, its `LView` gets wrapped in an empty `LContainer` and the container's host becomes the `LView`. The HMR logic wasn't accounting for this which meant that such components wouldn't be replaced. Fixes #59592. PR Close #59596 --- packages/core/src/render3/hmr.ts | 9 +++- packages/core/test/acceptance/hmr_spec.ts | 53 +++++++++++++++++++++++ 2 files changed, 60 insertions(+), 2 deletions(-) diff --git a/packages/core/src/render3/hmr.ts b/packages/core/src/render3/hmr.ts index 982318183105..5ec36916de27 100644 --- a/packages/core/src/render3/hmr.ts +++ b/packages/core/src/render3/hmr.ts @@ -109,8 +109,13 @@ function recreateMatchingLViews(oldDef: ComponentDef, rootLView: LView) const current = rootLView[i]; if (isLContainer(current)) { - for (let i = CONTAINER_HEADER_OFFSET; i < current.length; i++) { - recreateMatchingLViews(oldDef, current[i]); + // The host can be an LView if a component is injecting `ViewContainerRef`. + if (isLView(current[HOST])) { + recreateMatchingLViews(oldDef, current[HOST]); + } + + for (let j = CONTAINER_HEADER_OFFSET; j < current.length; j++) { + recreateMatchingLViews(oldDef, current[j]); } } else if (isLView(current)) { recreateMatchingLViews(oldDef, current); diff --git a/packages/core/test/acceptance/hmr_spec.ts b/packages/core/test/acceptance/hmr_spec.ts index 558cc0eb4a4e..a3334d818786 100644 --- a/packages/core/test/acceptance/hmr_spec.ts +++ b/packages/core/test/acceptance/hmr_spec.ts @@ -25,6 +25,7 @@ import { Type, ViewChild, ViewChildren, + ViewContainerRef, ɵNG_COMP_DEF, ɵɵreplaceMetadata, } from '@angular/core'; @@ -416,6 +417,58 @@ describe('hot module replacement', () => { verifyNodesWereRecreated(recreatedNodes); }); + it('should be able to replace a component that injects ViewContainerRef', () => { + const initialMetadata: Component = { + selector: 'child-cmp', + standalone: true, + template: 'Hello world', + }; + + @Component(initialMetadata) + class ChildCmp { + vcr = inject(ViewContainerRef); + } + + @Component({ + standalone: true, + imports: [ChildCmp], + template: '', + }) + class RootCmp {} + + const fixture = TestBed.createComponent(RootCmp); + fixture.detectChanges(); + markNodesAsCreatedInitially(fixture.nativeElement); + + expectHTML( + fixture.nativeElement, + ` + + Hello world + + `, + ); + + replaceMetadata(ChildCmp, { + ...initialMetadata, + template: `Hello Bob!`, + }); + fixture.detectChanges(); + + const recreatedNodes = childrenOf(...fixture.nativeElement.querySelectorAll('child-cmp')); + verifyNodesRemainUntouched(fixture.nativeElement, recreatedNodes); + verifyNodesWereRecreated(recreatedNodes); + + expectHTML( + fixture.nativeElement, + ` + + Hello Bob! + + `, + ); + }); + describe('queries', () => { it('should update ViewChildren query results', async () => { @Component({ From f9b13e4e58b5499e0108df841e9f96ca10e0a667 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Fri, 17 Jan 2025 19:03:09 +0100 Subject: [PATCH 0125/1220] fix(compiler-cli): disable tree shaking during HMR (#59595) When HMR is enabled, we need to capture the dependencies used in a template and forward them to the HMR replacement function. One half of this process is static, meaning that we can't change it after the initial compilation. Tree shaking becomes a problem in such a case, because the user can change the template in a way that changes the set of dependencies which will start matching with the static part of the HMR code. These changes disable the tree shaking when HMR is enabled to ensure that the dependencies stay stable. Fixes #59581. PR Close #59595 --- .../annotations/component/src/handler.ts | 25 ++- packages/compiler-cli/test/ngtsc/hmr_spec.ts | 150 +++++++++++++++++- 2 files changed, 167 insertions(+), 8 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 e677334d8816..7c4229718a97 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts @@ -1222,14 +1222,25 @@ export class ComponentDecoratorHandler // Register all Directives and Pipes used at the top level (outside // of any defer blocks), which would be eagerly referenced. const eagerlyUsed = new Set(); - for (const dir of bound.getEagerlyUsedDirectives()) { - eagerlyUsed.add(dir.ref.node); - } - for (const name of bound.getEagerlyUsedPipes()) { - if (!pipes.has(name)) { - continue; + + if (this.enableHmr) { + // In HMR we need to preserve all the dependencies, because they have to remain consistent + // with the initially-generated code no matter what the template looks like. + for (const dep of dependencies) { + if (dep.ref.node !== node) { + eagerlyUsed.add(dep.ref.node); + } + } + } else { + for (const dir of bound.getEagerlyUsedDirectives()) { + eagerlyUsed.add(dir.ref.node); + } + for (const name of bound.getEagerlyUsedPipes()) { + if (!pipes.has(name)) { + continue; + } + eagerlyUsed.add(pipes.get(name)!.ref.node); } - eagerlyUsed.add(pipes.get(name)!.ref.node); } // Set of Directives and Pipes used across the entire template, diff --git a/packages/compiler-cli/test/ngtsc/hmr_spec.ts b/packages/compiler-cli/test/ngtsc/hmr_spec.ts index 419a13b4d887..65ddcad923d5 100644 --- a/packages/compiler-cli/test/ngtsc/hmr_spec.ts +++ b/packages/compiler-cli/test/ngtsc/hmr_spec.ts @@ -291,7 +291,7 @@ runInEachFileSystem(() => { expect(jsContents).toContain('i0.ɵɵdefer(1, 0, Cmp_Defer_1_DepsFn);'); expect(hmrContents).toContain( - 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, Component, Dep) {', + 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, Dep, Component) {', ); expect(hmrContents).toContain('const Cmp_Defer_1_DepsFn = () => [Dep];'); expect(hmrContents).toContain('function Cmp_Defer_0_Template(rf, ctx) {'); @@ -502,5 +502,153 @@ runInEachFileSystem(() => { 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, token, value, Component) {', ); }); + + it('should preserve eager standalone imports in HMR even if they are not used in the template', () => { + enableHmr({ + // Disable class metadata since it can add noise to the test. + supportTestBed: false, + extendedDiagnostics: { + checks: { + // Disable the diagnostic that flags standalone imports since + // we need one to simulate the case we're looking for. + unusedStandaloneImports: 'suppress', + }, + }, + }); + + env.write( + 'dep.ts', + ` + import {Directive} from '@angular/core'; + + @Directive({selector: '[dep]'}) + export class Dep {} + `, + ); + + env.write( + 'test.ts', + ` + import {Component} from '@angular/core'; + import {Dep} from './dep'; + + @Component({ + selector: 'cmp', + template: '', + imports: [Dep], + }) + export class Cmp {} + `, + ); + + env.driveMain(); + + const jsContents = env.getContents('test.js'); + const hmrContents = env.driveHmr('test.ts', 'Cmp'); + + expect(jsContents).toContain('dependencies: [Dep]'); + expect(jsContents).toContain('ɵɵreplaceMetadata(Cmp, m.default, [i0], [Dep]));'); + expect(hmrContents).toContain('function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, Dep) {'); + }); + + it('should preserve eager module imports inside standalone component in HMR even if they are not used in the template', () => { + enableHmr({ + // Disable class metadata since it can add noise to the test. + supportTestBed: false, + }); + + env.write( + 'dep.ts', + ` + import {NgModule, Directive} from '@angular/core'; + + @Directive({selector: '[dep]', standalone: false}) + export class Dep {} + + @NgModule({declarations: [Dep], exports: [Dep]}) + export class DepModule {} + `, + ); + + env.write( + 'test.ts', + ` + import {Component} from '@angular/core'; + import {DepModule} from './dep'; + + @Component({ + selector: 'cmp', + template: '', + imports: [DepModule], + }) + export class Cmp {} + `, + ); + + env.driveMain(); + + const jsContents = env.getContents('test.js'); + 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(hmrContents).toContain('function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, DepModule) {'); + }); + + it('should preserve eager module imports inside non-standalone component in HMR even if they are not used in the template', () => { + enableHmr({ + // Disable class metadata since it can add noise to the test. + supportTestBed: false, + }); + + env.write( + 'dep.ts', + ` + import {NgModule, Directive} from '@angular/core'; + + @Directive({selector: '[dep]', standalone: false}) + export class Dep {} + + @NgModule({declarations: [Dep], exports: [Dep]}) + export class DepModule {} + `, + ); + + env.write( + 'test-module.ts', + ` + import {NgModule} from '@angular/core'; + import {Cmp} from './test'; + import {DepModule} from './dep'; + + @NgModule({imports: [DepModule], declarations: [Cmp], exports: [Cmp]}) + export class CmpModule {} + `, + ); + + env.write( + 'test.ts', + ` + import {Component} from '@angular/core'; + import {DepModule} from './dep'; + + @Component({ + selector: 'cmp', + template: '', + standalone: false, + }) + export class Cmp {} + `, + ); + + env.driveMain(); + + const jsContents = env.getContents('test.js'); + const hmrContents = env.driveHmr('test.ts', 'Cmp'); + + expect(jsContents).toContain('dependencies: [i1.Dep]'); + expect(jsContents).toContain('ɵɵreplaceMetadata(Cmp, m.default, [i0, i1], []));'); + expect(hmrContents).toContain('function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces) {'); + }); }); }); From 30c440475245868b997be25ccbe65ff634be73e9 Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Mon, 20 Jan 2025 07:36:54 +0000 Subject: [PATCH 0126/1220] fix(compiler): update `@ng/component` URL to be relative (#59620) This change is required to resolve https://github.com/angular/angular-cli/pull/29248 and works in conjunction with https://github.com/angular/angular-cli/pull/29386. It ensures that HMR (Hot Module Replacement) functions correctly with `base href`, proxies, and other advanced development setups. PR Close #59620 --- packages/compiler-cli/test/ngtsc/hmr_spec.ts | 4 ++-- packages/compiler/src/render3/r3_hmr_compiler.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/compiler-cli/test/ngtsc/hmr_spec.ts b/packages/compiler-cli/test/ngtsc/hmr_spec.ts index 65ddcad923d5..d746cac4a45d 100644 --- a/packages/compiler-cli/test/ngtsc/hmr_spec.ts +++ b/packages/compiler-cli/test/ngtsc/hmr_spec.ts @@ -106,7 +106,7 @@ runInEachFileSystem(() => { expect(jsContents).toContain(`import * as i0 from "@angular/core";`); 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=test.ts%40Cmp&t=" + encodeURIComponent(t), import.meta.url).href)', ); expect(jsContents).toContain( ').then(m => m.default && i0.ɵɵreplaceMetadata(Cmp, m.default, [i0], ' + @@ -173,7 +173,7 @@ runInEachFileSystem(() => { expect(jsContents).toContain(`import * as i1 from "./dep";`); 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=test.ts%40Cmp&t=" + encodeURIComponent(t), import.meta.url).href)', ); expect(jsContents).toContain( ').then(m => m.default && i0.ɵɵreplaceMetadata(Cmp, m.default, [i0, i1], ' + diff --git a/packages/compiler/src/render3/r3_hmr_compiler.ts b/packages/compiler/src/render3/r3_hmr_compiler.ts index d353a0e910c7..9ced9bec414a 100644 --- a/packages/compiler/src/render3/r3_hmr_compiler.ts +++ b/packages/compiler/src/render3/r3_hmr_compiler.ts @@ -54,7 +54,7 @@ export interface R3HmrNamespaceDependency { */ export function compileHmrInitializer(meta: R3HmrMetadata): o.Expression { const id = encodeURIComponent(`${meta.filePath}@${meta.className}`); - const urlPartial = `/@ng/component?c=${id}&t=`; + const urlPartial = `./@ng/component?c=${id}&t=`; const moduleName = 'm'; const dataName = 'd'; const timestampName = 't'; From 394a683e2aaf95b8c777d2382279446109d10cd3 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Fri, 17 Jan 2025 15:21:32 +0100 Subject: [PATCH 0127/1220] fix(core): handle shadow DOM encapsulated component with HMR (#59597) When a component is created with shadow DOM encapsulation, we attach a shadow root to it. When the component is re-created during HMR, it was throwing an error because only one shadow root can be attached to a node at a time. Since there's no way to detach a shadow root from a node, these changes resolve the issue by making a shallow clone of the element, replacing it and using the clone for any future updates. Fixes #59588. PR Close #59597 --- packages/core/src/render3/hmr.ts | 13 ++++- packages/core/test/acceptance/hmr_spec.ts | 62 ++++++++++++++++++++++- 2 files changed, 73 insertions(+), 2 deletions(-) diff --git a/packages/core/src/render3/hmr.ts b/packages/core/src/render3/hmr.ts index 5ec36916de27..c89b0285ea87 100644 --- a/packages/core/src/render3/hmr.ts +++ b/packages/core/src/render3/hmr.ts @@ -44,6 +44,7 @@ import {assertTNodeType} from './node_assert'; import {destroyLView, removeViewFromDOM} from './node_manipulation'; import {RendererFactory} from './interfaces/renderer'; import {NgZone} from '../zone'; +import {ViewEncapsulation} from '../metadata/view'; /** * Replaces the metadata of a component type and re-renders all live instances of the component. @@ -149,7 +150,7 @@ function recreateLView( lView: LView, ): void { const instance = lView[CONTEXT]; - const host = lView[HOST]!; + let host = lView[HOST]! as HTMLElement; // In theory the parent can also be an LContainer, but it appears like that's // only the case for embedded views which we won't be replacing here. const parentLView = lView[PARENT] as LView; @@ -159,6 +160,16 @@ function recreateLView( ngDevMode && assertNotEqual(newDef, oldDef, 'Expected different component definition'); const zone = lView[INJECTOR].get(NgZone, null); const recreate = () => { + // If we're recreating a component with shadow DOM encapsulation, it will have attached a + // shadow root. The browser will throw if we attempt to attach another one and there's no way + // to detach it. Our only option is to make a clone only of the root node, replace the node + // with the clone and use it for the newly-created LView. + if (oldDef.encapsulation === ViewEncapsulation.ShadowDom) { + const newHost = host.cloneNode(false) as HTMLElement; + host.replaceWith(newHost); + host = newHost; + } + // Recreate the TView since the template might've changed. const newTView = getOrCreateComponentTView(newDef); diff --git a/packages/core/test/acceptance/hmr_spec.ts b/packages/core/test/acceptance/hmr_spec.ts index a3334d818786..c81533154e46 100644 --- a/packages/core/test/acceptance/hmr_spec.ts +++ b/packages/core/test/acceptance/hmr_spec.ts @@ -26,6 +26,7 @@ import { ViewChild, ViewChildren, ViewContainerRef, + ViewEncapsulation, ɵNG_COMP_DEF, ɵɵreplaceMetadata, } from '@angular/core'; @@ -248,6 +249,65 @@ describe('hot module replacement', () => { ); }); + it('should replace a component using shadow DOM encapsulation', () => { + // Domino doesn't support shadow DOM. + if (isNode) { + return; + } + + let instance!: ChildCmp; + const initialMetadata: Component = { + encapsulation: ViewEncapsulation.ShadowDom, + selector: 'child-cmp', + template: 'Hello {{state}}', + styles: `strong {color: red;}`, + }; + + @Component(initialMetadata) + class ChildCmp { + state = 0; + + constructor() { + instance = this; + } + } + + @Component({ + standalone: true, + imports: [ChildCmp], + template: '', + }) + class RootCmp {} + + const fixture = TestBed.createComponent(RootCmp); + fixture.detectChanges(); + const getShadowRoot = () => fixture.nativeElement.querySelector('child-cmp').shadowRoot; + + markNodesAsCreatedInitially(getShadowRoot()); + expectHTML(getShadowRoot(), `Hello 0`); + + instance.state = 1; + fixture.detectChanges(); + expectHTML(getShadowRoot(), `Hello 1`); + + replaceMetadata(ChildCmp, { + ...initialMetadata, + template: `Changed {{state}}!`, + styles: `strong {background: pink;}`, + }); + fixture.detectChanges(); + + verifyNodesWereRecreated([ + fixture.nativeElement.querySelector('child-cmp'), + ...childrenOf(getShadowRoot()), + ]); + + expectHTML( + getShadowRoot(), + `Changed 1!`, + ); + }); + it('should continue binding inputs to a component that is replaced', () => { const initialMetadata: Component = { selector: 'child-cmp', @@ -2071,7 +2131,7 @@ describe('hot module replacement', () => { function expectHTML(element: HTMLElement, expectation: string) { const actual = element.innerHTML .replace(//g, '') - .replace(/\sng-reflect-\S*="[^"]*"/g, ''); + .replace(/\s(ng-reflect|_nghost|_ngcontent)-\S*="[^"]*"/g, ''); expect(actual.replace(/\s/g, '') === expectation.replace(/\s/g, '')) .withContext(`HTML does not match expectation. Actual HTML:\n${actual}`) .toBe(true); From 2d8fa73c1d6cce078889548c69b8ddb8e84ac106 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Mon, 20 Jan 2025 15:12:38 +0100 Subject: [PATCH 0128/1220] docs: release notes for the v19.1.2 release --- CHANGELOG.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1306c9d01af2..e3cf968b01d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,26 @@ + +# 19.1.2 (2025-01-20) +### compiler +| Commit | Type | Description | +| -- | -- | -- | +| [8dcd889987](https://github.com/angular/angular/commit/8dcd88998700a94115a542462e6ae6beedbfbd9d) | fix | update `@ng/component` URL to be relative ([#59620](https://github.com/angular/angular/pull/59620)) | +### compiler-cli +| Commit | Type | Description | +| -- | -- | -- | +| [95a05bb202](https://github.com/angular/angular/commit/95a05bb2021acab02df3468212adf023d331a688) | fix | disable tree shaking during HMR ([#59595](https://github.com/angular/angular/pull/59595)) | +### core +| Commit | Type | Description | +| -- | -- | -- | +| [a4eb74c79c](https://github.com/angular/angular/commit/a4eb74c79cca802d8179118cf4d53c73285baadb) | fix | animation sometimes renderer not being destroyed during HMR ([#59574](https://github.com/angular/angular/pull/59574)) | +| [906413aba3](https://github.com/angular/angular/commit/906413aba31459e6499420ed14519d1280e182ad) | fix | change `Resource` to use explicit `undefined` in its typings ([#59024](https://github.com/angular/angular/pull/59024)) | +| [4eb541837c](https://github.com/angular/angular/commit/4eb541837cf28ce1950d782213291165a2436410) | fix | cleanup `_ejsa` when app is destroyed ([#59492](https://github.com/angular/angular/pull/59492)) | +| [5497102769](https://github.com/angular/angular/commit/549710276969ec4cf8c1e3d2f19d1fe9f755976e) | fix | cleanup stash listener when app is destroyed ([#59598](https://github.com/angular/angular/pull/59598)) | +| [266a8f2f2e](https://github.com/angular/angular/commit/266a8f2f2ebf9f5e310ba5de695be5072790e1e5) | fix | handle shadow DOM encapsulated component with HMR ([#59597](https://github.com/angular/angular/pull/59597)) | +| [6f7716268a](https://github.com/angular/angular/commit/6f7716268afa5146f2b2d0dbbea146defa9acfef) | fix | HMR not matching component that injects ViewContainerRef ([#59596](https://github.com/angular/angular/pull/59596)) | +| [d12a186d53](https://github.com/angular/angular/commit/d12a186d531b41e6a16f84446a1d54eaed010fc4) | fix | treat exceptions in `equal` as part of computation ([#55818](https://github.com/angular/angular/pull/55818)) | + + + # 19.1.1 (2025-01-16) ### core From 04c24472d29673522a9b13f42dfe90796266cafc Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Fri, 17 Jan 2025 14:12:46 +0100 Subject: [PATCH 0129/1220] refactor(core): move linkedSignal implementation to primitives (#59501) This change refactors the Angular-specific linkedSignal implementation such that its core logic can be shared with other frameworks. PR Close #59501 --- .../core/primitives/signals/index.api.md | 31 ++++ packages/core/primitives/signals/index.ts | 8 + .../core/primitives/signals/src/computed.ts | 6 +- .../primitives/signals/src/linked_signal.ts | 165 ++++++++++++++++++ .../bundling/defer/bundle.golden_symbols.json | 1 + 5 files changed, 208 insertions(+), 3 deletions(-) create mode 100644 packages/core/primitives/signals/src/linked_signal.ts diff --git a/goldens/public-api/core/primitives/signals/index.api.md b/goldens/public-api/core/primitives/signals/index.api.md index 55839c369336..76f793253276 100644 --- a/goldens/public-api/core/primitives/signals/index.api.md +++ b/goldens/public-api/core/primitives/signals/index.api.md @@ -4,6 +4,12 @@ ```ts +// @public +export type ComputationFn = (source: S, previous?: { + source: S; + value: D; +}) => D; + // @public export interface ComputedNode extends ReactiveNode { computation: () => T; @@ -31,6 +37,9 @@ export function consumerPollProducersForChange(node: ReactiveNode): boolean; // @public export function createComputed(computation: () => T): ComputedGetter; +// @public (undocumented) +export function createLinkedSignal(sourceFn: () => S, computationFn: ComputationFn, equalityFn?: ValueEqualityFn): LinkedSignalGetter; + // @public export function createSignal(initialValue: T): SignalGetter; @@ -49,6 +58,28 @@ export function isInNotificationPhase(): boolean; // @public (undocumented) export function isReactive(value: unknown): value is Reactive; +// @public (undocumented) +export type LinkedSignalGetter = (() => D) & { + [SIGNAL]: LinkedSignalNode; +}; + +// @public (undocumented) +export interface LinkedSignalNode extends ReactiveNode { + computation: ComputationFn; + // (undocumented) + equal: ValueEqualityFn; + error: unknown; + source: () => S; + sourceValue: S; + value: D; +} + +// @public (undocumented) +export function linkedSignalSetFn(node: LinkedSignalNode, newValue: D): void; + +// @public (undocumented) +export function linkedSignalUpdateFn(node: LinkedSignalNode, updater: (value: D) => D): void; + // @public export function producerAccessed(node: ReactiveNode): void; diff --git a/packages/core/primitives/signals/index.ts b/packages/core/primitives/signals/index.ts index eefe84ace978..ce3c28f908ec 100644 --- a/packages/core/primitives/signals/index.ts +++ b/packages/core/primitives/signals/index.ts @@ -7,6 +7,14 @@ */ export {ComputedNode, createComputed} from './src/computed'; +export { + ComputationFn, + LinkedSignalNode, + LinkedSignalGetter, + createLinkedSignal, + linkedSignalSetFn, + linkedSignalUpdateFn, +} from './src/linked_signal'; export {ValueEqualityFn, defaultEquals} from './src/equality'; export {setThrowInvalidWriteToSignalError} from './src/errors'; export { diff --git a/packages/core/primitives/signals/src/computed.ts b/packages/core/primitives/signals/src/computed.ts index 7afb19656164..2f8586545bc9 100644 --- a/packages/core/primitives/signals/src/computed.ts +++ b/packages/core/primitives/signals/src/computed.ts @@ -76,21 +76,21 @@ export function createComputed(computation: () => T): ComputedGetter { * A dedicated symbol used before a computed value has been calculated for the first time. * Explicitly typed as `any` so we can use it as signal's value. */ -const UNSET: any = /* @__PURE__ */ Symbol('UNSET'); +export const UNSET: any = /* @__PURE__ */ Symbol('UNSET'); /** * A dedicated symbol used in place of a computed signal value to indicate that a given computation * is in progress. Used to detect cycles in computation chains. * Explicitly typed as `any` so we can use it as signal's value. */ -const COMPUTING: any = /* @__PURE__ */ Symbol('COMPUTING'); +export const COMPUTING: any = /* @__PURE__ */ Symbol('COMPUTING'); /** * A dedicated symbol used in place of a computed signal value to indicate that a given computation * failed. The thrown error is cached until the computation gets dirty again. * Explicitly typed as `any` so we can use it as signal's value. */ -const ERRORED: any = /* @__PURE__ */ Symbol('ERRORED'); +export const ERRORED: any = /* @__PURE__ */ Symbol('ERRORED'); // Note: Using an IIFE here to ensure that the spread assignment is not considered // a side-effect, ending up preserving `COMPUTED_NODE` and `REACTIVE_NODE`. diff --git a/packages/core/primitives/signals/src/linked_signal.ts b/packages/core/primitives/signals/src/linked_signal.ts new file mode 100644 index 000000000000..4ff9737fe4b0 --- /dev/null +++ b/packages/core/primitives/signals/src/linked_signal.ts @@ -0,0 +1,165 @@ +/** + * @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 {COMPUTING, ERRORED, UNSET} from './computed'; +import {defaultEquals, ValueEqualityFn} from './equality'; +import { + consumerAfterComputation, + consumerBeforeComputation, + producerAccessed, + producerMarkClean, + producerUpdateValueVersion, + REACTIVE_NODE, + ReactiveNode, + SIGNAL, +} from './graph'; +import {signalSetFn, signalUpdateFn} from './signal'; + +export type ComputationFn = (source: S, previous?: {source: S; value: D}) => D; + +export interface LinkedSignalNode extends ReactiveNode { + /** + * Value of the source signal that was used to derive the computed value. + */ + sourceValue: S; + + /** + * Current state value, or one of the sentinel values (`UNSET`, `COMPUTING`, + * `ERROR`). + */ + value: D; + + /** + * If `value` is `ERRORED`, the error caught from the last computation attempt which will + * be re-thrown. + */ + error: unknown; + + /** + * The source function represents reactive dependency based on which the linked state is reset. + */ + source: () => S; + + /** + * The computation function which will produce a new value based on the source and, optionally - previous values. + */ + computation: ComputationFn; + + equal: ValueEqualityFn; +} + +export type LinkedSignalGetter = (() => D) & { + [SIGNAL]: LinkedSignalNode; +}; + +export function createLinkedSignal( + sourceFn: () => S, + computationFn: ComputationFn, + equalityFn?: ValueEqualityFn, +): LinkedSignalGetter { + const node: LinkedSignalNode = Object.create(LINKED_SIGNAL_NODE); + + node.source = sourceFn; + node.computation = computationFn; + if (equalityFn != undefined) { + node.equal = equalityFn; + } + + const linkedSignalGetter = () => { + // Check if the value needs updating before returning it. + producerUpdateValueVersion(node); + + // Record that someone looked at this signal. + producerAccessed(node); + + if (node.value === ERRORED) { + throw node.error; + } + + return node.value; + }; + + const getter = linkedSignalGetter as LinkedSignalGetter; + getter[SIGNAL] = node; + + return getter; +} + +export function linkedSignalSetFn(node: LinkedSignalNode, newValue: D) { + producerUpdateValueVersion(node); + signalSetFn(node, newValue); + producerMarkClean(node); +} + +export function linkedSignalUpdateFn( + node: LinkedSignalNode, + updater: (value: D) => D, +): void { + producerUpdateValueVersion(node); + signalUpdateFn(node, updater); + producerMarkClean(node); +} + +// Note: Using an IIFE here to ensure that the spread assignment is not considered +// a side-effect, ending up preserving `LINKED_SIGNAL_NODE` and `REACTIVE_NODE`. +// TODO: remove when https://github.com/evanw/esbuild/issues/3392 is resolved. +export const LINKED_SIGNAL_NODE = /* @__PURE__ */ (() => { + return { + ...REACTIVE_NODE, + value: UNSET, + dirty: true, + error: null, + equal: defaultEquals, + + producerMustRecompute(node: LinkedSignalNode): boolean { + // Force a recomputation if there's no current value, or if the current value is in the + // process of being calculated (which should throw an error). + return node.value === UNSET || node.value === COMPUTING; + }, + + producerRecomputeValue(node: LinkedSignalNode): void { + if (node.value === COMPUTING) { + // Our computation somehow led to a cyclic read of itself. + throw new Error('Detected cycle in computations.'); + } + + const oldValue = node.value; + node.value = COMPUTING; + + const prevConsumer = consumerBeforeComputation(node); + let newValue: unknown; + try { + const newSourceValue = node.source(); + const prev = + oldValue === UNSET || oldValue === ERRORED + ? undefined + : { + source: node.sourceValue, + value: oldValue, + }; + newValue = node.computation(newSourceValue, prev); + node.sourceValue = newSourceValue; + } catch (err) { + newValue = ERRORED; + node.error = err; + } finally { + consumerAfterComputation(node, prevConsumer); + } + + if (oldValue !== UNSET && newValue !== ERRORED && node.equal(oldValue, newValue)) { + // No change to `valueVersion` - old and new values are + // semantically equivalent. + node.value = oldValue; + return; + } + + node.value = newValue; + node.version++; + }, + }; +})(); diff --git a/packages/core/test/bundling/defer/bundle.golden_symbols.json b/packages/core/test/bundling/defer/bundle.golden_symbols.json index 50f3d4a879c7..94515050847e 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -572,6 +572,7 @@ "init_let_declaration", "init_lift", "init_linked_signal", + "init_linked_signal2", "init_linker", "init_list_reconciliation", "init_listener", From 98f820737b4de9ac5f242024c6d82ef9f343d2e2 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Sat, 21 Dec 2024 16:09:39 +0200 Subject: [PATCH 0130/1220] fix(compiler): handle :host-context with comma-separated child selector (#59276) Both `:host` and `:host-context` work by looking for a specific character sequence that is terminated by `,` or `{` and replacing selectors inside of it with scoped versions. This is implemented as a regex which isn't aware of things like nested selectors. Normally this is fine for `:host`, because each `:host` produces one scoped selector which doesn't affect any child selectors, however it breaks down with `:host-context` which replaces each instance with two selectors. For example, if we have a selector in the form of `:host-context(.foo) a:not(.a, .b)`, the compiler ends up determining that `.a,` is the end selector and produces `.foo[a-host] a[contenta]:not(.a, .foo [a-host] a[contenta]:not(.a, .b) {}`. These changes resolve the issue by splitting the CSS alogn top-level commas, processing the `:host-context` in them individually, and stiching the CSS back together. PR Close #59276 --- packages/compiler/src/shadow_css.ts | 46 +++++++++++++++++-- .../shadow_css/host_and_host_context_spec.ts | 17 +++++++ 2 files changed, 59 insertions(+), 4 deletions(-) diff --git a/packages/compiler/src/shadow_css.ts b/packages/compiler/src/shadow_css.ts index f8548db07f11..a66aa6c551a9 100644 --- a/packages/compiler/src/shadow_css.ts +++ b/packages/compiler/src/shadow_css.ts @@ -541,6 +541,41 @@ export class ShadowCss { * .foo .bar { ... } */ private _convertColonHostContext(cssText: string): string { + const length = cssText.length; + let parens = 0; + let prev = 0; + let result = ''; + + // Splits up the selectors on their top-level commas, processes the :host-context in them + // individually and stitches them back together. This ensures that individual selectors don't + // affect each other. + for (let i = 0; i < length; i++) { + const char = cssText[i]; + + // If we hit a comma and there are no open parentheses, take the current chunk and process it. + if (char === ',' && parens === 0) { + result += this._convertColonHostContextInSelectorPart(cssText.slice(prev, i)) + ','; + prev = i + 1; + continue; + } + + // We've hit the end. Take everything since the last comma. + if (i === length - 1) { + result += this._convertColonHostContextInSelectorPart(cssText.slice(prev)); + break; + } + + if (char === '(') { + parens++; + } else if (char === ')') { + parens--; + } + } + + return result; + } + + private _convertColonHostContextInSelectorPart(cssText: string): string { return cssText.replace(_cssColonHostContextReGlobal, (selectorText, pseudoPrefix) => { // We have captured a selector that contains a `:host-context` rule. @@ -1010,13 +1045,16 @@ const _cssContentUnscopedRuleRe = const _polyfillHost = '-shadowcsshost'; // note: :host-context pre-processed to -shadowcsshostcontext. const _polyfillHostContext = '-shadowcsscontext'; -const _parenSuffix = '(?:\\((' + '(?:\\([^)(]*\\)|[^)(]*)+?' + ')\\))?([^,{]*)'; -const _cssColonHostRe = new RegExp(_polyfillHost + _parenSuffix, 'gim'); +const _parenSuffix = '(?:\\((' + '(?:\\([^)(]*\\)|[^)(]*)+?' + ')\\))'; +const _cssColonHostRe = new RegExp(_polyfillHost + _parenSuffix + '?([^,{]*)', 'gim'); +// note: :host-context patterns are terminated with `{`, as opposed to :host which +// is both `{` and `,` because :host-context handles top-level commas differently. +const _hostContextPattern = _polyfillHostContext + _parenSuffix + '?([^{]*)'; const _cssColonHostContextReGlobal = new RegExp( - _cssScopedPseudoFunctionPrefix + '(' + _polyfillHostContext + _parenSuffix + ')', + `${_cssScopedPseudoFunctionPrefix}(${_hostContextPattern})`, 'gim', ); -const _cssColonHostContextRe = new RegExp(_polyfillHostContext + _parenSuffix, 'im'); +const _cssColonHostContextRe = new RegExp(_hostContextPattern, 'im'); const _polyfillHostNoCombinator = _polyfillHost + '-no-combinator'; const _polyfillHostNoCombinatorOutsidePseudoFunction = new RegExp( `${_polyfillHostNoCombinator}(?![^(]*\\))`, diff --git a/packages/compiler/test/shadow_css/host_and_host_context_spec.ts b/packages/compiler/test/shadow_css/host_and_host_context_spec.ts index 6bef826d196b..00ebbe9ad50d 100644 --- a/packages/compiler/test/shadow_css/host_and_host_context_spec.ts +++ b/packages/compiler/test/shadow_css/host_and_host_context_spec.ts @@ -257,6 +257,23 @@ describe('ShadowCss, :host and :host-context', () => { '{}', ); }); + + it('should handle :host-context with comma-separated child selector', () => { + expect(shim(':host-context(.foo) a:not(.a, .b) {}', 'contenta', 'a-host')).toEqualCss( + '.foo[a-host] a[contenta]:not(.a, .b), .foo [a-host] a[contenta]:not(.a, .b) {}', + ); + expect( + shim( + ':host-context(.foo) a:not([a], .b), .bar, :host-context(.baz) a:not([c], .d) {}', + 'contenta', + 'a-host', + ), + ).toEqualCss( + '.foo[a-host] a[contenta]:not([a], .b), .foo [a-host] a[contenta]:not([a], .b), ' + + '.bar[contenta], .baz[a-host] a[contenta]:not([c], .d), ' + + '.baz [a-host] a[contenta]:not([c], .d) {}', + ); + }); }); describe(':host-context and :host combination selector', () => { From 8e5c0f8e299125ed2c4f5e5ee8b4557dfb8c16e1 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Mon, 20 Jan 2025 09:11:48 +0000 Subject: [PATCH 0131/1220] build: update dependency shiki to v2 (#59623) See associated pull request for more information. PR Close #59623 --- adev/shared-docs/package.json | 2 +- package.json | 2 +- yarn.lock | 96 +++++++++++++++++------------------ 3 files changed, 50 insertions(+), 50 deletions(-) diff --git a/adev/shared-docs/package.json b/adev/shared-docs/package.json index 91d2aa9c30aa..2e40eb128956 100644 --- a/adev/shared-docs/package.json +++ b/adev/shared-docs/package.json @@ -23,7 +23,7 @@ "jsdom": "~25.0.0", "marked": "~15.0.0", "mermaid": "^11.0.0", - "shiki": "^1.10.3" + "shiki": "^2.0.0" }, "exports": { "./styles/*": { diff --git a/package.json b/package.json index 38c72b59d5cd..3e59f7db7bb1 100644 --- a/package.json +++ b/package.json @@ -221,7 +221,7 @@ "preact-render-to-string": "^6.2.1", "prettier": "^3.0.0", "semver": "^7.3.5", - "shiki": "^1.11.1", + "shiki": "^2.0.0", "tmp": "^0.2.3", "ts-node": "^10.9.1", "tsec": "0.2.8", diff --git a/yarn.lock b/yarn.lock index 349bdf97bd6d..3f113faa4af6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3309,53 +3309,53 @@ "@angular-devkit/schematics" "19.1.0-rc.0" jsonc-parser "3.3.1" -"@shikijs/core@1.27.0": - version "1.27.0" - resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-1.27.0.tgz#2245681160cf43d2bc45bc3013937c4fac8f9109" - integrity sha512-2RkIwaXVWxJQQw8JvqikTVe4gBxS3elH3qF3b7Ews1KdJc+TH9/nsVEftrtPn0bLOkdlMaGj5H2RBHpfWmRIcA== - dependencies: - "@shikijs/engine-javascript" "1.27.0" - "@shikijs/engine-oniguruma" "1.27.0" - "@shikijs/types" "1.27.0" +"@shikijs/core@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-2.0.0.tgz#e3e7cce8fc7cc03e0fca7d024d0ad8e3a2c26e85" + integrity sha512-BXodyV73f46j8wcwjP5xn7TQ6Ts3puE65lDREfN+DikZWW3/clDduoopGwQi4F7T9agar41G24BLtH3HUT64KQ== + dependencies: + "@shikijs/engine-javascript" "2.0.0" + "@shikijs/engine-oniguruma" "2.0.0" + "@shikijs/types" "2.0.0" "@shikijs/vscode-textmate" "^10.0.1" "@types/hast" "^3.0.4" hast-util-to-html "^9.0.4" -"@shikijs/engine-javascript@1.27.0": - version "1.27.0" - resolved "https://registry.yarnpkg.com/@shikijs/engine-javascript/-/engine-javascript-1.27.0.tgz#dcef0280092c49a1fe9130b693fb9ca16abf1e2d" - integrity sha512-1nzz37go+wb6uR97QSRtU4GEwx99efuucB6QI4R682wmPbti6LeWe5VcMNy8LJJt02GEYcZeJK6Lvq8YXBVNXA== +"@shikijs/engine-javascript@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@shikijs/engine-javascript/-/engine-javascript-2.0.0.tgz#919addbd270bed14170f297c0a8cb41bfbf59aeb" + integrity sha512-ZpnBGCRLk6cjvtH+G6ljX6ajcErahx65F4IAm+9rGepYRvD3/jj6taSW8jevb7umzFxTUPXZxytf+ZBx/c5rVQ== dependencies: - "@shikijs/types" "1.27.0" + "@shikijs/types" "2.0.0" "@shikijs/vscode-textmate" "^10.0.1" - oniguruma-to-es "^1.0.0" + oniguruma-to-es "^2.2.0" -"@shikijs/engine-oniguruma@1.27.0": - version "1.27.0" - resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-1.27.0.tgz#4c34c92bee5adf8627243fdc70bf7aa84715adc3" - integrity sha512-x1XMJvQuToX2KhESav2cnaTFDEwpJ1bcczaXy8wlRWhPVVAGR/MxlWnJbhHFe+ETerQgdpLZN8l+EgO0rVfEFQ== +"@shikijs/engine-oniguruma@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-2.0.0.tgz#87c83803a9002f5125163d30280c9347801749a6" + integrity sha512-X6LdTRXoT37uE/9Y6j7oNtWMMFR6cVrlsHAoQG3srhYcdcrmBm33FdfRRfWeCVlZRAeCHVuWaFmYBWeCTWVN+A== dependencies: - "@shikijs/types" "1.27.0" + "@shikijs/types" "2.0.0" "@shikijs/vscode-textmate" "^10.0.1" -"@shikijs/langs@1.27.0": - version "1.27.0" - resolved "https://registry.yarnpkg.com/@shikijs/langs/-/langs-1.27.0.tgz#8457f8d9ca305dee01c9faa5bcb505e722bbdbdc" - integrity sha512-6fBE0OL17XGYlNj8IuHfKtTALLk6+CVAXw8Rj2y/K8NP646/hows9+XwzIFcvFo3wZ0fPAcPKQ9pwG6a1FBevw== +"@shikijs/langs@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@shikijs/langs/-/langs-2.0.0.tgz#dc4398e4438a617cc72f50dfbdd90693f8a981ab" + integrity sha512-xelmNcbbIiX3BO446OgsJcugf5tF9u+4N7V6Wws9XjZoe3qCE0dYtfkHXZiVDdciemI/1QnFeTo+AjPw2fD42w== dependencies: - "@shikijs/types" "1.27.0" + "@shikijs/types" "2.0.0" -"@shikijs/themes@1.27.0": - version "1.27.0" - resolved "https://registry.yarnpkg.com/@shikijs/themes/-/themes-1.27.0.tgz#4c860c533a3bd5b05b9b7edc168cb9c73c7c21c8" - integrity sha512-L21LFq8hdsrBUXLh0fxKRURwE1brSlofK3Onutpwk71/EddfPqv60PG+Cg/KawPi8B04Mwp66EWw1shQjcYfBQ== +"@shikijs/themes@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@shikijs/themes/-/themes-2.0.0.tgz#69165878be98f3a72e6e6a9425ba5a3b75ea53e2" + integrity sha512-2v7PjBlTEcYhj96/WW4t4VhMmIR/0DhuKqZzWcPFG+w2RG3EaIiGfQYf9w+NvFYZ8uF7ianO8vxrjIVpDKnglw== dependencies: - "@shikijs/types" "1.27.0" + "@shikijs/types" "2.0.0" -"@shikijs/types@1.27.0": - version "1.27.0" - resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-1.27.0.tgz#d649f5bd5e0e126ddf05f78b419dc41f9c3959b9" - integrity sha512-oOJdIeOnGo+hbM7MH+Ejpksse2ASex4DVHdvBoKyY3+26GEzG9PwM85BeXNGxUZuVxtVKo43sZl0qtJs/K2Zow== +"@shikijs/types@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-2.0.0.tgz#eb5d6d483334aa8453d76afee734258c4d577511" + integrity sha512-2gQ9V3NoGE4R1d0pGnsNF0PLStBu7GsJdJdS6H/YbzuTRVjv6cado9slh3sG4KMZBhJPFh7EC8+iIKuyHfNDvA== dependencies: "@shikijs/vscode-textmate" "^10.0.1" "@types/hast" "^3.0.4" @@ -12893,10 +12893,10 @@ onetime@^7.0.0: dependencies: mimic-function "^5.0.0" -oniguruma-to-es@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/oniguruma-to-es/-/oniguruma-to-es-1.0.0.tgz#6f7104cf0492e25d42b203d892b6d2d5f5f4d2e7" - integrity sha512-kihvp0O4lFwf5tZMkfanwQLIZ9ORe9OeOFgZonH0BQeThgwfJiaZFeOfvvJVnJIM9TiVmx0RDD35hUJDR0++rQ== +oniguruma-to-es@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/oniguruma-to-es/-/oniguruma-to-es-2.2.0.tgz#7134ab4f05595cadc52fbc697af5c96788dca493" + integrity sha512-EEsso27ri0sf+t4uRFEj5C5gvXQj0d0w1Y2qq06b+hDLBnvzO1rWTwEW4C7ytan6nhg4WPwE26eLoiPhHUbvKg== dependencies: emoji-regex-xs "^1.0.0" regex "^5.1.1" @@ -15211,17 +15211,17 @@ shelljs@^0.8.5: interpret "^1.0.0" rechoir "^0.6.2" -shiki@^1.11.1: - version "1.27.0" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-1.27.0.tgz#ae973e1c352bcc06def9c7454957e4b8210e8e96" - integrity sha512-PdrOqs36vGmftWETJJF6IJAUDS0ERYOYofHCBTHpLTvWLC8E/E6lyh+Xm1lMIZ/sBWT5uJSmri6NNW5ZDglMqQ== - dependencies: - "@shikijs/core" "1.27.0" - "@shikijs/engine-javascript" "1.27.0" - "@shikijs/engine-oniguruma" "1.27.0" - "@shikijs/langs" "1.27.0" - "@shikijs/themes" "1.27.0" - "@shikijs/types" "1.27.0" +shiki@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-2.0.0.tgz#97fe361ded9a402804d2cb327de1b5e96f1f5572" + integrity sha512-cU0KHpb2zOMwVrSeJeYTcKNGzSHM+X/chH5KTtsZLg5QCsFUwclJervFoHQPz1Ap+O+94FOsv7mh/+Bmv3iQPA== + dependencies: + "@shikijs/core" "2.0.0" + "@shikijs/engine-javascript" "2.0.0" + "@shikijs/engine-oniguruma" "2.0.0" + "@shikijs/langs" "2.0.0" + "@shikijs/themes" "2.0.0" + "@shikijs/types" "2.0.0" "@shikijs/vscode-textmate" "^10.0.1" "@types/hast" "^3.0.4" From 9714b65d996b2d31830dae2b29b1a65c9bce8b77 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Tue, 21 Jan 2025 10:23:23 +0100 Subject: [PATCH 0132/1220] fix(core): replace metadata in place during HMR (#59644) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently during HMR we swap out the entire module definition (e.g. `MyComp.ɵcmp = newDef`). In standalone components and most module-based ones this works fine, however in some cases (e.g. circular dependencies) the compiler can produce a `setComponentScope` call for a module-based component. This call doesn't make it into the HMR replacement function, because it is defined in the module's file, not the component's. As a result, the dependencies of these components are cleared out upon replacement. A secondary problem is that the `directiveDefs` and `pipeDefs` fields can save references to definitions that later become stale as a result of HMR. These changes resolve both issues by: 1. Performing the replacement by copying the properties from the new definition onto the old one, while keeping it in place. 2. Preserving the initial `directiveDefs`, `pipeDefs` and `setInput`. Fixes #59639. PR Close #59644 --- packages/core/src/render3/hmr.ts | 60 ++++++++++++++++++++--- packages/core/test/acceptance/hmr_spec.ts | 32 ++++++++++++ 2 files changed, 84 insertions(+), 8 deletions(-) diff --git a/packages/core/src/render3/hmr.ts b/packages/core/src/render3/hmr.ts index c89b0285ea87..283e67e40af8 100644 --- a/packages/core/src/render3/hmr.ts +++ b/packages/core/src/render3/hmr.ts @@ -7,7 +7,7 @@ */ import {Type} from '../interface/type'; -import {assertDefined, assertNotEqual} from '../util/assert'; +import {assertDefined, assertEqual, assertNotEqual} from '../util/assert'; import {assertLView} from './assert'; import {getComponentDef} from './def_getters'; import {assertComponentDef} from './errors'; @@ -45,6 +45,7 @@ import {destroyLView, removeViewFromDOM} from './node_manipulation'; import {RendererFactory} from './interfaces/renderer'; import {NgZone} from '../zone'; import {ViewEncapsulation} from '../metadata/view'; +import {NG_COMP_DEF} from './fields'; /** * Replaces the metadata of a component type and re-renders all live instances of the component. @@ -61,7 +62,7 @@ export function ɵɵreplaceMetadata( locals: unknown[], ) { ngDevMode && assertComponentDef(type); - const oldDef = getComponentDef(type)!; + const currentDef = getComponentDef(type)!; // The reason `applyMetadata` is a callback that is invoked (almost) immediately is because // the compiler usually produces more code than just the component definition, e.g. there @@ -70,6 +71,13 @@ export function ɵɵreplaceMetadata( // them at the right time. applyMetadata.apply(null, [type, namespaces, ...locals]); + const {newDef, oldDef} = mergeWithExistingDefinition(currentDef, getComponentDef(type)!); + + // TODO(crisbeto): the `applyMetadata` call above will replace the definition on the type. + // Ideally we should adjust the compiler output so the metadata is returned, however that'll + // require some internal changes. We re-add the metadata here manually. + (type as any)[NG_COMP_DEF] = newDef; + // If a `tView` hasn't been created yet, it means that this component hasn't been instantianted // before. In this case there's nothing left for us to do aside from patching it in. if (oldDef.tView) { @@ -78,18 +86,54 @@ export function ɵɵreplaceMetadata( // Note: we have the additional check, because `IsRoot` can also indicate // a component created through something like `createComponent`. if (root[FLAGS] & LViewFlags.IsRoot && root[PARENT] === null) { - recreateMatchingLViews(oldDef, root); + recreateMatchingLViews(newDef, oldDef, root); } } } } +/** + * Merges two component definitions while preseving the original one in place. + * @param currentDef Definition that should receive the new metadata. + * @param newDef Source of the new metadata. + */ +function mergeWithExistingDefinition( + currentDef: ComponentDef, + newDef: ComponentDef, +) { + // Clone the current definition since we reference its original data further + // down in the replacement process (e.g. when destroying the renderer). + const clone = {...currentDef}; + + // Assign the new metadata in place while preserving the object literal. It's important to + // Keep the object in place, because there can be references to it, for example in the + // `directiveDefs` of another definition. + const replacement = Object.assign(currentDef, newDef, { + // We need to keep the existing directive and pipe defs, because they can get patched on + // by a call to `setComponentScope` from a module file. That call won't make it into the + // HMR replacement function, because it lives in an entirely different file. + directiveDefs: clone.directiveDefs, + pipeDefs: clone.pipeDefs, + + // Preserve the old `setInput` function, because it has some state. + // This is fine, because the component instance is preserved as well. + setInput: clone.setInput, + }); + + ngDevMode && assertEqual(replacement, currentDef, 'Expected definition to be merged in place'); + return {newDef: replacement, oldDef: clone}; +} + /** * Finds all LViews matching a specific component definition and recreates them. * @param oldDef Component definition to search for. * @param rootLView View from which to start the search. */ -function recreateMatchingLViews(oldDef: ComponentDef, rootLView: LView): void { +function recreateMatchingLViews( + newDef: ComponentDef, + oldDef: ComponentDef, + rootLView: LView, +): void { ngDevMode && assertDefined( oldDef.tView, @@ -102,7 +146,7 @@ function recreateMatchingLViews(oldDef: ComponentDef, rootLView: LView) // produce false positives when using inheritance. if (tView === oldDef.tView) { ngDevMode && assertComponentDef(oldDef.type); - recreateLView(getComponentDef(oldDef.type)!, oldDef, rootLView); + recreateLView(newDef, oldDef, rootLView); return; } @@ -112,14 +156,14 @@ function recreateMatchingLViews(oldDef: ComponentDef, rootLView: LView) if (isLContainer(current)) { // The host can be an LView if a component is injecting `ViewContainerRef`. if (isLView(current[HOST])) { - recreateMatchingLViews(oldDef, current[HOST]); + recreateMatchingLViews(newDef, oldDef, current[HOST]); } for (let j = CONTAINER_HEADER_OFFSET; j < current.length; j++) { - recreateMatchingLViews(oldDef, current[j]); + recreateMatchingLViews(newDef, oldDef, current[j]); } } else if (isLView(current)) { - recreateMatchingLViews(oldDef, current); + recreateMatchingLViews(newDef, oldDef, current); } } } diff --git a/packages/core/test/acceptance/hmr_spec.ts b/packages/core/test/acceptance/hmr_spec.ts index c81533154e46..de012c7e8875 100644 --- a/packages/core/test/acceptance/hmr_spec.ts +++ b/packages/core/test/acceptance/hmr_spec.ts @@ -29,6 +29,7 @@ import { ViewEncapsulation, ɵNG_COMP_DEF, ɵɵreplaceMetadata, + ɵɵsetComponentScope, } from '@angular/core'; import {TestBed} from '@angular/core/testing'; import {compileComponent} from '@angular/core/src/render3/jit/directive'; @@ -36,6 +37,7 @@ import {angularCoreEnv} from '@angular/core/src/render3/jit/environment'; import {clearTranslations, loadTranslations} from '@angular/localize'; import {computeMsgId} from '@angular/compiler'; import {EVENT_MANAGER_PLUGINS} from '@angular/platform-browser'; +import {ComponentType} from '@angular/core/src/render3'; describe('hot module replacement', () => { it('should recreate a single usage of a basic component', () => { @@ -529,6 +531,36 @@ describe('hot module replacement', () => { ); }); + it('should carry over dependencies defined by setComponentScope', () => { + // In some cases the AoT compiler produces a `setComponentScope` for non-standalone + // components. We simulate it here by declaring two components that are not standalone + // and manually calling `setComponentScope`. + @Component({selector: 'child-cmp', template: 'hello', standalone: false}) + class ChildCmp {} + + @Component({template: 'Initial ', standalone: false}) + class RootCmp {} + + ɵɵsetComponentScope(RootCmp as ComponentType, [ChildCmp], []); + + const fixture = TestBed.createComponent(RootCmp); + fixture.detectChanges(); + markNodesAsCreatedInitially(fixture.nativeElement); + expectHTML(fixture.nativeElement, 'Initial hello'); + + replaceMetadata(RootCmp, { + standalone: false, + template: 'Changed ', + }); + fixture.detectChanges(); + + const recreatedNodes = childrenOf(fixture.nativeElement); + verifyNodesRemainUntouched(fixture.nativeElement, recreatedNodes); + verifyNodesWereRecreated(recreatedNodes); + + expectHTML(fixture.nativeElement, 'Changed hello'); + }); + describe('queries', () => { it('should update ViewChildren query results', async () => { @Component({ From ea2346955c3aac2da49146d3f239f9b40832a441 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Tue, 21 Jan 2025 10:40:30 +0100 Subject: [PATCH 0133/1220] fix(core): capture self-referencing component during HMR (#59644) Fixes that we were filtering out the component itself from the set of dependencies when HMR is enabled, breaking self-referencing components. Fixes #59632. PR Close #59644 --- .../annotations/component/src/handler.ts | 5 ++ packages/compiler-cli/test/ngtsc/hmr_spec.ts | 46 +++++++++++++++++++ 2 files changed, 51 insertions(+) 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 7c4229718a97..61c1460278cc 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts @@ -1229,6 +1229,11 @@ export class ComponentDecoratorHandler for (const dep of dependencies) { if (dep.ref.node !== node) { eagerlyUsed.add(dep.ref.node); + } else { + const used = bound.getEagerlyUsedDirectives(); + if (used.some((current) => current.ref.node === node)) { + eagerlyUsed.add(node); + } } } } else { diff --git a/packages/compiler-cli/test/ngtsc/hmr_spec.ts b/packages/compiler-cli/test/ngtsc/hmr_spec.ts index d746cac4a45d..7166bedbe0b7 100644 --- a/packages/compiler-cli/test/ngtsc/hmr_spec.ts +++ b/packages/compiler-cli/test/ngtsc/hmr_spec.ts @@ -405,6 +405,52 @@ runInEachFileSystem(() => { expect(hmrContents).toBe(null); }); + it('should capture self-referencing component during HMR', () => { + enableHmr(); + env.write( + 'test.ts', + ` + import {Component} from '@angular/core'; + + @Component({selector: 'cmp', template: '',}) + export class Cmp {} + `, + ); + + env.driveMain(); + + 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(hmrContents).toContain( + 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, Component) {', + ); + }); + + it('should capture component in its own dependencies if it is not used in the template', () => { + enableHmr(); + env.write( + 'test.ts', + ` + import {Component} from '@angular/core'; + + @Component({selector: 'cmp', template: ''}) + export class Cmp {} + `, + ); + + env.driveMain(); + + 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(hmrContents).toContain( + 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, Component) {', + ); + }); + it('should capture shorthand property assignment dependencies', () => { enableHmr(); env.write( From 65f51e16aa8f7c070ab5ed5f2bd4f1c034a5659a Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Tue, 21 Jan 2025 10:51:55 +0100 Subject: [PATCH 0134/1220] fix(platform-browser): clear renderer cache during HMR when using async animations (#59644) Fixes that the async animations renderer didn't have the logic to clean up its style cache during HMR. This is identical to #59393. Fixes #59640. PR Close #59644 --- .../animations/async/src/async_animation_renderer.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/platform-browser/animations/async/src/async_animation_renderer.ts b/packages/platform-browser/animations/async/src/async_animation_renderer.ts index 4045f29b71b2..c5d172513f8b 100644 --- a/packages/platform-browser/animations/async/src/async_animation_renderer.ts +++ b/packages/platform-browser/animations/async/src/async_animation_renderer.ts @@ -167,6 +167,16 @@ export class AsyncAnimationRendererFactory implements OnDestroy, RendererFactory whenRenderingDone?(): Promise { return this.delegate.whenRenderingDone?.() ?? Promise.resolve(); } + + /** + * Used during HMR to clear any cached data about a component. + * @param componentId ID of the component that is being replaced. + */ + protected componentReplaced(componentId: string) { + // Flush the engine since the renderer destruction waits for animations to be done. + this._engine?.flush(); + (this.delegate as {componentReplaced?: (id: string) => void}).componentReplaced?.(componentId); + } } /** From 67be7d2e06c9feea66d09eb20e697f5f2345c8df Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Tue, 21 Jan 2025 11:00:36 +0100 Subject: [PATCH 0135/1220] fix(compiler-cli): extract parenthesized dependencies during HMR (#59644) Fixes that the HMR dependency extraction logic wasn't accounting for parenthesized identifiers correctly. PR Close #59644 --- .../src/ngtsc/hmr/src/extract_dependencies.ts | 16 +++++++-- packages/compiler-cli/test/ngtsc/hmr_spec.ts | 35 +++++++++++++++++++ 2 files changed, 48 insertions(+), 3 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 f64d5c11a972..46d258f4139b 100644 --- a/packages/compiler-cli/src/ngtsc/hmr/src/extract_dependencies.ts +++ b/packages/compiler-cli/src/ngtsc/hmr/src/extract_dependencies.ts @@ -196,10 +196,11 @@ class PotentialTopLevelReadsVisitor extends o.RecursiveAstVisitor { * TypeScript identifiers are used both when referring to a variable (e.g. `console.log(foo)`) * and for names (e.g. `{foo: 123}`). This function determines if the identifier is a top-level * variable read, rather than a nested name. - * @param node Identifier to check. + * @param identifier Identifier to check. */ - private isTopLevelIdentifierReference(node: ts.Identifier): boolean { - const parent = node.parent; + private isTopLevelIdentifierReference(identifier: ts.Identifier): boolean { + let node = identifier as ts.Expression; + let parent = node.parent; // The parent might be undefined for a synthetic node or if `setParentNodes` is set to false // when the SourceFile was created. We can account for such cases using the type checker, at @@ -209,6 +210,15 @@ class PotentialTopLevelReadsVisitor extends o.RecursiveAstVisitor { return false; } + // Unwrap parenthesized identifiers, but use the closest parenthesized expression + // as the reference node so that we can check cases like `{prop: ((value))}`. + if (ts.isParenthesizedExpression(parent) && parent.expression === node) { + while (parent && ts.isParenthesizedExpression(parent)) { + node = parent; + parent = parent.parent; + } + } + // Identifier referenced at the top level. Unlikely. if (ts.isSourceFile(parent)) { return true; diff --git a/packages/compiler-cli/test/ngtsc/hmr_spec.ts b/packages/compiler-cli/test/ngtsc/hmr_spec.ts index 7166bedbe0b7..502bce6a0638 100644 --- a/packages/compiler-cli/test/ngtsc/hmr_spec.ts +++ b/packages/compiler-cli/test/ngtsc/hmr_spec.ts @@ -549,6 +549,41 @@ runInEachFileSystem(() => { ); }); + it('should capture parenthesized dependencies', () => { + enableHmr(); + env.write( + 'test.ts', + ` + import {Component, InjectionToken} from '@angular/core'; + + const token = new InjectionToken('TEST'); + const value = 123; + const otherValue = 321; + + @Component({ + template: '', + providers: [{ + provide: token, + useFactory: () => [(value), ((((otherValue))))] + }] + }) + 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, value, otherValue, Component]));', + ); + expect(jsContents).toContain('useFactory: () => [(value), ((((otherValue))))]'); + expect(hmrContents).toContain( + 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, token, value, otherValue, Component) {', + ); + }); + it('should preserve eager standalone imports in HMR even if they are not used in the template', () => { enableHmr({ // Disable class metadata since it can add noise to the test. From bc2ad7bfd37a61992b550943de5da0eab2eec98b Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Tue, 3 Dec 2024 09:45:45 -0800 Subject: [PATCH 0136/1220] feat(core): support streaming resources (#59573) This commit adds support for creating `resource()`s with streaming response data. A streaming resource is defined by a `stream` option instead of a `loader`, with `stream` being a function returning `Promise>`. Once the streaming loader resolves to a `Signal`, it can continue to update that signal over time, and the values (or errors) will be delivered to via the resource's state. `rxResource()` is updated to leverage this new functionality to handle multiple responses from the underlying Observable. PR Close #59573 --- goldens/public-api/core/index.api.md | 33 ++++- .../public-api/core/rxjs-interop/index.api.md | 4 +- packages/core/rxjs-interop/src/rx_resource.ts | 54 +++++--- .../rxjs-interop/test/rx_resource_spec.ts | 23 +++- packages/core/src/resource/api.ts | 46 ++++++- packages/core/src/resource/resource.ts | 130 ++++++++++++------ packages/core/test/resource/resource_spec.ts | 91 +++++++++++- 7 files changed, 302 insertions(+), 79 deletions(-) diff --git a/goldens/public-api/core/index.api.md b/goldens/public-api/core/index.api.md index c1558563964c..7efb933205b5 100644 --- a/goldens/public-api/core/index.api.md +++ b/goldens/public-api/core/index.api.md @@ -184,6 +184,13 @@ export interface AttributeDecorator { new (name: string): Attribute; } +// @public +export interface BaseResourceOptions { + equal?: ValueEqualityFn; + injector?: Injector; + request?: () => R; +} + // @public export function booleanAttribute(value: unknown): boolean; @@ -1436,6 +1443,11 @@ export class PlatformRef { // @public export type Predicate = (value: T) => boolean; +// @public +export interface PromiseResourceOptions extends BaseResourceOptions { + loader: ResourceLoader; +} + // @public export function provideAppInitializer(initializerFn: () => Observable | Promise | void): EnvironmentProviders; @@ -1610,13 +1622,8 @@ export interface ResourceLoaderParams { request: Exclude, undefined>; } -// @public -export interface ResourceOptions { - equal?: ValueEqualityFn; - injector?: Injector; - loader: ResourceLoader; - request?: () => R; -} +// @public (undocumented) +export type ResourceOptions = PromiseResourceOptions | StreamingResourceOptions; // @public export interface ResourceRef extends WritableResource { @@ -1633,6 +1640,13 @@ export enum ResourceStatus { Resolved = 4 } +// @public +export type ResourceStreamingLoader = (param: ResourceLoaderParams) => PromiseLike>; + // @public export const RESPONSE_INIT: InjectionToken; @@ -1747,6 +1761,11 @@ export interface StaticClassSansProvider { // @public export type StaticProvider = ValueProvider | ExistingProvider | StaticClassProvider | ConstructorProvider | FactoryProvider | any[]; +// @public +export interface StreamingResourceOptions extends BaseResourceOptions { + stream: ResourceStreamingLoader; +} + // @public export abstract class TemplateRef { abstract createEmbeddedView(context: C, injector?: Injector): EmbeddedViewRef; diff --git a/goldens/public-api/core/rxjs-interop/index.api.md b/goldens/public-api/core/rxjs-interop/index.api.md index 2541268868c1..58338349d6a3 100644 --- a/goldens/public-api/core/rxjs-interop/index.api.md +++ b/goldens/public-api/core/rxjs-interop/index.api.md @@ -4,6 +4,7 @@ ```ts +import { BaseResourceOptions } from '@angular/core'; import { DestroyRef } from '@angular/core'; import { Injector } from '@angular/core'; import { MonoTypeOperatorFunction } from 'rxjs'; @@ -11,7 +12,6 @@ import { Observable } from 'rxjs'; import { OutputOptions } from '@angular/core'; import { OutputRef } from '@angular/core'; import { ResourceLoaderParams } from '@angular/core'; -import { ResourceOptions } from '@angular/core'; import { ResourceRef } from '@angular/core'; import { Signal } from '@angular/core'; import { Subscribable } from 'rxjs'; @@ -30,7 +30,7 @@ export function pendingUntilEvent(injector?: Injector): MonoTypeOperatorFunct export function rxResource(opts: RxResourceOptions): ResourceRef; // @public -export interface RxResourceOptions extends Omit, 'loader'> { +export interface RxResourceOptions extends BaseResourceOptions { // (undocumented) loader: (params: ResourceLoaderParams) => Observable; } diff --git a/packages/core/rxjs-interop/src/rx_resource.ts b/packages/core/rxjs-interop/src/rx_resource.ts index f6dae71f0ee2..37b661b1c267 100644 --- a/packages/core/rxjs-interop/src/rx_resource.ts +++ b/packages/core/rxjs-interop/src/rx_resource.ts @@ -8,20 +8,21 @@ import { assertInInjectionContext, - ResourceOptions, resource, ResourceLoaderParams, ResourceRef, + Signal, + signal, + BaseResourceOptions, } from '@angular/core'; -import {Observable, Subject} from 'rxjs'; -import {take, takeUntil} from 'rxjs/operators'; +import {Observable, Subscription} from 'rxjs'; /** * Like `ResourceOptions` but uses an RxJS-based `loader`. * * @experimental */ -export interface RxResourceOptions extends Omit, 'loader'> { +export interface RxResourceOptions extends BaseResourceOptions { loader: (params: ResourceLoaderParams) => Observable; } @@ -35,22 +36,37 @@ export function rxResource(opts: RxResourceOptions): ResourceRef({ ...opts, - loader: (params) => { - const cancelled = new Subject(); - params.abortSignal.addEventListener('abort', () => cancelled.next()); - - // Note: this is identical to `firstValueFrom` which we can't use, - // because at the time of writing, `core` still supports rxjs 6.x. - return new Promise((resolve, reject) => { - opts - .loader(params) - .pipe(take(1), takeUntil(cancelled)) - .subscribe({ - next: resolve, - error: reject, - complete: () => reject(new Error('Resource completed before producing a value')), - }); + stream: (params) => { + let sub: Subscription; + + // Track the abort listener so it can be removed if the Observable completes (as a memory + // optimization). + const onAbort = () => sub.unsubscribe(); + params.abortSignal.addEventListener('abort', onAbort); + + // Start off stream as undefined. + const stream = signal<{value: T} | {error: unknown}>({value: undefined as T}); + let resolve: ((value: Signal<{value: T} | {error: unknown}>) => void) | undefined; + const promise = new Promise>((r) => (resolve = r)); + + function send(value: {value: T} | {error: unknown}): void { + stream.set(value); + resolve?.(stream); + resolve = undefined; + } + + sub = opts.loader(params).subscribe({ + next: (value) => send({value}), + error: (error) => send({error}), + complete: () => { + if (resolve) { + send({error: new Error('Resource completed before producing a value')}); + } + params.abortSignal.removeEventListener('abort', onAbort); + }, }); + + return promise; }, }); } diff --git a/packages/core/rxjs-interop/test/rx_resource_spec.ts b/packages/core/rxjs-interop/test/rx_resource_spec.ts index 64cd2ba0168f..be4d3b797104 100644 --- a/packages/core/rxjs-interop/test/rx_resource_spec.ts +++ b/packages/core/rxjs-interop/test/rx_resource_spec.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -import {of, Observable} from 'rxjs'; +import {of, Observable, BehaviorSubject} from 'rxjs'; import {TestBed} from '@angular/core/testing'; import {ApplicationRef, Injector, signal} from '@angular/core'; import {rxResource} from '@angular/core/rxjs-interop'; @@ -55,6 +55,27 @@ describe('rxResource()', () => { await appRef.whenStable(); expect(unsub).toBe(true); }); + + it('should stream when the loader returns multiple values', async () => { + const injector = TestBed.inject(Injector); + const appRef = TestBed.inject(ApplicationRef); + const response = new BehaviorSubject(1); + const res = rxResource({ + loader: () => response, + injector, + }); + await appRef.whenStable(); + expect(res.value()).toBe(1); + + response.next(2); + expect(res.value()).toBe(2); + + response.next(3); + expect(res.value()).toBe(3); + + response.error('fail'); + expect(res.error()).toBe('fail'); + }); }); async function waitFor(fn: () => boolean): Promise { diff --git a/packages/core/src/resource/api.ts b/packages/core/src/resource/api.ts index c3ed5b346e14..d7337a203177 100644 --- a/packages/core/src/resource/api.ts +++ b/packages/core/src/resource/api.ts @@ -160,12 +160,21 @@ export interface ResourceLoaderParams { */ export type ResourceLoader = (param: ResourceLoaderParams) => PromiseLike; +/** + * Streaming loader for a `Resource`. + * + * @experimental + */ +export type ResourceStreamingLoader = ( + param: ResourceLoaderParams, +) => PromiseLike>; + /** * Options to the `resource` function, for creating a resource. * * @experimental */ -export interface ResourceOptions { +export interface BaseResourceOptions { /** * A reactive function which determines the request to be made. Whenever the request changes, the * loader will be triggered to fetch a new value for the resource. @@ -174,11 +183,6 @@ export interface ResourceOptions { */ request?: () => R; - /** - * Loading function which returns a `Promise` of the resource's value for a given request. - */ - loader: ResourceLoader; - /** * Equality function used to compare the return value of the loader. */ @@ -189,3 +193,33 @@ export interface ResourceOptions { */ injector?: Injector; } + +/** + * Options to the `resource` function, for creating a resource. + * + * @experimental + */ +export interface PromiseResourceOptions extends BaseResourceOptions { + /** + * Loading function which returns a `Promise` of the resource's value for a given request. + */ + loader: ResourceLoader; +} + +/** + * Options to the `resource` function, for creating a resource. + * + * @experimental + */ +export interface StreamingResourceOptions extends BaseResourceOptions { + /** + * Loading function which returns a `Promise` of a signal of the resource's value for a given + * request, which can change over time as new values are received from a stream. + */ + stream: ResourceStreamingLoader; +} + +/** + * @experimental + */ +export type ResourceOptions = PromiseResourceOptions | StreamingResourceOptions; diff --git a/packages/core/src/resource/resource.ts b/packages/core/src/resource/resource.ts index e169a86c78f0..6a2ae0e542c7 100644 --- a/packages/core/src/resource/resource.ts +++ b/packages/core/src/resource/resource.ts @@ -18,6 +18,9 @@ import { ResourceLoader, Resource, ResourceRef, + ResourceStreamingLoader, + PromiseResourceOptions, + StreamingResourceOptions, } from './api'; import {ValueEqualityFn} from '@angular/core/primitives/signals'; import {Injector} from '../di/injector'; @@ -42,7 +45,7 @@ export function resource(options: ResourceOptions): ResourceRef null)) as () => R; return new ResourceImpl( request, - options.loader, + getLoader(options), undefined, options.equal ? wrapEqualityFn(options.equal) : undefined, options.injector ?? inject(Injector), @@ -53,10 +56,10 @@ export function resource(options: ResourceOptions): ResourceRef { - status: ResourceStatus; + // Error state is defined as Resolved && state.error. + status: Exclude; previousStatus: ResourceStatus; - value: T; - error: unknown | undefined; + stream: Signal<{value: T} | {error: unknown}> | undefined; } /** @@ -118,14 +121,22 @@ class ResourceImpl extends BaseWritableResource implements ResourceRef< constructor( request: () => R, - private readonly loaderFn: ResourceLoader, + private readonly loaderFn: ResourceStreamingLoader, private readonly defaultValue: T, private readonly equal: ValueEqualityFn | undefined, injector: Injector, ) { - // Feed a computed signal for the value to `BaseWritableResource`, which will upgrade it to a - // `WritableSignal` that delegates to `ResourceImpl.set`. - super(computed(() => this.state().value, {equal})); + super( + // Feed a computed signal for the value to `BaseWritableResource`, which will upgrade it to a + // `WritableSignal` that delegates to `ResourceImpl.set`. + computed( + () => { + const stream = this.state()?.stream?.(); + return stream && isResolved(stream) ? stream.value : this.defaultValue; + }, + {equal}, + ), + ); this.pendingTasks = injector.get(PendingTasks); // Extend `request()` to include a writable reload signal. @@ -136,7 +147,10 @@ class ResourceImpl extends BaseWritableResource implements ResourceRef< // 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>({ + 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 @@ -154,14 +168,11 @@ class ResourceImpl extends BaseWritableResource implements ResourceRef< status, // When the state of the resource changes due to the request, remember the previous status // for the loader to consider. - previousStatus: previous?.value.status ?? ResourceStatus.Idle, + 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. - value: - previous && status === ResourceStatus.Reloading - ? previous.value.value - : this.defaultValue, - error: undefined, + stream: + previous && status === ResourceStatus.Reloading ? previous.value.stream : undefined, }) satisfies ResourceState, }); @@ -174,8 +185,17 @@ class ResourceImpl extends BaseWritableResource implements ResourceRef< injector.get(DestroyRef).onDestroy(() => this.destroy()); } - override readonly status = computed(() => this.state().status); - override readonly error = computed(() => this.state().error); + 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 error = computed(() => { + const stream = this.state().stream?.(); + return stream && !isResolved(stream) ? stream.error : undefined; + }); /** * Called either directly via `WritableResource.set` or via `.value.set()`. @@ -185,8 +205,8 @@ class ResourceImpl extends BaseWritableResource implements ResourceRef< return; } - const currentState = untracked(this.state); - if (this.equal ? this.equal(currentState.value, value) : currentState.value === value) { + const current = untracked(this.value); + if (this.equal ? this.equal(current, value) : current === value) { return; } @@ -194,8 +214,7 @@ class ResourceImpl extends BaseWritableResource implements ResourceRef< this.state.set({ status: ResourceStatus.Local, previousStatus: ResourceStatus.Local, - value, - error: undefined, + stream: signal({value}), }); // We're departing from whatever state the resource was in previously, so cancel any in-progress @@ -228,8 +247,7 @@ class ResourceImpl extends BaseWritableResource implements ResourceRef< this.state.set({ status: ResourceStatus.Idle, previousStatus: ResourceStatus.Idle, - value: this.defaultValue, - error: undefined, + stream: undefined, }); } @@ -268,51 +286,48 @@ class ResourceImpl extends BaseWritableResource implements ResourceRef< // After the loading operation is cancelled, `this.resolvePendingTask` no longer represents this // particular task, but this `await` may eventually resolve/reject. Thus, when we cancel in // response to (1) below, we need to cancel the locally saved task. - const resolvePendingTask = (this.resolvePendingTask = this.pendingTasks.add()); + let resolvePendingTask: (() => void) | undefined = (this.resolvePendingTask = + this.pendingTasks.add()); const {signal: abortSignal} = (this.pendingController = new AbortController()); + try { // The actual loading is run through `untracked` - only the request side of `resource` is // reactive. This avoids any confusion with signals tracking or not tracking depending on // which side of the `await` they are. - const result = await untracked(() => + const stream = await untracked(() => this.loaderFn({ - abortSignal, request: request as Exclude, + abortSignal, previous: { status: previousStatus, }, }), ); + if (abortSignal.aborted) { - // This load operation was cancelled. return; } - // Success :) + this.state.set({ status: ResourceStatus.Resolved, previousStatus: ResourceStatus.Resolved, - value: result, - error: undefined, + stream, }); } catch (err) { if (abortSignal.aborted) { - // This load operation was cancelled. return; } - // Fail :( + this.state.set({ - status: ResourceStatus.Error, + status: ResourceStatus.Resolved, previousStatus: ResourceStatus.Error, - value: this.defaultValue, - error: err, + stream: signal({error: err}), }); } finally { - // Resolve the pending task now that loading is done. - resolvePendingTask(); - - // Free the abort controller to drop any registered 'abort' callbacks. - this.pendingController = undefined; + // Resolve the pending task now that the resource has a value. + resolvePendingTask?.(); + resolvePendingTask = undefined; } } @@ -332,3 +347,38 @@ class ResourceImpl extends BaseWritableResource implements ResourceRef< function wrapEqualityFn(equal: ValueEqualityFn): ValueEqualityFn { return (a, b) => (a === undefined || b === undefined ? a === b : equal(a, b)); } + +function getLoader(options: ResourceOptions): ResourceStreamingLoader { + if (isStreamingResourceOptions(options)) { + return options.stream; + } + + return async (params) => { + try { + return signal({value: await options.loader(params)}); + } catch (err) { + return signal({error: err}); + } + }; +} + +function isStreamingResourceOptions( + options: ResourceOptions, +): options is StreamingResourceOptions { + return !!(options as StreamingResourceOptions).stream; +} + +function computeStatusOfState(state: ResourceState | undefined): ResourceStatus { + switch (state?.status) { + case undefined: + return ResourceStatus.Idle; + case ResourceStatus.Resolved: + return isResolved(untracked(state.stream!)) ? ResourceStatus.Resolved : ResourceStatus.Error; + default: + return state!.status; + } +} + +function isResolved(state: {value: T} | {error: unknown}): 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 452418ea097a..bc760e910456 100644 --- a/packages/core/test/resource/resource_spec.ts +++ b/packages/core/test/resource/resource_spec.ts @@ -32,7 +32,7 @@ abstract class MockBackend { } abort(req: T) { - this.reject(req, 'aborted'); + return this.reject(req, 'aborted'); } reject(req: T, reason: any) { @@ -42,10 +42,10 @@ abstract class MockBackend { entry.reject(reason); } - return Promise.resolve(); + return flushMicrotasks(); } - async flush() { + async flush(): Promise { const allPending = Array.from(this.pending.values()).map((pending) => pending.promise); for (const [req, {resolve}] of this.pending) { @@ -53,7 +53,8 @@ abstract class MockBackend { } this.pending.clear(); - return Promise.all(allPending); + await Promise.all(allPending); + await flushMicrotasks(); } protected abstract prepareResponse(request: T): R; @@ -151,6 +152,7 @@ describe('resource', () => { counter.update((value) => value + 1); TestBed.flushEffects(); + await backend.flush(); expect(echoResource.status()).toBe(ResourceStatus.Error); expect(echoResource.isLoading()).toBeFalse(); @@ -496,4 +498,85 @@ describe('resource', () => { expect(echoResource.status()).toBe(ResourceStatus.Local); expect(echoResource.value()).toBe(3); }); + + it('should allow streaming', async () => { + const appRef = TestBed.inject(ApplicationRef); + const res = resource({ + stream: async () => signal({value: 'done'}), + injector: TestBed.inject(Injector), + }); + + await appRef.whenStable(); + expect(res.status()).toBe(ResourceStatus.Resolved); + expect(res.value()).toBe('done'); + }); + + it('should error via error()', async () => { + const appRef = TestBed.inject(ApplicationRef); + const res = resource({ + stream: async () => signal({error: 'fail'}), + injector: TestBed.inject(Injector), + }); + + await appRef.whenStable(); + expect(res.status()).toBe(ResourceStatus.Error); + expect(res.error()).toBe('fail'); + }); + + it('should transition across streamed states', async () => { + const appRef = TestBed.inject(ApplicationRef); + const stream = signal<{value: number} | {error: unknown}>({value: 1}); + + const res = resource({ + stream: async () => stream, + injector: TestBed.inject(Injector), + }); + await appRef.whenStable(); + + stream.set({value: 2}); + expect(res.value()).toBe(2); + + stream.set({value: 3}); + expect(res.value()).toBe(3); + + stream.set({error: 'fail'}); + expect(res.error()).toBe('fail'); + + stream.set({value: 4}); + expect(res.value()).toBe(4); + }); + + it('should not accept new values/errors after a request is cancelled', async () => { + const appRef = TestBed.inject(ApplicationRef); + const stream = signal<{value: number} | {error: unknown}>({value: 0}); + const request = signal(1); + const res = resource({ + request, + stream: async ({request}) => { + if (request === 1) { + return stream; + } else { + return signal({value: 0}); + } + }, + injector: TestBed.inject(Injector), + }); + await appRef.whenStable(); + + stream.set({value: 1}); + expect(res.value()).toBe(1); + + // Changing the request aborts the previous one. + request.set(2); + + // The previous set/error functions should no longer result in changes to the resource. + stream.set({value: 2}); + expect(res.value()).toBe(undefined); + stream.set({error: 'fail'}); + expect(res.value()).toBe(undefined); + }); }); + +function flushMicrotasks(): Promise { + return new Promise((resolve) => setTimeout(resolve, 0)); +} From 431166d93fd3eb827f312ea51d091ebf15d9557c Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Mon, 20 Jan 2025 12:54:15 +0100 Subject: [PATCH 0137/1220] fix(core): skip component ID collision warning during SSR (#59625) The component ID collision check tries to account for components being replaced by checking for the `type`, however that might not work during SSR. These changes disable the warning since it's primarily useful on the browser anyways. PR Close #59625 --- packages/core/src/render3/definition.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/core/src/render3/definition.ts b/packages/core/src/render3/definition.ts index 946afb68a4f7..1314a902a253 100644 --- a/packages/core/src/render3/definition.ts +++ b/packages/core/src/render3/definition.ts @@ -750,7 +750,13 @@ function getComponentId(componentDef: ComponentDef): string { const compId = 'c' + hash; - if (typeof ngDevMode === 'undefined' || ngDevMode) { + if ( + (typeof ngDevMode === 'undefined' || ngDevMode) && + // Skip the check on the server since we can't guarantee the same component instance between + // requests. Note that we can't use DI to check if we're on the server, because the component + // hasn't been instantiated yet. + (typeof ngServerMode === 'undefined' || !ngServerMode) + ) { if (GENERATED_COMP_IDS.has(compId)) { const previousCompDefType = GENERATED_COMP_IDS.get(compId)!; if (previousCompDefType !== componentDef.type) { From 8de0f3f79b0b945a11edf51a9555df6b421afff8 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Mon, 20 Jan 2025 14:22:49 -0500 Subject: [PATCH 0138/1220] fix(compiler-cli): handle conditional expressions when extracting dependencies (#59637) Updates the HMR dependencies extraction logic to handle conditional expressions. For example, `providers: [condition ? providersA : providersB]`. PR Close #59637 --- .../src/ngtsc/hmr/src/extract_dependencies.ts | 4 +++ packages/compiler-cli/test/ngtsc/hmr_spec.ts | 32 +++++++++++++++++++ 2 files changed, 36 insertions(+) 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 46d258f4139b..0d44dbc6f2db 100644 --- a/packages/compiler-cli/src/ngtsc/hmr/src/extract_dependencies.ts +++ b/packages/compiler-cli/src/ngtsc/hmr/src/extract_dependencies.ts @@ -310,6 +310,10 @@ class PotentialTopLevelReadsVisitor extends o.RecursiveAstVisitor { return (parent.propertyName || parent.name) === node; } + if (ts.isConditionalExpression(parent)) { + return parent.condition === node || parent.whenFalse === node || parent.whenTrue === node; + } + // Otherwise it's not top-level. return false; } diff --git a/packages/compiler-cli/test/ngtsc/hmr_spec.ts b/packages/compiler-cli/test/ngtsc/hmr_spec.ts index 502bce6a0638..29e68030345f 100644 --- a/packages/compiler-cli/test/ngtsc/hmr_spec.ts +++ b/packages/compiler-cli/test/ngtsc/hmr_spec.ts @@ -549,6 +549,38 @@ runInEachFileSystem(() => { ); }); + it('should capture conditional expression dependencies', () => { + enableHmr(); + env.write( + 'test.ts', + ` + import {Component, InjectionToken} from '@angular/core'; + + const providersA: any[] = []; + const providersB: any[] = []; + const condition = true; + + @Component({ + template: '', + providers: [condition ? providersA : providersB] + }) + 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], [condition, providersA, providersB, Component]));', + ); + expect(hmrContents).toContain( + 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, condition, providersA, providersB, Component) {', + ); + }); + it('should capture parenthesized dependencies', () => { enableHmr(); env.write( From 5a13dff22c227e731b46171a2dde3686a50c5c32 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Mon, 20 Jan 2025 17:45:24 -0500 Subject: [PATCH 0139/1220] fix(compiler-cli): handle new expressions when extracting dependencies (#59637) Updates the HMR dependencies extraction logic to handle new expressions. For example, `deps: [[new Optional(), dep]]`. PR Close #59637 --- .../src/ngtsc/hmr/src/extract_dependencies.ts | 3 +- packages/compiler-cli/test/ngtsc/hmr_spec.ts | 37 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) 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 0d44dbc6f2db..8f949cd3e0f9 100644 --- a/packages/compiler-cli/src/ngtsc/hmr/src/extract_dependencies.ts +++ b/packages/compiler-cli/src/ngtsc/hmr/src/extract_dependencies.ts @@ -245,7 +245,8 @@ class PotentialTopLevelReadsVisitor extends o.RecursiveAstVisitor { ts.isWhileStatement(parent) || ts.isSwitchStatement(parent) || ts.isCaseClause(parent) || - ts.isThrowStatement(parent) + ts.isThrowStatement(parent) || + ts.isNewExpression(parent) ) { return parent.expression === node; } diff --git a/packages/compiler-cli/test/ngtsc/hmr_spec.ts b/packages/compiler-cli/test/ngtsc/hmr_spec.ts index 29e68030345f..3cabd09b0c9b 100644 --- a/packages/compiler-cli/test/ngtsc/hmr_spec.ts +++ b/packages/compiler-cli/test/ngtsc/hmr_spec.ts @@ -616,6 +616,43 @@ runInEachFileSystem(() => { ); }); + it('should capture new expression dependencies', () => { + enableHmr(); + env.write( + 'test.ts', + ` + import {Component, InjectionToken, Optional} from '@angular/core'; + const token = new InjectionToken('TEST'); + const dep = new InjectionToken('TEST-DEP'); + const value = 5; + @Component({ + template: '', + providers: [{ + provide: token, + useFactory: () => { + const v = value; + return v; + }, + deps: [[new Optional(), dep]] + }] + }) + 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, value, Optional, dep, Component]));', + ); + expect(hmrContents).toContain( + 'export default function Cmp_UpdateMetadata(Cmp, ɵɵnamespaces, token, value, Optional, dep, Component) {', + ); + }); + it('should preserve eager standalone imports in HMR even if they are not used in the template', () => { enableHmr({ // Disable class metadata since it can add noise to the test. From 76c4a77af7b6afb6df6af8f995def9b0b926e384 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Fri, 17 Jan 2025 18:00:29 +0100 Subject: [PATCH 0140/1220] refactor(core): move TNode manipulation logic to its own file (#59601) Move TNode manipulation logic to its own file and update existing refereces. PR Close #59601 --- packages/core/src/render3/component_ref.ts | 38 +-- .../core/src/render3/dom_node_manipulation.ts | 58 +++- packages/core/src/render3/i18n/i18n_parse.ts | 3 +- packages/core/src/render3/i18n/i18n_util.ts | 2 +- .../core/src/render3/instructions/element.ts | 16 +- .../render3/instructions/element_container.ts | 8 +- .../render3/instructions/let_declaration.ts | 2 +- .../src/render3/instructions/projection.ts | 2 +- .../core/src/render3/instructions/shared.ts | 275 --------------- .../core/src/render3/instructions/template.ts | 2 +- .../core/src/render3/instructions/text.ts | 3 +- .../core/src/render3/node_manipulation.ts | 55 --- .../core/src/render3/tnode_manipulation.ts | 322 ++++++++++++++++++ .../bundling/defer/bundle.golden_symbols.json | 1 + packages/core/test/render3/di_spec.ts | 7 +- .../i18n/i18n_insert_before_index_spec.ts | 2 +- .../test/render3/instructions/shared_spec.ts | 3 +- packages/core/test/render3/matchers_spec.ts | 3 +- .../render3/node_selector_matcher_spec.ts | 3 +- .../styling_next/static_styling_spec.ts | 2 +- .../styling_next/style_binding_list_spec.ts | 2 +- packages/core/test/render3/view_fixture.ts | 3 +- packages/core/test/render3/view_utils_spec.ts | 3 +- 23 files changed, 427 insertions(+), 388 deletions(-) create mode 100644 packages/core/src/render3/tnode_manipulation.ts diff --git a/packages/core/src/render3/component_ref.ts b/packages/core/src/render3/component_ref.ts index 4c02e57e687a..dac2e1c2af18 100644 --- a/packages/core/src/render3/component_ref.ts +++ b/packages/core/src/render3/component_ref.ts @@ -45,7 +45,6 @@ import { createTView, getInitialLViewFlagsFromDef, getOrCreateComponentTView, - getOrCreateTNode, initializeDirectives, invokeDirectivesHostBindings, locateHostElement, @@ -76,8 +75,7 @@ import { } from './interfaces/view'; import {MATH_ML_NAMESPACE, SVG_NAMESPACE} from './namespaces'; -import {createElementNode} from './dom_node_manipulation'; -import {setupStaticAttributes} from './node_manipulation'; +import {createElementNode, setupStaticAttributes} from './dom_node_manipulation'; import { extractAttrsAndClassesFromSelector, stringifyCSSSelectorList, @@ -95,6 +93,7 @@ import {ProfilerEvent} from './profiler_types'; import {executeContentQueries} from './queries/query_execution'; import {AttributeMarker} from './interfaces/attribute_marker'; import {CssSelector} from './interfaces/projection'; +import {getOrCreateTNode} from './tnode_manipulation'; export class ComponentFactoryResolver extends AbstractComponentFactoryResolver { /** @@ -343,6 +342,8 @@ export class ComponentFactory extends AbstractComponentFactory { hydrationInfo, ); + rootLView[HEADER_OFFSET] = hostRNode; + // rootView is the parent when bootstrapping // TODO(misko): it looks like we are entering view here but we don't really need to as // `renderView` does that. However as the code is written it is needed because @@ -351,7 +352,6 @@ export class ComponentFactory extends AbstractComponentFactory { enterView(rootLView); let component: T; - let tElementNode: TElementNode; let componentView: LView | null = null; try { @@ -373,13 +373,21 @@ export class ComponentFactory extends AbstractComponentFactory { rootDirectives = [rootComponentDef]; } - const hostTNode = createRootComponentTNode(rootLView, hostRNode); // 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. getRootTAttributesFromSelector(this.componentDef.selectors[0]); + // TODO: this logic is shared with the element instruction first create pass + const hostTNode = getOrCreateTNode( + rootTView, + HEADER_OFFSET, + TNodeType.Element, + '#host', + tAttributes, + ); + for (const def of rootDirectives) { hostTNode.mergedAttrs = mergeHostAttrs(hostTNode.mergedAttrs, def.hostAttrs); } @@ -403,8 +411,6 @@ export class ComponentFactory extends AbstractComponentFactory { environment, ); - tElementNode = getTNode(rootTView, HEADER_OFFSET) as TElementNode; - if (projectableNodes !== undefined) { projectNodes(hostTNode, this.ngContentSelectors, projectableNodes); } @@ -433,12 +439,13 @@ export class ComponentFactory extends AbstractComponentFactory { leaveView(); } + const hostTNode = getTNode(rootTView, HEADER_OFFSET) as TElementNode; return new ComponentRef( this.componentType, component, - createElementRef(tElementNode, rootLView), + createElementRef(hostTNode, rootLView), rootLView, - tElementNode, + hostTNode, ); } finally { setActiveConsumer(prevConsumer); @@ -523,19 +530,6 @@ export class ComponentRef extends AbstractComponentRef { /** Represents a HostFeature function. */ type HostFeature = (component: T, componentDef: ComponentDef) => void; -/** Creates a TNode that can be used to instantiate a root component. */ -function createRootComponentTNode(lView: LView, rNode: RNode): TElementNode { - const tView = lView[TVIEW]; - const index = HEADER_OFFSET; - ngDevMode && assertIndexInRange(lView, index); - lView[index] = rNode; - - // '#host' is added here as we don't know the real host DOM name (we don't want to read it) and at - // the same time we want to communicate the debug `TNode` that this is a special `TNode` - // representing a host element. - return getOrCreateTNode(tView, index, TNodeType.Element, '#host', null); -} - /** * Creates the root component view and the root component node. * diff --git a/packages/core/src/render3/dom_node_manipulation.ts b/packages/core/src/render3/dom_node_manipulation.ts index 029376b8fef8..c6c87946eb25 100644 --- a/packages/core/src/render3/dom_node_manipulation.ts +++ b/packages/core/src/render3/dom_node_manipulation.ts @@ -9,7 +9,9 @@ import {Renderer} from './interfaces/renderer'; import {RComment, RElement, RNode, RText} from './interfaces/renderer_dom'; import {escapeCommentText} from '../util/dom'; -import {assertDefined} from '../util/assert'; +import {assertDefined, assertString} from '../util/assert'; +import {setUpAttributes} from './util/attrs_utils'; +import {TNode} from './interfaces/node'; export function createTextNode(renderer: Renderer, value: string): RText { ngDevMode && ngDevMode.rendererCreateTextNode++; @@ -100,3 +102,57 @@ export function nativeRemoveNode(renderer: Renderer, rNode: RNode, isHostElement export function clearElementContents(rElement: RElement): void { rElement.textContent = ''; } + +/** + * Write `cssText` to `RElement`. + * + * This function does direct write without any reconciliation. Used for writing initial values, so + * that static styling values do not pull in the style parser. + * + * @param renderer Renderer to use + * @param element The element which needs to be updated. + * @param newValue The new class list to write. + */ +function writeDirectStyle(renderer: Renderer, element: RElement, newValue: string) { + ngDevMode && assertString(newValue, "'newValue' should be a string"); + renderer.setAttribute(element, 'style', newValue); + ngDevMode && ngDevMode.rendererSetStyle++; +} + +/** + * Write `className` to `RElement`. + * + * This function does direct write without any reconciliation. Used for writing initial values, so + * that static styling values do not pull in the style parser. + * + * @param renderer Renderer to use + * @param element The element which needs to be updated. + * @param newValue The new class list to write. + */ +function writeDirectClass(renderer: Renderer, element: RElement, newValue: string) { + ngDevMode && assertString(newValue, "'newValue' should be a string"); + if (newValue === '') { + // There are tests in `google3` which expect `element.getAttribute('class')` to be `null`. + renderer.removeAttribute(element, 'class'); + } else { + renderer.setAttribute(element, 'class', newValue); + } + ngDevMode && ngDevMode.rendererSetClassName++; +} + +/** Sets up the static DOM attributes on an `RNode`. */ +export function setupStaticAttributes(renderer: Renderer, element: RElement, tNode: TNode) { + const {mergedAttrs, classes, styles} = tNode; + + if (mergedAttrs !== null) { + setUpAttributes(renderer, element, mergedAttrs); + } + + if (classes !== null) { + writeDirectClass(renderer, element, classes); + } + + if (styles !== null) { + writeDirectStyle(renderer, element, styles); + } +} diff --git a/packages/core/src/render3/i18n/i18n_parse.ts b/packages/core/src/render3/i18n/i18n_parse.ts index 713c977d2f58..ca5343361808 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, createTNodeAtIndex} from '../instructions/shared'; +import {allocExpando} from '../instructions/shared'; import {getDocument} from '../interfaces/document'; import { ELEMENT_MARKER, @@ -68,6 +68,7 @@ import { setTIcu, setTNodeInsertBeforeIndex, } from './i18n_util'; +import {createTNodeAtIndex} from '../tnode_manipulation'; 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/i18n/i18n_util.ts b/packages/core/src/render3/i18n/i18n_util.ts index 6a6e6079bc33..486c26ce1105 100644 --- a/packages/core/src/render3/i18n/i18n_util.ts +++ b/packages/core/src/render3/i18n/i18n_util.ts @@ -13,13 +13,13 @@ import { throwError, } from '../../util/assert'; import {assertTIcu, assertTNode} from '../assert'; -import {createTNodeAtIndex} from '../instructions/shared'; import {IcuCreateOpCode, TIcu} from '../interfaces/i18n'; import {TIcuContainerNode, TNode, TNodeType} from '../interfaces/node'; import {LView, TView} from '../interfaces/view'; import {assertTNodeType} from '../node_assert'; import {setI18nHandling} from '../node_manipulation'; import {getInsertInFrontOfRNodeWithI18n, processI18nInsertBefore} from '../node_manipulation_i18n'; +import {createTNodeAtIndex} from '../tnode_manipulation'; import {addTNodeAndUpdateInsertBeforeIndex} from './i18n_insert_before_index'; diff --git a/packages/core/src/render3/instructions/element.ts b/packages/core/src/render3/instructions/element.ts index a2e991eea7a7..c9a186d489de 100644 --- a/packages/core/src/render3/instructions/element.ts +++ b/packages/core/src/render3/instructions/element.ts @@ -42,8 +42,12 @@ import {isComponentHost, isContentQueryHost, isDirectiveHost} from '../interface import {HEADER_OFFSET, HYDRATION, LView, RENDERER, TView} from '../interfaces/view'; import {assertTNodeType} from '../node_assert'; import {executeContentQueries} from '../queries/query_execution'; -import {appendChild, setupStaticAttributes} from '../node_manipulation'; -import {clearElementContents, createElementNode} from '../dom_node_manipulation'; +import {appendChild} from '../node_manipulation'; +import { + clearElementContents, + createElementNode, + setupStaticAttributes, +} from '../dom_node_manipulation'; import { decreaseElementDepthCount, enterSkipHydrationBlock, @@ -68,12 +72,8 @@ import {getConstant} from '../util/view_utils'; import {validateElementIsKnown} from './element_validation'; import {setDirectiveInputsWhichShadowsStyling} from './property'; -import { - createDirectivesInstances, - getOrCreateTNode, - resolveDirectives, - saveResolvedLocalsInData, -} from './shared'; +import {createDirectivesInstances, resolveDirectives, saveResolvedLocalsInData} from './shared'; +import {getOrCreateTNode} from '../tnode_manipulation'; function elementStartFirstCreatePass( index: number, diff --git a/packages/core/src/render3/instructions/element_container.ts b/packages/core/src/render3/instructions/element_container.ts index d2e9b9782eac..3eef61a7d460 100644 --- a/packages/core/src/render3/instructions/element_container.ts +++ b/packages/core/src/render3/instructions/element_container.ts @@ -41,12 +41,8 @@ import { import {computeStaticStyling} from '../styling/static_styling'; import {getConstant} from '../util/view_utils'; -import { - createDirectivesInstances, - getOrCreateTNode, - resolveDirectives, - saveResolvedLocalsInData, -} from './shared'; +import {createDirectivesInstances, resolveDirectives, saveResolvedLocalsInData} from './shared'; +import {getOrCreateTNode} from '../tnode_manipulation'; function elementContainerStartFirstCreatePass( index: number, diff --git a/packages/core/src/render3/instructions/let_declaration.ts b/packages/core/src/render3/instructions/let_declaration.ts index 7b388a9932b7..77c16a845b05 100644 --- a/packages/core/src/render3/instructions/let_declaration.ts +++ b/packages/core/src/render3/instructions/let_declaration.ts @@ -11,8 +11,8 @@ import {performanceMarkFeature} from '../../util/performance'; import {TNodeType} from '../interfaces/node'; import {HEADER_OFFSET} from '../interfaces/view'; import {getContextLView, getLView, getSelectedIndex, getTView, setCurrentTNode} from '../state'; +import {getOrCreateTNode} from '../tnode_manipulation'; import {load} from '../util/view_utils'; -import {getOrCreateTNode} from './shared'; import {store} from './storage'; /** Object that indicates the value of a `@let` declaration that hasn't been initialized yet. */ diff --git a/packages/core/src/render3/instructions/projection.ts b/packages/core/src/render3/instructions/projection.ts index 2e8fee1a02c3..1c75979e179b 100644 --- a/packages/core/src/render3/instructions/projection.ts +++ b/packages/core/src/render3/instructions/projection.ts @@ -26,13 +26,13 @@ import { isSelectorInSelectorList, } from '../node_selector_matcher'; import {getLView, getTView, isInSkipHydrationBlock, setCurrentTNodeAsNotParent} from '../state'; +import {getOrCreateTNode} from '../tnode_manipulation'; import { addLViewToLContainer, createAndRenderEmbeddedLView, shouldAddViewToDom, } from '../view_manipulation'; -import {getOrCreateTNode} from './shared'; import {declareTemplate} from './template'; /** diff --git a/packages/core/src/render3/instructions/shared.ts b/packages/core/src/render3/instructions/shared.ts index 29303e61cfdd..34c19f4c4b88 100644 --- a/packages/core/src/render3/instructions/shared.ts +++ b/packages/core/src/render3/instructions/shared.ts @@ -30,7 +30,6 @@ import { assertNotEqual, assertNotSame, assertSame, - assertString, } from '../../util/assert'; import {escapeCommentText} from '../../util/dom'; import {normalizeDebugBindingName, normalizeDebugBindingValue} from '../../util/ng_reflect'; @@ -41,7 +40,6 @@ import { assertLView, assertNoDuplicateDirectives, assertTNodeForLView, - assertTNodeForTView, } from '../assert'; import {attachPatchData} from '../context_discovery'; import {getFactoryDef} from '../definition_factory'; @@ -202,148 +200,6 @@ export function createLView( return lView as LView; } -/** - * Create and stores the TNode, and hooks it up to the tree. - * - * @param tView The current `TView`. - * @param index The index at which the TNode should be saved (null if view, since they are not - * saved). - * @param type The type of TNode to create - * @param native The native element for this node, if applicable - * @param name The tag name of the associated native element, if applicable - * @param attrs Any attrs for the native element, if applicable - */ -export function getOrCreateTNode( - tView: TView, - index: number, - type: TNodeType.Element | TNodeType.Text, - name: string | null, - attrs: TAttributes | null, -): TElementNode; -export function getOrCreateTNode( - tView: TView, - index: number, - type: TNodeType.Container, - name: string | null, - attrs: TAttributes | null, -): TContainerNode; -export function getOrCreateTNode( - tView: TView, - index: number, - type: TNodeType.Projection, - name: null, - attrs: TAttributes | null, -): TProjectionNode; -export function getOrCreateTNode( - tView: TView, - index: number, - type: TNodeType.ElementContainer, - name: string | null, - attrs: TAttributes | null, -): TElementContainerNode; -export function getOrCreateTNode( - tView: TView, - index: number, - type: TNodeType.Icu, - name: null, - attrs: TAttributes | null, -): TElementContainerNode; -export function getOrCreateTNode( - tView: TView, - index: number, - type: TNodeType.LetDeclaration, - name: null, - attrs: null, -): TLetDeclarationNode; -export function getOrCreateTNode( - tView: TView, - index: number, - type: TNodeType, - name: string | null, - attrs: TAttributes | null, -): TElementNode & - TContainerNode & - TElementContainerNode & - TProjectionNode & - TIcuContainerNode & - TLetDeclarationNode { - ngDevMode && - index !== 0 && // 0 are bogus nodes and they are OK. See `createContainerRef` in - // `view_engine_compatibility` for additional context. - assertGreaterThanOrEqual(index, HEADER_OFFSET, "TNodes can't be in the LView header."); - // Keep this function short, so that the VM will inline it. - ngDevMode && assertPureTNodeType(type); - let tNode = tView.data[index] as TNode; - if (tNode === null) { - tNode = createTNodeAtIndex(tView, index, type, name, attrs); - if (isInI18nBlock()) { - // If we are in i18n block then all elements should be pre declared through `Placeholder` - // See `TNodeType.Placeholder` and `LFrame.inI18n` for more context. - // If the `TNode` was not pre-declared than it means it was not mentioned which means it was - // removed, so we mark it as detached. - tNode.flags |= TNodeFlags.isDetached; - } - } else if (tNode.type & TNodeType.Placeholder) { - tNode.type = type; - tNode.value = name; - tNode.attrs = attrs; - const parent = getCurrentParentTNode(); - tNode.injectorIndex = parent === null ? -1 : parent.injectorIndex; - ngDevMode && assertTNodeForTView(tNode, tView); - ngDevMode && assertEqual(index, tNode.index, 'Expecting same index'); - } - setCurrentTNode(tNode, true); - return tNode as TElementNode & - TContainerNode & - TElementContainerNode & - TProjectionNode & - TIcuContainerNode; -} - -export function createTNodeAtIndex( - tView: TView, - index: number, - type: TNodeType, - name: string | null, - attrs: TAttributes | null, -) { - const currentTNode = getCurrentTNodePlaceholderOk(); - const isParent = isCurrentTNodeParent(); - const parent = isParent ? currentTNode : currentTNode && currentTNode.parent; - // Parents cannot cross component boundaries because components will be used in multiple places. - const tNode = (tView.data[index] = createTNode( - tView, - parent as TElementNode | TContainerNode, - type, - index, - name, - attrs, - )); - // Assign a pointer to the first child node of a given view. The first node is not always the one - // at index 0, in case of i18n, index 0 can be the instruction `i18nStart` and the first node has - // the index 1 or more, so we can't just check node index. - if (tView.firstChild === null) { - tView.firstChild = tNode; - } - if (currentTNode !== null) { - if (isParent) { - // FIXME(misko): This logic looks unnecessarily complicated. Could we simplify? - if (currentTNode.child == null && tNode.parent !== null) { - // We are in the same view, which means we are adding content node to the parent view. - currentTNode.child = tNode; - } - } else { - if (currentTNode.next === null) { - // In the case of i18n the `currentTNode` may already be linked, in which case we don't want - // to break the links which i18n created. - currentTNode.next = tNode; - tNode.prev = currentTNode; - } - } - } - return tNode; -} - /** * When elements are created dynamically after a view blueprint is created (e.g. through * i18nApply()), we need to adjust the blueprint for future @@ -644,137 +500,6 @@ export function enableApplyRootElementTransformImpl() { _applyRootElementTransformImpl = applyRootElementTransformImpl; } -/** - * Constructs a TNode object from the arguments. - * - * @param tView `TView` to which this `TNode` belongs - * @param tParent Parent `TNode` - * @param type The type of the node - * @param index The index of the TNode in TView.data, adjusted for HEADER_OFFSET - * @param tagName The tag name of the node - * @param attrs The attributes defined on this node - * @returns the TNode object - */ -export function createTNode( - tView: TView, - tParent: TElementNode | TContainerNode | null, - type: TNodeType.Container, - index: number, - tagName: string | null, - attrs: TAttributes | null, -): TContainerNode; -export function createTNode( - tView: TView, - tParent: TElementNode | TContainerNode | null, - type: TNodeType.Element | TNodeType.Text, - index: number, - tagName: string | null, - attrs: TAttributes | null, -): TElementNode; -export function createTNode( - tView: TView, - tParent: TElementNode | TContainerNode | null, - type: TNodeType.ElementContainer, - index: number, - tagName: string | null, - attrs: TAttributes | null, -): TElementContainerNode; -export function createTNode( - tView: TView, - tParent: TElementNode | TContainerNode | null, - type: TNodeType.Icu, - index: number, - tagName: string | null, - attrs: TAttributes | null, -): TIcuContainerNode; -export function createTNode( - tView: TView, - tParent: TElementNode | TContainerNode | null, - type: TNodeType.Projection, - index: number, - tagName: string | null, - attrs: TAttributes | null, -): TProjectionNode; -export function createTNode( - tView: TView, - tParent: TElementNode | TContainerNode | null, - type: TNodeType.LetDeclaration, - index: number, - tagName: null, - attrs: null, -): TLetDeclarationNode; -export function createTNode( - tView: TView, - tParent: TElementNode | TContainerNode | null, - type: TNodeType, - index: number, - tagName: string | null, - attrs: TAttributes | null, -): TNode; -export function createTNode( - tView: TView, - tParent: TElementNode | TContainerNode | null, - type: TNodeType, - index: number, - value: string | null, - attrs: TAttributes | null, -): TNode { - ngDevMode && - index !== 0 && // 0 are bogus nodes and they are OK. See `createContainerRef` in - // `view_engine_compatibility` for additional context. - assertGreaterThanOrEqual(index, HEADER_OFFSET, "TNodes can't be in the LView header."); - ngDevMode && assertNotSame(attrs, undefined, "'undefined' is not valid value for 'attrs'"); - ngDevMode && ngDevMode.tNode++; - ngDevMode && tParent && assertTNodeForTView(tParent, tView); - let injectorIndex = tParent ? tParent.injectorIndex : -1; - let flags = 0; - if (isInSkipHydrationBlock()) { - flags |= TNodeFlags.inSkipHydrationBlock; - } - const tNode = { - type, - index, - insertBeforeIndex: null, - injectorIndex, - directiveStart: -1, - directiveEnd: -1, - directiveStylingLast: -1, - componentOffset: -1, - propertyBindings: null, - flags, - providerIndexes: 0, - value: value, - attrs: attrs, - mergedAttrs: null, - localNames: null, - initialInputs: undefined, - inputs: null, - outputs: null, - tView: null, - next: null, - prev: null, - projectionNext: null, - child: null, - parent: tParent, - projection: null, - styles: null, - stylesWithoutHost: null, - residualStyles: undefined, - classes: null, - classesWithoutHost: null, - residualClasses: undefined, - classBindings: 0 as TStylingRange, - styleBindings: 0 as TStylingRange, - }; - if (ngDevMode) { - // For performance reasons it is important that the tNode 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(tNode); - } - return tNode; -} - /** Mode for capturing node bindings. */ const enum CaptureNodeBindingMode { Inputs, diff --git a/packages/core/src/render3/instructions/template.ts b/packages/core/src/render3/instructions/template.ts index ce9ca7c292f8..05b209f3e76f 100644 --- a/packages/core/src/render3/instructions/template.ts +++ b/packages/core/src/render3/instructions/template.ts @@ -34,6 +34,7 @@ import { setCurrentTNode, wasLastNodeCreated, } from '../state'; +import {getOrCreateTNode} from '../tnode_manipulation'; import {getConstant} from '../util/view_utils'; import { @@ -41,7 +42,6 @@ import { createDirectivesInstances, createLContainer, createTView, - getOrCreateTNode, resolveDirectives, saveResolvedLocalsInData, } from './shared'; diff --git a/packages/core/src/render3/instructions/text.ts b/packages/core/src/render3/instructions/text.ts index 4d8e15ecc35f..722d7446818f 100644 --- a/packages/core/src/render3/instructions/text.ts +++ b/packages/core/src/render3/instructions/text.ts @@ -24,8 +24,7 @@ import { setCurrentTNode, wasLastNodeCreated, } from '../state'; - -import {getOrCreateTNode} from './shared'; +import {getOrCreateTNode} from '../tnode_manipulation'; /** * Create static text node diff --git a/packages/core/src/render3/node_manipulation.ts b/packages/core/src/render3/node_manipulation.ts index 8bb89605c57e..437155884dfc 100644 --- a/packages/core/src/render3/node_manipulation.ts +++ b/packages/core/src/render3/node_manipulation.ts @@ -80,7 +80,6 @@ import { import {assertTNodeType} from './node_assert'; import {profiler} from './profiler'; import {ProfilerEvent} from './profiler_types'; -import {setUpAttributes} from './util/attrs_utils'; import { getLViewParent, getNativeByTNode, @@ -1142,57 +1141,3 @@ export function applyStyling( } } } - -/** - * Write `cssText` to `RElement`. - * - * This function does direct write without any reconciliation. Used for writing initial values, so - * that static styling values do not pull in the style parser. - * - * @param renderer Renderer to use - * @param element The element which needs to be updated. - * @param newValue The new class list to write. - */ -function writeDirectStyle(renderer: Renderer, element: RElement, newValue: string) { - ngDevMode && assertString(newValue, "'newValue' should be a string"); - renderer.setAttribute(element, 'style', newValue); - ngDevMode && ngDevMode.rendererSetStyle++; -} - -/** - * Write `className` to `RElement`. - * - * This function does direct write without any reconciliation. Used for writing initial values, so - * that static styling values do not pull in the style parser. - * - * @param renderer Renderer to use - * @param element The element which needs to be updated. - * @param newValue The new class list to write. - */ -function writeDirectClass(renderer: Renderer, element: RElement, newValue: string) { - ngDevMode && assertString(newValue, "'newValue' should be a string"); - if (newValue === '') { - // There are tests in `google3` which expect `element.getAttribute('class')` to be `null`. - renderer.removeAttribute(element, 'class'); - } else { - renderer.setAttribute(element, 'class', newValue); - } - ngDevMode && ngDevMode.rendererSetClassName++; -} - -/** Sets up the static DOM attributes on an `RNode`. */ -export function setupStaticAttributes(renderer: Renderer, element: RElement, tNode: TNode) { - const {mergedAttrs, classes, styles} = tNode; - - if (mergedAttrs !== null) { - setUpAttributes(renderer, element, mergedAttrs); - } - - if (classes !== null) { - writeDirectClass(renderer, element, classes); - } - - if (styles !== null) { - writeDirectStyle(renderer, element, styles); - } -} diff --git a/packages/core/src/render3/tnode_manipulation.ts b/packages/core/src/render3/tnode_manipulation.ts new file mode 100644 index 000000000000..e1b5886bb0ac --- /dev/null +++ b/packages/core/src/render3/tnode_manipulation.ts @@ -0,0 +1,322 @@ +/** + * @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 {assertEqual, assertGreaterThanOrEqual, assertNotSame} from '../util/assert'; +import {assertTNodeForTView} from './assert'; +import { + TAttributes, + TContainerNode, + TElementContainerNode, + TElementNode, + TIcuContainerNode, + TLetDeclarationNode, + TNode, + TNodeFlags, + TNodeType, + TProjectionNode, +} from './interfaces/node'; +import {TStylingRange} from './interfaces/styling'; +import {HEADER_OFFSET, TView} from './interfaces/view'; +import {assertPureTNodeType} from './node_assert'; +import { + getCurrentParentTNode, + getCurrentTNodePlaceholderOk, + isCurrentTNodeParent, + isInI18nBlock, + isInSkipHydrationBlock, + setCurrentTNode, +} from './state'; + +/** + * Create and stores the TNode, and hooks it up to the tree. + * + * @param tView The current `TView`. + * @param index The index at which the TNode should be saved (null if view, since they are not + * saved). + * @param type The type of TNode to create + * @param native The native element for this node, if applicable + * @param name The tag name of the associated native element, if applicable + * @param attrs Any attrs for the native element, if applicable + */ +export function getOrCreateTNode( + tView: TView, + index: number, + type: TNodeType.Element | TNodeType.Text, + name: string | null, + attrs: TAttributes | null, +): TElementNode; +export function getOrCreateTNode( + tView: TView, + index: number, + type: TNodeType.Container, + name: string | null, + attrs: TAttributes | null, +): TContainerNode; +export function getOrCreateTNode( + tView: TView, + index: number, + type: TNodeType.Projection, + name: null, + attrs: TAttributes | null, +): TProjectionNode; +export function getOrCreateTNode( + tView: TView, + index: number, + type: TNodeType.ElementContainer, + name: string | null, + attrs: TAttributes | null, +): TElementContainerNode; +export function getOrCreateTNode( + tView: TView, + index: number, + type: TNodeType.Icu, + name: null, + attrs: TAttributes | null, +): TElementContainerNode; +export function getOrCreateTNode( + tView: TView, + index: number, + type: TNodeType.LetDeclaration, + name: null, + attrs: null, +): TLetDeclarationNode; +export function getOrCreateTNode( + tView: TView, + index: number, + type: TNodeType, + name: string | null, + attrs: TAttributes | null, +): TElementNode & + TContainerNode & + TElementContainerNode & + TProjectionNode & + TIcuContainerNode & + TLetDeclarationNode { + ngDevMode && + index !== 0 && // 0 are bogus nodes and they are OK. See `createContainerRef` in + // `view_engine_compatibility` for additional context. + assertGreaterThanOrEqual(index, HEADER_OFFSET, "TNodes can't be in the LView header."); + // Keep this function short, so that the VM will inline it. + ngDevMode && assertPureTNodeType(type); + let tNode = tView.data[index] as TNode; + if (tNode === null) { + tNode = createTNodeAtIndex(tView, index, type, name, attrs); + if (isInI18nBlock()) { + // If we are in i18n block then all elements should be pre declared through `Placeholder` + // See `TNodeType.Placeholder` and `LFrame.inI18n` for more context. + // If the `TNode` was not pre-declared than it means it was not mentioned which means it was + // removed, so we mark it as detached. + tNode.flags |= TNodeFlags.isDetached; + } + } else if (tNode.type & TNodeType.Placeholder) { + tNode.type = type; + tNode.value = name; + tNode.attrs = attrs; + const parent = getCurrentParentTNode(); + tNode.injectorIndex = parent === null ? -1 : parent.injectorIndex; + ngDevMode && assertTNodeForTView(tNode, tView); + ngDevMode && assertEqual(index, tNode.index, 'Expecting same index'); + } + setCurrentTNode(tNode, true); + return tNode as TElementNode & + TContainerNode & + TElementContainerNode & + TProjectionNode & + TIcuContainerNode; +} + +export function createTNodeAtIndex( + tView: TView, + index: number, + type: TNodeType, + name: string | null, + attrs: TAttributes | null, +) { + const currentTNode = getCurrentTNodePlaceholderOk(); + const isParent = isCurrentTNodeParent(); + const parent = isParent ? currentTNode : currentTNode && currentTNode.parent; + + // Parents cannot cross component boundaries because components will be used in multiple places. + const tNode = (tView.data[index] = createTNode( + tView, + parent as TElementNode | TContainerNode, + type, + index, + name, + attrs, + )); + + // Assign a pointer to the first child node of a given view. The first node is not always the one + // at index 0, in case of i18n, index 0 can be the instruction `i18nStart` and the first node has + // the index 1 or more, so we can't just check node index. + linkTNodeInTView(tView, tNode, currentTNode, isParent); + + return tNode; +} + +function linkTNodeInTView( + tView: TView, + tNode: TNode, + currentTNode: TNode | null, + isParent: boolean, +) { + if (tView.firstChild === null) { + tView.firstChild = tNode; + } + if (currentTNode !== null) { + if (isParent) { + // FIXME(misko): This logic looks unnecessarily complicated. Could we simplify? + if (currentTNode.child == null && tNode.parent !== null) { + // We are in the same view, which means we are adding content node to the parent view. + currentTNode.child = tNode; + } + } else { + if (currentTNode.next === null) { + // In the case of i18n the `currentTNode` may already be linked, in which case we don't want + // to break the links which i18n created. + currentTNode.next = tNode; + tNode.prev = currentTNode; + } + } + } +} + +/** + * Constructs a TNode object from the arguments. + * + * @param tView `TView` to which this `TNode` belongs + * @param tParent Parent `TNode` + * @param type The type of the node + * @param index The index of the TNode in TView.data, adjusted for HEADER_OFFSET + * @param tagName The tag name of the node + * @param attrs The attributes defined on this node + * @returns the TNode object + */ +export function createTNode( + tView: TView, + tParent: TElementNode | TContainerNode | null, + type: TNodeType.Container, + index: number, + tagName: string | null, + attrs: TAttributes | null, +): TContainerNode; +export function createTNode( + tView: TView, + tParent: TElementNode | TContainerNode | null, + type: TNodeType.Element | TNodeType.Text, + index: number, + tagName: string | null, + attrs: TAttributes | null, +): TElementNode; +export function createTNode( + tView: TView, + tParent: TElementNode | TContainerNode | null, + type: TNodeType.ElementContainer, + index: number, + tagName: string | null, + attrs: TAttributes | null, +): TElementContainerNode; +export function createTNode( + tView: TView, + tParent: TElementNode | TContainerNode | null, + type: TNodeType.Icu, + index: number, + tagName: string | null, + attrs: TAttributes | null, +): TIcuContainerNode; +export function createTNode( + tView: TView, + tParent: TElementNode | TContainerNode | null, + type: TNodeType.Projection, + index: number, + tagName: string | null, + attrs: TAttributes | null, +): TProjectionNode; +export function createTNode( + tView: TView, + tParent: TElementNode | TContainerNode | null, + type: TNodeType.LetDeclaration, + index: number, + tagName: null, + attrs: null, +): TLetDeclarationNode; +export function createTNode( + tView: TView, + tParent: TElementNode | TContainerNode | null, + type: TNodeType, + index: number, + tagName: string | null, + attrs: TAttributes | null, +): TNode; +export function createTNode( + tView: TView, + tParent: TElementNode | TContainerNode | null, + type: TNodeType, + index: number, + value: string | null, + attrs: TAttributes | null, +): TNode { + ngDevMode && + index !== 0 && // 0 are bogus nodes and they are OK. See `createContainerRef` in + // `view_engine_compatibility` for additional context. + assertGreaterThanOrEqual(index, HEADER_OFFSET, "TNodes can't be in the LView header."); + ngDevMode && assertNotSame(attrs, undefined, "'undefined' is not valid value for 'attrs'"); + ngDevMode && ngDevMode.tNode++; + ngDevMode && tParent && assertTNodeForTView(tParent, tView); + let injectorIndex = tParent ? tParent.injectorIndex : -1; + let flags = 0; + if (isInSkipHydrationBlock()) { + flags |= TNodeFlags.inSkipHydrationBlock; + } + + // TODO: would it be helpful to use a prototypal inheritance here, similar to the way we do so with signals? + const tNode = { + type, + index, + insertBeforeIndex: null, + injectorIndex, + directiveStart: -1, + directiveEnd: -1, + directiveStylingLast: -1, + componentOffset: -1, + propertyBindings: null, + flags, + providerIndexes: 0, + value: value, + attrs: attrs, + mergedAttrs: null, + localNames: null, + initialInputs: undefined, + inputs: null, + outputs: null, + tView: null, + next: null, + prev: null, + projectionNext: null, + child: null, + parent: tParent, + projection: null, + styles: null, + stylesWithoutHost: null, + residualStyles: undefined, + classes: null, + classesWithoutHost: null, + residualClasses: undefined, + classBindings: 0 as TStylingRange, + styleBindings: 0 as TStylingRange, + }; + + if (ngDevMode) { + // For performance reasons it is important that the tNode 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(tNode); + } + + return tNode; +} diff --git a/packages/core/test/bundling/defer/bundle.golden_symbols.json b/packages/core/test/bundling/defer/bundle.golden_symbols.json index 94515050847e..29419f5b756c 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -704,6 +704,7 @@ "init_text_interpolation", "init_timeoutProvider", "init_timer_scheduler", + "init_tnode_manipulation", "init_tokens", "init_tokens2", "init_tokens3", diff --git a/packages/core/test/render3/di_spec.ts b/packages/core/test/render3/di_spec.ts index f161ebf6975d..7edfbb6af3b2 100644 --- a/packages/core/test/render3/di_spec.ts +++ b/packages/core/test/render3/di_spec.ts @@ -7,11 +7,7 @@ */ import {Component, Directive, Self} from '@angular/core'; -import { - createLView, - createTView, - getOrCreateTNode, -} from '@angular/core/src/render3/instructions/shared'; +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'; @@ -24,6 +20,7 @@ import { 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'; describe('di', () => { describe('directive injection', () => { diff --git a/packages/core/test/render3/i18n/i18n_insert_before_index_spec.ts b/packages/core/test/render3/i18n/i18n_insert_before_index_spec.ts index 3470bbd21298..1f397d66cda1 100644 --- a/packages/core/test/render3/i18n/i18n_insert_before_index_spec.ts +++ b/packages/core/test/render3/i18n/i18n_insert_before_index_spec.ts @@ -7,10 +7,10 @@ */ import {addTNodeAndUpdateInsertBeforeIndex} from '@angular/core/src/render3/i18n/i18n_insert_before_index'; -import {createTNode} from '@angular/core/src/render3/instructions/shared'; import {TNode, TNodeType} from '@angular/core/src/render3/interfaces/node'; import {HEADER_OFFSET} from '@angular/core/src/render3/interfaces/view'; import {matchTNode} from '../matchers'; +import {createTNode} from '@angular/core/src/render3/tnode_manipulation'; describe('addTNodeAndUpdateInsertBeforeIndex', () => { function tNode(index: number, type: TNodeType, insertBeforeIndex: number | null = null): TNode { diff --git a/packages/core/test/render3/instructions/shared_spec.ts b/packages/core/test/render3/instructions/shared_spec.ts index fcc7c4af682a..828a219d8176 100644 --- a/packages/core/test/render3/instructions/shared_spec.ts +++ b/packages/core/test/render3/instructions/shared_spec.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -import {createLView, createTNode, createTView} from '@angular/core/src/render3/instructions/shared'; +import {createLView, createTView} from '@angular/core/src/render3/instructions/shared'; import {TNodeType} from '@angular/core/src/render3/interfaces/node'; import { HEADER_OFFSET, @@ -23,6 +23,7 @@ import { } from '@angular/core/src/render3/state'; import {MockRendererFactory} from './mock_renderer_factory'; +import {createTNode} from '@angular/core/src/render3/tnode_manipulation'; /** * 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 3636b0319da3..f56d735766fb 100644 --- a/packages/core/test/render3/matchers_spec.ts +++ b/packages/core/test/render3/matchers_spec.ts @@ -6,12 +6,13 @@ * found in the LICENSE file at https://angular.dev/license */ -import {createTNode, createTView} from '@angular/core/src/render3/instructions/shared'; +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'; describe('render3 matchers', () => { const fakeMatcherUtil = {equals: (a: any, b: any) => a === b} as jasmine.MatchersUtil; diff --git a/packages/core/test/render3/node_selector_matcher_spec.ts b/packages/core/test/render3/node_selector_matcher_spec.ts index c5def1c97f89..3d0ac7d22045 100644 --- a/packages/core/test/render3/node_selector_matcher_spec.ts +++ b/packages/core/test/render3/node_selector_matcher_spec.ts @@ -6,8 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -import {createTNode} from '@angular/core/src/render3/instructions/shared'; - +import {createTNode} from '../../src/render3/tnode_manipulation'; import {AttributeMarker} from '../../src/render3/interfaces/attribute_marker'; import {TAttributes, TNode, TNodeType} from '../../src/render3/interfaces/node'; import {CssSelector, CssSelectorList, SelectorFlags} from '../../src/render3/interfaces/projection'; diff --git a/packages/core/test/render3/styling_next/static_styling_spec.ts b/packages/core/test/render3/styling_next/static_styling_spec.ts index a58783a9b45b..00c4d48640f5 100644 --- a/packages/core/test/render3/styling_next/static_styling_spec.ts +++ b/packages/core/test/render3/styling_next/static_styling_spec.ts @@ -6,12 +6,12 @@ * found in the LICENSE file at https://angular.dev/license */ -import {createTNode} from '@angular/core/src/render3/instructions/shared'; import {AttributeMarker} from '@angular/core/src/render3/interfaces/attribute_marker'; import {TAttributes, TNode, TNodeType} from '@angular/core/src/render3/interfaces/node'; import {LView} from '@angular/core/src/render3/interfaces/view'; import {enterView} from '@angular/core/src/render3/state'; import {computeStaticStyling} from '@angular/core/src/render3/styling/static_styling'; +import {createTNode} from '@angular/core/src/render3/tnode_manipulation'; describe('static styling', () => { const mockFirstCreatePassLView: LView = [null, {firstCreatePass: true}] as any; diff --git a/packages/core/test/render3/styling_next/style_binding_list_spec.ts b/packages/core/test/render3/styling_next/style_binding_list_spec.ts index 336be424b9df..dd6385f228d1 100644 --- a/packages/core/test/render3/styling_next/style_binding_list_spec.ts +++ b/packages/core/test/render3/styling_next/style_binding_list_spec.ts @@ -6,7 +6,6 @@ * found in the LICENSE file at https://angular.dev/license */ -import {createTNode} from '@angular/core/src/render3/instructions/shared'; import {TNode, TNodeType} from '@angular/core/src/render3/interfaces/node'; import { getTStylingRangeNext, @@ -19,6 +18,7 @@ import { import {LView, TData} from '@angular/core/src/render3/interfaces/view'; import {enterView, leaveView} from '@angular/core/src/render3/state'; import {insertTStylingBinding} from '@angular/core/src/render3/styling/style_binding_list'; +import {createTNode} from '@angular/core/src/render3/tnode_manipulation'; import {newArray} from '@angular/core/src/util/array_utils'; describe('TNode styling linked list', () => { diff --git a/packages/core/test/render3/view_fixture.ts b/packages/core/test/render3/view_fixture.ts index 80523fd4a096..5576dfb7e1ef 100644 --- a/packages/core/test/render3/view_fixture.ts +++ b/packages/core/test/render3/view_fixture.ts @@ -12,7 +12,7 @@ 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, createTNode, createTView} from '../../src/render3/instructions/shared'; +import {createLView, createTView} from '../../src/render3/instructions/shared'; import { DirectiveDef, DirectiveDefList, @@ -34,6 +34,7 @@ import {enterView, leaveView, specOnlyIsInstructionStateEmpty} from '../../src/r import {noop} from '../../src/util/noop'; import {getRendererFactory2} from './imported_renderer2'; +import {createTNode} from '@angular/core/src/render3/tnode_manipulation'; /** * 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 6f464ea3bcc5..4252bbc97a39 100644 --- a/packages/core/test/render3/view_utils_spec.ts +++ b/packages/core/test/render3/view_utils_spec.ts @@ -6,9 +6,10 @@ * found in the LICENSE file at https://angular.dev/license */ -import {createLContainer, createTNode} from '@angular/core/src/render3/instructions/shared'; +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'; describe('view_utils', () => { it('should verify unwrap methods (isLView and isLContainer)', () => { From 98998bbd4285d877e33d6bb889826b5bf2877288 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Mon, 16 Dec 2024 09:06:23 +0200 Subject: [PATCH 0141/1220] refactor(compiler): allow lexer to produce multiple tokens (#59230) Reworks the lexer's scanner to produce more than one token at a time. This can be useful for the cases where one token means the end of another one. Also cleans up the scanner by making all non-essential methods private and using strict equality everywhere. PR Close #59230 --- .../compiler/src/expression_parser/lexer.ts | 100 ++++++++++-------- 1 file changed, 55 insertions(+), 45 deletions(-) diff --git a/packages/compiler/src/expression_parser/lexer.ts b/packages/compiler/src/expression_parser/lexer.ts index 25cd2b3cb7f6..22f4a5c401bf 100644 --- a/packages/compiler/src/expression_parser/lexer.ts +++ b/packages/compiler/src/expression_parser/lexer.ts @@ -35,14 +35,7 @@ const KEYWORDS = [ export class Lexer { tokenize(text: string): Token[] { - const scanner = new _Scanner(text); - const tokens: Token[] = []; - let token = scanner.scanToken(); - while (token != null) { - tokens.push(token); - token = scanner.scanToken(); - } - return tokens; + return new _Scanner(text).scan(); } } @@ -56,59 +49,59 @@ export class Token { ) {} isCharacter(code: number): boolean { - return this.type == TokenType.Character && this.numValue == code; + return this.type === TokenType.Character && this.numValue === code; } isNumber(): boolean { - return this.type == TokenType.Number; + return this.type === TokenType.Number; } isString(): boolean { - return this.type == TokenType.String; + return this.type === TokenType.String; } isOperator(operator: string): boolean { - return this.type == TokenType.Operator && this.strValue == operator; + return this.type === TokenType.Operator && this.strValue === operator; } isIdentifier(): boolean { - return this.type == TokenType.Identifier; + return this.type === TokenType.Identifier; } isPrivateIdentifier(): boolean { - return this.type == TokenType.PrivateIdentifier; + return this.type === TokenType.PrivateIdentifier; } isKeyword(): boolean { - return this.type == TokenType.Keyword; + return this.type === TokenType.Keyword; } isKeywordLet(): boolean { - return this.type == TokenType.Keyword && this.strValue == 'let'; + return this.type === TokenType.Keyword && this.strValue === 'let'; } isKeywordAs(): boolean { - return this.type == TokenType.Keyword && this.strValue == 'as'; + return this.type === TokenType.Keyword && this.strValue === 'as'; } isKeywordNull(): boolean { - return this.type == TokenType.Keyword && this.strValue == 'null'; + return this.type === TokenType.Keyword && this.strValue === 'null'; } isKeywordUndefined(): boolean { - return this.type == TokenType.Keyword && this.strValue == 'undefined'; + return this.type === TokenType.Keyword && this.strValue === 'undefined'; } isKeywordTrue(): boolean { - return this.type == TokenType.Keyword && this.strValue == 'true'; + return this.type === TokenType.Keyword && this.strValue === 'true'; } isKeywordFalse(): boolean { - return this.type == TokenType.Keyword && this.strValue == 'false'; + return this.type === TokenType.Keyword && this.strValue === 'false'; } isKeywordThis(): boolean { - return this.type == TokenType.Keyword && this.strValue == 'this'; + return this.type === TokenType.Keyword && this.strValue === 'this'; } isKeywordTypeof(): boolean { @@ -116,11 +109,11 @@ export class Token { } isError(): boolean { - return this.type == TokenType.Error; + return this.type === TokenType.Error; } toNumber(): number { - return this.type == TokenType.Number ? this.numValue : -1; + return this.type === TokenType.Number ? this.numValue : -1; } toString(): string | null { @@ -176,24 +169,36 @@ function newErrorToken(index: number, end: number, message: string): Token { export const EOF: Token = new Token(-1, -1, TokenType.Character, 0, ''); class _Scanner { - length: number; - peek: number = 0; - index: number = -1; + private readonly tokens: Token[] = []; + private readonly length: number; + private peek = 0; + private index = -1; - constructor(public input: string) { + constructor(private readonly input: string) { this.length = input.length; this.advance(); } - advance() { + scan(): Token[] { + let token = this.scanToken(); + + while (token !== null) { + this.tokens.push(token); + token = this.scanToken(); + } + + return this.tokens; + } + + private advance() { this.peek = ++this.index >= this.length ? chars.$EOF : this.input.charCodeAt(this.index); } - scanToken(): Token | null { - const input = this.input, - length = this.length; - let peek = this.peek, - index = this.index; + private scanToken(): Token | null { + const input = this.input; + const length = this.length; + let peek = this.peek; + let index = this.index; // Skip whitespace. while (peek <= chars.$SPACE) { @@ -213,8 +218,13 @@ class _Scanner { } // Handle identifiers and numbers. - if (isIdentifierStart(peek)) return this.scanIdentifier(); - if (chars.isDigit(peek)) return this.scanNumber(index); + if (isIdentifierStart(peek)) { + return this.scanIdentifier(); + } + + if (chars.isDigit(peek)) { + return this.scanNumber(index); + } const start: number = index; switch (peek) { @@ -273,12 +283,12 @@ class _Scanner { return this.error(`Unexpected character [${String.fromCharCode(peek)}]`, 0); } - scanCharacter(start: number, code: number): Token { + private scanCharacter(start: number, code: number): Token { this.advance(); return newCharacterToken(start, this.index, code); } - scanOperator(start: number, str: string): Token { + private scanOperator(start: number, str: string): Token { this.advance(); return newOperatorToken(start, this.index, str); } @@ -293,7 +303,7 @@ class _Scanner { * @param threeCode code point for the third symbol * @param three third symbol (part of the operator when provided and matches source expression) */ - scanComplexOperator( + private scanComplexOperator( start: number, one: string, twoCode: number, @@ -314,7 +324,7 @@ class _Scanner { return newOperatorToken(start, this.index, str); } - scanIdentifier(): Token { + private scanIdentifier(): Token { const start: number = this.index; this.advance(); while (isIdentifierPart(this.peek)) this.advance(); @@ -325,7 +335,7 @@ class _Scanner { } /** Scans an ECMAScript private identifier. */ - scanPrivateIdentifier(): Token { + private scanPrivateIdentifier(): Token { const start: number = this.index; this.advance(); if (!isIdentifierStart(this.peek)) { @@ -336,7 +346,7 @@ class _Scanner { return newPrivateIdentifierToken(start, this.index, identifierName); } - scanNumber(start: number): Token { + private scanNumber(start: number): Token { let simple = this.index === start; let hasSeparators = false; this.advance(); // Skip initial digit. @@ -377,7 +387,7 @@ class _Scanner { return newNumberToken(start, this.index, value); } - scanString(): Token { + private scanString(): Token { const start: number = this.index; const quote: number = this.peek; this.advance(); // Skip initial quote. @@ -422,7 +432,7 @@ class _Scanner { return newStringToken(start, this.index, buffer + last); } - scanQuestion(start: number): Token { + private scanQuestion(start: number): Token { this.advance(); let str: string = '?'; // Either `a ?? b` or 'a?.b'. @@ -433,7 +443,7 @@ class _Scanner { return newOperatorToken(start, this.index, str); } - error(message: string, offset: number): Token { + private error(message: string, offset: number): Token { const position: number = this.index + offset; return newErrorToken( position, From 353005b97fcffffb41af3ac3fa59a64c312418aa Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Tue, 17 Dec 2024 08:28:07 +0200 Subject: [PATCH 0142/1220] refactor(compiler): tokenize template literals (#59230) Reworks the lexer to produce tokens for template literal expressions. PR Close #59230 --- .../compiler/src/expression_parser/lexer.ts | 176 ++++++++++--- .../test/expression_parser/lexer_spec.ts | 246 +++++++++++++++++- 2 files changed, 380 insertions(+), 42 deletions(-) diff --git a/packages/compiler/src/expression_parser/lexer.ts b/packages/compiler/src/expression_parser/lexer.ts index 22f4a5c401bf..83de92c6694f 100644 --- a/packages/compiler/src/expression_parser/lexer.ts +++ b/packages/compiler/src/expression_parser/lexer.ts @@ -19,6 +19,12 @@ export enum TokenType { Error, } +export enum StringTokenKind { + Plain, + TemplateLiteralPart, + TemplateLiteralEnd, +} + const KEYWORDS = [ 'var', 'let', @@ -56,7 +62,7 @@ export class Token { return this.type === TokenType.Number; } - isString(): boolean { + isString(): this is StringToken { return this.type === TokenType.String; } @@ -116,6 +122,22 @@ export class Token { return this.type === TokenType.Number ? this.numValue : -1; } + isTemplateLiteralPart(): this is StringToken { + return this.isString() && this.kind === StringTokenKind.TemplateLiteralPart; + } + + isTemplateLiteralEnd(): this is StringToken { + return this.isString() && this.kind === StringTokenKind.TemplateLiteralEnd; + } + + isTemplateLiteralInterpolationStart(): boolean { + return this.isOperator('${'); + } + + isTemplateLiteralInterpolationEnd(): boolean { + return this.isOperator('}'); + } + toString(): string | null { switch (this.type) { case TokenType.Character: @@ -134,6 +156,17 @@ export class Token { } } +export class StringToken extends Token { + constructor( + index: number, + end: number, + strValue: string, + readonly kind: StringTokenKind, + ) { + super(index, end, TokenType.String, 0, strValue); + } +} + function newCharacterToken(index: number, end: number, code: number): Token { return new Token(index, end, TokenType.Character, code, String.fromCharCode(code)); } @@ -154,10 +187,6 @@ function newOperatorToken(index: number, end: number, text: string): Token { return new Token(index, end, TokenType.Operator, 0, text); } -function newStringToken(index: number, end: number, text: string): Token { - return new Token(index, end, TokenType.String, 0, text); -} - function newNumberToken(index: number, end: number, n: number): Token { return new Token(index, end, TokenType.Number, n, ''); } @@ -173,6 +202,8 @@ class _Scanner { private readonly length: number; private peek = 0; private index = -1; + private literalInterpolationDepth = 0; + private braceDepth = 0; constructor(private readonly input: string) { this.length = input.length; @@ -235,17 +266,22 @@ class _Scanner { : newCharacterToken(start, this.index, chars.$PERIOD); case chars.$LPAREN: case chars.$RPAREN: - case chars.$LBRACE: - case chars.$RBRACE: case chars.$LBRACKET: case chars.$RBRACKET: case chars.$COMMA: case chars.$COLON: case chars.$SEMICOLON: return this.scanCharacter(start, peek); + case chars.$LBRACE: + return this.scanOpenBrace(start, peek); + case chars.$RBRACE: + return this.scanCloseBrace(start, peek); case chars.$SQ: case chars.$DQ: return this.scanString(); + case chars.$BT: + this.advance(); + return this.scanTemplateLiteralPart(start); case chars.$HASH: return this.scanPrivateIdentifier(); case chars.$PLUS: @@ -293,6 +329,25 @@ class _Scanner { return newOperatorToken(start, this.index, str); } + private scanOpenBrace(start: number, code: number): Token { + this.braceDepth++; + this.advance(); + return newCharacterToken(start, this.index, code); + } + + private scanCloseBrace(start: number, code: number): Token { + this.advance(); + + if (this.braceDepth === 0 && this.literalInterpolationDepth > 0) { + this.literalInterpolationDepth--; + this.tokens.push(newOperatorToken(start, this.index, '}')); + return this.scanTemplateLiteralPart(this.index); + } + + this.braceDepth--; + return newCharacterToken(start, this.index, code); + } + /** * Tokenize a 2/3 char long operator * @@ -388,36 +443,21 @@ class _Scanner { } private scanString(): Token { - const start: number = this.index; - const quote: number = this.peek; + const start = this.index; + const quote = this.peek; this.advance(); // Skip initial quote. - let buffer: string = ''; - let marker: number = this.index; - const input: string = this.input; + let buffer = ''; + let marker = this.index; + const input = this.input; while (this.peek != quote) { if (this.peek == chars.$BACKSLASH) { - buffer += input.substring(marker, this.index); - let unescapedCode: number; - this.advance(); // mutates this.peek - // @ts-expect-error see microsoft/TypeScript#9998 - if (this.peek == chars.$u) { - // 4 character hex code for unicode character. - const hex: string = input.substring(this.index + 1, this.index + 5); - if (/^[0-9a-f]+$/i.test(hex)) { - unescapedCode = parseInt(hex, 16); - } else { - return this.error(`Invalid unicode escape [\\u${hex}]`, 0); - } - for (let i: number = 0; i < 5; i++) { - this.advance(); - } - } else { - unescapedCode = unescape(this.peek); - this.advance(); + const result = this.scanStringBackslash(buffer, marker); + if (typeof result !== 'string') { + return result; // Error } - buffer += String.fromCharCode(unescapedCode); + buffer = result; marker = this.index; } else if (this.peek == chars.$EOF) { return this.error('Unterminated quote', 0); @@ -429,7 +469,7 @@ class _Scanner { const last: string = input.substring(marker, this.index); this.advance(); // Skip terminating quote. - return newStringToken(start, this.index, buffer + last); + return new StringToken(start, this.index, buffer + last, StringTokenKind.Plain); } private scanQuestion(start: number): Token { @@ -443,13 +483,81 @@ class _Scanner { return newOperatorToken(start, this.index, str); } - private error(message: string, offset: number): Token { + private scanTemplateLiteralPart(start: number): Token { + let buffer = ''; + let marker = this.index; + + while (this.peek !== chars.$BT) { + if (this.peek === chars.$BACKSLASH) { + const result = this.scanStringBackslash(buffer, marker); + if (typeof result !== 'string') { + return result; // Error + } + buffer = result; + marker = this.index; + } else if (this.peek === chars.$$) { + const dollar = this.index; + this.advance(); + + // @ts-expect-error + if (this.peek === chars.$LBRACE) { + this.literalInterpolationDepth++; + this.tokens.push( + new StringToken( + start, + dollar, + buffer + this.input.substring(marker, dollar), + StringTokenKind.TemplateLiteralPart, + ), + ); + this.advance(); + return newOperatorToken(dollar, this.index, this.input.substring(dollar, this.index)); + } + } else if (this.peek === chars.$EOF) { + return this.error('Unterminated template literal', 0); + } else { + this.advance(); + } + } + + const last = this.input.substring(marker, this.index); + this.advance(); + return new StringToken(start, this.index, buffer + last, StringTokenKind.TemplateLiteralEnd); + } + + private error(message: string, offset: number): Token & {type: TokenType.Error} { const position: number = this.index + offset; return newErrorToken( position, this.index, `Lexer Error: ${message} at column ${position} in expression [${this.input}]`, - ); + ) as Token & {type: TokenType.Error}; + } + + private scanStringBackslash( + buffer: string, + marker: number, + ): string | (Token & {type: TokenType.Error}) { + buffer += this.input.substring(marker, this.index); + let unescapedCode: number; + this.advance(); + if (this.peek === chars.$u) { + // 4 character hex code for unicode character. + const hex: string = this.input.substring(this.index + 1, this.index + 5); + if (/^[0-9a-f]+$/i.test(hex)) { + unescapedCode = parseInt(hex, 16); + } else { + return this.error(`Invalid unicode escape [\\u${hex}]`, 0); + } + for (let i = 0; i < 5; i++) { + this.advance(); + } + } else { + unescapedCode = unescape(this.peek); + this.advance(); + } + buffer += String.fromCharCode(unescapedCode); + return buffer; } } diff --git a/packages/compiler/test/expression_parser/lexer_spec.ts b/packages/compiler/test/expression_parser/lexer_spec.ts index 7d4223cc0b5a..20545ad8c6dc 100644 --- a/packages/compiler/test/expression_parser/lexer_spec.ts +++ b/packages/compiler/test/expression_parser/lexer_spec.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -import {Lexer, Token} from '@angular/compiler/src/expression_parser/lexer'; +import {Lexer, StringTokenKind, Token} from '@angular/compiler/src/expression_parser/lexer'; function lex(text: string): any[] { return new Lexer().tokenize(text); @@ -35,9 +35,16 @@ function expectNumberToken(token: any, index: number, end: number, n: number) { expect(token.toNumber()).toEqual(n); } -function expectStringToken(token: any, index: number, end: number, str: string) { +function expectStringToken( + token: any, + index: number, + end: number, + str: string, + kind: StringTokenKind, +) { expectToken(token, index, end); expect(token.isString()).toBe(true); + expect(token.kind).toBe(kind); expect(token.toString()).toEqual(str); } @@ -152,11 +159,11 @@ describe('lexer', () => { }); it('should tokenize simple quoted strings', () => { - expectStringToken(lex('"a"')[0], 0, 3, 'a'); + expectStringToken(lex('"a"')[0], 0, 3, 'a', StringTokenKind.Plain); }); it('should tokenize quoted strings with escaped quotes', () => { - expectStringToken(lex('"a\\""')[0], 0, 5, 'a"'); + expectStringToken(lex('"a\\""')[0], 0, 5, 'a"', StringTokenKind.Plain); }); it('should tokenize a string', () => { @@ -174,9 +181,9 @@ describe('lexer', () => { expectOperatorToken(tokens[10], 14, 15, '|'); expectIdentifierToken(tokens[11], 15, 16, 'f'); expectCharacterToken(tokens[12], 16, 17, ':'); - expectStringToken(tokens[13], 17, 23, "a'c"); + expectStringToken(tokens[13], 17, 23, "a'c", StringTokenKind.Plain); expectCharacterToken(tokens[14], 23, 24, ':'); - expectStringToken(tokens[15], 24, 30, 'd"e'); + expectStringToken(tokens[15], 24, 30, 'd"e', StringTokenKind.Plain); }); it('should tokenize undefined', () => { @@ -200,8 +207,8 @@ describe('lexer', () => { it('should tokenize quoted string', () => { const str = '[\'\\\'\', "\\""]'; const tokens: Token[] = lex(str); - expectStringToken(tokens[1], 1, 5, "'"); - expectStringToken(tokens[3], 7, 11, '"'); + expectStringToken(tokens[1], 1, 5, "'", StringTokenKind.Plain); + expectStringToken(tokens[3], 7, 11, '"', StringTokenKind.Plain); }); it('should tokenize escaped quoted string', () => { @@ -376,5 +383,228 @@ describe('lexer', () => { 'Lexer Error: Invalid numeric separator at column 6 in expression [1_2_3._456]', ); }); + + describe('template literals', () => { + it('should tokenize template literal with no interpolations', () => { + const tokens: Token[] = lex('`hello world`'); + expect(tokens.length).toBe(1); + expectStringToken(tokens[0], 0, 13, 'hello world', StringTokenKind.TemplateLiteralEnd); + }); + + it('should tokenize template literal containing strings', () => { + expectStringToken(lex('`a "b" c`')[0], 0, 9, `a "b" c`, StringTokenKind.TemplateLiteralEnd); + expectStringToken(lex("`a 'b' c`")[0], 0, 9, `a 'b' c`, StringTokenKind.TemplateLiteralEnd); + expectStringToken( + lex('`a \\`b\\` c`')[0], + 0, + 11, + 'a `b` c', + StringTokenKind.TemplateLiteralEnd, + ); + expectStringToken( + lex('`a "\'\\`b\\`\'" c`')[0], + 0, + 15, + `a "'\`b\`'" c`, + StringTokenKind.TemplateLiteralEnd, + ); + }); + + it('should tokenize unicode inside a template string', () => { + const tokens: Token[] = lex('`\\u00A0`'); + expect(tokens.length).toBe(1); + expect(tokens[0].toString()).toBe('\u00a0'); + }); + + it('should tokenize template literal with an interpolation in the end', () => { + const tokens: Token[] = lex('`hello ${name}`'); + expect(tokens.length).toBe(5); + expectStringToken(tokens[0], 0, 7, 'hello ', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[1], 7, 9, '${'); + expectIdentifierToken(tokens[2], 9, 13, 'name'); + expectOperatorToken(tokens[3], 13, 14, '}'); + expectStringToken(tokens[4], 14, 15, '', StringTokenKind.TemplateLiteralEnd); + }); + + it('should tokenize template literal with an interpolation in the beginning', () => { + const tokens: Token[] = lex('`${name} Johnson`'); + expect(tokens.length).toBe(5); + expectStringToken(tokens[0], 0, 1, '', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[1], 1, 3, '${'); + expectIdentifierToken(tokens[2], 3, 7, 'name'); + expectOperatorToken(tokens[3], 7, 8, '}'); + expectStringToken(tokens[4], 8, 17, ' Johnson', StringTokenKind.TemplateLiteralEnd); + }); + + it('should tokenize template literal with an interpolation in the middle', () => { + const tokens: Token[] = lex('`foo${bar}baz`'); + expect(tokens.length).toBe(5); + expectStringToken(tokens[0], 0, 4, 'foo', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[1], 4, 6, '${'); + expectIdentifierToken(tokens[2], 6, 9, 'bar'); + expectOperatorToken(tokens[3], 9, 10, '}'); + expectStringToken(tokens[4], 10, 14, 'baz', StringTokenKind.TemplateLiteralEnd); + }); + + it('should be able to use interpolation characters inside template string', () => { + expectStringToken(lex('`foo $`')[0], 0, 7, 'foo $', StringTokenKind.TemplateLiteralEnd); + expectStringToken(lex('`foo }`')[0], 0, 7, 'foo }', StringTokenKind.TemplateLiteralEnd); + expectStringToken( + lex('`foo $ {}`')[0], + 0, + 10, + 'foo $ {}', + StringTokenKind.TemplateLiteralEnd, + ); + expectStringToken( + lex('`foo \\${bar}`')[0], + 0, + 13, + 'foo ${bar}', + StringTokenKind.TemplateLiteralEnd, + ); + }); + + it('should tokenize template literal with several interpolations', () => { + const tokens: Token[] = lex('`${a} - ${b} - ${c}`'); + expect(tokens.length).toBe(13); + expectStringToken(tokens[0], 0, 1, '', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[1], 1, 3, '${'); + expectIdentifierToken(tokens[2], 3, 4, 'a'); + expectOperatorToken(tokens[3], 4, 5, '}'); + expectStringToken(tokens[4], 5, 8, ' - ', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[5], 8, 10, '${'); + expectIdentifierToken(tokens[6], 10, 11, 'b'); + expectOperatorToken(tokens[7], 11, 12, '}'); + expectStringToken(tokens[8], 12, 15, ' - ', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[9], 15, 17, '${'); + expectIdentifierToken(tokens[10], 17, 18, 'c'); + expectOperatorToken(tokens[11], 18, 19, '}'); + }); + + it('should tokenize template literal with an object literal inside the interpolation', () => { + const tokens: Token[] = lex('`foo ${{$: true}} baz`'); + expect(tokens.length).toBe(9); + expectStringToken(tokens[0], 0, 5, 'foo ', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[1], 5, 7, '${'); + expectCharacterToken(tokens[2], 7, 8, '{'); + expectIdentifierToken(tokens[3], 8, 9, '$'); + expectCharacterToken(tokens[4], 9, 10, ':'); + expectKeywordToken(tokens[5], 11, 15, 'true'); + expectCharacterToken(tokens[6], 15, 16, '}'); + expectOperatorToken(tokens[7], 16, 17, '}'); + expectStringToken(tokens[8], 17, 22, ' baz', StringTokenKind.TemplateLiteralEnd); + }); + + it('should tokenize template literal with template literals inside the interpolation', () => { + const tokens: Token[] = lex('`foo ${`hello ${`${a} - b`}`} baz`'); + expect(tokens.length).toBe(13); + expectStringToken(tokens[0], 0, 5, 'foo ', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[1], 5, 7, '${'); + expectStringToken(tokens[2], 7, 14, 'hello ', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[3], 14, 16, '${'); + expectStringToken(tokens[4], 16, 17, '', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[5], 17, 19, '${'); + expectIdentifierToken(tokens[6], 19, 20, 'a'); + expectOperatorToken(tokens[7], 20, 21, '}'); + expectStringToken(tokens[8], 21, 26, ' - b', StringTokenKind.TemplateLiteralEnd); + expectOperatorToken(tokens[9], 26, 27, '}'); + expectStringToken(tokens[10], 27, 28, '', StringTokenKind.TemplateLiteralEnd); + expectOperatorToken(tokens[11], 28, 29, '}'); + expectStringToken(tokens[12], 29, 34, ' baz', StringTokenKind.TemplateLiteralEnd); + }); + + it('should tokenize two template literal right after each other', () => { + const tokens: Token[] = lex('`hello ${name}``see ${name} later`'); + expect(tokens.length).toBe(10); + expectStringToken(tokens[0], 0, 7, 'hello ', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[1], 7, 9, '${'); + expectIdentifierToken(tokens[2], 9, 13, 'name'); + expectOperatorToken(tokens[3], 13, 14, '}'); + expectStringToken(tokens[4], 14, 15, '', StringTokenKind.TemplateLiteralEnd); + expectStringToken(tokens[5], 15, 20, 'see ', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[6], 20, 22, '${'); + expectIdentifierToken(tokens[7], 22, 26, 'name'); + expectOperatorToken(tokens[8], 26, 27, '}'); + expectStringToken(tokens[9], 27, 34, ' later', StringTokenKind.TemplateLiteralEnd); + }); + + it('should tokenize a concatenated template literal', () => { + const tokens: Token[] = lex('`hello ${name}` + 123'); + expect(tokens.length).toBe(7); + expectStringToken(tokens[0], 0, 7, 'hello ', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[1], 7, 9, '${'); + expectIdentifierToken(tokens[2], 9, 13, 'name'); + expectOperatorToken(tokens[3], 13, 14, '}'); + expectStringToken(tokens[4], 14, 15, '', StringTokenKind.TemplateLiteralEnd); + expectOperatorToken(tokens[5], 16, 17, '+'); + expectNumberToken(tokens[6], 18, 21, 123); + }); + + it('should tokenize a template literal with a pipe inside an interpolation', () => { + const tokens: Token[] = lex('`hello ${name | capitalize}!!!`'); + expect(tokens.length).toBe(7); + expectStringToken(tokens[0], 0, 7, 'hello ', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[1], 7, 9, '${'); + expectIdentifierToken(tokens[2], 9, 13, 'name'); + expectOperatorToken(tokens[3], 14, 15, '|'); + expectIdentifierToken(tokens[4], 16, 26, 'capitalize'); + expectOperatorToken(tokens[5], 26, 27, '}'); + expectStringToken(tokens[6], 27, 31, '!!!', StringTokenKind.TemplateLiteralEnd); + }); + + it('should tokenize a template literal with a pipe inside a parenthesized interpolation', () => { + const tokens: Token[] = lex('`hello ${(name | capitalize)}!!!`'); + expect(tokens.length).toBe(9); + expectStringToken(tokens[0], 0, 7, 'hello ', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[1], 7, 9, '${'); + expectCharacterToken(tokens[2], 9, 10, '('); + expectIdentifierToken(tokens[3], 10, 14, 'name'); + expectOperatorToken(tokens[4], 15, 16, '|'); + expectIdentifierToken(tokens[5], 17, 27, 'capitalize'); + expectCharacterToken(tokens[6], 27, 28, ')'); + expectOperatorToken(tokens[7], 28, 29, '}'); + expectStringToken(tokens[8], 29, 33, '!!!', StringTokenKind.TemplateLiteralEnd); + }); + + it('should produce an error if a template literal is not terminated', () => { + expectErrorToken( + lex('`hello')[0], + 6, + 6, + 'Lexer Error: Unterminated template literal at column 6 in expression [`hello]', + ); + }); + + it('should produce an error for an unterminated template literal with an interpolation', () => { + const tokens: Token[] = lex('`hello ${name}!'); + expect(tokens.length).toBe(5); + expectStringToken(tokens[0], 0, 7, 'hello ', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[1], 7, 9, '${'); + expectIdentifierToken(tokens[2], 9, 13, 'name'); + expectOperatorToken(tokens[3], 13, 14, '}'); + expectErrorToken( + tokens[4], + 15, + 15, + 'Lexer Error: Unterminated template literal at column 15 in expression [`hello ${name}!]', + ); + }); + + it('should produce an error for an unterminate template literal interpolation', () => { + const tokens: Token[] = lex('`hello ${name!`'); + expect(tokens.length).toBe(5); + expectStringToken(tokens[0], 0, 7, 'hello ', StringTokenKind.TemplateLiteralPart); + expectOperatorToken(tokens[1], 7, 9, '${'); + expectIdentifierToken(tokens[2], 9, 13, 'name'); + expectOperatorToken(tokens[3], 13, 14, '!'); + expectErrorToken( + tokens[4], + 15, + 15, + 'Lexer Error: Unterminated template literal at column 15 in expression [`hello ${name!`]', + ); + }); + }); }); }); From eb7e765e2fc459575ab1658e7819a73034b7e5b3 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Tue, 17 Dec 2024 14:12:13 +0200 Subject: [PATCH 0143/1220] refactor(compiler): produce AST for template literals (#59230) Updates the compiler to parse the template literal tokens into the new `TemplateLiteral` and `TemplateLiteralElement` AST nodes. PR Close #59230 --- .../src/ngtsc/typecheck/src/expression.ts | 16 +++++ .../compiler/src/expression_parser/ast.ts | 43 ++++++++++++++ .../compiler/src/expression_parser/parser.ts | 59 ++++++++++++++++++- .../src/expression_parser/serializer.ts | 16 +++++ .../test/expression_parser/parser_spec.ts | 46 +++++++++++++++ .../test/expression_parser/utils/unparser.ts | 20 +++++++ .../test/expression_parser/utils/validator.ts | 10 ++++ .../compiler/test/render3/util/expression.ts | 8 +++ 8 files changed, 216 insertions(+), 2 deletions(-) diff --git a/packages/compiler-cli/src/ngtsc/typecheck/src/expression.ts b/packages/compiler-cli/src/ngtsc/typecheck/src/expression.ts index 99cfa57585e4..d58fcae5a2f2 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/src/expression.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/src/expression.ts @@ -33,6 +33,8 @@ import { SafePropertyRead, ThisReceiver, Unary, + TemplateLiteral, + TemplateLiteralElement, } from '@angular/compiler'; import ts from 'typescript'; @@ -445,6 +447,14 @@ class AstTranslator implements AstVisitor { return node; } + visitTemplateLiteral(ast: TemplateLiteral, context: any) { + throw new Error('Method not implemented'); + } + + visitTemplateLiteralElement(ast: TemplateLiteralElement, context: any) { + throw new Error('Method not implemented'); + } + private convertToSafeCall( ast: Call | SafeCall, expr: ts.Expression, @@ -567,4 +577,10 @@ class VeSafeLhsInferenceBugDetector implements AstVisitor { visitSafeKeyedRead(ast: SafeKeyedRead): boolean { return false; } + visitTemplateLiteral(ast: TemplateLiteral, context: any) { + return false; + } + visitTemplateLiteralElement(ast: TemplateLiteralElement, context: any) { + return false; + } } diff --git a/packages/compiler/src/expression_parser/ast.ts b/packages/compiler/src/expression_parser/ast.ts index 97b55f5553a2..49f9c919b036 100644 --- a/packages/compiler/src/expression_parser/ast.ts +++ b/packages/compiler/src/expression_parser/ast.ts @@ -429,6 +429,34 @@ export class SafeCall extends AST { } } +export class TemplateLiteral extends AST { + constructor( + span: ParseSpan, + sourceSpan: AbsoluteSourceSpan, + public elements: TemplateLiteralElement[], + public expressions: AST[], + ) { + super(span, sourceSpan); + } + + override visit(visitor: AstVisitor, context?: any) { + return visitor.visitTemplateLiteral(this, context); + } +} +export class TemplateLiteralElement extends AST { + constructor( + span: ParseSpan, + sourceSpan: AbsoluteSourceSpan, + public text: string, + ) { + super(span, sourceSpan); + } + + override visit(visitor: AstVisitor, context?: any) { + return visitor.visitTemplateLiteralElement(this, context); + } +} + /** * Records the absolute position of a text span in a source file, where `start` and `end` are the * starting and ending byte offsets, respectively, of the text span in a source file. @@ -555,6 +583,8 @@ export interface AstVisitor { visitSafeKeyedRead(ast: SafeKeyedRead, context: any): any; visitCall(ast: Call, context: any): any; visitSafeCall(ast: SafeCall, context: any): any; + visitTemplateLiteral(ast: TemplateLiteral, context: any): any; + visitTemplateLiteralElement(ast: TemplateLiteralElement, context: any): any; visitASTWithSource?(ast: ASTWithSource, context: any): any; /** * This function is optionally defined to allow classes that implement this @@ -643,6 +673,19 @@ export class RecursiveAstVisitor implements AstVisitor { this.visit(ast.receiver, context); this.visitAll(ast.args, context); } + visitTemplateLiteral(ast: TemplateLiteral, context: any) { + // Iterate in the declaration order. Note that there will + // always be one expression less than the number of elements. + for (let i = 0; i < ast.elements.length; i++) { + this.visit(ast.elements[i], context); + + const expression = i < ast.expressions.length ? ast.expressions[i] : null; + if (expression !== null) { + this.visit(expression, context); + } + } + } + visitTemplateLiteralElement(ast: TemplateLiteralElement, context: any) {} // This is not part of the AstVisitor interface, just a helper method visitAll(asts: AST[], context: any): any { for (const ast of asts) { diff --git a/packages/compiler/src/expression_parser/parser.ts b/packages/compiler/src/expression_parser/parser.ts index 7d0013e57efb..0661067e30f5 100644 --- a/packages/compiler/src/expression_parser/parser.ts +++ b/packages/compiler/src/expression_parser/parser.ts @@ -49,8 +49,10 @@ import { ThisReceiver, Unary, VariableBinding, + TemplateLiteral, + TemplateLiteralElement, } from './ast'; -import {EOF, Lexer, Token, TokenType} from './lexer'; +import {EOF, Lexer, StringTokenKind, Token, TokenType} from './lexer'; export interface InterpolationPiece { text: string; @@ -1037,7 +1039,11 @@ class _ParseAST { const value = this.next.toNumber(); this.advance(); return new LiteralPrimitive(this.span(start), this.sourceSpan(start), value); - } else if (this.next.isString()) { + } else if (this.next.isTemplateLiteralEnd()) { + return this.parseNoInterpolationTemplateLiteral(start); + } else if (this.next.isTemplateLiteralPart()) { + return this.parseTemplateLiteral(); + } else if (this.next.isString() && this.next.kind === StringTokenKind.Plain) { const literalValue = this.next.toString(); this.advance(); return new LiteralPrimitive(this.span(start), this.sourceSpan(start), literalValue); @@ -1400,6 +1406,55 @@ class _ParseAST { return new VariableBinding(sourceSpan, key, value); } + private parseNoInterpolationTemplateLiteral(start: number): AST { + const text = this.next.strValue; + this.advance(); + const span = this.span(start); + const sourceSpan = this.sourceSpan(start); + return new TemplateLiteral( + span, + sourceSpan, + [new TemplateLiteralElement(span, sourceSpan, text)], + [], + ); + } + + private parseTemplateLiteral(): AST { + const start = this.inputIndex; + const elements: TemplateLiteralElement[] = []; + const expressions: AST[] = []; + + while (this.next !== EOF) { + const token = this.next; + + if (token.isTemplateLiteralPart() || token.isTemplateLiteralEnd()) { + elements.push( + new TemplateLiteralElement( + this.span(this.inputIndex), + this.sourceSpan(this.inputIndex), + token.strValue, + ), + ); + this.advance(); + if (token.isTemplateLiteralEnd()) { + break; + } + } else if (token.isTemplateLiteralInterpolationStart()) { + this.advance(); + const expression = this.parsePipe(); + if (expression instanceof EmptyExpr) { + this.error('Template literal interpolation cannot be empty'); + } else { + expressions.push(expression); + } + } else { + this.advance(); + } + } + + return new TemplateLiteral(this.span(start), this.sourceSpan(start), elements, expressions); + } + /** * Consume the optional statement terminator: semicolon or comma. */ diff --git a/packages/compiler/src/expression_parser/serializer.ts b/packages/compiler/src/expression_parser/serializer.ts index 6e65754ce468..2c6d86b02d2f 100644 --- a/packages/compiler/src/expression_parser/serializer.ts +++ b/packages/compiler/src/expression_parser/serializer.ts @@ -143,6 +143,22 @@ class SerializeExpressionVisitor implements expr.AstVisitor { visitASTWithSource(ast: expr.ASTWithSource, context: any): string { return ast.ast.visit(this, context); } + + visitTemplateLiteral(ast: expr.TemplateLiteral, context: any) { + let result = ''; + for (let i = 0; i < ast.elements.length; i++) { + result += ast.elements[i].visit(this, context); + const expression = i < ast.expressions.length ? ast.expressions[i] : null; + if (expression !== null) { + result += '${' + expression.visit(this, context) + '}'; + } + } + return '`' + result + '`'; + } + + visitTemplateLiteralElement(ast: expr.TemplateLiteralElement, context: any) { + return ast.text; + } } /** Zips the two input arrays into a single array of pairs of elements at the same index. */ diff --git a/packages/compiler/test/expression_parser/parser_spec.ts b/packages/compiler/test/expression_parser/parser_spec.ts index 5a2e296f0595..32f6e6b11314 100644 --- a/packages/compiler/test/expression_parser/parser_spec.ts +++ b/packages/compiler/test/expression_parser/parser_spec.ts @@ -413,6 +413,38 @@ describe('parser', () => { expect(parseAction(`"{{a('\\"')}}"`).errors).toEqual([]); expect(parseAction(`'{{a("\\'")}}'`).errors).toEqual([]); }); + + describe('template literals', () => { + it('should parse template literals without interpolations', () => { + checkBinding('`hello world`'); + checkBinding('`foo $`'); + checkBinding('`foo }`'); + checkBinding('`foo $ {}`'); + }); + + it('should parse template literals with interpolations', () => { + checkBinding('`hello ${name}`'); + checkBinding('`${name} Johnson`'); + checkBinding('`foo${bar}baz`'); + checkBinding('`${a} - ${b} - ${c}`'); + checkBinding('`foo ${{$: true}} baz`'); + checkBinding('`foo ${`hello ${`${a} - b`}`} baz`'); + checkBinding('[`hello ${name}`, `see ${name} later`]'); + checkBinding('`hello ${name}` + 123'); + }); + + it('should parse template literals with pipes inside interpolations', () => { + checkBinding('`hello ${name | capitalize}!!!`', '`hello ${(name | capitalize)}!!!`'); + checkBinding('`hello ${(name | capitalize)}!!!`'); + }); + + it('should report error if interpolation is empty', () => { + expectBindingError( + '`hello ${}`', + 'Template literal interpolation cannot be empty at the end of the expression', + ); + }); + }); }); describe('parse spans', () => { @@ -464,6 +496,20 @@ describe('parser', () => { expect(unparseWithSpan(ast)).toContain(['a.b = c', '[nameSpan] b']); }); + it('should record template literal space', () => { + const ast = parseAction('`before ${one} - ${two} - ${three} after`'); + const unparsed = unparseWithSpan(ast); + expect(unparsed).toContain(['before ', '']); + expect(unparsed).toContain(['one', 'one']); + expect(unparsed).toContain(['one', '[nameSpan] one']); + expect(unparsed).toContain([' - ', '']); + expect(unparsed).toContain(['two', 'two']); + expect(unparsed).toContain(['two', '[nameSpan] two']); + expect(unparsed).toContain(['three', 'three']); + expect(unparsed).toContain(['three', '[nameSpan] three']); + expect(unparsed).toContain([' after', '']); + }); + it('should include parenthesis in spans', () => { // When a LHS expression is parenthesized, the parenthesis on the left used to be // excluded from the span. This test verifies that the parenthesis are properly included diff --git a/packages/compiler/test/expression_parser/utils/unparser.ts b/packages/compiler/test/expression_parser/utils/unparser.ts index e90b29f0bcaf..2c9980130f44 100644 --- a/packages/compiler/test/expression_parser/utils/unparser.ts +++ b/packages/compiler/test/expression_parser/utils/unparser.ts @@ -33,6 +33,8 @@ import { SafePropertyRead, ThisReceiver, Unary, + TemplateLiteralElement, + TemplateLiteral, } from '../../../src/expression_parser/ast'; import {DEFAULT_INTERPOLATION_CONFIG, InterpolationConfig} from '../../../src/ml_parser/defaults'; @@ -215,6 +217,24 @@ class Unparser implements AstVisitor { this._expression += ']'; } + visitTemplateLiteral(ast: TemplateLiteral, context: any) { + this._expression += '`'; + for (let i = 0; i < ast.elements.length; i++) { + this._visit(ast.elements[i]); + const expression = i < ast.expressions.length ? ast.expressions[i] : null; + if (expression !== null) { + this._expression += '${'; + this._visit(expression); + this._expression += '}'; + } + } + this._expression += '`'; + } + + visitTemplateLiteralElement(ast: TemplateLiteralElement, context: any) { + this._expression += ast.text; + } + private _visit(ast: AST) { ast.visit(this); } diff --git a/packages/compiler/test/expression_parser/utils/validator.ts b/packages/compiler/test/expression_parser/utils/validator.ts index cbd3a674ef8c..ad1ac829afae 100644 --- a/packages/compiler/test/expression_parser/utils/validator.ts +++ b/packages/compiler/test/expression_parser/utils/validator.ts @@ -30,6 +30,8 @@ import { SafeKeyedRead, SafePropertyRead, Unary, + TemplateLiteral, + TemplateLiteralElement, } from '../../../src/expression_parser/ast'; import {unparse} from './unparser'; @@ -140,6 +142,14 @@ class ASTValidator extends RecursiveAstVisitor { override visitSafeCall(ast: SafeCall, context: any): any { this.validate(ast, () => super.visitSafeCall(ast, context)); } + + override visitTemplateLiteral(ast: TemplateLiteral, context: any): any { + this.validate(ast, () => super.visitTemplateLiteral(ast, context)); + } + + override visitTemplateLiteralElement(ast: TemplateLiteralElement, context: any): any { + this.validate(ast, () => super.visitTemplateLiteralElement(ast, context)); + } } function inSpan(span: ParseSpan, parentSpan: ParseSpan | undefined): parentSpan is ParseSpan { diff --git a/packages/compiler/test/render3/util/expression.ts b/packages/compiler/test/render3/util/expression.ts index 26c7de479937..e858b32b42fb 100644 --- a/packages/compiler/test/render3/util/expression.ts +++ b/packages/compiler/test/render3/util/expression.ts @@ -115,6 +115,14 @@ class ExpressionSourceHumanizer extends e.RecursiveAstVisitor implements t.Visit this.recordAst(ast); super.visitSafeCall(ast, null); } + override visitTemplateLiteral(ast: e.TemplateLiteral, context: any): void { + this.recordAst(ast); + super.visitTemplateLiteral(ast, null); + } + override visitTemplateLiteralElement(ast: e.TemplateLiteralElement, context: any): void { + this.recordAst(ast); + super.visitTemplateLiteralElement(ast, null); + } visitTemplate(ast: t.Template) { t.visitAll(this, ast.children); From 4016aa32297ead62376d9d01c522136be0c4592a Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Tue, 17 Dec 2024 16:53:01 +0200 Subject: [PATCH 0144/1220] refactor(compiler): clean up tagged templates in output AST (#59230) Makes the following cleanups in the output AST: * The `TemplateLiteral` and `TemplateLiteralElement` nodes have been renamed to `TemplateLiteralExpr` and `TemplateLiteralElementExpr` respectively for consistency and to avoid overlaps with the expression AST nodes. * The `TemplateLiteralExpr` and `TemplateLiteralElementExpr` have been refactored to be `Expression`s for correctness. This involves updating some existing code. * The `TaggedTemplateExpr` has been renamed to `TaggedTemplateLiteralExpr` for consistency. PR Close #59230 --- .../src/ngtsc/translator/src/translator.ts | 10 +- .../ngtsc/translator/src/type_translator.ts | 10 +- packages/compiler/src/compiler.ts | 6 +- .../compiler/src/output/abstract_emitter.ts | 27 ++++-- .../src/output/abstract_js_emitter.ts | 25 ++++- packages/compiler/src/output/output_ast.ts | 95 +++++++++++++------ .../template/pipeline/ir/src/expression.ts | 2 +- .../pipeline/src/phases/const_collection.ts | 2 +- 8 files changed, 135 insertions(+), 42 deletions(-) diff --git a/packages/compiler-cli/src/ngtsc/translator/src/translator.ts b/packages/compiler-cli/src/ngtsc/translator/src/translator.ts index 108fb252dce2..e4e5de6d9173 100644 --- a/packages/compiler-cli/src/ngtsc/translator/src/translator.ts +++ b/packages/compiler-cli/src/ngtsc/translator/src/translator.ts @@ -182,7 +182,7 @@ export class ExpressionTranslatorVisitor ); } - visitTaggedTemplateExpr(ast: o.TaggedTemplateExpr, context: Context): TExpression { + visitTaggedTemplateLiteralExpr(ast: o.TaggedTemplateLiteralExpr, context: Context): TExpression { return this.setSourceMapRange( this.createTaggedTemplateExpression(ast.tag.visitExpression(this, context), { elements: ast.template.elements.map((e) => @@ -433,6 +433,14 @@ export class ExpressionTranslatorVisitor throw new Error('Method not implemented.'); } + visitTemplateLiteralExpr(ast: o.TemplateLiteralExpr, context: Context): TExpression { + throw new Error('Method not implemented'); + } + + visitTemplateLiteralElementExpr(ast: o.TemplateLiteralElementExpr, context: any) { + throw new Error('Method not implemented'); + } + visitWrappedNodeExpr(ast: o.WrappedNodeExpr, _context: Context): any { this.recordWrappedNode(ast); return ast.node; diff --git a/packages/compiler-cli/src/ngtsc/translator/src/type_translator.ts b/packages/compiler-cli/src/ngtsc/translator/src/type_translator.ts index ae630ea46499..2e5416e3a441 100644 --- a/packages/compiler-cli/src/ngtsc/translator/src/type_translator.ts +++ b/packages/compiler-cli/src/ngtsc/translator/src/type_translator.ts @@ -139,7 +139,15 @@ class TypeTranslatorVisitor implements o.ExpressionVisitor, o.TypeVisitor { throw new Error('Method not implemented.'); } - visitTaggedTemplateExpr(ast: o.TaggedTemplateExpr, context: Context): never { + visitTaggedTemplateLiteralExpr(ast: o.TaggedTemplateLiteralExpr, context: Context): never { + throw new Error('Method not implemented.'); + } + + visitTemplateLiteralExpr(ast: o.TemplateLiteralExpr, context: any) { + throw new Error('Method not implemented.'); + } + + visitTemplateLiteralElementExpr(ast: o.TemplateLiteralElementExpr, context: any) { throw new Error('Method not implemented.'); } diff --git a/packages/compiler/src/compiler.ts b/packages/compiler/src/compiler.ts index 08bac97d8305..209eea40466a 100644 --- a/packages/compiler/src/compiler.ts +++ b/packages/compiler/src/compiler.ts @@ -86,9 +86,9 @@ export { ReadVarExpr, ReturnStatement, StatementVisitor, - TaggedTemplateExpr, - TemplateLiteral, - TemplateLiteralElement, + TaggedTemplateLiteralExpr, + TemplateLiteralExpr, + TemplateLiteralElementExpr, Type, TypeModifier, TypeVisitor, diff --git a/packages/compiler/src/output/abstract_emitter.ts b/packages/compiler/src/output/abstract_emitter.ts index 245db09be0a8..431de68b1c68 100644 --- a/packages/compiler/src/output/abstract_emitter.ts +++ b/packages/compiler/src/output/abstract_emitter.ts @@ -299,16 +299,29 @@ export abstract class AbstractEmitterVisitor implements o.StatementVisitor, o.Ex ctx.print(expr, `)`); return null; } - visitTaggedTemplateExpr(expr: o.TaggedTemplateExpr, ctx: EmitterVisitorContext): any { + visitTaggedTemplateLiteralExpr( + expr: o.TaggedTemplateLiteralExpr, + ctx: EmitterVisitorContext, + ): any { expr.tag.visitExpression(this, ctx); - ctx.print(expr, '`' + expr.template.elements[0].rawText); - for (let i = 1; i < expr.template.elements.length; i++) { - ctx.print(expr, '${'); - expr.template.expressions[i - 1].visitExpression(this, ctx); - ctx.print(expr, `}${expr.template.elements[i].rawText}`); + expr.template.visitExpression(this, ctx); + return null; + } + visitTemplateLiteralExpr(expr: o.TemplateLiteralExpr, ctx: EmitterVisitorContext) { + ctx.print(expr, '`'); + for (let i = 0; i < expr.elements.length; i++) { + expr.elements[i].visitExpression(this, ctx); + const expression = i < expr.expressions.length ? expr.expressions[i] : null; + if (expression !== null) { + ctx.print(expression, '${'); + expression.visitExpression(this, ctx); + ctx.print(expression, '}'); + } } ctx.print(expr, '`'); - return null; + } + visitTemplateLiteralElementExpr(expr: o.TemplateLiteralElementExpr, ctx: EmitterVisitorContext) { + ctx.print(expr, expr.rawText); } visitWrappedNodeExpr(ast: o.WrappedNodeExpr, ctx: EmitterVisitorContext): any { throw new Error('Abstract emitter cannot visit WrappedNodeExpr.'); diff --git a/packages/compiler/src/output/abstract_js_emitter.ts b/packages/compiler/src/output/abstract_js_emitter.ts index 285b67afa75f..27e2ef5efbd5 100644 --- a/packages/compiler/src/output/abstract_js_emitter.ts +++ b/packages/compiler/src/output/abstract_js_emitter.ts @@ -42,7 +42,10 @@ export abstract class AbstractJsEmitterVisitor extends AbstractEmitterVisitor { ctx.println(stmt, `;`); return null; } - override visitTaggedTemplateExpr(ast: o.TaggedTemplateExpr, ctx: EmitterVisitorContext): any { + override visitTaggedTemplateLiteralExpr( + ast: o.TaggedTemplateLiteralExpr, + ctx: EmitterVisitorContext, + ): any { // The following convoluted piece of code is effectively the downlevelled equivalent of // ``` // tag`...` @@ -66,6 +69,26 @@ export abstract class AbstractJsEmitterVisitor extends AbstractEmitterVisitor { ctx.print(ast, ')'); return null; } + override visitTemplateLiteralExpr(expr: o.TemplateLiteralExpr, ctx: EmitterVisitorContext): any { + ctx.print(expr, '`'); + for (let i = 0; i < expr.elements.length; i++) { + expr.elements[i].visitExpression(this, ctx); + const expression = i < expr.expressions.length ? expr.expressions[i] : null; + if (expression !== null) { + ctx.print(expression, '${'); + expression.visitExpression(this, ctx); + ctx.print(expression, '}'); + } + } + ctx.print(expr, '`'); + } + override visitTemplateLiteralElementExpr( + expr: o.TemplateLiteralElementExpr, + ctx: EmitterVisitorContext, + ): any { + ctx.print(expr, expr.rawText); + return null; + } override visitFunctionExpr(ast: o.FunctionExpr, ctx: EmitterVisitorContext): any { ctx.print(ast, `function${ast.name ? ' ' + ast.name : ''}(`); this._visitParams(ast.params, ctx); diff --git a/packages/compiler/src/output/output_ast.ts b/packages/compiler/src/output/output_ast.ts index d5b1bf3458d0..49bbcc6f57a2 100644 --- a/packages/compiler/src/output/output_ast.ts +++ b/packages/compiler/src/output/output_ast.ts @@ -552,10 +552,10 @@ export class InvokeFunctionExpr extends Expression { } } -export class TaggedTemplateExpr extends Expression { +export class TaggedTemplateLiteralExpr extends Expression { constructor( public tag: Expression, - public template: TemplateLiteral, + public template: TemplateLiteralExpr, type?: Type | null, sourceSpan?: ParseSourceSpan | null, ) { @@ -564,14 +564,9 @@ export class TaggedTemplateExpr extends Expression { override isEquivalent(e: Expression): boolean { return ( - e instanceof TaggedTemplateExpr && + e instanceof TaggedTemplateLiteralExpr && this.tag.isEquivalent(e.tag) && - areAllEquivalentPredicate( - this.template.elements, - e.template.elements, - (a, b) => a.text === b.text, - ) && - areAllEquivalent(this.template.expressions, e.template.expressions) + this.template.isEquivalent(e.template) ); } @@ -580,11 +575,11 @@ export class TaggedTemplateExpr extends Expression { } override visitExpression(visitor: ExpressionVisitor, context: any): any { - return visitor.visitTaggedTemplateExpr(this, context); + return visitor.visitTaggedTemplateLiteralExpr(this, context); } - override clone(): TaggedTemplateExpr { - return new TaggedTemplateExpr( + override clone(): TaggedTemplateLiteralExpr { + return new TaggedTemplateLiteralExpr( this.tag.clone(), this.template.clone(), this.type, @@ -655,26 +650,48 @@ export class LiteralExpr extends Expression { } } -export class TemplateLiteral { +export class TemplateLiteralExpr extends Expression { constructor( - public elements: TemplateLiteralElement[], + public elements: TemplateLiteralElementExpr[], public expressions: Expression[], - ) {} + sourceSpan?: ParseSourceSpan | null, + ) { + super(null, sourceSpan); + } + + override isEquivalent(e: Expression): boolean { + return ( + e instanceof TemplateLiteralExpr && + areAllEquivalentPredicate(this.elements, e.elements, (a, b) => a.text === b.text) && + areAllEquivalent(this.expressions, e.expressions) + ); + } - clone(): TemplateLiteral { - return new TemplateLiteral( + override isConstant() { + return false; + } + + override visitExpression(visitor: ExpressionVisitor, context: any): any { + return visitor.visitTemplateLiteralExpr(this, context); + } + + override clone(): TemplateLiteralExpr { + return new TemplateLiteralExpr( this.elements.map((el) => el.clone()), this.expressions.map((expr) => expr.clone()), ); } } -export class TemplateLiteralElement { +export class TemplateLiteralElementExpr extends Expression { rawText: string; + constructor( public text: string, - public sourceSpan?: ParseSourceSpan, + sourceSpan?: ParseSourceSpan | null, rawText?: string, ) { + super(STRING_TYPE, sourceSpan); + // If `rawText` is not provided, try to extract the raw string from its // associated `sourceSpan`. If that is also not available, "fake" the raw // string instead by escaping the following control sequences: @@ -685,8 +702,22 @@ export class TemplateLiteralElement { rawText ?? sourceSpan?.toString() ?? escapeForTemplateLiteral(escapeSlashes(text)); } - clone(): TemplateLiteralElement { - return new TemplateLiteralElement(this.text, this.sourceSpan, this.rawText); + override visitExpression(visitor: ExpressionVisitor, context: any) { + return visitor.visitTemplateLiteralElementExpr(this, context); + } + + override isEquivalent(e: Expression): boolean { + return ( + e instanceof TemplateLiteralElementExpr && e.text === this.text && e.rawText === this.rawText + ); + } + + override isConstant(): boolean { + return true; + } + + override clone(): TemplateLiteralElementExpr { + return new TemplateLiteralElementExpr(this.text, this.sourceSpan, this.rawText); } } @@ -1383,7 +1414,9 @@ export interface ExpressionVisitor { visitWriteKeyExpr(expr: WriteKeyExpr, context: any): any; visitWritePropExpr(expr: WritePropExpr, context: any): any; visitInvokeFunctionExpr(ast: InvokeFunctionExpr, context: any): any; - visitTaggedTemplateExpr(ast: TaggedTemplateExpr, context: any): any; + visitTaggedTemplateLiteralExpr(ast: TaggedTemplateLiteralExpr, context: any): any; + visitTemplateLiteralExpr(ast: TemplateLiteralExpr, context: any): any; + visitTemplateLiteralElementExpr(ast: TemplateLiteralElementExpr, context: any): any; visitInstantiateExpr(ast: InstantiateExpr, context: any): any; visitLiteralExpr(ast: LiteralExpr, context: any): any; visitLocalizedString(ast: LocalizedString, context: any): any; @@ -1634,9 +1667,9 @@ export class RecursiveAstVisitor implements StatementVisitor, ExpressionVisitor this.visitAllExpressions(ast.args, context); return this.visitExpression(ast, context); } - visitTaggedTemplateExpr(ast: TaggedTemplateExpr, context: any): any { + visitTaggedTemplateLiteralExpr(ast: TaggedTemplateLiteralExpr, context: any): any { ast.tag.visitExpression(this, context); - this.visitAllExpressions(ast.template.expressions, context); + ast.template.visitExpression(this, context); return this.visitExpression(ast, context); } visitInstantiateExpr(ast: InstantiateExpr, context: any): any { @@ -1711,6 +1744,14 @@ export class RecursiveAstVisitor implements StatementVisitor, ExpressionVisitor this.visitAllExpressions(ast.parts, context); return this.visitExpression(ast, context); } + visitTemplateLiteralExpr(ast: TemplateLiteralExpr, context: any) { + this.visitAllExpressions(ast.elements, context); + this.visitAllExpressions(ast.expressions, context); + return this.visitExpression(ast, context); + } + visitTemplateLiteralElementExpr(ast: TemplateLiteralElementExpr, context: any) { + return this.visitExpression(ast, context); + } visitAllExpressions(exprs: Expression[], context: any): void { exprs.forEach((expr) => expr.visitExpression(this, context)); } @@ -1865,11 +1906,11 @@ export function ifStmt( export function taggedTemplate( tag: Expression, - template: TemplateLiteral, + template: TemplateLiteralExpr, type?: Type | null, sourceSpan?: ParseSourceSpan | null, -): TaggedTemplateExpr { - return new TaggedTemplateExpr(tag, template, type, sourceSpan); +): TaggedTemplateLiteralExpr { + return new TaggedTemplateLiteralExpr(tag, template, type, sourceSpan); } export function literal( diff --git a/packages/compiler/src/template/pipeline/ir/src/expression.ts b/packages/compiler/src/template/pipeline/ir/src/expression.ts index bd336c6d6468..89b800ce7681 100644 --- a/packages/compiler/src/template/pipeline/ir/src/expression.ts +++ b/packages/compiler/src/template/pipeline/ir/src/expression.ts @@ -1290,7 +1290,7 @@ export function transformExpressionsInExpression( } } else if (expr instanceof o.NotExpr) { expr.condition = transformExpressionsInExpression(expr.condition, transform, flags); - } else if (expr instanceof o.TaggedTemplateExpr) { + } else if (expr instanceof o.TaggedTemplateLiteralExpr) { expr.tag = transformExpressionsInExpression(expr.tag, transform, flags); expr.template.expressions = expr.template.expressions.map((e) => transformExpressionsInExpression(e, transform, flags), diff --git a/packages/compiler/src/template/pipeline/src/phases/const_collection.ts b/packages/compiler/src/template/pipeline/src/phases/const_collection.ts index 137c6a7d746c..f02daf404b0f 100644 --- a/packages/compiler/src/template/pipeline/src/phases/const_collection.ts +++ b/packages/compiler/src/template/pipeline/src/phases/const_collection.ts @@ -197,7 +197,7 @@ class ElementAttributes { array.push( o.taggedTemplate( trustedValueFn, - new o.TemplateLiteral([new o.TemplateLiteralElement(value.value)], []), + new o.TemplateLiteralExpr([new o.TemplateLiteralElementExpr(value.value)], []), undefined, value.sourceSpan, ), From 6960ec0c0353d417b5a1c6dbe7b902774e03cc98 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Tue, 17 Dec 2024 16:54:13 +0200 Subject: [PATCH 0145/1220] refactor(compiler-cli): handle template literals in ngtsc (#59230) Updates the translators that convert expression ASTs to account for template literals. PR Close #59230 --- .../linker/babel/src/ast/babel_ast_factory.ts | 6 ++- .../ngtsc/translator/src/api/ast_factory.ts | 12 ++++++ .../src/ngtsc/translator/src/translator.ts | 41 ++++++++++++------- .../translator/src/typescript_ast_factory.ts | 10 ++++- .../src/ngtsc/typecheck/src/expression.ts | 24 ++++++++++- .../typecheck/test/type_check_block_spec.ts | 8 ++++ 6 files changed, 83 insertions(+), 18 deletions(-) diff --git a/packages/compiler-cli/linker/babel/src/ast/babel_ast_factory.ts b/packages/compiler-cli/linker/babel/src/ast/babel_ast_factory.ts index 500fff9cb4b5..ba0d3a1e9f71 100644 --- a/packages/compiler-cli/linker/babel/src/ast/babel_ast_factory.ts +++ b/packages/compiler-cli/linker/babel/src/ast/babel_ast_factory.ts @@ -165,13 +165,17 @@ export class BabelAstFactory implements AstFactory { createReturnStatement = t.returnStatement; createTaggedTemplate(tag: t.Expression, template: TemplateLiteral): t.Expression { + return t.taggedTemplateExpression(tag, this.createTemplateLiteral(template)); + } + + createTemplateLiteral(template: TemplateLiteral): t.TemplateLiteral { const elements = template.elements.map((element, i) => this.setSourceMapRange( t.templateElement(element, i === template.elements.length - 1), element.range, ), ); - return t.taggedTemplateExpression(tag, t.templateLiteral(elements, template.expressions)); + return t.templateLiteral(elements, template.expressions); } createThrowStatement = t.throwStatement; diff --git a/packages/compiler-cli/src/ngtsc/translator/src/api/ast_factory.ts b/packages/compiler-cli/src/ngtsc/translator/src/api/ast_factory.ts index 5593c11e6db6..ecbdd64f0a2d 100644 --- a/packages/compiler-cli/src/ngtsc/translator/src/api/ast_factory.ts +++ b/packages/compiler-cli/src/ngtsc/translator/src/api/ast_factory.ts @@ -217,6 +217,18 @@ export interface AstFactory { */ createTaggedTemplate(tag: TExpression, template: TemplateLiteral): TExpression; + /** + * Create an untagged template literal + * + * ``` + * `str1${expr1}str2${expr2}str3` + * ``` + * + * @param template the collection of strings and expressions that constitute an interpolated + * template literal. + */ + createTemplateLiteral(template: TemplateLiteral): TExpression; + /** * Create a throw statement (e.g. `throw expr;`). * diff --git a/packages/compiler-cli/src/ngtsc/translator/src/translator.ts b/packages/compiler-cli/src/ngtsc/translator/src/translator.ts index e4e5de6d9173..365970acafdd 100644 --- a/packages/compiler-cli/src/ngtsc/translator/src/translator.ts +++ b/packages/compiler-cli/src/ngtsc/translator/src/translator.ts @@ -184,16 +184,17 @@ export class ExpressionTranslatorVisitor visitTaggedTemplateLiteralExpr(ast: o.TaggedTemplateLiteralExpr, context: Context): TExpression { return this.setSourceMapRange( - this.createTaggedTemplateExpression(ast.tag.visitExpression(this, context), { - elements: ast.template.elements.map((e) => - createTemplateElement({ - cooked: e.text, - raw: e.rawText, - range: e.sourceSpan ?? ast.sourceSpan, - }), - ), - expressions: ast.template.expressions.map((e) => e.visitExpression(this, context)), - }), + this.createTaggedTemplateExpression( + ast.tag.visitExpression(this, context), + this.getTemplateLiteralFromAst(ast.template, context), + ), + ast.sourceSpan, + ); + } + + visitTemplateLiteralExpr(ast: o.TemplateLiteralExpr, context: Context): TExpression { + return this.setSourceMapRange( + this.factory.createTemplateLiteral(this.getTemplateLiteralFromAst(ast, context)), ast.sourceSpan, ); } @@ -433,10 +434,6 @@ export class ExpressionTranslatorVisitor throw new Error('Method not implemented.'); } - visitTemplateLiteralExpr(ast: o.TemplateLiteralExpr, context: Context): TExpression { - throw new Error('Method not implemented'); - } - visitTemplateLiteralElementExpr(ast: o.TemplateLiteralElementExpr, context: any) { throw new Error('Method not implemented'); } @@ -482,6 +479,22 @@ export class ExpressionTranslatorVisitor } return statement; } + + private getTemplateLiteralFromAst( + ast: o.TemplateLiteralExpr, + context: Context, + ): TemplateLiteral { + return { + elements: ast.elements.map((e) => + createTemplateElement({ + cooked: e.text, + raw: e.rawText, + range: e.sourceSpan ?? ast.sourceSpan, + }), + ), + expressions: ast.expressions.map((e) => e.visitExpression(this, context)), + }; + } } /** diff --git a/packages/compiler-cli/src/ngtsc/translator/src/typescript_ast_factory.ts b/packages/compiler-cli/src/ngtsc/translator/src/typescript_ast_factory.ts index a6781c3b0d0c..4ec995a82fc3 100644 --- a/packages/compiler-cli/src/ngtsc/translator/src/typescript_ast_factory.ts +++ b/packages/compiler-cli/src/ngtsc/translator/src/typescript_ast_factory.ts @@ -243,6 +243,14 @@ export class TypeScriptAstFactory implements AstFactory, ): ts.Expression { + return ts.factory.createTaggedTemplateExpression( + tag, + undefined, + this.createTemplateLiteral(template), + ); + } + + createTemplateLiteral(template: TemplateLiteral): ts.TemplateLiteral { let templateLiteral: ts.TemplateLiteral; const length = template.elements.length; const head = template.elements[0]; @@ -276,7 +284,7 @@ export class TypeScriptAstFactory implements AstFactory { expect(tcb(TEMPLATE)).toContain('_t2(1)'); }); + it('should handle template literals', () => { + expect(tcb('{{ `hello world` }}')).toContain('"" + (`hello world`);'); + expect(tcb('{{ `hello \\${name}!!!` }}')).toContain('"" + (`hello \\${name}!!!`);'); + expect(tcb('{{ `${a} - ${b} - ${c}` }}')).toContain( + '"" + (`${((this).a)} - ${((this).b)} - ${((this).c)}`);', + ); + }); + describe('type constructors', () => { it('should handle missing property bindings', () => { const TEMPLATE = `
`; From fe8a68329b50363f914a728579392f3fc68670a6 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Wed, 18 Dec 2024 10:55:54 +0200 Subject: [PATCH 0146/1220] feat(compiler): support untagged template literals in expressions (#59230) Updates the compiler to support untagged template literals inside of the expression syntax (e.g. ``hello ${world}``). PR Close #59230 --- .../value_composition/GOLDEN_PARTIAL.js | 57 +++++++++++++++++++ .../value_composition/TEST_CASES.json | 16 +++++- .../value_composition/template_literals.js | 8 +++ .../value_composition/template_literals.ts | 22 +++++++ .../test/ngtsc/template_typecheck_spec.ts | 52 +++++++++++++++++ .../template/pipeline/ir/src/expression.ts | 4 ++ .../src/template/pipeline/src/ingest.ts | 11 ++++ .../core/test/acceptance/integration_spec.ts | 20 +++++++ .../language-service/test/quick_info_spec.ts | 8 +++ 9 files changed, 197 insertions(+), 1 deletion(-) create mode 100644 packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/template_literals.js create mode 100644 packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/template_literals.ts diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/GOLDEN_PARTIAL.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/GOLDEN_PARTIAL.js index e384b3c1b5b5..b5d140447ee9 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/GOLDEN_PARTIAL.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/GOLDEN_PARTIAL.js @@ -723,3 +723,60 @@ export declare class MyModule { static ɵinj: i0.ɵɵInjectorDeclaration; } +/**************************************************************************************************** + * PARTIAL FILE: template_literals.js + ****************************************************************************************************/ +import { Component, Pipe } from '@angular/core'; +import * as i0 from "@angular/core"; +export class UppercasePipe { + transform(value) { + return value.toUpperCase(); + } +} +UppercasePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: UppercasePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); +UppercasePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: UppercasePipe, isStandalone: true, name: "uppercase" }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: UppercasePipe, decorators: [{ + type: Pipe, + args: [{ name: 'uppercase' }] + }] }); +export class MyApp { + constructor() { + this.name = 'Frodo'; + this.timeOfDay = 'morning'; + } +} +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: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, isStandalone: true, selector: "my-app", ngImport: i0, template: ` +
No interpolations: {{ \`hello world \` }}
+ With interpolations: {{ \`hello \${name}, it is currently \${timeOfDay}!\` }} +

With pipe: {{\`hello \${name}\` | uppercase}}

+ `, isInline: true, dependencies: [{ kind: "pipe", type: UppercasePipe, name: "uppercase" }] }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, decorators: [{ + type: Component, + args: [{ + selector: 'my-app', + template: ` +
No interpolations: {{ \`hello world \` }}
+ With interpolations: {{ \`hello \${name}, it is currently \${timeOfDay}!\` }} +

With pipe: {{\`hello \${name}\` | uppercase}}

+ `, + imports: [UppercasePipe], + }] + }] }); + +/**************************************************************************************************** + * PARTIAL FILE: template_literals.d.ts + ****************************************************************************************************/ +import * as i0 from "@angular/core"; +export declare class UppercasePipe { + transform(value: string): string; + static ɵfac: i0.ɵɵFactoryDeclaration; + static ɵpipe: i0.ɵɵPipeDeclaration; +} +export declare class MyApp { + name: string; + timeOfDay: string; + static ɵfac: i0.ɵɵFactoryDeclaration; + static ɵcmp: i0.ɵɵComponentDeclaration; +} + diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/TEST_CASES.json index 72bdbda36750..89bd8cd751de 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/TEST_CASES.json @@ -290,6 +290,20 @@ ] } ] + }, + { + "description": "should support template literals", + "inputFiles": [ + "template_literals.ts" + ], + "expectations": [ + { + "failureMessage": "Invalid template literal binding", + "files": [ + "template_literals.js" + ] + } + ] } ] -} \ No newline at end of file +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/template_literals.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/template_literals.js new file mode 100644 index 000000000000..5e4c1454552f --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/template_literals.js @@ -0,0 +1,8 @@ +if (rf & 2) { + $r3$.ɵɵadvance(); + $r3$.ɵɵtextInterpolate1("No interpolations: ", `hello world `, ""); + $r3$.ɵɵadvance(2); + $r3$.ɵɵtextInterpolate1("With interpolations: ", `hello ${ctx.name}, it is currently ${ctx.timeOfDay}!`, ""); + $r3$.ɵɵadvance(2); + $r3$.ɵɵtextInterpolate1("With pipe: ", $r3$.ɵɵpipeBind1(6, 3, `hello ${ctx.name}`), ""); +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/template_literals.ts b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/template_literals.ts new file mode 100644 index 000000000000..70ef4e7044ee --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/template_literals.ts @@ -0,0 +1,22 @@ +import {Component, Pipe} from '@angular/core'; + +@Pipe({name: 'uppercase'}) +export class UppercasePipe { + transform(value: string) { + return value.toUpperCase(); + } +} + +@Component({ + selector: 'my-app', + template: ` +
No interpolations: {{ \`hello world \` }}
+ With interpolations: {{ \`hello \${name}, it is currently \${timeOfDay}!\` }} +

With pipe: {{\`hello \${name}\` | uppercase}}

+ `, + imports: [UppercasePipe], +}) +export class MyApp { + name = 'Frodo'; + timeOfDay = 'morning'; +} diff --git a/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts b/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts index 4ef3a70ebad0..c80b474c8026 100644 --- a/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts +++ b/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts @@ -3352,6 +3352,58 @@ runInEachFileSystem(() => { expect(diags.length).toBe(0); }); + describe('template literals', () => { + it('should treat template literals as strings', () => { + env.write( + 'test.ts', + ` + import {Component} from '@angular/core'; + + @Component({ + template: 'Result: {{getValue(\`foo\`)}}', + standalone: true, + }) + export class Main { + getValue(value: number) { + return value; + } + } + `, + ); + + const diags = env.driveDiagnostics(); + expect(diags.length).toBe(1); + expect(diags[0].messageText).toBe( + `Argument of type 'string' is not assignable to parameter of type 'number'.`, + ); + }); + + it('should check interpolations inside template literals', () => { + env.write( + 'test.ts', + ` + import {Component} from '@angular/core'; + + @Component({ + template: '{{\`Hello \${getName(123)}\`}}', + standalone: true, + }) + export class Main { + getName(value: string) { + return value; + } + } + `, + ); + + const diags = env.driveDiagnostics(); + expect(diags.length).toBe(1); + expect(diags[0].messageText).toBe( + `Argument of type 'number' is not assignable to parameter of type 'string'.`, + ); + }); + }); + describe('legacy schema checking with the DOM schema', () => { beforeEach(() => { env.tsconfig({fullTemplateTypeCheck: false}); diff --git a/packages/compiler/src/template/pipeline/ir/src/expression.ts b/packages/compiler/src/template/pipeline/ir/src/expression.ts index 89b800ce7681..a3f493c1a379 100644 --- a/packages/compiler/src/template/pipeline/ir/src/expression.ts +++ b/packages/compiler/src/template/pipeline/ir/src/expression.ts @@ -1305,6 +1305,10 @@ export function transformExpressionsInExpression( } } else if (expr instanceof o.WrappedNodeExpr) { // TODO: Do we need to transform any TS nodes nested inside of this expression? + } else if (expr instanceof o.TemplateLiteralExpr) { + for (let i = 0; i < expr.expressions.length; i++) { + expr.expressions[i] = transformExpressionsInExpression(expr.expressions[i], transform, flags); + } } else if ( expr instanceof o.ReadVarExpr || expr instanceof o.ExternalExpr || diff --git a/packages/compiler/src/template/pipeline/src/ingest.ts b/packages/compiler/src/template/pipeline/src/ingest.ts index 10f95362b5c3..eeca7e7c01fb 100644 --- a/packages/compiler/src/template/pipeline/src/ingest.ts +++ b/packages/compiler/src/template/pipeline/src/ingest.ts @@ -1164,6 +1164,17 @@ function convertAst( ); } else if (ast instanceof e.TypeofExpression) { return o.typeofExpr(convertAst(ast.expression, job, baseSourceSpan)); + } else if (ast instanceof e.TemplateLiteral) { + return new o.TemplateLiteralExpr( + ast.elements.map((el) => { + return new o.TemplateLiteralElementExpr( + el.text, + convertSourceSpan(el.span, baseSourceSpan), + ); + }), + ast.expressions.map((expr) => convertAst(expr, job, baseSourceSpan)), + convertSourceSpan(ast.span, baseSourceSpan), + ); } else { throw new Error( `Unhandled expression type "${ast.constructor.name}" in file "${baseSourceSpan?.start.file.url}"`, diff --git a/packages/core/test/acceptance/integration_spec.ts b/packages/core/test/acceptance/integration_spec.ts index ff6681da851f..b91be9a4a1e1 100644 --- a/packages/core/test/acceptance/integration_spec.ts +++ b/packages/core/test/acceptance/integration_spec.ts @@ -2715,6 +2715,26 @@ describe('acceptance integration tests', () => { expect(() => TestBed.createComponent(Comp).detectChanges()).not.toThrow(); }); + it('should support template literals in expressions', () => { + @Component({ + standalone: true, + template: 'Message: {{`Hello, ${name} - ${value}`}}', + }) + class TestComponent { + name = 'Frodo'; + value = 0; + } + + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toContain('Message: Hello, Frodo - 0'); + + fixture.componentInstance.value++; + fixture.componentInstance.name = 'Bilbo'; + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toContain('Message: Hello, Bilbo - 1'); + }); + describe('tView.firstUpdatePass', () => { function isFirstUpdatePass() { const lView = getLView(); diff --git a/packages/language-service/test/quick_info_spec.ts b/packages/language-service/test/quick_info_spec.ts index 9841537e4d02..c2fbc13a387c 100644 --- a/packages/language-service/test/quick_info_spec.ts +++ b/packages/language-service/test/quick_info_spec.ts @@ -402,6 +402,14 @@ describe('quick info', () => { expectedDisplayString: '(property) name: "name"', }); }); + + it('should work for template literal interpolations', () => { + expectQuickInfo({ + templateOverride: `
{{\`Hello \${na¦me}\`}}
`, + expectedSpanText: 'name', + expectedDisplayString: '(variable) name: { readonly name: "name"; }', + }); + }); }); describe('pipes', () => { From 4f46b02f29903c468a118848eec2b2db1a704061 Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Tue, 21 Jan 2025 12:34:01 -0800 Subject: [PATCH 0147/1220] test(zone.js): reduce flakiness of a timer-related test (#59653) This commit updates a flaky test to increase the amount of work (more `for` loop iterations) to minimize the chance of getting the same timestamp after that work. PR Close #59653 --- packages/zone.js/test/jest/jest.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/zone.js/test/jest/jest.spec.js b/packages/zone.js/test/jest/jest.spec.js index eb195ac15db8..aed6f781c2fd 100644 --- a/packages/zone.js/test/jest/jest.spec.js +++ b/packages/zone.js/test/jest/jest.spec.js @@ -141,7 +141,7 @@ describe('jest modern fakeTimers with zone.js fakeAsync', () => { let d = fakeAsyncZoneSpec.getRealSystemTime(); jest.setSystemTime(d); expect(Date.now()).toEqual(d); - for (let i = 0; i < 100000; i++) {} + for (let i = 0; i < 10_000_000; i++) {} expect(fakeAsyncZoneSpec.getRealSystemTime()).not.toEqual(d); d = fakeAsyncZoneSpec.getRealSystemTime(); let timeoutTriggered = false; From c089d21eb086d5d86f97d38139fdb63f76e477b0 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Mon, 20 Jan 2025 16:11:15 +0100 Subject: [PATCH 0148/1220] refactor(core): reuse directive instantiate logic (#59633) This refactor reuses the existing directive instantiation logic for a given component. PR Close #59633 --- packages/core/src/render3/component_ref.ts | 187 ++++-------------- .../core/src/render3/instructions/element.ts | 8 +- .../render3/instructions/element_container.ts | 8 +- .../core/src/render3/instructions/shared.ts | 35 ++-- .../core/src/render3/instructions/template.ts | 4 +- .../bundle.golden_symbols.json | 6 +- .../animations/bundle.golden_symbols.json | 6 +- .../cyclic_import/bundle.golden_symbols.json | 6 +- .../bundling/defer/bundle.golden_symbols.json | 5 +- .../forms_reactive/bundle.golden_symbols.json | 5 +- .../bundle.golden_symbols.json | 5 +- .../hello_world/bundle.golden_symbols.json | 3 +- .../hydration/bundle.golden_symbols.json | 2 +- .../router/bundle.golden_symbols.json | 5 +- .../bundle.golden_symbols.json | 3 +- .../bundling/todo/bundle.golden_symbols.json | 5 +- 16 files changed, 88 insertions(+), 205 deletions(-) diff --git a/packages/core/src/render3/component_ref.ts b/packages/core/src/render3/component_ref.ts index dac2e1c2af18..454f1a239e19 100644 --- a/packages/core/src/render3/component_ref.ts +++ b/packages/core/src/render3/component_ref.ts @@ -28,25 +28,22 @@ 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, assertGreaterThan, assertIndexInRange} from '../util/assert'; +import {assertDefined} from '../util/assert'; import {assertComponentType, assertNoDuplicateDirectives} from './assert'; import {attachPatchData} from './context_discovery'; import {getComponentDef} from './def_getters'; import {depsTracker} from './deps_tracker/deps_tracker'; -import {getNodeInjectable, NodeInjector} from './di'; +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 { - addToEndOfViewTree, + createDirectivesInstances, createLView, createTView, - getInitialLViewFlagsFromDef, - getOrCreateComponentTView, initializeDirectives, - invokeDirectivesHostBindings, locateHostElement, markAsComponentHost, setInputsForProperty, @@ -62,11 +59,10 @@ import { TNode, TNodeType, } from './interfaces/node'; -import {RElement, RNode} from './interfaces/renderer_dom'; +import {RNode} from './interfaces/renderer_dom'; import { CONTEXT, HEADER_OFFSET, - INJECTOR, LView, LViewEnvironment, LViewFlags, @@ -75,25 +71,25 @@ import { } from './interfaces/view'; import {MATH_ML_NAMESPACE, SVG_NAMESPACE} from './namespaces'; +import {ChainedInjector} from './chained_injector'; import {createElementNode, setupStaticAttributes} from './dom_node_manipulation'; +import {AttributeMarker} from './interfaces/attribute_marker'; +import {unregisterLView} from './interfaces/lview_tracking'; +import {CssSelector} from './interfaces/projection'; import { extractAttrsAndClassesFromSelector, stringifyCSSSelectorList, } from './node_selector_matcher'; +import {profiler} from './profiler'; +import {ProfilerEvent} from './profiler_types'; +import {executeContentQueries} from './queries/query_execution'; import {enterView, getCurrentTNode, getLView, 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, getNativeByTNode, getTNode} from './util/view_utils'; +import {getComponentLViewByIndex, getTNode} from './util/view_utils'; import {ViewRef} from './view_ref'; -import {ChainedInjector} from './chained_injector'; -import {unregisterLView} from './interfaces/lview_tracking'; -import {profiler} from './profiler'; -import {ProfilerEvent} from './profiler_types'; -import {executeContentQueries} from './queries/query_execution'; -import {AttributeMarker} from './interfaces/attribute_marker'; -import {CssSelector} from './interfaces/projection'; -import {getOrCreateTNode} from './tnode_manipulation'; export class ComponentFactoryResolver extends AbstractComponentFactoryResolver { /** @@ -328,7 +324,7 @@ export class ComponentFactory extends AbstractComponentFactory { null, null, ); - const rootLView = createLView( + const rootLView = createLView( null, rootTView, null, @@ -351,10 +347,10 @@ export class ComponentFactory extends AbstractComponentFactory { // issues would allow us to drop this. enterView(rootLView); - let component: T; let componentView: LView | null = null; try { + // TODO(pk): this is a good refactoring since it shows how to instantiate a TNOde with a set of known directive defs const rootComponentDef = this.componentDef; let rootDirectives: DirectiveDef[]; let hostDirectiveDefs: HostDirectiveDefs | null = null; @@ -388,6 +384,18 @@ export class ComponentFactory extends AbstractComponentFactory { tAttributes, ); + // TODO(pk): partial code duplication with resolveDirectives and other existing logic + markAsComponentHost(rootTView, hostTNode, rootDirectives.length - 1); + initializeDirectives( + rootTView, + rootLView, + hostTNode, + rootDirectives, + null, + hostDirectiveDefs, + ); + registerPostOrderHooks(rootTView, hostTNode); + for (const def of rootDirectives) { hostTNode.mergedAttrs = mergeHostAttrs(hostTNode.mergedAttrs, def.hostAttrs); } @@ -400,31 +408,22 @@ export class ComponentFactory extends AbstractComponentFactory { // tests so that this check can be removed. if (hostRNode) { setupStaticAttributes(hostRenderer, hostRNode, hostTNode); + attachPatchData(hostRNode, rootLView); } - componentView = createRootComponentView( - hostTNode, - hostRNode, - rootComponentDef, - rootDirectives, - rootLView, - environment, - ); - if (projectableNodes !== undefined) { projectNodes(hostTNode, this.ngContentSelectors, projectableNodes); } - // TODO: should LifecycleHooksFeature and other host features be generated by the compiler - // and executed here? Angular 5 reference: https://stackblitz.com/edit/lifecycle-hooks-vcref - component = createRootComponent( - componentView, - rootComponentDef, - rootDirectives, - hostDirectiveDefs, - rootLView, - [LifecycleHooksFeature], - ); + // TODO(pk): this logic is similar to the instruction code where a node can have directives + createDirectivesInstances(rootTView, rootLView, hostTNode); + executeContentQueries(rootTView, hostTNode, rootLView); + + componentView = getComponentLViewByIndex(hostTNode.index, rootLView); + + // TODO(pk): why do we need this logic? + rootLView[CONTEXT] = componentView[CONTEXT] as T; + renderView(rootTView, rootLView, null); } catch (e) { // Stop tracking the views if creation failed since @@ -442,7 +441,7 @@ export class ComponentFactory extends AbstractComponentFactory { const hostTNode = getTNode(rootTView, HEADER_OFFSET) as TElementNode; return new ComponentRef( this.componentType, - component, + componentView[CONTEXT] as T, createElementRef(hostTNode, rootLView), rootLView, hostTNode, @@ -527,118 +526,10 @@ export class ComponentRef extends AbstractComponentRef { } } +// TODO: remove? /** Represents a HostFeature function. */ type HostFeature = (component: T, componentDef: ComponentDef) => void; -/** - * Creates the root component view and the root component node. - * - * @param hostRNode Render host element. - * @param rootComponentDef ComponentDef - * @param rootView The parent view where the host node is stored - * @param rendererFactory Factory to be used for creating child renderers. - * @param hostRenderer The current renderer - * @param sanitizer The sanitizer, if provided - * - * @returns Component view created - */ -function createRootComponentView( - tNode: TElementNode, - hostRNode: RElement | null, - rootComponentDef: ComponentDef, - rootDirectives: DirectiveDef[], - rootView: LView, - environment: LViewEnvironment, -): LView { - const tView = rootView[TVIEW]; - - // Hydration info is on the host element and needs to be retrieved - // and passed to the component LView. - let hydrationInfo: DehydratedView | null = null; - if (hostRNode !== null) { - hydrationInfo = retrieveHydrationInfo(hostRNode, rootView[INJECTOR]); - } - const viewRenderer = environment.rendererFactory.createRenderer(hostRNode, rootComponentDef); - const componentView = createLView( - rootView, - getOrCreateComponentTView(rootComponentDef), - null, - getInitialLViewFlagsFromDef(rootComponentDef), - rootView[tNode.index], - tNode, - environment, - viewRenderer, - null, - null, - hydrationInfo, - ); - - if (tView.firstCreatePass) { - markAsComponentHost(tView, tNode, rootDirectives.length - 1); - } - - addToEndOfViewTree(rootView, componentView); - - // Store component view at node index, with node as the HOST - return (rootView[tNode.index] = componentView); -} - -/** - * Creates a root component and sets it up with features and host bindings.Shared by - * renderComponent() and ViewContainerRef.createComponent(). - */ -function createRootComponent( - componentView: LView, - rootComponentDef: ComponentDef, - rootDirectives: DirectiveDef[], - hostDirectiveDefs: HostDirectiveDefs | null, - rootLView: LView, - hostFeatures: HostFeature[] | null, -): any { - const rootTNode = getCurrentTNode() as TElementNode; - ngDevMode && assertDefined(rootTNode, 'tNode should have been already created'); - const tView = rootLView[TVIEW]; - const native = getNativeByTNode(rootTNode, rootLView); - - initializeDirectives(tView, rootLView, rootTNode, rootDirectives, null, hostDirectiveDefs); - - for (let i = 0; i < rootDirectives.length; i++) { - const directiveIndex = rootTNode.directiveStart + i; - const directiveInstance = getNodeInjectable(rootLView, tView, directiveIndex, rootTNode); - attachPatchData(directiveInstance, rootLView); - } - - invokeDirectivesHostBindings(tView, rootLView, rootTNode); - - if (native) { - attachPatchData(native, rootLView); - } - - // We're guaranteed for the `componentOffset` to be positive here - // since a root component always matches a component def. - ngDevMode && - assertGreaterThan(rootTNode.componentOffset, -1, 'componentOffset must be great than -1'); - const component = getNodeInjectable( - rootLView, - tView, - rootTNode.directiveStart + rootTNode.componentOffset, - rootTNode, - ); - componentView[CONTEXT] = rootLView[CONTEXT] = component; - - if (hostFeatures !== null) { - for (const feature of hostFeatures) { - feature(component, rootComponentDef); - } - } - - // We want to generate an empty QueryList for root content queries for backwards - // compatibility with ViewEngine. - executeContentQueries(tView, rootTNode, rootLView); - - return component; -} - /** Projects the `projectableNodes` that were specified when creating a root component. */ function projectNodes( tNode: TElementNode, diff --git a/packages/core/src/render3/instructions/element.ts b/packages/core/src/render3/instructions/element.ts index c9a186d489de..62d4ff553da0 100644 --- a/packages/core/src/render3/instructions/element.ts +++ b/packages/core/src/render3/instructions/element.ts @@ -72,7 +72,11 @@ import {getConstant} from '../util/view_utils'; import {validateElementIsKnown} from './element_validation'; import {setDirectiveInputsWhichShadowsStyling} from './property'; -import {createDirectivesInstances, resolveDirectives, saveResolvedLocalsInData} from './shared'; +import { + createDirectivesInstancesInInstruction, + resolveDirectives, + saveResolvedLocalsInData, +} from './shared'; import {getOrCreateTNode} from '../tnode_manipulation'; function elementStartFirstCreatePass( @@ -172,7 +176,7 @@ export function ɵɵelementStart( increaseElementDepthCount(); if (hasDirectives) { - createDirectivesInstances(tView, lView, tNode); + createDirectivesInstancesInInstruction(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 3eef61a7d460..e1791e37b0bb 100644 --- a/packages/core/src/render3/instructions/element_container.ts +++ b/packages/core/src/render3/instructions/element_container.ts @@ -41,7 +41,11 @@ import { import {computeStaticStyling} from '../styling/static_styling'; import {getConstant} from '../util/view_utils'; -import {createDirectivesInstances, resolveDirectives, saveResolvedLocalsInData} from './shared'; +import { + createDirectivesInstancesInInstruction, + resolveDirectives, + saveResolvedLocalsInData, +} from './shared'; import {getOrCreateTNode} from '../tnode_manipulation'; function elementContainerStartFirstCreatePass( @@ -119,7 +123,7 @@ export function ɵɵelementContainerStart( attachPatchData(comment, lView); if (isDirectiveHost(tNode)) { - createDirectivesInstances(tView, lView, tNode); + createDirectivesInstancesInInstruction(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 34c19f4c4b88..c3fbd181620c 100644 --- a/packages/core/src/render3/instructions/shared.ts +++ b/packages/core/src/render3/instructions/shared.ts @@ -272,9 +272,21 @@ export function executeTemplate( /** * Creates directive instances. */ -export function createDirectivesInstances(tView: TView, lView: LView, tNode: TDirectiveHostNode) { +export function createDirectivesInstancesInInstruction( + tView: TView, + lView: LView, + tNode: TDirectiveHostNode, +) { if (!getBindingsEnabled()) return; - instantiateAllDirectives(tView, lView, tNode, getNativeByTNode(tNode, lView)); + attachPatchData(getNativeByTNode(tNode, lView), lView); + createDirectivesInstances(tView, lView, tNode); +} + +/** + * Creates directive instances. + */ +export function createDirectivesInstances(tView: TView, lView: LView, tNode: TDirectiveHostNode) { + instantiateAllDirectives(tView, lView, tNode); if ((tNode.flags & TNodeFlags.hasHostBindings) === TNodeFlags.hasHostBindings) { invokeDirectivesHostBindings(tView, lView, tNode); } @@ -992,12 +1004,7 @@ function lastSelectedElementIdx(hostBindingOpCodes: HostBindingOpCodes): number /** * Instantiate all the directives that were previously resolved on the current node. */ -function instantiateAllDirectives( - tView: TView, - lView: LView, - tNode: TDirectiveHostNode, - native: RNode, -) { +function instantiateAllDirectives(tView: TView, lView: LView, tNode: TDirectiveHostNode) { const start = tNode.directiveStart; const end = tNode.directiveEnd; @@ -1005,7 +1012,7 @@ function instantiateAllDirectives( // since it is used to inject some special symbols like `ChangeDetectorRef`. if (isComponentHost(tNode)) { ngDevMode && assertTNodeType(tNode, TNodeType.AnyRNode); - addComponentLogic( + createComponentLView( lView, tNode as TElementNode, tView.data[start + tNode.componentOffset] as ComponentDef, @@ -1016,8 +1023,6 @@ function instantiateAllDirectives( getOrCreateNodeInjectorForNode(tNode, lView); } - attachPatchData(native, lView); - const initialInputs = tNode.initialInputs; for (let i = start; i < end; i++) { const def = tView.data[i] as DirectiveDef; @@ -1274,7 +1279,11 @@ export function getInitialLViewFlagsFromDef(def: ComponentDef): LViewFl return flags; } -function addComponentLogic(lView: LView, hostTNode: TElementNode, def: ComponentDef): void { +export function createComponentLView( + lView: LView, + hostTNode: TElementNode, + def: ComponentDef, +): LView { const native = getNativeByTNode(hostTNode, lView) as RElement; const tView = getOrCreateComponentTView(def); @@ -1300,7 +1309,7 @@ function addComponentLogic(lView: LView, hostTNode: TElementNode, def: Compon // Component view will always be created before any injected LContainers, // so this is a regular element, wrap it with the component view - lView[hostTNode.index] = componentView; + return (lView[hostTNode.index] = componentView); } export function elementAttributeInternal( diff --git a/packages/core/src/render3/instructions/template.ts b/packages/core/src/render3/instructions/template.ts index 05b209f3e76f..d012ade569c6 100644 --- a/packages/core/src/render3/instructions/template.ts +++ b/packages/core/src/render3/instructions/template.ts @@ -39,7 +39,7 @@ import {getConstant} from '../util/view_utils'; import { addToEndOfViewTree, - createDirectivesInstances, + createDirectivesInstancesInInstruction, createLContainer, createTView, resolveDirectives, @@ -154,7 +154,7 @@ export function declareTemplate( populateDehydratedViewsInLContainer(lContainer, tNode, declarationLView); if (isDirectiveHost(tNode)) { - createDirectivesInstances(declarationTView, declarationLView, tNode); + createDirectivesInstancesInInstruction(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 eeaca8775b63..2c3d7c96fef0 100644 --- a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json @@ -92,7 +92,6 @@ "KeyEventsPlugin", "LEAVE_TOKEN_REGEX", "LOCALE_ID2", - "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "NAMESPACE_URIS", @@ -201,7 +200,6 @@ "activeConsumer", "addClass", "addPropertyBinding", - "addToEndOfViewTree", "allocExpando", "allocLFrame", "angularZoneInstanceIdProperty", @@ -249,6 +247,7 @@ "context", "convertToBitFlags", "copyAnimationEvent", + "createDirectivesInstances", "createElementNode", "createElementRef", "createErrorClass", @@ -307,7 +306,6 @@ "getDirectiveDef", "getFactoryDef", "getFirstLContainer", - "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", @@ -319,7 +317,6 @@ "getNextLContainer", "getNodeInjectable", "getNullInjector", - "getOrCreateComponentTView", "getOrCreateInjectable", "getOrCreateNodeInjectorForNode", "getOrCreateTNode", @@ -359,7 +356,6 @@ "internalProvideZoneChangeDetection", "interpolateParams", "invalidTimingValue", - "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "invokeQuery", "isAngularZoneProperty", diff --git a/packages/core/test/bundling/animations/bundle.golden_symbols.json b/packages/core/test/bundling/animations/bundle.golden_symbols.json index acbb5dddadc2..8939ba2f4ade 100644 --- a/packages/core/test/bundling/animations/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations/bundle.golden_symbols.json @@ -98,7 +98,6 @@ "KeyEventsPlugin", "LEAVE_TOKEN_REGEX", "LOCALE_ID2", - "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "NAMESPACE_URIS", @@ -220,7 +219,6 @@ "activeConsumer", "addClass", "addPropertyBinding", - "addToEndOfViewTree", "allocExpando", "allocLFrame", "angularZoneInstanceIdProperty", @@ -268,6 +266,7 @@ "context", "convertToBitFlags", "copyAnimationEvent", + "createDirectivesInstances", "createElementNode", "createElementRef", "createErrorClass", @@ -328,7 +327,6 @@ "getDirectiveDef", "getFactoryDef", "getFirstLContainer", - "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", @@ -341,7 +339,6 @@ "getNgZoneOptions", "getNodeInjectable", "getNullInjector", - "getOrCreateComponentTView", "getOrCreateInjectable", "getOrCreateNodeInjectorForNode", "getOrCreateTNode", @@ -382,7 +379,6 @@ "internalProvideZoneChangeDetection", "interpolateParams", "invalidTimingValue", - "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "invokeQuery", "isAngularZoneProperty", 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 84033396a41f..64603b671133 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -66,7 +66,6 @@ "InputFlags", "KeyEventsPlugin", "LOCALE_ID2", - "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "Module", @@ -166,7 +165,6 @@ "_wasLastNodeCreated", "activeConsumer", "addPropertyBinding", - "addToEndOfViewTree", "allocExpando", "allocLFrame", "angularZoneInstanceIdProperty", @@ -203,6 +201,7 @@ "consumerPollProducersForChange", "context", "convertToBitFlags", + "createDirectivesInstances", "createElementNode", "createElementRef", "createErrorClass", @@ -256,7 +255,6 @@ "getDirectiveDef", "getFactoryDef", "getFirstLContainer", - "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", @@ -269,7 +267,6 @@ "getNgZoneOptions", "getNodeInjectable", "getNullInjector", - "getOrCreateComponentTView", "getOrCreateInjectable", "getOrCreateNodeInjectorForNode", "getOrCreateTNode", @@ -305,7 +302,6 @@ "instructionState", "internalImportProvidersFrom", "internalProvideZoneChangeDetection", - "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "isAngularZoneProperty", "isApplicationBootstrapConfig", diff --git a/packages/core/test/bundling/defer/bundle.golden_symbols.json b/packages/core/test/bundling/defer/bundle.golden_symbols.json index 29419f5b756c..a9f2d40a045c 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -87,7 +87,6 @@ "KeyEventsPlugin", "LOADING_AFTER_SLOT", "LOCALE_ID2", - "LifecycleHooksFeature", "MATH_ML_NAMESPACE", "MAXIMUM_REFRESH_RERUNS", "MINIMUM_SLOT", @@ -247,6 +246,7 @@ "convertToBitFlags", "createContainerAnchorImpl", "createDirectivesInstances", + "createDirectivesInstancesInInstruction", "createElementNode", "createElementRef", "createEnvironmentInjector", @@ -309,7 +309,6 @@ "getFactoryDef", "getFirstLContainer", "getFirstNativeNode", - "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", @@ -324,7 +323,6 @@ "getNextLContainer", "getNodeInjectable", "getNullInjector", - "getOrCreateComponentTView", "getOrCreateEnvironmentInjector", "getOrCreateInjectable", "getOrCreateNodeInjectorForNode", @@ -756,7 +754,6 @@ "internalImportProvidersFrom", "internalProvideZoneChangeDetection", "invokeAllTriggerCleanupFns", - "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "invokeTriggerCleanupFns", "isAngularZoneProperty", 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 0f35ebd2f784..8fa6e2b35f7e 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -99,7 +99,6 @@ "IterableDiffers", "KeyEventsPlugin", "LOCALE_ID2", - "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "NAMESPACE_URIS", @@ -295,6 +294,7 @@ "controlPath", "convertToBitFlags", "createDirectivesInstances", + "createDirectivesInstancesInInstruction", "createElementNode", "createElementRef", "createErrorClass", @@ -372,7 +372,6 @@ "getFactoryOf", "getFirstLContainer", "getFirstNativeNode", - "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", @@ -386,7 +385,6 @@ "getNgZoneOptions", "getNodeInjectable", "getNullInjector", - "getOrCreateComponentTView", "getOrCreateInjectable", "getOrCreateNodeInjectorForNode", "getOrCreateTNode", @@ -444,7 +442,6 @@ "instructionState", "internalImportProvidersFrom", "internalProvideZoneChangeDetection", - "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "isAbstractControlOptions", "isAngularZoneProperty", 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 a61bf78ddd7c..11f33d82d745 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 @@ -92,7 +92,6 @@ "IterableDiffers", "KeyEventsPlugin", "LOCALE_ID2", - "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "NAMESPACE_URIS", @@ -283,6 +282,7 @@ "controlPath", "convertToBitFlags", "createDirectivesInstances", + "createDirectivesInstancesInInstruction", "createElementNode", "createElementRef", "createErrorClass", @@ -358,7 +358,6 @@ "getFactoryOf", "getFirstLContainer", "getFirstNativeNode", - "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", @@ -372,7 +371,6 @@ "getNgZoneOptions", "getNodeInjectable", "getNullInjector", - "getOrCreateComponentTView", "getOrCreateInjectable", "getOrCreateNodeInjectorForNode", "getOrCreateTNode", @@ -431,7 +429,6 @@ "instructionState", "internalImportProvidersFrom", "internalProvideZoneChangeDetection", - "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "isAngularZoneProperty", "isApplicationBootstrapConfig", 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 f267aee51667..f4a3926af840 100644 --- a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json @@ -46,7 +46,6 @@ "Injector", "InputFlags", "LOCALE_ID2", - "LifecycleHooksFeature", "NEW_LINE", "NG_COMP_DEF", "NG_ELEMENT_ID", @@ -246,6 +245,7 @@ "isAngularZoneProperty", "isApplicationBootstrapConfig", "isComponentDef", + "isComponentHost", "isDestroyed", "isEnvironmentProviders", "isFunction", @@ -312,6 +312,7 @@ "setCurrentQueryIndex", "setIncludeViewProviders", "setInjectImplementation", + "setInputsFromAttrs", "setIsRefreshingViews", "setSelectedIndex", "shouldSearchParent", diff --git a/packages/core/test/bundling/hydration/bundle.golden_symbols.json b/packages/core/test/bundling/hydration/bundle.golden_symbols.json index e313ef71e5bc..f83bcb5c9077 100644 --- a/packages/core/test/bundling/hydration/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hydration/bundle.golden_symbols.json @@ -74,7 +74,6 @@ "InputFlags", "KeyEventsPlugin", "LOCALE_ID2", - "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "NAMESPACE_URIS", @@ -420,6 +419,7 @@ "setCurrentTNode", "setIncludeViewProviders", "setInjectImplementation", + "setInputsFromAttrs", "setIsRefreshingViews", "setSegmentHead", "setSelectedIndex", diff --git a/packages/core/test/bundling/router/bundle.golden_symbols.json b/packages/core/test/bundling/router/bundle.golden_symbols.json index 64acc95337d4..7f5e21d9a6d2 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -102,7 +102,6 @@ "LOCALE_ID2", "LQueries_", "LQuery_", - "LifecycleHooksFeature", "ListComponent", "Location", "LocationStrategy", @@ -336,6 +335,7 @@ "createChildrenForEmptyPaths", "createContainerRef", "createContentQuery", + "createDirectivesInstances", "createElementNode", "createElementRef", "createEmptyState", @@ -443,7 +443,6 @@ "getFirstNativeNode", "getIdxOfMatchingSelector", "getInherited", - "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", @@ -457,7 +456,6 @@ "getNgModuleDef", "getNodeInjectable", "getNullInjector", - "getOrCreateComponentTView", "getOrCreateInjectable", "getOrCreateLViewCleanup", "getOrCreateNodeInjectorForNode", @@ -520,7 +518,6 @@ "instructionState", "internalImportProvidersFrom", "internalProvideZoneChangeDetection", - "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "isAngularZoneProperty", "isApplicationBootstrapConfig", 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 0b5b4deb652b..c9453f089949 100644 --- a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json +++ b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json @@ -62,7 +62,6 @@ "InputFlags", "KeyEventsPlugin", "LOCALE_ID2", - "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "NAMESPACE_URIS", @@ -275,6 +274,7 @@ "isAngularZoneProperty", "isApplicationBootstrapConfig", "isComponentDef", + "isComponentHost", "isDestroyed", "isEnvironmentProviders", "isFunction", @@ -347,6 +347,7 @@ "setCurrentTNode", "setIncludeViewProviders", "setInjectImplementation", + "setInputsFromAttrs", "setIsRefreshingViews", "setSelectedIndex", "shimStylesContent", diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index 4fe2dde60069..61562fb15c63 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -69,7 +69,6 @@ "IterableDiffers", "KeyEventsPlugin", "LOCALE_ID2", - "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "NAMESPACE_URIS", @@ -240,6 +239,7 @@ "context", "convertToBitFlags", "createDirectivesInstances", + "createDirectivesInstancesInInstruction", "createElementNode", "createElementRef", "createErrorClass", @@ -301,7 +301,6 @@ "getFactoryDef", "getFirstLContainer", "getFirstNativeNode", - "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", @@ -316,7 +315,6 @@ "getNgZoneOptions", "getNodeInjectable", "getNullInjector", - "getOrCreateComponentTView", "getOrCreateInjectable", "getOrCreateNodeInjectorForNode", "getOrCreateTNode", @@ -365,7 +363,6 @@ "instructionState", "internalImportProvidersFrom", "internalProvideZoneChangeDetection", - "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "isAngularZoneProperty", "isApplicationBootstrapConfig", From 6c96d795bca057f2818203c697b7d504336d593b Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Wed, 22 Jan 2025 11:45:18 +0100 Subject: [PATCH 0149/1220] Revert "refactor(core): reuse directive instantiate logic (#59633)" (#59659) This reverts commit c089d21eb086d5d86f97d38139fdb63f76e477b0. PR Close #59659 --- packages/core/src/render3/component_ref.ts | 187 ++++++++++++++---- .../core/src/render3/instructions/element.ts | 8 +- .../render3/instructions/element_container.ts | 8 +- .../core/src/render3/instructions/shared.ts | 35 ++-- .../core/src/render3/instructions/template.ts | 4 +- .../bundle.golden_symbols.json | 6 +- .../animations/bundle.golden_symbols.json | 6 +- .../cyclic_import/bundle.golden_symbols.json | 6 +- .../bundling/defer/bundle.golden_symbols.json | 5 +- .../forms_reactive/bundle.golden_symbols.json | 5 +- .../bundle.golden_symbols.json | 5 +- .../hello_world/bundle.golden_symbols.json | 3 +- .../hydration/bundle.golden_symbols.json | 2 +- .../router/bundle.golden_symbols.json | 5 +- .../bundle.golden_symbols.json | 3 +- .../bundling/todo/bundle.golden_symbols.json | 5 +- 16 files changed, 205 insertions(+), 88 deletions(-) diff --git a/packages/core/src/render3/component_ref.ts b/packages/core/src/render3/component_ref.ts index 454f1a239e19..dac2e1c2af18 100644 --- a/packages/core/src/render3/component_ref.ts +++ b/packages/core/src/render3/component_ref.ts @@ -28,22 +28,25 @@ 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 {assertDefined, assertGreaterThan, assertIndexInRange} from '../util/assert'; import {assertComponentType, assertNoDuplicateDirectives} from './assert'; import {attachPatchData} from './context_discovery'; import {getComponentDef} from './def_getters'; import {depsTracker} from './deps_tracker/deps_tracker'; -import {NodeInjector} from './di'; +import {getNodeInjectable, 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, + addToEndOfViewTree, createLView, createTView, + getInitialLViewFlagsFromDef, + getOrCreateComponentTView, initializeDirectives, + invokeDirectivesHostBindings, locateHostElement, markAsComponentHost, setInputsForProperty, @@ -59,10 +62,11 @@ import { TNode, TNodeType, } from './interfaces/node'; -import {RNode} from './interfaces/renderer_dom'; +import {RElement, RNode} from './interfaces/renderer_dom'; import { CONTEXT, HEADER_OFFSET, + INJECTOR, LView, LViewEnvironment, LViewFlags, @@ -71,25 +75,25 @@ import { } from './interfaces/view'; import {MATH_ML_NAMESPACE, SVG_NAMESPACE} from './namespaces'; -import {ChainedInjector} from './chained_injector'; import {createElementNode, setupStaticAttributes} from './dom_node_manipulation'; -import {AttributeMarker} from './interfaces/attribute_marker'; -import {unregisterLView} from './interfaces/lview_tracking'; -import {CssSelector} from './interfaces/projection'; import { extractAttrsAndClassesFromSelector, stringifyCSSSelectorList, } from './node_selector_matcher'; -import {profiler} from './profiler'; -import {ProfilerEvent} from './profiler_types'; -import {executeContentQueries} from './queries/query_execution'; import {enterView, getCurrentTNode, getLView, 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 {getComponentLViewByIndex, getNativeByTNode, getTNode} from './util/view_utils'; import {ViewRef} from './view_ref'; +import {ChainedInjector} from './chained_injector'; +import {unregisterLView} from './interfaces/lview_tracking'; +import {profiler} from './profiler'; +import {ProfilerEvent} from './profiler_types'; +import {executeContentQueries} from './queries/query_execution'; +import {AttributeMarker} from './interfaces/attribute_marker'; +import {CssSelector} from './interfaces/projection'; +import {getOrCreateTNode} from './tnode_manipulation'; export class ComponentFactoryResolver extends AbstractComponentFactoryResolver { /** @@ -324,7 +328,7 @@ export class ComponentFactory extends AbstractComponentFactory { null, null, ); - const rootLView = createLView( + const rootLView = createLView( null, rootTView, null, @@ -347,10 +351,10 @@ export class ComponentFactory extends AbstractComponentFactory { // issues would allow us to drop this. enterView(rootLView); + let component: T; let componentView: LView | null = null; try { - // TODO(pk): this is a good refactoring since it shows how to instantiate a TNOde with a set of known directive defs const rootComponentDef = this.componentDef; let rootDirectives: DirectiveDef[]; let hostDirectiveDefs: HostDirectiveDefs | null = null; @@ -384,18 +388,6 @@ export class ComponentFactory extends AbstractComponentFactory { tAttributes, ); - // TODO(pk): partial code duplication with resolveDirectives and other existing logic - markAsComponentHost(rootTView, hostTNode, rootDirectives.length - 1); - initializeDirectives( - rootTView, - rootLView, - hostTNode, - rootDirectives, - null, - hostDirectiveDefs, - ); - registerPostOrderHooks(rootTView, hostTNode); - for (const def of rootDirectives) { hostTNode.mergedAttrs = mergeHostAttrs(hostTNode.mergedAttrs, def.hostAttrs); } @@ -408,22 +400,31 @@ export class ComponentFactory extends AbstractComponentFactory { // tests so that this check can be removed. if (hostRNode) { setupStaticAttributes(hostRenderer, hostRNode, hostTNode); - attachPatchData(hostRNode, rootLView); } + componentView = createRootComponentView( + hostTNode, + hostRNode, + rootComponentDef, + rootDirectives, + rootLView, + environment, + ); + if (projectableNodes !== undefined) { projectNodes(hostTNode, this.ngContentSelectors, projectableNodes); } - // TODO(pk): this logic is similar to the instruction code where a node can have directives - createDirectivesInstances(rootTView, rootLView, hostTNode); - executeContentQueries(rootTView, hostTNode, rootLView); - - componentView = getComponentLViewByIndex(hostTNode.index, rootLView); - - // TODO(pk): why do we need this logic? - rootLView[CONTEXT] = componentView[CONTEXT] as T; - + // TODO: should LifecycleHooksFeature and other host features be generated by the compiler + // and executed here? Angular 5 reference: https://stackblitz.com/edit/lifecycle-hooks-vcref + component = createRootComponent( + componentView, + rootComponentDef, + rootDirectives, + hostDirectiveDefs, + rootLView, + [LifecycleHooksFeature], + ); renderView(rootTView, rootLView, null); } catch (e) { // Stop tracking the views if creation failed since @@ -441,7 +442,7 @@ export class ComponentFactory extends AbstractComponentFactory { const hostTNode = getTNode(rootTView, HEADER_OFFSET) as TElementNode; return new ComponentRef( this.componentType, - componentView[CONTEXT] as T, + component, createElementRef(hostTNode, rootLView), rootLView, hostTNode, @@ -526,10 +527,118 @@ export class ComponentRef extends AbstractComponentRef { } } -// TODO: remove? /** Represents a HostFeature function. */ type HostFeature = (component: T, componentDef: ComponentDef) => void; +/** + * Creates the root component view and the root component node. + * + * @param hostRNode Render host element. + * @param rootComponentDef ComponentDef + * @param rootView The parent view where the host node is stored + * @param rendererFactory Factory to be used for creating child renderers. + * @param hostRenderer The current renderer + * @param sanitizer The sanitizer, if provided + * + * @returns Component view created + */ +function createRootComponentView( + tNode: TElementNode, + hostRNode: RElement | null, + rootComponentDef: ComponentDef, + rootDirectives: DirectiveDef[], + rootView: LView, + environment: LViewEnvironment, +): LView { + const tView = rootView[TVIEW]; + + // Hydration info is on the host element and needs to be retrieved + // and passed to the component LView. + let hydrationInfo: DehydratedView | null = null; + if (hostRNode !== null) { + hydrationInfo = retrieveHydrationInfo(hostRNode, rootView[INJECTOR]); + } + const viewRenderer = environment.rendererFactory.createRenderer(hostRNode, rootComponentDef); + const componentView = createLView( + rootView, + getOrCreateComponentTView(rootComponentDef), + null, + getInitialLViewFlagsFromDef(rootComponentDef), + rootView[tNode.index], + tNode, + environment, + viewRenderer, + null, + null, + hydrationInfo, + ); + + if (tView.firstCreatePass) { + markAsComponentHost(tView, tNode, rootDirectives.length - 1); + } + + addToEndOfViewTree(rootView, componentView); + + // Store component view at node index, with node as the HOST + return (rootView[tNode.index] = componentView); +} + +/** + * Creates a root component and sets it up with features and host bindings.Shared by + * renderComponent() and ViewContainerRef.createComponent(). + */ +function createRootComponent( + componentView: LView, + rootComponentDef: ComponentDef, + rootDirectives: DirectiveDef[], + hostDirectiveDefs: HostDirectiveDefs | null, + rootLView: LView, + hostFeatures: HostFeature[] | null, +): any { + const rootTNode = getCurrentTNode() as TElementNode; + ngDevMode && assertDefined(rootTNode, 'tNode should have been already created'); + const tView = rootLView[TVIEW]; + const native = getNativeByTNode(rootTNode, rootLView); + + initializeDirectives(tView, rootLView, rootTNode, rootDirectives, null, hostDirectiveDefs); + + for (let i = 0; i < rootDirectives.length; i++) { + const directiveIndex = rootTNode.directiveStart + i; + const directiveInstance = getNodeInjectable(rootLView, tView, directiveIndex, rootTNode); + attachPatchData(directiveInstance, rootLView); + } + + invokeDirectivesHostBindings(tView, rootLView, rootTNode); + + if (native) { + attachPatchData(native, rootLView); + } + + // We're guaranteed for the `componentOffset` to be positive here + // since a root component always matches a component def. + ngDevMode && + assertGreaterThan(rootTNode.componentOffset, -1, 'componentOffset must be great than -1'); + const component = getNodeInjectable( + rootLView, + tView, + rootTNode.directiveStart + rootTNode.componentOffset, + rootTNode, + ); + componentView[CONTEXT] = rootLView[CONTEXT] = component; + + if (hostFeatures !== null) { + for (const feature of hostFeatures) { + feature(component, rootComponentDef); + } + } + + // We want to generate an empty QueryList for root content queries for backwards + // compatibility with ViewEngine. + executeContentQueries(tView, rootTNode, rootLView); + + return component; +} + /** Projects the `projectableNodes` that were specified when creating a root component. */ function projectNodes( tNode: TElementNode, diff --git a/packages/core/src/render3/instructions/element.ts b/packages/core/src/render3/instructions/element.ts index 62d4ff553da0..c9a186d489de 100644 --- a/packages/core/src/render3/instructions/element.ts +++ b/packages/core/src/render3/instructions/element.ts @@ -72,11 +72,7 @@ import {getConstant} from '../util/view_utils'; import {validateElementIsKnown} from './element_validation'; import {setDirectiveInputsWhichShadowsStyling} from './property'; -import { - createDirectivesInstancesInInstruction, - resolveDirectives, - saveResolvedLocalsInData, -} from './shared'; +import {createDirectivesInstances, resolveDirectives, saveResolvedLocalsInData} from './shared'; import {getOrCreateTNode} from '../tnode_manipulation'; function elementStartFirstCreatePass( @@ -176,7 +172,7 @@ export function ɵɵelementStart( 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 e1791e37b0bb..3eef61a7d460 100644 --- a/packages/core/src/render3/instructions/element_container.ts +++ b/packages/core/src/render3/instructions/element_container.ts @@ -41,11 +41,7 @@ import { import {computeStaticStyling} from '../styling/static_styling'; import {getConstant} from '../util/view_utils'; -import { - createDirectivesInstancesInInstruction, - resolveDirectives, - saveResolvedLocalsInData, -} from './shared'; +import {createDirectivesInstances, resolveDirectives, saveResolvedLocalsInData} from './shared'; import {getOrCreateTNode} from '../tnode_manipulation'; function elementContainerStartFirstCreatePass( @@ -123,7 +119,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 c3fbd181620c..34c19f4c4b88 100644 --- a/packages/core/src/render3/instructions/shared.ts +++ b/packages/core/src/render3/instructions/shared.ts @@ -269,24 +269,12 @@ 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. */ export function createDirectivesInstances(tView: TView, lView: LView, tNode: TDirectiveHostNode) { - instantiateAllDirectives(tView, lView, tNode); + if (!getBindingsEnabled()) return; + instantiateAllDirectives(tView, lView, tNode, getNativeByTNode(tNode, lView)); if ((tNode.flags & TNodeFlags.hasHostBindings) === TNodeFlags.hasHostBindings) { invokeDirectivesHostBindings(tView, lView, tNode); } @@ -1004,7 +992,12 @@ function lastSelectedElementIdx(hostBindingOpCodes: HostBindingOpCodes): number /** * Instantiate all the directives that were previously resolved on the current node. */ -function instantiateAllDirectives(tView: TView, lView: LView, tNode: TDirectiveHostNode) { +function instantiateAllDirectives( + tView: TView, + lView: LView, + tNode: TDirectiveHostNode, + native: RNode, +) { const start = tNode.directiveStart; const end = tNode.directiveEnd; @@ -1012,7 +1005,7 @@ function instantiateAllDirectives(tView: TView, lView: LView, tNode: TDirectiveH // since it is used to inject some special symbols like `ChangeDetectorRef`. if (isComponentHost(tNode)) { ngDevMode && assertTNodeType(tNode, TNodeType.AnyRNode); - createComponentLView( + addComponentLogic( lView, tNode as TElementNode, tView.data[start + tNode.componentOffset] as ComponentDef, @@ -1023,6 +1016,8 @@ function instantiateAllDirectives(tView: TView, lView: LView, tNode: TDirectiveH getOrCreateNodeInjectorForNode(tNode, lView); } + attachPatchData(native, lView); + const initialInputs = tNode.initialInputs; for (let i = start; i < end; i++) { const def = tView.data[i] as DirectiveDef; @@ -1279,11 +1274,7 @@ export function getInitialLViewFlagsFromDef(def: ComponentDef): LViewFl return flags; } -export function createComponentLView( - lView: LView, - hostTNode: TElementNode, - def: ComponentDef, -): LView { +function addComponentLogic(lView: LView, hostTNode: TElementNode, def: ComponentDef): void { const native = getNativeByTNode(hostTNode, lView) as RElement; const tView = getOrCreateComponentTView(def); @@ -1309,7 +1300,7 @@ export function createComponentLView( // 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); + lView[hostTNode.index] = componentView; } export function elementAttributeInternal( diff --git a/packages/core/src/render3/instructions/template.ts b/packages/core/src/render3/instructions/template.ts index d012ade569c6..05b209f3e76f 100644 --- a/packages/core/src/render3/instructions/template.ts +++ b/packages/core/src/render3/instructions/template.ts @@ -39,7 +39,7 @@ import {getConstant} from '../util/view_utils'; import { addToEndOfViewTree, - createDirectivesInstancesInInstruction, + createDirectivesInstances, createLContainer, createTView, resolveDirectives, @@ -154,7 +154,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 2c3d7c96fef0..eeaca8775b63 100644 --- a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json @@ -92,6 +92,7 @@ "KeyEventsPlugin", "LEAVE_TOKEN_REGEX", "LOCALE_ID2", + "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "NAMESPACE_URIS", @@ -200,6 +201,7 @@ "activeConsumer", "addClass", "addPropertyBinding", + "addToEndOfViewTree", "allocExpando", "allocLFrame", "angularZoneInstanceIdProperty", @@ -247,7 +249,6 @@ "context", "convertToBitFlags", "copyAnimationEvent", - "createDirectivesInstances", "createElementNode", "createElementRef", "createErrorClass", @@ -306,6 +307,7 @@ "getDirectiveDef", "getFactoryDef", "getFirstLContainer", + "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", @@ -317,6 +319,7 @@ "getNextLContainer", "getNodeInjectable", "getNullInjector", + "getOrCreateComponentTView", "getOrCreateInjectable", "getOrCreateNodeInjectorForNode", "getOrCreateTNode", @@ -356,6 +359,7 @@ "internalProvideZoneChangeDetection", "interpolateParams", "invalidTimingValue", + "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "invokeQuery", "isAngularZoneProperty", diff --git a/packages/core/test/bundling/animations/bundle.golden_symbols.json b/packages/core/test/bundling/animations/bundle.golden_symbols.json index 8939ba2f4ade..acbb5dddadc2 100644 --- a/packages/core/test/bundling/animations/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations/bundle.golden_symbols.json @@ -98,6 +98,7 @@ "KeyEventsPlugin", "LEAVE_TOKEN_REGEX", "LOCALE_ID2", + "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "NAMESPACE_URIS", @@ -219,6 +220,7 @@ "activeConsumer", "addClass", "addPropertyBinding", + "addToEndOfViewTree", "allocExpando", "allocLFrame", "angularZoneInstanceIdProperty", @@ -266,7 +268,6 @@ "context", "convertToBitFlags", "copyAnimationEvent", - "createDirectivesInstances", "createElementNode", "createElementRef", "createErrorClass", @@ -327,6 +328,7 @@ "getDirectiveDef", "getFactoryDef", "getFirstLContainer", + "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", @@ -339,6 +341,7 @@ "getNgZoneOptions", "getNodeInjectable", "getNullInjector", + "getOrCreateComponentTView", "getOrCreateInjectable", "getOrCreateNodeInjectorForNode", "getOrCreateTNode", @@ -379,6 +382,7 @@ "internalProvideZoneChangeDetection", "interpolateParams", "invalidTimingValue", + "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "invokeQuery", "isAngularZoneProperty", 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 64603b671133..84033396a41f 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -66,6 +66,7 @@ "InputFlags", "KeyEventsPlugin", "LOCALE_ID2", + "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "Module", @@ -165,6 +166,7 @@ "_wasLastNodeCreated", "activeConsumer", "addPropertyBinding", + "addToEndOfViewTree", "allocExpando", "allocLFrame", "angularZoneInstanceIdProperty", @@ -201,7 +203,6 @@ "consumerPollProducersForChange", "context", "convertToBitFlags", - "createDirectivesInstances", "createElementNode", "createElementRef", "createErrorClass", @@ -255,6 +256,7 @@ "getDirectiveDef", "getFactoryDef", "getFirstLContainer", + "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", @@ -267,6 +269,7 @@ "getNgZoneOptions", "getNodeInjectable", "getNullInjector", + "getOrCreateComponentTView", "getOrCreateInjectable", "getOrCreateNodeInjectorForNode", "getOrCreateTNode", @@ -302,6 +305,7 @@ "instructionState", "internalImportProvidersFrom", "internalProvideZoneChangeDetection", + "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "isAngularZoneProperty", "isApplicationBootstrapConfig", diff --git a/packages/core/test/bundling/defer/bundle.golden_symbols.json b/packages/core/test/bundling/defer/bundle.golden_symbols.json index a9f2d40a045c..29419f5b756c 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -87,6 +87,7 @@ "KeyEventsPlugin", "LOADING_AFTER_SLOT", "LOCALE_ID2", + "LifecycleHooksFeature", "MATH_ML_NAMESPACE", "MAXIMUM_REFRESH_RERUNS", "MINIMUM_SLOT", @@ -246,7 +247,6 @@ "convertToBitFlags", "createContainerAnchorImpl", "createDirectivesInstances", - "createDirectivesInstancesInInstruction", "createElementNode", "createElementRef", "createEnvironmentInjector", @@ -309,6 +309,7 @@ "getFactoryDef", "getFirstLContainer", "getFirstNativeNode", + "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", @@ -323,6 +324,7 @@ "getNextLContainer", "getNodeInjectable", "getNullInjector", + "getOrCreateComponentTView", "getOrCreateEnvironmentInjector", "getOrCreateInjectable", "getOrCreateNodeInjectorForNode", @@ -754,6 +756,7 @@ "internalImportProvidersFrom", "internalProvideZoneChangeDetection", "invokeAllTriggerCleanupFns", + "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "invokeTriggerCleanupFns", "isAngularZoneProperty", 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 8fa6e2b35f7e..0f35ebd2f784 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -99,6 +99,7 @@ "IterableDiffers", "KeyEventsPlugin", "LOCALE_ID2", + "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "NAMESPACE_URIS", @@ -294,7 +295,6 @@ "controlPath", "convertToBitFlags", "createDirectivesInstances", - "createDirectivesInstancesInInstruction", "createElementNode", "createElementRef", "createErrorClass", @@ -372,6 +372,7 @@ "getFactoryOf", "getFirstLContainer", "getFirstNativeNode", + "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", @@ -385,6 +386,7 @@ "getNgZoneOptions", "getNodeInjectable", "getNullInjector", + "getOrCreateComponentTView", "getOrCreateInjectable", "getOrCreateNodeInjectorForNode", "getOrCreateTNode", @@ -442,6 +444,7 @@ "instructionState", "internalImportProvidersFrom", "internalProvideZoneChangeDetection", + "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "isAbstractControlOptions", "isAngularZoneProperty", 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 11f33d82d745..a61bf78ddd7c 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 @@ -92,6 +92,7 @@ "IterableDiffers", "KeyEventsPlugin", "LOCALE_ID2", + "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "NAMESPACE_URIS", @@ -282,7 +283,6 @@ "controlPath", "convertToBitFlags", "createDirectivesInstances", - "createDirectivesInstancesInInstruction", "createElementNode", "createElementRef", "createErrorClass", @@ -358,6 +358,7 @@ "getFactoryOf", "getFirstLContainer", "getFirstNativeNode", + "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", @@ -371,6 +372,7 @@ "getNgZoneOptions", "getNodeInjectable", "getNullInjector", + "getOrCreateComponentTView", "getOrCreateInjectable", "getOrCreateNodeInjectorForNode", "getOrCreateTNode", @@ -429,6 +431,7 @@ "instructionState", "internalImportProvidersFrom", "internalProvideZoneChangeDetection", + "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "isAngularZoneProperty", "isApplicationBootstrapConfig", 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 f4a3926af840..f267aee51667 100644 --- a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json @@ -46,6 +46,7 @@ "Injector", "InputFlags", "LOCALE_ID2", + "LifecycleHooksFeature", "NEW_LINE", "NG_COMP_DEF", "NG_ELEMENT_ID", @@ -245,7 +246,6 @@ "isAngularZoneProperty", "isApplicationBootstrapConfig", "isComponentDef", - "isComponentHost", "isDestroyed", "isEnvironmentProviders", "isFunction", @@ -312,7 +312,6 @@ "setCurrentQueryIndex", "setIncludeViewProviders", "setInjectImplementation", - "setInputsFromAttrs", "setIsRefreshingViews", "setSelectedIndex", "shouldSearchParent", diff --git a/packages/core/test/bundling/hydration/bundle.golden_symbols.json b/packages/core/test/bundling/hydration/bundle.golden_symbols.json index f83bcb5c9077..e313ef71e5bc 100644 --- a/packages/core/test/bundling/hydration/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hydration/bundle.golden_symbols.json @@ -74,6 +74,7 @@ "InputFlags", "KeyEventsPlugin", "LOCALE_ID2", + "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "NAMESPACE_URIS", @@ -419,7 +420,6 @@ "setCurrentTNode", "setIncludeViewProviders", "setInjectImplementation", - "setInputsFromAttrs", "setIsRefreshingViews", "setSegmentHead", "setSelectedIndex", diff --git a/packages/core/test/bundling/router/bundle.golden_symbols.json b/packages/core/test/bundling/router/bundle.golden_symbols.json index 7f5e21d9a6d2..64acc95337d4 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -102,6 +102,7 @@ "LOCALE_ID2", "LQueries_", "LQuery_", + "LifecycleHooksFeature", "ListComponent", "Location", "LocationStrategy", @@ -335,7 +336,6 @@ "createChildrenForEmptyPaths", "createContainerRef", "createContentQuery", - "createDirectivesInstances", "createElementNode", "createElementRef", "createEmptyState", @@ -443,6 +443,7 @@ "getFirstNativeNode", "getIdxOfMatchingSelector", "getInherited", + "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", @@ -456,6 +457,7 @@ "getNgModuleDef", "getNodeInjectable", "getNullInjector", + "getOrCreateComponentTView", "getOrCreateInjectable", "getOrCreateLViewCleanup", "getOrCreateNodeInjectorForNode", @@ -518,6 +520,7 @@ "instructionState", "internalImportProvidersFrom", "internalProvideZoneChangeDetection", + "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "isAngularZoneProperty", "isApplicationBootstrapConfig", 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 c9453f089949..0b5b4deb652b 100644 --- a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json +++ b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json @@ -62,6 +62,7 @@ "InputFlags", "KeyEventsPlugin", "LOCALE_ID2", + "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "NAMESPACE_URIS", @@ -274,7 +275,6 @@ "isAngularZoneProperty", "isApplicationBootstrapConfig", "isComponentDef", - "isComponentHost", "isDestroyed", "isEnvironmentProviders", "isFunction", @@ -347,7 +347,6 @@ "setCurrentTNode", "setIncludeViewProviders", "setInjectImplementation", - "setInputsFromAttrs", "setIsRefreshingViews", "setSelectedIndex", "shimStylesContent", diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index 61562fb15c63..4fe2dde60069 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -69,6 +69,7 @@ "IterableDiffers", "KeyEventsPlugin", "LOCALE_ID2", + "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "NAMESPACE_URIS", @@ -239,7 +240,6 @@ "context", "convertToBitFlags", "createDirectivesInstances", - "createDirectivesInstancesInInstruction", "createElementNode", "createElementRef", "createErrorClass", @@ -301,6 +301,7 @@ "getFactoryDef", "getFirstLContainer", "getFirstNativeNode", + "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", @@ -315,6 +316,7 @@ "getNgZoneOptions", "getNodeInjectable", "getNullInjector", + "getOrCreateComponentTView", "getOrCreateInjectable", "getOrCreateNodeInjectorForNode", "getOrCreateTNode", @@ -363,6 +365,7 @@ "instructionState", "internalImportProvidersFrom", "internalProvideZoneChangeDetection", + "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "isAngularZoneProperty", "isApplicationBootstrapConfig", From d66881d1727bfa1470d2a7681b2481b99980f16e Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Wed, 22 Jan 2025 10:55:25 +0100 Subject: [PATCH 0150/1220] fix(migrations): avoid applying the same replacements twice when cleaning up unused imports (#59656) If a file ends up in multiple programs, the unused imports migration was counting it twice. This was fine since the string replacements were handling it correctly, but it was printing out incorrect data. These changes rework the migration to de-duplicate the replacements and produce the data from the de-duplicated results. PR Close #59656 --- .../unused_imports_migration.ts | 80 ++++++++++++++----- .../cleanup_unused_imports_migration_spec.ts | 10 +++ 2 files changed, 70 insertions(+), 20 deletions(-) diff --git a/packages/core/schematics/ng-generate/cleanup-unused-imports/unused_imports_migration.ts b/packages/core/schematics/ng-generate/cleanup-unused-imports/unused_imports_migration.ts index 4933965f9525..924ed5380bec 100644 --- a/packages/core/schematics/ng-generate/cleanup-unused-imports/unused_imports_migration.ts +++ b/packages/core/schematics/ng-generate/cleanup-unused-imports/unused_imports_migration.ts @@ -13,6 +13,7 @@ import { MigrationStats, ProgramInfo, projectFile, + ProjectFileID, Replacement, Serializable, TextUpdate, @@ -28,8 +29,8 @@ export interface CompilationUnitData { /** Text changes that should be performed. */ replacements: Replacement[]; - /** Total number of imports that were removed. */ - removedImports: number; + /** Identifiers that have been removed from each file. */ + removedIdentifiers: NodeID[]; /** Total number of files that were changed. */ changedFiles: number; @@ -44,7 +45,7 @@ interface RemovalLocations { partialRemovals: Map>; /** Text of all identifiers that have been removed. */ - allRemovedIdentifiers: Set; + allRemovedIdentifiers: Set; } /** Tracks how identifiers are used across a single file. */ @@ -60,6 +61,9 @@ interface UsageAnalysis { identifierCounts: Map; } +/** ID of a node based on its location. */ +type NodeID = string & {__nodeID: true}; + /** Migration that cleans up unused imports from a project. */ export class UnusedImportsMigration extends TsurgeFunnelMigration< CompilationUnitData, @@ -81,7 +85,7 @@ export class UnusedImportsMigration extends TsurgeFunnelMigration< override async analyze(info: ProgramInfo): Promise> { const nodePositions = new Map>(); const replacements: Replacement[] = []; - let removedImports = 0; + const removedIdentifiers: NodeID[] = []; let changedFiles = 0; info.ngCompiler?.getDiagnostics().forEach((diag) => { @@ -94,7 +98,7 @@ export class UnusedImportsMigration extends TsurgeFunnelMigration< if (!nodePositions.has(diag.file)) { nodePositions.set(diag.file, new Set()); } - nodePositions.get(diag.file)!.add(this.getNodeKey(diag.start, diag.length)); + nodePositions.get(diag.file)!.add(this.getNodeID(diag.start, diag.length)); } }); @@ -103,14 +107,15 @@ export class UnusedImportsMigration extends TsurgeFunnelMigration< const usageAnalysis = this.analyzeUsages(sourceFile, resolvedLocations); if (resolvedLocations.allRemovedIdentifiers.size > 0) { - removedImports += resolvedLocations.allRemovedIdentifiers.size; changedFiles++; + resolvedLocations.allRemovedIdentifiers.forEach((identifier) => { + removedIdentifiers.push(this.getNodeID(identifier.getStart(), identifier.getWidth())); + }); } - this.generateReplacements(sourceFile, resolvedLocations, usageAnalysis, info, replacements); }); - return confirmAsSerializable({replacements, removedImports, changedFiles}); + return confirmAsSerializable({replacements, removedIdentifiers, changedFiles}); } override async migrate(globalData: CompilationUnitData) { @@ -121,10 +126,34 @@ export class UnusedImportsMigration extends TsurgeFunnelMigration< unitA: CompilationUnitData, unitB: CompilationUnitData, ): Promise> { + const combinedReplacements: Replacement[] = []; + const combinedRemovedIdentifiers: NodeID[] = []; + const seenReplacements = new Set(); + const seenIdentifiers = new Set(); + const changedFileIds = new Set(); + + [unitA, unitB].forEach((unit) => { + for (const replacement of unit.replacements) { + const key = this.getReplacementID(replacement); + changedFileIds.add(replacement.projectFile.id); + if (!seenReplacements.has(key)) { + seenReplacements.add(key); + combinedReplacements.push(replacement); + } + } + + for (const identifier of unit.removedIdentifiers) { + if (!seenIdentifiers.has(identifier)) { + seenIdentifiers.add(identifier); + combinedRemovedIdentifiers.push(identifier); + } + } + }); + return confirmAsSerializable({ - replacements: [...unitA.replacements, ...unitB.replacements], - removedImports: unitA.removedImports + unitB.removedImports, - changedFiles: unitA.changedFiles + unitB.changedFiles, + replacements: combinedReplacements, + removedIdentifiers: combinedRemovedIdentifiers, + changedFiles: changedFileIds.size, }); } @@ -137,15 +166,21 @@ export class UnusedImportsMigration extends TsurgeFunnelMigration< override async stats(globalMetadata: CompilationUnitData): Promise { return { counters: { - removedImports: globalMetadata.removedImports, + removedImports: globalMetadata.removedIdentifiers.length, changedFiles: globalMetadata.changedFiles, }, }; } - /** Gets a key that can be used to look up a node based on its location. */ - private getNodeKey(start: number, length: number): string { - return `${start}/${length}`; + /** Gets an ID that can be used to look up a node based on its location. */ + private getNodeID(start: number, length: number): NodeID { + return `${start}/${length}` as NodeID; + } + + /** Gets a unique ID for a replacement. */ + private getReplacementID(replacement: Replacement): string { + const {position, end, toInsert} = replacement.update.data; + return replacement.projectFile.id + '/' + position + '/' + end + '/' + toInsert; } /** @@ -176,7 +211,7 @@ export class UnusedImportsMigration extends TsurgeFunnelMigration< return; } - if (locations.has(this.getNodeKey(node.getStart(), node.getWidth()))) { + if (locations.has(this.getNodeID(node.getStart(), node.getWidth()))) { // When the entire array needs to be cleared, the diagnostic is // reported on the property assignment, rather than an array element. if ( @@ -187,7 +222,7 @@ export class UnusedImportsMigration extends TsurgeFunnelMigration< result.fullRemovals.add(parent.initializer); parent.initializer.elements.forEach((element) => { if (ts.isIdentifier(element)) { - result.allRemovedIdentifiers.add(element.text); + result.allRemovedIdentifiers.add(element); } }); } else if (ts.isArrayLiteralExpression(parent)) { @@ -195,7 +230,7 @@ export class UnusedImportsMigration extends TsurgeFunnelMigration< result.partialRemovals.set(parent, new Set()); } result.partialRemovals.get(parent)!.add(node); - result.allRemovedIdentifiers.add(node.text); + result.allRemovedIdentifiers.add(node); } } }; @@ -326,8 +361,13 @@ export class UnusedImportsMigration extends TsurgeFunnelMigration< names.forEach((symbolName, localName) => { // Note that in the `identifierCounts` lookup both zero and undefined // are valid and mean that the identifiers isn't being used anymore. - if (allRemovedIdentifiers.has(localName) && !identifierCounts.get(localName)) { - importManager.removeImport(sourceFile, symbolName, moduleName); + if (!identifierCounts.get(localName)) { + for (const identifier of allRemovedIdentifiers) { + if (identifier.text === localName) { + importManager.removeImport(sourceFile, symbolName, moduleName); + break; + } + } } }); }); diff --git a/packages/core/schematics/test/cleanup_unused_imports_migration_spec.ts b/packages/core/schematics/test/cleanup_unused_imports_migration_spec.ts index 0ac3649c7cf8..f94c83120648 100644 --- a/packages/core/schematics/test/cleanup_unused_imports_migration_spec.ts +++ b/packages/core/schematics/test/cleanup_unused_imports_migration_spec.ts @@ -19,6 +19,7 @@ describe('cleanup unused imports schematic', () => { let tree: UnitTestTree; let tmpDirPath: string; let previousWorkingDir: string; + let logs: string[]; function writeFile(filePath: string, contents: string) { host.sync.write(normalize(filePath), virtualFs.stringToFileBuffer(contents)); @@ -36,6 +37,7 @@ describe('cleanup unused imports schematic', () => { runner = new SchematicTestRunner('test', runfiles.resolvePackageRelative('../collection.json')); host = new TempScopedNodeJsSyncHost(); tree = new UnitTestTree(new HostTree(host)); + logs = []; writeFile('/tsconfig.json', '{}'); writeFile( @@ -48,6 +50,7 @@ describe('cleanup unused imports schematic', () => { previousWorkingDir = shx.pwd(); tmpDirPath = getSystemPath(host.root); + runner.logger.subscribe((log) => logs.push(log.message)); // Switch into the temporary directory path. This allows us to run // the schematic against our custom unit test tree. @@ -92,6 +95,7 @@ describe('cleanup unused imports schematic', () => { await runMigration(); + expect(logs.pop()).toBe('Removed 2 imports in 1 file'); expect(stripWhitespace(tree.readContent('comp.ts'))).toBe( stripWhitespace(` import {Component} from '@angular/core'; @@ -123,6 +127,7 @@ describe('cleanup unused imports schematic', () => { await runMigration(); + expect(logs.pop()).toBe('Removed 3 imports in 1 file'); expect(stripWhitespace(tree.readContent('comp.ts'))).toBe( stripWhitespace(` import {Component} from '@angular/core'; @@ -153,6 +158,7 @@ describe('cleanup unused imports schematic', () => { await runMigration(); + expect(logs.pop()).toBe('Removed 2 imports in 1 file'); expect(stripWhitespace(tree.readContent('comp.ts'))).toBe( stripWhitespace(` import {Component} from '@angular/core'; @@ -190,6 +196,7 @@ describe('cleanup unused imports schematic', () => { await runMigration(); + expect(logs.pop()).toBe('Removed 1 import in 1 file'); expect(stripWhitespace(tree.readContent('comp.ts'))).toBe( stripWhitespace(` import {Component} from '@angular/core'; @@ -226,6 +233,7 @@ describe('cleanup unused imports schematic', () => { await runMigration(); + expect(logs.pop()).toBe('Schematic could not find unused imports in the project'); expect(tree.readContent('comp.ts')).toBe(initialContent); }); @@ -242,6 +250,7 @@ describe('cleanup unused imports schematic', () => { await runMigration(); + expect(logs.pop()).toBe('Schematic could not find unused imports in the project'); expect(tree.readContent('comp.ts')).toBe(initialContent); }); @@ -274,6 +283,7 @@ describe('cleanup unused imports schematic', () => { await runMigration(); + expect(logs.pop()).toBe('Removed 2 imports in 1 file'); expect(stripWhitespace(tree.readContent('comp.ts'))).toBe( stripWhitespace(` import {Component} from '@angular/core'; From 61302cb4b6209fda2160c2653f0351d9553219bb Mon Sep 17 00:00:00 2001 From: Jens Kuehlers Date: Wed, 22 Jan 2025 12:41:39 +0000 Subject: [PATCH 0151/1220] docs: add Bluesky links (#59661) PR Close #59661 --- README.md | 2 ++ adev/src/app/core/constants/links.ts | 1 + .../core/layout/footer/footer.component.html | 3 +++ .../core/layout/footer/footer.component.ts | 3 ++- .../navigation/navigation.component.html | 21 +++++++++++++++++++ .../layout/navigation/navigation.component.ts | 3 ++- 6 files changed, 31 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5bbc1ee6eab6..611304a9d5cf 100644 --- a/README.md +++ b/README.md @@ -125,6 +125,7 @@ Help us keep Angular open and inclusive. Please read and follow our [Code of Con Join the conversation and help the community. - [X (formerly Twitter)][X (formerly Twitter)] +- [Bluesky][bluesky] - [Discord][discord] - [Gitter][gitter] - [YouTube][youtube] @@ -154,6 +155,7 @@ Join the conversation and help the community. [npm]: https://www.npmjs.com/get-npm [codeofconduct]: CODE_OF_CONDUCT.md [X (formerly Twitter)]: https://www.twitter.com/angular +[bluesky]: https://bsky.app/profile/angular.dev [discord]: https://discord.gg/angular [gitter]: https://gitter.im/angular/angular [stackoverflow]: https://stackoverflow.com/questions/tagged/angular diff --git a/adev/src/app/core/constants/links.ts b/adev/src/app/core/constants/links.ts index fb7d17d7fb9f..7ccb78008cc0 100644 --- a/adev/src/app/core/constants/links.ts +++ b/adev/src/app/core/constants/links.ts @@ -11,3 +11,4 @@ export const X = 'https://x.com/angular'; export const MEDIUM = 'https://blog.angular.dev'; export const YOUTUBE = 'https://www.youtube.com/angular'; export const DISCORD = 'https://discord.gg/angular'; +export const BLUESKY = 'https://bsky.app/profile/angular.dev'; diff --git a/adev/src/app/core/layout/footer/footer.component.html b/adev/src/app/core/layout/footer/footer.component.html index d6ad9ba8e20e..738e82b981f5 100644 --- a/adev/src/app/core/layout/footer/footer.component.html +++ b/adev/src/app/core/layout/footer/footer.component.html @@ -9,6 +9,9 @@

Social Media

  • X (formerly Twitter)
  • +
  • + Bluesky +
  • YouTube
  • diff --git a/adev/src/app/core/layout/footer/footer.component.ts b/adev/src/app/core/layout/footer/footer.component.ts index b10733544eb3..28da2922613b 100644 --- a/adev/src/app/core/layout/footer/footer.component.ts +++ b/adev/src/app/core/layout/footer/footer.component.ts @@ -9,7 +9,7 @@ import {ChangeDetectionStrategy, Component} from '@angular/core'; import {ExternalLink} from '@angular/docs'; import {RouterLink} from '@angular/router'; -import {GITHUB, X, MEDIUM, YOUTUBE} from './../../constants/links'; +import {GITHUB, X, MEDIUM, YOUTUBE, BLUESKY} from './../../constants/links'; @Component({ selector: 'footer[adev-footer]', @@ -23,4 +23,5 @@ export class Footer { readonly X = X; readonly YOUTUBE = YOUTUBE; readonly MEDIUM = MEDIUM; + readonly BLUESKY = BLUESKY; } diff --git a/adev/src/app/core/layout/navigation/navigation.component.html b/adev/src/app/core/layout/navigation/navigation.component.html index 2680ae8330c4..080b38299f40 100644 --- a/adev/src/app/core/layout/navigation/navigation.component.html +++ b/adev/src/app/core/layout/navigation/navigation.component.html @@ -346,6 +346,27 @@ +
  • + + + + + + +
  • Date: Wed, 22 Jan 2025 19:43:15 +0000 Subject: [PATCH 0152/1220] docs: release notes for the v19.1.3 release --- CHANGELOG.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e3cf968b01d1..d6f878898f6a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,32 @@ + +# 19.1.3 (2025-01-22) +### compiler +| Commit | Type | Description | +| -- | -- | -- | +| [ecfb74d287](https://github.com/angular/angular/commit/ecfb74d287bec7bec37d0b476b321b047bef2c43) | fix | handle :host-context with comma-separated child selector ([#59276](https://github.com/angular/angular/pull/59276)) | +### compiler-cli +| Commit | Type | Description | +| -- | -- | -- | +| [53160e504d](https://github.com/angular/angular/commit/53160e504df44b05f59cacd9afeb40a0e627b744) | fix | extract parenthesized dependencies during HMR ([#59644](https://github.com/angular/angular/pull/59644)) | +| [39690969af](https://github.com/angular/angular/commit/39690969af14914df0c9b5a009b2df920f5c03e7) | fix | handle conditional expressions when extracting dependencies ([#59637](https://github.com/angular/angular/pull/59637)) | +| [78af7a5059](https://github.com/angular/angular/commit/78af7a5059cc3e03704ba63f8512351a40470557) | fix | handle new expressions when extracting dependencies ([#59637](https://github.com/angular/angular/pull/59637)) | +### core +| Commit | Type | Description | +| -- | -- | -- | +| [408af24ff3](https://github.com/angular/angular/commit/408af24ff3490926e9992cb4f1f71914d71ad6ad) | fix | capture self-referencing component during HMR ([#59644](https://github.com/angular/angular/pull/59644)) | +| [d7575c201c](https://github.com/angular/angular/commit/d7575c201cfd61010952b3a633eec03e32f58220) | fix | replace metadata in place during HMR ([#59644](https://github.com/angular/angular/pull/59644)) | +| [26f6d4c485](https://github.com/angular/angular/commit/26f6d4c485b566d7bc127c78cc163c376d0fe6b5) | fix | skip component ID collision warning during SSR ([#59625](https://github.com/angular/angular/pull/59625)) | +### migrations +| Commit | Type | Description | +| -- | -- | -- | +| [a62c84bc18](https://github.com/angular/angular/commit/a62c84bc188d41ea24cf0eca14ac18c4b917ccd0) | fix | avoid applying the same replacements twice when cleaning up unused imports ([#59656](https://github.com/angular/angular/pull/59656)) | +### platform-browser +| Commit | Type | Description | +| -- | -- | -- | +| [b2b3816cb1](https://github.com/angular/angular/commit/b2b3816cb1c5c573dc9368f05fd2971671d7159f) | fix | clear renderer cache during HMR when using async animations ([#59644](https://github.com/angular/angular/pull/59644)) | + + + # 19.1.2 (2025-01-20) ### compiler From 2ed633a2599704d5956a34c59c711e2e9db534f0 Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Wed, 22 Jan 2025 19:45:55 +0000 Subject: [PATCH 0153/1220] release: cut the v19.2.0-next.0 release --- CHANGELOG.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d6f878898f6a..8fcc47b1459d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,20 @@ + +# 19.2.0-next.0 (2025-01-22) +### compiler +| Commit | Type | Description | +| -- | -- | -- | +| [fe8a68329b](https://github.com/angular/angular/commit/fe8a68329b50363f914a728579392f3fc68670a6) | feat | support untagged template literals in expressions ([#59230](https://github.com/angular/angular/pull/59230)) | +### compiler-cli +| Commit | Type | Description | +| -- | -- | -- | +| [ed705a856a](https://github.com/angular/angular/commit/ed705a856a164f91d33e2173b4f371329d07c472) | feat | detect missing structural directive imports ([#59443](https://github.com/angular/angular/pull/59443)) | +### core +| Commit | Type | Description | +| -- | -- | -- | +| [bc2ad7bfd3](https://github.com/angular/angular/commit/bc2ad7bfd37a61992b550943de5da0eab2eec98b) | feat | support streaming resources ([#59573](https://github.com/angular/angular/pull/59573)) | + + + # 19.1.3 (2025-01-22) ### compiler From a0b5fdfe02950b263f26c9da926abc52c2d3d075 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Fri, 17 Jan 2025 14:07:12 +0100 Subject: [PATCH 0154/1220] test(core): additional linkedSignal tests (#59599) Adds a test veryfing that downstream dependencies are not recomputed when the source of the linkedSignal is equal to its current value. PR Close #59599 --- .../core/test/signals/linked_signal_spec.ts | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/packages/core/test/signals/linked_signal_spec.ts b/packages/core/test/signals/linked_signal_spec.ts index 2f6c00a3b24b..0fe145ca05f5 100644 --- a/packages/core/test/signals/linked_signal_spec.ts +++ b/packages/core/test/signals/linked_signal_spec.ts @@ -147,6 +147,35 @@ describe('linkedSignal', () => { expect(choice()).toBe(0); }); + it('should not recompute downstream dependencies when computed value is equal to the currently set value', () => { + const source = signal(0); + const isEven = linkedSignal(() => source() % 2 === 0); + + let updateCounter = 0; + const updateTracker = computed(() => { + isEven(); + return updateCounter++; + }); + + updateTracker(); + expect(updateCounter).toEqual(1); + expect(isEven()).toBeTrue(); + + isEven.set(false); + updateTracker(); + expect(updateCounter).toEqual(2); + + // Setting the source signal such that the linked value is the same + source.set(1); + updateTracker(); + // downstream dependency should _not_ be recomputed + expect(updateCounter).toEqual(2); + + source.set(4); + updateTracker(); + expect(updateCounter).toEqual(3); + }); + it('should support shorthand version', () => { const options = signal(['apple', 'banana', 'fig']); const choice = linkedSignal(() => options()[0]); From afd8df35229f198b26fbbd126ee0df9c30c1cbfb Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Fri, 17 Jan 2025 15:36:15 +0100 Subject: [PATCH 0155/1220] refactor(core): use linkedSignal primitives (#59599) This change refactors the linkedSignal to use implementation from the shared primitives package. PR Close #59599 --- .../src/render3/reactivity/linked_signal.ts | 208 +++--------------- 1 file changed, 32 insertions(+), 176 deletions(-) diff --git a/packages/core/src/render3/reactivity/linked_signal.ts b/packages/core/src/render3/reactivity/linked_signal.ts index 45f8f10581dc..6640145bdcae 100644 --- a/packages/core/src/render3/reactivity/linked_signal.ts +++ b/packages/core/src/render3/reactivity/linked_signal.ts @@ -8,102 +8,19 @@ import {signalAsReadonlyFn, WritableSignal} from './signal'; import {Signal, ValueEqualityFn} from './api'; +import {performanceMarkFeature} from '../../util/performance'; import { - producerMarkClean, - ReactiveNode, + ComputationFn, + createLinkedSignal, + LinkedSignalGetter, + LinkedSignalNode, SIGNAL, - signalSetFn, - signalUpdateFn, - producerUpdateValueVersion, - REACTIVE_NODE, - defaultEquals, - consumerBeforeComputation, - consumerAfterComputation, - producerAccessed, + linkedSignalSetFn, + linkedSignalUpdateFn, } from '@angular/core/primitives/signals'; -import {performanceMarkFeature} from '../../util/performance'; - -type ComputationFn = (source: S, previous?: {source: S; value: D}) => D; - -interface LinkedSignalNode extends ReactiveNode { - /** - * Value of the source signal that was used to derive the computed value. - */ - sourceValue: S; - - /** - * Current state value, or one of the sentinel values (`UNSET`, `COMPUTING`, - * `ERROR`). - */ - value: D; - - /** - * If `value` is `ERRORED`, the error caught from the last computation attempt which will - * be re-thrown. - */ - error: unknown; - - /** - * The source function represents reactive dependency based on which the linked state is reset. - */ - source: () => S; - - /** - * The computation function which will produce a new value based on the source and, optionally - previous values. - */ - computation: ComputationFn; - - equal: ValueEqualityFn; -} - -export type LinkedSignalGetter = (() => D) & { - [SIGNAL]: LinkedSignalNode; -}; const identityFn = (v: T) => v; -/** - * Create a linked signal which represents state that is (re)set from a linked reactive expression. - */ -function createLinkedSignal(node: LinkedSignalNode): WritableSignal { - const linkedSignalGetter = () => { - // Check if the value needs updating before returning it. - producerUpdateValueVersion(node); - - // Record that someone looked at this signal. - producerAccessed(node); - - if (node.value === ERRORED) { - throw node.error; - } - - return node.value; - }; - - const getter = linkedSignalGetter as LinkedSignalGetter & WritableSignal; - getter[SIGNAL] = node; - - if (ngDevMode) { - getter.toString = () => `[LinkedSignal: ${getter()}]`; - } - - getter.set = (newValue: D) => { - producerUpdateValueVersion(node); - signalSetFn(node, newValue); - producerMarkClean(node); - }; - - getter.update = (updateFn: (value: D) => D) => { - producerUpdateValueVersion(node); - signalUpdateFn(node, updateFn); - producerMarkClean(node); - }; - - getter.asReadonly = signalAsReadonlyFn.bind(getter as any) as () => Signal; - - return getter; -} - /** * Creates a writable signals whose value is initialized and reset by the linked, reactive computation. * @@ -140,95 +57,34 @@ export function linkedSignal( ): WritableSignal { performanceMarkFeature('NgSignals'); - const isShorthand = typeof optionsOrComputation === 'function'; - const node: LinkedSignalNode = Object.create(LINKED_SIGNAL_NODE); - node.source = isShorthand ? optionsOrComputation : optionsOrComputation.source; - if (!isShorthand) { - node.computation = optionsOrComputation.computation as ComputationFn; - } - const equal = isShorthand ? options?.equal : optionsOrComputation.equal; - if (equal) { - node.equal = equal as ValueEqualityFn; + if (typeof optionsOrComputation === 'function') { + const getter = createLinkedSignal( + optionsOrComputation, + identityFn, + options?.equal, + ) as LinkedSignalGetter & WritableSignal; + return upgradeLinkedSignalGetter(getter); + } else { + const getter = createLinkedSignal( + optionsOrComputation.source, + optionsOrComputation.computation, + optionsOrComputation.equal, + ); + return upgradeLinkedSignalGetter(getter); } - return createLinkedSignal(node as LinkedSignalNode); } -/** - * A dedicated symbol used before a state value has been set / calculated for the first time. - * Explicitly typed as `any` so we can use it as signal's value. - */ -const UNSET: any = /* @__PURE__ */ Symbol('UNSET'); - -/** - * A dedicated symbol used in place of a linked signal value to indicate that a given computation - * is in progress. Used to detect cycles in computation chains. - * Explicitly typed as `any` so we can use it as signal's value. - */ -const COMPUTING: any = /* @__PURE__ */ Symbol('COMPUTING'); - -/** - * A dedicated symbol used in place of a linked signal value to indicate that a given computation - * failed. The thrown error is cached until the computation gets dirty again or the state is set. - * Explicitly typed as `any` so we can use it as signal's value. - */ -const ERRORED: any = /* @__PURE__ */ Symbol('ERRORED'); - -// Note: Using an IIFE here to ensure that the spread assignment is not considered -// a side-effect, ending up preserving `LINKED_SIGNAL_NODE` and `REACTIVE_NODE`. -// TODO: remove when https://github.com/evanw/esbuild/issues/3392 is resolved. -const LINKED_SIGNAL_NODE = /* @__PURE__ */ (() => { - return { - ...REACTIVE_NODE, - value: UNSET, - dirty: true, - error: null, - equal: defaultEquals, - computation: identityFn, - - producerMustRecompute(node: LinkedSignalNode): boolean { - // Force a recomputation if there's no current value, or if the current value is in the - // process of being calculated (which should throw an error). - return node.value === UNSET || node.value === COMPUTING; - }, - - producerRecomputeValue(node: LinkedSignalNode): void { - if (node.value === COMPUTING) { - // Our computation somehow led to a cyclic read of itself. - throw new Error('Detected cycle in computations.'); - } - - const oldValue = node.value; - node.value = COMPUTING; +function upgradeLinkedSignalGetter(getter: LinkedSignalGetter): WritableSignal { + if (ngDevMode) { + getter.toString = () => `[LinkedSignal: ${getter()}]`; + } - const prevConsumer = consumerBeforeComputation(node); - let newValue: unknown; - try { - const newSourceValue = node.source(); - const prev = - oldValue === UNSET || oldValue === ERRORED - ? undefined - : { - source: node.sourceValue, - value: oldValue, - }; - newValue = node.computation(newSourceValue, prev); - node.sourceValue = newSourceValue; - } catch (err) { - newValue = ERRORED; - node.error = err; - } finally { - consumerAfterComputation(node, prevConsumer); - } + const node = getter[SIGNAL] as LinkedSignalNode; + const upgradedGetter = getter as LinkedSignalGetter & WritableSignal; - if (oldValue !== UNSET && newValue !== ERRORED && node.equal(oldValue, newValue)) { - // No change to `valueVersion` - old and new values are - // semantically equivalent. - node.value = oldValue; - return; - } + upgradedGetter.set = (newValue: D) => linkedSignalSetFn(node, newValue); + upgradedGetter.update = (updateFn: (value: D) => D) => linkedSignalUpdateFn(node, updateFn); + upgradedGetter.asReadonly = signalAsReadonlyFn.bind(getter as any) as () => Signal; - node.value = newValue; - node.version++; - }, - }; -})(); + return upgradedGetter; +} From ae1dfdf82a87b2dec27680a7088411a05e2aae73 Mon Sep 17 00:00:00 2001 From: arturovt Date: Sun, 19 Jan 2025 19:53:58 +0200 Subject: [PATCH 0156/1220] refactor(core): prevent duplicating `isRootView` checks (#59614) The `type_checks` module already exposes a utility function that checks whether `LView` is marked as a root view. There is no need to check flags in other places, as we can reuse the helper function. PR Close #59614 --- packages/core/src/render3/di.ts | 4 ++-- packages/core/src/render3/hmr.ts | 6 ++---- packages/core/src/render3/interfaces/type_checks.ts | 1 + packages/core/src/render3/util/discovery_utils.ts | 5 +++-- packages/core/src/render3/util/view_traversal_utils.ts | 6 +++--- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/core/src/render3/di.ts b/packages/core/src/render3/di.ts index 5fc171f34c1d..4f1c0f568bac 100644 --- a/packages/core/src/render3/di.ts +++ b/packages/core/src/render3/di.ts @@ -47,7 +47,7 @@ import { TNodeProviderIndexes, TNodeType, } from './interfaces/node'; -import {isComponentDef, isComponentHost} from './interfaces/type_checks'; +import {isComponentDef, isComponentHost, isRootView} from './interfaces/type_checks'; import { DECLARATION_COMPONENT_VIEW, DECLARATION_VIEW, @@ -958,7 +958,7 @@ function lookupTokenUsingEmbeddedInjector( currentTNode !== null && currentLView !== null && currentLView[FLAGS] & LViewFlags.HasEmbeddedViewInjector && - !(currentLView[FLAGS] & LViewFlags.IsRoot) + !isRootView(currentLView) ) { ngDevMode && assertTNodeForLView(currentTNode, currentLView); diff --git a/packages/core/src/render3/hmr.ts b/packages/core/src/render3/hmr.ts index 283e67e40af8..06b1846c550a 100644 --- a/packages/core/src/render3/hmr.ts +++ b/packages/core/src/render3/hmr.ts @@ -22,18 +22,16 @@ import {CONTAINER_HEADER_OFFSET} from './interfaces/container'; import {ComponentDef} from './interfaces/definition'; import {getTrackedLViews} from './interfaces/lview_tracking'; import {isTNodeShape, TElementNode, TNodeFlags, TNodeType} from './interfaces/node'; -import {isLContainer, isLView} from './interfaces/type_checks'; +import {isLContainer, isLView, isRootView} from './interfaces/type_checks'; import { CHILD_HEAD, CHILD_TAIL, CONTEXT, ENVIRONMENT, - FLAGS, HEADER_OFFSET, HOST, INJECTOR, LView, - LViewFlags, NEXT, PARENT, RENDERER, @@ -85,7 +83,7 @@ export function ɵɵreplaceMetadata( for (const root of trackedViews) { // Note: we have the additional check, because `IsRoot` can also indicate // a component created through something like `createComponent`. - if (root[FLAGS] & LViewFlags.IsRoot && root[PARENT] === null) { + if (isRootView(root) && root[PARENT] === null) { recreateMatchingLViews(newDef, oldDef, root); } } diff --git a/packages/core/src/render3/interfaces/type_checks.ts b/packages/core/src/render3/interfaces/type_checks.ts index 48f3f8d8ab47..4b67f1fb307a 100644 --- a/packages/core/src/render3/interfaces/type_checks.ts +++ b/packages/core/src/render3/interfaces/type_checks.ts @@ -45,6 +45,7 @@ export function isComponentDef(def: DirectiveDef): def is ComponentDef } export function isRootView(target: LView): boolean { + // Determines whether a given LView is marked as a root view. return (target[FLAGS] & LViewFlags.IsRoot) !== 0; } diff --git a/packages/core/src/render3/util/discovery_utils.ts b/packages/core/src/render3/util/discovery_utils.ts index 742dc478176d..99f397fc5cbb 100644 --- a/packages/core/src/render3/util/discovery_utils.ts +++ b/packages/core/src/render3/util/discovery_utils.ts @@ -21,7 +21,8 @@ import {getComponentDef, getDirectiveDef} from '../def_getters'; import {NodeInjector} from '../di'; import {DirectiveDef} from '../interfaces/definition'; import {TElementNode, TNode, TNodeProviderIndexes} from '../interfaces/node'; -import {CLEANUP, CONTEXT, FLAGS, LView, LViewFlags, TVIEW, TViewType} from '../interfaces/view'; +import {isRootView} from '../interfaces/type_checks'; +import {CLEANUP, CONTEXT, LView, TVIEW, TViewType} from '../interfaces/view'; import {getRootContext} from './view_traversal_utils'; import {getLViewParent, unwrapRNode} from './view_utils'; @@ -109,7 +110,7 @@ export function getOwningComponent(elementOrDir: Element | {}): T | null { while (lView[TVIEW].type === TViewType.Embedded && (parent = getLViewParent(lView)!)) { lView = parent; } - return lView[FLAGS] & LViewFlags.IsRoot ? null : (lView[CONTEXT] as unknown as T); + return isRootView(lView) ? null : (lView[CONTEXT] as unknown as T); } /** diff --git a/packages/core/src/render3/util/view_traversal_utils.ts b/packages/core/src/render3/util/view_traversal_utils.ts index 1ce13d22634a..a2eb9670c80f 100644 --- a/packages/core/src/render3/util/view_traversal_utils.ts +++ b/packages/core/src/render3/util/view_traversal_utils.ts @@ -10,8 +10,8 @@ import {assertDefined} from '../../util/assert'; import {assertLView} from '../assert'; import {readPatchedLView} from '../context_discovery'; import {LContainer} from '../interfaces/container'; -import {isLContainer, isLView} from '../interfaces/type_checks'; -import {CHILD_HEAD, CONTEXT, FLAGS, LView, LViewFlags, NEXT, PARENT} from '../interfaces/view'; +import {isLContainer, isLView, isRootView} from '../interfaces/type_checks'; +import {CHILD_HEAD, CONTEXT, LView, NEXT} from '../interfaces/view'; import {getLViewParent} from './view_utils'; @@ -24,7 +24,7 @@ import {getLViewParent} from './view_utils'; export function getRootView(componentOrLView: LView | {}): LView { ngDevMode && assertDefined(componentOrLView, 'component'); let lView = isLView(componentOrLView) ? componentOrLView : readPatchedLView(componentOrLView)!; - while (lView && !(lView[FLAGS] & LViewFlags.IsRoot)) { + while (lView && !isRootView(lView)) { lView = getLViewParent(lView)!; } ngDevMode && assertLView(lView); From f862ace18191d7fda3b12fc3c6486c035a6b431d Mon Sep 17 00:00:00 2001 From: Jessica Janiuk Date: Wed, 22 Jan 2025 15:50:16 -0500 Subject: [PATCH 0157/1220] fix(core): fixes test timer-based test flakiness in CI (#59674) This converts two tests that rely on timers to use fakeAsync. This resolves the flakiness. PR Close #59674 --- .../platform-server/test/incremental_hydration_spec.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/platform-server/test/incremental_hydration_spec.ts b/packages/platform-server/test/incremental_hydration_spec.ts index 4be2b69ef28f..aee30608e216 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 {TestBed} from '@angular/core/testing'; +import {fakeAsync, 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,7 +1329,7 @@ describe('platform-server partial hydration integration', () => { }); describe('timer', () => { - it('top level timer', async () => { + it('top level timer', fakeAsync(async () => { @Component({ selector: 'app', template: ` @@ -1399,9 +1399,9 @@ describe('platform-server partial hydration integration', () => { appRef.tick(); expect(appHostNode.outerHTML).toContain('end'); - }); + })); - it('nested timer', async () => { + it('nested timer', fakeAsync(async () => { @Component({ selector: 'app', template: ` @@ -1487,7 +1487,7 @@ describe('platform-server partial hydration integration', () => { appRef.tick(); expect(appHostNode.outerHTML).toContain('end'); - }); + })); }); it('when', async () => { From 3f6d9ff11305c21f960540b38b6d019b949a71e5 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Mon, 20 Jan 2025 16:11:15 +0100 Subject: [PATCH 0158/1220] refactor(core): reuse directive instantiate logic (#59633) This refactor reuses the existing directive instantiation logic for a given component. PR Close #59633 --- packages/core/src/render3/component_ref.ts | 190 ++++-------------- .../core/src/render3/instructions/element.ts | 8 +- .../render3/instructions/element_container.ts | 8 +- .../core/src/render3/instructions/shared.ts | 35 ++-- .../core/src/render3/instructions/template.ts | 4 +- .../bundle.golden_symbols.json | 6 +- .../animations/bundle.golden_symbols.json | 6 +- .../cyclic_import/bundle.golden_symbols.json | 6 +- .../bundling/defer/bundle.golden_symbols.json | 5 +- .../forms_reactive/bundle.golden_symbols.json | 5 +- .../bundle.golden_symbols.json | 5 +- .../hello_world/bundle.golden_symbols.json | 3 +- .../hydration/bundle.golden_symbols.json | 2 +- .../router/bundle.golden_symbols.json | 5 +- .../bundle.golden_symbols.json | 3 +- .../bundling/todo/bundle.golden_symbols.json | 5 +- 16 files changed, 88 insertions(+), 208 deletions(-) diff --git a/packages/core/src/render3/component_ref.ts b/packages/core/src/render3/component_ref.ts index dac2e1c2af18..c121c0757b45 100644 --- a/packages/core/src/render3/component_ref.ts +++ b/packages/core/src/render3/component_ref.ts @@ -28,25 +28,22 @@ 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, assertGreaterThan, assertIndexInRange} from '../util/assert'; +import {assertDefined} from '../util/assert'; import {assertComponentType, assertNoDuplicateDirectives} from './assert'; import {attachPatchData} from './context_discovery'; import {getComponentDef} from './def_getters'; import {depsTracker} from './deps_tracker/deps_tracker'; -import {getNodeInjectable, NodeInjector} from './di'; +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 { - addToEndOfViewTree, + createDirectivesInstances, createLView, createTView, - getInitialLViewFlagsFromDef, - getOrCreateComponentTView, initializeDirectives, - invokeDirectivesHostBindings, locateHostElement, markAsComponentHost, setInputsForProperty, @@ -62,11 +59,10 @@ import { TNode, TNodeType, } from './interfaces/node'; -import {RElement, RNode} from './interfaces/renderer_dom'; +import {RNode} from './interfaces/renderer_dom'; import { CONTEXT, HEADER_OFFSET, - INJECTOR, LView, LViewEnvironment, LViewFlags, @@ -75,25 +71,25 @@ import { } from './interfaces/view'; import {MATH_ML_NAMESPACE, SVG_NAMESPACE} from './namespaces'; +import {ChainedInjector} from './chained_injector'; import {createElementNode, setupStaticAttributes} from './dom_node_manipulation'; +import {AttributeMarker} from './interfaces/attribute_marker'; +import {unregisterLView} from './interfaces/lview_tracking'; +import {CssSelector} from './interfaces/projection'; import { extractAttrsAndClassesFromSelector, stringifyCSSSelectorList, } from './node_selector_matcher'; +import {profiler} from './profiler'; +import {ProfilerEvent} from './profiler_types'; +import {executeContentQueries} from './queries/query_execution'; import {enterView, getCurrentTNode, getLView, 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, getNativeByTNode, getTNode} from './util/view_utils'; +import {getComponentLViewByIndex, getTNode} from './util/view_utils'; import {ViewRef} from './view_ref'; -import {ChainedInjector} from './chained_injector'; -import {unregisterLView} from './interfaces/lview_tracking'; -import {profiler} from './profiler'; -import {ProfilerEvent} from './profiler_types'; -import {executeContentQueries} from './queries/query_execution'; -import {AttributeMarker} from './interfaces/attribute_marker'; -import {CssSelector} from './interfaces/projection'; -import {getOrCreateTNode} from './tnode_manipulation'; export class ComponentFactoryResolver extends AbstractComponentFactoryResolver { /** @@ -328,7 +324,7 @@ export class ComponentFactory extends AbstractComponentFactory { null, null, ); - const rootLView = createLView( + const rootLView = createLView( null, rootTView, null, @@ -351,7 +347,6 @@ export class ComponentFactory extends AbstractComponentFactory { // issues would allow us to drop this. enterView(rootLView); - let component: T; let componentView: LView | null = null; try { @@ -388,6 +383,17 @@ export class ComponentFactory extends AbstractComponentFactory { tAttributes, ); + // TODO(pk): partial code duplication with resolveDirectives and other existing logic + markAsComponentHost(rootTView, hostTNode, rootDirectives.length - 1); + initializeDirectives( + rootTView, + rootLView, + hostTNode, + rootDirectives, + null, + hostDirectiveDefs, + ); + for (const def of rootDirectives) { hostTNode.mergedAttrs = mergeHostAttrs(hostTNode.mergedAttrs, def.hostAttrs); } @@ -400,31 +406,25 @@ export class ComponentFactory extends AbstractComponentFactory { // tests so that this check can be removed. if (hostRNode) { setupStaticAttributes(hostRenderer, hostRNode, hostTNode); + attachPatchData(hostRNode, rootLView); } - componentView = createRootComponentView( - hostTNode, - hostRNode, - rootComponentDef, - rootDirectives, - rootLView, - environment, - ); - if (projectableNodes !== undefined) { projectNodes(hostTNode, this.ngContentSelectors, projectableNodes); } - // TODO: should LifecycleHooksFeature and other host features be generated by the compiler - // and executed here? Angular 5 reference: https://stackblitz.com/edit/lifecycle-hooks-vcref - component = createRootComponent( - componentView, - rootComponentDef, - rootDirectives, - hostDirectiveDefs, - rootLView, - [LifecycleHooksFeature], - ); + // TODO(pk): this logic is similar to the instruction code where a node can have directives + createDirectivesInstances(rootTView, rootLView, hostTNode); + executeContentQueries(rootTView, hostTNode, rootLView); + + // TODO(pk): code / logic duplication with the elementEnd and similar instructions + registerPostOrderHooks(rootTView, hostTNode); + + componentView = getComponentLViewByIndex(hostTNode.index, rootLView); + + // TODO(pk): why do we need this logic? + rootLView[CONTEXT] = componentView[CONTEXT] as T; + renderView(rootTView, rootLView, null); } catch (e) { // Stop tracking the views if creation failed since @@ -442,7 +442,7 @@ export class ComponentFactory extends AbstractComponentFactory { const hostTNode = getTNode(rootTView, HEADER_OFFSET) as TElementNode; return new ComponentRef( this.componentType, - component, + componentView[CONTEXT] as T, createElementRef(hostTNode, rootLView), rootLView, hostTNode, @@ -527,118 +527,6 @@ export class ComponentRef extends AbstractComponentRef { } } -/** Represents a HostFeature function. */ -type HostFeature = (component: T, componentDef: ComponentDef) => void; - -/** - * Creates the root component view and the root component node. - * - * @param hostRNode Render host element. - * @param rootComponentDef ComponentDef - * @param rootView The parent view where the host node is stored - * @param rendererFactory Factory to be used for creating child renderers. - * @param hostRenderer The current renderer - * @param sanitizer The sanitizer, if provided - * - * @returns Component view created - */ -function createRootComponentView( - tNode: TElementNode, - hostRNode: RElement | null, - rootComponentDef: ComponentDef, - rootDirectives: DirectiveDef[], - rootView: LView, - environment: LViewEnvironment, -): LView { - const tView = rootView[TVIEW]; - - // Hydration info is on the host element and needs to be retrieved - // and passed to the component LView. - let hydrationInfo: DehydratedView | null = null; - if (hostRNode !== null) { - hydrationInfo = retrieveHydrationInfo(hostRNode, rootView[INJECTOR]); - } - const viewRenderer = environment.rendererFactory.createRenderer(hostRNode, rootComponentDef); - const componentView = createLView( - rootView, - getOrCreateComponentTView(rootComponentDef), - null, - getInitialLViewFlagsFromDef(rootComponentDef), - rootView[tNode.index], - tNode, - environment, - viewRenderer, - null, - null, - hydrationInfo, - ); - - if (tView.firstCreatePass) { - markAsComponentHost(tView, tNode, rootDirectives.length - 1); - } - - addToEndOfViewTree(rootView, componentView); - - // Store component view at node index, with node as the HOST - return (rootView[tNode.index] = componentView); -} - -/** - * Creates a root component and sets it up with features and host bindings.Shared by - * renderComponent() and ViewContainerRef.createComponent(). - */ -function createRootComponent( - componentView: LView, - rootComponentDef: ComponentDef, - rootDirectives: DirectiveDef[], - hostDirectiveDefs: HostDirectiveDefs | null, - rootLView: LView, - hostFeatures: HostFeature[] | null, -): any { - const rootTNode = getCurrentTNode() as TElementNode; - ngDevMode && assertDefined(rootTNode, 'tNode should have been already created'); - const tView = rootLView[TVIEW]; - const native = getNativeByTNode(rootTNode, rootLView); - - initializeDirectives(tView, rootLView, rootTNode, rootDirectives, null, hostDirectiveDefs); - - for (let i = 0; i < rootDirectives.length; i++) { - const directiveIndex = rootTNode.directiveStart + i; - const directiveInstance = getNodeInjectable(rootLView, tView, directiveIndex, rootTNode); - attachPatchData(directiveInstance, rootLView); - } - - invokeDirectivesHostBindings(tView, rootLView, rootTNode); - - if (native) { - attachPatchData(native, rootLView); - } - - // We're guaranteed for the `componentOffset` to be positive here - // since a root component always matches a component def. - ngDevMode && - assertGreaterThan(rootTNode.componentOffset, -1, 'componentOffset must be great than -1'); - const component = getNodeInjectable( - rootLView, - tView, - rootTNode.directiveStart + rootTNode.componentOffset, - rootTNode, - ); - componentView[CONTEXT] = rootLView[CONTEXT] = component; - - if (hostFeatures !== null) { - for (const feature of hostFeatures) { - feature(component, rootComponentDef); - } - } - - // We want to generate an empty QueryList for root content queries for backwards - // compatibility with ViewEngine. - executeContentQueries(tView, rootTNode, rootLView); - - return component; -} - /** Projects the `projectableNodes` that were specified when creating a root component. */ function projectNodes( tNode: TElementNode, diff --git a/packages/core/src/render3/instructions/element.ts b/packages/core/src/render3/instructions/element.ts index c9a186d489de..62d4ff553da0 100644 --- a/packages/core/src/render3/instructions/element.ts +++ b/packages/core/src/render3/instructions/element.ts @@ -72,7 +72,11 @@ import {getConstant} from '../util/view_utils'; import {validateElementIsKnown} from './element_validation'; import {setDirectiveInputsWhichShadowsStyling} from './property'; -import {createDirectivesInstances, resolveDirectives, saveResolvedLocalsInData} from './shared'; +import { + createDirectivesInstancesInInstruction, + resolveDirectives, + saveResolvedLocalsInData, +} from './shared'; import {getOrCreateTNode} from '../tnode_manipulation'; function elementStartFirstCreatePass( @@ -172,7 +176,7 @@ export function ɵɵelementStart( increaseElementDepthCount(); if (hasDirectives) { - createDirectivesInstances(tView, lView, tNode); + createDirectivesInstancesInInstruction(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 3eef61a7d460..e1791e37b0bb 100644 --- a/packages/core/src/render3/instructions/element_container.ts +++ b/packages/core/src/render3/instructions/element_container.ts @@ -41,7 +41,11 @@ import { import {computeStaticStyling} from '../styling/static_styling'; import {getConstant} from '../util/view_utils'; -import {createDirectivesInstances, resolveDirectives, saveResolvedLocalsInData} from './shared'; +import { + createDirectivesInstancesInInstruction, + resolveDirectives, + saveResolvedLocalsInData, +} from './shared'; import {getOrCreateTNode} from '../tnode_manipulation'; function elementContainerStartFirstCreatePass( @@ -119,7 +123,7 @@ export function ɵɵelementContainerStart( attachPatchData(comment, lView); if (isDirectiveHost(tNode)) { - createDirectivesInstances(tView, lView, tNode); + createDirectivesInstancesInInstruction(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 34c19f4c4b88..c3fbd181620c 100644 --- a/packages/core/src/render3/instructions/shared.ts +++ b/packages/core/src/render3/instructions/shared.ts @@ -272,9 +272,21 @@ export function executeTemplate( /** * Creates directive instances. */ -export function createDirectivesInstances(tView: TView, lView: LView, tNode: TDirectiveHostNode) { +export function createDirectivesInstancesInInstruction( + tView: TView, + lView: LView, + tNode: TDirectiveHostNode, +) { if (!getBindingsEnabled()) return; - instantiateAllDirectives(tView, lView, tNode, getNativeByTNode(tNode, lView)); + attachPatchData(getNativeByTNode(tNode, lView), lView); + createDirectivesInstances(tView, lView, tNode); +} + +/** + * Creates directive instances. + */ +export function createDirectivesInstances(tView: TView, lView: LView, tNode: TDirectiveHostNode) { + instantiateAllDirectives(tView, lView, tNode); if ((tNode.flags & TNodeFlags.hasHostBindings) === TNodeFlags.hasHostBindings) { invokeDirectivesHostBindings(tView, lView, tNode); } @@ -992,12 +1004,7 @@ function lastSelectedElementIdx(hostBindingOpCodes: HostBindingOpCodes): number /** * Instantiate all the directives that were previously resolved on the current node. */ -function instantiateAllDirectives( - tView: TView, - lView: LView, - tNode: TDirectiveHostNode, - native: RNode, -) { +function instantiateAllDirectives(tView: TView, lView: LView, tNode: TDirectiveHostNode) { const start = tNode.directiveStart; const end = tNode.directiveEnd; @@ -1005,7 +1012,7 @@ function instantiateAllDirectives( // since it is used to inject some special symbols like `ChangeDetectorRef`. if (isComponentHost(tNode)) { ngDevMode && assertTNodeType(tNode, TNodeType.AnyRNode); - addComponentLogic( + createComponentLView( lView, tNode as TElementNode, tView.data[start + tNode.componentOffset] as ComponentDef, @@ -1016,8 +1023,6 @@ function instantiateAllDirectives( getOrCreateNodeInjectorForNode(tNode, lView); } - attachPatchData(native, lView); - const initialInputs = tNode.initialInputs; for (let i = start; i < end; i++) { const def = tView.data[i] as DirectiveDef; @@ -1274,7 +1279,11 @@ export function getInitialLViewFlagsFromDef(def: ComponentDef): LViewFl return flags; } -function addComponentLogic(lView: LView, hostTNode: TElementNode, def: ComponentDef): void { +export function createComponentLView( + lView: LView, + hostTNode: TElementNode, + def: ComponentDef, +): LView { const native = getNativeByTNode(hostTNode, lView) as RElement; const tView = getOrCreateComponentTView(def); @@ -1300,7 +1309,7 @@ function addComponentLogic(lView: LView, hostTNode: TElementNode, def: Compon // Component view will always be created before any injected LContainers, // so this is a regular element, wrap it with the component view - lView[hostTNode.index] = componentView; + return (lView[hostTNode.index] = componentView); } export function elementAttributeInternal( diff --git a/packages/core/src/render3/instructions/template.ts b/packages/core/src/render3/instructions/template.ts index 05b209f3e76f..d012ade569c6 100644 --- a/packages/core/src/render3/instructions/template.ts +++ b/packages/core/src/render3/instructions/template.ts @@ -39,7 +39,7 @@ import {getConstant} from '../util/view_utils'; import { addToEndOfViewTree, - createDirectivesInstances, + createDirectivesInstancesInInstruction, createLContainer, createTView, resolveDirectives, @@ -154,7 +154,7 @@ export function declareTemplate( populateDehydratedViewsInLContainer(lContainer, tNode, declarationLView); if (isDirectiveHost(tNode)) { - createDirectivesInstances(declarationTView, declarationLView, tNode); + createDirectivesInstancesInInstruction(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 eeaca8775b63..2c3d7c96fef0 100644 --- a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json @@ -92,7 +92,6 @@ "KeyEventsPlugin", "LEAVE_TOKEN_REGEX", "LOCALE_ID2", - "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "NAMESPACE_URIS", @@ -201,7 +200,6 @@ "activeConsumer", "addClass", "addPropertyBinding", - "addToEndOfViewTree", "allocExpando", "allocLFrame", "angularZoneInstanceIdProperty", @@ -249,6 +247,7 @@ "context", "convertToBitFlags", "copyAnimationEvent", + "createDirectivesInstances", "createElementNode", "createElementRef", "createErrorClass", @@ -307,7 +306,6 @@ "getDirectiveDef", "getFactoryDef", "getFirstLContainer", - "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", @@ -319,7 +317,6 @@ "getNextLContainer", "getNodeInjectable", "getNullInjector", - "getOrCreateComponentTView", "getOrCreateInjectable", "getOrCreateNodeInjectorForNode", "getOrCreateTNode", @@ -359,7 +356,6 @@ "internalProvideZoneChangeDetection", "interpolateParams", "invalidTimingValue", - "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "invokeQuery", "isAngularZoneProperty", diff --git a/packages/core/test/bundling/animations/bundle.golden_symbols.json b/packages/core/test/bundling/animations/bundle.golden_symbols.json index acbb5dddadc2..8939ba2f4ade 100644 --- a/packages/core/test/bundling/animations/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations/bundle.golden_symbols.json @@ -98,7 +98,6 @@ "KeyEventsPlugin", "LEAVE_TOKEN_REGEX", "LOCALE_ID2", - "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "NAMESPACE_URIS", @@ -220,7 +219,6 @@ "activeConsumer", "addClass", "addPropertyBinding", - "addToEndOfViewTree", "allocExpando", "allocLFrame", "angularZoneInstanceIdProperty", @@ -268,6 +266,7 @@ "context", "convertToBitFlags", "copyAnimationEvent", + "createDirectivesInstances", "createElementNode", "createElementRef", "createErrorClass", @@ -328,7 +327,6 @@ "getDirectiveDef", "getFactoryDef", "getFirstLContainer", - "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", @@ -341,7 +339,6 @@ "getNgZoneOptions", "getNodeInjectable", "getNullInjector", - "getOrCreateComponentTView", "getOrCreateInjectable", "getOrCreateNodeInjectorForNode", "getOrCreateTNode", @@ -382,7 +379,6 @@ "internalProvideZoneChangeDetection", "interpolateParams", "invalidTimingValue", - "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "invokeQuery", "isAngularZoneProperty", 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 84033396a41f..64603b671133 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -66,7 +66,6 @@ "InputFlags", "KeyEventsPlugin", "LOCALE_ID2", - "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "Module", @@ -166,7 +165,6 @@ "_wasLastNodeCreated", "activeConsumer", "addPropertyBinding", - "addToEndOfViewTree", "allocExpando", "allocLFrame", "angularZoneInstanceIdProperty", @@ -203,6 +201,7 @@ "consumerPollProducersForChange", "context", "convertToBitFlags", + "createDirectivesInstances", "createElementNode", "createElementRef", "createErrorClass", @@ -256,7 +255,6 @@ "getDirectiveDef", "getFactoryDef", "getFirstLContainer", - "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", @@ -269,7 +267,6 @@ "getNgZoneOptions", "getNodeInjectable", "getNullInjector", - "getOrCreateComponentTView", "getOrCreateInjectable", "getOrCreateNodeInjectorForNode", "getOrCreateTNode", @@ -305,7 +302,6 @@ "instructionState", "internalImportProvidersFrom", "internalProvideZoneChangeDetection", - "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "isAngularZoneProperty", "isApplicationBootstrapConfig", diff --git a/packages/core/test/bundling/defer/bundle.golden_symbols.json b/packages/core/test/bundling/defer/bundle.golden_symbols.json index 29419f5b756c..a9f2d40a045c 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -87,7 +87,6 @@ "KeyEventsPlugin", "LOADING_AFTER_SLOT", "LOCALE_ID2", - "LifecycleHooksFeature", "MATH_ML_NAMESPACE", "MAXIMUM_REFRESH_RERUNS", "MINIMUM_SLOT", @@ -247,6 +246,7 @@ "convertToBitFlags", "createContainerAnchorImpl", "createDirectivesInstances", + "createDirectivesInstancesInInstruction", "createElementNode", "createElementRef", "createEnvironmentInjector", @@ -309,7 +309,6 @@ "getFactoryDef", "getFirstLContainer", "getFirstNativeNode", - "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", @@ -324,7 +323,6 @@ "getNextLContainer", "getNodeInjectable", "getNullInjector", - "getOrCreateComponentTView", "getOrCreateEnvironmentInjector", "getOrCreateInjectable", "getOrCreateNodeInjectorForNode", @@ -756,7 +754,6 @@ "internalImportProvidersFrom", "internalProvideZoneChangeDetection", "invokeAllTriggerCleanupFns", - "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "invokeTriggerCleanupFns", "isAngularZoneProperty", 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 0f35ebd2f784..8fa6e2b35f7e 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -99,7 +99,6 @@ "IterableDiffers", "KeyEventsPlugin", "LOCALE_ID2", - "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "NAMESPACE_URIS", @@ -295,6 +294,7 @@ "controlPath", "convertToBitFlags", "createDirectivesInstances", + "createDirectivesInstancesInInstruction", "createElementNode", "createElementRef", "createErrorClass", @@ -372,7 +372,6 @@ "getFactoryOf", "getFirstLContainer", "getFirstNativeNode", - "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", @@ -386,7 +385,6 @@ "getNgZoneOptions", "getNodeInjectable", "getNullInjector", - "getOrCreateComponentTView", "getOrCreateInjectable", "getOrCreateNodeInjectorForNode", "getOrCreateTNode", @@ -444,7 +442,6 @@ "instructionState", "internalImportProvidersFrom", "internalProvideZoneChangeDetection", - "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "isAbstractControlOptions", "isAngularZoneProperty", 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 a61bf78ddd7c..11f33d82d745 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 @@ -92,7 +92,6 @@ "IterableDiffers", "KeyEventsPlugin", "LOCALE_ID2", - "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "NAMESPACE_URIS", @@ -283,6 +282,7 @@ "controlPath", "convertToBitFlags", "createDirectivesInstances", + "createDirectivesInstancesInInstruction", "createElementNode", "createElementRef", "createErrorClass", @@ -358,7 +358,6 @@ "getFactoryOf", "getFirstLContainer", "getFirstNativeNode", - "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", @@ -372,7 +371,6 @@ "getNgZoneOptions", "getNodeInjectable", "getNullInjector", - "getOrCreateComponentTView", "getOrCreateInjectable", "getOrCreateNodeInjectorForNode", "getOrCreateTNode", @@ -431,7 +429,6 @@ "instructionState", "internalImportProvidersFrom", "internalProvideZoneChangeDetection", - "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "isAngularZoneProperty", "isApplicationBootstrapConfig", 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 f267aee51667..f4a3926af840 100644 --- a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json @@ -46,7 +46,6 @@ "Injector", "InputFlags", "LOCALE_ID2", - "LifecycleHooksFeature", "NEW_LINE", "NG_COMP_DEF", "NG_ELEMENT_ID", @@ -246,6 +245,7 @@ "isAngularZoneProperty", "isApplicationBootstrapConfig", "isComponentDef", + "isComponentHost", "isDestroyed", "isEnvironmentProviders", "isFunction", @@ -312,6 +312,7 @@ "setCurrentQueryIndex", "setIncludeViewProviders", "setInjectImplementation", + "setInputsFromAttrs", "setIsRefreshingViews", "setSelectedIndex", "shouldSearchParent", diff --git a/packages/core/test/bundling/hydration/bundle.golden_symbols.json b/packages/core/test/bundling/hydration/bundle.golden_symbols.json index e313ef71e5bc..f83bcb5c9077 100644 --- a/packages/core/test/bundling/hydration/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hydration/bundle.golden_symbols.json @@ -74,7 +74,6 @@ "InputFlags", "KeyEventsPlugin", "LOCALE_ID2", - "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "NAMESPACE_URIS", @@ -420,6 +419,7 @@ "setCurrentTNode", "setIncludeViewProviders", "setInjectImplementation", + "setInputsFromAttrs", "setIsRefreshingViews", "setSegmentHead", "setSelectedIndex", diff --git a/packages/core/test/bundling/router/bundle.golden_symbols.json b/packages/core/test/bundling/router/bundle.golden_symbols.json index 64acc95337d4..7f5e21d9a6d2 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -102,7 +102,6 @@ "LOCALE_ID2", "LQueries_", "LQuery_", - "LifecycleHooksFeature", "ListComponent", "Location", "LocationStrategy", @@ -336,6 +335,7 @@ "createChildrenForEmptyPaths", "createContainerRef", "createContentQuery", + "createDirectivesInstances", "createElementNode", "createElementRef", "createEmptyState", @@ -443,7 +443,6 @@ "getFirstNativeNode", "getIdxOfMatchingSelector", "getInherited", - "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", @@ -457,7 +456,6 @@ "getNgModuleDef", "getNodeInjectable", "getNullInjector", - "getOrCreateComponentTView", "getOrCreateInjectable", "getOrCreateLViewCleanup", "getOrCreateNodeInjectorForNode", @@ -520,7 +518,6 @@ "instructionState", "internalImportProvidersFrom", "internalProvideZoneChangeDetection", - "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "isAngularZoneProperty", "isApplicationBootstrapConfig", 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 0b5b4deb652b..c9453f089949 100644 --- a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json +++ b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json @@ -62,7 +62,6 @@ "InputFlags", "KeyEventsPlugin", "LOCALE_ID2", - "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "NAMESPACE_URIS", @@ -275,6 +274,7 @@ "isAngularZoneProperty", "isApplicationBootstrapConfig", "isComponentDef", + "isComponentHost", "isDestroyed", "isEnvironmentProviders", "isFunction", @@ -347,6 +347,7 @@ "setCurrentTNode", "setIncludeViewProviders", "setInjectImplementation", + "setInputsFromAttrs", "setIsRefreshingViews", "setSelectedIndex", "shimStylesContent", diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index 4fe2dde60069..61562fb15c63 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -69,7 +69,6 @@ "IterableDiffers", "KeyEventsPlugin", "LOCALE_ID2", - "LifecycleHooksFeature", "MODIFIER_KEYS", "MODIFIER_KEY_GETTERS", "NAMESPACE_URIS", @@ -240,6 +239,7 @@ "context", "convertToBitFlags", "createDirectivesInstances", + "createDirectivesInstancesInInstruction", "createElementNode", "createElementRef", "createErrorClass", @@ -301,7 +301,6 @@ "getFactoryDef", "getFirstLContainer", "getFirstNativeNode", - "getInitialLViewFlagsFromDef", "getInjectImplementation", "getInjectableDef", "getInjectorDef", @@ -316,7 +315,6 @@ "getNgZoneOptions", "getNodeInjectable", "getNullInjector", - "getOrCreateComponentTView", "getOrCreateInjectable", "getOrCreateNodeInjectorForNode", "getOrCreateTNode", @@ -365,7 +363,6 @@ "instructionState", "internalImportProvidersFrom", "internalProvideZoneChangeDetection", - "invokeDirectivesHostBindings", "invokeHostBindingsInCreationMode", "isAngularZoneProperty", "isApplicationBootstrapConfig", From 6ce8ed7404abdd6241517984bb36ecf26f51c599 Mon Sep 17 00:00:00 2001 From: hawkgs Date: Mon, 20 Jan 2025 13:44:37 +0200 Subject: [PATCH 0159/1220] refactor(devtools): select the root element by default (#59626) Select the application root element when you start Angular DevTools. PR Close #59626 --- .../directive-forest/directive-forest.component.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-forest/directive-forest.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-forest/directive-forest.component.ts index 49382e0da64b..cfbccc4376ce 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-forest/directive-forest.component.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/directive-forest/directive-forest.component.ts @@ -82,6 +82,7 @@ export class DirectiveForestComponent { readonly itemHeight = 18; private _initialized = false; + private _forestRoot: FlatNode | null = null; private resizeObserver: ResizeObserver; private _tabUpdate = inject(TabUpdate); @@ -111,7 +112,8 @@ export class DirectiveForestComponent { const result = this.updateForestResult(); const changed = result.movedItems.length || result.newItems.length || result.removedItems.length; - if (this.currentSelectedElement() && changed) { + + if (changed) { this._reselectNodeOnUpdate(); } }); @@ -196,6 +198,8 @@ export class DirectiveForestComponent { ); if (nodeThatStillExists) { this.select(nodeThatStillExists); + } else if (this._forestRoot) { + this.select(this._forestRoot); } else { this.clearSelectedNode(); } @@ -207,6 +211,8 @@ export class DirectiveForestComponent { removedItems: FlatNode[]; } { const result = this.dataSource.update(forest, this.showCommentNodes()); + this._forestRoot = this.dataSource.data[0]; + if (!this._initialized && forest && forest.length) { this.treeControl.expandAll(); this._initialized = true; From c7b6e1107c6fcc7ed1dbb7c7b8698b09bfa8f1cc Mon Sep 17 00:00:00 2001 From: arturovt Date: Thu, 9 Jan 2025 22:04:46 +0200 Subject: [PATCH 0160/1220] fix(router): prevent error handling when injector is destroyed (#59457) In this commit, we prevent error handling when the root injector is already destroyed. This may happen when the observable completes before emitting a value, which would trigger a `catchError` block that attempts to call `runInInjectionContext` on a destroyed injector. PR Close #59457 --- packages/router/src/navigation_transition.ts | 15 +++++++ packages/router/test/integration.spec.ts | 46 +++++++++++++++++++- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/packages/router/src/navigation_transition.ts b/packages/router/src/navigation_transition.ts index e2d94d8ff3c1..e32ae8c794a2 100644 --- a/packages/router/src/navigation_transition.ts +++ b/packages/router/src/navigation_transition.ts @@ -8,6 +8,7 @@ import {Location} from '@angular/common'; import { + DestroyRef, EnvironmentInjector, inject, Injectable, @@ -354,6 +355,7 @@ export class NavigationTransitions { readonly transitionAbortSubject = new Subject(); private readonly configLoader = inject(RouterConfigLoader); private readonly environmentInjector = inject(EnvironmentInjector); + private readonly destroyRef = inject(DestroyRef); private readonly urlSerializer = inject(UrlSerializer); private readonly rootContexts = inject(ChildrenOutletContexts); private readonly location = inject(Location); @@ -381,11 +383,16 @@ export class NavigationTransitions { /** @internal */ rootComponentType: Type | null = null; + private destroyed = false; + constructor() { const onLoadStart = (r: Route) => this.events.next(new RouteConfigLoadStart(r)); const onLoadEnd = (r: Route) => this.events.next(new RouteConfigLoadEnd(r)); this.configLoader.onLoadEndListener = onLoadEnd; this.configLoader.onLoadStartListener = onLoadStart; + this.destroyRef.onDestroy(() => { + this.destroyed = true; + }); } complete() { @@ -831,6 +838,14 @@ export class NavigationTransitions { } }), catchError((e) => { + // If the application is already destroyed, the catch block should not + // execute anything in practice because other resources have already + // been released and destroyed. + if (this.destroyed) { + overallTransitionState.resolve(false); + return EMPTY; + } + errored = true; /* This error type is issued during Redirect, and is handled as a * cancellation rather than an error. */ diff --git a/packages/router/test/integration.spec.ts b/packages/router/test/integration.spec.ts index ed9ff19743f1..772169d66c69 100644 --- a/packages/router/test/integration.spec.ts +++ b/packages/router/test/integration.spec.ts @@ -25,6 +25,7 @@ import { ViewChildren, ɵConsole as Console, ɵNoopNgZone as NoopNgZone, + DestroyRef, } from '@angular/core'; import {ComponentFixture, fakeAsync, inject, TestBed, tick} from '@angular/core/testing'; import {By} from '@angular/platform-browser/src/dom/debug/by'; @@ -74,7 +75,7 @@ import { UrlTree, } from '@angular/router'; import {RouterTestingHarness} from '@angular/router/testing'; -import {concat, EMPTY, firstValueFrom, Observable, Observer, of, Subscription} from 'rxjs'; +import {concat, EMPTY, firstValueFrom, Observable, Observer, of, Subject, Subscription} from 'rxjs'; import {delay, filter, first, last, map, mapTo, takeWhile, tap} from 'rxjs/operators'; import { @@ -3619,6 +3620,49 @@ for (const browserAPI of ['navigation', 'history'] as const) { }); describe('guards', () => { describe('CanActivate', () => { + describe('guard completes before emitting a value', () => { + @Injectable({providedIn: 'root'}) + class CompletesBeforeEmitting { + private subject$ = new Subject(); + + constructor(destroyRef: DestroyRef) { + destroyRef.onDestroy(() => this.subject$.complete()); + } + + // Note that this is a simple illustrative case of when an observable + // completes without emitting a value. In a real-world scenario, this + // might represent an HTTP request that never emits before the app is + // destroyed and then completes when the app is destroyed. + canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { + return this.subject$; + } + } + + it('should not thrown an unhandled promise rejection', fakeAsync( + inject([Router], async (router: Router) => { + const fixture = createRoot(router, RootCmp); + + const onUnhandledrejection = jasmine.createSpy(); + window.addEventListener('unhandledrejection', onUnhandledrejection); + + router.resetConfig([ + {path: 'team/:id', component: TeamCmp, canActivate: [CompletesBeforeEmitting]}, + ]); + + router.navigateByUrl('/team/22'); + + // This was previously throwing an error `NG0205: Injector has already been destroyed`. + fixture.destroy(); + + // Wait until the event task is dispatched. + await new Promise((resolve) => setTimeout(resolve, 10)); + window.removeEventListener('unhandledrejection', onUnhandledrejection); + + expect(onUnhandledrejection).not.toHaveBeenCalled(); + }), + )); + }); + describe('should not activate a route when CanActivate returns false', () => { beforeEach(() => { TestBed.configureTestingModule({ From 6fc180b3ffe4e776dca32f4bca56b6700b34e5e3 Mon Sep 17 00:00:00 2001 From: arturovt Date: Wed, 15 Jan 2025 23:33:39 +0200 Subject: [PATCH 0161/1220] refactor(common): prevent duplicating `Accept` header name (#59546) Drops some bytes by moving `Accept` into a variable, which is then minified to something like `var a="Accept"` and reused in all the places. PR Close #59546 --- packages/common/http/src/fetch.ts | 12 +++++++++--- packages/common/http/src/request.ts | 8 +++++++- packages/common/http/src/xhr.ts | 12 +++++++++--- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/packages/common/http/src/fetch.ts b/packages/common/http/src/fetch.ts index a5e05d9d199a..c1a82ca8cf39 100644 --- a/packages/common/http/src/fetch.ts +++ b/packages/common/http/src/fetch.ts @@ -11,7 +11,13 @@ import {Observable, Observer} from 'rxjs'; import {HttpBackend} from './backend'; import {HttpHeaders} from './headers'; -import {ACCEPT_HEADER, CONTENT_TYPE_HEADER, HttpRequest, X_REQUEST_URL_HEADER} from './request'; +import { + ACCEPT_HEADER, + ACCEPT_HEADER_VALUE, + CONTENT_TYPE_HEADER, + HttpRequest, + X_REQUEST_URL_HEADER, +} from './request'; import { HTTP_STATUS_CODE_OK, HttpDownloadProgressEvent, @@ -258,8 +264,8 @@ export class FetchBackend implements HttpBackend { req.headers.forEach((name, values) => (headers[name] = values.join(','))); // Add an Accept header if one isn't present already. - if (!req.headers.has('Accept')) { - headers['Accept'] = ACCEPT_HEADER; + if (!req.headers.has(ACCEPT_HEADER)) { + headers[ACCEPT_HEADER] = ACCEPT_HEADER_VALUE; } // Auto-detect the Content-Type header if one isn't present already. diff --git a/packages/common/http/src/request.ts b/packages/common/http/src/request.ts index 0e7b6d557828..45e7a4457125 100644 --- a/packages/common/http/src/request.ts +++ b/packages/common/http/src/request.ts @@ -84,6 +84,12 @@ function isUrlSearchParams(value: any): value is URLSearchParams { */ export const CONTENT_TYPE_HEADER = 'Content-Type'; +/** + * The `Accept` header is an HTTP request header that indicates the media types + * (or content types) the client is willing to receive from the server. + */ +export const ACCEPT_HEADER = 'Accept'; + /** * `X-Request-URL` is a custom HTTP header used in older browser versions, * including Firefox (< 32), Chrome (< 37), Safari (< 8), and Internet Explorer, @@ -110,7 +116,7 @@ export const JSON_CONTENT_TYPE = 'application/json'; * to accept from the server, with a preference for `application/json` and `text/plain`, * but also accepting any other type (*\/*). */ -export const ACCEPT_HEADER = `${JSON_CONTENT_TYPE}, ${TEXT_CONTENT_TYPE}, */*`; +export const ACCEPT_HEADER_VALUE = `${JSON_CONTENT_TYPE}, ${TEXT_CONTENT_TYPE}, */*`; /** * An outgoing HTTP request with an optional typed body. diff --git a/packages/common/http/src/xhr.ts b/packages/common/http/src/xhr.ts index 8c481e78b9c0..71c115591f36 100644 --- a/packages/common/http/src/xhr.ts +++ b/packages/common/http/src/xhr.ts @@ -14,7 +14,13 @@ import {switchMap} from 'rxjs/operators'; import {HttpBackend} from './backend'; import {RuntimeErrorCode} from './errors'; import {HttpHeaders} from './headers'; -import {ACCEPT_HEADER, CONTENT_TYPE_HEADER, HttpRequest, X_REQUEST_URL_HEADER} from './request'; +import { + ACCEPT_HEADER, + ACCEPT_HEADER_VALUE, + CONTENT_TYPE_HEADER, + HttpRequest, + X_REQUEST_URL_HEADER, +} from './request'; import { HTTP_STATUS_CODE_NO_CONTENT, HTTP_STATUS_CODE_OK, @@ -97,8 +103,8 @@ export class HttpXhrBackend implements HttpBackend { req.headers.forEach((name, values) => xhr.setRequestHeader(name, values.join(','))); // Add an Accept header if one isn't present already. - if (!req.headers.has('Accept')) { - xhr.setRequestHeader('Accept', ACCEPT_HEADER); + if (!req.headers.has(ACCEPT_HEADER)) { + xhr.setRequestHeader(ACCEPT_HEADER, ACCEPT_HEADER_VALUE); } // Auto-detect the Content-Type header if one isn't present already. From 8897e96fa69964d70aa762031ba641e55686916e Mon Sep 17 00:00:00 2001 From: arturovt Date: Sun, 19 Jan 2025 12:10:39 +0200 Subject: [PATCH 0162/1220] refactor(core): prevent duplicating `componentOffset` checks (#59611) The `type_checks` module already exposes a utility function that checks whether `TNode.componentOffset` is greater than -1. There is no need to check that property manually in other places, as we can reuse the helper function. PR Close #59611 --- packages/core/src/render3/context_discovery.ts | 5 ++--- packages/core/src/render3/instructions/listener.ts | 5 ++--- packages/core/src/render3/node_manipulation.ts | 7 +++---- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/packages/core/src/render3/context_discovery.ts b/packages/core/src/render3/context_discovery.ts index 26fbe9d16348..b59c11375a29 100644 --- a/packages/core/src/render3/context_discovery.ts +++ b/packages/core/src/render3/context_discovery.ts @@ -15,7 +15,7 @@ import {LContext} from './interfaces/context'; import {getLViewById, registerLView} from './interfaces/lview_tracking'; import {TNode} from './interfaces/node'; import {RElement, RNode} from './interfaces/renderer_dom'; -import {isLView} from './interfaces/type_checks'; +import {isComponentHost, isLView} from './interfaces/type_checks'; import {CONTEXT, HEADER_OFFSET, HOST, ID, LView, TVIEW} from './interfaces/view'; import {getComponentLViewByIndex, unwrapRNode} from './util/view_utils'; @@ -331,8 +331,7 @@ export function getDirectivesAtNodeIndex(nodeIndex: number, lView: LView): any[] export function getComponentAtNodeIndex(nodeIndex: number, lView: LView): {} | null { const tNode = lView[TVIEW].data[nodeIndex] as TNode; - const {directiveStart, componentOffset} = tNode; - return componentOffset > -1 ? lView[directiveStart + componentOffset] : null; + return isComponentHost(tNode) ? lView[tNode.directiveStart + tNode.componentOffset] : null; } /** diff --git a/packages/core/src/render3/instructions/listener.ts b/packages/core/src/render3/instructions/listener.ts index cbfdfe92ed91..d54c4e511ce8 100644 --- a/packages/core/src/render3/instructions/listener.ts +++ b/packages/core/src/render3/instructions/listener.ts @@ -13,7 +13,7 @@ import {assertIndexInRange} from '../../util/assert'; import {NodeOutputBindings, TNode, TNodeType} from '../interfaces/node'; import {GlobalTargetResolver, Renderer} from '../interfaces/renderer'; import {RElement} from '../interfaces/renderer_dom'; -import {isDirectiveHost} from '../interfaces/type_checks'; +import {isComponentHost, isDirectiveHost} from '../interfaces/type_checks'; import {CLEANUP, CONTEXT, LView, RENDERER, TView} from '../interfaces/view'; import {assertTNodeType} from '../node_assert'; import {profiler} from '../profiler'; @@ -305,8 +305,7 @@ function wrapListener( // In order to be backwards compatible with View Engine, events on component host nodes // must also mark the component view itself dirty (i.e. the view that it owns). - const startView = - tNode.componentOffset > -1 ? getComponentLViewByIndex(tNode.index, lView) : lView; + const startView = isComponentHost(tNode) ? getComponentLViewByIndex(tNode.index, lView) : lView; markViewDirty(startView, NotificationSource.Listener); let result = executeListenerWithErrorHandling(lView, context, listenerFn, e); diff --git a/packages/core/src/render3/node_manipulation.ts b/packages/core/src/render3/node_manipulation.ts index 437155884dfc..6c45399901de 100644 --- a/packages/core/src/render3/node_manipulation.ts +++ b/packages/core/src/render3/node_manipulation.ts @@ -51,7 +51,7 @@ import { } from './interfaces/node'; import {Renderer} from './interfaces/renderer'; import {RElement, RNode} from './interfaces/renderer_dom'; -import {isDestroyed, isLContainer, isLView} from './interfaces/type_checks'; +import {isComponentHost, isDestroyed, isLContainer, isLView} from './interfaces/type_checks'; import { CHILD_HEAD, CLEANUP, @@ -632,11 +632,10 @@ export function getClosestRElement( return lView[HOST]; } else { ngDevMode && assertTNodeType(parentTNode, TNodeType.AnyRNode | TNodeType.Container); - const {componentOffset} = parentTNode; - if (componentOffset > -1) { + if (isComponentHost(parentTNode)) { ngDevMode && assertTNodeForLView(parentTNode, lView); const {encapsulation} = tView.data[ - parentTNode.directiveStart + componentOffset + parentTNode.directiveStart + parentTNode.componentOffset ] as ComponentDef; // We've got a parent which is an element in the current view. We just need to verify if the // parent element is not a component. Component's content nodes are not inserted immediately From f68e81ea2c50606d44a078e78cb5ce8f9e6269ec Mon Sep 17 00:00:00 2001 From: Ezequiel Cicala Date: Thu, 23 Jan 2025 09:04:16 -0300 Subject: [PATCH 0163/1220] docs: add another missing word on components-scenarios.md (#59680) PR Close #59680 --- adev/src/content/guide/testing/components-scenarios.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adev/src/content/guide/testing/components-scenarios.md b/adev/src/content/guide/testing/components-scenarios.md index ff10991b42ae..307cbb4d1b0d 100644 --- a/adev/src/content/guide/testing/components-scenarios.md +++ b/adev/src/content/guide/testing/components-scenarios.md @@ -83,7 +83,7 @@ The first test shows the benefit of automatic change detection. The second and third test reveal an important limitation. The Angular testing environment does not run change detection synchronously when updates happen inside the test case that changed the component's `title`. -The test must call `await fixture.whenStable` to wait for another of change detection. +The test must call `await fixture.whenStable` to wait for another round of change detection. HELPFUL: Angular does not know about direct updates to values that are not signals. The easiest way to ensure that change detection will be scheduled is to use signals for values read in the template. From 6d9bc7654d28df447d1387e598ee0d64eed1bb26 Mon Sep 17 00:00:00 2001 From: Ezequiel Cicala Date: Mon, 20 Jan 2025 08:13:04 -0300 Subject: [PATCH 0164/1220] docs: add missing word on components-scenarios.md (#59681) PR Close #59681 --- adev/src/content/guide/testing/components-scenarios.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adev/src/content/guide/testing/components-scenarios.md b/adev/src/content/guide/testing/components-scenarios.md index 307cbb4d1b0d..abdcd6d8df59 100644 --- a/adev/src/content/guide/testing/components-scenarios.md +++ b/adev/src/content/guide/testing/components-scenarios.md @@ -554,7 +554,7 @@ It confirms that the selected `DashboardHeroComponent` hero really does find its A *routing component* is a component that tells the `Router` to navigate to another component. The `DashboardComponent` is a *routing component* because the user can navigate to the `HeroDetailComponent` by clicking on one of the *hero buttons* on the dashboard. -Angular provides test helpers to reduce boilerplate and more effectively test code which depends `HttpClient`. The `provideRouter` function can be used directly in the test module as well. +Angular provides test helpers to reduce boilerplate and more effectively test code which depends on `HttpClient`. The `provideRouter` function can be used directly in the test module as well. From 3f53dd1129fad831b0ce1d918500d38c46e7c4f0 Mon Sep 17 00:00:00 2001 From: Doug Parker Date: Thu, 23 Jan 2025 11:30:18 -0800 Subject: [PATCH 0165/1220] docs: sort `application` and `browser-esbuild` builders first (#59686) This emphasizes these as the default/preferred options over `browser` builder. PR Close #59686 --- adev/src/content/tools/cli/build.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/adev/src/content/tools/cli/build.md b/adev/src/content/tools/cli/build.md index 426835b46329..fdc0469c5564 100644 --- a/adev/src/content/tools/cli/build.md +++ b/adev/src/content/tools/cli/build.md @@ -8,9 +8,9 @@ Angular CLI includes four builders typically used as `build` targets: | Builder | Purpose | | ----------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `@angular-devkit/build-angular:browser` | Bundles a client-side application for use in a browser with [webpack](https://webpack.js.org/). | -| `@angular-devkit/build-angular:browser-esbuild` | Bundles a client-side application for use in a browser with [esbuild](https://esbuild.github.io/). See [`browser-esbuild` documentation](tools/cli/build-system-migration#manual-migration-to-the-compatibility-builder) for more information. | | `@angular-devkit/build-angular:application` | Builds an application with a client-side bundle, a Node server, and build-time prerendered routes with [esbuild](https://esbuild.github.io/). | +| `@angular-devkit/build-angular:browser-esbuild` | Bundles a client-side application for use in a browser with [esbuild](https://esbuild.github.io/). See [`browser-esbuild` documentation](tools/cli/build-system-migration#manual-migration-to-the-compatibility-builder) for more information. | +| `@angular-devkit/build-angular:browser` | Bundles a client-side application for use in a browser with [webpack](https://webpack.js.org/). | | `@angular-devkit/build-angular:ng-packagr` | Builds an Angular library adhering to [Angular Package Format](tools/libraries/angular-package-format). | Applications generated by `ng new` use `@angular-devkit/build-angular:application` by default. From 819795bf51e44871bd3d7f9a4ad15e34029cdba6 Mon Sep 17 00:00:00 2001 From: Ezequiel Cicala Date: Thu, 23 Jan 2025 17:50:54 -0300 Subject: [PATCH 0166/1220] docs: replace word in using-component-harnesses.md (#59687) PR Close #59687 --- adev/src/content/guide/testing/using-component-harnesses.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adev/src/content/guide/testing/using-component-harnesses.md b/adev/src/content/guide/testing/using-component-harnesses.md index 3eaae5847f42..690f416e7421 100644 --- a/adev/src/content/guide/testing/using-component-harnesses.md +++ b/adev/src/content/guide/testing/using-component-harnesses.md @@ -61,7 +61,7 @@ const myComponentHarness = await loader.getHarness(MyComponent); Harness loader instances correspond to a specific DOM element and are used to create component harness instances for elements under that specific element. -To get `ComponentHarness` for the first instance of the element, use the `getHarness()` method. You get all `ComponentHarness` instances, use the `getAllHarnesses()` method. +To get `ComponentHarness` for the first instance of the element, use the `getHarness()` method. To get all `ComponentHarness` instances, use the `getAllHarnesses()` method. // Get harness for first instance of the element From e4838310c93ed9bd8ce621098cfaf923df4cc118 Mon Sep 17 00:00:00 2001 From: arturovt Date: Sun, 12 Jan 2025 18:48:40 +0200 Subject: [PATCH 0167/1220] refactor(forms): wrap `_checkParentType` with `ngDevMode` (#59489) The `_checkParentType` bodies are wrapped with `ngDevMode`, meaning they act as no-ops in production. We can wrap the actual calls to `_checkParentType` with `ngDevMode` to prevent calling no-op functions in production PR Close #59489 --- packages/forms/src/directives/ng_model.ts | 2 +- .../src/directives/reactive_directives/form_control_name.ts | 4 +++- .../src/directives/reactive_directives/form_group_name.ts | 4 +++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/forms/src/directives/ng_model.ts b/packages/forms/src/directives/ng_model.ts index 1140157d917d..083e35a66e7e 100644 --- a/packages/forms/src/directives/ng_model.ts +++ b/packages/forms/src/directives/ng_model.ts @@ -333,7 +333,7 @@ export class NgModel extends NgControl implements OnChanges, OnDestroy { } private _checkForErrors(): void { - if (!this._isStandalone()) { + if ((typeof ngDevMode === 'undefined' || ngDevMode) && !this._isStandalone()) { this._checkParentType(); } this._checkName(); diff --git a/packages/forms/src/directives/reactive_directives/form_control_name.ts b/packages/forms/src/directives/reactive_directives/form_control_name.ts index 45874e94cd1f..afd7af2d770f 100644 --- a/packages/forms/src/directives/reactive_directives/form_control_name.ts +++ b/packages/forms/src/directives/reactive_directives/form_control_name.ts @@ -231,7 +231,9 @@ export class FormControlName extends NgControl implements OnChanges, OnDestroy { } private _setUpControl() { - this._checkParentType(); + if (typeof ngDevMode === 'undefined' || ngDevMode) { + this._checkParentType(); + } (this as Writable).control = this.formDirective.addControl(this); this._added = true; } diff --git a/packages/forms/src/directives/reactive_directives/form_group_name.ts b/packages/forms/src/directives/reactive_directives/form_group_name.ts index 35deb9d18f60..0c0bbde27eae 100644 --- a/packages/forms/src/directives/reactive_directives/form_group_name.ts +++ b/packages/forms/src/directives/reactive_directives/form_group_name.ts @@ -190,7 +190,9 @@ export class FormArrayName extends ControlContainer implements OnInit, OnDestroy * @nodoc */ ngOnInit(): void { - this._checkParentType(); + if (typeof ngDevMode === 'undefined' || ngDevMode) { + this._checkParentType(); + } this.formDirective!.addFormArray(this); } From 434568ba28cff5cb4a19b87c43db6e3908ec4190 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Fri, 24 Jan 2025 10:30:03 +0000 Subject: [PATCH 0168/1220] docs: update Angular CLI help [main] (#59699) Updated Angular CLI help contents. PR Close #59699 --- adev/src/content/cli/help/build-info.json | 2 +- adev/src/content/cli/help/serve.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/adev/src/content/cli/help/build-info.json b/adev/src/content/cli/help/build-info.json index 363d37326b30..72b6d7d10c1f 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": "c1ba45fbdad011f8df4f2bc3cc03918a38026d0c" + "sha": "a1e4ec30c9b380e5615e1a75ea8b896986b836f3" } \ No newline at end of file diff --git a/adev/src/content/cli/help/serve.json b/adev/src/content/cli/help/serve.json index 4fd0b971b2f9..20882c5cf73f 100644 --- a/adev/src/content/cli/help/serve.json +++ b/adev/src/content/cli/help/serve.json @@ -11,7 +11,7 @@ { "name": "allowed-hosts", "type": "array", - "description": "List of hosts that are allowed to access the dev server. This option has no effect when using the 'application' or other esbuild-based builders." + "description": "List of hosts that are allowed to access the dev server." }, { "name": "build-target", @@ -30,7 +30,7 @@ "name": "disable-host-check", "type": "boolean", "default": false, - "description": "Don't verify connected clients are part of allowed hosts. This option has no effect when using the 'application' or other esbuild-based builders." + "description": "Don't verify connected clients are part of allowed hosts." }, { "name": "force-esbuild", From edb8407d4f1a93efe316baff2f6a1da482d0e4fb Mon Sep 17 00:00:00 2001 From: arturovt Date: Fri, 24 Jan 2025 12:15:49 +0200 Subject: [PATCH 0169/1220] refactor(common): simplify null/undefined check in `keyvalue` pipe (#59696) In this commit, we remove the separate `a === undefined` and `a === null` checks and replace them with `a == null`. Using `a == null` is better and more concise because it checks for both `null` and `undefined` in a single operation. The loose equality `==` is specifically designed to treat `null` and `undefined` as equivalent. This change only reduces some bytes in the code and simplifies it, with no performance impact, as modern JavaScript engines handle `a == null` efficiently. Additionally, comments have been added for clarification. PR Close #59696 --- packages/common/src/pipes/keyvalue_pipe.ts | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/common/src/pipes/keyvalue_pipe.ts b/packages/common/src/pipes/keyvalue_pipe.ts index 2dca5f94c3de..4df4f18d9b70 100644 --- a/packages/common/src/pipes/keyvalue_pipe.ts +++ b/packages/common/src/pipes/keyvalue_pipe.ts @@ -132,25 +132,26 @@ export function defaultComparator( ): number { const a = keyValueA.key; const b = keyValueB.key; - // if same exit with 0; + // If both keys are the same, return 0 (no sorting needed). if (a === b) return 0; - // make sure that undefined are at the end of the sort. - if (a === undefined) return 1; - if (b === undefined) return -1; - // make sure that nulls are at the end of the sort. - if (a === null) return 1; - if (b === null) return -1; + // If one of the keys is `null` or `undefined`, place it at the end of the sort. + if (a == null) return 1; // `a` comes after `b`. + if (b == null) return -1; // `b` comes after `a`. + // If both keys are strings, compare them lexicographically. if (typeof a == 'string' && typeof b == 'string') { return a < b ? -1 : 1; } + // If both keys are numbers, sort them numerically. if (typeof a == 'number' && typeof b == 'number') { return a - b; } + // If both keys are booleans, sort `false` before `true`. if (typeof a == 'boolean' && typeof b == 'boolean') { return a < b ? -1 : 1; } - // `a` and `b` are of different types. Compare their string values. + // Fallback case: if keys are of different types, compare their string representations. const aString = String(a); const bString = String(b); + // Compare the string representations lexicographically. return aString == bString ? 0 : aString < bString ? -1 : 1; } From 168516462a9673b158fcaa38b8ce17bf684a8ac9 Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Tue, 21 Jan 2025 13:22:51 -0800 Subject: [PATCH 0170/1220] feat(core): support default value in `resource()` (#59655) Before `resource()` resolves, its value is in an unknown state. By default it returns `undefined` in these scenarios, so the type of `.value()` includes `undefined`. This commit adds a `defaultValue` option to `resource()` and `rxResource()` which overrides this default. When provided, an unresolved resource will return this value instead of `undefined`, which simplifies the typing of `.value()`. PR Close #59655 --- goldens/public-api/core/index.api.md | 6 ++++ .../public-api/core/rxjs-interop/index.api.md | 5 ++++ packages/core/rxjs-interop/src/rx_resource.ts | 13 ++++++++- packages/core/src/resource/api.ts | 6 ++++ packages/core/src/resource/resource.ts | 17 ++++++++++- packages/core/test/resource/resource_spec.ts | 28 +++++++++++++++++++ 6 files changed, 73 insertions(+), 2 deletions(-) diff --git a/goldens/public-api/core/index.api.md b/goldens/public-api/core/index.api.md index 7efb933205b5..ec143fda7330 100644 --- a/goldens/public-api/core/index.api.md +++ b/goldens/public-api/core/index.api.md @@ -186,6 +186,7 @@ export interface AttributeDecorator { // @public export interface BaseResourceOptions { + defaultValue?: NoInfer; equal?: ValueEqualityFn; injector?: Injector; request?: () => R; @@ -1604,6 +1605,11 @@ export interface Resource { readonly value: Signal; } +// @public +export function resource(options: ResourceOptions & { + defaultValue: NoInfer; +}): ResourceRef; + // @public export function resource(options: ResourceOptions): ResourceRef; diff --git a/goldens/public-api/core/rxjs-interop/index.api.md b/goldens/public-api/core/rxjs-interop/index.api.md index 58338349d6a3..02ff5112de8b 100644 --- a/goldens/public-api/core/rxjs-interop/index.api.md +++ b/goldens/public-api/core/rxjs-interop/index.api.md @@ -26,6 +26,11 @@ export function outputToObservable(ref: OutputRef): Observable; // @public export function pendingUntilEvent(injector?: Injector): MonoTypeOperatorFunction; +// @public +export function rxResource(opts: RxResourceOptions & { + defaultValue: NoInfer; +}): ResourceRef; + // @public export function rxResource(opts: RxResourceOptions): ResourceRef; diff --git a/packages/core/rxjs-interop/src/rx_resource.ts b/packages/core/rxjs-interop/src/rx_resource.ts index 37b661b1c267..805eeaa46304 100644 --- a/packages/core/rxjs-interop/src/rx_resource.ts +++ b/packages/core/rxjs-interop/src/rx_resource.ts @@ -28,10 +28,21 @@ export interface RxResourceOptions extends BaseResourceOptions { /** * Like `resource` but uses an RxJS based `loader` which maps the request to an `Observable` of the - * resource's value. Like `firstValueFrom`, only the first emission of the Observable is considered. + * resource's value. * * @experimental */ +export function rxResource( + opts: RxResourceOptions & {defaultValue: NoInfer}, +): ResourceRef; + +/** + * Like `resource` but uses an RxJS based `loader` which maps the request to an `Observable` of the + * resource's value. + * + * @experimental + */ +export function rxResource(opts: RxResourceOptions): ResourceRef; export function rxResource(opts: RxResourceOptions): ResourceRef { opts?.injector || assertInInjectionContext(rxResource); return resource({ diff --git a/packages/core/src/resource/api.ts b/packages/core/src/resource/api.ts index d7337a203177..6464dc1218ff 100644 --- a/packages/core/src/resource/api.ts +++ b/packages/core/src/resource/api.ts @@ -183,6 +183,12 @@ export interface BaseResourceOptions { */ request?: () => R; + /** + * The value which will be returned from the resource when a server value is unavailable, such as + * when the resource is still loading, or in an error state. + */ + defaultValue?: NoInfer; + /** * Equality function used to compare the return value of the loader. */ diff --git a/packages/core/src/resource/resource.ts b/packages/core/src/resource/resource.ts index 6a2ae0e542c7..be975f56d20d 100644 --- a/packages/core/src/resource/resource.ts +++ b/packages/core/src/resource/resource.ts @@ -40,13 +40,28 @@ import {DestroyRef} from '../linker/destroy_ref'; * * @experimental */ +export function resource( + options: ResourceOptions & {defaultValue: NoInfer}, +): ResourceRef; + +/** + * Constructs a `Resource` that projects a reactive request to an asynchronous operation defined by + * a loader function, which exposes the result of the loading operation via signals. + * + * Note that `resource` is intended for _read_ operations, not operations which perform mutations. + * `resource` will cancel in-progress loads via the `AbortSignal` when destroyed or when a new + * request object becomes available, which could prematurely abort mutations. + * + * @experimental + */ +export function resource(options: ResourceOptions): ResourceRef; export function resource(options: ResourceOptions): ResourceRef { options?.injector || assertInInjectionContext(resource); const request = (options.request ?? (() => null)) as () => R; return new ResourceImpl( request, getLoader(options), - undefined, + options.defaultValue, options.equal ? wrapEqualityFn(options.equal) : undefined, options.injector ?? inject(Injector), ); diff --git a/packages/core/test/resource/resource_spec.ts b/packages/core/test/resource/resource_spec.ts index bc760e910456..29dc60062ec0 100644 --- a/packages/core/test/resource/resource_spec.ts +++ b/packages/core/test/resource/resource_spec.ts @@ -161,6 +161,34 @@ describe('resource', () => { expect(echoResource.error()).toEqual(Error('KO')); }); + it('should return a default value if provided', async () => { + const DEFAULT: string[] = []; + const request = signal(0); + const res = resource({ + request, + loader: async ({request}) => { + if (request === 2) { + throw new Error('err'); + } + return ['data']; + }, + defaultValue: DEFAULT, + injector: TestBed.inject(Injector), + }); + expect(res.value()).toBe(DEFAULT); + + await TestBed.inject(ApplicationRef).whenStable(); + expect(res.value()).not.toBe(DEFAULT); + + request.set(1); + expect(res.value()).toBe(DEFAULT); + + request.set(2); + await TestBed.inject(ApplicationRef).whenStable(); + expect(res.error()).not.toBeUndefined(); + expect(res.value()).toBe(DEFAULT); + }); + it('should _not_ load if the request resolves to undefined', () => { const counter = signal(0); const backend = new MockEchoBackend(); From e2716390228f10f85ef4ba7f5c929fa8fcc1bf4f Mon Sep 17 00:00:00 2001 From: arturovt Date: Wed, 22 Jan 2025 19:33:37 +0200 Subject: [PATCH 0171/1220] refactor(core): re-use `isDetachedByI18n` (#59668) We already have a function called `isDetachedByI18n` which checks whether a `tNode` is in `isDetached` state; as thus, there's no reason to apply those checks manually. PR Close #59668 --- packages/core/src/render3/instructions/projection.ts | 8 +++----- packages/core/src/render3/node_manipulation.ts | 3 ++- .../animations-standalone/bundle.golden_symbols.json | 1 + .../test/bundling/animations/bundle.golden_symbols.json | 1 + .../bundling/cyclic_import/bundle.golden_symbols.json | 1 + .../core/test/bundling/defer/bundle.golden_symbols.json | 1 + .../bundling/forms_reactive/bundle.golden_symbols.json | 1 + .../forms_template_driven/bundle.golden_symbols.json | 1 + .../test/bundling/hello_world/bundle.golden_symbols.json | 1 + .../core/test/bundling/router/bundle.golden_symbols.json | 1 + .../standalone_bootstrap/bundle.golden_symbols.json | 1 + .../core/test/bundling/todo/bundle.golden_symbols.json | 1 + 12 files changed, 15 insertions(+), 6 deletions(-) diff --git a/packages/core/src/render3/instructions/projection.ts b/packages/core/src/render3/instructions/projection.ts index 1c75979e179b..3c2e3fcfe208 100644 --- a/packages/core/src/render3/instructions/projection.ts +++ b/packages/core/src/render3/instructions/projection.ts @@ -6,10 +6,11 @@ * found in the LICENSE file at https://angular.dev/license */ import {findMatchingDehydratedView} from '../../hydration/views'; +import {isDetachedByI18n} from '../../i18n/utils'; import {newArray} from '../../util/array_utils'; import {assertLContainer, assertTNode} from '../assert'; import {ComponentTemplate} from '../interfaces/definition'; -import {TAttributes, TElementNode, TNode, TNodeFlags, TNodeType} from '../interfaces/node'; +import {TAttributes, TElementNode, TNode, TNodeType} from '../interfaces/node'; import {ProjectionSlots} from '../interfaces/projection'; import { DECLARATION_COMPONENT_VIEW, @@ -200,10 +201,7 @@ export function ɵɵprojection( if (isEmpty && fallbackIndex !== null) { insertFallbackContent(lView, tView, fallbackIndex); - } else if ( - isNodeCreationMode && - (tProjectionNode.flags & TNodeFlags.isDetached) !== TNodeFlags.isDetached - ) { + } else if (isNodeCreationMode && !isDetachedByI18n(tProjectionNode)) { // re-distribution of projectable nodes is stored on a component's view level applyProjection(tView, lView, tProjectionNode); } diff --git a/packages/core/src/render3/node_manipulation.ts b/packages/core/src/render3/node_manipulation.ts index 6c45399901de..f8d1b25f9c47 100644 --- a/packages/core/src/render3/node_manipulation.ts +++ b/packages/core/src/render3/node_manipulation.ts @@ -92,6 +92,7 @@ import { nativeInsertBefore, nativeRemoveNode, } from './dom_node_manipulation'; +import {isDetachedByI18n} from '../i18n/utils'; const enum WalkTNodeTreeAction { /** node create in the native environment. Run on initial creation. */ @@ -890,7 +891,7 @@ function applyNodes( tNode.flags |= TNodeFlags.isProjected; } } - if ((tNode.flags & TNodeFlags.isDetached) !== TNodeFlags.isDetached) { + if (!isDetachedByI18n(tNode)) { if (tNodeType & TNodeType.ElementContainer) { applyNodes(renderer, action, tNode.child, lView, parentRElement, beforeNode, false); applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode); 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 2c3d7c96fef0..aea3548ba26e 100644 --- a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json @@ -366,6 +366,7 @@ "isCssClassMatching", "isCurrentTNodeParent", "isDestroyed", + "isDetachedByI18n", "isElementNode", "isEnvironmentProviders", "isFunction", diff --git a/packages/core/test/bundling/animations/bundle.golden_symbols.json b/packages/core/test/bundling/animations/bundle.golden_symbols.json index 8939ba2f4ade..8825c5ae7289 100644 --- a/packages/core/test/bundling/animations/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations/bundle.golden_symbols.json @@ -389,6 +389,7 @@ "isCssClassMatching", "isCurrentTNodeParent", "isDestroyed", + "isDetachedByI18n", "isElementNode", "isEnvironmentProviders", "isFunction", 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 64603b671133..c165a818997d 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -311,6 +311,7 @@ "isCssClassMatching", "isCurrentTNodeParent", "isDestroyed", + "isDetachedByI18n", "isEnvironmentProviders", "isFunction", "isInlineTemplate", diff --git a/packages/core/test/bundling/defer/bundle.golden_symbols.json b/packages/core/test/bundling/defer/bundle.golden_symbols.json index a9f2d40a045c..ccd83c6b2b72 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -764,6 +764,7 @@ "isCssClassMatching", "isCurrentTNodeParent", "isDestroyed", + "isDetachedByI18n", "isDirectiveHost", "isEnvironmentProviders", "isFunction", 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 8fa6e2b35f7e..2e13edb57643 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -455,6 +455,7 @@ "isCssClassMatching", "isCurrentTNodeParent", "isDestroyed", + "isDetachedByI18n", "isDirectiveHost", "isEmptyInputValue", "isEnvironmentProviders", 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 11f33d82d745..3eab75f0c49a 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 @@ -441,6 +441,7 @@ "isCssClassMatching", "isCurrentTNodeParent", "isDestroyed", + "isDetachedByI18n", "isDirectiveHost", "isEnvironmentProviders", "isFormControlState", 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 f4a3926af840..92fa0dd0dfd7 100644 --- a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json @@ -247,6 +247,7 @@ "isComponentDef", "isComponentHost", "isDestroyed", + "isDetachedByI18n", "isEnvironmentProviders", "isFunction", "isInlineTemplate", diff --git a/packages/core/test/bundling/router/bundle.golden_symbols.json b/packages/core/test/bundling/router/bundle.golden_symbols.json index 7f5e21d9a6d2..8582cf62ec2b 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -531,6 +531,7 @@ "isCssClassMatching", "isCurrentTNodeParent", "isDestroyed", + "isDetachedByI18n", "isDirectiveHost", "isEmptyError", "isEnvironmentProviders", 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 c9453f089949..a9e5cc7d03a7 100644 --- a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json +++ b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json @@ -276,6 +276,7 @@ "isComponentDef", "isComponentHost", "isDestroyed", + "isDetachedByI18n", "isEnvironmentProviders", "isFunction", "isInlineTemplate", diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index 61562fb15c63..b8c8c6f4507d 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -372,6 +372,7 @@ "isCssClassMatching", "isCurrentTNodeParent", "isDestroyed", + "isDetachedByI18n", "isDirectiveHost", "isEnvironmentProviders", "isFunction", From d634ca76338a9aa4bf0081718673dda3173189d0 Mon Sep 17 00:00:00 2001 From: arturovt Date: Sat, 11 Jan 2025 19:02:57 +0200 Subject: [PATCH 0172/1220] refactor(common): simplify `joinWithSlash` (#59484) The new version is 2x smaller in the reduced code size; as thus this eliminates extra bytes. Refactors `joinWithSlash` function to reduce code size and improve readability. Added checks to handle leading and trailing slashes more concisely and provided comments for clarity. PR Close #59484 --- packages/common/src/directives/ng_switch.ts | 4 --- packages/common/src/location/util.ts | 28 +++++++-------------- 2 files changed, 9 insertions(+), 23 deletions(-) diff --git a/packages/common/src/directives/ng_switch.ts b/packages/common/src/directives/ng_switch.ts index ae9de788273c..1ad19b45f12c 100644 --- a/packages/common/src/directives/ng_switch.ts +++ b/packages/common/src/directives/ng_switch.ts @@ -268,7 +268,3 @@ function throwNgSwitchProviderNotFoundError(attrName: string, directiveName: str `(matching "NgSwitch" directive)`, ); } - -function stringifyValue(value: unknown): string { - return typeof value === 'string' ? `'${value}'` : String(value); -} diff --git a/packages/common/src/location/util.ts b/packages/common/src/location/util.ts index 50b8b4b1ea66..b5c8f7e11187 100644 --- a/packages/common/src/location/util.ts +++ b/packages/common/src/location/util.ts @@ -15,27 +15,17 @@ * * @returns The joined URL string. */ -export function joinWithSlash(start: string, end: string): string { - if (start.length == 0) { - return end; - } - if (end.length == 0) { - return start; - } - let slashes = 0; +export function joinWithSlash(start: string, end: string) { + // If `start` is an empty string, return `end` as the result. + if (!start) return end; + // If `end` is an empty string, return `start` as the result. + if (!end) return start; + // If `start` ends with a slash, remove the leading slash from `end`. if (start.endsWith('/')) { - slashes++; - } - if (end.startsWith('/')) { - slashes++; - } - if (slashes == 2) { - return start + end.substring(1); - } - if (slashes == 1) { - return start + end; + return end.startsWith('/') ? start + end.slice(1) : start + end; } - return start + '/' + end; + // If `start` doesn't end with a slash, add one if `end` doesn't start with a slash. + return end.startsWith('/') ? start + end : `${start}/${end}`; } /** From 82876242e557abbced793cff06c4d68c4721e6d2 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Fri, 24 Jan 2025 12:39:36 +0100 Subject: [PATCH 0173/1220] fix(core): ensure type is preserved during HMR (#59700) Fixes an internal HMR issue where the type might be replaced when swapping out the definition. Externally this is a no-op. PR Close #59700 --- packages/core/src/render3/hmr.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/core/src/render3/hmr.ts b/packages/core/src/render3/hmr.ts index 06b1846c550a..bd3641ba52c5 100644 --- a/packages/core/src/render3/hmr.ts +++ b/packages/core/src/render3/hmr.ts @@ -116,6 +116,11 @@ function mergeWithExistingDefinition( // Preserve the old `setInput` function, because it has some state. // This is fine, because the component instance is preserved as well. setInput: clone.setInput, + + // Externally this is redundant since we redeclare the definition using the original type. + // Internally we may receive a definition with an alternate, but identical, type so we have + // to ensure that the original one is preserved. + type: clone.type, }); ngDevMode && assertEqual(replacement, currentDef, 'Expected definition to be merged in place'); From 10cdf0afae5612183ccd866764781eb394aff6b8 Mon Sep 17 00:00:00 2001 From: arturovt Date: Wed, 8 Jan 2025 19:55:22 +0200 Subject: [PATCH 0174/1220] refactor(common): tree-shake `PreloadLinkCreator` for client bundles (#59431) In this commit, we tree-shake the `PreloadLinkCreator` for client bundles because it's targeting only server code. We use the pending tasks service to contribute to app stability by waiting for the module to load. PR Close #59431 --- .../ng_optimized_image/ng_optimized_image.ts | 18 +- .../directives/ng_optimized_image_spec.ts | 269 ++++++++++-------- 2 files changed, 157 insertions(+), 130 deletions(-) diff --git a/packages/common/src/directives/ng_optimized_image/ng_optimized_image.ts b/packages/common/src/directives/ng_optimized_image/ng_optimized_image.ts index 99d3f87a5760..d63440640afc 100644 --- a/packages/common/src/directives/ng_optimized_image/ng_optimized_image.ts +++ b/packages/common/src/directives/ng_optimized_image/ng_optimized_image.ts @@ -17,7 +17,6 @@ import { numberAttribute, OnChanges, OnInit, - PLATFORM_ID, Renderer2, SimpleChanges, ɵformatRuntimeError as formatRuntimeError, @@ -34,7 +33,6 @@ import { } from '@angular/core'; import {RuntimeErrorCode} from '../../errors'; -import {isPlatformServer} from '../../platform_id'; import {imgDirectiveDetails} from './error_helper'; import {cloudinaryLoaderInfo} from './image_loaders/cloudinary_loader'; @@ -290,8 +288,6 @@ export class NgOptimizedImage implements OnInit, OnChanges { private renderer = inject(Renderer2); private imgElement: HTMLImageElement = inject(ElementRef).nativeElement; private injector = inject(Injector); - private readonly isServer = isPlatformServer(inject(PLATFORM_ID)); - private readonly preloadLinkCreator = inject(PreloadLinkCreator); // An LCP image observer should be injected only in development mode. // Do not assign it to `null` to avoid having a redundant property in the production bundle. @@ -468,7 +464,7 @@ export class NgOptimizedImage implements OnInit, OnChanges { const checker = this.injector.get(PreconnectLinkChecker); checker.assertPreconnect(this.getRewrittenSrc(), this.ngSrc); - if (!this.isServer) { + if (typeof ngServerMode !== 'undefined' && !ngServerMode) { const applicationRef = this.injector.get(ApplicationRef); assetPriorityCountBelowThreshold(applicationRef); } @@ -517,8 +513,9 @@ export class NgOptimizedImage implements OnInit, OnChanges { } } - if (this.isServer && this.priority) { - this.preloadLinkCreator.createPreloadLinkTag( + if (typeof ngServerMode !== 'undefined' && ngServerMode && this.priority) { + const preloadLinkCreator = this.injector.get(PreloadLinkCreator); + preloadLinkCreator.createPreloadLinkTag( this.renderer, this.getRewrittenSrc(), rewrittenSrcset, @@ -557,7 +554,12 @@ export class NgOptimizedImage implements OnInit, OnChanges { } } - if (ngDevMode && changes['placeholder']?.currentValue && !this.isServer) { + if ( + ngDevMode && + changes['placeholder']?.currentValue && + typeof ngServerMode !== 'undefined' && + !ngServerMode + ) { assertPlaceholderDimensions(this, this.imgElement); } } diff --git a/packages/common/test/directives/ng_optimized_image_spec.ts b/packages/common/test/directives/ng_optimized_image_spec.ts index e39c277292e3..482e0eff09d7 100644 --- a/packages/common/test/directives/ng_optimized_image_spec.ts +++ b/packages/common/test/directives/ng_optimized_image_spec.ts @@ -36,134 +36,144 @@ import {PRECONNECT_CHECK_BLOCKLIST} from '../../src/directives/ng_optimized_imag describe('Image directive', () => { describe('preload element on a server', () => { - it('should create `` element when the image priority attr is true', () => { - // Only run this test in a browser since the Node-based DOM mocks don't - // allow to override `HTMLImageElement.prototype.setAttribute` easily. - if (!isBrowser) return; - - const src = 'preload1/img.png'; - - setupTestingModule({ - extraProviders: [ - {provide: PLATFORM_ID, useValue: PLATFORM_SERVER_ID}, - { - provide: IMAGE_LOADER, - useValue: (config: ImageLoaderConfig) => - config.width - ? `https://angular.io/${config.src}?width=${config.width}` - : `https://angular.io/${config.src}`, - }, - ], + describe('server', () => { + beforeEach(() => { + globalThis['ngServerMode'] = true; }); - const template = ``; - TestBed.overrideComponent(TestComponent, {set: {template: template}}); + afterEach(() => { + globalThis['ngServerMode'] = undefined; + }); - const _document = TestBed.inject(DOCUMENT); - const _window = _document.defaultView!; - const setAttributeSpy = spyOn( - _window.HTMLLinkElement.prototype, - 'setAttribute', - ).and.callThrough(); + it('should create `` element when the image priority attr is true', () => { + // Only run this test in a browser since the Node-based DOM mocks don't + // allow to override `HTMLImageElement.prototype.setAttribute` easily. + if (!isBrowser) return; - const fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); + const src = 'preload1/img.png'; - const head = _document.head; + setupTestingModule({ + extraProviders: [ + {provide: PLATFORM_ID, useValue: PLATFORM_SERVER_ID}, + { + provide: IMAGE_LOADER, + useValue: (config: ImageLoaderConfig) => + config.width + ? `https://angular.io/${config.src}?width=${config.width}` + : `https://angular.io/${config.src}`, + }, + ], + }); - const rewrittenSrc = `https://angular.io/${src}`; + const template = ``; + TestBed.overrideComponent(TestComponent, {set: {template: template}}); - const preloadLink = head.querySelector(`link[href="${rewrittenSrc}"]`); + const _document = TestBed.inject(DOCUMENT); + const _window = _document.defaultView!; + const setAttributeSpy = spyOn( + _window.HTMLLinkElement.prototype, + 'setAttribute', + ).and.callThrough(); - expect(preloadLink).toBeTruthy(); + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); - const [name, value] = setAttributeSpy.calls.argsFor(0); + const head = _document.head; - expect(name).toEqual('as'); - expect(value).toEqual('image'); + const rewrittenSrc = `https://angular.io/${src}`; - expect(preloadLink!.getAttribute('rel')).toEqual('preload'); - expect(preloadLink!.getAttribute('as')).toEqual('image'); - expect(preloadLink!.getAttribute('imagesizes')).toEqual('10vw'); - expect(preloadLink!.getAttribute('imagesrcset')).toEqual(`${rewrittenSrc}?width=100 100w`); - expect(preloadLink!.getAttribute('fetchpriority')).toEqual('high'); + const preloadLink = head.querySelector(`link[href="${rewrittenSrc}"]`); - preloadLink!.remove(); - }); + expect(preloadLink).toBeTruthy(); - it('should not create a preload `` element when src is already preloaded.', () => { - // Only run this test in a browser since the Node-based DOM mocks don't - // allow to override `HTMLImageElement.prototype.setAttribute` easily. - if (!isBrowser) return; + const [name, value] = setAttributeSpy.calls.argsFor(0); - const src = `preload2/img.png`; + expect(name).toEqual('as'); + expect(value).toEqual('image'); - const rewrittenSrc = `https://angular.io/${src}`; + expect(preloadLink!.getAttribute('rel')).toEqual('preload'); + expect(preloadLink!.getAttribute('as')).toEqual('image'); + expect(preloadLink!.getAttribute('imagesizes')).toEqual('10vw'); + expect(preloadLink!.getAttribute('imagesrcset')).toEqual(`${rewrittenSrc}?width=100 100w`); + expect(preloadLink!.getAttribute('fetchpriority')).toEqual('high'); - setupTestingModule({ - extraProviders: [ - {provide: PLATFORM_ID, useValue: PLATFORM_SERVER_ID}, - { - provide: IMAGE_LOADER, - useValue: (config: ImageLoaderConfig) => `https://angular.io/${config.src}`, - }, - ], + preloadLink!.remove(); }); - const template = ``; - TestBed.overrideComponent(TestComponent, {set: {template: template}}); + it('should not create a preload `` element when src is already preloaded.', () => { + // Only run this test in a browser since the Node-based DOM mocks don't + // allow to override `HTMLImageElement.prototype.setAttribute` easily. + if (!isBrowser) return; - const _document = TestBed.inject(DOCUMENT); + const src = `preload2/img.png`; - const fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); + const rewrittenSrc = `https://angular.io/${src}`; - const head = _document.head; + setupTestingModule({ + extraProviders: [ + {provide: PLATFORM_ID, useValue: PLATFORM_SERVER_ID}, + { + provide: IMAGE_LOADER, + useValue: (config: ImageLoaderConfig) => `https://angular.io/${config.src}`, + }, + ], + }); - const preloadImages = TestBed.inject(PRELOADED_IMAGES); + const template = ``; + TestBed.overrideComponent(TestComponent, {set: {template: template}}); - expect(preloadImages.has(rewrittenSrc)).toBeTruthy(); + const _document = TestBed.inject(DOCUMENT); - const preloadLinks = head.querySelectorAll(`link[href="${rewrittenSrc}"]`); + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); - expect(preloadLinks.length).toEqual(1); + const head = _document.head; - preloadLinks[0]!.remove(); - }); + const preloadImages = TestBed.inject(PRELOADED_IMAGES); - it('should error when the number of preloaded images is larger than the limit', () => { - // Only run this test in a browser since the Node-based DOM mocks don't - // allow to override `HTMLImageElement.prototype.setAttribute` easily. - if (!isBrowser) return; + expect(preloadImages.has(rewrittenSrc)).toBeTruthy(); - setupTestingModule({ - extraProviders: [ - {provide: PLATFORM_ID, useValue: PLATFORM_SERVER_ID}, - { - provide: IMAGE_LOADER, - useValue: (config: ImageLoaderConfig) => `https://angular.io/${config.src}`, - }, - ], + const preloadLinks = head.querySelectorAll(`link[href="${rewrittenSrc}"]`); + + expect(preloadLinks.length).toEqual(1); + + preloadLinks[0]!.remove(); }); - const template = ` - - - - - - - - - - `; + it('should error when the number of preloaded images is larger than the limit', () => { + // Only run this test in a browser since the Node-based DOM mocks don't + // allow to override `HTMLImageElement.prototype.setAttribute` easily. + if (!isBrowser) return; - expect(() => { - const fixture = createTestComponent(template); - fixture.detectChanges(); - }).toThrowError( - 'NG02961: The `NgOptimizedImage` directive has detected that more than 5 images were marked as priority. This might negatively affect an overall performance of the page. To fix this, remove the "priority" attribute from images with less priority.', - ); + setupTestingModule({ + extraProviders: [ + {provide: PLATFORM_ID, useValue: PLATFORM_SERVER_ID}, + { + provide: IMAGE_LOADER, + useValue: (config: ImageLoaderConfig) => `https://angular.io/${config.src}`, + }, + ], + }); + + const template = ` + + + + + + + + + + `; + + expect(() => { + const fixture = createTestComponent(template); + fixture.detectChanges(); + }).toThrowError( + 'NG02961: The `NgOptimizedImage` directive has detected that more than 5 images were marked as priority. This might negatively affect an overall performance of the page. To fix this, remove the "priority" attribute from images with less priority.', + ); + }); }); it('should not hit max preload limit when not on the server', () => { @@ -878,6 +888,9 @@ describe('Image directive', () => { it( 'should log a warning if the priority attribute is used too often', withHead('', async () => { + // This test is running both on server and in the browser. + globalThis['ngServerMode'] = !isBrowser; + // We need to reset the count as previous test might have incremented it already resetImagePriorityCount(); @@ -922,6 +935,8 @@ describe('Image directive', () => { // The warning is only logged on browsers expect(consoleWarnSpy.calls.count()).toBe(0); } + + globalThis['ngServerMode'] = undefined; }), ); }); @@ -1341,36 +1356,46 @@ describe('Image directive', () => { }); if (isBrowser) { - it('should throw if the placeholder height exceeds the threshold', () => { - setUpModuleNoLoader(); + describe('browser', () => { + beforeEach(() => { + globalThis['ngServerMode'] = false; + }); + + afterEach(() => { + globalThis['ngServerMode'] = undefined; + }); - const template = ``; + it('should throw if the placeholder height exceeds the threshold', () => { + setUpModuleNoLoader(); - const consoleWarnSpy = spyOn(console, 'warn'); - const fixture = createTestComponent(template); - fixture.detectChanges(); - expect(consoleWarnSpy.calls.count()).toBe(1); - expect(consoleWarnSpy.calls.argsFor(0)[0]).toMatch( - new RegExp(`NG0${RuntimeErrorCode.PLACEHOLDER_DIMENSION_LIMIT_EXCEEDED}:`), - ); - }); + const template = ``; - it('should throw if the placeholder width exceeds the threshold', () => { - setUpModuleNoLoader(); + const consoleWarnSpy = spyOn(console, 'warn'); + const fixture = createTestComponent(template); + fixture.detectChanges(); + expect(consoleWarnSpy.calls.count()).toBe(1); + expect(consoleWarnSpy.calls.argsFor(0)[0]).toMatch( + new RegExp(`NG0${RuntimeErrorCode.PLACEHOLDER_DIMENSION_LIMIT_EXCEEDED}:`), + ); + }); - const template = ``; + it('should throw if the placeholder width exceeds the threshold', () => { + setUpModuleNoLoader(); - const consoleWarnSpy = spyOn(console, 'warn'); - const fixture = createTestComponent(template); - fixture.detectChanges(); - expect(consoleWarnSpy.calls.count()).toBe(1); - expect(consoleWarnSpy.calls.argsFor(0)[0]).toMatch( - new RegExp(`NG0${RuntimeErrorCode.PLACEHOLDER_DIMENSION_LIMIT_EXCEEDED}:`), - ); + const template = ``; + + const consoleWarnSpy = spyOn(console, 'warn'); + const fixture = createTestComponent(template); + fixture.detectChanges(); + expect(consoleWarnSpy.calls.count()).toBe(1); + expect(consoleWarnSpy.calls.argsFor(0)[0]).toMatch( + new RegExp(`NG0${RuntimeErrorCode.PLACEHOLDER_DIMENSION_LIMIT_EXCEEDED}:`), + ); + }); }); } }); From 7daf268cffc441efebe8277576b3f78ecf8d8f56 Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Mon, 20 Jan 2025 23:37:32 -0800 Subject: [PATCH 0175/1220] docs(docs-infra): bump tutorials to 19.1 (#59642) PR Close #59642 --- .../first-app/common/package-lock.json | 2123 +++++------------ .../tutorials/homepage/package-lock.json | 1193 ++++----- .../learn-angular/common/package-lock.json | 1205 ++++------ .../playground/common/package-lock.json | 1215 ++++------ 4 files changed, 1888 insertions(+), 3848 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 7495374c0f1a..79afb475b3b3 100644 --- a/adev/src/content/tutorials/first-app/common/package-lock.json +++ b/adev/src/content/tutorials/first-app/common/package-lock.json @@ -36,7 +36,7 @@ "karma-jasmine-html-reporter": "~2.1.0", "protractor": "~7.0.0", "ts-node": "~10.9.0", - "typescript": "~5.6.3" + "typescript": "~5.7.0" } }, "node_modules/@ampproject/remapping": { @@ -54,13 +54,13 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1900.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1900.7.tgz", - "integrity": "sha512-3dRV0IB+MbNYbAGbYEFMcABkMphqcTvn5MG79dQkwcf2a9QZxCq2slwf/rIleWoDUcFm9r1NnVPYrTYNYJaqQg==", + "version": "0.1901.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.3.tgz", + "integrity": "sha512-bXhcSP23MKGRuKjI0j+JEDssuFwyprVS0czIeNswj2VTuWyx9y8GjnH2kJXeDETbX0pNbUjThkMsk8cZ5b2YTg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.7", + "@angular-devkit/core": "19.1.3", "rxjs": "7.8.1" }, "engines": { @@ -70,19 +70,19 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.0.7.tgz", - "integrity": "sha512-R0vpJ+P5xBqF82zOMq2FvOP7pJz5NZ7PwHAIFuQ6z50SHLW/VcUA19ZoFKwxBX6A/Soyb66QXTcjZ5wbRqMm8w==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.1.3.tgz", + "integrity": "sha512-k9ZLXmtWFDxj/RN4RPKJ+tKDz1rUds7TZeqTvtfvOobgNzT5gSj0ZGlAlnMxcW3HJF7MuCTnAYua51tlJ5aTXw==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1900.7", - "@angular-devkit/build-webpack": "0.1900.7", - "@angular-devkit/core": "19.0.7", - "@angular/build": "19.0.7", + "@angular-devkit/architect": "0.1901.3", + "@angular-devkit/build-webpack": "0.1901.3", + "@angular-devkit/core": "19.1.3", + "@angular/build": "19.1.3", "@babel/core": "7.26.0", - "@babel/generator": "7.26.2", + "@babel/generator": "7.26.3", "@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", @@ -91,21 +91,21 @@ "@babel/preset-env": "7.26.0", "@babel/runtime": "7.26.0", "@discoveryjs/json-ext": "0.6.3", - "@ngtools/webpack": "19.0.7", - "@vitejs/plugin-basic-ssl": "1.1.0", + "@ngtools/webpack": "19.1.3", + "@vitejs/plugin-basic-ssl": "1.2.0", "ansi-colors": "4.1.3", "autoprefixer": "10.4.20", "babel-loader": "9.2.1", "browserslist": "^4.21.5", "copy-webpack-plugin": "12.0.2", "css-loader": "7.1.2", - "esbuild-wasm": "0.24.0", - "fast-glob": "3.3.2", + "esbuild-wasm": "0.24.2", + "fast-glob": "3.3.3", "http-proxy-middleware": "3.0.3", "istanbul-lib-instrument": "6.0.3", "jsonc-parser": "3.3.1", "karma-source-map-support": "1.4.0", - "less": "4.2.0", + "less": "4.2.1", "less-loader": "12.2.0", "license-webpack-plugin": "4.0.2", "loader-utils": "3.3.1", @@ -113,22 +113,22 @@ "open": "10.1.0", "ora": "5.4.1", "picomatch": "4.0.2", - "piscina": "4.7.0", + "piscina": "4.8.0", "postcss": "8.4.49", "postcss-loader": "8.1.1", "resolve-url-loader": "5.0.0", "rxjs": "7.8.1", - "sass": "1.80.7", - "sass-loader": "16.0.3", + "sass": "1.83.1", + "sass-loader": "16.0.4", "semver": "7.6.3", "source-map-loader": "5.0.0", "source-map-support": "0.5.21", - "terser": "5.36.0", + "terser": "5.37.0", "tree-kill": "1.2.2", "tslib": "2.8.1", - "webpack": "5.96.1", + "webpack": "5.97.1", "webpack-dev-middleware": "7.4.2", - "webpack-dev-server": "5.1.0", + "webpack-dev-server": "5.2.0", "webpack-merge": "6.0.1", "webpack-subresource-integrity": "5.1.0" }, @@ -138,14 +138,14 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.24.0" + "esbuild": "0.24.2" }, "peerDependencies": { "@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.0.7", + "@angular/ssr": "^19.1.3", "@web/test-runner": "^0.19.0", "browser-sync": "^3.0.2", "jest": "^29.5.0", @@ -154,7 +154,7 @@ "ng-packagr": "^19.0.0", "protractor": "^7.0.0", "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.5 <5.7" + "typescript": ">=5.5 <5.8" }, "peerDependenciesMeta": { "@angular/localize": { @@ -195,462 +195,48 @@ } } }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], + "node_modules/@angular-devkit/build-angular/node_modules/@types/node": { + "version": "22.10.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", + "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", "dev": true, "license": "MIT", "optional": true, - "os": [ - "linux" - ], "peer": true, - "engines": { - "node": ">=12" + "dependencies": { + "undici-types": "~6.20.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], + "node_modules/@angular-devkit/build-angular/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", - "optional": true, - "os": [ - "linux" - ], - "peer": true, "engines": { - "node": ">=12" + "node": ">=14.21.3" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], + "node_modules/@angular-devkit/build-angular/node_modules/vite": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.10.tgz", + "integrity": "sha512-MEszunEcMo6pFsfXN1GhCFQqnE25tWRH0MA4f0Q7uanACi4y1Us+ZGpTMnITwCTnYzB2b9cpmnelTlxgTBmaBA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], "peer": true, + "dependencies": { + "esbuild": "^0.24.2", + "postcss": "^8.4.49", + "rollup": "^4.23.0" + }, + "bin": { + "vite": "bin/vite.js" + }, "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@types/node": { - "version": "22.10.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.6.tgz", - "integrity": "sha512-qNiuwC4ZDAUNcY47xgaSuS92cjf8JbSUoaKS77bmLG1rU7MlATVSiw/IlrjtIyyskXBZ8KkNfjK/P5na7rgXbQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "undici-types": "~6.20.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", - "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.6.0" - }, - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/vite": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -659,19 +245,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.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.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -683,617 +275,196 @@ }, "sass-embedded": { "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "peer": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/@angular-devkit/build-webpack": { - "version": "0.1900.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1900.7.tgz", - "integrity": "sha512-F0S0iyspo/9w9rP5F9wmL+ZkBr48YQIWiFu+PaQ0in/lcdRmY/FjVHTMa5BMnlew9VCtFHPvpoN9x4u8AIoWXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/architect": "0.1900.7", - "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" - }, - "peerDependencies": { - "webpack": "^5.30.0", - "webpack-dev-server": "^5.0.2" - } - }, - "node_modules/@angular-devkit/core": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.7.tgz", - "integrity": "sha512-VyuORSitT6LIaGUEF0KEnv2TwNaeWl6L3/4L4stok0BJ23B4joVca2DYVcrLC1hSzz8V4dwVgSlbNIgjgGdVpg==", - "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/schematics": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.7.tgz", - "integrity": "sha512-BHXQv6kMc9xo4TH9lhwMv8nrZXHkLioQvLun2qYjwvOsyzt3qd+sUM9wpHwbG6t+01+FIQ05iNN9ox+Cvpndgg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "19.0.7", - "jsonc-parser": "3.3.1", - "magic-string": "0.30.12", - "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/animations": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.0.6.tgz", - "integrity": "sha512-dlXrFcw7RQNze1zjmrbwqcFd6zgEuqKwuExtEN1Fy26kQ+wqKIhYO6IG7PZGef53XpwN5DT16yve6UihJ2XeNg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0" - }, - "peerDependencies": { - "@angular/core": "19.0.6" - } - }, - "node_modules/@angular/build": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.0.7.tgz", - "integrity": "sha512-AFvhRa6sfXG8NmS8AN7TvE8q2kVcMw+zXMZzo981cqwnOwJy4VHU0htqm5OZQnohVJM0pP8SBAuROWO4yRrxCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1900.7", - "@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.0.2", - "@vitejs/plugin-basic-ssl": "1.1.0", - "beasties": "0.1.0", - "browserslist": "^4.23.0", - "esbuild": "0.24.0", - "fast-glob": "3.3.2", - "https-proxy-agent": "7.0.5", - "istanbul-lib-instrument": "6.0.3", - "listr2": "8.2.5", - "magic-string": "0.30.12", - "mrmime": "2.0.0", - "parse5-html-rewriting-stream": "7.0.0", - "picomatch": "4.0.2", - "piscina": "4.7.0", - "rollup": "4.26.0", - "sass": "1.80.7", - "semver": "7.6.3", - "vite": "5.4.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": { - "lmdb": "3.1.5" - }, - "peerDependencies": { - "@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.0.7", - "less": "^4.2.0", - "postcss": "^8.4.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.5 <5.7" - }, - "peerDependenciesMeta": { - "@angular/localize": { - "optional": true - }, - "@angular/platform-server": { - "optional": true - }, - "@angular/service-worker": { - "optional": true - }, - "@angular/ssr": { - "optional": true - }, - "less": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tailwindcss": { - "optional": true - } - } - }, - "node_modules/@angular/build/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "node_modules/@angular/build/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], + "node_modules/@angular-devkit/build-webpack": { + "version": "0.1901.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1901.3.tgz", + "integrity": "sha512-sv5rL1/xdMuPxJskG+5FVyVpDH8/NMfvHn/bKUvdrYMcTowwepP5EVQ5MZDSfwWrksuCyqrIOxd0K2zIRohNSQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], + "dependencies": { + "@angular-devkit/architect": "0.1901.3", + "rxjs": "7.8.1" + }, "engines": { - "node": ">=12" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0", + "webpack-dev-server": "^5.0.2" } }, - "node_modules/@angular/build/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], + "node_modules/@angular-devkit/core": { + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.3.tgz", + "integrity": "sha512-of/TKfJ/vL+/qvr4PbDTtqbFJGFHPfu6bEJrIZsLMYA+Mej8SyTx3kDm4LLnKQBtWVYDqkrxvcpOb4+NmHNLfA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], + "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": ">=12" + "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/build/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], + "node_modules/@angular-devkit/schematics": { + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.3.tgz", + "integrity": "sha512-DfN45eJQtfXXeQwjb7vDqSJ+8e6BW3rXUB2i6IC2CbOYrLWhMBgfv3/uTm++IbCFW2zX3Yk3yqq3d4yua2no7w==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@angular-devkit/core": "19.1.3", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, "engines": { - "node": ">=12" + "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/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, + "node_modules/@angular/animations": { + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.1.2.tgz", + "integrity": "sha512-usf/TMBpQKRnVpEK/UzrcxtHrUgWvryMG1UDWOTsTxmfAKsYoLqy+gdcGOkSf9yEiNn8xBxFXeGqPbFPeA1fWQ==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "tslib": "^2.3.0" + }, "engines": { - "node": ">=12" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/core": "19.1.2" } }, - "node_modules/@angular/build/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], + "node_modules/@angular/build": { + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.3.tgz", + "integrity": "sha512-NRYBNAyCCn+6XEHv/guVZ+Y/Fan7klW6CL938G2aDzbVipSt5xCCRxYgXwACBv5BzieV16SFnQYldAzyNs0uUg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.1901.3", + "@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": "4.0.2", + "piscina": "4.8.0", + "rollup": "4.30.1", + "sass": "1.83.1", + "semver": "7.6.3", + "vite": "6.0.7", + "watchpack": "2.4.2" + }, "engines": { - "node": ">=12" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "lmdb": "3.2.2" + }, + "peerDependencies": { + "@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.3", + "less": "^4.2.0", + "ng-packagr": "^19.0.0", + "postcss": "^8.4.0", + "tailwindcss": "^2.0.0 || ^3.0.0", + "typescript": ">=5.5 <5.8" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "@angular/ssr": { + "optional": true + }, + "less": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tailwindcss": { + "optional": true + } } }, "node_modules/@angular/build/node_modules/@inquirer/confirm": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.0.2.tgz", - "integrity": "sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==", + "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": { - "@inquirer/core": "^10.1.0", - "@inquirer/type": "^3.0.1" + "@inquirer/core": "^10.1.2", + "@inquirer/type": "^3.0.2" }, "engines": { "node": ">=18" @@ -1316,9 +487,9 @@ } }, "node_modules/@angular/build/node_modules/@types/node": { - "version": "22.10.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.6.tgz", - "integrity": "sha512-qNiuwC4ZDAUNcY47xgaSuS92cjf8JbSUoaKS77bmLG1rU7MlATVSiw/IlrjtIyyskXBZ8KkNfjK/P5na7rgXbQ==", + "version": "22.10.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", + "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", "dev": true, "license": "MIT", "peer": true, @@ -1327,34 +498,34 @@ } }, "node_modules/@angular/build/node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", - "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", + "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": ">=14.6.0" + "node": ">=14.21.3" }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, "node_modules/@angular/build/node_modules/vite": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.7.tgz", + "integrity": "sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.24.2", + "postcss": "^8.4.49", + "rollup": "^4.23.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -1363,19 +534,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.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.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -1396,69 +573,36 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, - "node_modules/@angular/build/node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, "node_modules/@angular/cli": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.0.7.tgz", - "integrity": "sha512-y6C4B4XdiZwe2+OADLWXyKqUVvW/XDzTuJ2mZ5PhTnSiiXDN4zRWId1F5wA8ve8vlbUKApPHXRQuaqiQJmA24g==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.3.tgz", + "integrity": "sha512-GJGH3Xw7/zm12myA2R4Dg8+ny3p9tW00tx33YIK8vFjOUKycqgWaKfpYCe2s9egrm2Pew/DclHCD+IUwEAz1GQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1900.7", - "@angular-devkit/core": "19.0.7", - "@angular-devkit/schematics": "19.0.7", - "@inquirer/prompts": "7.1.0", + "@angular-devkit/architect": "0.1901.3", + "@angular-devkit/core": "19.1.3", + "@angular-devkit/schematics": "19.1.3", + "@inquirer/prompts": "7.2.1", "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.0.7", + "@schematics/angular": "19.1.3", "@yarnpkg/lockfile": "1.1.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", "listr2": "8.2.5", - "npm-package-arg": "12.0.0", + "npm-package-arg": "12.0.1", "npm-pick-manifest": "10.0.0", "pacote": "20.0.0", - "resolve": "1.22.8", + "resolve": "1.22.10", "semver": "7.6.3", "symbol-observable": "4.0.0", "yargs": "17.7.2" @@ -1598,22 +742,22 @@ } }, "node_modules/@angular/cli/node_modules/@inquirer/prompts": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.1.0.tgz", - "integrity": "sha512-5U/XiVRH2pp1X6gpNAjWOglMf38/Ys522ncEHIKT1voRUvSj/DQnR22OVxHnwu5S+rCFaUiPQ57JOtMFQayqYA==", + "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": { - "@inquirer/checkbox": "^4.0.2", - "@inquirer/confirm": "^5.0.2", - "@inquirer/editor": "^4.1.0", - "@inquirer/expand": "^4.0.2", - "@inquirer/input": "^4.0.2", - "@inquirer/number": "^3.0.2", - "@inquirer/password": "^4.0.2", - "@inquirer/rawlist": "^4.0.2", - "@inquirer/search": "^3.0.2", - "@inquirer/select": "^4.0.2" + "@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": ">=18" @@ -1722,9 +866,9 @@ } }, "node_modules/@angular/cli/node_modules/@types/node": { - "version": "22.10.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.6.tgz", - "integrity": "sha512-qNiuwC4ZDAUNcY47xgaSuS92cjf8JbSUoaKS77bmLG1rU7MlATVSiw/IlrjtIyyskXBZ8KkNfjK/P5na7rgXbQ==", + "version": "22.10.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", + "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", "dev": true, "license": "MIT", "peer": true, @@ -1759,9 +903,9 @@ } }, "node_modules/@angular/common": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.0.6.tgz", - "integrity": "sha512-r9IDD0+UGkrQkjyX+pApeDmIJ9INpr1uYlgmmlWNBJCVNr9SKKIVZV60sssgadew6bGynKN9dW4mGsmEzzb5BA==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.2.tgz", + "integrity": "sha512-6IhBXwz97pbXA+3vHw1hQlv4M0gc5NrDZSCQeffcraE6wpFMzo8vLcYAiNxpSyTFS7YLzCALdS6kYXVP2FBy1g==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1770,14 +914,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.6", + "@angular/core": "19.1.2", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.0.6.tgz", - "integrity": "sha512-g8A6QOsiCJnRi5Hz0sASIpRQoAGxEgnjz0JanfrMNRedY4MpdIS1V0AeCSKTsMRlV7tQl3ng2Gse/tsb51HI3Q==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.2.tgz", + "integrity": "sha512-CThpvyims1aoPtqUA5UCB0lEI8lDnWBuY6VpMST4YCxhYuPmDWrwKcYXOJU1w/5yEeR8bAOvWIkKdA83MAEyHw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1786,7 +930,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.6" + "@angular/core": "19.1.2" }, "peerDependenciesMeta": { "@angular/core": { @@ -1795,9 +939,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.0.6.tgz", - "integrity": "sha512-fHtwI5rCe3LmKDoaqlqLAPdNmLrbeCiMYVe+X1BHgApaqNCyAwcuJxuf8Q5R5su7nHiLmlmB74o1ZS/V+0cQ+g==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.2.tgz", + "integrity": "sha512-CaZTG9arDVc9mGl/abqWsg79VbHAvo6ABtJa/Z6CJ6m2Y0HQPTJR6psiFqjnTSBUK43LRx8dDV3T8wIZa7DNpg==", "dev": true, "license": "MIT", "dependencies": { @@ -1819,14 +963,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.0.6", - "typescript": ">=5.5 <5.7" + "@angular/compiler": "19.1.2", + "typescript": ">=5.5 <5.8" } }, "node_modules/@angular/core": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.0.6.tgz", - "integrity": "sha512-9N7FmdRHtS7zfXC/wnyap/reX7fgiOrWpVivayHjWP4RkLYXJAzJIpLyew0jrx4vf8r3lZnC0Zmq0PW007Ngjw==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.2.tgz", + "integrity": "sha512-WrOzn9X2LsXxS27fB1WNjYsFVUKvuDuZ0ERfesWb/t1prz09q7fi/YK0TXx7XOby9CfNe4aXjzRPQL2zgFuMWQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1840,9 +984,9 @@ } }, "node_modules/@angular/forms": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.0.6.tgz", - "integrity": "sha512-HogauPvgDQHw2xxqKBaFgKTRRcc1xWeI/PByDCf3U6YsaqpF53Mz2CJh8X2bg2bY1RGKb67MZw7DBGFRvXx4bg==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.2.tgz", + "integrity": "sha512-PmHoF4JkGbYK0pdBH2FwAKU9VBydAIjJQlol3anjUQF2zfkITeTqfVNmys1mFhojGR+ZppV0zZ+8MhI/501P7A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1851,16 +995,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.6", - "@angular/core": "19.0.6", - "@angular/platform-browser": "19.0.6", + "@angular/common": "19.1.2", + "@angular/core": "19.1.2", + "@angular/platform-browser": "19.1.2", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.0.6.tgz", - "integrity": "sha512-MWiToGy7Pa0rR61sgnEuu7dfZXpAw0g7nkSnw4xdjUf974OOOfI1LS9O9YevJibtdW8sPa1HaoXXwcb7N03B5A==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.2.tgz", + "integrity": "sha512-fk/OrL4r5jUjAi1WTv9LGTm+DXWrPtDBpoX4z5Ze6Se+x3/6pTn1Rty1C4MNZvHiTjIQGQNRnq447GdiOjhg9w==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1869,9 +1013,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "19.0.6", - "@angular/common": "19.0.6", - "@angular/core": "19.0.6" + "@angular/animations": "19.1.2", + "@angular/common": "19.1.2", + "@angular/core": "19.1.2" }, "peerDependenciesMeta": { "@angular/animations": { @@ -1880,9 +1024,9 @@ } }, "node_modules/@angular/router": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.0.6.tgz", - "integrity": "sha512-G1oz+TclPk48h6b6B4s5J3DfrDVJrrxKOA+KWeVQP4e1B8ld7/dCMf5nn3yqS4BGs4yLecxMxyvbOvOiZ//lxw==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.1.2.tgz", + "integrity": "sha512-yIz86uSTKFttwgWGnzHeFUvoHP+QNk+2w2OAR9UCbRoXpfx5oDhZj/zZQLmuqqpSAQyJ6qicqucEBUahA938pg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1891,9 +1035,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.6", - "@angular/core": "19.0.6", - "@angular/platform-browser": "19.0.6", + "@angular/common": "19.1.2", + "@angular/core": "19.1.2", + "@angular/platform-browser": "19.1.2", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -1971,14 +1115,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", - "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", + "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.2", - "@babel/types": "^7.26.0", + "@babel/parser": "^7.26.3", + "@babel/types": "^7.26.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -3557,9 +2701,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", - "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "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" ], @@ -3574,9 +2718,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", - "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "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" ], @@ -3591,9 +2735,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", - "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "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" ], @@ -3608,9 +2752,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", - "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", "cpu": [ "x64" ], @@ -3625,9 +2769,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "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" ], @@ -3642,9 +2786,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", - "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", "cpu": [ "x64" ], @@ -3659,9 +2803,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", - "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "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" ], @@ -3676,9 +2820,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", - "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "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" ], @@ -3693,9 +2837,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", - "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "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" ], @@ -3710,9 +2854,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", - "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "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" ], @@ -3727,9 +2871,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", - "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "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" ], @@ -3744,9 +2888,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", - "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", "cpu": [ "loong64" ], @@ -3761,9 +2905,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", - "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "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" ], @@ -3778,9 +2922,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", - "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "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" ], @@ -3795,9 +2939,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", - "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "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" ], @@ -3812,9 +2956,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", - "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "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" ], @@ -3829,9 +2973,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", - "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", "cpu": [ "x64" ], @@ -3845,10 +2989,27 @@ "node": ">=18" } }, + "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, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", - "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "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" ], @@ -3863,9 +3024,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "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" ], @@ -3880,9 +3041,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", - "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "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" ], @@ -3897,9 +3058,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", - "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", "cpu": [ "x64" ], @@ -3914,9 +3075,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", - "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", "cpu": [ "arm64" ], @@ -3931,9 +3092,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", - "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "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" ], @@ -3948,9 +3109,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", - "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "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" ], @@ -3999,9 +3160,9 @@ } }, "node_modules/@inquirer/core/node_modules/@types/node": { - "version": "22.10.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.6.tgz", - "integrity": "sha512-qNiuwC4ZDAUNcY47xgaSuS92cjf8JbSUoaKS77bmLG1rU7MlATVSiw/IlrjtIyyskXBZ8KkNfjK/P5na7rgXbQ==", + "version": "22.10.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", + "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", "dev": true, "license": "MIT", "peer": true, @@ -4331,9 +3492,9 @@ "license": "MIT" }, "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.1.5.tgz", - "integrity": "sha512-ue5PSOzHMCIYrfvPP/MRS6hsKKLzqqhcdAvJCO8uFlDdj598EhgnacuOTuqA6uBK5rgiZXfDWyb7DVZSiBKxBA==", + "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" ], @@ -4345,9 +3506,9 @@ ] }, "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.1.5.tgz", - "integrity": "sha512-CGhsb0R5vE6mMNCoSfxHFD8QTvBHM51gs4DBeigTYHWnYv2V5YpJkC4rMo5qAAFifuUcc0+a8a3SIU0c9NrfNw==", + "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" ], @@ -4359,9 +3520,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.1.5.tgz", - "integrity": "sha512-3WeW328DN+xB5PZdhSWmqE+t3+44xWXEbqQ+caWJEZfOFdLp9yklBZEbVqVdqzznkoaXJYxTCp996KD6HmANeg==", + "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" ], @@ -4373,9 +3534,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.1.5.tgz", - "integrity": "sha512-LAjaoOcBHGj6fiYB8ureiqPoph4eygbXu4vcOF+hsxiY74n8ilA7rJMmGUT0K0JOB5lmRQHSmor3mytRjS4qeQ==", + "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" ], @@ -4387,9 +3548,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.1.5.tgz", - "integrity": "sha512-k/IklElP70qdCXOQixclSl2GPLFiopynGoKX1FqDd1/H0E3Fo1oPwjY2rEVu+0nS3AOw1sryStdXk8CW3cVIsw==", + "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" ], @@ -4401,9 +3562,9 @@ ] }, "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.1.5.tgz", - "integrity": "sha512-KYar6W8nraZfSJspcK7Kp7hdj238X/FNauYbZyrqPBrtsXI1hvI4/KcRcRGP50aQoV7fkKDyJERlrQGMGTZUsA==", + "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" ], @@ -4804,9 +3965,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.0.7.tgz", - "integrity": "sha512-jWyMuqtLKZB8Jnuqo27mG2cCQdl71lhM1oEdq3x7Z/QOrm2I+8EfyAzOLxB1f1vXt85O1bz3nf66CkuVCVGGTQ==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.1.3.tgz", + "integrity": "sha512-O6bKP8J8w8U5NfFCA4ukO82rpmvii5JtXQCo2FCwafZBfYuV5GHw97ezbdUIaTbPML+EC7gq9Y85EuFAyUHtAg==", "dev": true, "license": "MIT", "engines": { @@ -4816,7 +3977,7 @@ }, "peerDependencies": { "@angular/compiler-cli": "^19.0.0", - "typescript": ">=5.5 <5.7", + "typescript": ">=5.5 <5.8", "webpack": "^5.54.0" } }, @@ -5479,9 +4640,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.26.0.tgz", - "integrity": "sha512-gJNwtPDGEaOEgejbaseY6xMFu+CPltsc8/T+diUTTbOQLqD+bnrJq9ulH6WD69TqwqWmrfRAtUv30cCFZlbGTQ==", + "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" ], @@ -5493,9 +4654,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.26.0.tgz", - "integrity": "sha512-YJa5Gy8mEZgz5JquFruhJODMq3lTHWLm1fOy+HIANquLzfIOzE9RA5ie3JjCdVb9r46qfAQY/l947V0zfGJ0OQ==", + "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" ], @@ -5507,9 +4668,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.26.0.tgz", - "integrity": "sha512-ErTASs8YKbqTBoPLp/kA1B1Um5YSom8QAc4rKhg7b9tyyVqDBlQxy7Bf2wW7yIlPGPg2UODDQcbkTlruPzDosw==", + "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" ], @@ -5521,9 +4682,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.26.0.tgz", - "integrity": "sha512-wbgkYDHcdWW+NqP2mnf2NOuEbOLzDblalrOWcPyY6+BRbVhliavon15UploG7PpBRQ2bZJnbmh8o3yLoBvDIHA==", + "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" ], @@ -5535,9 +4696,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.26.0.tgz", - "integrity": "sha512-Y9vpjfp9CDkAG4q/uwuhZk96LP11fBz/bYdyg9oaHYhtGZp7NrbkQrj/66DYMMP2Yo/QPAsVHkV891KyO52fhg==", + "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" ], @@ -5549,9 +4710,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.26.0.tgz", - "integrity": "sha512-A/jvfCZ55EYPsqeaAt/yDAG4q5tt1ZboWMHEvKAH9Zl92DWvMIbnZe/f/eOXze65aJaaKbL+YeM0Hz4kLQvdwg==", + "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" ], @@ -5563,9 +4724,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.26.0.tgz", - "integrity": "sha512-paHF1bMXKDuizaMODm2bBTjRiHxESWiIyIdMugKeLnjuS1TCS54MF5+Y5Dx8Ui/1RBPVRE09i5OUlaLnv8OGnA==", + "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" ], @@ -5577,9 +4738,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.26.0.tgz", - "integrity": "sha512-cwxiHZU1GAs+TMxvgPfUDtVZjdBdTsQwVnNlzRXC5QzIJ6nhfB4I1ahKoe9yPmoaA/Vhf7m9dB1chGPpDRdGXg==", + "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" ], @@ -5591,9 +4752,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.26.0.tgz", - "integrity": "sha512-4daeEUQutGRCW/9zEo8JtdAgtJ1q2g5oHaoQaZbMSKaIWKDQwQ3Yx0/3jJNmpzrsScIPtx/V+1AfibLisb3AMQ==", + "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" ], @@ -5605,9 +4766,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.26.0.tgz", - "integrity": "sha512-eGkX7zzkNxvvS05ROzJ/cO/AKqNvR/7t1jA3VZDi2vRniLKwAWxUr85fH3NsvtxU5vnUUKFHKh8flIBdlo2b3Q==", + "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" ], @@ -5618,10 +4779,24 @@ "linux" ] }, + "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/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.26.0.tgz", - "integrity": "sha512-Odp/lgHbW/mAqw/pU21goo5ruWsytP7/HCC/liOt0zcGG0llYWKrd10k9Fj0pdj3prQ63N5yQLCLiE7HTX+MYw==", + "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" ], @@ -5633,9 +4808,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.26.0.tgz", - "integrity": "sha512-MBR2ZhCTzUgVD0OJdTzNeF4+zsVogIR1U/FsyuFerwcqjZGvg2nYe24SAHp8O5sN8ZkRVbHwlYeHqcSQ8tcYew==", + "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" ], @@ -5647,9 +4822,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.26.0.tgz", - "integrity": "sha512-YYcg8MkbN17fMbRMZuxwmxWqsmQufh3ZJFxFGoHjrE7bv0X+T6l3glcdzd7IKLiwhT+PZOJCblpnNlz1/C3kGQ==", + "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" ], @@ -5661,9 +4836,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.26.0.tgz", - "integrity": "sha512-ZuwpfjCwjPkAOxpjAEjabg6LRSfL7cAJb6gSQGZYjGhadlzKKywDkCUnJ+KEfrNY1jH5EEoSIKLCb572jSiglA==", + "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" ], @@ -5675,9 +4850,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.26.0.tgz", - "integrity": "sha512-+HJD2lFS86qkeF8kNu0kALtifMpPCZU80HvwztIKnYwym3KnA1os6nsX4BGSTLtS2QVAGG1P3guRgsYyMA0Yhg==", + "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" ], @@ -5689,9 +4864,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.26.0.tgz", - "integrity": "sha512-WUQzVFWPSw2uJzX4j6YEbMAiLbs0BUysgysh8s817doAYhR5ybqTI1wtKARQKo6cGop3pHnrUJPFCsXdoFaimQ==", + "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" ], @@ -5703,9 +4878,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.26.0.tgz", - "integrity": "sha512-D4CxkazFKBfN1akAIY6ieyOqzoOoBV1OICxgUblWxff/pSjCA2khXlASUx7mK6W1oP4McqhgcCsu6QaLj3WMWg==", + "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" ], @@ -5717,9 +4892,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.26.0.tgz", - "integrity": "sha512-2x8MO1rm4PGEP0xWbubJW5RtbNLk3puzAMaLQd3B3JHVw4KcHlmXcO+Wewx9zCoo7EUFiMlu/aZbCJ7VjMzAag==", + "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" ], @@ -5731,14 +4906,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.0.7.tgz", - "integrity": "sha512-1WtTqKFPuEaV99VIP+y/gf/XW3TVJh/NbJbbEF4qYpp7qQiJ4ntF4klVZmsJcQzFucZSzlg91QVMPQKev5WZGA==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.3.tgz", + "integrity": "sha512-LG3OKZG1Dl1lxNIc81jr82WSUaDCYlg/SEJ6A78p8AaZtTFKf14WenJTeG0XZPX45l26BdZSjn9MUTCggxQvGQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.7", - "@angular-devkit/schematics": "19.0.7", + "@angular-devkit/core": "19.1.3", + "@angular-devkit/schematics": "19.1.3", "jsonc-parser": "3.3.1" }, "engines": { @@ -6027,9 +5202,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.4.tgz", - "integrity": "sha512-5kz9ScmzBdzTgB/3susoCgfqNDzBjvLL4taparufgSvlwjdLy6UyUy9T/tCpYd2GIdIilCatC4iSQS0QSYHt0w==", + "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==", "dev": true, "license": "MIT", "dependencies": { @@ -6091,9 +5266,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "16.18.123", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.123.tgz", - "integrity": "sha512-/n7I6V/4agSpJtFDKKFEa763Hc1z3hmvchobHS1TisCOTKD5nxq8NJ2iK7SRIMYL276Q9mgWOx2AWp5n2XI6eA==", + "version": "16.18.124", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.124.tgz", + "integrity": "sha512-8ADCm5WzM/IpWxjs1Jhtwo6j+Fb8z4yr/CobP5beUUPdyCI0mg87/bqQYxNcqnhZ24Dc9RME8SQWu5eI/FmSGA==", "dev": true, "license": "MIT" }, @@ -6891,9 +6066,9 @@ } }, "node_modules/beasties": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.1.0.tgz", - "integrity": "sha512-+Ssscd2gVG24qRNC+E2g88D+xsQW4xwakWtKAiGEQ3Pw54/FGdyo9RrfxhGhEv6ilFVbB7r3Lgx+QnAxnSpECw==", + "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": { @@ -6901,10 +6076,13 @@ "css-what": "^6.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", - "htmlparser2": "^9.0.0", + "htmlparser2": "^9.1.0", "picocolors": "^1.1.1", - "postcss": "^8.4.47", + "postcss": "^8.4.49", "postcss-media-query-parser": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" } }, "node_modules/big.js": { @@ -7389,9 +6567,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001692", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz", - "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==", + "version": "1.0.30001695", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz", + "integrity": "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==", "dev": true, "funding": [ { @@ -8593,9 +7771,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.82", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.82.tgz", - "integrity": "sha512-Zq16uk1hfQhyGx5GpwPAYDwddJuSGhtRhgOA2mCxANYaDT79nAeGnaXogMGng4KqLaJUVnOnuL0+TDop9nLOiA==", + "version": "1.5.84", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.84.tgz", + "integrity": "sha512-I+DQ8xgafao9Ha6y0qjHHvpZ9OfyA1qKlkHkjywxzniORU2awxyz7f/iVJcULmrF2yrM3nHQf+iDjJtbbexd/g==", "dev": true, "license": "ISC" }, @@ -8826,9 +8004,9 @@ "license": "MIT" }, "node_modules/es-object-atoms": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.0.tgz", - "integrity": "sha512-Ujz8Al/KfOVR7fkaghAB1WvnLsdYxHDWmfoi2vlA2jZWRg31XhIC1a4B+/I24muD8iSbHxJ1JkrfqmWb65P/Mw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dev": true, "license": "MIT", "dependencies": { @@ -8856,9 +8034,9 @@ } }, "node_modules/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -8869,36 +8047,37 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" + "@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/esbuild-wasm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.24.0.tgz", - "integrity": "sha512-xhNn5tL1AhkPg4ft59yXT6FkwKXiPSYyz1IeinJHUJpjvOHOIPvdmFQc0pGdjxlKSbzZc2mNmtVOWAR1EF/JAg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.24.2.tgz", + "integrity": "sha512-03/7Z1gD+ohDnScFztvI4XddTAbKVmMEzCvvkBpQdWKEXJ+73dTyeNrmdxP1Q0zpDMFjzUJwtK4rLjqwiHbzkw==", "dev": true, "license": "MIT", "bin": { @@ -9201,9 +8380,9 @@ "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "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": { @@ -9211,7 +8390,7 @@ "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -9238,9 +8417,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.5.tgz", - "integrity": "sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", "dev": true, "funding": [ { @@ -9926,23 +9105,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/html-entities": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", - "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -10082,13 +9244,13 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "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": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { @@ -11356,9 +10518,9 @@ } }, "node_modules/less": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", - "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.1.tgz", + "integrity": "sha512-CasaJidTIhWmjcqv0Uj5vccMI7pJgfD9lMkKtlnTHAdJdYK/7l8pM9tumLyJ0zhbD4KJLo/YvTj+xznQd5NBhg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -11532,9 +10694,9 @@ "license": "MIT" }, "node_modules/lmdb": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.1.5.tgz", - "integrity": "sha512-46Mch5Drq+A93Ss3gtbg+Xuvf5BOgIuvhKDWoGa3HcPHI6BL2NCOkRdSx1D4VfzwrxhnsjbyIVsLRlQHu6URvw==", + "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", @@ -11550,12 +10712,12 @@ "download-lmdb-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.1.5", - "@lmdb/lmdb-darwin-x64": "3.1.5", - "@lmdb/lmdb-linux-arm": "3.1.5", - "@lmdb/lmdb-linux-arm64": "3.1.5", - "@lmdb/lmdb-linux-x64": "3.1.5", - "@lmdb/lmdb-win32-x64": "3.1.5" + "@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/loader-runner": { @@ -11719,9 +10881,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "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, "license": "MIT", "dependencies": { @@ -12653,9 +11815,9 @@ } }, "node_modules/npm-package-arg": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.0.tgz", - "integrity": "sha512-ZTE0hbwSdTNL+Stx2zxSqdu2KZfNDcrtrLdIk7XGnQFYBWYDho/ORvXtn5XEePcL3tFpGjHCV3X3xrtDh7eZ+A==", + "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": { @@ -13331,9 +12493,9 @@ } }, "node_modules/piscina": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.7.0.tgz", - "integrity": "sha512-b8hvkpp9zS0zsfa939b/jXbe64Z2gZv0Ha7FYPNUiDIB1y2AtxcOZdfP8xN8HFjUaqQiT9gRlfjAsoL8vdJ1Iw==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.8.0.tgz", + "integrity": "sha512-EZJb+ZxDrQf3dihsUL7p42pjNyrNIFJCrRHPMgxu/svsj+P3xS3fuEWp7k2+rfsavfl1N0G29b1HGs7J0m8rZA==", "dev": true, "license": "MIT", "optionalDependencies": { @@ -14276,19 +13438,22 @@ "license": "MIT" }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "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.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -14408,9 +13573,9 @@ } }, "node_modules/rollup": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.26.0.tgz", - "integrity": "sha512-ilcl12hnWonG8f+NxU6BlgysVA0gvY2l8N0R84S1HcINbW20bvwuCngJkkInV6LXhwRpucsW5k1ovDwEdBVrNg==", + "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": { @@ -14424,24 +13589,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.26.0", - "@rollup/rollup-android-arm64": "4.26.0", - "@rollup/rollup-darwin-arm64": "4.26.0", - "@rollup/rollup-darwin-x64": "4.26.0", - "@rollup/rollup-freebsd-arm64": "4.26.0", - "@rollup/rollup-freebsd-x64": "4.26.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.26.0", - "@rollup/rollup-linux-arm-musleabihf": "4.26.0", - "@rollup/rollup-linux-arm64-gnu": "4.26.0", - "@rollup/rollup-linux-arm64-musl": "4.26.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.26.0", - "@rollup/rollup-linux-riscv64-gnu": "4.26.0", - "@rollup/rollup-linux-s390x-gnu": "4.26.0", - "@rollup/rollup-linux-x64-gnu": "4.26.0", - "@rollup/rollup-linux-x64-musl": "4.26.0", - "@rollup/rollup-win32-arm64-msvc": "4.26.0", - "@rollup/rollup-win32-ia32-msvc": "4.26.0", - "@rollup/rollup-win32-x64-msvc": "4.26.0", + "@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" } }, @@ -14538,9 +13704,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.80.7", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.7.tgz", - "integrity": "sha512-MVWvN0u5meytrSjsU7AWsbhoXi1sc58zADXFllfZzbsBT1GHjjar6JwBINYPRrkx/zqnQ6uqbQuHgE95O+C+eQ==", + "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": { @@ -14559,9 +13725,9 @@ } }, "node_modules/sass-loader": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.3.tgz", - "integrity": "sha512-gosNorT1RCkuCMyihv6FBRR7BMV06oKRAs+l4UMp1mlcVg9rWN6KMmUj3igjQwmYys4mDP3etEYJgiHRbgHCHA==", + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.4.tgz", + "integrity": "sha512-LavLbgbBGUt3wCiYzhuLLu65+fWXaXLmq7YxivLhEqmiupCFZ5sKUAipK3do6V80YSU0jvSxNhEdT13IXNr3rg==", "dev": true, "license": "MIT", "dependencies": { @@ -15433,9 +14599,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", - "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", + "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" }, @@ -15830,9 +14996,9 @@ "license": "ISC" }, "node_modules/terser": { - "version": "5.36.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", - "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", + "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -16158,9 +15324,9 @@ "license": "MIT" }, "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "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": { @@ -16642,17 +15808,17 @@ } }, "node_modules/webpack": { - "version": "5.96.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz", - "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==", + "version": "5.97.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", + "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", "dev": true, "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.14.0", "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", @@ -16719,9 +15885,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.1.0.tgz", - "integrity": "sha512-aQpaN81X6tXie1FoOB7xlMfCsN19pSvRAeYUHOdFWOlhpQ/LlbfTqYwwmEDFV0h8GGuqmCmKmT+pxcUV/Nt2gQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.0.tgz", + "integrity": "sha512-90SqqYXA2SK36KcT6o1bvwvZfJFcmoamqeJY7+boioffX9g9C0wjjJRGUrQIuh43pb0ttX7+ssavmj/WN2RHtA==", "dev": true, "license": "MIT", "dependencies": { @@ -16738,10 +15904,9 @@ "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^2.0.0", - "express": "^4.19.2", + "express": "^4.21.2", "graceful-fs": "^4.2.6", - "html-entities": "^2.4.0", - "http-proxy-middleware": "^2.0.3", + "http-proxy-middleware": "^2.0.7", "ipaddr.js": "^2.1.0", "launch-editor": "^2.6.1", "open": "^10.0.3", diff --git a/adev/src/content/tutorials/homepage/package-lock.json b/adev/src/content/tutorials/homepage/package-lock.json index 7d99537eb96f..bba4cfe80747 100644 --- a/adev/src/content/tutorials/homepage/package-lock.json +++ b/adev/src/content/tutorials/homepage/package-lock.json @@ -21,7 +21,7 @@ "@angular/build": "^19.0.0", "@angular/cli": "^19.0.0", "@angular/compiler-cli": "^19.0.0", - "typescript": "~5.6.3" + "typescript": "~5.7.0" } }, "node_modules/@ampproject/remapping": { @@ -39,13 +39,13 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1900.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1900.7.tgz", - "integrity": "sha512-3dRV0IB+MbNYbAGbYEFMcABkMphqcTvn5MG79dQkwcf2a9QZxCq2slwf/rIleWoDUcFm9r1NnVPYrTYNYJaqQg==", + "version": "0.1901.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.3.tgz", + "integrity": "sha512-bXhcSP23MKGRuKjI0j+JEDssuFwyprVS0czIeNswj2VTuWyx9y8GjnH2kJXeDETbX0pNbUjThkMsk8cZ5b2YTg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.7", + "@angular-devkit/core": "19.1.3", "rxjs": "7.8.1" }, "engines": { @@ -55,9 +55,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.7.tgz", - "integrity": "sha512-VyuORSitT6LIaGUEF0KEnv2TwNaeWl6L3/4L4stok0BJ23B4joVca2DYVcrLC1hSzz8V4dwVgSlbNIgjgGdVpg==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.3.tgz", + "integrity": "sha512-of/TKfJ/vL+/qvr4PbDTtqbFJGFHPfu6bEJrIZsLMYA+Mej8SyTx3kDm4LLnKQBtWVYDqkrxvcpOb4+NmHNLfA==", "dev": true, "license": "MIT", "dependencies": { @@ -83,15 +83,15 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.7.tgz", - "integrity": "sha512-BHXQv6kMc9xo4TH9lhwMv8nrZXHkLioQvLun2qYjwvOsyzt3qd+sUM9wpHwbG6t+01+FIQ05iNN9ox+Cvpndgg==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.3.tgz", + "integrity": "sha512-DfN45eJQtfXXeQwjb7vDqSJ+8e6BW3rXUB2i6IC2CbOYrLWhMBgfv3/uTm++IbCFW2zX3Yk3yqq3d4yua2no7w==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.7", + "@angular-devkit/core": "19.1.3", "jsonc-parser": "3.3.1", - "magic-string": "0.30.12", + "magic-string": "0.30.17", "ora": "5.4.1", "rxjs": "7.8.1" }, @@ -102,36 +102,36 @@ } }, "node_modules/@angular/build": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.0.7.tgz", - "integrity": "sha512-AFvhRa6sfXG8NmS8AN7TvE8q2kVcMw+zXMZzo981cqwnOwJy4VHU0htqm5OZQnohVJM0pP8SBAuROWO4yRrxCA==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.3.tgz", + "integrity": "sha512-NRYBNAyCCn+6XEHv/guVZ+Y/Fan7klW6CL938G2aDzbVipSt5xCCRxYgXwACBv5BzieV16SFnQYldAzyNs0uUg==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1900.7", + "@angular-devkit/architect": "0.1901.3", "@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.0.2", - "@vitejs/plugin-basic-ssl": "1.1.0", - "beasties": "0.1.0", + "@inquirer/confirm": "5.1.1", + "@vitejs/plugin-basic-ssl": "1.2.0", + "beasties": "0.2.0", "browserslist": "^4.23.0", - "esbuild": "0.24.0", - "fast-glob": "3.3.2", - "https-proxy-agent": "7.0.5", + "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.12", + "magic-string": "0.30.17", "mrmime": "2.0.0", "parse5-html-rewriting-stream": "7.0.0", "picomatch": "4.0.2", - "piscina": "4.7.0", - "rollup": "4.26.0", - "sass": "1.80.7", + "piscina": "4.8.0", + "rollup": "4.30.1", + "sass": "1.83.1", "semver": "7.6.3", - "vite": "5.4.11", + "vite": "6.0.7", "watchpack": "2.4.2" }, "engines": { @@ -140,7 +140,7 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "lmdb": "3.1.5" + "lmdb": "3.2.2" }, "peerDependencies": { "@angular/compiler": "^19.0.0", @@ -148,11 +148,12 @@ "@angular/localize": "^19.0.0", "@angular/platform-server": "^19.0.0", "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.0.7", + "@angular/ssr": "^19.1.3", "less": "^4.2.0", + "ng-packagr": "^19.0.0", "postcss": "^8.4.0", "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.5 <5.7" + "typescript": ">=5.5 <5.8" }, "peerDependenciesMeta": { "@angular/localize": { @@ -170,6 +171,9 @@ "less": { "optional": true }, + "ng-packagr": { + "optional": true + }, "postcss": { "optional": true }, @@ -179,26 +183,26 @@ } }, "node_modules/@angular/cli": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.0.7.tgz", - "integrity": "sha512-y6C4B4XdiZwe2+OADLWXyKqUVvW/XDzTuJ2mZ5PhTnSiiXDN4zRWId1F5wA8ve8vlbUKApPHXRQuaqiQJmA24g==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.3.tgz", + "integrity": "sha512-GJGH3Xw7/zm12myA2R4Dg8+ny3p9tW00tx33YIK8vFjOUKycqgWaKfpYCe2s9egrm2Pew/DclHCD+IUwEAz1GQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1900.7", - "@angular-devkit/core": "19.0.7", - "@angular-devkit/schematics": "19.0.7", - "@inquirer/prompts": "7.1.0", + "@angular-devkit/architect": "0.1901.3", + "@angular-devkit/core": "19.1.3", + "@angular-devkit/schematics": "19.1.3", + "@inquirer/prompts": "7.2.1", "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.0.7", + "@schematics/angular": "19.1.3", "@yarnpkg/lockfile": "1.1.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", "listr2": "8.2.5", - "npm-package-arg": "12.0.0", + "npm-package-arg": "12.0.1", "npm-pick-manifest": "10.0.0", "pacote": "20.0.0", - "resolve": "1.22.8", + "resolve": "1.22.10", "semver": "7.6.3", "symbol-observable": "4.0.0", "yargs": "17.7.2" @@ -213,9 +217,9 @@ } }, "node_modules/@angular/common": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.0.6.tgz", - "integrity": "sha512-r9IDD0+UGkrQkjyX+pApeDmIJ9INpr1uYlgmmlWNBJCVNr9SKKIVZV60sssgadew6bGynKN9dW4mGsmEzzb5BA==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.2.tgz", + "integrity": "sha512-6IhBXwz97pbXA+3vHw1hQlv4M0gc5NrDZSCQeffcraE6wpFMzo8vLcYAiNxpSyTFS7YLzCALdS6kYXVP2FBy1g==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -224,14 +228,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.6", + "@angular/core": "19.1.2", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.0.6.tgz", - "integrity": "sha512-g8A6QOsiCJnRi5Hz0sASIpRQoAGxEgnjz0JanfrMNRedY4MpdIS1V0AeCSKTsMRlV7tQl3ng2Gse/tsb51HI3Q==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.2.tgz", + "integrity": "sha512-CThpvyims1aoPtqUA5UCB0lEI8lDnWBuY6VpMST4YCxhYuPmDWrwKcYXOJU1w/5yEeR8bAOvWIkKdA83MAEyHw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -240,7 +244,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.6" + "@angular/core": "19.1.2" }, "peerDependenciesMeta": { "@angular/core": { @@ -249,9 +253,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.0.6.tgz", - "integrity": "sha512-fHtwI5rCe3LmKDoaqlqLAPdNmLrbeCiMYVe+X1BHgApaqNCyAwcuJxuf8Q5R5su7nHiLmlmB74o1ZS/V+0cQ+g==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.2.tgz", + "integrity": "sha512-CaZTG9arDVc9mGl/abqWsg79VbHAvo6ABtJa/Z6CJ6m2Y0HQPTJR6psiFqjnTSBUK43LRx8dDV3T8wIZa7DNpg==", "dev": true, "license": "MIT", "dependencies": { @@ -273,14 +277,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.0.6", - "typescript": ">=5.5 <5.7" + "@angular/compiler": "19.1.2", + "typescript": ">=5.5 <5.8" } }, "node_modules/@angular/core": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.0.6.tgz", - "integrity": "sha512-9N7FmdRHtS7zfXC/wnyap/reX7fgiOrWpVivayHjWP4RkLYXJAzJIpLyew0jrx4vf8r3lZnC0Zmq0PW007Ngjw==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.2.tgz", + "integrity": "sha512-WrOzn9X2LsXxS27fB1WNjYsFVUKvuDuZ0ERfesWb/t1prz09q7fi/YK0TXx7XOby9CfNe4aXjzRPQL2zgFuMWQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -294,9 +298,9 @@ } }, "node_modules/@angular/forms": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.0.6.tgz", - "integrity": "sha512-HogauPvgDQHw2xxqKBaFgKTRRcc1xWeI/PByDCf3U6YsaqpF53Mz2CJh8X2bg2bY1RGKb67MZw7DBGFRvXx4bg==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.2.tgz", + "integrity": "sha512-PmHoF4JkGbYK0pdBH2FwAKU9VBydAIjJQlol3anjUQF2zfkITeTqfVNmys1mFhojGR+ZppV0zZ+8MhI/501P7A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -305,16 +309,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.6", - "@angular/core": "19.0.6", - "@angular/platform-browser": "19.0.6", + "@angular/common": "19.1.2", + "@angular/core": "19.1.2", + "@angular/platform-browser": "19.1.2", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.0.6.tgz", - "integrity": "sha512-MWiToGy7Pa0rR61sgnEuu7dfZXpAw0g7nkSnw4xdjUf974OOOfI1LS9O9YevJibtdW8sPa1HaoXXwcb7N03B5A==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.2.tgz", + "integrity": "sha512-fk/OrL4r5jUjAi1WTv9LGTm+DXWrPtDBpoX4z5Ze6Se+x3/6pTn1Rty1C4MNZvHiTjIQGQNRnq447GdiOjhg9w==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -323,9 +327,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "19.0.6", - "@angular/common": "19.0.6", - "@angular/core": "19.0.6" + "@angular/animations": "19.1.2", + "@angular/common": "19.1.2", + "@angular/core": "19.1.2" }, "peerDependenciesMeta": { "@angular/animations": { @@ -643,9 +647,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", - "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "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" ], @@ -660,9 +664,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", - "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "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" ], @@ -677,9 +681,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", - "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "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" ], @@ -694,9 +698,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", - "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", "cpu": [ "x64" ], @@ -711,9 +715,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "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" ], @@ -728,9 +732,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", - "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", "cpu": [ "x64" ], @@ -745,9 +749,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", - "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "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" ], @@ -762,9 +766,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", - "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "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" ], @@ -779,9 +783,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", - "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "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" ], @@ -796,9 +800,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", - "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "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" ], @@ -813,9 +817,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", - "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "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" ], @@ -830,9 +834,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", - "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", "cpu": [ "loong64" ], @@ -847,9 +851,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", - "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "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" ], @@ -864,9 +868,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", - "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "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" ], @@ -881,9 +885,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", - "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "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" ], @@ -898,9 +902,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", - "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "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" ], @@ -915,9 +919,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", - "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", "cpu": [ "x64" ], @@ -931,10 +935,27 @@ "node": ">=18" } }, + "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, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", - "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "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" ], @@ -949,9 +970,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "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" ], @@ -966,9 +987,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", - "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "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" ], @@ -983,9 +1004,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", - "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", "cpu": [ "x64" ], @@ -1000,9 +1021,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", - "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", "cpu": [ "arm64" ], @@ -1017,9 +1038,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", - "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "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" ], @@ -1034,9 +1055,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", - "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "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" ], @@ -1071,14 +1092,14 @@ } }, "node_modules/@inquirer/confirm": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.0.2.tgz", - "integrity": "sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==", + "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": { - "@inquirer/core": "^10.1.0", - "@inquirer/type": "^3.0.1" + "@inquirer/core": "^10.1.2", + "@inquirer/type": "^3.0.2" }, "engines": { "node": ">=18" @@ -1207,22 +1228,22 @@ } }, "node_modules/@inquirer/prompts": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.1.0.tgz", - "integrity": "sha512-5U/XiVRH2pp1X6gpNAjWOglMf38/Ys522ncEHIKT1voRUvSj/DQnR22OVxHnwu5S+rCFaUiPQ57JOtMFQayqYA==", + "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": { - "@inquirer/checkbox": "^4.0.2", - "@inquirer/confirm": "^5.0.2", - "@inquirer/editor": "^4.1.0", - "@inquirer/expand": "^4.0.2", - "@inquirer/input": "^4.0.2", - "@inquirer/number": "^3.0.2", - "@inquirer/password": "^4.0.2", - "@inquirer/rawlist": "^4.0.2", - "@inquirer/search": "^3.0.2", - "@inquirer/select": "^4.0.2" + "@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": ">=18" @@ -1520,9 +1541,9 @@ } }, "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.1.5.tgz", - "integrity": "sha512-ue5PSOzHMCIYrfvPP/MRS6hsKKLzqqhcdAvJCO8uFlDdj598EhgnacuOTuqA6uBK5rgiZXfDWyb7DVZSiBKxBA==", + "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" ], @@ -1534,9 +1555,9 @@ ] }, "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.1.5.tgz", - "integrity": "sha512-CGhsb0R5vE6mMNCoSfxHFD8QTvBHM51gs4DBeigTYHWnYv2V5YpJkC4rMo5qAAFifuUcc0+a8a3SIU0c9NrfNw==", + "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" ], @@ -1548,9 +1569,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.1.5.tgz", - "integrity": "sha512-3WeW328DN+xB5PZdhSWmqE+t3+44xWXEbqQ+caWJEZfOFdLp9yklBZEbVqVdqzznkoaXJYxTCp996KD6HmANeg==", + "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" ], @@ -1562,9 +1583,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.1.5.tgz", - "integrity": "sha512-LAjaoOcBHGj6fiYB8ureiqPoph4eygbXu4vcOF+hsxiY74n8ilA7rJMmGUT0K0JOB5lmRQHSmor3mytRjS4qeQ==", + "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" ], @@ -1576,9 +1597,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.1.5.tgz", - "integrity": "sha512-k/IklElP70qdCXOQixclSl2GPLFiopynGoKX1FqDd1/H0E3Fo1oPwjY2rEVu+0nS3AOw1sryStdXk8CW3cVIsw==", + "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" ], @@ -1590,9 +1611,9 @@ ] }, "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.1.5.tgz", - "integrity": "sha512-KYar6W8nraZfSJspcK7Kp7hdj238X/FNauYbZyrqPBrtsXI1hvI4/KcRcRGP50aQoV7fkKDyJERlrQGMGTZUsA==", + "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" ], @@ -2526,9 +2547,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.26.0.tgz", - "integrity": "sha512-gJNwtPDGEaOEgejbaseY6xMFu+CPltsc8/T+diUTTbOQLqD+bnrJq9ulH6WD69TqwqWmrfRAtUv30cCFZlbGTQ==", + "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" ], @@ -2540,9 +2561,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.26.0.tgz", - "integrity": "sha512-YJa5Gy8mEZgz5JquFruhJODMq3lTHWLm1fOy+HIANquLzfIOzE9RA5ie3JjCdVb9r46qfAQY/l947V0zfGJ0OQ==", + "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" ], @@ -2554,9 +2575,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.26.0.tgz", - "integrity": "sha512-ErTASs8YKbqTBoPLp/kA1B1Um5YSom8QAc4rKhg7b9tyyVqDBlQxy7Bf2wW7yIlPGPg2UODDQcbkTlruPzDosw==", + "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" ], @@ -2568,9 +2589,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.26.0.tgz", - "integrity": "sha512-wbgkYDHcdWW+NqP2mnf2NOuEbOLzDblalrOWcPyY6+BRbVhliavon15UploG7PpBRQ2bZJnbmh8o3yLoBvDIHA==", + "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" ], @@ -2582,9 +2603,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.26.0.tgz", - "integrity": "sha512-Y9vpjfp9CDkAG4q/uwuhZk96LP11fBz/bYdyg9oaHYhtGZp7NrbkQrj/66DYMMP2Yo/QPAsVHkV891KyO52fhg==", + "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" ], @@ -2596,9 +2617,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.26.0.tgz", - "integrity": "sha512-A/jvfCZ55EYPsqeaAt/yDAG4q5tt1ZboWMHEvKAH9Zl92DWvMIbnZe/f/eOXze65aJaaKbL+YeM0Hz4kLQvdwg==", + "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" ], @@ -2610,9 +2631,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.26.0.tgz", - "integrity": "sha512-paHF1bMXKDuizaMODm2bBTjRiHxESWiIyIdMugKeLnjuS1TCS54MF5+Y5Dx8Ui/1RBPVRE09i5OUlaLnv8OGnA==", + "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" ], @@ -2624,9 +2645,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.26.0.tgz", - "integrity": "sha512-cwxiHZU1GAs+TMxvgPfUDtVZjdBdTsQwVnNlzRXC5QzIJ6nhfB4I1ahKoe9yPmoaA/Vhf7m9dB1chGPpDRdGXg==", + "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" ], @@ -2638,9 +2659,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.26.0.tgz", - "integrity": "sha512-4daeEUQutGRCW/9zEo8JtdAgtJ1q2g5oHaoQaZbMSKaIWKDQwQ3Yx0/3jJNmpzrsScIPtx/V+1AfibLisb3AMQ==", + "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" ], @@ -2652,9 +2673,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.26.0.tgz", - "integrity": "sha512-eGkX7zzkNxvvS05ROzJ/cO/AKqNvR/7t1jA3VZDi2vRniLKwAWxUr85fH3NsvtxU5vnUUKFHKh8flIBdlo2b3Q==", + "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" ], @@ -2665,10 +2686,24 @@ "linux" ] }, + "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/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.26.0.tgz", - "integrity": "sha512-Odp/lgHbW/mAqw/pU21goo5ruWsytP7/HCC/liOt0zcGG0llYWKrd10k9Fj0pdj3prQ63N5yQLCLiE7HTX+MYw==", + "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" ], @@ -2680,9 +2715,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.26.0.tgz", - "integrity": "sha512-MBR2ZhCTzUgVD0OJdTzNeF4+zsVogIR1U/FsyuFerwcqjZGvg2nYe24SAHp8O5sN8ZkRVbHwlYeHqcSQ8tcYew==", + "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" ], @@ -2694,9 +2729,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.26.0.tgz", - "integrity": "sha512-YYcg8MkbN17fMbRMZuxwmxWqsmQufh3ZJFxFGoHjrE7bv0X+T6l3glcdzd7IKLiwhT+PZOJCblpnNlz1/C3kGQ==", + "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" ], @@ -2708,9 +2743,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.26.0.tgz", - "integrity": "sha512-ZuwpfjCwjPkAOxpjAEjabg6LRSfL7cAJb6gSQGZYjGhadlzKKywDkCUnJ+KEfrNY1jH5EEoSIKLCb572jSiglA==", + "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" ], @@ -2722,9 +2757,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.26.0.tgz", - "integrity": "sha512-+HJD2lFS86qkeF8kNu0kALtifMpPCZU80HvwztIKnYwym3KnA1os6nsX4BGSTLtS2QVAGG1P3guRgsYyMA0Yhg==", + "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" ], @@ -2736,9 +2771,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.26.0.tgz", - "integrity": "sha512-WUQzVFWPSw2uJzX4j6YEbMAiLbs0BUysgysh8s817doAYhR5ybqTI1wtKARQKo6cGop3pHnrUJPFCsXdoFaimQ==", + "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" ], @@ -2750,9 +2785,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.26.0.tgz", - "integrity": "sha512-D4CxkazFKBfN1akAIY6ieyOqzoOoBV1OICxgUblWxff/pSjCA2khXlASUx7mK6W1oP4McqhgcCsu6QaLj3WMWg==", + "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" ], @@ -2764,9 +2799,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.26.0.tgz", - "integrity": "sha512-2x8MO1rm4PGEP0xWbubJW5RtbNLk3puzAMaLQd3B3JHVw4KcHlmXcO+Wewx9zCoo7EUFiMlu/aZbCJ7VjMzAag==", + "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" ], @@ -2778,14 +2813,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.0.7.tgz", - "integrity": "sha512-1WtTqKFPuEaV99VIP+y/gf/XW3TVJh/NbJbbEF4qYpp7qQiJ4ntF4klVZmsJcQzFucZSzlg91QVMPQKev5WZGA==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.3.tgz", + "integrity": "sha512-LG3OKZG1Dl1lxNIc81jr82WSUaDCYlg/SEJ6A78p8AaZtTFKf14WenJTeG0XZPX45l26BdZSjn9MUTCggxQvGQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.7", - "@angular-devkit/schematics": "19.0.7", + "@angular-devkit/core": "19.1.3", + "@angular-devkit/schematics": "19.1.3", "jsonc-parser": "3.3.1" }, "engines": { @@ -2906,9 +2941,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.6.tgz", - "integrity": "sha512-qNiuwC4ZDAUNcY47xgaSuS92cjf8JbSUoaKS77bmLG1rU7MlATVSiw/IlrjtIyyskXBZ8KkNfjK/P5na7rgXbQ==", + "version": "22.10.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", + "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", "dev": true, "license": "MIT", "peer": true, @@ -2917,16 +2952,16 @@ } }, "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", - "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", + "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": ">=14.6.0" + "node": ">=14.21.3" }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, "node_modules/@yarnpkg/lockfile": { @@ -3062,9 +3097,9 @@ "license": "MIT" }, "node_modules/beasties": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.1.0.tgz", - "integrity": "sha512-+Ssscd2gVG24qRNC+E2g88D+xsQW4xwakWtKAiGEQ3Pw54/FGdyo9RrfxhGhEv6ilFVbB7r3Lgx+QnAxnSpECw==", + "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": { @@ -3072,10 +3107,13 @@ "css-what": "^6.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", - "htmlparser2": "^9.0.0", + "htmlparser2": "^9.1.0", "picocolors": "^1.1.1", - "postcss": "^8.4.47", + "postcss": "^8.4.49", "postcss-media-query-parser": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" } }, "node_modules/bl": { @@ -3264,9 +3302,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001692", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz", - "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==", + "version": "1.0.30001695", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz", + "integrity": "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==", "dev": true, "funding": [ { @@ -3676,9 +3714,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.82", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.82.tgz", - "integrity": "sha512-Zq16uk1hfQhyGx5GpwPAYDwddJuSGhtRhgOA2mCxANYaDT79nAeGnaXogMGng4KqLaJUVnOnuL0+TDop9nLOiA==", + "version": "1.5.84", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.84.tgz", + "integrity": "sha512-I+DQ8xgafao9Ha6y0qjHHvpZ9OfyA1qKlkHkjywxzniORU2awxyz7f/iVJcULmrF2yrM3nHQf+iDjJtbbexd/g==", "dev": true, "license": "ISC" }, @@ -3758,9 +3796,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -3771,30 +3809,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" + "@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/escalade": { @@ -3844,9 +3883,9 @@ "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "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": { @@ -3854,16 +3893,16 @@ "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" } }, "node_modules/fast-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.5.tgz", - "integrity": "sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", "dev": true, "funding": [ { @@ -4131,13 +4170,13 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "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": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { @@ -4530,9 +4569,9 @@ } }, "node_modules/lmdb": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.1.5.tgz", - "integrity": "sha512-46Mch5Drq+A93Ss3gtbg+Xuvf5BOgIuvhKDWoGa3HcPHI6BL2NCOkRdSx1D4VfzwrxhnsjbyIVsLRlQHu6URvw==", + "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", @@ -4548,12 +4587,12 @@ "download-lmdb-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.1.5", - "@lmdb/lmdb-darwin-x64": "3.1.5", - "@lmdb/lmdb-linux-arm": "3.1.5", - "@lmdb/lmdb-linux-arm64": "3.1.5", - "@lmdb/lmdb-linux-x64": "3.1.5", - "@lmdb/lmdb-win32-x64": "3.1.5" + "@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/log-symbols": { @@ -4713,9 +4752,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "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, "license": "MIT", "dependencies": { @@ -5256,9 +5295,9 @@ } }, "node_modules/npm-package-arg": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.0.tgz", - "integrity": "sha512-ZTE0hbwSdTNL+Stx2zxSqdu2KZfNDcrtrLdIk7XGnQFYBWYDho/ORvXtn5XEePcL3tFpGjHCV3X3xrtDh7eZ+A==", + "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": { @@ -5596,9 +5635,9 @@ } }, "node_modules/piscina": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.7.0.tgz", - "integrity": "sha512-b8hvkpp9zS0zsfa939b/jXbe64Z2gZv0Ha7FYPNUiDIB1y2AtxcOZdfP8xN8HFjUaqQiT9gRlfjAsoL8vdJ1Iw==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.8.0.tgz", + "integrity": "sha512-EZJb+ZxDrQf3dihsUL7p42pjNyrNIFJCrRHPMgxu/svsj+P3xS3fuEWp7k2+rfsavfl1N0G29b1HGs7J0m8rZA==", "dev": true, "license": "MIT", "optionalDependencies": { @@ -5750,19 +5789,22 @@ } }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "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.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5829,9 +5871,9 @@ } }, "node_modules/rollup": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.26.0.tgz", - "integrity": "sha512-ilcl12hnWonG8f+NxU6BlgysVA0gvY2l8N0R84S1HcINbW20bvwuCngJkkInV6LXhwRpucsW5k1ovDwEdBVrNg==", + "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": { @@ -5845,24 +5887,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.26.0", - "@rollup/rollup-android-arm64": "4.26.0", - "@rollup/rollup-darwin-arm64": "4.26.0", - "@rollup/rollup-darwin-x64": "4.26.0", - "@rollup/rollup-freebsd-arm64": "4.26.0", - "@rollup/rollup-freebsd-x64": "4.26.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.26.0", - "@rollup/rollup-linux-arm-musleabihf": "4.26.0", - "@rollup/rollup-linux-arm64-gnu": "4.26.0", - "@rollup/rollup-linux-arm64-musl": "4.26.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.26.0", - "@rollup/rollup-linux-riscv64-gnu": "4.26.0", - "@rollup/rollup-linux-s390x-gnu": "4.26.0", - "@rollup/rollup-linux-x64-gnu": "4.26.0", - "@rollup/rollup-linux-x64-musl": "4.26.0", - "@rollup/rollup-win32-arm64-msvc": "4.26.0", - "@rollup/rollup-win32-ia32-msvc": "4.26.0", - "@rollup/rollup-win32-x64-msvc": "4.26.0", + "@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" } }, @@ -5928,9 +5971,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.80.7", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.7.tgz", - "integrity": "sha512-MVWvN0u5meytrSjsU7AWsbhoXi1sc58zADXFllfZzbsBT1GHjjar6JwBINYPRrkx/zqnQ6uqbQuHgE95O+C+eQ==", + "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": { @@ -6136,9 +6179,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", - "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", + "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" }, @@ -6464,9 +6507,9 @@ } }, "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "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": { @@ -6571,21 +6614,21 @@ } }, "node_modules/vite": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.7.tgz", + "integrity": "sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.24.2", + "postcss": "^8.4.49", + "rollup": "^4.23.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -6594,19 +6637,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.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.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -6627,439 +6676,15 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, "node_modules/watchpack": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.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 734e85fab027..b0dd97e3bb47 100644 --- a/adev/src/content/tutorials/learn-angular/common/package-lock.json +++ b/adev/src/content/tutorials/learn-angular/common/package-lock.json @@ -22,7 +22,7 @@ "@angular/build": "^19.0.0", "@angular/cli": "^19.0.0", "@angular/compiler-cli": "^19.0.0", - "typescript": "~5.6.3" + "typescript": "~5.7.0" } }, "node_modules/@ampproject/remapping": { @@ -40,13 +40,13 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1900.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1900.7.tgz", - "integrity": "sha512-3dRV0IB+MbNYbAGbYEFMcABkMphqcTvn5MG79dQkwcf2a9QZxCq2slwf/rIleWoDUcFm9r1NnVPYrTYNYJaqQg==", + "version": "0.1901.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.3.tgz", + "integrity": "sha512-bXhcSP23MKGRuKjI0j+JEDssuFwyprVS0czIeNswj2VTuWyx9y8GjnH2kJXeDETbX0pNbUjThkMsk8cZ5b2YTg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.7", + "@angular-devkit/core": "19.1.3", "rxjs": "7.8.1" }, "engines": { @@ -56,9 +56,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.7.tgz", - "integrity": "sha512-VyuORSitT6LIaGUEF0KEnv2TwNaeWl6L3/4L4stok0BJ23B4joVca2DYVcrLC1hSzz8V4dwVgSlbNIgjgGdVpg==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.3.tgz", + "integrity": "sha512-of/TKfJ/vL+/qvr4PbDTtqbFJGFHPfu6bEJrIZsLMYA+Mej8SyTx3kDm4LLnKQBtWVYDqkrxvcpOb4+NmHNLfA==", "dev": true, "license": "MIT", "dependencies": { @@ -84,15 +84,15 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.7.tgz", - "integrity": "sha512-BHXQv6kMc9xo4TH9lhwMv8nrZXHkLioQvLun2qYjwvOsyzt3qd+sUM9wpHwbG6t+01+FIQ05iNN9ox+Cvpndgg==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.3.tgz", + "integrity": "sha512-DfN45eJQtfXXeQwjb7vDqSJ+8e6BW3rXUB2i6IC2CbOYrLWhMBgfv3/uTm++IbCFW2zX3Yk3yqq3d4yua2no7w==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.7", + "@angular-devkit/core": "19.1.3", "jsonc-parser": "3.3.1", - "magic-string": "0.30.12", + "magic-string": "0.30.17", "ora": "5.4.1", "rxjs": "7.8.1" }, @@ -103,36 +103,36 @@ } }, "node_modules/@angular/build": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.0.7.tgz", - "integrity": "sha512-AFvhRa6sfXG8NmS8AN7TvE8q2kVcMw+zXMZzo981cqwnOwJy4VHU0htqm5OZQnohVJM0pP8SBAuROWO4yRrxCA==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.3.tgz", + "integrity": "sha512-NRYBNAyCCn+6XEHv/guVZ+Y/Fan7klW6CL938G2aDzbVipSt5xCCRxYgXwACBv5BzieV16SFnQYldAzyNs0uUg==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1900.7", + "@angular-devkit/architect": "0.1901.3", "@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.0.2", - "@vitejs/plugin-basic-ssl": "1.1.0", - "beasties": "0.1.0", + "@inquirer/confirm": "5.1.1", + "@vitejs/plugin-basic-ssl": "1.2.0", + "beasties": "0.2.0", "browserslist": "^4.23.0", - "esbuild": "0.24.0", - "fast-glob": "3.3.2", - "https-proxy-agent": "7.0.5", + "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.12", + "magic-string": "0.30.17", "mrmime": "2.0.0", "parse5-html-rewriting-stream": "7.0.0", "picomatch": "4.0.2", - "piscina": "4.7.0", - "rollup": "4.26.0", - "sass": "1.80.7", + "piscina": "4.8.0", + "rollup": "4.30.1", + "sass": "1.83.1", "semver": "7.6.3", - "vite": "5.4.11", + "vite": "6.0.7", "watchpack": "2.4.2" }, "engines": { @@ -141,7 +141,7 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "lmdb": "3.1.5" + "lmdb": "3.2.2" }, "peerDependencies": { "@angular/compiler": "^19.0.0", @@ -149,11 +149,12 @@ "@angular/localize": "^19.0.0", "@angular/platform-server": "^19.0.0", "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.0.7", + "@angular/ssr": "^19.1.3", "less": "^4.2.0", + "ng-packagr": "^19.0.0", "postcss": "^8.4.0", "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.5 <5.7" + "typescript": ">=5.5 <5.8" }, "peerDependenciesMeta": { "@angular/localize": { @@ -171,6 +172,9 @@ "less": { "optional": true }, + "ng-packagr": { + "optional": true + }, "postcss": { "optional": true }, @@ -180,26 +184,26 @@ } }, "node_modules/@angular/cli": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.0.7.tgz", - "integrity": "sha512-y6C4B4XdiZwe2+OADLWXyKqUVvW/XDzTuJ2mZ5PhTnSiiXDN4zRWId1F5wA8ve8vlbUKApPHXRQuaqiQJmA24g==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.3.tgz", + "integrity": "sha512-GJGH3Xw7/zm12myA2R4Dg8+ny3p9tW00tx33YIK8vFjOUKycqgWaKfpYCe2s9egrm2Pew/DclHCD+IUwEAz1GQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1900.7", - "@angular-devkit/core": "19.0.7", - "@angular-devkit/schematics": "19.0.7", - "@inquirer/prompts": "7.1.0", + "@angular-devkit/architect": "0.1901.3", + "@angular-devkit/core": "19.1.3", + "@angular-devkit/schematics": "19.1.3", + "@inquirer/prompts": "7.2.1", "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.0.7", + "@schematics/angular": "19.1.3", "@yarnpkg/lockfile": "1.1.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", "listr2": "8.2.5", - "npm-package-arg": "12.0.0", + "npm-package-arg": "12.0.1", "npm-pick-manifest": "10.0.0", "pacote": "20.0.0", - "resolve": "1.22.8", + "resolve": "1.22.10", "semver": "7.6.3", "symbol-observable": "4.0.0", "yargs": "17.7.2" @@ -214,9 +218,9 @@ } }, "node_modules/@angular/common": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.0.6.tgz", - "integrity": "sha512-r9IDD0+UGkrQkjyX+pApeDmIJ9INpr1uYlgmmlWNBJCVNr9SKKIVZV60sssgadew6bGynKN9dW4mGsmEzzb5BA==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.2.tgz", + "integrity": "sha512-6IhBXwz97pbXA+3vHw1hQlv4M0gc5NrDZSCQeffcraE6wpFMzo8vLcYAiNxpSyTFS7YLzCALdS6kYXVP2FBy1g==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -225,14 +229,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.6", + "@angular/core": "19.1.2", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.0.6.tgz", - "integrity": "sha512-g8A6QOsiCJnRi5Hz0sASIpRQoAGxEgnjz0JanfrMNRedY4MpdIS1V0AeCSKTsMRlV7tQl3ng2Gse/tsb51HI3Q==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.2.tgz", + "integrity": "sha512-CThpvyims1aoPtqUA5UCB0lEI8lDnWBuY6VpMST4YCxhYuPmDWrwKcYXOJU1w/5yEeR8bAOvWIkKdA83MAEyHw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -241,7 +245,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.6" + "@angular/core": "19.1.2" }, "peerDependenciesMeta": { "@angular/core": { @@ -250,9 +254,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.0.6.tgz", - "integrity": "sha512-fHtwI5rCe3LmKDoaqlqLAPdNmLrbeCiMYVe+X1BHgApaqNCyAwcuJxuf8Q5R5su7nHiLmlmB74o1ZS/V+0cQ+g==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.2.tgz", + "integrity": "sha512-CaZTG9arDVc9mGl/abqWsg79VbHAvo6ABtJa/Z6CJ6m2Y0HQPTJR6psiFqjnTSBUK43LRx8dDV3T8wIZa7DNpg==", "dev": true, "license": "MIT", "dependencies": { @@ -274,14 +278,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.0.6", - "typescript": ">=5.5 <5.7" + "@angular/compiler": "19.1.2", + "typescript": ">=5.5 <5.8" } }, "node_modules/@angular/core": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.0.6.tgz", - "integrity": "sha512-9N7FmdRHtS7zfXC/wnyap/reX7fgiOrWpVivayHjWP4RkLYXJAzJIpLyew0jrx4vf8r3lZnC0Zmq0PW007Ngjw==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.2.tgz", + "integrity": "sha512-WrOzn9X2LsXxS27fB1WNjYsFVUKvuDuZ0ERfesWb/t1prz09q7fi/YK0TXx7XOby9CfNe4aXjzRPQL2zgFuMWQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -295,9 +299,9 @@ } }, "node_modules/@angular/forms": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.0.6.tgz", - "integrity": "sha512-HogauPvgDQHw2xxqKBaFgKTRRcc1xWeI/PByDCf3U6YsaqpF53Mz2CJh8X2bg2bY1RGKb67MZw7DBGFRvXx4bg==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.2.tgz", + "integrity": "sha512-PmHoF4JkGbYK0pdBH2FwAKU9VBydAIjJQlol3anjUQF2zfkITeTqfVNmys1mFhojGR+ZppV0zZ+8MhI/501P7A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -306,16 +310,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.6", - "@angular/core": "19.0.6", - "@angular/platform-browser": "19.0.6", + "@angular/common": "19.1.2", + "@angular/core": "19.1.2", + "@angular/platform-browser": "19.1.2", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.0.6.tgz", - "integrity": "sha512-MWiToGy7Pa0rR61sgnEuu7dfZXpAw0g7nkSnw4xdjUf974OOOfI1LS9O9YevJibtdW8sPa1HaoXXwcb7N03B5A==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.2.tgz", + "integrity": "sha512-fk/OrL4r5jUjAi1WTv9LGTm+DXWrPtDBpoX4z5Ze6Se+x3/6pTn1Rty1C4MNZvHiTjIQGQNRnq447GdiOjhg9w==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -324,9 +328,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "19.0.6", - "@angular/common": "19.0.6", - "@angular/core": "19.0.6" + "@angular/animations": "19.1.2", + "@angular/common": "19.1.2", + "@angular/core": "19.1.2" }, "peerDependenciesMeta": { "@angular/animations": { @@ -335,9 +339,9 @@ } }, "node_modules/@angular/router": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.0.6.tgz", - "integrity": "sha512-G1oz+TclPk48h6b6B4s5J3DfrDVJrrxKOA+KWeVQP4e1B8ld7/dCMf5nn3yqS4BGs4yLecxMxyvbOvOiZ//lxw==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.1.2.tgz", + "integrity": "sha512-yIz86uSTKFttwgWGnzHeFUvoHP+QNk+2w2OAR9UCbRoXpfx5oDhZj/zZQLmuqqpSAQyJ6qicqucEBUahA938pg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -346,9 +350,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.6", - "@angular/core": "19.0.6", - "@angular/platform-browser": "19.0.6", + "@angular/common": "19.1.2", + "@angular/core": "19.1.2", + "@angular/platform-browser": "19.1.2", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -662,9 +666,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", - "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "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" ], @@ -679,9 +683,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", - "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "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" ], @@ -696,9 +700,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", - "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "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" ], @@ -713,9 +717,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", - "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", "cpu": [ "x64" ], @@ -730,9 +734,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "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" ], @@ -747,9 +751,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", - "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", "cpu": [ "x64" ], @@ -764,9 +768,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", - "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "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" ], @@ -781,9 +785,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", - "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "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" ], @@ -798,9 +802,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", - "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "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" ], @@ -815,9 +819,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", - "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "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" ], @@ -832,9 +836,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", - "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "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" ], @@ -849,9 +853,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", - "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", "cpu": [ "loong64" ], @@ -866,9 +870,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", - "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "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" ], @@ -883,9 +887,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", - "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "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" ], @@ -900,9 +904,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", - "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "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" ], @@ -917,9 +921,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", - "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "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" ], @@ -934,9 +938,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", - "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", "cpu": [ "x64" ], @@ -950,10 +954,27 @@ "node": ">=18" } }, + "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, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", - "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "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" ], @@ -968,9 +989,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "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" ], @@ -985,9 +1006,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", - "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "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" ], @@ -1002,9 +1023,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", - "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", "cpu": [ "x64" ], @@ -1019,9 +1040,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", - "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", "cpu": [ "arm64" ], @@ -1036,9 +1057,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", - "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "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" ], @@ -1053,9 +1074,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", - "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "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" ], @@ -1090,14 +1111,14 @@ } }, "node_modules/@inquirer/confirm": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.0.2.tgz", - "integrity": "sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==", + "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": { - "@inquirer/core": "^10.1.0", - "@inquirer/type": "^3.0.1" + "@inquirer/core": "^10.1.2", + "@inquirer/type": "^3.0.2" }, "engines": { "node": ">=18" @@ -1226,22 +1247,22 @@ } }, "node_modules/@inquirer/prompts": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.1.0.tgz", - "integrity": "sha512-5U/XiVRH2pp1X6gpNAjWOglMf38/Ys522ncEHIKT1voRUvSj/DQnR22OVxHnwu5S+rCFaUiPQ57JOtMFQayqYA==", + "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": { - "@inquirer/checkbox": "^4.0.2", - "@inquirer/confirm": "^5.0.2", - "@inquirer/editor": "^4.1.0", - "@inquirer/expand": "^4.0.2", - "@inquirer/input": "^4.0.2", - "@inquirer/number": "^3.0.2", - "@inquirer/password": "^4.0.2", - "@inquirer/rawlist": "^4.0.2", - "@inquirer/search": "^3.0.2", - "@inquirer/select": "^4.0.2" + "@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": ">=18" @@ -1539,9 +1560,9 @@ } }, "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.1.5.tgz", - "integrity": "sha512-ue5PSOzHMCIYrfvPP/MRS6hsKKLzqqhcdAvJCO8uFlDdj598EhgnacuOTuqA6uBK5rgiZXfDWyb7DVZSiBKxBA==", + "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" ], @@ -1553,9 +1574,9 @@ ] }, "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.1.5.tgz", - "integrity": "sha512-CGhsb0R5vE6mMNCoSfxHFD8QTvBHM51gs4DBeigTYHWnYv2V5YpJkC4rMo5qAAFifuUcc0+a8a3SIU0c9NrfNw==", + "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" ], @@ -1567,9 +1588,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.1.5.tgz", - "integrity": "sha512-3WeW328DN+xB5PZdhSWmqE+t3+44xWXEbqQ+caWJEZfOFdLp9yklBZEbVqVdqzznkoaXJYxTCp996KD6HmANeg==", + "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" ], @@ -1581,9 +1602,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.1.5.tgz", - "integrity": "sha512-LAjaoOcBHGj6fiYB8ureiqPoph4eygbXu4vcOF+hsxiY74n8ilA7rJMmGUT0K0JOB5lmRQHSmor3mytRjS4qeQ==", + "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" ], @@ -1595,9 +1616,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.1.5.tgz", - "integrity": "sha512-k/IklElP70qdCXOQixclSl2GPLFiopynGoKX1FqDd1/H0E3Fo1oPwjY2rEVu+0nS3AOw1sryStdXk8CW3cVIsw==", + "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" ], @@ -1609,9 +1630,9 @@ ] }, "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.1.5.tgz", - "integrity": "sha512-KYar6W8nraZfSJspcK7Kp7hdj238X/FNauYbZyrqPBrtsXI1hvI4/KcRcRGP50aQoV7fkKDyJERlrQGMGTZUsA==", + "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" ], @@ -2545,9 +2566,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.26.0.tgz", - "integrity": "sha512-gJNwtPDGEaOEgejbaseY6xMFu+CPltsc8/T+diUTTbOQLqD+bnrJq9ulH6WD69TqwqWmrfRAtUv30cCFZlbGTQ==", + "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" ], @@ -2559,9 +2580,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.26.0.tgz", - "integrity": "sha512-YJa5Gy8mEZgz5JquFruhJODMq3lTHWLm1fOy+HIANquLzfIOzE9RA5ie3JjCdVb9r46qfAQY/l947V0zfGJ0OQ==", + "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" ], @@ -2573,9 +2594,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.26.0.tgz", - "integrity": "sha512-ErTASs8YKbqTBoPLp/kA1B1Um5YSom8QAc4rKhg7b9tyyVqDBlQxy7Bf2wW7yIlPGPg2UODDQcbkTlruPzDosw==", + "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" ], @@ -2587,9 +2608,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.26.0.tgz", - "integrity": "sha512-wbgkYDHcdWW+NqP2mnf2NOuEbOLzDblalrOWcPyY6+BRbVhliavon15UploG7PpBRQ2bZJnbmh8o3yLoBvDIHA==", + "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" ], @@ -2601,9 +2622,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.26.0.tgz", - "integrity": "sha512-Y9vpjfp9CDkAG4q/uwuhZk96LP11fBz/bYdyg9oaHYhtGZp7NrbkQrj/66DYMMP2Yo/QPAsVHkV891KyO52fhg==", + "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" ], @@ -2615,9 +2636,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.26.0.tgz", - "integrity": "sha512-A/jvfCZ55EYPsqeaAt/yDAG4q5tt1ZboWMHEvKAH9Zl92DWvMIbnZe/f/eOXze65aJaaKbL+YeM0Hz4kLQvdwg==", + "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" ], @@ -2629,9 +2650,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.26.0.tgz", - "integrity": "sha512-paHF1bMXKDuizaMODm2bBTjRiHxESWiIyIdMugKeLnjuS1TCS54MF5+Y5Dx8Ui/1RBPVRE09i5OUlaLnv8OGnA==", + "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" ], @@ -2643,9 +2664,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.26.0.tgz", - "integrity": "sha512-cwxiHZU1GAs+TMxvgPfUDtVZjdBdTsQwVnNlzRXC5QzIJ6nhfB4I1ahKoe9yPmoaA/Vhf7m9dB1chGPpDRdGXg==", + "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" ], @@ -2657,9 +2678,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.26.0.tgz", - "integrity": "sha512-4daeEUQutGRCW/9zEo8JtdAgtJ1q2g5oHaoQaZbMSKaIWKDQwQ3Yx0/3jJNmpzrsScIPtx/V+1AfibLisb3AMQ==", + "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" ], @@ -2671,9 +2692,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.26.0.tgz", - "integrity": "sha512-eGkX7zzkNxvvS05ROzJ/cO/AKqNvR/7t1jA3VZDi2vRniLKwAWxUr85fH3NsvtxU5vnUUKFHKh8flIBdlo2b3Q==", + "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" ], @@ -2684,10 +2705,24 @@ "linux" ] }, + "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/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.26.0.tgz", - "integrity": "sha512-Odp/lgHbW/mAqw/pU21goo5ruWsytP7/HCC/liOt0zcGG0llYWKrd10k9Fj0pdj3prQ63N5yQLCLiE7HTX+MYw==", + "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" ], @@ -2699,9 +2734,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.26.0.tgz", - "integrity": "sha512-MBR2ZhCTzUgVD0OJdTzNeF4+zsVogIR1U/FsyuFerwcqjZGvg2nYe24SAHp8O5sN8ZkRVbHwlYeHqcSQ8tcYew==", + "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" ], @@ -2713,9 +2748,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.26.0.tgz", - "integrity": "sha512-YYcg8MkbN17fMbRMZuxwmxWqsmQufh3ZJFxFGoHjrE7bv0X+T6l3glcdzd7IKLiwhT+PZOJCblpnNlz1/C3kGQ==", + "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" ], @@ -2727,9 +2762,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.26.0.tgz", - "integrity": "sha512-ZuwpfjCwjPkAOxpjAEjabg6LRSfL7cAJb6gSQGZYjGhadlzKKywDkCUnJ+KEfrNY1jH5EEoSIKLCb572jSiglA==", + "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" ], @@ -2741,9 +2776,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.26.0.tgz", - "integrity": "sha512-+HJD2lFS86qkeF8kNu0kALtifMpPCZU80HvwztIKnYwym3KnA1os6nsX4BGSTLtS2QVAGG1P3guRgsYyMA0Yhg==", + "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" ], @@ -2755,9 +2790,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.26.0.tgz", - "integrity": "sha512-WUQzVFWPSw2uJzX4j6YEbMAiLbs0BUysgysh8s817doAYhR5ybqTI1wtKARQKo6cGop3pHnrUJPFCsXdoFaimQ==", + "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" ], @@ -2769,9 +2804,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.26.0.tgz", - "integrity": "sha512-D4CxkazFKBfN1akAIY6ieyOqzoOoBV1OICxgUblWxff/pSjCA2khXlASUx7mK6W1oP4McqhgcCsu6QaLj3WMWg==", + "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" ], @@ -2783,9 +2818,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.26.0.tgz", - "integrity": "sha512-2x8MO1rm4PGEP0xWbubJW5RtbNLk3puzAMaLQd3B3JHVw4KcHlmXcO+Wewx9zCoo7EUFiMlu/aZbCJ7VjMzAag==", + "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" ], @@ -2797,14 +2832,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.0.7.tgz", - "integrity": "sha512-1WtTqKFPuEaV99VIP+y/gf/XW3TVJh/NbJbbEF4qYpp7qQiJ4ntF4klVZmsJcQzFucZSzlg91QVMPQKev5WZGA==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.3.tgz", + "integrity": "sha512-LG3OKZG1Dl1lxNIc81jr82WSUaDCYlg/SEJ6A78p8AaZtTFKf14WenJTeG0XZPX45l26BdZSjn9MUTCggxQvGQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.7", - "@angular-devkit/schematics": "19.0.7", + "@angular-devkit/core": "19.1.3", + "@angular-devkit/schematics": "19.1.3", "jsonc-parser": "3.3.1" }, "engines": { @@ -2925,9 +2960,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.6.tgz", - "integrity": "sha512-qNiuwC4ZDAUNcY47xgaSuS92cjf8JbSUoaKS77bmLG1rU7MlATVSiw/IlrjtIyyskXBZ8KkNfjK/P5na7rgXbQ==", + "version": "22.10.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", + "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", "dev": true, "license": "MIT", "peer": true, @@ -2936,16 +2971,16 @@ } }, "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", - "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", + "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": ">=14.6.0" + "node": ">=14.21.3" }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, "node_modules/@yarnpkg/lockfile": { @@ -3081,9 +3116,9 @@ "license": "MIT" }, "node_modules/beasties": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.1.0.tgz", - "integrity": "sha512-+Ssscd2gVG24qRNC+E2g88D+xsQW4xwakWtKAiGEQ3Pw54/FGdyo9RrfxhGhEv6ilFVbB7r3Lgx+QnAxnSpECw==", + "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": { @@ -3091,10 +3126,13 @@ "css-what": "^6.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", - "htmlparser2": "^9.0.0", + "htmlparser2": "^9.1.0", "picocolors": "^1.1.1", - "postcss": "^8.4.47", + "postcss": "^8.4.49", "postcss-media-query-parser": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" } }, "node_modules/bl": { @@ -3283,9 +3321,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001692", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz", - "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==", + "version": "1.0.30001695", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz", + "integrity": "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==", "dev": true, "funding": [ { @@ -3695,9 +3733,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.82", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.82.tgz", - "integrity": "sha512-Zq16uk1hfQhyGx5GpwPAYDwddJuSGhtRhgOA2mCxANYaDT79nAeGnaXogMGng4KqLaJUVnOnuL0+TDop9nLOiA==", + "version": "1.5.84", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.84.tgz", + "integrity": "sha512-I+DQ8xgafao9Ha6y0qjHHvpZ9OfyA1qKlkHkjywxzniORU2awxyz7f/iVJcULmrF2yrM3nHQf+iDjJtbbexd/g==", "dev": true, "license": "ISC" }, @@ -3777,9 +3815,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -3790,30 +3828,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" + "@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/escalade": { @@ -3863,9 +3902,9 @@ "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "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": { @@ -3873,16 +3912,16 @@ "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" } }, "node_modules/fast-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.5.tgz", - "integrity": "sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", "dev": true, "funding": [ { @@ -4150,13 +4189,13 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "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": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { @@ -4549,9 +4588,9 @@ } }, "node_modules/lmdb": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.1.5.tgz", - "integrity": "sha512-46Mch5Drq+A93Ss3gtbg+Xuvf5BOgIuvhKDWoGa3HcPHI6BL2NCOkRdSx1D4VfzwrxhnsjbyIVsLRlQHu6URvw==", + "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", @@ -4567,12 +4606,12 @@ "download-lmdb-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.1.5", - "@lmdb/lmdb-darwin-x64": "3.1.5", - "@lmdb/lmdb-linux-arm": "3.1.5", - "@lmdb/lmdb-linux-arm64": "3.1.5", - "@lmdb/lmdb-linux-x64": "3.1.5", - "@lmdb/lmdb-win32-x64": "3.1.5" + "@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/log-symbols": { @@ -4732,9 +4771,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "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, "license": "MIT", "dependencies": { @@ -5275,9 +5314,9 @@ } }, "node_modules/npm-package-arg": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.0.tgz", - "integrity": "sha512-ZTE0hbwSdTNL+Stx2zxSqdu2KZfNDcrtrLdIk7XGnQFYBWYDho/ORvXtn5XEePcL3tFpGjHCV3X3xrtDh7eZ+A==", + "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": { @@ -5615,9 +5654,9 @@ } }, "node_modules/piscina": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.7.0.tgz", - "integrity": "sha512-b8hvkpp9zS0zsfa939b/jXbe64Z2gZv0Ha7FYPNUiDIB1y2AtxcOZdfP8xN8HFjUaqQiT9gRlfjAsoL8vdJ1Iw==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.8.0.tgz", + "integrity": "sha512-EZJb+ZxDrQf3dihsUL7p42pjNyrNIFJCrRHPMgxu/svsj+P3xS3fuEWp7k2+rfsavfl1N0G29b1HGs7J0m8rZA==", "dev": true, "license": "MIT", "optionalDependencies": { @@ -5769,19 +5808,22 @@ } }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "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.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5848,9 +5890,9 @@ } }, "node_modules/rollup": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.26.0.tgz", - "integrity": "sha512-ilcl12hnWonG8f+NxU6BlgysVA0gvY2l8N0R84S1HcINbW20bvwuCngJkkInV6LXhwRpucsW5k1ovDwEdBVrNg==", + "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": { @@ -5864,24 +5906,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.26.0", - "@rollup/rollup-android-arm64": "4.26.0", - "@rollup/rollup-darwin-arm64": "4.26.0", - "@rollup/rollup-darwin-x64": "4.26.0", - "@rollup/rollup-freebsd-arm64": "4.26.0", - "@rollup/rollup-freebsd-x64": "4.26.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.26.0", - "@rollup/rollup-linux-arm-musleabihf": "4.26.0", - "@rollup/rollup-linux-arm64-gnu": "4.26.0", - "@rollup/rollup-linux-arm64-musl": "4.26.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.26.0", - "@rollup/rollup-linux-riscv64-gnu": "4.26.0", - "@rollup/rollup-linux-s390x-gnu": "4.26.0", - "@rollup/rollup-linux-x64-gnu": "4.26.0", - "@rollup/rollup-linux-x64-musl": "4.26.0", - "@rollup/rollup-win32-arm64-msvc": "4.26.0", - "@rollup/rollup-win32-ia32-msvc": "4.26.0", - "@rollup/rollup-win32-x64-msvc": "4.26.0", + "@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" } }, @@ -5947,9 +5990,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.80.7", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.7.tgz", - "integrity": "sha512-MVWvN0u5meytrSjsU7AWsbhoXi1sc58zADXFllfZzbsBT1GHjjar6JwBINYPRrkx/zqnQ6uqbQuHgE95O+C+eQ==", + "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": { @@ -6155,9 +6198,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", - "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", + "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" }, @@ -6483,9 +6526,9 @@ } }, "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "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": { @@ -6590,21 +6633,21 @@ } }, "node_modules/vite": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.7.tgz", + "integrity": "sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.24.2", + "postcss": "^8.4.49", + "rollup": "^4.23.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -6613,19 +6656,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.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.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -6646,439 +6695,15 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, "node_modules/watchpack": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.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 1da33db22aa7..833e32d2b01b 100644 --- a/adev/src/content/tutorials/playground/common/package-lock.json +++ b/adev/src/content/tutorials/playground/common/package-lock.json @@ -24,7 +24,7 @@ "@angular/build": "^19.0.0", "@angular/cli": "^19.0.0", "@angular/compiler-cli": "^19.0.0", - "typescript": "~5.6.3" + "typescript": "~5.7.0" } }, "node_modules/@ampproject/remapping": { @@ -42,13 +42,13 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1900.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1900.7.tgz", - "integrity": "sha512-3dRV0IB+MbNYbAGbYEFMcABkMphqcTvn5MG79dQkwcf2a9QZxCq2slwf/rIleWoDUcFm9r1NnVPYrTYNYJaqQg==", + "version": "0.1901.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.3.tgz", + "integrity": "sha512-bXhcSP23MKGRuKjI0j+JEDssuFwyprVS0czIeNswj2VTuWyx9y8GjnH2kJXeDETbX0pNbUjThkMsk8cZ5b2YTg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.7", + "@angular-devkit/core": "19.1.3", "rxjs": "7.8.1" }, "engines": { @@ -58,9 +58,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.7.tgz", - "integrity": "sha512-VyuORSitT6LIaGUEF0KEnv2TwNaeWl6L3/4L4stok0BJ23B4joVca2DYVcrLC1hSzz8V4dwVgSlbNIgjgGdVpg==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.3.tgz", + "integrity": "sha512-of/TKfJ/vL+/qvr4PbDTtqbFJGFHPfu6bEJrIZsLMYA+Mej8SyTx3kDm4LLnKQBtWVYDqkrxvcpOb4+NmHNLfA==", "dev": true, "license": "MIT", "dependencies": { @@ -86,15 +86,15 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.7.tgz", - "integrity": "sha512-BHXQv6kMc9xo4TH9lhwMv8nrZXHkLioQvLun2qYjwvOsyzt3qd+sUM9wpHwbG6t+01+FIQ05iNN9ox+Cvpndgg==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.3.tgz", + "integrity": "sha512-DfN45eJQtfXXeQwjb7vDqSJ+8e6BW3rXUB2i6IC2CbOYrLWhMBgfv3/uTm++IbCFW2zX3Yk3yqq3d4yua2no7w==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.7", + "@angular-devkit/core": "19.1.3", "jsonc-parser": "3.3.1", - "magic-string": "0.30.12", + "magic-string": "0.30.17", "ora": "5.4.1", "rxjs": "7.8.1" }, @@ -105,9 +105,9 @@ } }, "node_modules/@angular/animations": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.0.6.tgz", - "integrity": "sha512-dlXrFcw7RQNze1zjmrbwqcFd6zgEuqKwuExtEN1Fy26kQ+wqKIhYO6IG7PZGef53XpwN5DT16yve6UihJ2XeNg==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.1.2.tgz", + "integrity": "sha512-usf/TMBpQKRnVpEK/UzrcxtHrUgWvryMG1UDWOTsTxmfAKsYoLqy+gdcGOkSf9yEiNn8xBxFXeGqPbFPeA1fWQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -116,40 +116,40 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.6" + "@angular/core": "19.1.2" } }, "node_modules/@angular/build": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.0.7.tgz", - "integrity": "sha512-AFvhRa6sfXG8NmS8AN7TvE8q2kVcMw+zXMZzo981cqwnOwJy4VHU0htqm5OZQnohVJM0pP8SBAuROWO4yRrxCA==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.3.tgz", + "integrity": "sha512-NRYBNAyCCn+6XEHv/guVZ+Y/Fan7klW6CL938G2aDzbVipSt5xCCRxYgXwACBv5BzieV16SFnQYldAzyNs0uUg==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1900.7", + "@angular-devkit/architect": "0.1901.3", "@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.0.2", - "@vitejs/plugin-basic-ssl": "1.1.0", - "beasties": "0.1.0", + "@inquirer/confirm": "5.1.1", + "@vitejs/plugin-basic-ssl": "1.2.0", + "beasties": "0.2.0", "browserslist": "^4.23.0", - "esbuild": "0.24.0", - "fast-glob": "3.3.2", - "https-proxy-agent": "7.0.5", + "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.12", + "magic-string": "0.30.17", "mrmime": "2.0.0", "parse5-html-rewriting-stream": "7.0.0", "picomatch": "4.0.2", - "piscina": "4.7.0", - "rollup": "4.26.0", - "sass": "1.80.7", + "piscina": "4.8.0", + "rollup": "4.30.1", + "sass": "1.83.1", "semver": "7.6.3", - "vite": "5.4.11", + "vite": "6.0.7", "watchpack": "2.4.2" }, "engines": { @@ -158,7 +158,7 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "lmdb": "3.1.5" + "lmdb": "3.2.2" }, "peerDependencies": { "@angular/compiler": "^19.0.0", @@ -166,11 +166,12 @@ "@angular/localize": "^19.0.0", "@angular/platform-server": "^19.0.0", "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.0.7", + "@angular/ssr": "^19.1.3", "less": "^4.2.0", + "ng-packagr": "^19.0.0", "postcss": "^8.4.0", "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.5 <5.7" + "typescript": ">=5.5 <5.8" }, "peerDependenciesMeta": { "@angular/localize": { @@ -188,6 +189,9 @@ "less": { "optional": true }, + "ng-packagr": { + "optional": true + }, "postcss": { "optional": true }, @@ -197,9 +201,9 @@ } }, "node_modules/@angular/cdk": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.0.5.tgz", - "integrity": "sha512-+D++QUrJlDuwk5RhQBDTejQseb0ZP6c6S4r8wBBab7UPtrwigySudSb0PxhiAzp2YHr5Ch3klhkTf/NSWeUXUQ==", + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.1.0.tgz", + "integrity": "sha512-h7VSaMA/vFHb7u1bwoHKl3L3mZLIcXNZw6v7Nei9ITfEo1PfSKbrYhleeqpNikzE+LxNDKJrbZtpAckSYHblmA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -214,26 +218,26 @@ } }, "node_modules/@angular/cli": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.0.7.tgz", - "integrity": "sha512-y6C4B4XdiZwe2+OADLWXyKqUVvW/XDzTuJ2mZ5PhTnSiiXDN4zRWId1F5wA8ve8vlbUKApPHXRQuaqiQJmA24g==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.3.tgz", + "integrity": "sha512-GJGH3Xw7/zm12myA2R4Dg8+ny3p9tW00tx33YIK8vFjOUKycqgWaKfpYCe2s9egrm2Pew/DclHCD+IUwEAz1GQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1900.7", - "@angular-devkit/core": "19.0.7", - "@angular-devkit/schematics": "19.0.7", - "@inquirer/prompts": "7.1.0", + "@angular-devkit/architect": "0.1901.3", + "@angular-devkit/core": "19.1.3", + "@angular-devkit/schematics": "19.1.3", + "@inquirer/prompts": "7.2.1", "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.0.7", + "@schematics/angular": "19.1.3", "@yarnpkg/lockfile": "1.1.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", "listr2": "8.2.5", - "npm-package-arg": "12.0.0", + "npm-package-arg": "12.0.1", "npm-pick-manifest": "10.0.0", "pacote": "20.0.0", - "resolve": "1.22.8", + "resolve": "1.22.10", "semver": "7.6.3", "symbol-observable": "4.0.0", "yargs": "17.7.2" @@ -248,9 +252,9 @@ } }, "node_modules/@angular/common": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.0.6.tgz", - "integrity": "sha512-r9IDD0+UGkrQkjyX+pApeDmIJ9INpr1uYlgmmlWNBJCVNr9SKKIVZV60sssgadew6bGynKN9dW4mGsmEzzb5BA==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.2.tgz", + "integrity": "sha512-6IhBXwz97pbXA+3vHw1hQlv4M0gc5NrDZSCQeffcraE6wpFMzo8vLcYAiNxpSyTFS7YLzCALdS6kYXVP2FBy1g==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -259,14 +263,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.6", + "@angular/core": "19.1.2", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.0.6.tgz", - "integrity": "sha512-g8A6QOsiCJnRi5Hz0sASIpRQoAGxEgnjz0JanfrMNRedY4MpdIS1V0AeCSKTsMRlV7tQl3ng2Gse/tsb51HI3Q==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.2.tgz", + "integrity": "sha512-CThpvyims1aoPtqUA5UCB0lEI8lDnWBuY6VpMST4YCxhYuPmDWrwKcYXOJU1w/5yEeR8bAOvWIkKdA83MAEyHw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -275,7 +279,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.6" + "@angular/core": "19.1.2" }, "peerDependenciesMeta": { "@angular/core": { @@ -284,9 +288,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.0.6.tgz", - "integrity": "sha512-fHtwI5rCe3LmKDoaqlqLAPdNmLrbeCiMYVe+X1BHgApaqNCyAwcuJxuf8Q5R5su7nHiLmlmB74o1ZS/V+0cQ+g==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.2.tgz", + "integrity": "sha512-CaZTG9arDVc9mGl/abqWsg79VbHAvo6ABtJa/Z6CJ6m2Y0HQPTJR6psiFqjnTSBUK43LRx8dDV3T8wIZa7DNpg==", "dev": true, "license": "MIT", "dependencies": { @@ -308,14 +312,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.0.6", - "typescript": ">=5.5 <5.7" + "@angular/compiler": "19.1.2", + "typescript": ">=5.5 <5.8" } }, "node_modules/@angular/core": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.0.6.tgz", - "integrity": "sha512-9N7FmdRHtS7zfXC/wnyap/reX7fgiOrWpVivayHjWP4RkLYXJAzJIpLyew0jrx4vf8r3lZnC0Zmq0PW007Ngjw==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.2.tgz", + "integrity": "sha512-WrOzn9X2LsXxS27fB1WNjYsFVUKvuDuZ0ERfesWb/t1prz09q7fi/YK0TXx7XOby9CfNe4aXjzRPQL2zgFuMWQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -329,9 +333,9 @@ } }, "node_modules/@angular/forms": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.0.6.tgz", - "integrity": "sha512-HogauPvgDQHw2xxqKBaFgKTRRcc1xWeI/PByDCf3U6YsaqpF53Mz2CJh8X2bg2bY1RGKb67MZw7DBGFRvXx4bg==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.2.tgz", + "integrity": "sha512-PmHoF4JkGbYK0pdBH2FwAKU9VBydAIjJQlol3anjUQF2zfkITeTqfVNmys1mFhojGR+ZppV0zZ+8MhI/501P7A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -340,23 +344,23 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.6", - "@angular/core": "19.0.6", - "@angular/platform-browser": "19.0.6", + "@angular/common": "19.1.2", + "@angular/core": "19.1.2", + "@angular/platform-browser": "19.1.2", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/material": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-19.0.5.tgz", - "integrity": "sha512-yiW/ZJNkOPlQdqgj5U8DHTu3r7OHMI5R1cAbCpOmHlsVHEoc/Vw4V3RFUgpWLqCGgdRIkayoilMAooT52gG2Dg==", + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-19.1.0.tgz", + "integrity": "sha512-LTQBWtuRGjNpA7ceQu9PyiUUq0KLfBP8LvL04hLFbEsZ0fIPQ/OO/Otn67/7TMtnHRFnPeezYPHcAHBhiNlR4A==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/animations": "^19.0.0 || ^20.0.0", - "@angular/cdk": "19.0.5", + "@angular/cdk": "19.1.0", "@angular/common": "^19.0.0 || ^20.0.0", "@angular/core": "^19.0.0 || ^20.0.0", "@angular/forms": "^19.0.0 || ^20.0.0", @@ -365,9 +369,9 @@ } }, "node_modules/@angular/platform-browser": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.0.6.tgz", - "integrity": "sha512-MWiToGy7Pa0rR61sgnEuu7dfZXpAw0g7nkSnw4xdjUf974OOOfI1LS9O9YevJibtdW8sPa1HaoXXwcb7N03B5A==", + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.2.tgz", + "integrity": "sha512-fk/OrL4r5jUjAi1WTv9LGTm+DXWrPtDBpoX4z5Ze6Se+x3/6pTn1Rty1C4MNZvHiTjIQGQNRnq447GdiOjhg9w==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -376,9 +380,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "19.0.6", - "@angular/common": "19.0.6", - "@angular/core": "19.0.6" + "@angular/animations": "19.1.2", + "@angular/common": "19.1.2", + "@angular/core": "19.1.2" }, "peerDependenciesMeta": { "@angular/animations": { @@ -696,9 +700,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", - "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "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" ], @@ -713,9 +717,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", - "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "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" ], @@ -730,9 +734,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", - "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "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" ], @@ -747,9 +751,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", - "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", "cpu": [ "x64" ], @@ -764,9 +768,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "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" ], @@ -781,9 +785,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", - "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", "cpu": [ "x64" ], @@ -798,9 +802,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", - "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "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" ], @@ -815,9 +819,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", - "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "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" ], @@ -832,9 +836,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", - "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "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" ], @@ -849,9 +853,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", - "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "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" ], @@ -866,9 +870,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", - "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "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" ], @@ -883,9 +887,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", - "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", "cpu": [ "loong64" ], @@ -900,9 +904,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", - "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "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" ], @@ -917,9 +921,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", - "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "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" ], @@ -934,9 +938,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", - "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "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" ], @@ -951,9 +955,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", - "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "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" ], @@ -968,9 +972,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", - "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", "cpu": [ "x64" ], @@ -984,10 +988,27 @@ "node": ">=18" } }, + "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, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", - "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "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" ], @@ -1002,9 +1023,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "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" ], @@ -1019,9 +1040,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", - "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "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" ], @@ -1036,9 +1057,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", - "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", "cpu": [ "x64" ], @@ -1053,9 +1074,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", - "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", "cpu": [ "arm64" ], @@ -1070,9 +1091,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", - "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "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" ], @@ -1087,9 +1108,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", - "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "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" ], @@ -1124,14 +1145,14 @@ } }, "node_modules/@inquirer/confirm": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.0.2.tgz", - "integrity": "sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==", + "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": { - "@inquirer/core": "^10.1.0", - "@inquirer/type": "^3.0.1" + "@inquirer/core": "^10.1.2", + "@inquirer/type": "^3.0.2" }, "engines": { "node": ">=18" @@ -1260,22 +1281,22 @@ } }, "node_modules/@inquirer/prompts": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.1.0.tgz", - "integrity": "sha512-5U/XiVRH2pp1X6gpNAjWOglMf38/Ys522ncEHIKT1voRUvSj/DQnR22OVxHnwu5S+rCFaUiPQ57JOtMFQayqYA==", + "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": { - "@inquirer/checkbox": "^4.0.2", - "@inquirer/confirm": "^5.0.2", - "@inquirer/editor": "^4.1.0", - "@inquirer/expand": "^4.0.2", - "@inquirer/input": "^4.0.2", - "@inquirer/number": "^3.0.2", - "@inquirer/password": "^4.0.2", - "@inquirer/rawlist": "^4.0.2", - "@inquirer/search": "^3.0.2", - "@inquirer/select": "^4.0.2" + "@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": ">=18" @@ -1573,9 +1594,9 @@ } }, "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.1.5.tgz", - "integrity": "sha512-ue5PSOzHMCIYrfvPP/MRS6hsKKLzqqhcdAvJCO8uFlDdj598EhgnacuOTuqA6uBK5rgiZXfDWyb7DVZSiBKxBA==", + "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" ], @@ -1587,9 +1608,9 @@ ] }, "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.1.5.tgz", - "integrity": "sha512-CGhsb0R5vE6mMNCoSfxHFD8QTvBHM51gs4DBeigTYHWnYv2V5YpJkC4rMo5qAAFifuUcc0+a8a3SIU0c9NrfNw==", + "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" ], @@ -1601,9 +1622,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.1.5.tgz", - "integrity": "sha512-3WeW328DN+xB5PZdhSWmqE+t3+44xWXEbqQ+caWJEZfOFdLp9yklBZEbVqVdqzznkoaXJYxTCp996KD6HmANeg==", + "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" ], @@ -1615,9 +1636,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.1.5.tgz", - "integrity": "sha512-LAjaoOcBHGj6fiYB8ureiqPoph4eygbXu4vcOF+hsxiY74n8ilA7rJMmGUT0K0JOB5lmRQHSmor3mytRjS4qeQ==", + "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" ], @@ -1629,9 +1650,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.1.5.tgz", - "integrity": "sha512-k/IklElP70qdCXOQixclSl2GPLFiopynGoKX1FqDd1/H0E3Fo1oPwjY2rEVu+0nS3AOw1sryStdXk8CW3cVIsw==", + "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" ], @@ -1643,9 +1664,9 @@ ] }, "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.1.5.tgz", - "integrity": "sha512-KYar6W8nraZfSJspcK7Kp7hdj238X/FNauYbZyrqPBrtsXI1hvI4/KcRcRGP50aQoV7fkKDyJERlrQGMGTZUsA==", + "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" ], @@ -2579,9 +2600,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.26.0.tgz", - "integrity": "sha512-gJNwtPDGEaOEgejbaseY6xMFu+CPltsc8/T+diUTTbOQLqD+bnrJq9ulH6WD69TqwqWmrfRAtUv30cCFZlbGTQ==", + "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" ], @@ -2593,9 +2614,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.26.0.tgz", - "integrity": "sha512-YJa5Gy8mEZgz5JquFruhJODMq3lTHWLm1fOy+HIANquLzfIOzE9RA5ie3JjCdVb9r46qfAQY/l947V0zfGJ0OQ==", + "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" ], @@ -2607,9 +2628,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.26.0.tgz", - "integrity": "sha512-ErTASs8YKbqTBoPLp/kA1B1Um5YSom8QAc4rKhg7b9tyyVqDBlQxy7Bf2wW7yIlPGPg2UODDQcbkTlruPzDosw==", + "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" ], @@ -2621,9 +2642,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.26.0.tgz", - "integrity": "sha512-wbgkYDHcdWW+NqP2mnf2NOuEbOLzDblalrOWcPyY6+BRbVhliavon15UploG7PpBRQ2bZJnbmh8o3yLoBvDIHA==", + "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" ], @@ -2635,9 +2656,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.26.0.tgz", - "integrity": "sha512-Y9vpjfp9CDkAG4q/uwuhZk96LP11fBz/bYdyg9oaHYhtGZp7NrbkQrj/66DYMMP2Yo/QPAsVHkV891KyO52fhg==", + "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" ], @@ -2649,9 +2670,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.26.0.tgz", - "integrity": "sha512-A/jvfCZ55EYPsqeaAt/yDAG4q5tt1ZboWMHEvKAH9Zl92DWvMIbnZe/f/eOXze65aJaaKbL+YeM0Hz4kLQvdwg==", + "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" ], @@ -2663,9 +2684,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.26.0.tgz", - "integrity": "sha512-paHF1bMXKDuizaMODm2bBTjRiHxESWiIyIdMugKeLnjuS1TCS54MF5+Y5Dx8Ui/1RBPVRE09i5OUlaLnv8OGnA==", + "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" ], @@ -2677,9 +2698,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.26.0.tgz", - "integrity": "sha512-cwxiHZU1GAs+TMxvgPfUDtVZjdBdTsQwVnNlzRXC5QzIJ6nhfB4I1ahKoe9yPmoaA/Vhf7m9dB1chGPpDRdGXg==", + "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" ], @@ -2691,9 +2712,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.26.0.tgz", - "integrity": "sha512-4daeEUQutGRCW/9zEo8JtdAgtJ1q2g5oHaoQaZbMSKaIWKDQwQ3Yx0/3jJNmpzrsScIPtx/V+1AfibLisb3AMQ==", + "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" ], @@ -2705,9 +2726,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.26.0.tgz", - "integrity": "sha512-eGkX7zzkNxvvS05ROzJ/cO/AKqNvR/7t1jA3VZDi2vRniLKwAWxUr85fH3NsvtxU5vnUUKFHKh8flIBdlo2b3Q==", + "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" ], @@ -2718,10 +2739,24 @@ "linux" ] }, + "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/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.26.0.tgz", - "integrity": "sha512-Odp/lgHbW/mAqw/pU21goo5ruWsytP7/HCC/liOt0zcGG0llYWKrd10k9Fj0pdj3prQ63N5yQLCLiE7HTX+MYw==", + "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" ], @@ -2733,9 +2768,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.26.0.tgz", - "integrity": "sha512-MBR2ZhCTzUgVD0OJdTzNeF4+zsVogIR1U/FsyuFerwcqjZGvg2nYe24SAHp8O5sN8ZkRVbHwlYeHqcSQ8tcYew==", + "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" ], @@ -2747,9 +2782,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.26.0.tgz", - "integrity": "sha512-YYcg8MkbN17fMbRMZuxwmxWqsmQufh3ZJFxFGoHjrE7bv0X+T6l3glcdzd7IKLiwhT+PZOJCblpnNlz1/C3kGQ==", + "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" ], @@ -2761,9 +2796,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.26.0.tgz", - "integrity": "sha512-ZuwpfjCwjPkAOxpjAEjabg6LRSfL7cAJb6gSQGZYjGhadlzKKywDkCUnJ+KEfrNY1jH5EEoSIKLCb572jSiglA==", + "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" ], @@ -2775,9 +2810,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.26.0.tgz", - "integrity": "sha512-+HJD2lFS86qkeF8kNu0kALtifMpPCZU80HvwztIKnYwym3KnA1os6nsX4BGSTLtS2QVAGG1P3guRgsYyMA0Yhg==", + "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" ], @@ -2789,9 +2824,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.26.0.tgz", - "integrity": "sha512-WUQzVFWPSw2uJzX4j6YEbMAiLbs0BUysgysh8s817doAYhR5ybqTI1wtKARQKo6cGop3pHnrUJPFCsXdoFaimQ==", + "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" ], @@ -2803,9 +2838,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.26.0.tgz", - "integrity": "sha512-D4CxkazFKBfN1akAIY6ieyOqzoOoBV1OICxgUblWxff/pSjCA2khXlASUx7mK6W1oP4McqhgcCsu6QaLj3WMWg==", + "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" ], @@ -2817,9 +2852,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.26.0.tgz", - "integrity": "sha512-2x8MO1rm4PGEP0xWbubJW5RtbNLk3puzAMaLQd3B3JHVw4KcHlmXcO+Wewx9zCoo7EUFiMlu/aZbCJ7VjMzAag==", + "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" ], @@ -2831,14 +2866,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.0.7.tgz", - "integrity": "sha512-1WtTqKFPuEaV99VIP+y/gf/XW3TVJh/NbJbbEF4qYpp7qQiJ4ntF4klVZmsJcQzFucZSzlg91QVMPQKev5WZGA==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.3.tgz", + "integrity": "sha512-LG3OKZG1Dl1lxNIc81jr82WSUaDCYlg/SEJ6A78p8AaZtTFKf14WenJTeG0XZPX45l26BdZSjn9MUTCggxQvGQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.7", - "@angular-devkit/schematics": "19.0.7", + "@angular-devkit/core": "19.1.3", + "@angular-devkit/schematics": "19.1.3", "jsonc-parser": "3.3.1" }, "engines": { @@ -2959,9 +2994,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.6.tgz", - "integrity": "sha512-qNiuwC4ZDAUNcY47xgaSuS92cjf8JbSUoaKS77bmLG1rU7MlATVSiw/IlrjtIyyskXBZ8KkNfjK/P5na7rgXbQ==", + "version": "22.10.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", + "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", "dev": true, "license": "MIT", "peer": true, @@ -2970,16 +3005,16 @@ } }, "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", - "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", + "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": ">=14.6.0" + "node": ">=14.21.3" }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, "node_modules/@yarnpkg/lockfile": { @@ -3115,9 +3150,9 @@ "license": "MIT" }, "node_modules/beasties": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.1.0.tgz", - "integrity": "sha512-+Ssscd2gVG24qRNC+E2g88D+xsQW4xwakWtKAiGEQ3Pw54/FGdyo9RrfxhGhEv6ilFVbB7r3Lgx+QnAxnSpECw==", + "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": { @@ -3125,10 +3160,13 @@ "css-what": "^6.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", - "htmlparser2": "^9.0.0", + "htmlparser2": "^9.1.0", "picocolors": "^1.1.1", - "postcss": "^8.4.47", + "postcss": "^8.4.49", "postcss-media-query-parser": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" } }, "node_modules/bl": { @@ -3317,9 +3355,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001692", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz", - "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==", + "version": "1.0.30001695", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz", + "integrity": "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==", "dev": true, "funding": [ { @@ -3729,9 +3767,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.82", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.82.tgz", - "integrity": "sha512-Zq16uk1hfQhyGx5GpwPAYDwddJuSGhtRhgOA2mCxANYaDT79nAeGnaXogMGng4KqLaJUVnOnuL0+TDop9nLOiA==", + "version": "1.5.84", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.84.tgz", + "integrity": "sha512-I+DQ8xgafao9Ha6y0qjHHvpZ9OfyA1qKlkHkjywxzniORU2awxyz7f/iVJcULmrF2yrM3nHQf+iDjJtbbexd/g==", "dev": true, "license": "ISC" }, @@ -3811,9 +3849,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -3824,30 +3862,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" + "@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/escalade": { @@ -3897,9 +3936,9 @@ "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "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": { @@ -3907,16 +3946,16 @@ "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" } }, "node_modules/fast-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.5.tgz", - "integrity": "sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", "dev": true, "funding": [ { @@ -4184,13 +4223,13 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "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": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { @@ -4583,9 +4622,9 @@ } }, "node_modules/lmdb": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.1.5.tgz", - "integrity": "sha512-46Mch5Drq+A93Ss3gtbg+Xuvf5BOgIuvhKDWoGa3HcPHI6BL2NCOkRdSx1D4VfzwrxhnsjbyIVsLRlQHu6URvw==", + "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", @@ -4601,12 +4640,12 @@ "download-lmdb-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.1.5", - "@lmdb/lmdb-darwin-x64": "3.1.5", - "@lmdb/lmdb-linux-arm": "3.1.5", - "@lmdb/lmdb-linux-arm64": "3.1.5", - "@lmdb/lmdb-linux-x64": "3.1.5", - "@lmdb/lmdb-win32-x64": "3.1.5" + "@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/log-symbols": { @@ -4766,9 +4805,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "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, "license": "MIT", "dependencies": { @@ -5309,9 +5348,9 @@ } }, "node_modules/npm-package-arg": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.0.tgz", - "integrity": "sha512-ZTE0hbwSdTNL+Stx2zxSqdu2KZfNDcrtrLdIk7XGnQFYBWYDho/ORvXtn5XEePcL3tFpGjHCV3X3xrtDh7eZ+A==", + "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": { @@ -5649,9 +5688,9 @@ } }, "node_modules/piscina": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.7.0.tgz", - "integrity": "sha512-b8hvkpp9zS0zsfa939b/jXbe64Z2gZv0Ha7FYPNUiDIB1y2AtxcOZdfP8xN8HFjUaqQiT9gRlfjAsoL8vdJ1Iw==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.8.0.tgz", + "integrity": "sha512-EZJb+ZxDrQf3dihsUL7p42pjNyrNIFJCrRHPMgxu/svsj+P3xS3fuEWp7k2+rfsavfl1N0G29b1HGs7J0m8rZA==", "dev": true, "license": "MIT", "optionalDependencies": { @@ -5803,19 +5842,22 @@ } }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "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.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5882,9 +5924,9 @@ } }, "node_modules/rollup": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.26.0.tgz", - "integrity": "sha512-ilcl12hnWonG8f+NxU6BlgysVA0gvY2l8N0R84S1HcINbW20bvwuCngJkkInV6LXhwRpucsW5k1ovDwEdBVrNg==", + "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": { @@ -5898,24 +5940,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.26.0", - "@rollup/rollup-android-arm64": "4.26.0", - "@rollup/rollup-darwin-arm64": "4.26.0", - "@rollup/rollup-darwin-x64": "4.26.0", - "@rollup/rollup-freebsd-arm64": "4.26.0", - "@rollup/rollup-freebsd-x64": "4.26.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.26.0", - "@rollup/rollup-linux-arm-musleabihf": "4.26.0", - "@rollup/rollup-linux-arm64-gnu": "4.26.0", - "@rollup/rollup-linux-arm64-musl": "4.26.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.26.0", - "@rollup/rollup-linux-riscv64-gnu": "4.26.0", - "@rollup/rollup-linux-s390x-gnu": "4.26.0", - "@rollup/rollup-linux-x64-gnu": "4.26.0", - "@rollup/rollup-linux-x64-musl": "4.26.0", - "@rollup/rollup-win32-arm64-msvc": "4.26.0", - "@rollup/rollup-win32-ia32-msvc": "4.26.0", - "@rollup/rollup-win32-x64-msvc": "4.26.0", + "@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" } }, @@ -5981,9 +6024,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.80.7", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.7.tgz", - "integrity": "sha512-MVWvN0u5meytrSjsU7AWsbhoXi1sc58zADXFllfZzbsBT1GHjjar6JwBINYPRrkx/zqnQ6uqbQuHgE95O+C+eQ==", + "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": { @@ -6189,9 +6232,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", - "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", + "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" }, @@ -6517,9 +6560,9 @@ } }, "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "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": { @@ -6624,21 +6667,21 @@ } }, "node_modules/vite": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.7.tgz", + "integrity": "sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.24.2", + "postcss": "^8.4.49", + "rollup": "^4.23.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -6647,19 +6690,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.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.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -6680,439 +6729,15 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, "node_modules/watchpack": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", From 0c3b75558a3ed826ab5e52a67e981618d2c0edea Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Sat, 25 Jan 2025 09:02:35 +0100 Subject: [PATCH 0176/1220] docs: add template string to supported literals (#59710) Updates the docs since we'll have support for template strings in 19.2. Also mentions that tagged template string aren't supported. Fixes #59160. PR Close #59710 --- .../guide/templates/expression-syntax.md | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/adev/src/content/guide/templates/expression-syntax.md b/adev/src/content/guide/templates/expression-syntax.md index 0091a4ca735a..03ae18b5db16 100644 --- a/adev/src/content/guide/templates/expression-syntax.md +++ b/adev/src/content/guide/templates/expression-syntax.md @@ -8,21 +8,22 @@ Angular supports a subset of [literal values](https://developer.mozilla.org/en-U ### Supported value literals -| Literal type | Example values | -| ------------ | ------------------------------- | -| String | `'Hello'`, `"World"` | -| Boolean | `true`, `false` | -| Number | `123`, `3.14` | -| Object | `{name: 'Alice'}` | -| Array | `['Onion', 'Cheese', 'Garlic']` | -| null | `null` | +| Literal type | Example values | +| ---------------- | ------------------------------- | +| String | `'Hello'`, `"World"` | +| Boolean | `true`, `false` | +| Number | `123`, `3.14` | +| Object | `{name: 'Alice'}` | +| Array | `['Onion', 'Cheese', 'Garlic']` | +| null | `null` | +| Template string | `` `Hello ${name}` `` | ### Unsupported literals -| Literal type | Example value | -| --------------- | --------------------- | -| Template string | `` `Hello ${name}` `` | -| RegExp | `/\d+/` | +| Literal type | Example value | +| ------------------------ | ------------------------- | +| RegExp | `/\d+/` | +| Tagged template string | `` tag`Hello ${name}` `` | ## Globals From 6d6708c5b93f270ceb983e0f85b073d9671e6c58 Mon Sep 17 00:00:00 2001 From: waify <54396184+wi-phy@users.noreply.github.com> Date: Sun, 26 Jan 2025 17:35:42 +0100 Subject: [PATCH 0177/1220] docs: fix typo in signals-interop.md (#59724) PR Close #59724 --- adev/src/content/ecosystem/rxjs-interop/signals-interop.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adev/src/content/ecosystem/rxjs-interop/signals-interop.md b/adev/src/content/ecosystem/rxjs-interop/signals-interop.md index 69c3533ba6f8..1eccfccc2a56 100644 --- a/adev/src/content/ecosystem/rxjs-interop/signals-interop.md +++ b/adev/src/content/ecosystem/rxjs-interop/signals-interop.md @@ -63,7 +63,7 @@ If an Observable used in `toSignal` produces an error, that error is thrown when If an Observable used in `toSignal` completes, the signal continues to return the most recently emitted value before completion. -## Create an RxJS Observale from a signal with `toObservable` +## Create an RxJS Observable from a signal with `toObservable` Use the `toObservable` utility to create an `Observable` which tracks the value of a signal. The signal's value is monitored with an `effect` which emits the value to the Observable when it changes. From b8948f219c48e802297a0f86e18263dd453face5 Mon Sep 17 00:00:00 2001 From: Andrew Seguin Date: Fri, 24 Jan 2025 13:05:05 -0700 Subject: [PATCH 0178/1220] docs: fix broken material.angular.io test harness links (#59709) PR Close #59709 --- .../guide/testing/component-harnesses-overview.md | 2 +- .../component-harnesses-testing-environments.md | 4 ++-- .../guide/testing/creating-component-harnesses.md | 10 +++++----- .../content/guide/testing/using-component-harnesses.md | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/adev/src/content/guide/testing/component-harnesses-overview.md b/adev/src/content/guide/testing/component-harnesses-overview.md index a6ebb4ab7604..0887ef536190 100644 --- a/adev/src/content/guide/testing/component-harnesses-overview.md +++ b/adev/src/content/guide/testing/component-harnesses-overview.md @@ -27,4 +27,4 @@ Many developers can be categorized by one of the following developer type catego | Component harness authors | Developers who maintain some reusable Angular components and want to create a test harness for its users to use in their tests. For example, an author of a third party Angular component library or a developer who maintains a set of common components for a large Angular application. | [Creating component harnesses for your components](guide/testing/creating-component-harnesses ) | | Harness environment authors | Developers who want to add support for using component harnesses in additional testing environments. For information on supported testing environments out-of-the-box, see the [test harness environments and loaders](guide/testing/using-component-harnesses#test-harness-environments-and-loaders). | [Adding support for additional testing environments](guide/testing/component-harnesses-testing-environments) | -For the full API reference, please see the [Angular CDK's component harness API reference page](https://material.angular.io/cdk/test-harnesses/api). +For the full API reference, please see the [Angular CDK's component harness API reference page](https://material.angular.io/cdk/testing/api). diff --git a/adev/src/content/guide/testing/component-harnesses-testing-environments.md b/adev/src/content/guide/testing/component-harnesses-testing-environments.md index 157ce6ba6dc0..9ada0c8eabfa 100644 --- a/adev/src/content/guide/testing/component-harnesses-testing-environments.md +++ b/adev/src/content/guide/testing/component-harnesses-testing-environments.md @@ -26,7 +26,7 @@ The [Component Dev Kit (CDK)](https://material.angular.io/cdk/categories) is a s Every test environment must define a `TestElement` implementation. The `TestElement` interface serves as an environment-agnostic representation of a DOM element. It enables harnesses to interact with DOM elements regardless of the underlying environment. Because some environments don't support interacting with DOM elements synchronously (e.g. WebDriver), all `TestElement` methods are asynchronous, returning a `Promise` with the result of the operation. -`TestElement` offers a number of methods to interact with the underlying DOM such as `blur()`, `click()`, `getAttribute()`, and more. See the [TestElement API reference page](https://material.angular.io/cdk/test-harnesses/api#TestElement) for the full list of methods. +`TestElement` offers a number of methods to interact with the underlying DOM such as `blur()`, `click()`, `getAttribute()`, and more. See the [TestElement API reference page](https://material.angular.io/cdk/testing/api#TestElement) for the full list of methods. The `TestElement` interface consists largely of methods that resemble methods available on `HTMLElement`. Similar methods exist in most test environments, which makes implementing the methods fairly straightforward. However, one important difference to note when implementing the `sendKeys` method, is that the key codes in the `TestKey` enum likely differ from the key codes used in the test environment. Environment authors should maintain a mapping from `TestKey` codes to the codes used in the particular testing environment. @@ -55,5 +55,5 @@ The [`TestbedHarnessEnvironment`](https://github.com/angular/components/blob/mai ## Handling auto change detection In order to support the `manualChangeDetection` and parallel APIs, your environment should install a handler for the auto change detection status. -When your environment wants to start handling the auto change detection status it can call `handleAutoChangeDetectionStatus(handler)`. The handler function will receive a `AutoChangeDetectionStatus` which has two properties `isDisabled` and `onDetectChangesNow()`. See the [AutoChangeDetectionStatus API reference page](https://material.angular.io/cdk/test-harnesses/api#AutoChangeDetectionStatus) for more information. +When your environment wants to start handling the auto change detection status it can call `handleAutoChangeDetectionStatus(handler)`. The handler function will receive a `AutoChangeDetectionStatus` which has two properties `isDisabled` and `onDetectChangesNow()`. See the [AutoChangeDetectionStatus API reference page](https://material.angular.io/cdk/testing/api#AutoChangeDetectionStatus) for more information. If your environment wants to stop handling auto change detection status it can call `stopHandlingAutoChangeDetectionStatus()`. diff --git a/adev/src/content/guide/testing/creating-component-harnesses.md b/adev/src/content/guide/testing/creating-component-harnesses.md index c412dd9f0e59..692b8d8cd041 100644 --- a/adev/src/content/guide/testing/creating-component-harnesses.md +++ b/adev/src/content/guide/testing/creating-component-harnesses.md @@ -61,7 +61,7 @@ Each instance of a `ComponentHarness` subclass represents a particular instance `ComponentHarness` also offers several methods for locating elements within the component's DOM. These methods are `locatorFor()`, `locatorForOptional()`, and `locatorForAll()`. These methods create functions that find elements, they do not directly find elements. This approach safeguards against caching references to out-of-date elements. For example, when an `ngIf` hides and then shows an element, the result is a new DOM element; using functions ensures that tests always reference the current state of the DOM. -See the [ComponentHarness API reference page](https://material.angular.io/cdk/test-harnesses/api#ComponentHarness) for the full list details of the different `locatorFor` methods. +See the [ComponentHarness API reference page](https://material.angular.io/cdk/testing/api#ComponentHarness) for the full list details of the different `locatorFor` methods. For example, the `MyPopupHarness` example discussed above could provide methods to get the trigger and content elements as follows: @@ -81,7 +81,7 @@ class MyPopupHarness extends ComponentHarness { `TestElement` is an abstraction designed to work across different test environments (Unit tests, WebDriver, etc). When using harnesses, you should perform all DOM interaction via this interface. Other means of accessing DOM elements, such as `document.querySelector()`, do not work in all test environments. -`TestElement` has a number of methods to interact with the underlying DOM, such as `blur()`, `click()`, `getAttribute()`, and more. See the [TestElement API reference page](https://material.angular.io/cdk/test-harnesses/api#TestElement) for the full list of methods. +`TestElement` has a number of methods to interact with the underlying DOM, such as `blur()`, `click()`, `getAttribute()`, and more. See the [TestElement API reference page](https://material.angular.io/cdk/testing/api#TestElement) for the full list of methods. Do not expose `TestElement` instances to harness users unless it's an element the component consumer defines directly, such as the component's host element. Exposing `TestElement` instances for internal elements leads users to depend on a component's internal DOM structure. @@ -112,7 +112,7 @@ class MyPopupHarness extends ComponentHarness { Larger components often compose sub-components. You can reflect this structure in a component's harness as well. Each of the `locatorFor` methods on `ComponentHarness` has an alternate signature that can be used for locating sub-harnesses rather than elements. -See the [ComponentHarness API reference page](https://material.angular.io/cdk/test-harnesses/api#ComponentHarness) for the full list of the different locatorFor methods. +See the [ComponentHarness API reference page](https://material.angular.io/cdk/testing/api#ComponentHarness) for the full list of the different locatorFor methods. For example, consider a menu build using the popup from above: @@ -165,7 +165,7 @@ When a page contains multiple instances of a particular component, you may want You should create a static `with()` method on each `ComponentHarness` subclass that returns a `HarnessPredicate` for that class. This allows test authors to write easily understandable code, e.g. `loader.getHarness(MyMenuHarness.with({selector: '#menu1'}))`. In addition to the standard selector and ancestor options, the `with` method should add any other options that make sense for the particular subclass. -Harnesses that need to add additional options should extend the `BaseHarnessFilters` interface and additional optional properties as needed. `HarnessPredicate` provides several convenience methods for adding options: `stringMatches()`, `addOption()`, and `add()`. See the [HarnessPredicate API page](https://material.angular.io/cdk/test-harnesses/api#HarnessPredicate) for the full description. +Harnesses that need to add additional options should extend the `BaseHarnessFilters` interface and additional optional properties as needed. `HarnessPredicate` provides several convenience methods for adding options: `stringMatches()`, `addOption()`, and `add()`. See the [HarnessPredicate API page](https://material.angular.io/cdk/testing/api#HarnessPredicate) for the full description. For example, when working with a menu it is useful to filter based on trigger text and to filter menu items based on their text: @@ -237,7 +237,7 @@ class MyMenuHarness extends ComponentHarness { Some components project additional content into the component's template. See the [content projection guide](guide/components/content-projection) for more information. -Add a `HarnessLoader` instance scoped to the element containing the `` when you create a harness for a component that uses content projection. This allows the user of the harness to load additional harnesses for whatever components were passed in as content. `ComponentHarness` has several methods that can be used to create HarnessLoader instances for cases like this: `harnessLoaderFor()`, `harnessLoaderForOptional()`, `harnessLoaderForAll()`. See the [HarnessLoader interface API reference page](https://material.angular.io/cdk/test-harnesses/api#HarnessLoader) for more details. +Add a `HarnessLoader` instance scoped to the element containing the `` when you create a harness for a component that uses content projection. This allows the user of the harness to load additional harnesses for whatever components were passed in as content. `ComponentHarness` has several methods that can be used to create HarnessLoader instances for cases like this: `harnessLoaderFor()`, `harnessLoaderForOptional()`, `harnessLoaderForAll()`. See the [HarnessLoader interface API reference page](https://material.angular.io/cdk/testing/api#HarnessLoader) for more details. For example, the `MyPopupHarness` example from above can extend `ContentContainerComponentHarness` to add support to load harnesses within the `` of the component. diff --git a/adev/src/content/guide/testing/using-component-harnesses.md b/adev/src/content/guide/testing/using-component-harnesses.md index 690f416e7421..884b33a3335f 100644 --- a/adev/src/content/guide/testing/using-component-harnesses.md +++ b/adev/src/content/guide/testing/using-component-harnesses.md @@ -25,7 +25,7 @@ Additional testing environments require custom bindings. See the [adding harness ### Using the loader from `TestbedHarnessEnvironment` for unit tests -For unit tests you can create a harness loader from [TestbedHarnessEnvironment](https://material.angular.io/cdk/test-harnesses/api#TestbedHarnessEnvironment). This environment uses a [component fixture](api/core/testing/ComponentFixture) created by Angular's `TestBed`. +For unit tests you can create a harness loader from [TestbedHarnessEnvironment](https://material.angular.io/cdk/testing/api#TestbedHarnessEnvironment). This environment uses a [component fixture](api/core/testing/ComponentFixture) created by Angular's `TestBed`. To create a harness loader rooted at the fixture's root element, use the `loader()` method: @@ -149,7 +149,7 @@ For more details refer to the specific harness documentation since additional fi ## Using test harness APIs -While every harness defines an API specific to its corresponding component, they all share a common base class, [ComponentHarness](https://material.angular.io/cdk/test-harnesses/api#ComponentHarness). This base class defines a static property, `hostSelector`, that matches the harness class to instances of the component in the DOM. +While every harness defines an API specific to its corresponding component, they all share a common base class, [ComponentHarness](https://material.angular.io/cdk/testing/api#ComponentHarness). This base class defines a static property, `hostSelector`, that matches the harness class to instances of the component in the DOM. Beyond that, the API of any given harness is specific to its corresponding component; refer to the component's documentation to learn how to use a specific harness. From c65c609491ce8f1dd7ee6d7415f7794b35f57275 Mon Sep 17 00:00:00 2001 From: Aaditree Jaisswal Date: Thu, 23 Jan 2025 13:41:25 -0800 Subject: [PATCH 0179/1220] docs: Add link to Language Service page from the Installation page (#59654) PR Close #59654 --- adev/src/content/introduction/installation.md | 1 + 1 file changed, 1 insertion(+) diff --git a/adev/src/content/introduction/installation.md b/adev/src/content/introduction/installation.md index a53f697a54fb..a785c7409f93 100644 --- a/adev/src/content/introduction/installation.md +++ b/adev/src/content/introduction/installation.md @@ -22,6 +22,7 @@ If you're starting a new project, you'll most likely want to create a local proj - **Node.js** - v[^18.19.1 or newer](/reference/versions) - **Text editor** - We recommend [Visual Studio Code](https://code.visualstudio.com/) - **Terminal** - Required for running Angular CLI commands +- **Development Tool** - To improve your development workflow, we recommend the [Angular Language Service](/tools/language-service) ### Instructions From 14ceec60fe791a28c10759bc9d439ac4e8098994 Mon Sep 17 00:00:00 2001 From: arturovt Date: Wed, 22 Jan 2025 22:49:46 +0200 Subject: [PATCH 0180/1220] refactor(docs-infra): prevent leak in tutorial component (#59675) In this commit, we're using the `from()` in the `adev-tutorial` component, which allows us to invert a dependency and avoid memory leaks. Because `then()` would be executed even if the component is already destroyed. PR Close #59675 --- .../features/tutorial/tutorial.component.ts | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/adev/src/app/features/tutorial/tutorial.component.ts b/adev/src/app/features/tutorial/tutorial.component.ts index 5ed9051ae2a2..c6a63f4f7bd0 100644 --- a/adev/src/app/features/tutorial/tutorial.component.ts +++ b/adev/src/app/features/tutorial/tutorial.component.ts @@ -8,11 +8,12 @@ import {isPlatformBrowser, NgComponentOutlet, NgTemplateOutlet} from '@angular/common'; import { - AfterViewInit, + afterNextRender, ChangeDetectionStrategy, ChangeDetectorRef, Component, computed, + DestroyRef, ElementRef, EnvironmentInjector, inject, @@ -35,7 +36,9 @@ import { TutorialNavigationItem, } from '@angular/docs'; import {ActivatedRoute, RouterLink} from '@angular/router'; +import {from} from 'rxjs'; import {filter} from 'rxjs/operators'; + import {PagePrefix} from '../../core/enums/pages'; import {injectAsync} from '../../core/services/inject-async'; import { @@ -68,7 +71,7 @@ const INTRODUCTION_LABEL = 'Introduction'; changeDetection: ChangeDetectionStrategy.OnPush, providers: [SplitResizerHandler], }) -export default class Tutorial implements AfterViewInit { +export default class Tutorial { @ViewChild('content') content!: ElementRef; @ViewChild('editor') editor: ElementRef | undefined; @ViewChild('resizer') resizer!: ElementRef; @@ -80,9 +83,9 @@ export default class Tutorial implements AfterViewInit { private readonly elementRef = inject(ElementRef); private readonly embeddedTutorialManager = inject(EmbeddedTutorialManager); private readonly nodeRuntimeState = inject(NodeRuntimeState); - private readonly platformId = inject(PLATFORM_ID); private readonly route = inject(ActivatedRoute); private readonly splitResizerHandler = inject(SplitResizerHandler); + private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID)); readonly documentContent = signal(null); readonly localTutorialZipUrl = signal(undefined); @@ -118,17 +121,18 @@ export default class Tutorial implements AfterViewInit { this.documentContent.set(docContent); this.setTutorialData(data as TutorialNavigationItem); }); - } - async ngAfterViewInit(): Promise { - if (isPlatformBrowser(this.platformId)) { + const destroyRef = inject(DestroyRef); + afterNextRender(() => { this.splitResizerHandler.init(this.elementRef, this.content, this.resizer, this.editor); - this.loadEmbeddedEditorComponent().then((editorComponent) => { - this.embeddedEditorComponent = editorComponent; - this.changeDetectorRef.markForCheck(); - }); - } + from(this.loadEmbeddedEditorComponent()) + .pipe(takeUntilDestroyed(destroyRef)) + .subscribe((editorComponent) => { + this.embeddedEditorComponent = editorComponent; + this.changeDetectorRef.markForCheck(); + }); + }); } toggleNavigationDropdown($event: MouseEvent): void { @@ -191,7 +195,7 @@ export default class Tutorial implements AfterViewInit { if (routeData.type === TutorialType.LOCAL) { this.setLocalTutorialData(routeData); - } else if (routeData.type === TutorialType.EDITOR && isPlatformBrowser(this.platformId)) { + } else if (routeData.type === TutorialType.EDITOR && this.isBrowser) { await this.setEditorTutorialData( tutorialNavigationItem.path.replace(`${PagePrefix.TUTORIALS}/`, ''), ); From 5c1690f07d5c3d39e3c35e3506346bee9dc80cbc Mon Sep 17 00:00:00 2001 From: arturovt Date: Thu, 23 Jan 2025 17:40:32 +0200 Subject: [PATCH 0181/1220] refactor(docs-infra): allow home to be cleaned up (#59683) In this commit, we're using the `from()` in the `adev-home` component, which allows us to invert a dependency and avoid memory leaks. Because an `async` function would be executed even if the component is already destroyed. PR Close #59683 --- adev/src/app/features/home/home.component.ts | 63 +++++++++----------- 1 file changed, 27 insertions(+), 36 deletions(-) diff --git a/adev/src/app/features/home/home.component.ts b/adev/src/app/features/home/home.component.ts index 32b7b113f15e..ee9a9fd07bc1 100644 --- a/adev/src/app/features/home/home.component.ts +++ b/adev/src/app/features/home/home.component.ts @@ -6,21 +6,21 @@ * found in the LICENSE file at https://angular.dev/license */ -import {DOCUMENT, isPlatformBrowser} from '@angular/common'; +import {DOCUMENT} from '@angular/common'; import { - AfterViewInit, ChangeDetectionStrategy, Component, + DestroyRef, ElementRef, Injector, - OnDestroy, - OnInit, - PLATFORM_ID, ViewChild, + afterNextRender, inject, } 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'; @@ -38,14 +38,14 @@ export const TUTORIALS_HOMEPAGE_DIRECTORY = 'homepage'; styleUrls: ['./home.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) -export default class Home implements OnInit, AfterViewInit, OnDestroy { +export default class Home { @ViewChild('home') home!: ElementRef; private readonly document = inject(DOCUMENT); private readonly injector = inject(Injector); - private readonly platformId = inject(PLATFORM_ID); private readonly window = inject(WINDOW); private readonly activatedRoute = inject(ActivatedRoute); + private readonly destroyRef = inject(DestroyRef); protected readonly tutorialFiles = TUTORIALS_HOMEPAGE_DIRECTORY; protected readonly isUwu = 'uwu' in this.activatedRoute.snapshot.queryParams; @@ -53,19 +53,12 @@ export default class Home implements OnInit, AfterViewInit, OnDestroy { private homeAnimation?: HomeAnimation; private intersectionObserver: IntersectionObserver | undefined; - ctaLink = 'tutorials/learn-angular'; - ctaIosLink = 'overview'; + readonly ctaLink = isIos ? 'overview' : 'tutorials/learn-angular'; - ngOnInit(): void { - if (isIos) { - this.ctaLink = this.ctaIosLink; - } - } - - ngAfterViewInit() { - this.element = this.home.nativeElement; + constructor() { + afterNextRender(() => { + this.element = this.home.nativeElement; - if (isPlatformBrowser(this.platformId)) { // Always scroll to top on home page (even for navigating back) this.window.scrollTo({top: 0, left: 0, behavior: 'instant'}); @@ -76,18 +69,13 @@ export default class Home implements OnInit, AfterViewInit, OnDestroy { if (this.isWebGLAvailable() && !shouldReduceMotion() && !this.isUwu) { this.loadHomeAnimation(); } - } - } + }); - ngOnDestroy(): void { - if (isPlatformBrowser(this.platformId)) { + this.destroyRef.onDestroy(() => { // Stop observing and disconnect this.intersectionObserver?.disconnect(); - - if (this.homeAnimation) { - this.homeAnimation.destroy(); - } - } + this.homeAnimation?.destroy(); + }); } private initIntersectionObserver(): void { @@ -102,9 +90,7 @@ export default class Home implements OnInit, AfterViewInit, OnDestroy { this.headerTop(headerEntry); // Disable animation at end of page - if (this.homeAnimation) { - this.homeAnimation.disableEnd(footerEntry); - } + this.homeAnimation?.disableEnd(footerEntry); }); // Start observing @@ -124,12 +110,17 @@ export default class Home implements OnInit, AfterViewInit, OnDestroy { } } - private async loadHomeAnimation() { - this.homeAnimation = await injectAsync(this.injector, () => - import('./services/home-animation.service').then((c) => c.HomeAnimation), - ); - - await this.homeAnimation.init(this.element); + 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() { From af9d74710c460b0aaeaf3226533e9e544025523c Mon Sep 17 00:00:00 2001 From: Sebastian Ochoa Date: Thu, 23 Jan 2025 15:35:24 -0800 Subject: [PATCH 0182/1220] fix(platform-browser): Update pseudoevent created by createMouseSpecialEvent to populate `_originalEvent` property (#59690) This fixes an internal bug. PR Close #59690 --- packages/core/primitives/event-dispatch/src/event.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/core/primitives/event-dispatch/src/event.ts b/packages/core/primitives/event-dispatch/src/event.ts index 1f11f260372e..f574081647c9 100644 --- a/packages/core/primitives/event-dispatch/src/event.ts +++ b/packages/core/primitives/event-dispatch/src/event.ts @@ -418,7 +418,8 @@ export function createMouseSpecialEvent(e: Event, target: Element): Event { // this event into a pseudo-real mouseenter/mouseleave event by adjusting // its type. // - const copy: {-readonly [P in keyof Event]?: Event[P]} = {}; + const copy: {-readonly[P in keyof Event]?: Event[P]}& + {'_originalEvent'?: Event} = {}; for (const property in e) { if (property === 'srcElement' || property === 'target') { continue; @@ -444,6 +445,7 @@ export function createMouseSpecialEvent(e: Event, target: Element): Event { } copy['target'] = copy['srcElement'] = target; copy['bubbles'] = false; + copy['_originalEvent'] = e; return copy as Event; } From 65cf061feb402e1532cd06d0fda5d2b7749ac421 Mon Sep 17 00:00:00 2001 From: Sebastian Ochoa Date: Fri, 24 Jan 2025 10:17:25 -0800 Subject: [PATCH 0183/1220] fix(platform-browser): Update pseudoevent created by createMouseSpecialEvent to populate `_originalEvent` property (#59690) This fixes an internal bug PR Close #59690 --- package.json | 1 + .../primitives/event-dispatch/src/event.ts | 3 +- yarn.lock | 278 +++++++++++++++++- 3 files changed, 272 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 3e59f7db7bb1..a397f69eab5c 100644 --- a/package.json +++ b/package.json @@ -125,6 +125,7 @@ "karma-sourcemap-loader": "^0.4.0", "magic-string": "^0.30.8", "memo-decorator": "^2.0.1", + "ng-cli": "^0.7.0", "ngx-flamegraph": "0.0.12", "ngx-progressbar": "^14.0.0", "open-in-idx": "^0.1.1", diff --git a/packages/core/primitives/event-dispatch/src/event.ts b/packages/core/primitives/event-dispatch/src/event.ts index f574081647c9..a9cc6dc0851e 100644 --- a/packages/core/primitives/event-dispatch/src/event.ts +++ b/packages/core/primitives/event-dispatch/src/event.ts @@ -418,8 +418,7 @@ export function createMouseSpecialEvent(e: Event, target: Element): Event { // this event into a pseudo-real mouseenter/mouseleave event by adjusting // its type. // - const copy: {-readonly[P in keyof Event]?: Event[P]}& - {'_originalEvent'?: Event} = {}; + const copy: {-readonly [P in keyof Event]?: Event[P]} & {'_originalEvent'?: Event} = {}; for (const property in e) { if (property === 'srcElement' || property === 'target') { continue; diff --git a/yarn.lock b/yarn.lock index 3f113faa4af6..37c7549df470 100644 --- a/yarn.lock +++ b/yarn.lock @@ -305,7 +305,6 @@ "@angular/build-tooling@https://github.com/angular/dev-infra-private-build-tooling-builds.git#1298ed34f97ed13cce3177ffd25ac3292385b196": version "0.0.0-e8d26efbaea89c31f1580c61c968c8119f5247a6" - uid "1298ed34f97ed13cce3177ffd25ac3292385b196" resolved "https://github.com/angular/dev-infra-private-build-tooling-builds.git#1298ed34f97ed13cce3177ffd25ac3292385b196" dependencies: "@angular/benchpress" "0.3.0" @@ -429,7 +428,6 @@ "@angular/ng-dev@https://github.com/angular/dev-infra-private-ng-dev-builds.git#744e5a754635c8e8e008f957aba8f9dd8011cc8f": version "0.0.0-e8d26efbaea89c31f1580c61c968c8119f5247a6" - uid "744e5a754635c8e8e008f957aba8f9dd8011cc8f" resolved "https://github.com/angular/dev-infra-private-ng-dev-builds.git#744e5a754635c8e8e008f957aba8f9dd8011cc8f" dependencies: "@google-cloud/spanner" "7.17.1" @@ -5047,12 +5045,19 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + integrity sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA== + dependencies: + arr-flatten "^1.0.1" + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== -arr-flatten@^1.1.0: +arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== @@ -5112,6 +5117,11 @@ array-uniq@^1.0.1: resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + integrity sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg== + array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" @@ -5563,6 +5573,15 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + integrity sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw== + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -5926,7 +5945,7 @@ chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^1.1.1, chalk@^1.1.3: +chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== @@ -6403,7 +6422,7 @@ commander@^12.0.0, commander@^12.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== -commander@^2.11.0, commander@^2.12.1, commander@^2.19.0, commander@^2.2.0, commander@^2.20.0: +commander@^2.11.0, commander@^2.12.1, commander@^2.19.0, commander@^2.2.0, commander@^2.20.0, commander@^2.6.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -6946,6 +6965,20 @@ custom-event@~1.0.0: resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" integrity sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg== +cwd@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cwd/-/cwd-0.6.0.tgz#22851c7015a782e29142f9ca6a2d42dfd2e2aec4" + integrity sha512-o5jIjkderq/aabPcB02fRoEYK9VXNgGSsDDOfU4qT2vJ28pxzLKY8vUA3uz/VYRMorq+O4uOzwt+KJsIx5bLAA== + dependencies: + look-up "^0.7.0" + +cwd@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/cwd/-/cwd-0.7.0.tgz#d813b6719d6e7d78e0645d2774f02b62c24d66a4" + integrity sha512-Uury8DhzGUsEe937qstFzRGPaV8k0Ij86+on+/j4+GuwC8FIB6s/NFYPY5ZXjPFH703ksBwLTVRTjnXYI40lfw== + dependencies: + look-up "^0.7.1" + cytoscape-cose-bilkent@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz#762fa121df9930ffeb51a495d87917c570ac209b" @@ -8358,6 +8391,13 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + integrity sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA== + dependencies: + is-posix-bracket "^0.1.0" + expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -8371,6 +8411,20 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + integrity sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA== + dependencies: + fill-range "^2.1.0" + +expand-tilde@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" + integrity sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q== + dependencies: + os-homedir "^1.0.1" + expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" @@ -8383,6 +8437,13 @@ exponential-backoff@^3.1.1: resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== +export-files@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/export-files/-/export-files-2.1.1.tgz#bbf64574053a09e4eb98e5f43501d572b2c3ce7f" + integrity sha512-r2x1Zt0OKgdXRy0bXis3sOI8TNYmo5Fe71qXwsvpYaMvIlH5G0fWEf3AYiE2bONjePdSOojca7Jw+p9CQ6/6NQ== + dependencies: + lazy-cache "^1.0.3" + express@^4.16.4, express@^4.21.2: version "4.21.2" resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" @@ -8449,6 +8510,13 @@ external-editor@^3.0.3, external-editor@^3.1.0: iconv-lite "^0.4.24" tmp "^0.0.33" +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + integrity sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg== + dependencies: + is-extglob "^1.0.0" + extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -8606,6 +8674,11 @@ file-uri-to-path@1.0.0: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + integrity sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ== + filesize@^6.1.0: version "6.4.0" resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.4.0.tgz#914f50471dd66fdca3cefe628bd0cde4ef769bcd" @@ -8628,6 +8701,17 @@ filing-cabinet@^5.0.1: tsconfig-paths "^4.2.0" typescript "^5.4.4" +fill-range@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^3.0.0" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -8869,6 +8953,13 @@ for-in@^1.0.1, for-in@^1.0.2: resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw== + dependencies: + for-in "^1.0.1" + for-own@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" @@ -9229,6 +9320,21 @@ git-semver-tags@^8.0.0: "@conventional-changelog/git-client" "^1.0.0" meow "^13.0.0" +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA== + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w== + dependencies: + is-glob "^2.0.0" + glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -10358,6 +10464,18 @@ is-docker@^3.0.0: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + integrity sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg== + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + integrity sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA== + dependencies: + is-primitive "^2.0.0" + is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -10370,6 +10488,11 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww== + is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -10409,6 +10532,13 @@ is-generator-function@^1.0.10: has-tostringtag "^1.0.2" safe-regex-test "^1.1.0" +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg== + dependencies: + is-extglob "^1.0.0" + is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -10502,6 +10632,11 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -10558,11 +10693,21 @@ is-plain-object@^5.0.0: resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + integrity sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ== + is-potential-custom-element-name@^1.0.1: version "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-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + integrity sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q== + is-promise@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" @@ -11313,7 +11458,7 @@ kind-of@^4.0.0: dependencies: is-buffer "^1.1.5" -kind-of@^6.0.2: +kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -11369,6 +11514,11 @@ layout-base@^2.0.0: resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-2.0.1.tgz#d0337913586c90f9c2c075292069f5c2da5dd285" integrity sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg== +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + integrity sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ== + lazystream@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.1.tgz#494c831062f1f9408251ec44db1cba29242a2638" @@ -11514,6 +11664,13 @@ lmdb@3.2.2: "@lmdb/lmdb-linux-x64" "3.2.2" "@lmdb/lmdb-win32-x64" "3.2.2" +load-pkg@^1.1.3: + version "1.3.0" + resolved "https://registry.yarnpkg.com/load-pkg/-/load-pkg-1.3.0.tgz#756dcfb4589b9167134ed9be70c23d28ad52853f" + integrity sha512-NywsSvGXZ6uzqokhyHaM25mv3OX344whOM/SM7POso7dfklluwR8pO1K+kCxuWjXQSbdaw0LqOQW+vTHEI7M/w== + dependencies: + cwd "^0.7.0" + loader-runner@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" @@ -11755,6 +11912,15 @@ long@^5.0.0: resolved "https://registry.yarnpkg.com/long/-/long-5.2.4.tgz#ee651d5c7c25901cfca5e67220ae9911695e99b2" integrity sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg== +look-up@^0.7.0, look-up@^0.7.1: + version "0.7.2" + resolved "https://registry.yarnpkg.com/look-up/-/look-up-0.7.2.tgz#d6242e85eb1cbd8a10f6ed0faf75cc51f4930f86" + integrity sha512-pVSdOsOapmIj58imZ0rf3btj23PRGTuLaFpwPSH0paX9yj3igBxB5OfSBeAnAoPX/Iy30Qwtz+MX6mdJTUCYSA== + dependencies: + expand-tilde "^1.2.0" + is-glob "^2.0.0" + micromatch "^2.2.0" + lower-case@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" @@ -11955,6 +12121,11 @@ math-intrinsics@^1.1.0: resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== +math-random@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" + integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== + mdast-util-to-hast@^13.0.0: version "13.2.0" resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz#5ca58e5b921cc0a3ded1bc02eed79a4fe4fe41f4" @@ -12081,6 +12252,25 @@ micromark-util-types@^2.0.0: resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.1.tgz#a3edfda3022c6c6b55bfb049ef5b75d70af50709" integrity sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ== +micromatch@^2.2.0: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + integrity sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA== + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -12523,6 +12713,17 @@ netmask@^2.0.2: resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== +ng-cli@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/ng-cli/-/ng-cli-0.7.0.tgz#fbf7f7eb9fd740cb69430e5c3590c7ba9fd33bd2" + integrity sha512-WTMYBvVvkS2JvI8zzjaevQoSflxlf5j/u6HYBH2OY7RTeZVgU3EdB77nn4Px3tfZSnpKdCtYDfuDBVsvKL+lkw== + dependencies: + commander "^2.6.0" + cwd "^0.6.0" + export-files "^2.0.1" + load-pkg "^1.1.3" + resolve-require "^0.2.0" + ngx-flamegraph@0.0.12: version "0.0.12" resolved "https://registry.yarnpkg.com/ngx-flamegraph/-/ngx-flamegraph-0.0.12.tgz#2e1661979f01d605467539b26ec28b3bc74b9f1a" @@ -12670,7 +12871,7 @@ normalize-path@3.0.0, normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-path@^2.1.1: +normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== @@ -12829,6 +13030,14 @@ object.defaults@^1.1.0: for-own "^1.0.0" isobject "^3.0.0" +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + integrity sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA== + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -12978,6 +13187,11 @@ ordered-binary@^1.5.3: resolved "https://registry.yarnpkg.com/ordered-binary/-/ordered-binary-1.5.3.tgz#8bee2aa7a82c3439caeb1e80c272fd4cf51170fb" integrity sha512-oGFr3T+pYdTGJ+YFEILMpS3es+GiIbs9h/XQrclBXUtd44ey7XwfsMzM31f64I1SQOawDoDr/D823kNCADI8TA== +os-homedir@^1.0.0, os-homedir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== + os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -13179,6 +13393,16 @@ parse-filepath@^1.0.2: map-cache "^0.2.0" path-root "^0.1.1" +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + integrity sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA== + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" @@ -13738,6 +13962,11 @@ precinct@^12.0.2: postcss "^8.4.40" typescript "^5.5.4" +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + integrity sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ== + prettier@3.4.2, prettier@^3.0.0: version "3.4.2" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f" @@ -14073,6 +14302,15 @@ randexp@0.4.6: discontinuous-range "1.0.0" ret "~0.1.10" +randomatic@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" + integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== + dependencies: + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" + randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -14257,6 +14495,13 @@ regenerator-transform@^0.15.2: dependencies: "@babel/runtime" "^7.8.4" +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== + dependencies: + is-equal-shallow "^0.1.3" + regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -14350,7 +14595,7 @@ repeat-element@^1.1.2: resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== -repeat-string@^1.6.1: +repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== @@ -14459,6 +14704,16 @@ resolve-pkg-maps@^1.0.0: resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== +resolve-require@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/resolve-require/-/resolve-require-0.2.0.tgz#1661d37a0eb44b868f5f9dcffb6dfb3e37b56cd1" + integrity sha512-+qFj/DLlKtwFRA1KUiJCkEuCIApn9FQgPuXXQDf5OvAcK30L228+yHpLrUuuNxCtR9xslhBnDajrQoPGF3lNvg== + dependencies: + chalk "^1.0.0" + cwd "^0.6.0" + resolve "^1.1.6" + tildify "^1.0.0" + resolve-url-loader@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz#ee3142fb1f1e0d9db9524d539cfa166e9314f795" @@ -16258,6 +16513,13 @@ thunky@^1.0.2: resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== +tildify@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" + integrity sha512-Y9q1GaV/BO65Z9Yf4NOGMuwt3SGdptkZBnaaKfTQakrDyCLiuO1Kc5wxW4xLdsjzunRtqtOdhekiUFmZbklwYQ== + dependencies: + os-homedir "^1.0.0" + tinyexec@^0.3.0: version "0.3.2" resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" From fd7ee47bf702029e481ad40362684f0a01ef2ec0 Mon Sep 17 00:00:00 2001 From: Sebastian Ochoa Date: Fri, 24 Jan 2025 10:42:42 -0800 Subject: [PATCH 0184/1220] fix(platform-browser): Update pseudoevent created by createMouseSpecialEvent to populate `_originalEvent` property (#59690) This fixes an internal bug PR Close #59690 --- package.json | 1 - yarn.lock | 278 ++------------------------------------------------- 2 files changed, 8 insertions(+), 271 deletions(-) diff --git a/package.json b/package.json index a397f69eab5c..3e59f7db7bb1 100644 --- a/package.json +++ b/package.json @@ -125,7 +125,6 @@ "karma-sourcemap-loader": "^0.4.0", "magic-string": "^0.30.8", "memo-decorator": "^2.0.1", - "ng-cli": "^0.7.0", "ngx-flamegraph": "0.0.12", "ngx-progressbar": "^14.0.0", "open-in-idx": "^0.1.1", diff --git a/yarn.lock b/yarn.lock index 37c7549df470..3f113faa4af6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -305,6 +305,7 @@ "@angular/build-tooling@https://github.com/angular/dev-infra-private-build-tooling-builds.git#1298ed34f97ed13cce3177ffd25ac3292385b196": version "0.0.0-e8d26efbaea89c31f1580c61c968c8119f5247a6" + uid "1298ed34f97ed13cce3177ffd25ac3292385b196" resolved "https://github.com/angular/dev-infra-private-build-tooling-builds.git#1298ed34f97ed13cce3177ffd25ac3292385b196" dependencies: "@angular/benchpress" "0.3.0" @@ -428,6 +429,7 @@ "@angular/ng-dev@https://github.com/angular/dev-infra-private-ng-dev-builds.git#744e5a754635c8e8e008f957aba8f9dd8011cc8f": version "0.0.0-e8d26efbaea89c31f1580c61c968c8119f5247a6" + uid "744e5a754635c8e8e008f957aba8f9dd8011cc8f" resolved "https://github.com/angular/dev-infra-private-ng-dev-builds.git#744e5a754635c8e8e008f957aba8f9dd8011cc8f" dependencies: "@google-cloud/spanner" "7.17.1" @@ -5045,19 +5047,12 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - integrity sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA== - dependencies: - arr-flatten "^1.0.1" - arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== -arr-flatten@^1.0.1, arr-flatten@^1.1.0: +arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== @@ -5117,11 +5112,6 @@ array-uniq@^1.0.1: resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - integrity sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg== - array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" @@ -5573,15 +5563,6 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - integrity sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw== - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -5945,7 +5926,7 @@ chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: +chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== @@ -6422,7 +6403,7 @@ commander@^12.0.0, commander@^12.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== -commander@^2.11.0, commander@^2.12.1, commander@^2.19.0, commander@^2.2.0, commander@^2.20.0, commander@^2.6.0: +commander@^2.11.0, commander@^2.12.1, commander@^2.19.0, commander@^2.2.0, commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -6965,20 +6946,6 @@ custom-event@~1.0.0: resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" integrity sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg== -cwd@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/cwd/-/cwd-0.6.0.tgz#22851c7015a782e29142f9ca6a2d42dfd2e2aec4" - integrity sha512-o5jIjkderq/aabPcB02fRoEYK9VXNgGSsDDOfU4qT2vJ28pxzLKY8vUA3uz/VYRMorq+O4uOzwt+KJsIx5bLAA== - dependencies: - look-up "^0.7.0" - -cwd@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/cwd/-/cwd-0.7.0.tgz#d813b6719d6e7d78e0645d2774f02b62c24d66a4" - integrity sha512-Uury8DhzGUsEe937qstFzRGPaV8k0Ij86+on+/j4+GuwC8FIB6s/NFYPY5ZXjPFH703ksBwLTVRTjnXYI40lfw== - dependencies: - look-up "^0.7.1" - cytoscape-cose-bilkent@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz#762fa121df9930ffeb51a495d87917c570ac209b" @@ -8391,13 +8358,6 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - integrity sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA== - dependencies: - is-posix-bracket "^0.1.0" - expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -8411,20 +8371,6 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - integrity sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA== - dependencies: - fill-range "^2.1.0" - -expand-tilde@^1.2.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" - integrity sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q== - dependencies: - os-homedir "^1.0.1" - expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" @@ -8437,13 +8383,6 @@ exponential-backoff@^3.1.1: resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== -export-files@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/export-files/-/export-files-2.1.1.tgz#bbf64574053a09e4eb98e5f43501d572b2c3ce7f" - integrity sha512-r2x1Zt0OKgdXRy0bXis3sOI8TNYmo5Fe71qXwsvpYaMvIlH5G0fWEf3AYiE2bONjePdSOojca7Jw+p9CQ6/6NQ== - dependencies: - lazy-cache "^1.0.3" - express@^4.16.4, express@^4.21.2: version "4.21.2" resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" @@ -8510,13 +8449,6 @@ external-editor@^3.0.3, external-editor@^3.1.0: iconv-lite "^0.4.24" tmp "^0.0.33" -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - integrity sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg== - dependencies: - is-extglob "^1.0.0" - extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -8674,11 +8606,6 @@ file-uri-to-path@1.0.0: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - integrity sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ== - filesize@^6.1.0: version "6.4.0" resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.4.0.tgz#914f50471dd66fdca3cefe628bd0cde4ef769bcd" @@ -8701,17 +8628,6 @@ filing-cabinet@^5.0.1: tsconfig-paths "^4.2.0" typescript "^5.4.4" -fill-range@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^3.0.0" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -8953,13 +8869,6 @@ for-in@^1.0.1, for-in@^1.0.2: resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw== - dependencies: - for-in "^1.0.1" - for-own@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" @@ -9320,21 +9229,6 @@ git-semver-tags@^8.0.0: "@conventional-changelog/git-client" "^1.0.0" meow "^13.0.0" -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA== - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w== - dependencies: - is-glob "^2.0.0" - glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -10464,18 +10358,6 @@ is-docker@^3.0.0: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - integrity sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg== - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - integrity sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA== - dependencies: - is-primitive "^2.0.0" - is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -10488,11 +10370,6 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww== - is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -10532,13 +10409,6 @@ is-generator-function@^1.0.10: has-tostringtag "^1.0.2" safe-regex-test "^1.1.0" -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg== - dependencies: - is-extglob "^1.0.0" - is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -10632,11 +10502,6 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -10693,21 +10558,11 @@ is-plain-object@^5.0.0: resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - integrity sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ== - is-potential-custom-element-name@^1.0.1: version "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-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - integrity sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q== - is-promise@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" @@ -11458,7 +11313,7 @@ kind-of@^4.0.0: dependencies: is-buffer "^1.1.5" -kind-of@^6.0.0, kind-of@^6.0.2: +kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -11514,11 +11369,6 @@ layout-base@^2.0.0: resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-2.0.1.tgz#d0337913586c90f9c2c075292069f5c2da5dd285" integrity sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg== -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - integrity sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ== - lazystream@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.1.tgz#494c831062f1f9408251ec44db1cba29242a2638" @@ -11664,13 +11514,6 @@ lmdb@3.2.2: "@lmdb/lmdb-linux-x64" "3.2.2" "@lmdb/lmdb-win32-x64" "3.2.2" -load-pkg@^1.1.3: - version "1.3.0" - resolved "https://registry.yarnpkg.com/load-pkg/-/load-pkg-1.3.0.tgz#756dcfb4589b9167134ed9be70c23d28ad52853f" - integrity sha512-NywsSvGXZ6uzqokhyHaM25mv3OX344whOM/SM7POso7dfklluwR8pO1K+kCxuWjXQSbdaw0LqOQW+vTHEI7M/w== - dependencies: - cwd "^0.7.0" - loader-runner@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" @@ -11912,15 +11755,6 @@ long@^5.0.0: resolved "https://registry.yarnpkg.com/long/-/long-5.2.4.tgz#ee651d5c7c25901cfca5e67220ae9911695e99b2" integrity sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg== -look-up@^0.7.0, look-up@^0.7.1: - version "0.7.2" - resolved "https://registry.yarnpkg.com/look-up/-/look-up-0.7.2.tgz#d6242e85eb1cbd8a10f6ed0faf75cc51f4930f86" - integrity sha512-pVSdOsOapmIj58imZ0rf3btj23PRGTuLaFpwPSH0paX9yj3igBxB5OfSBeAnAoPX/Iy30Qwtz+MX6mdJTUCYSA== - dependencies: - expand-tilde "^1.2.0" - is-glob "^2.0.0" - micromatch "^2.2.0" - lower-case@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" @@ -12121,11 +11955,6 @@ math-intrinsics@^1.1.0: resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== -math-random@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" - integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== - mdast-util-to-hast@^13.0.0: version "13.2.0" resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz#5ca58e5b921cc0a3ded1bc02eed79a4fe4fe41f4" @@ -12252,25 +12081,6 @@ micromark-util-types@^2.0.0: resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.1.tgz#a3edfda3022c6c6b55bfb049ef5b75d70af50709" integrity sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ== -micromatch@^2.2.0: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - integrity sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA== - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -12713,17 +12523,6 @@ netmask@^2.0.2: resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== -ng-cli@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/ng-cli/-/ng-cli-0.7.0.tgz#fbf7f7eb9fd740cb69430e5c3590c7ba9fd33bd2" - integrity sha512-WTMYBvVvkS2JvI8zzjaevQoSflxlf5j/u6HYBH2OY7RTeZVgU3EdB77nn4Px3tfZSnpKdCtYDfuDBVsvKL+lkw== - dependencies: - commander "^2.6.0" - cwd "^0.6.0" - export-files "^2.0.1" - load-pkg "^1.1.3" - resolve-require "^0.2.0" - ngx-flamegraph@0.0.12: version "0.0.12" resolved "https://registry.yarnpkg.com/ngx-flamegraph/-/ngx-flamegraph-0.0.12.tgz#2e1661979f01d605467539b26ec28b3bc74b9f1a" @@ -12871,7 +12670,7 @@ normalize-path@3.0.0, normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-path@^2.0.1, normalize-path@^2.1.1: +normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== @@ -13030,14 +12829,6 @@ object.defaults@^1.1.0: for-own "^1.0.0" isobject "^3.0.0" -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - integrity sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA== - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -13187,11 +12978,6 @@ ordered-binary@^1.5.3: resolved "https://registry.yarnpkg.com/ordered-binary/-/ordered-binary-1.5.3.tgz#8bee2aa7a82c3439caeb1e80c272fd4cf51170fb" integrity sha512-oGFr3T+pYdTGJ+YFEILMpS3es+GiIbs9h/XQrclBXUtd44ey7XwfsMzM31f64I1SQOawDoDr/D823kNCADI8TA== -os-homedir@^1.0.0, os-homedir@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== - os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -13393,16 +13179,6 @@ parse-filepath@^1.0.2: map-cache "^0.2.0" path-root "^0.1.1" -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA== - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" @@ -13962,11 +13738,6 @@ precinct@^12.0.2: postcss "^8.4.40" typescript "^5.5.4" -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - integrity sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ== - prettier@3.4.2, prettier@^3.0.0: version "3.4.2" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f" @@ -14302,15 +14073,6 @@ randexp@0.4.6: discontinuous-range "1.0.0" ret "~0.1.10" -randomatic@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" - integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== - dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" - randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -14495,13 +14257,6 @@ regenerator-transform@^0.15.2: dependencies: "@babel/runtime" "^7.8.4" -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== - dependencies: - is-equal-shallow "^0.1.3" - regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -14595,7 +14350,7 @@ repeat-element@^1.1.2: resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== -repeat-string@^1.5.2, repeat-string@^1.6.1: +repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== @@ -14704,16 +14459,6 @@ resolve-pkg-maps@^1.0.0: resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== -resolve-require@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/resolve-require/-/resolve-require-0.2.0.tgz#1661d37a0eb44b868f5f9dcffb6dfb3e37b56cd1" - integrity sha512-+qFj/DLlKtwFRA1KUiJCkEuCIApn9FQgPuXXQDf5OvAcK30L228+yHpLrUuuNxCtR9xslhBnDajrQoPGF3lNvg== - dependencies: - chalk "^1.0.0" - cwd "^0.6.0" - resolve "^1.1.6" - tildify "^1.0.0" - resolve-url-loader@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz#ee3142fb1f1e0d9db9524d539cfa166e9314f795" @@ -16513,13 +16258,6 @@ thunky@^1.0.2: resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== -tildify@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" - integrity sha512-Y9q1GaV/BO65Z9Yf4NOGMuwt3SGdptkZBnaaKfTQakrDyCLiuO1Kc5wxW4xLdsjzunRtqtOdhekiUFmZbklwYQ== - dependencies: - os-homedir "^1.0.0" - tinyexec@^0.3.0: version "0.3.2" resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" From 9af14b25d12365f71777c53d4879d02604a10c74 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Thu, 23 Jan 2025 12:27:15 +0100 Subject: [PATCH 0185/1220] refactor(core): simplify attributes extraction logic for ComponentRef (#59678) Make extractAttrsAndClassesFromSelector to return TAttributes directly to simplify the overall logic and remove unecessary code. PR Close #59678 --- packages/core/src/render3/component_ref.ts | 21 ++----------------- .../core/src/render3/instructions/shared.ts | 2 +- .../core/src/render3/node_selector_matcher.ts | 13 ++++++------ .../render3/node_selector_matcher_spec.ts | 9 ++++++-- 4 files changed, 17 insertions(+), 28 deletions(-) diff --git a/packages/core/src/render3/component_ref.ts b/packages/core/src/render3/component_ref.ts index c121c0757b45..f9ea917070d2 100644 --- a/packages/core/src/render3/component_ref.ts +++ b/packages/core/src/render3/component_ref.ts @@ -52,7 +52,6 @@ import {ComponentDef, DirectiveDef, HostDirectiveDefs} from './interfaces/defini import {InputFlags} from './interfaces/input_flags'; import { NodeInputBindings, - TAttributes, TContainerNode, TElementContainerNode, TElementNode, @@ -73,9 +72,7 @@ import {MATH_ML_NAMESPACE, SVG_NAMESPACE} from './namespaces'; import {ChainedInjector} from './chained_injector'; import {createElementNode, setupStaticAttributes} from './dom_node_manipulation'; -import {AttributeMarker} from './interfaces/attribute_marker'; import {unregisterLView} from './interfaces/lview_tracking'; -import {CssSelector} from './interfaces/projection'; import { extractAttrsAndClassesFromSelector, stringifyCSSSelectorList, @@ -158,18 +155,6 @@ function getNamespace(elementName: string): string | null { return name === 'svg' ? SVG_NAMESPACE : name === 'math' ? MATH_ML_NAMESPACE : null; } -// TODO(pk): change the extractAttrsAndClassesFromSelector so it returns TAttributes already? -function getRootTAttributesFromSelector(selector: CssSelector) { - const {attrs, classes} = extractAttrsAndClassesFromSelector(selector); - - const tAtts: TAttributes = attrs; - if (classes.length) { - tAtts.push(AttributeMarker.Classes, ...classes); - } - - return tAtts; -} - /** * ComponentFactory interface implementation. */ @@ -215,9 +200,7 @@ export class ComponentFactory extends AbstractComponentFactory { super(); this.componentType = componentDef.type; this.selector = stringifyCSSSelectorList(componentDef.selectors); - this.ngContentSelectors = componentDef.ngContentSelectors - ? componentDef.ngContentSelectors - : []; + this.ngContentSelectors = componentDef.ngContentSelectors ?? []; this.isBoundToModule = !!ngModule; } @@ -372,7 +355,7 @@ 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. - getRootTAttributesFromSelector(this.componentDef.selectors[0]); + extractAttrsAndClassesFromSelector(this.componentDef.selectors[0]); // TODO: this logic is shared with the element instruction first create pass const hostTNode = getOrCreateTNode( diff --git a/packages/core/src/render3/instructions/shared.ts b/packages/core/src/render3/instructions/shared.ts index c3fbd181620c..39c948921648 100644 --- a/packages/core/src/render3/instructions/shared.ts +++ b/packages/core/src/render3/instructions/shared.ts @@ -1279,7 +1279,7 @@ export function getInitialLViewFlagsFromDef(def: ComponentDef): LViewFl return flags; } -export function createComponentLView( +function createComponentLView( lView: LView, hostTNode: TElementNode, def: ComponentDef, diff --git a/packages/core/src/render3/node_selector_matcher.ts b/packages/core/src/render3/node_selector_matcher.ts index 9e47c8a71934..b18104c66dfc 100644 --- a/packages/core/src/render3/node_selector_matcher.ts +++ b/packages/core/src/render3/node_selector_matcher.ts @@ -440,11 +440,8 @@ export function stringifyCSSSelectorList(selectorList: CssSelectorList): string * @param selector CSS selector in parsed form (in a form of array) * @returns object with `attrs` and `classes` fields that contain extracted information */ -export function extractAttrsAndClassesFromSelector(selector: CssSelector): { - attrs: string[]; - classes: string[]; -} { - const attrs: string[] = []; +export function extractAttrsAndClassesFromSelector(selector: CssSelector): TAttributes { + const attrs: TAttributes = []; const classes: string[] = []; let i = 1; let mode = SelectorFlags.ATTRIBUTE; @@ -467,5 +464,9 @@ export function extractAttrsAndClassesFromSelector(selector: CssSelector): { } i++; } - return {attrs, classes}; + if (classes.length) { + attrs.push(AttributeMarker.Classes, ...classes); + } + + return attrs; } diff --git a/packages/core/test/render3/node_selector_matcher_spec.ts b/packages/core/test/render3/node_selector_matcher_spec.ts index 3d0ac7d22045..4341ac87cad6 100644 --- a/packages/core/test/render3/node_selector_matcher_spec.ts +++ b/packages/core/test/render3/node_selector_matcher_spec.ts @@ -741,8 +741,13 @@ describe('extractAttrsAndClassesFromSelector', () => { cases.forEach(([selector, attrs, classes]) => { it(`should process ${JSON.stringify(selector)} selector`, () => { const extracted = extractAttrsAndClassesFromSelector(selector); - expect(extracted.attrs).toEqual(attrs as string[]); - expect(extracted.classes).toEqual(classes as string[]); + const cssClassMarker = extracted.indexOf(AttributeMarker.Classes); + + const extractedAttrs = cssClassMarker > -1 ? extracted.slice(0, cssClassMarker) : extracted; + const extractedClasses = cssClassMarker > -1 ? extracted.slice(cssClassMarker + 1) : []; + + expect(extractedAttrs).toEqual(attrs as string[]); + expect(extractedClasses).toEqual(classes as string[]); }); }); }); From cfa9fc2098ade6591056ca0968ff94f063306250 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Thu, 23 Jan 2025 12:42:54 +0100 Subject: [PATCH 0186/1220] refactor(core): simplify ComponentRef creation (#59678) Move more logic to a constructor of a ComponentRef. PR Close #59678 --- packages/core/src/render3/component_ref.ts | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/packages/core/src/render3/component_ref.ts b/packages/core/src/render3/component_ref.ts index f9ea917070d2..204d6484df5e 100644 --- a/packages/core/src/render3/component_ref.ts +++ b/packages/core/src/render3/component_ref.ts @@ -422,14 +422,7 @@ export class ComponentFactory extends AbstractComponentFactory { leaveView(); } - const hostTNode = getTNode(rootTView, HEADER_OFFSET) as TElementNode; - return new ComponentRef( - this.componentType, - componentView[CONTEXT] as T, - createElementRef(hostTNode, rootLView), - rootLView, - hostTNode, - ); + return new ComponentRef(this.componentType, rootLView); } finally { setActiveConsumer(prevConsumer); } @@ -449,17 +442,18 @@ export class ComponentRef extends AbstractComponentRef { override hostView: ViewRef; override changeDetectorRef: ChangeDetectorRef; override componentType: Type; + override location: ElementRef; private previousInputValues: Map | null = null; + private _tNode: TElementNode | TContainerNode | TElementContainerNode; constructor( componentType: Type, - instance: T, - public location: ElementRef, private _rootLView: LView, - private _tNode: TElementNode | TContainerNode | TElementContainerNode, ) { super(); - this.instance = instance; + this._tNode = getTNode(_rootLView[TVIEW], HEADER_OFFSET) as TElementNode; + this.location = createElementRef(this._tNode, _rootLView); + this.instance = getComponentLViewByIndex(this._tNode.index, _rootLView)[CONTEXT] as T; this.hostView = this.changeDetectorRef = new ViewRef( _rootLView, undefined /* _cdRefInjectingView */, From df143b486bdb2bb80a7d8be4bcce5be4e9fe4130 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Thu, 23 Jan 2025 14:38:19 +0100 Subject: [PATCH 0187/1220] refactor(core): remove unused LifecycleHooksFeature (#59678) LifecycleHooksFeature seems to be unused and can be deleted. PR Close #59678 --- .../core/src/core_render3_private_export.ts | 1 - packages/core/src/render3/component_ref.ts | 19 ------------------- packages/core/src/render3/index.ts | 2 -- 3 files changed, 22 deletions(-) diff --git a/packages/core/src/core_render3_private_export.ts b/packages/core/src/core_render3_private_export.ts index 86ac11072011..3f153e2e0fd2 100644 --- a/packages/core/src/core_render3_private_export.ts +++ b/packages/core/src/core_render3_private_export.ts @@ -48,7 +48,6 @@ export { DirectiveType as ɵDirectiveType, getDirectives as ɵgetDirectives, getHostElement as ɵgetHostElement, - LifecycleHooksFeature as ɵLifecycleHooksFeature, NgModuleFactory as ɵNgModuleFactory, NgModuleRef as ɵRender3NgModuleRef, NgModuleType as ɵNgModuleType, diff --git a/packages/core/src/render3/component_ref.ts b/packages/core/src/render3/component_ref.ts index 204d6484df5e..af205b40d586 100644 --- a/packages/core/src/render3/component_ref.ts +++ b/packages/core/src/render3/component_ref.ts @@ -521,22 +521,3 @@ function projectNodes( projection.push(nodesforSlot != null && nodesforSlot.length ? Array.from(nodesforSlot) : null); } } - -/** - * Used to enable lifecycle hooks on the root component. - * - * Include this feature when calling `renderComponent` if the root component - * you are rendering has lifecycle hooks defined. Otherwise, the hooks won't - * be called properly. - * - * Example: - * - * ```ts - * renderComponent(AppComponent, {hostFeatures: [LifecycleHooksFeature]}); - * ``` - */ -export function LifecycleHooksFeature(): void { - const tNode = getCurrentTNode()!; - ngDevMode && assertDefined(tNode, 'TNode is required'); - registerPostOrderHooks(getLView()[TVIEW], tNode); -} diff --git a/packages/core/src/render3/index.ts b/packages/core/src/render3/index.ts index 6b0a2b1b7067..5e5841bc23ac 100644 --- a/packages/core/src/render3/index.ts +++ b/packages/core/src/render3/index.ts @@ -5,7 +5,6 @@ * 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 {LifecycleHooksFeature} from './component_ref'; import {ɵɵdefineComponent, ɵɵdefineDirective, ɵɵdefineNgModule, ɵɵdefinePipe} from './definition'; import {ɵɵCopyDefinitionFeature} from './features/copy_definition_feature'; import {ɵɵHostDirectivesFeature} from './features/host_directives_feature'; @@ -235,7 +234,6 @@ export { getDirectives, getHostElement, getRenderedText, - LifecycleHooksFeature, PipeDef, ɵɵComponentDeclaration, ɵɵCopyDefinitionFeature, From b4093302239c3fe3de8d3e99587efa67b1582877 Mon Sep 17 00:00:00 2001 From: arturovt Date: Sat, 11 Jan 2025 00:13:38 +0200 Subject: [PATCH 0188/1220] refactor(service-worker): drop platform checks (#59475) In this commit, we drop `isPlatformBrowser` checks in favor of `ngServerMode` compile-time variable. PR Close #59475 --- packages/service-worker/src/provider.ts | 24 +++++++--------- packages/service-worker/test/comm_spec.ts | 35 +++++++++++++++-------- 2 files changed, 34 insertions(+), 25 deletions(-) diff --git a/packages/service-worker/src/provider.ts b/packages/service-worker/src/provider.ts index 6c051aace61a..fae503661cf9 100644 --- a/packages/service-worker/src/provider.ts +++ b/packages/service-worker/src/provider.ts @@ -6,7 +6,6 @@ * found in the LICENSE file at https://angular.dev/license */ -import {isPlatformBrowser} from '@angular/common'; import { APP_INITIALIZER, ApplicationRef, @@ -15,7 +14,6 @@ import { Injector, makeEnvironmentProviders, NgZone, - PLATFORM_ID, } from '@angular/core'; import {merge, from, Observable, of} from 'rxjs'; import {delay, take} from 'rxjs/operators'; @@ -30,12 +28,13 @@ export function ngswAppInitializer( injector: Injector, script: string, options: SwRegistrationOptions, - platformId: string, ): Function { return () => { - if ( - !(isPlatformBrowser(platformId) && 'serviceWorker' in navigator && options.enabled !== false) - ) { + if (typeof ngServerMode !== 'undefined' && ngServerMode) { + return; + } + + if (!('serviceWorker' in navigator && options.enabled !== false)) { return; } @@ -109,12 +108,11 @@ function delayWithTimeout(timeout: number): Observable { return of(null).pipe(delay(timeout)); } -export function ngswCommChannelFactory( - opts: SwRegistrationOptions, - platformId: string, -): NgswCommChannel { +export function ngswCommChannelFactory(opts: SwRegistrationOptions): NgswCommChannel { + const isBrowser = !(typeof ngServerMode !== 'undefined' && ngServerMode); + return new NgswCommChannel( - isPlatformBrowser(platformId) && opts.enabled !== false ? navigator.serviceWorker : undefined, + isBrowser && opts.enabled !== false ? navigator.serviceWorker : undefined, ); } @@ -207,12 +205,12 @@ export function provideServiceWorker( { provide: NgswCommChannel, useFactory: ngswCommChannelFactory, - deps: [SwRegistrationOptions, PLATFORM_ID], + deps: [SwRegistrationOptions], }, { provide: APP_INITIALIZER, useFactory: ngswAppInitializer, - deps: [Injector, SCRIPT, SwRegistrationOptions, PLATFORM_ID], + deps: [Injector, SCRIPT, SwRegistrationOptions], multi: true, }, ]); diff --git a/packages/service-worker/test/comm_spec.ts b/packages/service-worker/test/comm_spec.ts index 21bd1d513e1d..5c1fcdd8b9c9 100644 --- a/packages/service-worker/test/comm_spec.ts +++ b/packages/service-worker/test/comm_spec.ts @@ -62,21 +62,32 @@ describe('ServiceWorker library', () => { }); describe('ngswCommChannelFactory', () => { - it('gives disabled NgswCommChannel for platform-server', () => { - TestBed.configureTestingModule({ - providers: [ - {provide: PLATFORM_ID, useValue: 'server'}, - {provide: SwRegistrationOptions, useValue: {enabled: true}}, - { - provide: NgswCommChannel, - useFactory: ngswCommChannelFactory, - deps: [SwRegistrationOptions, PLATFORM_ID], - }, - ], + describe('server', () => { + beforeEach(() => { + globalThis['ngServerMode'] = true; }); - expect(TestBed.inject(NgswCommChannel).isEnabled).toEqual(false); + afterEach(() => { + globalThis['ngServerMode'] = undefined; + }); + + it('gives disabled NgswCommChannel for platform-server', () => { + TestBed.configureTestingModule({ + providers: [ + {provide: PLATFORM_ID, useValue: 'server'}, + {provide: SwRegistrationOptions, useValue: {enabled: true}}, + { + provide: NgswCommChannel, + useFactory: ngswCommChannelFactory, + deps: [SwRegistrationOptions, PLATFORM_ID], + }, + ], + }); + + expect(TestBed.inject(NgswCommChannel).isEnabled).toEqual(false); + }); }); + it("gives disabled NgswCommChannel when 'enabled' option is false", () => { TestBed.configureTestingModule({ providers: [ From 69fe9163f592ba24867f590e3cf031ab6d6418e1 Mon Sep 17 00:00:00 2001 From: hawkgs Date: Mon, 27 Jan 2025 17:05:26 +0200 Subject: [PATCH 0189/1220] docs(docs-infra): fix header layout for tablets (#59734) The version picker and the theme and socials buttons were not properly styled. PR Close #59734 --- .../navigation/navigation.component.scss | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/adev/src/app/core/layout/navigation/navigation.component.scss b/adev/src/app/core/layout/navigation/navigation.component.scss index 95323d37d413..7b9e19769e6b 100644 --- a/adev/src/app/core/layout/navigation/navigation.component.scss +++ b/adev/src/app/core/layout/navigation/navigation.component.scss @@ -64,7 +64,9 @@ // render primary nav / mini menu above tablet secondary bar z-index: 250; position: relative; - transition: background-color 0.3s ease, border-color 0.3s ease; + transition: + background-color 0.3s ease, + border-color 0.3s ease; height: 100dvh; padding-block-start: 1rem; padding-block-end: 2rem; @@ -96,8 +98,8 @@ color-mix(in srgb, var(--orange-red), transparent 60%) 0%, color-mix(in srgb, var(--vivid-pink), transparent 40%) 15%, color-mix(in srgb, var(--electric-violet), transparent 70%) 25%, - color-mix(in srgb, var(--bright-blue), transparent 60%) 90%, - ); + color-mix(in srgb, var(--bright-blue), transparent 60%) 90% + ); } &.adev-nav-primary--deprecated { @@ -195,7 +197,7 @@ } li { - padding-inline: 1rem; + padding-inline: 0.875rem; } } } @@ -209,8 +211,9 @@ gap: 1rem; @include mq.for-tablet { - flex-direction: row; + flex-direction: row !important; margin-inline-end: 1.25rem; + gap: 0.75rem; } .adev-nav-item--active { @@ -249,8 +252,14 @@ } } -.adev-nav-item--logo a { - height: 34px; +.adev-nav-item--logo { + a { + height: 34px; + } + + @include mq.for-tablet { + gap: 0.75rem; + } } .adev-close-nav { @@ -281,7 +290,9 @@ border-block-end: 1px solid var(--septenary-contrast); padding-block: 1rem; padding-inline: var(--layout-padding); - transition: background-color 0.3s ease, border-color 0.3s ease; + transition: + background-color 0.3s ease, + border-color 0.3s ease; button { display: flex; gap: 0.5rem; From 762e56e21014bad5d5ab74966447cfef60a021e3 Mon Sep 17 00:00:00 2001 From: arturovt Date: Sat, 25 Jan 2025 18:33:08 +0200 Subject: [PATCH 0190/1220] refactor(common): drop platform check in `PreconnectLinkChecker` (#59714) Replaces platform check within the `PreconnectLinkChecker` with the `ngServerMode` global. PR Close #59714 --- .../ng_optimized_image/preconnect_link_checker.ts | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/packages/common/src/directives/ng_optimized_image/preconnect_link_checker.ts b/packages/common/src/directives/ng_optimized_image/preconnect_link_checker.ts index 413cf21dda3f..0293d461cc21 100644 --- a/packages/common/src/directives/ng_optimized_image/preconnect_link_checker.ts +++ b/packages/common/src/directives/ng_optimized_image/preconnect_link_checker.ts @@ -11,7 +11,6 @@ import { Injectable, InjectionToken, ɵformatRuntimeError as formatRuntimeError, - PLATFORM_ID, } from '@angular/core'; import {DOCUMENT} from '../../dom_tokens'; @@ -20,7 +19,6 @@ import {RuntimeErrorCode} from '../../errors'; import {assertDevMode} from './asserts'; import {imgDirectiveDetails} from './error_helper'; import {extractHostname, getUrl} from './url'; -import {isPlatformServer} from '../../platform_id'; // Set of origins that are always excluded from the preconnect checks. const INTERNAL_PRECONNECT_CHECK_BLOCKLIST = new Set(['localhost', '127.0.0.1', '0.0.0.0']); @@ -57,7 +55,6 @@ export const PRECONNECT_CHECK_BLOCKLIST = new InjectionToken tags found on this page. @@ -70,16 +67,12 @@ export class PreconnectLinkChecker { */ private alreadySeen = new Set(); - private window: Window | null = null; + private window: Window | null = this.document.defaultView; private blocklist = new Set(INTERNAL_PRECONNECT_CHECK_BLOCKLIST); constructor() { assertDevMode('preconnect link checker'); - const win = this.document.defaultView; - if (typeof win !== 'undefined') { - this.window = win; - } const blocklist = inject(PRECONNECT_CHECK_BLOCKLIST, {optional: true}); if (blocklist) { this.populateBlocklist(blocklist); @@ -104,7 +97,7 @@ export class PreconnectLinkChecker { * @param originalNgSrc ngSrc value */ assertPreconnect(rewrittenSrc: string, originalNgSrc: string): void { - if (this.isServer) return; + if (typeof ngServerMode !== 'undefined' && ngServerMode) return; const imgUrl = getUrl(rewrittenSrc, this.window!); if (this.blocklist.has(imgUrl.hostname) || this.alreadySeen.has(imgUrl.origin)) return; From 3373b4f82adb5a646be7ad0c465d1855ff0323a1 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Tue, 28 Jan 2025 06:12:36 +0000 Subject: [PATCH 0191/1220] build: update github/codeql-action action to v3.28.6 (#59744) See associated pull request for more information. PR Close #59744 --- .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 dd9e04b93552..b10883a23d93 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@b6a472f63d85b9c78a3ac5e89422239fc15e9b3c # v3.28.1 + uses: github/codeql-action/upload-sarif@17a820bf2e43b47be2c72b39cc905417bc1ab6d0 # v3.28.6 with: sarif_file: results.sarif From acdde4aa35339779146433cce3ff79e6fcc3b99b Mon Sep 17 00:00:00 2001 From: arturovt Date: Fri, 24 Jan 2025 16:43:57 +0200 Subject: [PATCH 0192/1220] refactor(router): remove unused code (#59704) This code is never used. PR Close #59704 --- .../testing/src/router_testing_module.ts | 25 +------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/packages/router/testing/src/router_testing_module.ts b/packages/router/testing/src/router_testing_module.ts index b540d4d9f577..56dc6eda52d7 100644 --- a/packages/router/testing/src/router_testing_module.ts +++ b/packages/router/testing/src/router_testing_module.ts @@ -6,42 +6,19 @@ * found in the LICENSE file at https://angular.dev/license */ -import {Location} from '@angular/common'; import {provideLocationMocks} from '@angular/common/testing'; -import {Compiler, inject, Injector, ModuleWithProviders, NgModule} from '@angular/core'; +import {ModuleWithProviders, NgModule} from '@angular/core'; import { - ChildrenOutletContexts, ExtraOptions, NoPreloading, - Route, - Router, ROUTER_CONFIGURATION, - RouteReuseStrategy, RouterModule, ROUTES, Routes, - TitleStrategy, - UrlHandlingStrategy, - UrlSerializer, withPreloading, ɵROUTER_PROVIDERS as ROUTER_PROVIDERS, } from '@angular/router'; -function isUrlHandlingStrategy( - opts: ExtraOptions | UrlHandlingStrategy, -): opts is UrlHandlingStrategy { - // This property check is needed because UrlHandlingStrategy is an interface and doesn't exist at - // runtime. - return 'shouldProcessUrl' in opts; -} - -function throwInvalidConfigError(parameter: string): never { - throw new Error( - `Parameter ${parameter} does not match the one available in the injector. ` + - '`setupTestingRouter` is meant to be used as a factory function with dependencies coming from DI.', - ); -} - /** * @description * From b7dd0483d00e5f936c054ed106ab9629041a86c2 Mon Sep 17 00:00:00 2001 From: arturovt Date: Wed, 15 Jan 2025 23:29:52 +0200 Subject: [PATCH 0193/1220] refactor(common): drop error messages in production (#59545) Switches to using `RuntimeError` and drops error messages in production by replacing it with an error code. PR Close #59545 --- goldens/public-api/common/http/errors.api.md | 10 ++++++++- packages/common/http/src/client.ts | 23 +++++++++++++++----- packages/common/http/src/errors.ts | 4 ++++ 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/goldens/public-api/common/http/errors.api.md b/goldens/public-api/common/http/errors.api.md index de8b1f7080e1..312f919ff9a8 100644 --- a/goldens/public-api/common/http/errors.api.md +++ b/goldens/public-api/common/http/errors.api.md @@ -17,7 +17,15 @@ export const enum RuntimeErrorCode { // (undocumented) MISSING_JSONP_MODULE = -2800, // (undocumented) - NOT_USING_FETCH_BACKEND_IN_SSR = 2801 + NOT_USING_FETCH_BACKEND_IN_SSR = 2801, + // (undocumented) + RESPONSE_IS_NOT_A_BLOB = 2807, + // (undocumented) + RESPONSE_IS_NOT_A_STRING = 2808, + // (undocumented) + RESPONSE_IS_NOT_AN_ARRAY_BUFFER = 2806, + // (undocumented) + UNHANDLED_OBSERVE_TYPE = 2809 } // (No @packageDocumentation comment for this package) diff --git a/packages/common/http/src/client.ts b/packages/common/http/src/client.ts index ec6d38de0bbb..a9abd2886b97 100644 --- a/packages/common/http/src/client.ts +++ b/packages/common/http/src/client.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -import {Injectable} from '@angular/core'; +import {Injectable, ɵRuntimeError as RuntimeError} from '@angular/core'; import {Observable, of} from 'rxjs'; import {concatMap, filter, map} from 'rxjs/operators'; @@ -16,6 +16,7 @@ import {HttpHeaders} from './headers'; import {HttpParams, HttpParamsOptions} from './params'; import {HttpRequest} from './request'; import {HttpEvent, HttpResponse} from './response'; +import {RuntimeErrorCode} from './errors'; /** * Constructs an instance of `HttpRequestOptions` from a source `HttpMethodOptions` and @@ -693,7 +694,10 @@ export class HttpClient { map((res: HttpResponse) => { // Validate that the body is an ArrayBuffer. if (res.body !== null && !(res.body instanceof ArrayBuffer)) { - throw new Error('Response is not an ArrayBuffer.'); + throw new RuntimeError( + RuntimeErrorCode.RESPONSE_IS_NOT_AN_ARRAY_BUFFER, + ngDevMode && 'Response is not an ArrayBuffer.', + ); } return res.body; }), @@ -703,7 +707,10 @@ export class HttpClient { map((res: HttpResponse) => { // Validate that the body is a Blob. if (res.body !== null && !(res.body instanceof Blob)) { - throw new Error('Response is not a Blob.'); + throw new RuntimeError( + RuntimeErrorCode.RESPONSE_IS_NOT_A_BLOB, + ngDevMode && 'Response is not a Blob.', + ); } return res.body; }), @@ -713,7 +720,10 @@ export class HttpClient { map((res: HttpResponse) => { // Validate that the body is a string. if (res.body !== null && typeof res.body !== 'string') { - throw new Error('Response is not a string.'); + throw new RuntimeError( + RuntimeErrorCode.RESPONSE_IS_NOT_A_STRING, + ngDevMode && 'Response is not a string.', + ); } return res.body; }), @@ -728,7 +738,10 @@ export class HttpClient { return res$; default: // Guard against new future observe types being added. - throw new Error(`Unreachable: unhandled observe type ${options.observe}}`); + throw new RuntimeError( + RuntimeErrorCode.UNHANDLED_OBSERVE_TYPE, + ngDevMode && `Unreachable: unhandled observe type ${options.observe}}`, + ); } } diff --git a/packages/common/http/src/errors.ts b/packages/common/http/src/errors.ts index 4b9344a5f948..0d7d1de0d96d 100644 --- a/packages/common/http/src/errors.ts +++ b/packages/common/http/src/errors.ts @@ -17,4 +17,8 @@ export const enum RuntimeErrorCode { HTTP_ORIGIN_MAP_USED_IN_CLIENT = 2803, HTTP_ORIGIN_MAP_CONTAINS_PATH = 2804, CANNOT_SPECIFY_BOTH_FROM_STRING_AND_FROM_OBJECT = 2805, + RESPONSE_IS_NOT_AN_ARRAY_BUFFER = 2806, + RESPONSE_IS_NOT_A_BLOB = 2807, + RESPONSE_IS_NOT_A_STRING = 2808, + UNHANDLED_OBSERVE_TYPE = 2809, } From 127fc0dc847a4e8b62be36cdd980a067c4da974f Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Wed, 22 Jan 2025 15:39:10 -0800 Subject: [PATCH 0194/1220] fix(core): fix `resource()`'s `previous.state` (#59708) When a resource first starts up, even if it transitions immediately to `Loading` it should report a `previous.state` of `Idle`. It was reporting `Loading` as the previous state in such a case because of an oversight in the migration to `linkedSignal` which this commit addresses. PR Close #59708 --- packages/core/src/resource/resource.ts | 14 +++++++------- packages/core/test/resource/resource_spec.ts | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/packages/core/src/resource/resource.ts b/packages/core/src/resource/resource.ts index be975f56d20d..4649d6f21e26 100644 --- a/packages/core/src/resource/resource.ts +++ b/packages/core/src/resource/resource.ts @@ -269,7 +269,7 @@ class ResourceImpl extends BaseWritableResource implements ResourceRef< private async loadEffect(): Promise { // 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: previousStatus} = untracked(this.state); + 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 @@ -280,8 +280,8 @@ class ResourceImpl extends BaseWritableResource implements ResourceRef< // Nothing to load (and we should already be in a non-loading state). return; } else if ( - previousStatus !== ResourceStatus.Loading && - previousStatus !== ResourceStatus.Reloading + currentStatus !== ResourceStatus.Loading && + currentStatus !== ResourceStatus.Reloading ) { // We might've transitioned into a loading state, but has since been overwritten (likely via // `.set`). @@ -310,15 +310,15 @@ class ResourceImpl extends BaseWritableResource implements ResourceRef< // The actual loading is run through `untracked` - only the request side of `resource` is // reactive. This avoids any confusion with signals tracking or not tracking depending on // which side of the `await` they are. - const stream = await untracked(() => - this.loaderFn({ + const stream = await untracked(() => { + return this.loaderFn({ request: request as Exclude, abortSignal, previous: { status: previousStatus, }, - }), - ); + }); + }); if (abortSignal.aborted) { return; diff --git a/packages/core/test/resource/resource_spec.ts b/packages/core/test/resource/resource_spec.ts index 29dc60062ec0..aac793b9eff8 100644 --- a/packages/core/test/resource/resource_spec.ts +++ b/packages/core/test/resource/resource_spec.ts @@ -107,6 +107,25 @@ describe('resource', () => { expect(echoResource.error()).toBe(undefined); }); + it('should report idle status as the previous status on first run', async () => { + let prevStatus: ResourceStatus | undefined; + resource({ + loader: async ({previous}) => { + // Ensure the loader only runs once. + expect(prevStatus).toBeUndefined(); + + prevStatus = previous.status; + return true; + }, + injector: TestBed.inject(Injector), + }); + + TestBed.flushEffects(); + await flushMicrotasks(); + + expect(prevStatus).toBe(ResourceStatus.Idle); + }); + it('should expose errors thrown during resource loading', async () => { const backend = new MockEchoBackend(); const requestParam = {}; From 6c92d653493404a5f13aa59cde390bcbed973fb6 Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Fri, 24 Jan 2025 09:55:16 -0800 Subject: [PATCH 0195/1220] fix(core): add `hasValue` narrowing to `ResourceRef` (#59708) `hasValue` attempts to narrow the type of a resource to exclude `undefined`. Because of the way signal types merge in TS, this only works if the type of the resource is the same general type as `hasValue` asserts. For example, if `res` is `WritableResource` then `.hasValue()` correctly asserts that `res` is `WritableResource` and `.value()` will be narrowed. If `res` is `ResourceRef` then that narrowing does _not_ work correctly, since `.hasValue()` will assert `res` is `WritableResource` and TS will combine that for a final type of `ResourceRef & WritableResource`. The final type of `.value()` then will not narrow. This commit fixes the above problem by adding a `.hasValue()` override to `ResourceRef` which asserts the resource is of type `ResourceRef`. Fixes #59707 PR Close #59708 --- goldens/public-api/core/index.api.md | 2 ++ packages/core/src/resource/api.ts | 2 ++ packages/core/src/resource/resource.ts | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/goldens/public-api/core/index.api.md b/goldens/public-api/core/index.api.md index ec143fda7330..28197e6d9f02 100644 --- a/goldens/public-api/core/index.api.md +++ b/goldens/public-api/core/index.api.md @@ -1634,6 +1634,8 @@ export type ResourceOptions = PromiseResourceOptions | StreamingReso // @public export interface ResourceRef extends WritableResource { destroy(): void; + // (undocumented) + hasValue(): this is ResourceRef>; } // @public diff --git a/packages/core/src/resource/api.ts b/packages/core/src/resource/api.ts index 6464dc1218ff..ddb1f95acf20 100644 --- a/packages/core/src/resource/api.ts +++ b/packages/core/src/resource/api.ts @@ -133,6 +133,8 @@ export interface WritableResource extends Resource { * @experimental */ export interface ResourceRef extends WritableResource { + hasValue(): this is ResourceRef>; + /** * Manually destroy the resource, which cancels pending requests and returns it to `idle` state. */ diff --git a/packages/core/src/resource/resource.ts b/packages/core/src/resource/resource.ts index 4649d6f21e26..7392e511bf19 100644 --- a/packages/core/src/resource/resource.ts +++ b/packages/core/src/resource/resource.ts @@ -103,7 +103,7 @@ abstract class BaseWritableResource implements WritableResource { () => this.status() === ResourceStatus.Loading || this.status() === ResourceStatus.Reloading, ); - hasValue(): this is WritableResource> { + hasValue(): this is ResourceRef> { return this.value() !== undefined; } From c202682957098731635d6ab9a80ccae999e20189 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Thu, 23 Jan 2025 20:01:18 +0100 Subject: [PATCH 0196/1220] refactor(core): reuse host directive resolution logic (#59685) Reuse host directive resolution logic in ComponentRef PR Close #59685 --- packages/core/src/render3/component_ref.ts | 40 ++---- .../core/src/render3/instructions/shared.ts | 122 +++++++++--------- .../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 + 13 files changed, 81 insertions(+), 92 deletions(-) diff --git a/packages/core/src/render3/component_ref.ts b/packages/core/src/render3/component_ref.ts index af205b40d586..60c61db94046 100644 --- a/packages/core/src/render3/component_ref.ts +++ b/packages/core/src/render3/component_ref.ts @@ -30,7 +30,7 @@ import {RendererFactory2} from '../render/api'; import {Sanitizer} from '../sanitization/sanitizer'; import {assertDefined} from '../util/assert'; -import {assertComponentType, assertNoDuplicateDirectives} from './assert'; +import {assertComponentType} from './assert'; import {attachPatchData} from './context_discovery'; import {getComponentDef} from './def_getters'; import {depsTracker} from './deps_tracker/deps_tracker'; @@ -45,10 +45,10 @@ import { createTView, initializeDirectives, locateHostElement, - markAsComponentHost, + resolveHostDirectives, setInputsForProperty, } from './instructions/shared'; -import {ComponentDef, DirectiveDef, HostDirectiveDefs} from './interfaces/definition'; +import {ComponentDef, DirectiveDef} from './interfaces/definition'; import {InputFlags} from './interfaces/input_flags'; import { NodeInputBindings, @@ -333,24 +333,6 @@ export class ComponentFactory extends AbstractComponentFactory { let componentView: LView | null = null; try { - const rootComponentDef = this.componentDef; - let rootDirectives: DirectiveDef[]; - let hostDirectiveDefs: HostDirectiveDefs | null = null; - - if (rootComponentDef.findHostDirectiveDefs) { - rootDirectives = []; - hostDirectiveDefs = new Map(); - rootComponentDef.findHostDirectiveDefs( - rootComponentDef, - rootDirectives, - hostDirectiveDefs, - ); - rootDirectives.push(rootComponentDef); - ngDevMode && assertNoDuplicateDirectives(rootDirectives); - } else { - rootDirectives = [rootComponentDef]; - } - // 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'] @@ -366,18 +348,12 @@ export class ComponentFactory extends AbstractComponentFactory { tAttributes, ); - // TODO(pk): partial code duplication with resolveDirectives and other existing logic - markAsComponentHost(rootTView, hostTNode, rootDirectives.length - 1); - initializeDirectives( - rootTView, - rootLView, - hostTNode, - rootDirectives, - null, - hostDirectiveDefs, - ); + const [directiveDefs, hostDirectiveDefs] = resolveHostDirectives(rootTView, hostTNode, [ + this.componentDef, + ]); + initializeDirectives(rootTView, rootLView, hostTNode, directiveDefs, {}, hostDirectiveDefs); - for (const def of rootDirectives) { + for (const def of directiveDefs) { hostTNode.mergedAttrs = mergeHostAttrs(hostTNode.mergedAttrs, def.hostAttrs); } hostTNode.mergedAttrs = mergeHostAttrs(hostTNode.mergedAttrs, tAttributes); diff --git a/packages/core/src/render3/instructions/shared.ts b/packages/core/src/render3/instructions/shared.ts index 39c948921648..10f7b647bd21 100644 --- a/packages/core/src/render3/instructions/shared.ts +++ b/packages/core/src/render3/instructions/shared.ts @@ -73,17 +73,13 @@ import { TDirectiveHostNode, TElementContainerNode, TElementNode, - TIcuContainerNode, - TLetDeclarationNode, TNode, TNodeFlags, TNodeType, - TProjectionNode, } from '../interfaces/node'; import {Renderer} from '../interfaces/renderer'; -import {RComment, RElement, RNode, RText} from '../interfaces/renderer_dom'; +import {RComment, RElement} from '../interfaces/renderer_dom'; import {SanitizerFn} from '../interfaces/sanitization'; -import {TStylingRange} from '../interfaces/styling'; import {isComponentDef, isComponentHost} from '../interfaces/type_checks'; import { CHILD_HEAD, @@ -112,22 +108,16 @@ import { TView, TViewType, } from '../interfaces/view'; -import {assertPureTNodeType, assertTNodeType} from '../node_assert'; +import {assertTNodeType} from '../node_assert'; import {isInlineTemplate, isNodeMatchingSelectorList} from '../node_selector_matcher'; import {profiler} from '../profiler'; import {ProfilerEvent} from '../profiler_types'; import { getBindingsEnabled, getCurrentDirectiveIndex, - getCurrentParentTNode, - getCurrentTNodePlaceholderOk, getSelectedIndex, - isCurrentTNodeParent, isInCheckNoChangesMode, - isInI18nBlock, - isInSkipHydrationBlock, setCurrentDirectiveIndex, - setCurrentTNode, setSelectedIndex, } from '../state'; import {NO_CHANGE} from '../tokens'; @@ -141,11 +131,11 @@ import { unwrapLView, } from '../util/view_utils'; +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'; -import {clearElementContents, updateTextNode} from '../dom_node_manipulation'; export function createLView( parentLView: LView | null, @@ -851,21 +841,19 @@ export function resolveDirectives( if (getBindingsEnabled()) { const exportsMap: {[key: string]: number} | null = localRefs === null ? null : {'': -1}; - const matchResult = findDirectiveDefMatches(tView, tNode); - let directiveDefs: DirectiveDef[] | null; - let hostDirectiveDefs: HostDirectiveDefs | null; + const matchedDirectiveDefs = findDirectiveDefMatches(tView, tNode); - if (matchResult === null) { - directiveDefs = hostDirectiveDefs = null; - } else { - [directiveDefs, hostDirectiveDefs] = matchResult; - } - - if (directiveDefs !== null) { + 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); } @@ -1080,18 +1068,17 @@ export function invokeHostBindingsInCreationMode(def: DirectiveDef, directi function findDirectiveDefMatches( tView: TView, tNode: TElementNode | TContainerNode | TElementContainerNode, -): [matches: DirectiveDef[], hostDirectiveDefs: HostDirectiveDefs | null] | null { +): DirectiveDef[] | null { ngDevMode && assertFirstCreatePass(tView); ngDevMode && assertTNodeType(tNode, TNodeType.AnyRNode | TNodeType.AnyContainer); const registry = tView.directiveRegistry; let matches: DirectiveDef[] | null = null; - let hostDirectiveDefs: HostDirectiveDefs | null = null; if (registry) { for (let i = 0; i < registry.length; i++) { const def = registry[i] as ComponentDef | DirectiveDef; if (isNodeMatchingSelectorList(tNode, def.selectors!, /* isProjectionMode */ false)) { - matches || (matches = []); + matches ??= []; if (isComponentDef(def)) { if (ngDevMode) { @@ -1102,49 +1089,64 @@ function findDirectiveDefMatches( `Please use a different tag to activate the ${stringify(def.type)} component.`, ); - if (isComponentHost(tNode)) { + if (matches.length && isComponentDef(matches[0])) { throwMultipleComponentError(tNode, matches.find(isComponentDef)!.type, def.type); } } - // 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. - if (def.findHostDirectiveDefs !== null) { - const hostDirectiveMatches: DirectiveDef[] = []; - hostDirectiveDefs = hostDirectiveDefs || new Map(); - def.findHostDirectiveDefs(def, hostDirectiveMatches, hostDirectiveDefs); - // Add all host directives declared on this component, followed by the component itself. - // Host directives should execute first so the host has a chance to override changes - // to the DOM made by them. - matches.unshift(...hostDirectiveMatches, def); - // Component is offset starting from the beginning of the host directives array. - const componentOffset = hostDirectiveMatches.length; - markAsComponentHost(tView, tNode, componentOffset); - } else { - // No host directives on this component, just add the - // component def to the beginning of the matches. - matches.unshift(def); - markAsComponentHost(tView, tNode, 0); - } + matches.unshift(def); } else { - // Append any host directives to the matches first. - hostDirectiveDefs = hostDirectiveDefs || new Map(); - def.findHostDirectiveDefs?.(def, matches, hostDirectiveDefs); matches.push(def); } } } } - ngDevMode && matches !== null && assertNoDuplicateDirectives(matches); - return matches === null ? null : [matches, hostDirectiveDefs]; + + 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]; } /** @@ -1207,7 +1209,7 @@ function saveNameToExportMap( * the directive count to 0, and adding the isComponent flag. * @param index the initial index */ -export function initTNodeFlags(tNode: TNode, index: number, numberOfDirectives: number) { +function initTNodeFlags(tNode: TNode, index: number, numberOfDirectives: number) { ngDevMode && assertNotEqual( numberOfDirectives, 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 aea3548ba26e..df48d2dff857 100644 --- a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json @@ -442,6 +442,7 @@ "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 8825c5ae7289..62af134a8e0b 100644 --- a/packages/core/test/bundling/animations/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations/bundle.golden_symbols.json @@ -468,6 +468,7 @@ "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 c165a818997d..c139251f2b08 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -378,6 +378,7 @@ "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 ccd83c6b2b72..a66108aa3d83 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -836,6 +836,7 @@ "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 2e13edb57643..219fd3384361 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -568,6 +568,7 @@ "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 3eab75f0c49a..02d8aacd38d6 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 @@ -559,6 +559,7 @@ "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 92fa0dd0dfd7..a2987b942c99 100644 --- a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json @@ -268,6 +268,7 @@ "makeRecord", "map", "markAncestorsForTraversal", + "markAsComponentHost", "markViewDirty", "markViewForRefresh", "maybeWrapInNotSelector", diff --git a/packages/core/test/bundling/hydration/bundle.golden_symbols.json b/packages/core/test/bundling/hydration/bundle.golden_symbols.json index f83bcb5c9077..190a8726d8c0 100644 --- a/packages/core/test/bundling/hydration/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hydration/bundle.golden_symbols.json @@ -357,6 +357,7 @@ "makeEnvironmentProviders", "makeRecord", "markAncestorsForTraversal", + "markAsComponentHost", "markViewDirty", "markViewForRefresh", "markedFeatures", diff --git a/packages/core/test/bundling/router/bundle.golden_symbols.json b/packages/core/test/bundling/router/bundle.golden_symbols.json index 8582cf62ec2b..3ab9944b6c49 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -648,6 +648,7 @@ "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 a9e5cc7d03a7..8f50f8369032 100644 --- a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json +++ b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json @@ -299,6 +299,7 @@ "makeRecord", "map", "markAncestorsForTraversal", + "markAsComponentHost", "markViewDirty", "markViewForRefresh", "markedFeatures", diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index b8c8c6f4507d..c3a1ab10f27a 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -451,6 +451,7 @@ "resetPreOrderHookFlags", "resolveDirectives", "resolveForwardRef", + "resolveHostDirectives", "runEffectsInView", "runInInjectionContext", "saveNameToExportMap", From 3554dbccd19d3b9e7e24078cbfad7e128b6c4c9f Mon Sep 17 00:00:00 2001 From: hawkgs Date: Tue, 28 Jan 2025 10:58:14 +0200 Subject: [PATCH 0197/1220] build: revert back to @bazel/ibazel v0.16 (#59748) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit v0.25 is causing issues with adev and devtools – file changes do not trigger a rebuild. PR Close #59748 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 3e59f7db7bb1..217d6905b29e 100644 --- a/package.json +++ b/package.json @@ -165,7 +165,7 @@ "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#744e5a754635c8e8e008f957aba8f9dd8011cc8f", "@bazel/bazelisk": "^1.7.5", "@bazel/buildifier": "^8.0.0", - "@bazel/ibazel": "^0.25.0", + "@bazel/ibazel": "^0.16.0", "@codemirror/autocomplete": "^6.11.1", "@codemirror/commands": "^6.3.2", "@codemirror/lang-angular": "^0.1.2", diff --git a/yarn.lock b/yarn.lock index 3f113faa4af6..bdf3da6776eb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1346,10 +1346,10 @@ resolved "https://registry.yarnpkg.com/@bazel/esbuild/-/esbuild-5.8.1.tgz#74668d33bfb29652cbe8e2852aa8dca5e0839e73" integrity sha512-8k4LL8P3ivCnFeBOcjiFxL8U+M5VtEGuOyIqm2hfEiP8xDWsZLS7YQ7KhshKJy7Elh2dlK9oGgMtl0D/x9kxxg== -"@bazel/ibazel@^0.25.0": - version "0.25.0" - resolved "https://registry.yarnpkg.com/@bazel/ibazel/-/ibazel-0.25.0.tgz#5431a4622ebc5c5bc48ea8b979f82f745a210d25" - integrity sha512-dtosfsuZCSaqlUe5EyxNdaN7Gow0Y+ZJixdlciytcSieUcB/1lXPFTx6OihxhjgtTHkeFovlQ/QbvArRPnk+nQ== +"@bazel/ibazel@^0.16.0": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@bazel/ibazel/-/ibazel-0.16.2.tgz#05dd7f06659759fda30f87b15534f1e42f1201bb" + integrity sha512-KgqAWMH0emL6f3xH6nqyTryoBMqlJ627LBIe9PT1PRRQPz2FtHib3FIHJPukp1slzF3hJYZvdiVwgPnHbaSOOA== "@bazel/jasmine@5.8.1": version "5.8.1" From a8139f77eabbe7dcc05cd8922ebeaa44be1eda02 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Tue, 28 Jan 2025 11:10:37 +0000 Subject: [PATCH 0198/1220] ci: configure merge tool to enforce mandatory PR statuses (#59749) The merge tool is currently hard-coded to only check `lint` as a required status. This was added because at some point the old GitHub robot was replaced with a so-called `unified-statuses` check GitHub action; but that one never worked/impacted productivity of the team. I've added support to the merge tool to require specific jobs/checks to run, before allowing merge (can be forcibly ignored). We are using this ability now to enforce a few "common" required jobs, as a safety measure when GitHub didn't trigger CI runs (e.g. for new contributors). This recently became a more prominent issue as the GitHub org enforces that CI doesn't run for e.g. first time contributors. PR Close #59749 --- .ng-dev/pull-request.mts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.ng-dev/pull-request.mts b/.ng-dev/pull-request.mts index 344c28e3185c..237ea813ec9b 100644 --- a/.ng-dev/pull-request.mts +++ b/.ng-dev/pull-request.mts @@ -22,4 +22,12 @@ export const pullRequest: PullRequestConfig = { assertEnforceTested: true, assertIsolatedSeparateFiles: true, }, + + requiredStatuses: [ + {type: 'check', name: 'test'}, + {type: 'check', name: 'lint'}, + {type: 'check', name: 'adev'}, + {type: 'check', name: 'zone-js'}, + {type: 'status', name: 'google-internal-tests'}, + ], }; From c9045aa7fdf21715b6b4c4f70866ccad44c5de07 Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Tue, 28 Jan 2025 08:12:53 +0000 Subject: [PATCH 0199/1220] build: remove `@angular/common` from Service Worker dependencies (#59747) The `@angular/service-worker` package no longer directly depends on `@angular/common`. PR Close #59747 --- packages/service-worker/BUILD.bazel | 1 - packages/service-worker/package.json | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/service-worker/BUILD.bazel b/packages/service-worker/BUILD.bazel index b198aa6a2981..05988e13243e 100644 --- a/packages/service-worker/BUILD.bazel +++ b/packages/service-worker/BUILD.bazel @@ -11,7 +11,6 @@ ng_module( ], ), deps = [ - "//packages/common", "//packages/core", "@npm//rxjs", ], diff --git a/packages/service-worker/package.json b/packages/service-worker/package.json index c16fafe98a49..8552785b8776 100644 --- a/packages/service-worker/package.json +++ b/packages/service-worker/package.json @@ -22,8 +22,7 @@ "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/core": "0.0.0-PLACEHOLDER", - "@angular/common": "0.0.0-PLACEHOLDER" + "@angular/core": "0.0.0-PLACEHOLDER" }, "repository": { "type": "git", From e2987a1d4ab09b1abf1f42597c40f2055db116e1 Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Tue, 28 Jan 2025 08:26:31 +0000 Subject: [PATCH 0200/1220] fix(service-worker): add missing `rxjs` peer dependency (#59747) The `@angular/service-worker` package now explicitly declares `rxjs` as a peer dependency. PR Close #59747 --- packages/service-worker/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/service-worker/package.json b/packages/service-worker/package.json index 8552785b8776..163eed6be28e 100644 --- a/packages/service-worker/package.json +++ b/packages/service-worker/package.json @@ -22,7 +22,8 @@ "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/core": "0.0.0-PLACEHOLDER" + "@angular/core": "0.0.0-PLACEHOLDER", + "rxjs": "^6.5.3 || ^7.4.0" }, "repository": { "type": "git", From 3da7e908bb1c67e01345e9fda449d36eec31bdf3 Mon Sep 17 00:00:00 2001 From: Tyler Luckewicz Date: Tue, 28 Jan 2025 09:32:18 -0500 Subject: [PATCH 0201/1220] docs(docs-infra): fix gammatical error in two way binding with plain properties section (#59755) PR Close #59755 --- adev/src/content/guide/components/inputs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adev/src/content/guide/components/inputs.md b/adev/src/content/guide/components/inputs.md index 2716253cd481..9c4425fce07b 100644 --- a/adev/src/content/guide/components/inputs.md +++ b/adev/src/content/guide/components/inputs.md @@ -232,7 +232,7 @@ export class MediaControls { } ``` -In the example above, the `CustomSlider` can write values into its `value` model input, which then propagates those values back to the `volume` property in `MediaControls`. This binding keeps that values of `value` and `volume` in sync. +In the example above, the `CustomSlider` can write values into its `value` model input, which then propagates those values back to the `volume` property in `MediaControls`. This binding keeps the values of `value` and `volume` in sync. ### Implicit `change` events From 3c3620e84a902a17b5af08e70eee63599d58b012 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Tue, 28 Jan 2025 12:12:32 +0000 Subject: [PATCH 0202/1220] build: update cross-repo angular dependencies (#59669) See associated pull request for more information. PR Close #59669 --- .github/actions/deploy-docs-site/main.js | 15033 +++++++++++++++- .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 +- adev/shared-docs/package.json | 12 +- package.json | 28 +- yarn.lock | 424 +- 17 files changed, 15367 insertions(+), 248 deletions(-) diff --git a/.github/actions/deploy-docs-site/main.js b/.github/actions/deploy-docs-site/main.js index e7c05e60eb54..0f2d2c054deb 100644 --- a/.github/actions/deploy-docs-site/main.js +++ b/.github/actions/deploy-docs-site/main.js @@ -351,44 +351,44 @@ var require_tunnel = __commonJS({ return agent; } function TunnelingAgent(options) { - var self = this; - self.options = options || {}; - self.proxyOptions = self.options.proxy || {}; - self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets; - self.requests = []; - self.sockets = []; - self.on("free", function onFree(socket, host, port, localAddress) { + var self2 = this; + self2.options = options || {}; + self2.proxyOptions = self2.options.proxy || {}; + self2.maxSockets = self2.options.maxSockets || http.Agent.defaultMaxSockets; + self2.requests = []; + self2.sockets = []; + self2.on("free", function onFree(socket, host, port, localAddress) { var options2 = toOptions(host, port, localAddress); - for (var i = 0, len = self.requests.length; i < len; ++i) { - var pending = self.requests[i]; + for (var i = 0, len = self2.requests.length; i < len; ++i) { + var pending = self2.requests[i]; if (pending.host === options2.host && pending.port === options2.port) { - self.requests.splice(i, 1); + self2.requests.splice(i, 1); pending.request.onSocket(socket); return; } } socket.destroy(); - self.removeSocket(socket); + self2.removeSocket(socket); }); } util.inherits(TunnelingAgent, events.EventEmitter); TunnelingAgent.prototype.addRequest = function addRequest(req, host, port, localAddress) { - var self = this; - var options = mergeOptions({ request: req }, self.options, toOptions(host, port, localAddress)); - if (self.sockets.length >= this.maxSockets) { - self.requests.push(options); + var self2 = this; + var options = mergeOptions({ request: req }, self2.options, toOptions(host, port, localAddress)); + if (self2.sockets.length >= this.maxSockets) { + self2.requests.push(options); return; } - self.createSocket(options, function(socket) { + self2.createSocket(options, function(socket) { socket.on("free", onFree); socket.on("close", onCloseOrRemove); socket.on("agentRemove", onCloseOrRemove); req.onSocket(socket); function onFree() { - self.emit("free", socket, options); + self2.emit("free", socket, options); } function onCloseOrRemove(err) { - self.removeSocket(socket); + self2.removeSocket(socket); socket.removeListener("free", onFree); socket.removeListener("close", onCloseOrRemove); socket.removeListener("agentRemove", onCloseOrRemove); @@ -396,10 +396,10 @@ var require_tunnel = __commonJS({ }); }; TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { - var self = this; + var self2 = this; var placeholder = {}; - self.sockets.push(placeholder); - var connectOptions = mergeOptions({}, self.proxyOptions, { + self2.sockets.push(placeholder); + var connectOptions = mergeOptions({}, self2.proxyOptions, { method: "CONNECT", path: options.host + ":" + options.port, agent: false, @@ -415,7 +415,7 @@ var require_tunnel = __commonJS({ connectOptions.headers["Proxy-Authorization"] = "Basic " + new Buffer(connectOptions.proxyAuth).toString("base64"); } debug("making CONNECT request"); - var connectReq = self.request(connectOptions); + var connectReq = self2.request(connectOptions); connectReq.useChunkedEncodingByDefault = false; connectReq.once("response", onResponse); connectReq.once("upgrade", onUpgrade); @@ -442,7 +442,7 @@ var require_tunnel = __commonJS({ var error = new Error("tunneling socket could not be established, statusCode=" + res.statusCode); error.code = "ECONNRESET"; options.request.emit("error", error); - self.removeSocket(placeholder); + self2.removeSocket(placeholder); return; } if (head.length > 0) { @@ -451,11 +451,11 @@ var require_tunnel = __commonJS({ var error = new Error("got illegal response body from proxy"); error.code = "ECONNRESET"; options.request.emit("error", error); - self.removeSocket(placeholder); + self2.removeSocket(placeholder); return; } debug("tunneling connection has established"); - self.sockets[self.sockets.indexOf(placeholder)] = socket; + self2.sockets[self2.sockets.indexOf(placeholder)] = socket; return cb(socket); } function onError(cause) { @@ -468,7 +468,7 @@ var require_tunnel = __commonJS({ var error = new Error("tunneling socket could not be established, cause=" + cause.message); error.code = "ECONNRESET"; options.request.emit("error", error); - self.removeSocket(placeholder); + self2.removeSocket(placeholder); } }; TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { @@ -485,15 +485,15 @@ var require_tunnel = __commonJS({ } }; function createSecureSocket(options, cb) { - var self = this; - TunnelingAgent.prototype.createSocket.call(self, options, function(socket) { + var self2 = this; + TunnelingAgent.prototype.createSocket.call(self2, options, function(socket) { var hostHeader = options.request.getHeader("host"); - var tlsOptions = mergeOptions({}, self.options, { + var tlsOptions = mergeOptions({}, self2.options, { socket, servername: hostHeader ? hostHeader.replace(/:.*$/, "") : options.host }); var secureSocket = tls.connect(0, tlsOptions); - self.sockets[self.sockets.indexOf(socket)] = secureSocket; + self2.sockets[self2.sockets.indexOf(socket)] = secureSocket; cb(secureSocket); }); } @@ -1875,13 +1875,13 @@ var require_io = __commonJS({ }); } exports.mkdirP = mkdirP; - function which(tool, check) { + function which2(tool, check) { return __awaiter(this, void 0, void 0, function* () { if (!tool) { throw new Error("parameter 'tool' is required"); } if (check) { - const result = yield which(tool, false); + const result = yield which2(tool, false); if (!result) { if (ioUtil.IS_WINDOWS) { throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.`); @@ -1898,7 +1898,7 @@ var require_io = __commonJS({ return ""; }); } - exports.which = which; + exports.which = which2; function findInPath(tool) { return __awaiter(this, void 0, void 0, function* () { if (!tool) { @@ -9547,6 +9547,14956 @@ var require_fast_content_type_parse = __commonJS({ } }); +// +var require_posix = __commonJS({ + ""(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.sync = exports.isexe = void 0; + var fs_1 = __require("fs"); + var promises_1 = __require("fs/promises"); + var isexe = async (path, options = {}) => { + const { ignoreErrors = false } = options; + try { + return checkStat(await (0, promises_1.stat)(path), options); + } catch (e) { + const er = e; + if (ignoreErrors || er.code === "EACCES") + return false; + throw er; + } + }; + exports.isexe = isexe; + var sync = (path, options = {}) => { + const { ignoreErrors = false } = options; + try { + return checkStat((0, fs_1.statSync)(path), options); + } catch (e) { + const er = e; + if (ignoreErrors || er.code === "EACCES") + return false; + throw er; + } + }; + exports.sync = sync; + var checkStat = (stat, options) => stat.isFile() && checkMode(stat, options); + var checkMode = (stat, options) => { + var _a, _b, _c; + const myUid = options.uid ?? ((_a = process.getuid) == null ? void 0 : _a.call(process)); + const myGroups = options.groups ?? ((_b = process.getgroups) == null ? void 0 : _b.call(process)) ?? []; + const myGid = options.gid ?? ((_c = process.getgid) == null ? void 0 : _c.call(process)) ?? myGroups[0]; + if (myUid === void 0 || myGid === void 0) { + throw new Error("cannot get uid or gid"); + } + const groups = /* @__PURE__ */ new Set([myGid, ...myGroups]); + const mod = stat.mode; + const uid = stat.uid; + const gid = stat.gid; + const u = parseInt("100", 8); + const g = parseInt("010", 8); + const o = parseInt("001", 8); + const ug = u | g; + return !!(mod & o || mod & g && groups.has(gid) || mod & u && uid === myUid || mod & ug && myUid === 0); + }; + } +}); + +// +var require_win32 = __commonJS({ + ""(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.sync = exports.isexe = void 0; + var fs_1 = __require("fs"); + var promises_1 = __require("fs/promises"); + var isexe = async (path, options = {}) => { + const { ignoreErrors = false } = options; + try { + return checkStat(await (0, promises_1.stat)(path), path, options); + } catch (e) { + const er = e; + if (ignoreErrors || er.code === "EACCES") + return false; + throw er; + } + }; + exports.isexe = isexe; + var sync = (path, options = {}) => { + const { ignoreErrors = false } = options; + try { + return checkStat((0, fs_1.statSync)(path), path, options); + } catch (e) { + const er = e; + if (ignoreErrors || er.code === "EACCES") + return false; + throw er; + } + }; + exports.sync = sync; + var checkPathExt = (path, options) => { + const { pathExt = process.env.PATHEXT || "" } = options; + const peSplit = pathExt.split(";"); + if (peSplit.indexOf("") !== -1) { + return true; + } + for (let i = 0; i < peSplit.length; i++) { + const p = peSplit[i].toLowerCase(); + const ext = path.substring(path.length - p.length).toLowerCase(); + if (p && ext === p) { + return true; + } + } + return false; + }; + var checkStat = (stat, path, options) => stat.isFile() && checkPathExt(path, options); + } +}); + +// +var require_options = __commonJS({ + ""(exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + } +}); + +// +var require_cjs = __commonJS({ + ""(exports) { + "use strict"; + var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === void 0) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports && exports.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __exportStar = exports && exports.__exportStar || function(m, exports2) { + for (var p in m) + if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports2, p)) + __createBinding(exports2, m, p); + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.sync = exports.isexe = exports.posix = exports.win32 = void 0; + var posix = __importStar(require_posix()); + exports.posix = posix; + var win32 = __importStar(require_win32()); + exports.win32 = win32; + __exportStar(require_options(), exports); + var platform = process.env._ISEXE_TEST_PLATFORM_ || process.platform; + var impl = platform === "win32" ? win32 : posix; + exports.isexe = impl.isexe; + exports.sync = impl.sync; + } +}); + +// +var require_lib2 = __commonJS({ + ""(exports, module) { + var { isexe, sync: isexeSync } = require_cjs(); + var { join: join3, delimiter, sep, posix } = __require("path"); + var isWindows = process.platform === "win32"; + var rSlash = new RegExp(`[${posix.sep}${sep === posix.sep ? "" : sep}]`.replace(/(\\)/g, "\\$1")); + var rRel = new RegExp(`^\\.${rSlash.source}`); + var getNotFoundError = (cmd) => Object.assign(new Error(`not found: ${cmd}`), { code: "ENOENT" }); + var getPathInfo = (cmd, { + path: optPath = process.env.PATH, + pathExt: optPathExt = process.env.PATHEXT, + delimiter: optDelimiter = delimiter + }) => { + const pathEnv = cmd.match(rSlash) ? [""] : [ + ...isWindows ? [process.cwd()] : [], + ...(optPath || "").split(optDelimiter) + ]; + if (isWindows) { + const pathExtExe = optPathExt || [".EXE", ".CMD", ".BAT", ".COM"].join(optDelimiter); + const pathExt = pathExtExe.split(optDelimiter).flatMap((item) => [item, item.toLowerCase()]); + if (cmd.includes(".") && pathExt[0] !== "") { + pathExt.unshift(""); + } + return { pathEnv, pathExt, pathExtExe }; + } + return { pathEnv, pathExt: [""] }; + }; + var getPathPart = (raw, cmd) => { + const pathPart = /^".*"$/.test(raw) ? raw.slice(1, -1) : raw; + const prefix = !pathPart && rRel.test(cmd) ? cmd.slice(0, 2) : ""; + return prefix + join3(pathPart, cmd); + }; + var which2 = async (cmd, opt = {}) => { + const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt); + const found = []; + for (const envPart of pathEnv) { + const p = getPathPart(envPart, cmd); + for (const ext of pathExt) { + const withExt = p + ext; + const is = await isexe(withExt, { pathExt: pathExtExe, ignoreErrors: true }); + if (is) { + if (!opt.all) { + return withExt; + } + found.push(withExt); + } + } + } + if (opt.all && found.length) { + return found; + } + if (opt.nothrow) { + return null; + } + throw getNotFoundError(cmd); + }; + var whichSync = (cmd, opt = {}) => { + const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt); + const found = []; + for (const pathEnvPart of pathEnv) { + const p = getPathPart(pathEnvPart, cmd); + for (const ext of pathExt) { + const withExt = p + ext; + const is = isexeSync(withExt, { pathExt: pathExtExe, ignoreErrors: true }); + if (is) { + if (!opt.all) { + return withExt; + } + found.push(withExt); + } + } + } + if (opt.all && found.length) { + return found; + } + if (opt.nothrow) { + return null; + } + throw getNotFoundError(cmd); + }; + module.exports = which2; + which2.sync = whichSync; + } +}); + +// +var require_lockfile = __commonJS({ + ""(exports, module) { + module.exports = function(modules) { + var installedModules = {}; + function __webpack_require__(moduleId) { + if (installedModules[moduleId]) { + return installedModules[moduleId].exports; + } + var module2 = installedModules[moduleId] = { + i: moduleId, + l: false, + exports: {} + }; + modules[moduleId].call(module2.exports, module2, module2.exports, __webpack_require__); + module2.l = true; + return module2.exports; + } + __webpack_require__.m = modules; + __webpack_require__.c = installedModules; + __webpack_require__.i = function(value) { + return value; + }; + __webpack_require__.d = function(exports2, name, getter) { + if (!__webpack_require__.o(exports2, name)) { + Object.defineProperty(exports2, name, { + configurable: false, + enumerable: true, + get: getter + }); + } + }; + __webpack_require__.n = function(module2) { + var getter = module2 && module2.__esModule ? function getDefault() { + return module2["default"]; + } : function getModuleExports() { + return module2; + }; + __webpack_require__.d(getter, "a", getter); + return getter; + }; + __webpack_require__.o = function(object, property) { + return Object.prototype.hasOwnProperty.call(object, property); + }; + __webpack_require__.p = ""; + return __webpack_require__(__webpack_require__.s = 14); + }([ + function(module2, exports2) { + module2.exports = __require("path"); + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + exports2.__esModule = true; + var _promise = __webpack_require__(173); + var _promise2 = _interopRequireDefault(_promise); + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { default: obj }; + } + exports2.default = function(fn) { + return function() { + var gen = fn.apply(this, arguments); + return new _promise2.default(function(resolve, reject) { + function step(key, arg) { + try { + var info = gen[key](arg); + var value = info.value; + } catch (error) { + reject(error); + return; + } + if (info.done) { + resolve(value); + } else { + return _promise2.default.resolve(value).then(function(value2) { + step("next", value2); + }, function(err) { + step("throw", err); + }); + } + } + return step("next"); + }); + }; + }; + }, + function(module2, exports2) { + module2.exports = __require("util"); + }, + function(module2, exports2) { + module2.exports = __require("fs"); + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + class MessageError extends Error { + constructor(msg, code) { + super(msg); + this.code = code; + } + } + exports2.MessageError = MessageError; + class ProcessSpawnError extends MessageError { + constructor(msg, code, process4) { + super(msg, code); + this.process = process4; + } + } + exports2.ProcessSpawnError = ProcessSpawnError; + class SecurityError extends MessageError { + } + exports2.SecurityError = SecurityError; + class ProcessTermError extends MessageError { + } + exports2.ProcessTermError = ProcessTermError; + class ResponseError extends Error { + constructor(msg, responseCode) { + super(msg); + this.responseCode = responseCode; + } + } + exports2.ResponseError = ResponseError; + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + exports2.getFirstSuitableFolder = exports2.readFirstAvailableStream = exports2.makeTempDir = exports2.hardlinksWork = exports2.writeFilePreservingEol = exports2.getFileSizeOnDisk = exports2.walk = exports2.symlink = exports2.find = exports2.readJsonAndFile = exports2.readJson = exports2.readFileAny = exports2.hardlinkBulk = exports2.copyBulk = exports2.unlink = exports2.glob = exports2.link = exports2.chmod = exports2.lstat = exports2.exists = exports2.mkdirp = exports2.stat = exports2.access = exports2.rename = exports2.readdir = exports2.realpath = exports2.readlink = exports2.writeFile = exports2.open = exports2.readFileBuffer = exports2.lockQueue = exports2.constants = void 0; + var _asyncToGenerator2; + function _load_asyncToGenerator() { + return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(1)); + } + let buildActionsForCopy = (() => { + var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (queue, events, possibleExtraneous, reporter) { + let build = (() => { + var _ref5 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (data) { + const src = data.src, dest = data.dest, type = data.type; + const onFresh = data.onFresh || noop2; + const onDone = data.onDone || noop2; + if (files.has(dest.toLowerCase())) { + reporter.verbose(`The case-insensitive file ${dest} shouldn't be copied twice in one bulk copy`); + } else { + files.add(dest.toLowerCase()); + } + if (type === "symlink") { + yield mkdirp((_path || _load_path()).default.dirname(dest)); + onFresh(); + actions.symlink.push({ + dest, + linkname: src + }); + onDone(); + return; + } + if (events.ignoreBasenames.indexOf((_path || _load_path()).default.basename(src)) >= 0) { + return; + } + const srcStat = yield lstat(src); + let srcFiles; + if (srcStat.isDirectory()) { + srcFiles = yield readdir(src); + } + let destStat; + try { + destStat = yield lstat(dest); + } catch (e) { + if (e.code !== "ENOENT") { + throw e; + } + } + if (destStat) { + const bothSymlinks = srcStat.isSymbolicLink() && destStat.isSymbolicLink(); + const bothFolders = srcStat.isDirectory() && destStat.isDirectory(); + const bothFiles = srcStat.isFile() && destStat.isFile(); + if (bothFiles && artifactFiles.has(dest)) { + onDone(); + reporter.verbose(reporter.lang("verboseFileSkipArtifact", src)); + return; + } + if (bothFiles && srcStat.size === destStat.size && (0, (_fsNormalized || _load_fsNormalized()).fileDatesEqual)(srcStat.mtime, destStat.mtime)) { + onDone(); + reporter.verbose(reporter.lang("verboseFileSkip", src, dest, srcStat.size, +srcStat.mtime)); + return; + } + if (bothSymlinks) { + const srcReallink = yield readlink(src); + if (srcReallink === (yield readlink(dest))) { + onDone(); + reporter.verbose(reporter.lang("verboseFileSkipSymlink", src, dest, srcReallink)); + return; + } + } + if (bothFolders) { + const destFiles = yield readdir(dest); + invariant(srcFiles, "src files not initialised"); + for (var _iterator4 = destFiles, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator](); ; ) { + var _ref6; + if (_isArray4) { + if (_i4 >= _iterator4.length) + break; + _ref6 = _iterator4[_i4++]; + } else { + _i4 = _iterator4.next(); + if (_i4.done) + break; + _ref6 = _i4.value; + } + const file = _ref6; + if (srcFiles.indexOf(file) < 0) { + const loc = (_path || _load_path()).default.join(dest, file); + possibleExtraneous.add(loc); + if ((yield lstat(loc)).isDirectory()) { + for (var _iterator5 = yield readdir(loc), _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator](); ; ) { + var _ref7; + if (_isArray5) { + if (_i5 >= _iterator5.length) + break; + _ref7 = _iterator5[_i5++]; + } else { + _i5 = _iterator5.next(); + if (_i5.done) + break; + _ref7 = _i5.value; + } + const file2 = _ref7; + possibleExtraneous.add((_path || _load_path()).default.join(loc, file2)); + } + } + } + } + } + } + if (destStat && destStat.isSymbolicLink()) { + yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(dest); + destStat = null; + } + if (srcStat.isSymbolicLink()) { + onFresh(); + const linkname = yield readlink(src); + actions.symlink.push({ + dest, + linkname + }); + onDone(); + } else if (srcStat.isDirectory()) { + if (!destStat) { + reporter.verbose(reporter.lang("verboseFileFolder", dest)); + yield mkdirp(dest); + } + const destParts = dest.split((_path || _load_path()).default.sep); + while (destParts.length) { + files.add(destParts.join((_path || _load_path()).default.sep).toLowerCase()); + destParts.pop(); + } + invariant(srcFiles, "src files not initialised"); + let remaining = srcFiles.length; + if (!remaining) { + onDone(); + } + for (var _iterator6 = srcFiles, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator](); ; ) { + var _ref8; + if (_isArray6) { + if (_i6 >= _iterator6.length) + break; + _ref8 = _iterator6[_i6++]; + } else { + _i6 = _iterator6.next(); + if (_i6.done) + break; + _ref8 = _i6.value; + } + const file = _ref8; + queue.push({ + dest: (_path || _load_path()).default.join(dest, file), + onFresh, + onDone: function(_onDone) { + function onDone2() { + return _onDone.apply(this, arguments); + } + onDone2.toString = function() { + return _onDone.toString(); + }; + return onDone2; + }(function() { + if (--remaining === 0) { + onDone(); + } + }), + src: (_path || _load_path()).default.join(src, file) + }); + } + } else if (srcStat.isFile()) { + onFresh(); + actions.file.push({ + src, + dest, + atime: srcStat.atime, + mtime: srcStat.mtime, + mode: srcStat.mode + }); + onDone(); + } else { + throw new Error(`unsure how to copy this: ${src}`); + } + }); + return function build2(_x5) { + return _ref5.apply(this, arguments); + }; + })(); + const artifactFiles = new Set(events.artifactFiles || []); + const files = /* @__PURE__ */ new Set(); + for (var _iterator = queue, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator](); ; ) { + var _ref2; + if (_isArray) { + if (_i >= _iterator.length) + break; + _ref2 = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) + break; + _ref2 = _i.value; + } + const item = _ref2; + const onDone = item.onDone; + item.onDone = function() { + events.onProgress(item.dest); + if (onDone) { + onDone(); + } + }; + } + events.onStart(queue.length); + const actions = { + file: [], + symlink: [], + link: [] + }; + while (queue.length) { + const items = queue.splice(0, CONCURRENT_QUEUE_ITEMS); + yield Promise.all(items.map(build)); + } + for (var _iterator2 = artifactFiles, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator](); ; ) { + var _ref3; + if (_isArray2) { + if (_i2 >= _iterator2.length) + break; + _ref3 = _iterator2[_i2++]; + } else { + _i2 = _iterator2.next(); + if (_i2.done) + break; + _ref3 = _i2.value; + } + const file = _ref3; + if (possibleExtraneous.has(file)) { + reporter.verbose(reporter.lang("verboseFilePhantomExtraneous", file)); + possibleExtraneous.delete(file); + } + } + for (var _iterator3 = possibleExtraneous, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator](); ; ) { + var _ref4; + if (_isArray3) { + if (_i3 >= _iterator3.length) + break; + _ref4 = _iterator3[_i3++]; + } else { + _i3 = _iterator3.next(); + if (_i3.done) + break; + _ref4 = _i3.value; + } + const loc = _ref4; + if (files.has(loc.toLowerCase())) { + possibleExtraneous.delete(loc); + } + } + return actions; + }); + return function buildActionsForCopy2(_x, _x2, _x3, _x4) { + return _ref.apply(this, arguments); + }; + })(); + let buildActionsForHardlink = (() => { + var _ref9 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (queue, events, possibleExtraneous, reporter) { + let build = (() => { + var _ref13 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (data) { + const src = data.src, dest = data.dest; + const onFresh = data.onFresh || noop2; + const onDone = data.onDone || noop2; + if (files.has(dest.toLowerCase())) { + onDone(); + return; + } + files.add(dest.toLowerCase()); + if (events.ignoreBasenames.indexOf((_path || _load_path()).default.basename(src)) >= 0) { + return; + } + const srcStat = yield lstat(src); + let srcFiles; + if (srcStat.isDirectory()) { + srcFiles = yield readdir(src); + } + const destExists = yield exists(dest); + if (destExists) { + const destStat = yield lstat(dest); + const bothSymlinks = srcStat.isSymbolicLink() && destStat.isSymbolicLink(); + const bothFolders = srcStat.isDirectory() && destStat.isDirectory(); + const bothFiles = srcStat.isFile() && destStat.isFile(); + if (srcStat.mode !== destStat.mode) { + try { + yield access(dest, srcStat.mode); + } catch (err) { + reporter.verbose(err); + } + } + if (bothFiles && artifactFiles.has(dest)) { + onDone(); + reporter.verbose(reporter.lang("verboseFileSkipArtifact", src)); + return; + } + if (bothFiles && srcStat.ino !== null && srcStat.ino === destStat.ino) { + onDone(); + reporter.verbose(reporter.lang("verboseFileSkip", src, dest, srcStat.ino)); + return; + } + if (bothSymlinks) { + const srcReallink = yield readlink(src); + if (srcReallink === (yield readlink(dest))) { + onDone(); + reporter.verbose(reporter.lang("verboseFileSkipSymlink", src, dest, srcReallink)); + return; + } + } + if (bothFolders) { + const destFiles = yield readdir(dest); + invariant(srcFiles, "src files not initialised"); + for (var _iterator10 = destFiles, _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator](); ; ) { + var _ref14; + if (_isArray10) { + if (_i10 >= _iterator10.length) + break; + _ref14 = _iterator10[_i10++]; + } else { + _i10 = _iterator10.next(); + if (_i10.done) + break; + _ref14 = _i10.value; + } + const file = _ref14; + if (srcFiles.indexOf(file) < 0) { + const loc = (_path || _load_path()).default.join(dest, file); + possibleExtraneous.add(loc); + if ((yield lstat(loc)).isDirectory()) { + for (var _iterator11 = yield readdir(loc), _isArray11 = Array.isArray(_iterator11), _i11 = 0, _iterator11 = _isArray11 ? _iterator11 : _iterator11[Symbol.iterator](); ; ) { + var _ref15; + if (_isArray11) { + if (_i11 >= _iterator11.length) + break; + _ref15 = _iterator11[_i11++]; + } else { + _i11 = _iterator11.next(); + if (_i11.done) + break; + _ref15 = _i11.value; + } + const file2 = _ref15; + possibleExtraneous.add((_path || _load_path()).default.join(loc, file2)); + } + } + } + } + } + } + if (srcStat.isSymbolicLink()) { + onFresh(); + const linkname = yield readlink(src); + actions.symlink.push({ + dest, + linkname + }); + onDone(); + } else if (srcStat.isDirectory()) { + reporter.verbose(reporter.lang("verboseFileFolder", dest)); + yield mkdirp(dest); + const destParts = dest.split((_path || _load_path()).default.sep); + while (destParts.length) { + files.add(destParts.join((_path || _load_path()).default.sep).toLowerCase()); + destParts.pop(); + } + invariant(srcFiles, "src files not initialised"); + let remaining = srcFiles.length; + if (!remaining) { + onDone(); + } + for (var _iterator12 = srcFiles, _isArray12 = Array.isArray(_iterator12), _i12 = 0, _iterator12 = _isArray12 ? _iterator12 : _iterator12[Symbol.iterator](); ; ) { + var _ref16; + if (_isArray12) { + if (_i12 >= _iterator12.length) + break; + _ref16 = _iterator12[_i12++]; + } else { + _i12 = _iterator12.next(); + if (_i12.done) + break; + _ref16 = _i12.value; + } + const file = _ref16; + queue.push({ + onFresh, + src: (_path || _load_path()).default.join(src, file), + dest: (_path || _load_path()).default.join(dest, file), + onDone: function(_onDone2) { + function onDone2() { + return _onDone2.apply(this, arguments); + } + onDone2.toString = function() { + return _onDone2.toString(); + }; + return onDone2; + }(function() { + if (--remaining === 0) { + onDone(); + } + }) + }); + } + } else if (srcStat.isFile()) { + onFresh(); + actions.link.push({ + src, + dest, + removeDest: destExists + }); + onDone(); + } else { + throw new Error(`unsure how to copy this: ${src}`); + } + }); + return function build2(_x10) { + return _ref13.apply(this, arguments); + }; + })(); + const artifactFiles = new Set(events.artifactFiles || []); + const files = /* @__PURE__ */ new Set(); + for (var _iterator7 = queue, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator](); ; ) { + var _ref10; + if (_isArray7) { + if (_i7 >= _iterator7.length) + break; + _ref10 = _iterator7[_i7++]; + } else { + _i7 = _iterator7.next(); + if (_i7.done) + break; + _ref10 = _i7.value; + } + const item = _ref10; + const onDone = item.onDone || noop2; + item.onDone = function() { + events.onProgress(item.dest); + onDone(); + }; + } + events.onStart(queue.length); + const actions = { + file: [], + symlink: [], + link: [] + }; + while (queue.length) { + const items = queue.splice(0, CONCURRENT_QUEUE_ITEMS); + yield Promise.all(items.map(build)); + } + for (var _iterator8 = artifactFiles, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator](); ; ) { + var _ref11; + if (_isArray8) { + if (_i8 >= _iterator8.length) + break; + _ref11 = _iterator8[_i8++]; + } else { + _i8 = _iterator8.next(); + if (_i8.done) + break; + _ref11 = _i8.value; + } + const file = _ref11; + if (possibleExtraneous.has(file)) { + reporter.verbose(reporter.lang("verboseFilePhantomExtraneous", file)); + possibleExtraneous.delete(file); + } + } + for (var _iterator9 = possibleExtraneous, _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator](); ; ) { + var _ref12; + if (_isArray9) { + if (_i9 >= _iterator9.length) + break; + _ref12 = _iterator9[_i9++]; + } else { + _i9 = _iterator9.next(); + if (_i9.done) + break; + _ref12 = _i9.value; + } + const loc = _ref12; + if (files.has(loc.toLowerCase())) { + possibleExtraneous.delete(loc); + } + } + return actions; + }); + return function buildActionsForHardlink2(_x6, _x7, _x8, _x9) { + return _ref9.apply(this, arguments); + }; + })(); + let copyBulk = exports2.copyBulk = (() => { + var _ref17 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (queue, reporter, _events) { + const events = { + onStart: _events && _events.onStart || noop2, + onProgress: _events && _events.onProgress || noop2, + possibleExtraneous: _events ? _events.possibleExtraneous : /* @__PURE__ */ new Set(), + ignoreBasenames: _events && _events.ignoreBasenames || [], + artifactFiles: _events && _events.artifactFiles || [] + }; + const actions = yield buildActionsForCopy(queue, events, events.possibleExtraneous, reporter); + events.onStart(actions.file.length + actions.symlink.length + actions.link.length); + const fileActions = actions.file; + const currentlyWriting = /* @__PURE__ */ new Map(); + yield (_promise || _load_promise()).queue(fileActions, (() => { + var _ref18 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (data) { + let writePromise; + while (writePromise = currentlyWriting.get(data.dest)) { + yield writePromise; + } + reporter.verbose(reporter.lang("verboseFileCopy", data.src, data.dest)); + const copier = (0, (_fsNormalized || _load_fsNormalized()).copyFile)(data, function() { + return currentlyWriting.delete(data.dest); + }); + currentlyWriting.set(data.dest, copier); + events.onProgress(data.dest); + return copier; + }); + return function(_x14) { + return _ref18.apply(this, arguments); + }; + })(), CONCURRENT_QUEUE_ITEMS); + const symlinkActions = actions.symlink; + yield (_promise || _load_promise()).queue(symlinkActions, function(data) { + const linkname = (_path || _load_path()).default.resolve((_path || _load_path()).default.dirname(data.dest), data.linkname); + reporter.verbose(reporter.lang("verboseFileSymlink", data.dest, linkname)); + return symlink(linkname, data.dest); + }); + }); + return function copyBulk2(_x11, _x12, _x13) { + return _ref17.apply(this, arguments); + }; + })(); + let hardlinkBulk = exports2.hardlinkBulk = (() => { + var _ref19 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (queue, reporter, _events) { + const events = { + onStart: _events && _events.onStart || noop2, + onProgress: _events && _events.onProgress || noop2, + possibleExtraneous: _events ? _events.possibleExtraneous : /* @__PURE__ */ new Set(), + artifactFiles: _events && _events.artifactFiles || [], + ignoreBasenames: [] + }; + const actions = yield buildActionsForHardlink(queue, events, events.possibleExtraneous, reporter); + events.onStart(actions.file.length + actions.symlink.length + actions.link.length); + const fileActions = actions.link; + yield (_promise || _load_promise()).queue(fileActions, (() => { + var _ref20 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (data) { + reporter.verbose(reporter.lang("verboseFileLink", data.src, data.dest)); + if (data.removeDest) { + yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(data.dest); + } + yield link(data.src, data.dest); + }); + return function(_x18) { + return _ref20.apply(this, arguments); + }; + })(), CONCURRENT_QUEUE_ITEMS); + const symlinkActions = actions.symlink; + yield (_promise || _load_promise()).queue(symlinkActions, function(data) { + const linkname = (_path || _load_path()).default.resolve((_path || _load_path()).default.dirname(data.dest), data.linkname); + reporter.verbose(reporter.lang("verboseFileSymlink", data.dest, linkname)); + return symlink(linkname, data.dest); + }); + }); + return function hardlinkBulk2(_x15, _x16, _x17) { + return _ref19.apply(this, arguments); + }; + })(); + let readFileAny = exports2.readFileAny = (() => { + var _ref21 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (files) { + for (var _iterator13 = files, _isArray13 = Array.isArray(_iterator13), _i13 = 0, _iterator13 = _isArray13 ? _iterator13 : _iterator13[Symbol.iterator](); ; ) { + var _ref22; + if (_isArray13) { + if (_i13 >= _iterator13.length) + break; + _ref22 = _iterator13[_i13++]; + } else { + _i13 = _iterator13.next(); + if (_i13.done) + break; + _ref22 = _i13.value; + } + const file = _ref22; + if (yield exists(file)) { + return readFile2(file); + } + } + return null; + }); + return function readFileAny2(_x19) { + return _ref21.apply(this, arguments); + }; + })(); + let readJson = exports2.readJson = (() => { + var _ref23 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (loc) { + return (yield readJsonAndFile(loc)).object; + }); + return function readJson2(_x20) { + return _ref23.apply(this, arguments); + }; + })(); + let readJsonAndFile = exports2.readJsonAndFile = (() => { + var _ref24 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (loc) { + const file = yield readFile2(loc); + try { + return { + object: (0, (_map || _load_map()).default)(JSON.parse(stripBOM(file))), + content: file + }; + } catch (err) { + err.message = `${loc}: ${err.message}`; + throw err; + } + }); + return function readJsonAndFile2(_x21) { + return _ref24.apply(this, arguments); + }; + })(); + let find = exports2.find = (() => { + var _ref25 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (filename, dir) { + const parts = dir.split((_path || _load_path()).default.sep); + while (parts.length) { + const loc = parts.concat(filename).join((_path || _load_path()).default.sep); + if (yield exists(loc)) { + return loc; + } else { + parts.pop(); + } + } + return false; + }); + return function find2(_x22, _x23) { + return _ref25.apply(this, arguments); + }; + })(); + let symlink = exports2.symlink = (() => { + var _ref26 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (src, dest) { + try { + const stats = yield lstat(dest); + if (stats.isSymbolicLink()) { + const resolved = yield realpath(dest); + if (resolved === src) { + return; + } + } + } catch (err) { + if (err.code !== "ENOENT") { + throw err; + } + } + yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(dest); + if (process.platform === "win32") { + yield fsSymlink(src, dest, "junction"); + } else { + let relative; + try { + relative = (_path || _load_path()).default.relative((_fs || _load_fs()).default.realpathSync((_path || _load_path()).default.dirname(dest)), (_fs || _load_fs()).default.realpathSync(src)); + } catch (err) { + if (err.code !== "ENOENT") { + throw err; + } + relative = (_path || _load_path()).default.relative((_path || _load_path()).default.dirname(dest), src); + } + yield fsSymlink(relative || ".", dest); + } + }); + return function symlink2(_x24, _x25) { + return _ref26.apply(this, arguments); + }; + })(); + let walk = exports2.walk = (() => { + var _ref27 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (dir, relativeDir, ignoreBasenames = /* @__PURE__ */ new Set()) { + let files = []; + let filenames = yield readdir(dir); + if (ignoreBasenames.size) { + filenames = filenames.filter(function(name) { + return !ignoreBasenames.has(name); + }); + } + for (var _iterator14 = filenames, _isArray14 = Array.isArray(_iterator14), _i14 = 0, _iterator14 = _isArray14 ? _iterator14 : _iterator14[Symbol.iterator](); ; ) { + var _ref28; + if (_isArray14) { + if (_i14 >= _iterator14.length) + break; + _ref28 = _iterator14[_i14++]; + } else { + _i14 = _iterator14.next(); + if (_i14.done) + break; + _ref28 = _i14.value; + } + const name = _ref28; + const relative = relativeDir ? (_path || _load_path()).default.join(relativeDir, name) : name; + const loc = (_path || _load_path()).default.join(dir, name); + const stat2 = yield lstat(loc); + files.push({ + relative, + basename: name, + absolute: loc, + mtime: +stat2.mtime + }); + if (stat2.isDirectory()) { + files = files.concat(yield walk(loc, relative, ignoreBasenames)); + } + } + return files; + }); + return function walk2(_x26, _x27) { + return _ref27.apply(this, arguments); + }; + })(); + let getFileSizeOnDisk = exports2.getFileSizeOnDisk = (() => { + var _ref29 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (loc) { + const stat2 = yield lstat(loc); + const size = stat2.size, blockSize = stat2.blksize; + return Math.ceil(size / blockSize) * blockSize; + }); + return function getFileSizeOnDisk2(_x28) { + return _ref29.apply(this, arguments); + }; + })(); + let getEolFromFile = (() => { + var _ref30 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (path) { + if (!(yield exists(path))) { + return void 0; + } + const buffer = yield readFileBuffer(path); + for (let i = 0; i < buffer.length; ++i) { + if (buffer[i] === cr) { + return "\r\n"; + } + if (buffer[i] === lf) { + return "\n"; + } + } + return void 0; + }); + return function getEolFromFile2(_x29) { + return _ref30.apply(this, arguments); + }; + })(); + let writeFilePreservingEol = exports2.writeFilePreservingEol = (() => { + var _ref31 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (path, data) { + const eol = (yield getEolFromFile(path)) || (_os || _load_os()).default.EOL; + if (eol !== "\n") { + data = data.replace(/\n/g, eol); + } + yield writeFile2(path, data); + }); + return function writeFilePreservingEol2(_x30, _x31) { + return _ref31.apply(this, arguments); + }; + })(); + let hardlinksWork = exports2.hardlinksWork = (() => { + var _ref32 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (dir) { + const filename = "test-file" + Math.random(); + const file = (_path || _load_path()).default.join(dir, filename); + const fileLink = (_path || _load_path()).default.join(dir, filename + "-link"); + try { + yield writeFile2(file, "test"); + yield link(file, fileLink); + } catch (err) { + return false; + } finally { + yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(file); + yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(fileLink); + } + return true; + }); + return function hardlinksWork2(_x32) { + return _ref32.apply(this, arguments); + }; + })(); + let makeTempDir = exports2.makeTempDir = (() => { + var _ref33 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (prefix) { + const dir = (_path || _load_path()).default.join((_os || _load_os()).default.tmpdir(), `yarn-${prefix || ""}-${Date.now()}-${Math.random()}`); + yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(dir); + yield mkdirp(dir); + return dir; + }); + return function makeTempDir2(_x33) { + return _ref33.apply(this, arguments); + }; + })(); + let readFirstAvailableStream = exports2.readFirstAvailableStream = (() => { + var _ref34 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (paths) { + for (var _iterator15 = paths, _isArray15 = Array.isArray(_iterator15), _i15 = 0, _iterator15 = _isArray15 ? _iterator15 : _iterator15[Symbol.iterator](); ; ) { + var _ref35; + if (_isArray15) { + if (_i15 >= _iterator15.length) + break; + _ref35 = _iterator15[_i15++]; + } else { + _i15 = _iterator15.next(); + if (_i15.done) + break; + _ref35 = _i15.value; + } + const path = _ref35; + try { + const fd = yield open(path, "r"); + return (_fs || _load_fs()).default.createReadStream(path, { fd }); + } catch (err) { + } + } + return null; + }); + return function readFirstAvailableStream2(_x34) { + return _ref34.apply(this, arguments); + }; + })(); + let getFirstSuitableFolder = exports2.getFirstSuitableFolder = (() => { + var _ref36 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (paths, mode = constants.W_OK | constants.X_OK) { + const result = { + skipped: [], + folder: null + }; + for (var _iterator16 = paths, _isArray16 = Array.isArray(_iterator16), _i16 = 0, _iterator16 = _isArray16 ? _iterator16 : _iterator16[Symbol.iterator](); ; ) { + var _ref37; + if (_isArray16) { + if (_i16 >= _iterator16.length) + break; + _ref37 = _iterator16[_i16++]; + } else { + _i16 = _iterator16.next(); + if (_i16.done) + break; + _ref37 = _i16.value; + } + const folder = _ref37; + try { + yield mkdirp(folder); + yield access(folder, mode); + result.folder = folder; + return result; + } catch (error) { + result.skipped.push({ + error, + folder + }); + } + } + return result; + }); + return function getFirstSuitableFolder2(_x35) { + return _ref36.apply(this, arguments); + }; + })(); + exports2.copy = copy; + exports2.readFile = readFile2; + exports2.readFileRaw = readFileRaw; + exports2.normalizeOS = normalizeOS; + var _fs; + function _load_fs() { + return _fs = _interopRequireDefault(__webpack_require__(3)); + } + var _glob; + function _load_glob() { + return _glob = _interopRequireDefault(__webpack_require__(75)); + } + var _os; + function _load_os() { + return _os = _interopRequireDefault(__webpack_require__(36)); + } + var _path; + function _load_path() { + return _path = _interopRequireDefault(__webpack_require__(0)); + } + var _blockingQueue; + function _load_blockingQueue() { + return _blockingQueue = _interopRequireDefault(__webpack_require__(84)); + } + var _promise; + function _load_promise() { + return _promise = _interopRequireWildcard(__webpack_require__(40)); + } + var _promise2; + function _load_promise2() { + return _promise2 = __webpack_require__(40); + } + var _map; + function _load_map() { + return _map = _interopRequireDefault(__webpack_require__(20)); + } + var _fsNormalized; + function _load_fsNormalized() { + return _fsNormalized = __webpack_require__(164); + } + function _interopRequireWildcard(obj) { + if (obj && obj.__esModule) { + return obj; + } else { + var newObj = {}; + if (obj != null) { + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) + newObj[key] = obj[key]; + } + } + newObj.default = obj; + return newObj; + } + } + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { default: obj }; + } + const constants = exports2.constants = typeof (_fs || _load_fs()).default.constants !== "undefined" ? (_fs || _load_fs()).default.constants : { + R_OK: (_fs || _load_fs()).default.R_OK, + W_OK: (_fs || _load_fs()).default.W_OK, + X_OK: (_fs || _load_fs()).default.X_OK + }; + const lockQueue = exports2.lockQueue = new (_blockingQueue || _load_blockingQueue()).default("fs lock"); + const readFileBuffer = exports2.readFileBuffer = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.readFile); + const open = exports2.open = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.open); + const writeFile2 = exports2.writeFile = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.writeFile); + const readlink = exports2.readlink = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.readlink); + const realpath = exports2.realpath = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.realpath); + const readdir = exports2.readdir = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.readdir); + const rename = exports2.rename = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.rename); + const access = exports2.access = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.access); + const stat = exports2.stat = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.stat); + const mkdirp = exports2.mkdirp = (0, (_promise2 || _load_promise2()).promisify)(__webpack_require__(116)); + const exists = exports2.exists = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.exists, true); + const lstat = exports2.lstat = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.lstat); + const chmod = exports2.chmod = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.chmod); + const link = exports2.link = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.link); + const glob = exports2.glob = (0, (_promise2 || _load_promise2()).promisify)((_glob || _load_glob()).default); + exports2.unlink = (_fsNormalized || _load_fsNormalized()).unlink; + const CONCURRENT_QUEUE_ITEMS = (_fs || _load_fs()).default.copyFile ? 128 : 4; + const fsSymlink = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.symlink); + const invariant = __webpack_require__(7); + const stripBOM = __webpack_require__(122); + const noop2 = () => { + }; + function copy(src, dest, reporter) { + return copyBulk([{ src, dest }], reporter); + } + function _readFile(loc, encoding) { + return new Promise((resolve, reject) => { + (_fs || _load_fs()).default.readFile(loc, encoding, function(err, content) { + if (err) { + reject(err); + } else { + resolve(content); + } + }); + }); + } + function readFile2(loc) { + return _readFile(loc, "utf8").then(normalizeOS); + } + function readFileRaw(loc) { + return _readFile(loc, "binary"); + } + function normalizeOS(body) { + return body.replace(/\r\n/g, "\n"); + } + const cr = "\r".charCodeAt(0); + const lf = "\n".charCodeAt(0); + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + exports2.getPathKey = getPathKey; + const os3 = __webpack_require__(36); + const path = __webpack_require__(0); + const userHome = __webpack_require__(45).default; + var _require = __webpack_require__(171); + const getCacheDir = _require.getCacheDir, getConfigDir = _require.getConfigDir, getDataDir = _require.getDataDir; + const isWebpackBundle = __webpack_require__(227); + const DEPENDENCY_TYPES = exports2.DEPENDENCY_TYPES = ["devDependencies", "dependencies", "optionalDependencies", "peerDependencies"]; + const RESOLUTIONS = exports2.RESOLUTIONS = "resolutions"; + const MANIFEST_FIELDS = exports2.MANIFEST_FIELDS = [RESOLUTIONS, ...DEPENDENCY_TYPES]; + const SUPPORTED_NODE_VERSIONS = exports2.SUPPORTED_NODE_VERSIONS = "^4.8.0 || ^5.7.0 || ^6.2.2 || >=8.0.0"; + const YARN_REGISTRY = exports2.YARN_REGISTRY = "https://registry.yarnpkg.com"; + const YARN_DOCS = exports2.YARN_DOCS = "https://yarnpkg.com/en/docs/cli/"; + const YARN_INSTALLER_SH = exports2.YARN_INSTALLER_SH = "https://yarnpkg.com/install.sh"; + const YARN_INSTALLER_MSI = exports2.YARN_INSTALLER_MSI = "https://yarnpkg.com/latest.msi"; + const SELF_UPDATE_VERSION_URL = exports2.SELF_UPDATE_VERSION_URL = "https://yarnpkg.com/latest-version"; + const CACHE_VERSION = exports2.CACHE_VERSION = 2; + const LOCKFILE_VERSION = exports2.LOCKFILE_VERSION = 1; + const NETWORK_CONCURRENCY = exports2.NETWORK_CONCURRENCY = 8; + const NETWORK_TIMEOUT = exports2.NETWORK_TIMEOUT = 30 * 1e3; + const CHILD_CONCURRENCY = exports2.CHILD_CONCURRENCY = 5; + const REQUIRED_PACKAGE_KEYS = exports2.REQUIRED_PACKAGE_KEYS = ["name", "version", "_uid"]; + function getPreferredCacheDirectories() { + const preferredCacheDirectories = [getCacheDir()]; + if (process.getuid) { + preferredCacheDirectories.push(path.join(os3.tmpdir(), `.yarn-cache-${process.getuid()}`)); + } + preferredCacheDirectories.push(path.join(os3.tmpdir(), `.yarn-cache`)); + return preferredCacheDirectories; + } + const PREFERRED_MODULE_CACHE_DIRECTORIES = exports2.PREFERRED_MODULE_CACHE_DIRECTORIES = getPreferredCacheDirectories(); + const CONFIG_DIRECTORY = exports2.CONFIG_DIRECTORY = getConfigDir(); + const DATA_DIRECTORY = exports2.DATA_DIRECTORY = getDataDir(); + const LINK_REGISTRY_DIRECTORY = exports2.LINK_REGISTRY_DIRECTORY = path.join(DATA_DIRECTORY, "link"); + const GLOBAL_MODULE_DIRECTORY = exports2.GLOBAL_MODULE_DIRECTORY = path.join(DATA_DIRECTORY, "global"); + const NODE_BIN_PATH = exports2.NODE_BIN_PATH = process.execPath; + const YARN_BIN_PATH = exports2.YARN_BIN_PATH = getYarnBinPath(); + function getYarnBinPath() { + if (isWebpackBundle) { + return __filename; + } else { + return path.join(__dirname, "..", "bin", "yarn.js"); + } + } + const NODE_MODULES_FOLDER = exports2.NODE_MODULES_FOLDER = "node_modules"; + const NODE_PACKAGE_JSON = exports2.NODE_PACKAGE_JSON = "package.json"; + const POSIX_GLOBAL_PREFIX = exports2.POSIX_GLOBAL_PREFIX = `${process.env.DESTDIR || ""}/usr/local`; + const FALLBACK_GLOBAL_PREFIX = exports2.FALLBACK_GLOBAL_PREFIX = path.join(userHome, ".yarn"); + const META_FOLDER = exports2.META_FOLDER = ".yarn-meta"; + const INTEGRITY_FILENAME = exports2.INTEGRITY_FILENAME = ".yarn-integrity"; + const LOCKFILE_FILENAME = exports2.LOCKFILE_FILENAME = "yarn.lock"; + const METADATA_FILENAME = exports2.METADATA_FILENAME = ".yarn-metadata.json"; + const TARBALL_FILENAME = exports2.TARBALL_FILENAME = ".yarn-tarball.tgz"; + const CLEAN_FILENAME = exports2.CLEAN_FILENAME = ".yarnclean"; + const NPM_LOCK_FILENAME = exports2.NPM_LOCK_FILENAME = "package-lock.json"; + const NPM_SHRINKWRAP_FILENAME = exports2.NPM_SHRINKWRAP_FILENAME = "npm-shrinkwrap.json"; + const DEFAULT_INDENT = exports2.DEFAULT_INDENT = " "; + const SINGLE_INSTANCE_PORT = exports2.SINGLE_INSTANCE_PORT = 31997; + const SINGLE_INSTANCE_FILENAME = exports2.SINGLE_INSTANCE_FILENAME = ".yarn-single-instance"; + const ENV_PATH_KEY = exports2.ENV_PATH_KEY = getPathKey(process.platform, process.env); + function getPathKey(platform, env3) { + let pathKey = "PATH"; + if (platform === "win32") { + pathKey = "Path"; + for (const key in env3) { + if (key.toLowerCase() === "path") { + pathKey = key; + } + } + } + return pathKey; + } + const VERSION_COLOR_SCHEME = exports2.VERSION_COLOR_SCHEME = { + major: "red", + premajor: "red", + minor: "yellow", + preminor: "yellow", + patch: "green", + prepatch: "green", + prerelease: "red", + unchanged: "white", + unknown: "red" + }; + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + var NODE_ENV = process.env.NODE_ENV; + var invariant = function(condition, format, a, b, c, d, e, f) { + if (NODE_ENV !== "production") { + if (format === void 0) { + throw new Error("invariant requires an error message argument"); + } + } + if (!condition) { + var error; + if (format === void 0) { + error = new Error( + "Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings." + ); + } else { + var args = [a, b, c, d, e, f]; + var argIndex = 0; + error = new Error( + format.replace(/%s/g, function() { + return args[argIndex++]; + }) + ); + error.name = "Invariant Violation"; + } + error.framesToPop = 1; + throw error; + } + }; + module2.exports = invariant; + }, + , + function(module2, exports2) { + module2.exports = __require("crypto"); + }, + , + function(module2, exports2) { + var global = module2.exports = typeof window != "undefined" && window.Math == Math ? window : typeof self != "undefined" && self.Math == Math ? self : Function("return this")(); + if (typeof __g == "number") + __g = global; + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + exports2.sortAlpha = sortAlpha; + exports2.entries = entries; + exports2.removePrefix = removePrefix; + exports2.removeSuffix = removeSuffix; + exports2.addSuffix = addSuffix; + exports2.hyphenate = hyphenate; + exports2.camelCase = camelCase; + exports2.compareSortedArrays = compareSortedArrays; + exports2.sleep = sleep; + const _camelCase = __webpack_require__(176); + function sortAlpha(a, b) { + const shortLen = Math.min(a.length, b.length); + for (let i = 0; i < shortLen; i++) { + const aChar = a.charCodeAt(i); + const bChar = b.charCodeAt(i); + if (aChar !== bChar) { + return aChar - bChar; + } + } + return a.length - b.length; + } + function entries(obj) { + const entries2 = []; + if (obj) { + for (const key in obj) { + entries2.push([key, obj[key]]); + } + } + return entries2; + } + function removePrefix(pattern, prefix) { + if (pattern.startsWith(prefix)) { + pattern = pattern.slice(prefix.length); + } + return pattern; + } + function removeSuffix(pattern, suffix) { + if (pattern.endsWith(suffix)) { + return pattern.slice(0, -suffix.length); + } + return pattern; + } + function addSuffix(pattern, suffix) { + if (!pattern.endsWith(suffix)) { + return pattern + suffix; + } + return pattern; + } + function hyphenate(str) { + return str.replace(/[A-Z]/g, (match) => { + return "-" + match.charAt(0).toLowerCase(); + }); + } + function camelCase(str) { + if (/[A-Z]/.test(str)) { + return null; + } else { + return _camelCase(str); + } + } + function compareSortedArrays(array1, array2) { + if (array1.length !== array2.length) { + return false; + } + for (let i = 0, len = array1.length; i < len; i++) { + if (array1[i] !== array2[i]) { + return false; + } + } + return true; + } + function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + }, + function(module2, exports2, __webpack_require__) { + var store = __webpack_require__(107)("wks"); + var uid = __webpack_require__(111); + var Symbol2 = __webpack_require__(11).Symbol; + var USE_SYMBOL = typeof Symbol2 == "function"; + var $exports = module2.exports = function(name) { + return store[name] || (store[name] = USE_SYMBOL && Symbol2[name] || (USE_SYMBOL ? Symbol2 : uid)("Symbol." + name)); + }; + $exports.store = store; + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + exports2.stringify = exports2.parse = void 0; + var _asyncToGenerator2; + function _load_asyncToGenerator() { + return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(1)); + } + var _parse; + function _load_parse() { + return _parse = __webpack_require__(81); + } + Object.defineProperty(exports2, "parse", { + enumerable: true, + get: function get() { + return _interopRequireDefault(_parse || _load_parse()).default; + } + }); + var _stringify; + function _load_stringify() { + return _stringify = __webpack_require__(150); + } + Object.defineProperty(exports2, "stringify", { + enumerable: true, + get: function get() { + return _interopRequireDefault(_stringify || _load_stringify()).default; + } + }); + exports2.implodeEntry = implodeEntry; + exports2.explodeEntry = explodeEntry; + var _misc; + function _load_misc() { + return _misc = __webpack_require__(12); + } + var _normalizePattern; + function _load_normalizePattern() { + return _normalizePattern = __webpack_require__(29); + } + var _parse2; + function _load_parse2() { + return _parse2 = _interopRequireDefault(__webpack_require__(81)); + } + var _constants; + function _load_constants() { + return _constants = __webpack_require__(6); + } + var _fs; + function _load_fs() { + return _fs = _interopRequireWildcard(__webpack_require__(5)); + } + function _interopRequireWildcard(obj) { + if (obj && obj.__esModule) { + return obj; + } else { + var newObj = {}; + if (obj != null) { + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) + newObj[key] = obj[key]; + } + } + newObj.default = obj; + return newObj; + } + } + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { default: obj }; + } + const invariant = __webpack_require__(7); + const path = __webpack_require__(0); + const ssri = __webpack_require__(55); + function getName(pattern) { + return (0, (_normalizePattern || _load_normalizePattern()).normalizePattern)(pattern).name; + } + function blankObjectUndefined(obj) { + return obj && Object.keys(obj).length ? obj : void 0; + } + function keyForRemote(remote) { + return remote.resolved || (remote.reference && remote.hash ? `${remote.reference}#${remote.hash}` : null); + } + function serializeIntegrity(integrity) { + return integrity.toString().split(" ").sort().join(" "); + } + function implodeEntry(pattern, obj) { + const inferredName = getName(pattern); + const integrity = obj.integrity ? serializeIntegrity(obj.integrity) : ""; + const imploded = { + name: inferredName === obj.name ? void 0 : obj.name, + version: obj.version, + uid: obj.uid === obj.version ? void 0 : obj.uid, + resolved: obj.resolved, + registry: obj.registry === "npm" ? void 0 : obj.registry, + dependencies: blankObjectUndefined(obj.dependencies), + optionalDependencies: blankObjectUndefined(obj.optionalDependencies), + permissions: blankObjectUndefined(obj.permissions), + prebuiltVariants: blankObjectUndefined(obj.prebuiltVariants) + }; + if (integrity) { + imploded.integrity = integrity; + } + return imploded; + } + function explodeEntry(pattern, obj) { + obj.optionalDependencies = obj.optionalDependencies || {}; + obj.dependencies = obj.dependencies || {}; + obj.uid = obj.uid || obj.version; + obj.permissions = obj.permissions || {}; + obj.registry = obj.registry || "npm"; + obj.name = obj.name || getName(pattern); + const integrity = obj.integrity; + if (integrity && integrity.isIntegrity) { + obj.integrity = ssri.parse(integrity); + } + return obj; + } + class Lockfile { + constructor({ cache, source, parseResultType } = {}) { + this.source = source || ""; + this.cache = cache; + this.parseResultType = parseResultType; + } + hasEntriesExistWithoutIntegrity() { + if (!this.cache) { + return false; + } + for (const key in this.cache) { + if (!/^.*@(file:|http)/.test(key) && this.cache[key] && !this.cache[key].integrity) { + return true; + } + } + return false; + } + static fromDirectory(dir, reporter) { + return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + const lockfileLoc = path.join(dir, (_constants || _load_constants()).LOCKFILE_FILENAME); + let lockfile2; + let rawLockfile = ""; + let parseResult; + if (yield (_fs || _load_fs()).exists(lockfileLoc)) { + rawLockfile = yield (_fs || _load_fs()).readFile(lockfileLoc); + parseResult = (0, (_parse2 || _load_parse2()).default)(rawLockfile, lockfileLoc); + if (reporter) { + if (parseResult.type === "merge") { + reporter.info(reporter.lang("lockfileMerged")); + } else if (parseResult.type === "conflict") { + reporter.warn(reporter.lang("lockfileConflict")); + } + } + lockfile2 = parseResult.object; + } else if (reporter) { + reporter.info(reporter.lang("noLockfileFound")); + } + return new Lockfile({ cache: lockfile2, source: rawLockfile, parseResultType: parseResult && parseResult.type }); + })(); + } + getLocked(pattern) { + const cache = this.cache; + if (!cache) { + return void 0; + } + const shrunk = pattern in cache && cache[pattern]; + if (typeof shrunk === "string") { + return this.getLocked(shrunk); + } else if (shrunk) { + explodeEntry(pattern, shrunk); + return shrunk; + } + return void 0; + } + removePattern(pattern) { + const cache = this.cache; + if (!cache) { + return; + } + delete cache[pattern]; + } + getLockfile(patterns) { + const lockfile2 = {}; + const seen = /* @__PURE__ */ new Map(); + const sortedPatternsKeys = Object.keys(patterns).sort((_misc || _load_misc()).sortAlpha); + for (var _iterator = sortedPatternsKeys, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator](); ; ) { + var _ref; + if (_isArray) { + if (_i >= _iterator.length) + break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) + break; + _ref = _i.value; + } + const pattern = _ref; + const pkg = patterns[pattern]; + const remote = pkg._remote, ref = pkg._reference; + invariant(ref, "Package is missing a reference"); + invariant(remote, "Package is missing a remote"); + const remoteKey = keyForRemote(remote); + const seenPattern = remoteKey && seen.get(remoteKey); + if (seenPattern) { + lockfile2[pattern] = seenPattern; + if (!seenPattern.name && getName(pattern) !== pkg.name) { + seenPattern.name = pkg.name; + } + continue; + } + const obj = implodeEntry(pattern, { + name: pkg.name, + version: pkg.version, + uid: pkg._uid, + resolved: remote.resolved, + integrity: remote.integrity, + registry: remote.registry, + dependencies: pkg.dependencies, + peerDependencies: pkg.peerDependencies, + optionalDependencies: pkg.optionalDependencies, + permissions: ref.permissions, + prebuiltVariants: pkg.prebuiltVariants + }); + lockfile2[pattern] = obj; + if (remoteKey) { + seen.set(remoteKey, obj); + } + } + return lockfile2; + } + } + exports2.default = Lockfile; + }, + , + , + function(module2, exports2) { + module2.exports = __require("stream"); + }, + , + , + function(module2, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + exports2.default = nullify; + function nullify(obj = {}) { + if (Array.isArray(obj)) { + for (var _iterator = obj, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator](); ; ) { + var _ref; + if (_isArray) { + if (_i >= _iterator.length) + break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) + break; + _ref = _i.value; + } + const item = _ref; + nullify(item); + } + } else if (obj !== null && typeof obj === "object" || typeof obj === "function") { + Object.setPrototypeOf(obj, null); + if (typeof obj === "object") { + for (const key in obj) { + nullify(obj[key]); + } + } + } + return obj; + } + }, + , + function(module2, exports2) { + module2.exports = __require("assert"); + }, + function(module2, exports2) { + var core = module2.exports = { version: "2.5.7" }; + if (typeof __e == "number") + __e = core; + }, + , + , + , + function(module2, exports2, __webpack_require__) { + var isObject = __webpack_require__(34); + module2.exports = function(it) { + if (!isObject(it)) + throw TypeError(it + " is not an object!"); + return it; + }; + }, + , + function(module2, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + exports2.normalizePattern = normalizePattern; + function normalizePattern(pattern) { + let hasVersion = false; + let range = "latest"; + let name = pattern; + let isScoped = false; + if (name[0] === "@") { + isScoped = true; + name = name.slice(1); + } + const parts = name.split("@"); + if (parts.length > 1) { + name = parts.shift(); + range = parts.join("@"); + if (range) { + hasVersion = true; + } else { + range = "*"; + } + } + if (isScoped) { + name = `@${name}`; + } + return { name, range, hasVersion }; + } + }, + , + function(module2, exports2, __webpack_require__) { + var dP = __webpack_require__(50); + var createDesc = __webpack_require__(106); + module2.exports = __webpack_require__(33) ? function(object, key, value) { + return dP.f(object, key, createDesc(1, value)); + } : function(object, key, value) { + object[key] = value; + return object; + }; + }, + function(module2, exports2, __webpack_require__) { + var buffer = __webpack_require__(63); + var Buffer2 = buffer.Buffer; + function copyProps(src, dst) { + for (var key in src) { + dst[key] = src[key]; + } + } + if (Buffer2.from && Buffer2.alloc && Buffer2.allocUnsafe && Buffer2.allocUnsafeSlow) { + module2.exports = buffer; + } else { + copyProps(buffer, exports2); + exports2.Buffer = SafeBuffer; + } + function SafeBuffer(arg, encodingOrOffset, length) { + return Buffer2(arg, encodingOrOffset, length); + } + copyProps(Buffer2, SafeBuffer); + SafeBuffer.from = function(arg, encodingOrOffset, length) { + if (typeof arg === "number") { + throw new TypeError("Argument must not be a number"); + } + return Buffer2(arg, encodingOrOffset, length); + }; + SafeBuffer.alloc = function(size, fill, encoding) { + if (typeof size !== "number") { + throw new TypeError("Argument must be a number"); + } + var buf = Buffer2(size); + if (fill !== void 0) { + if (typeof encoding === "string") { + buf.fill(fill, encoding); + } else { + buf.fill(fill); + } + } else { + buf.fill(0); + } + return buf; + }; + SafeBuffer.allocUnsafe = function(size) { + if (typeof size !== "number") { + throw new TypeError("Argument must be a number"); + } + return Buffer2(size); + }; + SafeBuffer.allocUnsafeSlow = function(size) { + if (typeof size !== "number") { + throw new TypeError("Argument must be a number"); + } + return buffer.SlowBuffer(size); + }; + }, + function(module2, exports2, __webpack_require__) { + module2.exports = !__webpack_require__(85)(function() { + return Object.defineProperty({}, "a", { get: function() { + return 7; + } }).a != 7; + }); + }, + function(module2, exports2) { + module2.exports = function(it) { + return typeof it === "object" ? it !== null : typeof it === "function"; + }; + }, + function(module2, exports2) { + module2.exports = {}; + }, + function(module2, exports2) { + module2.exports = __require("os"); + }, + , + , + , + function(module2, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + exports2.wait = wait; + exports2.promisify = promisify; + exports2.queue = queue; + function wait(delay) { + return new Promise((resolve) => { + setTimeout(resolve, delay); + }); + } + function promisify(fn, firstData) { + return function(...args) { + return new Promise(function(resolve, reject) { + args.push(function(err, ...result) { + let res = result; + if (result.length <= 1) { + res = result[0]; + } + if (firstData) { + res = err; + err = null; + } + if (err) { + reject(err); + } else { + resolve(res); + } + }); + fn.apply(null, args); + }); + }; + } + function queue(arr, promiseProducer, concurrency = Infinity) { + concurrency = Math.min(concurrency, arr.length); + arr = arr.slice(); + const results = []; + let total = arr.length; + if (!total) { + return Promise.resolve(results); + } + return new Promise((resolve, reject) => { + for (let i = 0; i < concurrency; i++) { + next(); + } + function next() { + const item = arr.shift(); + const promise = promiseProducer(item); + promise.then(function(result) { + results.push(result); + total--; + if (total === 0) { + resolve(results); + } else { + if (arr.length) { + next(); + } + } + }, reject); + } + }); + } + }, + function(module2, exports2, __webpack_require__) { + var global = __webpack_require__(11); + var core = __webpack_require__(23); + var ctx = __webpack_require__(48); + var hide = __webpack_require__(31); + var has = __webpack_require__(49); + var PROTOTYPE = "prototype"; + var $export = function(type, name, source) { + var IS_FORCED = type & $export.F; + var IS_GLOBAL = type & $export.G; + var IS_STATIC = type & $export.S; + var IS_PROTO = type & $export.P; + var IS_BIND = type & $export.B; + var IS_WRAP = type & $export.W; + var exports3 = IS_GLOBAL ? core : core[name] || (core[name] = {}); + var expProto = exports3[PROTOTYPE]; + var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE]; + var key, own, out; + if (IS_GLOBAL) + source = name; + for (key in source) { + own = !IS_FORCED && target && target[key] !== void 0; + if (own && has(exports3, key)) + continue; + out = own ? target[key] : source[key]; + exports3[key] = IS_GLOBAL && typeof target[key] != "function" ? source[key] : IS_BIND && own ? ctx(out, global) : IS_WRAP && target[key] == out ? function(C) { + var F = function(a, b, c) { + if (this instanceof C) { + switch (arguments.length) { + case 0: + return new C(); + case 1: + return new C(a); + case 2: + return new C(a, b); + } + return new C(a, b, c); + } + return C.apply(this, arguments); + }; + F[PROTOTYPE] = C[PROTOTYPE]; + return F; + }(out) : IS_PROTO && typeof out == "function" ? ctx(Function.call, out) : out; + if (IS_PROTO) { + (exports3.virtual || (exports3.virtual = {}))[key] = out; + if (type & $export.R && expProto && !expProto[key]) + hide(expProto, key, out); + } + } + }; + $export.F = 1; + $export.G = 2; + $export.S = 4; + $export.P = 8; + $export.B = 16; + $export.W = 32; + $export.U = 64; + $export.R = 128; + module2.exports = $export; + }, + function(module2, exports2, __webpack_require__) { + try { + var util = __webpack_require__(2); + if (typeof util.inherits !== "function") + throw ""; + module2.exports = util.inherits; + } catch (e) { + module2.exports = __webpack_require__(224); + } + }, + , + , + function(module2, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + exports2.home = void 0; + var _rootUser; + function _load_rootUser() { + return _rootUser = _interopRequireDefault(__webpack_require__(169)); + } + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { default: obj }; + } + const path = __webpack_require__(0); + const home = exports2.home = __webpack_require__(36).homedir(); + const userHomeDir = (_rootUser || _load_rootUser()).default ? path.resolve("/usr/local/share") : home; + exports2.default = userHomeDir; + }, + function(module2, exports2) { + module2.exports = function(it) { + if (typeof it != "function") + throw TypeError(it + " is not a function!"); + return it; + }; + }, + function(module2, exports2) { + var toString = {}.toString; + module2.exports = function(it) { + return toString.call(it).slice(8, -1); + }; + }, + function(module2, exports2, __webpack_require__) { + var aFunction = __webpack_require__(46); + module2.exports = function(fn, that, length) { + aFunction(fn); + if (that === void 0) + return fn; + switch (length) { + case 1: + return function(a) { + return fn.call(that, a); + }; + case 2: + return function(a, b) { + return fn.call(that, a, b); + }; + case 3: + return function(a, b, c) { + return fn.call(that, a, b, c); + }; + } + return function() { + return fn.apply(that, arguments); + }; + }; + }, + function(module2, exports2) { + var hasOwnProperty = {}.hasOwnProperty; + module2.exports = function(it, key) { + return hasOwnProperty.call(it, key); + }; + }, + function(module2, exports2, __webpack_require__) { + var anObject = __webpack_require__(27); + var IE8_DOM_DEFINE = __webpack_require__(184); + var toPrimitive = __webpack_require__(201); + var dP = Object.defineProperty; + exports2.f = __webpack_require__(33) ? Object.defineProperty : function defineProperty(O, P, Attributes) { + anObject(O); + P = toPrimitive(P, true); + anObject(Attributes); + if (IE8_DOM_DEFINE) + try { + return dP(O, P, Attributes); + } catch (e) { + } + if ("get" in Attributes || "set" in Attributes) + throw TypeError("Accessors not supported!"); + if ("value" in Attributes) + O[P] = Attributes.value; + return O; + }; + }, + , + , + , + function(module2, exports2) { + module2.exports = __require("events"); + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + const Buffer2 = __webpack_require__(32).Buffer; + const crypto = __webpack_require__(9); + const Transform = __webpack_require__(17).Transform; + const SPEC_ALGORITHMS = ["sha256", "sha384", "sha512"]; + const BASE64_REGEX = /^[a-z0-9+/]+(?:=?=?)$/i; + const SRI_REGEX = /^([^-]+)-([^?]+)([?\S*]*)$/; + const STRICT_SRI_REGEX = /^([^-]+)-([A-Za-z0-9+/=]{44,88})(\?[\x21-\x7E]*)*$/; + const VCHAR_REGEX = /^[\x21-\x7E]+$/; + class Hash { + get isHash() { + return true; + } + constructor(hash, opts) { + const strict = !!(opts && opts.strict); + this.source = hash.trim(); + const match = this.source.match( + strict ? STRICT_SRI_REGEX : SRI_REGEX + ); + if (!match) { + return; + } + if (strict && !SPEC_ALGORITHMS.some((a) => a === match[1])) { + return; + } + this.algorithm = match[1]; + this.digest = match[2]; + const rawOpts = match[3]; + this.options = rawOpts ? rawOpts.slice(1).split("?") : []; + } + hexDigest() { + return this.digest && Buffer2.from(this.digest, "base64").toString("hex"); + } + toJSON() { + return this.toString(); + } + toString(opts) { + if (opts && opts.strict) { + if (!(SPEC_ALGORITHMS.some((x) => x === this.algorithm) && this.digest.match(BASE64_REGEX) && (this.options || []).every((opt) => opt.match(VCHAR_REGEX)))) { + return ""; + } + } + const options = this.options && this.options.length ? `?${this.options.join("?")}` : ""; + return `${this.algorithm}-${this.digest}${options}`; + } + } + class Integrity { + get isIntegrity() { + return true; + } + toJSON() { + return this.toString(); + } + toString(opts) { + opts = opts || {}; + let sep = opts.sep || " "; + if (opts.strict) { + sep = sep.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); + } + concat(integrity, opts) { + const other = typeof integrity === "string" ? integrity : stringify(integrity, opts); + return parse3(`${this.toString(opts)} ${other}`, opts); + } + hexDigest() { + return parse3(this, { single: true }).hexDigest(); + } + match(integrity, opts) { + const other = parse3(integrity, opts); + const algo = other.pickAlgorithm(opts); + return this[algo] && other[algo] && this[algo].find( + (hash) => other[algo].find( + (otherhash) => hash.digest === otherhash.digest + ) + ) || false; + } + pickAlgorithm(opts) { + const pickAlgorithm = opts && opts.pickAlgorithm || getPrioritizedHash; + const keys = Object.keys(this); + if (!keys.length) { + throw new Error(`No algorithms available for ${JSON.stringify(this.toString())}`); + } + return keys.reduce((acc, algo) => { + return pickAlgorithm(acc, algo) || acc; + }); + } + } + module2.exports.parse = parse3; + function parse3(sri, opts) { + opts = opts || {}; + if (typeof sri === "string") { + return _parse(sri, opts); + } else if (sri.algorithm && sri.digest) { + const fullSri = new Integrity(); + fullSri[sri.algorithm] = [sri]; + return _parse(stringify(fullSri, opts), opts); + } else { + return _parse(stringify(sri, opts), opts); + } + } + function _parse(integrity, opts) { + if (opts.single) { + return new Hash(integrity, opts); + } + return integrity.trim().split(/\s+/).reduce((acc, string) => { + const hash = new Hash(string, opts); + if (hash.algorithm && hash.digest) { + const algo = hash.algorithm; + if (!acc[algo]) { + acc[algo] = []; + } + acc[algo].push(hash); + } + return acc; + }, new Integrity()); + } + module2.exports.stringify = stringify; + function stringify(obj, opts) { + if (obj.algorithm && obj.digest) { + return Hash.prototype.toString.call(obj, opts); + } else if (typeof obj === "string") { + return stringify(parse3(obj, opts), opts); + } else { + return Integrity.prototype.toString.call(obj, opts); + } + } + module2.exports.fromHex = fromHex; + function fromHex(hexDigest, algorithm, opts) { + const optString = opts && opts.options && opts.options.length ? `?${opts.options.join("?")}` : ""; + return parse3( + `${algorithm}-${Buffer2.from(hexDigest, "hex").toString("base64")}${optString}`, + opts + ); + } + module2.exports.fromData = fromData; + function fromData(data, opts) { + opts = opts || {}; + const algorithms = opts.algorithms || ["sha512"]; + const optString = opts.options && opts.options.length ? `?${opts.options.join("?")}` : ""; + return algorithms.reduce((acc, algo) => { + const digest = crypto.createHash(algo).update(data).digest("base64"); + const hash = new Hash( + `${algo}-${digest}${optString}`, + opts + ); + if (hash.algorithm && hash.digest) { + const algo2 = hash.algorithm; + if (!acc[algo2]) { + acc[algo2] = []; + } + acc[algo2].push(hash); + } + return acc; + }, new Integrity()); + } + module2.exports.fromStream = fromStream; + function fromStream(stream, opts) { + opts = opts || {}; + const P = opts.Promise || Promise; + const istream = integrityStream(opts); + return new P((resolve, reject) => { + stream.pipe(istream); + stream.on("error", reject); + istream.on("error", reject); + let sri; + istream.on("integrity", (s) => { + sri = s; + }); + istream.on("end", () => resolve(sri)); + istream.on("data", () => { + }); + }); + } + module2.exports.checkData = checkData; + function checkData(data, sri, opts) { + opts = opts || {}; + sri = parse3(sri, opts); + if (!Object.keys(sri).length) { + if (opts.error) { + throw Object.assign( + new Error("No valid integrity hashes to check against"), + { + code: "EINTEGRITY" + } + ); + } else { + return false; + } + } + const algorithm = sri.pickAlgorithm(opts); + const digest = crypto.createHash(algorithm).update(data).digest("base64"); + const newSri = parse3({ algorithm, digest }); + const match = newSri.match(sri, opts); + if (match || !opts.error) { + return match; + } else if (typeof opts.size === "number" && data.length !== opts.size) { + const err = new Error(`data size mismatch when checking ${sri}. + Wanted: ${opts.size} + Found: ${data.length}`); + err.code = "EBADSIZE"; + err.found = data.length; + err.expected = opts.size; + err.sri = sri; + throw err; + } else { + const err = new Error(`Integrity checksum failed when using ${algorithm}: Wanted ${sri}, but got ${newSri}. (${data.length} bytes)`); + err.code = "EINTEGRITY"; + err.found = newSri; + err.expected = sri; + err.algorithm = algorithm; + err.sri = sri; + throw err; + } + } + module2.exports.checkStream = checkStream; + function checkStream(stream, sri, opts) { + opts = opts || {}; + const P = opts.Promise || Promise; + const checker = integrityStream(Object.assign({}, opts, { + integrity: sri + })); + return new P((resolve, reject) => { + stream.pipe(checker); + stream.on("error", reject); + checker.on("error", reject); + let sri2; + checker.on("verified", (s) => { + sri2 = s; + }); + checker.on("end", () => resolve(sri2)); + checker.on("data", () => { + }); + }); + } + module2.exports.integrityStream = integrityStream; + function integrityStream(opts) { + opts = opts || {}; + const sri = opts.integrity && parse3(opts.integrity, opts); + const goodSri = sri && Object.keys(sri).length; + const algorithm = goodSri && sri.pickAlgorithm(opts); + const digests = goodSri && sri[algorithm]; + const algorithms = Array.from( + new Set( + (opts.algorithms || ["sha512"]).concat(algorithm ? [algorithm] : []) + ) + ); + const hashes = algorithms.map(crypto.createHash); + let streamSize = 0; + const stream = new Transform({ + transform(chunk, enc, cb) { + streamSize += chunk.length; + hashes.forEach((h) => h.update(chunk, enc)); + cb(null, chunk, enc); + } + }).on("end", () => { + const optString = opts.options && opts.options.length ? `?${opts.options.join("?")}` : ""; + const newSri = parse3(hashes.map((h, i) => { + return `${algorithms[i]}-${h.digest("base64")}${optString}`; + }).join(" "), opts); + const match = goodSri && newSri.match(sri, opts); + if (typeof opts.size === "number" && streamSize !== opts.size) { + const err = new Error(`stream size mismatch when checking ${sri}. + Wanted: ${opts.size} + Found: ${streamSize}`); + err.code = "EBADSIZE"; + err.found = streamSize; + err.expected = opts.size; + err.sri = sri; + stream.emit("error", err); + } else if (opts.integrity && !match) { + const err = new Error(`${sri} integrity checksum failed when using ${algorithm}: wanted ${digests} but got ${newSri}. (${streamSize} bytes)`); + err.code = "EINTEGRITY"; + err.found = newSri; + err.expected = digests; + err.algorithm = algorithm; + err.sri = sri; + stream.emit("error", err); + } else { + stream.emit("size", streamSize); + stream.emit("integrity", newSri); + match && stream.emit("verified", match); + } + }); + return stream; + } + module2.exports.create = createIntegrity; + function createIntegrity(opts) { + opts = opts || {}; + const algorithms = opts.algorithms || ["sha512"]; + const optString = opts.options && opts.options.length ? `?${opts.options.join("?")}` : ""; + const hashes = algorithms.map(crypto.createHash); + return { + update: function(chunk, enc) { + hashes.forEach((h) => h.update(chunk, enc)); + return this; + }, + digest: function(enc) { + const integrity = algorithms.reduce((acc, algo) => { + const digest = hashes.shift().digest("base64"); + const hash = new Hash( + `${algo}-${digest}${optString}`, + opts + ); + if (hash.algorithm && hash.digest) { + const algo2 = hash.algorithm; + if (!acc[algo2]) { + acc[algo2] = []; + } + acc[algo2].push(hash); + } + return acc; + }, new Integrity()); + return integrity; + } + }; + } + const NODE_HASHES = new Set(crypto.getHashes()); + const DEFAULT_PRIORITY = [ + "md5", + "whirlpool", + "sha1", + "sha224", + "sha256", + "sha384", + "sha512", + "sha3", + "sha3-256", + "sha3-384", + "sha3-512", + "sha3_256", + "sha3_384", + "sha3_512" + ].filter((algo) => NODE_HASHES.has(algo)); + function getPrioritizedHash(algo1, algo2) { + return DEFAULT_PRIORITY.indexOf(algo1.toLowerCase()) >= DEFAULT_PRIORITY.indexOf(algo2.toLowerCase()) ? algo1 : algo2; + } + }, + , + , + , + , + function(module2, exports2, __webpack_require__) { + module2.exports = minimatch; + minimatch.Minimatch = Minimatch; + var path = { sep: "/" }; + try { + path = __webpack_require__(0); + } catch (er) { + } + var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}; + var expand3 = __webpack_require__(175); + var plTypes = { + "!": { open: "(?:(?!(?:", close: "))[^/]*?)" }, + "?": { open: "(?:", close: ")?" }, + "+": { open: "(?:", close: ")+" }, + "*": { open: "(?:", close: ")*" }, + "@": { open: "(?:", close: ")" } + }; + var qmark = "[^/]"; + var star = qmark + "*?"; + var twoStarDot = "(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?"; + var twoStarNoDot = "(?:(?!(?:\\/|^)\\.).)*?"; + var reSpecials = charSet("().*{}+?[]^$\\!"); + function charSet(s) { + return s.split("").reduce(function(set, c) { + set[c] = true; + return set; + }, {}); + } + var slashSplit = /\/+/; + minimatch.filter = filter; + function filter(pattern, options) { + options = options || {}; + return function(p, i, list) { + return minimatch(p, pattern, options); + }; + } + function ext(a, b) { + a = a || {}; + b = b || {}; + var t = {}; + Object.keys(b).forEach(function(k) { + t[k] = b[k]; + }); + Object.keys(a).forEach(function(k) { + t[k] = a[k]; + }); + return t; + } + minimatch.defaults = function(def) { + if (!def || !Object.keys(def).length) + return minimatch; + var orig = minimatch; + var m = function minimatch2(p, pattern, options) { + return orig.minimatch(p, pattern, ext(def, options)); + }; + m.Minimatch = function Minimatch2(pattern, options) { + return new orig.Minimatch(pattern, ext(def, options)); + }; + return m; + }; + Minimatch.defaults = function(def) { + if (!def || !Object.keys(def).length) + return Minimatch; + return minimatch.defaults(def).Minimatch; + }; + function minimatch(p, pattern, options) { + if (typeof pattern !== "string") { + throw new TypeError("glob pattern string required"); + } + if (!options) + options = {}; + if (!options.nocomment && pattern.charAt(0) === "#") { + return false; + } + if (pattern.trim() === "") + return p === ""; + return new Minimatch(pattern, options).match(p); + } + function Minimatch(pattern, options) { + if (!(this instanceof Minimatch)) { + return new Minimatch(pattern, options); + } + if (typeof pattern !== "string") { + throw new TypeError("glob pattern string required"); + } + if (!options) + options = {}; + pattern = pattern.trim(); + if (path.sep !== "/") { + pattern = pattern.split(path.sep).join("/"); + } + this.options = options; + this.set = []; + this.pattern = pattern; + this.regexp = null; + this.negate = false; + this.comment = false; + this.empty = false; + this.make(); + } + Minimatch.prototype.debug = function() { + }; + Minimatch.prototype.make = make; + function make() { + if (this._made) + return; + var pattern = this.pattern; + var options = this.options; + if (!options.nocomment && pattern.charAt(0) === "#") { + this.comment = true; + return; + } + if (!pattern) { + this.empty = true; + return; + } + this.parseNegate(); + var set = this.globSet = this.braceExpand(); + if (options.debug) + this.debug = console.error; + this.debug(this.pattern, set); + set = this.globParts = set.map(function(s) { + return s.split(slashSplit); + }); + this.debug(this.pattern, set); + set = set.map(function(s, si, set2) { + return s.map(this.parse, this); + }, this); + this.debug(this.pattern, set); + set = set.filter(function(s) { + return s.indexOf(false) === -1; + }); + this.debug(this.pattern, set); + this.set = set; + } + Minimatch.prototype.parseNegate = parseNegate; + function parseNegate() { + var pattern = this.pattern; + var negate = false; + var options = this.options; + var negateOffset = 0; + if (options.nonegate) + return; + for (var i = 0, l = pattern.length; i < l && pattern.charAt(i) === "!"; i++) { + negate = !negate; + negateOffset++; + } + if (negateOffset) + this.pattern = pattern.substr(negateOffset); + this.negate = negate; + } + minimatch.braceExpand = function(pattern, options) { + return braceExpand(pattern, options); + }; + Minimatch.prototype.braceExpand = braceExpand; + function braceExpand(pattern, options) { + if (!options) { + if (this instanceof Minimatch) { + options = this.options; + } else { + options = {}; + } + } + pattern = typeof pattern === "undefined" ? this.pattern : pattern; + if (typeof pattern === "undefined") { + throw new TypeError("undefined pattern"); + } + if (options.nobrace || !pattern.match(/\{.*\}/)) { + return [pattern]; + } + return expand3(pattern); + } + Minimatch.prototype.parse = parse3; + var SUBPARSE = {}; + function parse3(pattern, isSub) { + if (pattern.length > 1024 * 64) { + throw new TypeError("pattern is too long"); + } + var options = this.options; + if (!options.noglobstar && pattern === "**") + return GLOBSTAR; + if (pattern === "") + return ""; + var re = ""; + var hasMagic = !!options.nocase; + var escaping = false; + var patternListStack = []; + var negativeLists = []; + var stateChar; + var inClass = false; + var reClassStart = -1; + var classStart = -1; + var patternStart = pattern.charAt(0) === "." ? "" : options.dot ? "(?!(?:^|\\/)\\.{1,2}(?:$|\\/))" : "(?!\\.)"; + var self2 = this; + function clearStateChar() { + if (stateChar) { + switch (stateChar) { + case "*": + re += star; + hasMagic = true; + break; + case "?": + re += qmark; + hasMagic = true; + break; + default: + re += "\\" + stateChar; + break; + } + self2.debug("clearStateChar %j %j", stateChar, re); + stateChar = false; + } + } + for (var i = 0, len = pattern.length, c; i < len && (c = pattern.charAt(i)); i++) { + this.debug("%s %s %s %j", pattern, i, re, c); + if (escaping && reSpecials[c]) { + re += "\\" + c; + escaping = false; + continue; + } + switch (c) { + case "/": + return false; + case "\\": + clearStateChar(); + escaping = true; + continue; + case "?": + case "*": + case "+": + case "@": + case "!": + this.debug("%s %s %s %j <-- stateChar", pattern, i, re, c); + if (inClass) { + this.debug(" in class"); + if (c === "!" && i === classStart + 1) + c = "^"; + re += c; + continue; + } + self2.debug("call clearStateChar %j", stateChar); + clearStateChar(); + stateChar = c; + if (options.noext) + clearStateChar(); + continue; + case "(": + if (inClass) { + re += "("; + continue; + } + if (!stateChar) { + re += "\\("; + continue; + } + patternListStack.push({ + type: stateChar, + start: i - 1, + reStart: re.length, + open: plTypes[stateChar].open, + close: plTypes[stateChar].close + }); + re += stateChar === "!" ? "(?:(?!(?:" : "(?:"; + this.debug("plType %j %j", stateChar, re); + stateChar = false; + continue; + case ")": + if (inClass || !patternListStack.length) { + re += "\\)"; + continue; + } + clearStateChar(); + hasMagic = true; + var pl = patternListStack.pop(); + re += pl.close; + if (pl.type === "!") { + negativeLists.push(pl); + } + pl.reEnd = re.length; + continue; + case "|": + if (inClass || !patternListStack.length || escaping) { + re += "\\|"; + escaping = false; + continue; + } + clearStateChar(); + re += "|"; + continue; + case "[": + clearStateChar(); + if (inClass) { + re += "\\" + c; + continue; + } + inClass = true; + classStart = i; + reClassStart = re.length; + re += c; + continue; + case "]": + if (i === classStart + 1 || !inClass) { + re += "\\" + c; + escaping = false; + continue; + } + if (inClass) { + var cs = pattern.substring(classStart + 1, i); + try { + RegExp("[" + cs + "]"); + } catch (er) { + var sp = this.parse(cs, SUBPARSE); + re = re.substr(0, reClassStart) + "\\[" + sp[0] + "\\]"; + hasMagic = hasMagic || sp[1]; + inClass = false; + continue; + } + } + hasMagic = true; + inClass = false; + re += c; + continue; + default: + clearStateChar(); + if (escaping) { + escaping = false; + } else if (reSpecials[c] && !(c === "^" && inClass)) { + re += "\\"; + } + re += c; + } + } + if (inClass) { + cs = pattern.substr(classStart + 1); + sp = this.parse(cs, SUBPARSE); + re = re.substr(0, reClassStart) + "\\[" + sp[0]; + hasMagic = hasMagic || sp[1]; + } + for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { + var tail = re.slice(pl.reStart + pl.open.length); + this.debug("setting tail", re, pl); + tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function(_, $1, $2) { + if (!$2) { + $2 = "\\"; + } + return $1 + $1 + $2 + "|"; + }); + this.debug("tail=%j\n %s", tail, tail, pl, re); + var t = pl.type === "*" ? star : pl.type === "?" ? qmark : "\\" + pl.type; + hasMagic = true; + re = re.slice(0, pl.reStart) + t + "\\(" + tail; + } + clearStateChar(); + if (escaping) { + re += "\\\\"; + } + var addPatternStart = false; + switch (re.charAt(0)) { + case ".": + case "[": + case "(": + addPatternStart = true; + } + for (var n = negativeLists.length - 1; n > -1; n--) { + var nl = negativeLists[n]; + var nlBefore = re.slice(0, nl.reStart); + var nlFirst = re.slice(nl.reStart, nl.reEnd - 8); + var nlLast = re.slice(nl.reEnd - 8, nl.reEnd); + var nlAfter = re.slice(nl.reEnd); + nlLast += nlAfter; + var openParensBefore = nlBefore.split("(").length - 1; + var cleanAfter = nlAfter; + for (i = 0; i < openParensBefore; i++) { + cleanAfter = cleanAfter.replace(/\)[+*?]?/, ""); + } + nlAfter = cleanAfter; + var dollar = ""; + if (nlAfter === "" && isSub !== SUBPARSE) { + dollar = "$"; + } + var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast; + re = newRe; + } + if (re !== "" && hasMagic) { + re = "(?=.)" + re; + } + if (addPatternStart) { + re = patternStart + re; + } + if (isSub === SUBPARSE) { + return [re, hasMagic]; + } + if (!hasMagic) { + return globUnescape(pattern); + } + var flags = options.nocase ? "i" : ""; + try { + var regExp = new RegExp("^" + re + "$", flags); + } catch (er) { + return new RegExp("$."); + } + regExp._glob = pattern; + regExp._src = re; + return regExp; + } + minimatch.makeRe = function(pattern, options) { + return new Minimatch(pattern, options || {}).makeRe(); + }; + Minimatch.prototype.makeRe = makeRe; + function makeRe() { + if (this.regexp || this.regexp === false) + return this.regexp; + var set = this.set; + if (!set.length) { + this.regexp = false; + return this.regexp; + } + var options = this.options; + var twoStar = options.noglobstar ? star : options.dot ? twoStarDot : twoStarNoDot; + var flags = options.nocase ? "i" : ""; + var re = set.map(function(pattern) { + return pattern.map(function(p) { + return p === GLOBSTAR ? twoStar : typeof p === "string" ? regExpEscape(p) : p._src; + }).join("\\/"); + }).join("|"); + re = "^(?:" + re + ")$"; + if (this.negate) + re = "^(?!" + re + ").*$"; + try { + this.regexp = new RegExp(re, flags); + } catch (ex) { + this.regexp = false; + } + return this.regexp; + } + minimatch.match = function(list, pattern, options) { + options = options || {}; + var mm = new Minimatch(pattern, options); + list = list.filter(function(f) { + return mm.match(f); + }); + if (mm.options.nonull && !list.length) { + list.push(pattern); + } + return list; + }; + Minimatch.prototype.match = match; + function match(f, partial) { + this.debug("match", f, this.pattern); + if (this.comment) + return false; + if (this.empty) + return f === ""; + if (f === "/" && partial) + return true; + var options = this.options; + if (path.sep !== "/") { + f = f.split(path.sep).join("/"); + } + f = f.split(slashSplit); + this.debug(this.pattern, "split", f); + var set = this.set; + this.debug(this.pattern, "set", set); + var filename; + var i; + for (i = f.length - 1; i >= 0; i--) { + filename = f[i]; + if (filename) + break; + } + for (i = 0; i < set.length; i++) { + var pattern = set[i]; + var file = f; + if (options.matchBase && pattern.length === 1) { + file = [filename]; + } + var hit = this.matchOne(file, pattern, partial); + if (hit) { + if (options.flipNegate) + return true; + return !this.negate; + } + } + if (options.flipNegate) + return false; + return this.negate; + } + Minimatch.prototype.matchOne = function(file, pattern, partial) { + var options = this.options; + this.debug( + "matchOne", + { "this": this, file, pattern } + ); + this.debug("matchOne", file.length, pattern.length); + for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length; fi < fl && pi < pl; fi++, pi++) { + this.debug("matchOne loop"); + var p = pattern[pi]; + var f = file[fi]; + this.debug(pattern, p, f); + if (p === false) + return false; + if (p === GLOBSTAR) { + this.debug("GLOBSTAR", [pattern, p, f]); + var fr = fi; + var pr = pi + 1; + if (pr === pl) { + this.debug("** at the end"); + for (; fi < fl; fi++) { + if (file[fi] === "." || file[fi] === ".." || !options.dot && file[fi].charAt(0) === ".") + return false; + } + return true; + } + while (fr < fl) { + var swallowee = file[fr]; + this.debug("\nglobstar while", file, fr, pattern, pr, swallowee); + if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { + this.debug("globstar found match!", fr, fl, swallowee); + return true; + } else { + if (swallowee === "." || swallowee === ".." || !options.dot && swallowee.charAt(0) === ".") { + this.debug("dot detected!", file, fr, pattern, pr); + break; + } + this.debug("globstar swallow a segment, and continue"); + fr++; + } + } + if (partial) { + this.debug("\n>>> no match, partial?", file, fr, pattern, pr); + if (fr === fl) + return true; + } + return false; + } + var hit; + if (typeof p === "string") { + if (options.nocase) { + hit = f.toLowerCase() === p.toLowerCase(); + } else { + hit = f === p; + } + this.debug("string match", p, f, hit); + } else { + hit = f.match(p); + this.debug("pattern match", p, f, hit); + } + if (!hit) + return false; + } + if (fi === fl && pi === pl) { + return true; + } else if (fi === fl) { + return partial; + } else if (pi === pl) { + var emptyFileEnd = fi === fl - 1 && file[fi] === ""; + return emptyFileEnd; + } + throw new Error("wtf?"); + }; + function globUnescape(s) { + return s.replace(/\\(.)/g, "$1"); + } + function regExpEscape(s) { + return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); + } + }, + function(module2, exports2, __webpack_require__) { + var wrappy = __webpack_require__(123); + module2.exports = wrappy(once); + module2.exports.strict = wrappy(onceStrict); + once.proto = once(function() { + Object.defineProperty(Function.prototype, "once", { + value: function() { + return once(this); + }, + configurable: true + }); + Object.defineProperty(Function.prototype, "onceStrict", { + value: function() { + return onceStrict(this); + }, + configurable: true + }); + }); + function once(fn) { + var f = function() { + if (f.called) + return f.value; + f.called = true; + return f.value = fn.apply(this, arguments); + }; + f.called = false; + return f; + } + function onceStrict(fn) { + var f = function() { + if (f.called) + throw new Error(f.onceError); + f.called = true; + return f.value = fn.apply(this, arguments); + }; + var name = fn.name || "Function wrapped with `once`"; + f.onceError = name + " shouldn't be called more than once"; + f.called = false; + return f; + } + }, + , + function(module2, exports2) { + module2.exports = __require("buffer"); + }, + , + , + , + function(module2, exports2) { + module2.exports = function(it) { + if (it == void 0) + throw TypeError("Can't call method on " + it); + return it; + }; + }, + function(module2, exports2, __webpack_require__) { + var isObject = __webpack_require__(34); + var document2 = __webpack_require__(11).document; + var is = isObject(document2) && isObject(document2.createElement); + module2.exports = function(it) { + return is ? document2.createElement(it) : {}; + }; + }, + function(module2, exports2) { + module2.exports = true; + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + var aFunction = __webpack_require__(46); + function PromiseCapability(C) { + var resolve, reject; + this.promise = new C(function($$resolve, $$reject) { + if (resolve !== void 0 || reject !== void 0) + throw TypeError("Bad Promise constructor"); + resolve = $$resolve; + reject = $$reject; + }); + this.resolve = aFunction(resolve); + this.reject = aFunction(reject); + } + module2.exports.f = function(C) { + return new PromiseCapability(C); + }; + }, + function(module2, exports2, __webpack_require__) { + var def = __webpack_require__(50).f; + var has = __webpack_require__(49); + var TAG = __webpack_require__(13)("toStringTag"); + module2.exports = function(it, tag, stat) { + if (it && !has(it = stat ? it : it.prototype, TAG)) + def(it, TAG, { configurable: true, value: tag }); + }; + }, + function(module2, exports2, __webpack_require__) { + var shared = __webpack_require__(107)("keys"); + var uid = __webpack_require__(111); + module2.exports = function(key) { + return shared[key] || (shared[key] = uid(key)); + }; + }, + function(module2, exports2) { + var ceil = Math.ceil; + var floor = Math.floor; + module2.exports = function(it) { + return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); + }; + }, + function(module2, exports2, __webpack_require__) { + var IObject = __webpack_require__(131); + var defined = __webpack_require__(67); + module2.exports = function(it) { + return IObject(defined(it)); + }; + }, + function(module2, exports2, __webpack_require__) { + module2.exports = glob; + var fs = __webpack_require__(3); + var rp = __webpack_require__(114); + var minimatch = __webpack_require__(60); + var Minimatch = minimatch.Minimatch; + var inherits = __webpack_require__(42); + var EE = __webpack_require__(54).EventEmitter; + var path = __webpack_require__(0); + var assert2 = __webpack_require__(22); + var isAbsolute = __webpack_require__(76); + var globSync = __webpack_require__(218); + var common = __webpack_require__(115); + var alphasort = common.alphasort; + var alphasorti = common.alphasorti; + var setopts = common.setopts; + var ownProp = common.ownProp; + var inflight = __webpack_require__(223); + var util = __webpack_require__(2); + var childrenIgnored = common.childrenIgnored; + var isIgnored = common.isIgnored; + var once = __webpack_require__(61); + function glob(pattern, options, cb) { + if (typeof options === "function") + cb = options, options = {}; + if (!options) + options = {}; + if (options.sync) { + if (cb) + throw new TypeError("callback provided to sync glob"); + return globSync(pattern, options); + } + return new Glob(pattern, options, cb); + } + glob.sync = globSync; + var GlobSync = glob.GlobSync = globSync.GlobSync; + glob.glob = glob; + function extend(origin, add) { + if (add === null || typeof add !== "object") { + return origin; + } + var keys = Object.keys(add); + var i = keys.length; + while (i--) { + origin[keys[i]] = add[keys[i]]; + } + return origin; + } + glob.hasMagic = function(pattern, options_) { + var options = extend({}, options_); + options.noprocess = true; + var g = new Glob(pattern, options); + var set = g.minimatch.set; + if (!pattern) + return false; + if (set.length > 1) + return true; + for (var j = 0; j < set[0].length; j++) { + if (typeof set[0][j] !== "string") + return true; + } + return false; + }; + glob.Glob = Glob; + inherits(Glob, EE); + function Glob(pattern, options, cb) { + if (typeof options === "function") { + cb = options; + options = null; + } + if (options && options.sync) { + if (cb) + throw new TypeError("callback provided to sync glob"); + return new GlobSync(pattern, options); + } + if (!(this instanceof Glob)) + return new Glob(pattern, options, cb); + setopts(this, pattern, options); + this._didRealPath = false; + var n = this.minimatch.set.length; + this.matches = new Array(n); + if (typeof cb === "function") { + cb = once(cb); + this.on("error", cb); + this.on("end", function(matches) { + cb(null, matches); + }); + } + var self2 = this; + this._processing = 0; + this._emitQueue = []; + this._processQueue = []; + this.paused = false; + if (this.noprocess) + return this; + if (n === 0) + return done(); + var sync = true; + for (var i = 0; i < n; i++) { + this._process(this.minimatch.set[i], i, false, done); + } + sync = false; + function done() { + --self2._processing; + if (self2._processing <= 0) { + if (sync) { + process.nextTick(function() { + self2._finish(); + }); + } else { + self2._finish(); + } + } + } + } + Glob.prototype._finish = function() { + assert2(this instanceof Glob); + if (this.aborted) + return; + if (this.realpath && !this._didRealpath) + return this._realpath(); + common.finish(this); + this.emit("end", this.found); + }; + Glob.prototype._realpath = function() { + if (this._didRealpath) + return; + this._didRealpath = true; + var n = this.matches.length; + if (n === 0) + return this._finish(); + var self2 = this; + for (var i = 0; i < this.matches.length; i++) + this._realpathSet(i, next); + function next() { + if (--n === 0) + self2._finish(); + } + }; + Glob.prototype._realpathSet = function(index, cb) { + var matchset = this.matches[index]; + if (!matchset) + return cb(); + var found = Object.keys(matchset); + var self2 = this; + var n = found.length; + if (n === 0) + return cb(); + var set = this.matches[index] = /* @__PURE__ */ Object.create(null); + found.forEach(function(p, i) { + p = self2._makeAbs(p); + rp.realpath(p, self2.realpathCache, function(er, real) { + if (!er) + set[real] = true; + else if (er.syscall === "stat") + set[p] = true; + else + self2.emit("error", er); + if (--n === 0) { + self2.matches[index] = set; + cb(); + } + }); + }); + }; + Glob.prototype._mark = function(p) { + return common.mark(this, p); + }; + Glob.prototype._makeAbs = function(f) { + return common.makeAbs(this, f); + }; + Glob.prototype.abort = function() { + this.aborted = true; + this.emit("abort"); + }; + Glob.prototype.pause = function() { + if (!this.paused) { + this.paused = true; + this.emit("pause"); + } + }; + Glob.prototype.resume = function() { + if (this.paused) { + this.emit("resume"); + this.paused = false; + if (this._emitQueue.length) { + var eq = this._emitQueue.slice(0); + this._emitQueue.length = 0; + for (var i = 0; i < eq.length; i++) { + var e = eq[i]; + this._emitMatch(e[0], e[1]); + } + } + if (this._processQueue.length) { + var pq = this._processQueue.slice(0); + this._processQueue.length = 0; + for (var i = 0; i < pq.length; i++) { + var p = pq[i]; + this._processing--; + this._process(p[0], p[1], p[2], p[3]); + } + } + } + }; + Glob.prototype._process = function(pattern, index, inGlobStar, cb) { + assert2(this instanceof Glob); + assert2(typeof cb === "function"); + if (this.aborted) + return; + this._processing++; + if (this.paused) { + this._processQueue.push([pattern, index, inGlobStar, cb]); + return; + } + var n = 0; + while (typeof pattern[n] === "string") { + n++; + } + var prefix; + switch (n) { + case pattern.length: + this._processSimple(pattern.join("/"), index, cb); + return; + case 0: + prefix = null; + break; + default: + prefix = pattern.slice(0, n).join("/"); + break; + } + var remain = pattern.slice(n); + var read; + if (prefix === null) + read = "."; + else if (isAbsolute(prefix) || isAbsolute(pattern.join("/"))) { + if (!prefix || !isAbsolute(prefix)) + prefix = "/" + prefix; + read = prefix; + } else + read = prefix; + var abs = this._makeAbs(read); + if (childrenIgnored(this, read)) + return cb(); + var isGlobStar = remain[0] === minimatch.GLOBSTAR; + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb); + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb); + }; + Glob.prototype._processReaddir = function(prefix, read, abs, remain, index, inGlobStar, cb) { + var self2 = this; + this._readdir(abs, inGlobStar, function(er, entries) { + return self2._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb); + }); + }; + Glob.prototype._processReaddir2 = function(prefix, read, abs, remain, index, inGlobStar, entries, cb) { + if (!entries) + return cb(); + var pn = remain[0]; + var negate = !!this.minimatch.negate; + var rawGlob = pn._glob; + var dotOk = this.dot || rawGlob.charAt(0) === "."; + var matchedEntries = []; + for (var i = 0; i < entries.length; i++) { + var e = entries[i]; + if (e.charAt(0) !== "." || dotOk) { + var m; + if (negate && !prefix) { + m = !e.match(pn); + } else { + m = e.match(pn); + } + if (m) + matchedEntries.push(e); + } + } + var len = matchedEntries.length; + if (len === 0) + return cb(); + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = /* @__PURE__ */ Object.create(null); + for (var i = 0; i < len; i++) { + var e = matchedEntries[i]; + if (prefix) { + if (prefix !== "/") + e = prefix + "/" + e; + else + e = prefix + e; + } + if (e.charAt(0) === "/" && !this.nomount) { + e = path.join(this.root, e); + } + this._emitMatch(index, e); + } + return cb(); + } + remain.shift(); + for (var i = 0; i < len; i++) { + var e = matchedEntries[i]; + var newPattern; + if (prefix) { + if (prefix !== "/") + e = prefix + "/" + e; + else + e = prefix + e; + } + this._process([e].concat(remain), index, inGlobStar, cb); + } + cb(); + }; + Glob.prototype._emitMatch = function(index, e) { + if (this.aborted) + return; + if (isIgnored(this, e)) + return; + if (this.paused) { + this._emitQueue.push([index, e]); + return; + } + var abs = isAbsolute(e) ? e : this._makeAbs(e); + if (this.mark) + e = this._mark(e); + if (this.absolute) + e = abs; + if (this.matches[index][e]) + return; + if (this.nodir) { + var c = this.cache[abs]; + if (c === "DIR" || Array.isArray(c)) + return; + } + this.matches[index][e] = true; + var st = this.statCache[abs]; + if (st) + this.emit("stat", e, st); + this.emit("match", e); + }; + Glob.prototype._readdirInGlobStar = function(abs, cb) { + if (this.aborted) + return; + if (this.follow) + return this._readdir(abs, false, cb); + var lstatkey = "lstat\0" + abs; + var self2 = this; + var lstatcb = inflight(lstatkey, lstatcb_); + if (lstatcb) + fs.lstat(abs, lstatcb); + function lstatcb_(er, lstat) { + if (er && er.code === "ENOENT") + return cb(); + var isSym = lstat && lstat.isSymbolicLink(); + self2.symlinks[abs] = isSym; + if (!isSym && lstat && !lstat.isDirectory()) { + self2.cache[abs] = "FILE"; + cb(); + } else + self2._readdir(abs, false, cb); + } + }; + Glob.prototype._readdir = function(abs, inGlobStar, cb) { + if (this.aborted) + return; + cb = inflight("readdir\0" + abs + "\0" + inGlobStar, cb); + if (!cb) + return; + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs, cb); + if (ownProp(this.cache, abs)) { + var c = this.cache[abs]; + if (!c || c === "FILE") + return cb(); + if (Array.isArray(c)) + return cb(null, c); + } + var self2 = this; + fs.readdir(abs, readdirCb(this, abs, cb)); + }; + function readdirCb(self2, abs, cb) { + return function(er, entries) { + if (er) + self2._readdirError(abs, er, cb); + else + self2._readdirEntries(abs, entries, cb); + }; + } + Glob.prototype._readdirEntries = function(abs, entries, cb) { + if (this.aborted) + return; + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i++) { + var e = entries[i]; + if (abs === "/") + e = abs + e; + else + e = abs + "/" + e; + this.cache[e] = true; + } + } + this.cache[abs] = entries; + return cb(null, entries); + }; + Glob.prototype._readdirError = function(f, er, cb) { + if (this.aborted) + return; + switch (er.code) { + case "ENOTSUP": + case "ENOTDIR": + var abs = this._makeAbs(f); + this.cache[abs] = "FILE"; + if (abs === this.cwdAbs) { + var error = new Error(er.code + " invalid cwd " + this.cwd); + error.path = this.cwd; + error.code = er.code; + this.emit("error", error); + this.abort(); + } + break; + case "ENOENT": + case "ELOOP": + case "ENAMETOOLONG": + case "UNKNOWN": + this.cache[this._makeAbs(f)] = false; + break; + default: + this.cache[this._makeAbs(f)] = false; + if (this.strict) { + this.emit("error", er); + this.abort(); + } + if (!this.silent) + console.error("glob error", er); + break; + } + return cb(); + }; + Glob.prototype._processGlobStar = function(prefix, read, abs, remain, index, inGlobStar, cb) { + var self2 = this; + this._readdir(abs, inGlobStar, function(er, entries) { + self2._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb); + }); + }; + Glob.prototype._processGlobStar2 = function(prefix, read, abs, remain, index, inGlobStar, entries, cb) { + if (!entries) + return cb(); + var remainWithoutGlobStar = remain.slice(1); + var gspref = prefix ? [prefix] : []; + var noGlobStar = gspref.concat(remainWithoutGlobStar); + this._process(noGlobStar, index, false, cb); + var isSym = this.symlinks[abs]; + var len = entries.length; + if (isSym && inGlobStar) + return cb(); + for (var i = 0; i < len; i++) { + var e = entries[i]; + if (e.charAt(0) === "." && !this.dot) + continue; + var instead = gspref.concat(entries[i], remainWithoutGlobStar); + this._process(instead, index, true, cb); + var below = gspref.concat(entries[i], remain); + this._process(below, index, true, cb); + } + cb(); + }; + Glob.prototype._processSimple = function(prefix, index, cb) { + var self2 = this; + this._stat(prefix, function(er, exists) { + self2._processSimple2(prefix, index, er, exists, cb); + }); + }; + Glob.prototype._processSimple2 = function(prefix, index, er, exists, cb) { + if (!this.matches[index]) + this.matches[index] = /* @__PURE__ */ Object.create(null); + if (!exists) + return cb(); + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix); + if (prefix.charAt(0) === "/") { + prefix = path.join(this.root, prefix); + } else { + prefix = path.resolve(this.root, prefix); + if (trail) + prefix += "/"; + } + } + if (process.platform === "win32") + prefix = prefix.replace(/\\/g, "/"); + this._emitMatch(index, prefix); + cb(); + }; + Glob.prototype._stat = function(f, cb) { + var abs = this._makeAbs(f); + var needDir = f.slice(-1) === "/"; + if (f.length > this.maxLength) + return cb(); + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs]; + if (Array.isArray(c)) + c = "DIR"; + if (!needDir || c === "DIR") + return cb(null, c); + if (needDir && c === "FILE") + return cb(); + } + var exists; + var stat = this.statCache[abs]; + if (stat !== void 0) { + if (stat === false) + return cb(null, stat); + else { + var type = stat.isDirectory() ? "DIR" : "FILE"; + if (needDir && type === "FILE") + return cb(); + else + return cb(null, type, stat); + } + } + var self2 = this; + var statcb = inflight("stat\0" + abs, lstatcb_); + if (statcb) + fs.lstat(abs, statcb); + function lstatcb_(er, lstat) { + if (lstat && lstat.isSymbolicLink()) { + return fs.stat(abs, function(er2, stat2) { + if (er2) + self2._stat2(f, abs, null, lstat, cb); + else + self2._stat2(f, abs, er2, stat2, cb); + }); + } else { + self2._stat2(f, abs, er, lstat, cb); + } + } + }; + Glob.prototype._stat2 = function(f, abs, er, stat, cb) { + if (er && (er.code === "ENOENT" || er.code === "ENOTDIR")) { + this.statCache[abs] = false; + return cb(); + } + var needDir = f.slice(-1) === "/"; + this.statCache[abs] = stat; + if (abs.slice(-1) === "/" && stat && !stat.isDirectory()) + return cb(null, false, stat); + var c = true; + if (stat) + c = stat.isDirectory() ? "DIR" : "FILE"; + this.cache[abs] = this.cache[abs] || c; + if (needDir && c === "FILE") + return cb(); + return cb(null, c, stat); + }; + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + function posix(path) { + return path.charAt(0) === "/"; + } + function win32(path) { + var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; + var result = splitDeviceRe.exec(path); + var device = result[1] || ""; + var isUnc = Boolean(device && device.charAt(1) !== ":"); + return Boolean(result[2] || isUnc); + } + module2.exports = process.platform === "win32" ? win32 : posix; + module2.exports.posix = posix; + module2.exports.win32 = win32; + }, + , + , + function(module2, exports2) { + module2.exports = __require("tty"); + }, + , + function(module2, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + exports2.default = function(str, fileLoc = "lockfile") { + str = (0, (_stripBom || _load_stripBom()).default)(str); + return hasMergeConflicts(str) ? parseWithConflict(str, fileLoc) : { type: "success", object: parse3(str, fileLoc) }; + }; + var _util; + function _load_util() { + return _util = _interopRequireDefault(__webpack_require__(2)); + } + var _invariant; + function _load_invariant() { + return _invariant = _interopRequireDefault(__webpack_require__(7)); + } + var _stripBom; + function _load_stripBom() { + return _stripBom = _interopRequireDefault(__webpack_require__(122)); + } + var _constants; + function _load_constants() { + return _constants = __webpack_require__(6); + } + var _errors; + function _load_errors() { + return _errors = __webpack_require__(4); + } + var _map; + function _load_map() { + return _map = _interopRequireDefault(__webpack_require__(20)); + } + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { default: obj }; + } + const VERSION_REGEX = /^yarn lockfile v(\d+)$/; + const TOKEN_TYPES = { + boolean: "BOOLEAN", + string: "STRING", + identifier: "IDENTIFIER", + eof: "EOF", + colon: "COLON", + newline: "NEWLINE", + comment: "COMMENT", + indent: "INDENT", + invalid: "INVALID", + number: "NUMBER", + comma: "COMMA" + }; + const VALID_PROP_VALUE_TOKENS = [TOKEN_TYPES.boolean, TOKEN_TYPES.string, TOKEN_TYPES.number]; + function isValidPropValueToken(token) { + return VALID_PROP_VALUE_TOKENS.indexOf(token.type) >= 0; + } + function* tokenise(input) { + let lastNewline = false; + let line = 1; + let col = 0; + function buildToken(type, value) { + return { line, col, type, value }; + } + while (input.length) { + let chop = 0; + if (input[0] === "\n" || input[0] === "\r") { + chop++; + if (input[1] === "\n") { + chop++; + } + line++; + col = 0; + yield buildToken(TOKEN_TYPES.newline); + } else if (input[0] === "#") { + chop++; + let val = ""; + while (input[chop] !== "\n") { + val += input[chop]; + chop++; + } + yield buildToken(TOKEN_TYPES.comment, val); + } else if (input[0] === " ") { + if (lastNewline) { + let indent = ""; + for (let i = 0; input[i] === " "; i++) { + indent += input[i]; + } + if (indent.length % 2) { + throw new TypeError("Invalid number of spaces"); + } else { + chop = indent.length; + yield buildToken(TOKEN_TYPES.indent, indent.length / 2); + } + } else { + chop++; + } + } else if (input[0] === '"') { + let val = ""; + for (let i = 0; ; i++) { + const currentChar = input[i]; + val += currentChar; + if (i > 0 && currentChar === '"') { + const isEscaped = input[i - 1] === "\\" && input[i - 2] !== "\\"; + if (!isEscaped) { + break; + } + } + } + chop = val.length; + try { + yield buildToken(TOKEN_TYPES.string, JSON.parse(val)); + } catch (err) { + if (err instanceof SyntaxError) { + yield buildToken(TOKEN_TYPES.invalid); + } else { + throw err; + } + } + } else if (/^[0-9]/.test(input)) { + let val = ""; + for (let i = 0; /^[0-9]$/.test(input[i]); i++) { + val += input[i]; + } + chop = val.length; + yield buildToken(TOKEN_TYPES.number, +val); + } else if (/^true/.test(input)) { + yield buildToken(TOKEN_TYPES.boolean, true); + chop = 4; + } else if (/^false/.test(input)) { + yield buildToken(TOKEN_TYPES.boolean, false); + chop = 5; + } else if (input[0] === ":") { + yield buildToken(TOKEN_TYPES.colon); + chop++; + } else if (input[0] === ",") { + yield buildToken(TOKEN_TYPES.comma); + chop++; + } else if (/^[a-zA-Z\/-]/g.test(input)) { + let name = ""; + for (let i = 0; i < input.length; i++) { + const char = input[i]; + if (char === ":" || char === " " || char === "\n" || char === "\r" || char === ",") { + break; + } else { + name += char; + } + } + chop = name.length; + yield buildToken(TOKEN_TYPES.string, name); + } else { + yield buildToken(TOKEN_TYPES.invalid); + } + if (!chop) { + yield buildToken(TOKEN_TYPES.invalid); + } + col += chop; + lastNewline = input[0] === "\n" || input[0] === "\r" && input[1] === "\n"; + input = input.slice(chop); + } + yield buildToken(TOKEN_TYPES.eof); + } + class Parser { + constructor(input, fileLoc = "lockfile") { + this.comments = []; + this.tokens = tokenise(input); + this.fileLoc = fileLoc; + } + onComment(token) { + const value = token.value; + (0, (_invariant || _load_invariant()).default)(typeof value === "string", "expected token value to be a string"); + const comment = value.trim(); + const versionMatch = comment.match(VERSION_REGEX); + if (versionMatch) { + const version = +versionMatch[1]; + if (version > (_constants || _load_constants()).LOCKFILE_VERSION) { + throw new (_errors || _load_errors()).MessageError(`Can't install from a lockfile of version ${version} as you're on an old yarn version that only supports versions up to ${(_constants || _load_constants()).LOCKFILE_VERSION}. Run \`$ yarn self-update\` to upgrade to the latest version.`); + } + } + this.comments.push(comment); + } + next() { + const item = this.tokens.next(); + (0, (_invariant || _load_invariant()).default)(item, "expected a token"); + const done = item.done, value = item.value; + if (done || !value) { + throw new Error("No more tokens"); + } else if (value.type === TOKEN_TYPES.comment) { + this.onComment(value); + return this.next(); + } else { + return this.token = value; + } + } + unexpected(msg = "Unexpected token") { + throw new SyntaxError(`${msg} ${this.token.line}:${this.token.col} in ${this.fileLoc}`); + } + expect(tokType) { + if (this.token.type === tokType) { + this.next(); + } else { + this.unexpected(); + } + } + eat(tokType) { + if (this.token.type === tokType) { + this.next(); + return true; + } else { + return false; + } + } + parse(indent = 0) { + const obj = (0, (_map || _load_map()).default)(); + while (true) { + const propToken = this.token; + if (propToken.type === TOKEN_TYPES.newline) { + const nextToken = this.next(); + if (!indent) { + continue; + } + if (nextToken.type !== TOKEN_TYPES.indent) { + break; + } + if (nextToken.value === indent) { + this.next(); + } else { + break; + } + } else if (propToken.type === TOKEN_TYPES.indent) { + if (propToken.value === indent) { + this.next(); + } else { + break; + } + } else if (propToken.type === TOKEN_TYPES.eof) { + break; + } else if (propToken.type === TOKEN_TYPES.string) { + const key = propToken.value; + (0, (_invariant || _load_invariant()).default)(key, "Expected a key"); + const keys = [key]; + this.next(); + while (this.token.type === TOKEN_TYPES.comma) { + this.next(); + const keyToken = this.token; + if (keyToken.type !== TOKEN_TYPES.string) { + this.unexpected("Expected string"); + } + const key2 = keyToken.value; + (0, (_invariant || _load_invariant()).default)(key2, "Expected a key"); + keys.push(key2); + this.next(); + } + const valToken = this.token; + if (valToken.type === TOKEN_TYPES.colon) { + this.next(); + const val = this.parse(indent + 1); + for (var _iterator = keys, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator](); ; ) { + var _ref; + if (_isArray) { + if (_i >= _iterator.length) + break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) + break; + _ref = _i.value; + } + const key2 = _ref; + obj[key2] = val; + } + if (indent && this.token.type !== TOKEN_TYPES.indent) { + break; + } + } else if (isValidPropValueToken(valToken)) { + for (var _iterator2 = keys, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator](); ; ) { + var _ref2; + if (_isArray2) { + if (_i2 >= _iterator2.length) + break; + _ref2 = _iterator2[_i2++]; + } else { + _i2 = _iterator2.next(); + if (_i2.done) + break; + _ref2 = _i2.value; + } + const key2 = _ref2; + obj[key2] = valToken.value; + } + this.next(); + } else { + this.unexpected("Invalid value type"); + } + } else { + this.unexpected(`Unknown token: ${(_util || _load_util()).default.inspect(propToken)}`); + } + } + return obj; + } + } + const MERGE_CONFLICT_ANCESTOR = "|||||||"; + const MERGE_CONFLICT_END = ">>>>>>>"; + const MERGE_CONFLICT_SEP = "======="; + const MERGE_CONFLICT_START = "<<<<<<<"; + function extractConflictVariants(str) { + const variants = [[], []]; + const lines = str.split(/\r?\n/g); + let skip = false; + while (lines.length) { + const line = lines.shift(); + if (line.startsWith(MERGE_CONFLICT_START)) { + while (lines.length) { + const conflictLine = lines.shift(); + if (conflictLine === MERGE_CONFLICT_SEP) { + skip = false; + break; + } else if (skip || conflictLine.startsWith(MERGE_CONFLICT_ANCESTOR)) { + skip = true; + continue; + } else { + variants[0].push(conflictLine); + } + } + while (lines.length) { + const conflictLine = lines.shift(); + if (conflictLine.startsWith(MERGE_CONFLICT_END)) { + break; + } else { + variants[1].push(conflictLine); + } + } + } else { + variants[0].push(line); + variants[1].push(line); + } + } + return [variants[0].join("\n"), variants[1].join("\n")]; + } + function hasMergeConflicts(str) { + return str.includes(MERGE_CONFLICT_START) && str.includes(MERGE_CONFLICT_SEP) && str.includes(MERGE_CONFLICT_END); + } + function parse3(str, fileLoc) { + const parser = new Parser(str, fileLoc); + parser.next(); + return parser.parse(); + } + function parseWithConflict(str, fileLoc) { + const variants = extractConflictVariants(str); + try { + return { type: "merge", object: Object.assign({}, parse3(variants[0], fileLoc), parse3(variants[1], fileLoc)) }; + } catch (err) { + if (err instanceof SyntaxError) { + return { type: "conflict", object: {} }; + } else { + throw err; + } + } + } + }, + , + , + function(module2, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + var _map; + function _load_map() { + return _map = _interopRequireDefault(__webpack_require__(20)); + } + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { default: obj }; + } + const debug = __webpack_require__(212)("yarn"); + class BlockingQueue { + constructor(alias, maxConcurrency = Infinity) { + this.concurrencyQueue = []; + this.maxConcurrency = maxConcurrency; + this.runningCount = 0; + this.warnedStuck = false; + this.alias = alias; + this.first = true; + this.running = (0, (_map || _load_map()).default)(); + this.queue = (0, (_map || _load_map()).default)(); + this.stuckTick = this.stuckTick.bind(this); + } + stillActive() { + if (this.stuckTimer) { + clearTimeout(this.stuckTimer); + } + this.stuckTimer = setTimeout(this.stuckTick, 5e3); + this.stuckTimer.unref && this.stuckTimer.unref(); + } + stuckTick() { + if (this.runningCount === 1) { + this.warnedStuck = true; + debug(`The ${JSON.stringify(this.alias)} blocking queue may be stuck. 5 seconds without any activity with 1 worker: ${Object.keys(this.running)[0]}`); + } + } + push(key, factory) { + if (this.first) { + this.first = false; + } else { + this.stillActive(); + } + return new Promise((resolve, reject) => { + const queue = this.queue[key] = this.queue[key] || []; + queue.push({ factory, resolve, reject }); + if (!this.running[key]) { + this.shift(key); + } + }); + } + shift(key) { + if (this.running[key]) { + delete this.running[key]; + this.runningCount--; + if (this.stuckTimer) { + clearTimeout(this.stuckTimer); + this.stuckTimer = null; + } + if (this.warnedStuck) { + this.warnedStuck = false; + debug(`${JSON.stringify(this.alias)} blocking queue finally resolved. Nothing to worry about.`); + } + } + const queue = this.queue[key]; + if (!queue) { + return; + } + var _queue$shift = queue.shift(); + const resolve = _queue$shift.resolve, reject = _queue$shift.reject, factory = _queue$shift.factory; + if (!queue.length) { + delete this.queue[key]; + } + const next = () => { + this.shift(key); + this.shiftConcurrencyQueue(); + }; + const run = () => { + this.running[key] = true; + this.runningCount++; + factory().then(function(val) { + resolve(val); + next(); + return null; + }).catch(function(err) { + reject(err); + next(); + }); + }; + this.maybePushConcurrencyQueue(run); + } + maybePushConcurrencyQueue(run) { + if (this.runningCount < this.maxConcurrency) { + run(); + } else { + this.concurrencyQueue.push(run); + } + } + shiftConcurrencyQueue() { + if (this.runningCount < this.maxConcurrency) { + const fn = this.concurrencyQueue.shift(); + if (fn) { + fn(); + } + } + } + } + exports2.default = BlockingQueue; + }, + function(module2, exports2) { + module2.exports = function(exec) { + try { + return !!exec(); + } catch (e) { + return true; + } + }; + }, + , + , + , + , + , + , + , + , + , + , + , + , + , + , + function(module2, exports2, __webpack_require__) { + var cof = __webpack_require__(47); + var TAG = __webpack_require__(13)("toStringTag"); + var ARG = cof(function() { + return arguments; + }()) == "Arguments"; + var tryGet = function(it, key) { + try { + return it[key]; + } catch (e) { + } + }; + module2.exports = function(it) { + var O, T, B; + return it === void 0 ? "Undefined" : it === null ? "Null" : typeof (T = tryGet(O = Object(it), TAG)) == "string" ? T : ARG ? cof(O) : (B = cof(O)) == "Object" && typeof O.callee == "function" ? "Arguments" : B; + }; + }, + function(module2, exports2) { + module2.exports = "constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","); + }, + function(module2, exports2, __webpack_require__) { + var document2 = __webpack_require__(11).document; + module2.exports = document2 && document2.documentElement; + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + var LIBRARY = __webpack_require__(69); + var $export = __webpack_require__(41); + var redefine = __webpack_require__(197); + var hide = __webpack_require__(31); + var Iterators = __webpack_require__(35); + var $iterCreate = __webpack_require__(188); + var setToStringTag = __webpack_require__(71); + var getPrototypeOf = __webpack_require__(194); + var ITERATOR = __webpack_require__(13)("iterator"); + var BUGGY = !([].keys && "next" in [].keys()); + var FF_ITERATOR = "@@iterator"; + var KEYS = "keys"; + var VALUES = "values"; + var returnThis = function() { + return this; + }; + module2.exports = function(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) { + $iterCreate(Constructor, NAME, next); + var getMethod = function(kind) { + if (!BUGGY && kind in proto2) + return proto2[kind]; + switch (kind) { + case KEYS: + return function keys() { + return new Constructor(this, kind); + }; + case VALUES: + return function values() { + return new Constructor(this, kind); + }; + } + return function entries() { + return new Constructor(this, kind); + }; + }; + var TAG = NAME + " Iterator"; + var DEF_VALUES = DEFAULT == VALUES; + var VALUES_BUG = false; + var proto2 = Base.prototype; + var $native = proto2[ITERATOR] || proto2[FF_ITERATOR] || DEFAULT && proto2[DEFAULT]; + var $default = $native || getMethod(DEFAULT); + var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod("entries") : void 0; + var $anyNative = NAME == "Array" ? proto2.entries || $native : $native; + var methods, key, IteratorPrototype; + if ($anyNative) { + IteratorPrototype = getPrototypeOf($anyNative.call(new Base())); + if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) { + setToStringTag(IteratorPrototype, TAG, true); + if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != "function") + hide(IteratorPrototype, ITERATOR, returnThis); + } + } + if (DEF_VALUES && $native && $native.name !== VALUES) { + VALUES_BUG = true; + $default = function values() { + return $native.call(this); + }; + } + if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto2[ITERATOR])) { + hide(proto2, ITERATOR, $default); + } + Iterators[NAME] = $default; + Iterators[TAG] = returnThis; + if (DEFAULT) { + methods = { + values: DEF_VALUES ? $default : getMethod(VALUES), + keys: IS_SET ? $default : getMethod(KEYS), + entries: $entries + }; + if (FORCED) + for (key in methods) { + if (!(key in proto2)) + redefine(proto2, key, methods[key]); + } + else + $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods); + } + return methods; + }; + }, + function(module2, exports2) { + module2.exports = function(exec) { + try { + return { e: false, v: exec() }; + } catch (e) { + return { e: true, v: e }; + } + }; + }, + function(module2, exports2, __webpack_require__) { + var anObject = __webpack_require__(27); + var isObject = __webpack_require__(34); + var newPromiseCapability = __webpack_require__(70); + module2.exports = function(C, x) { + anObject(C); + if (isObject(x) && x.constructor === C) + return x; + var promiseCapability = newPromiseCapability.f(C); + var resolve = promiseCapability.resolve; + resolve(x); + return promiseCapability.promise; + }; + }, + function(module2, exports2) { + module2.exports = function(bitmap, value) { + return { + enumerable: !(bitmap & 1), + configurable: !(bitmap & 2), + writable: !(bitmap & 4), + value + }; + }; + }, + function(module2, exports2, __webpack_require__) { + var core = __webpack_require__(23); + var global = __webpack_require__(11); + var SHARED = "__core-js_shared__"; + var store = global[SHARED] || (global[SHARED] = {}); + (module2.exports = function(key, value) { + return store[key] || (store[key] = value !== void 0 ? value : {}); + })("versions", []).push({ + version: core.version, + mode: __webpack_require__(69) ? "pure" : "global", + copyright: "\xA9 2018 Denis Pushkarev (zloirock.ru)" + }); + }, + function(module2, exports2, __webpack_require__) { + var anObject = __webpack_require__(27); + var aFunction = __webpack_require__(46); + var SPECIES = __webpack_require__(13)("species"); + module2.exports = function(O, D) { + var C = anObject(O).constructor; + var S; + return C === void 0 || (S = anObject(C)[SPECIES]) == void 0 ? D : aFunction(S); + }; + }, + function(module2, exports2, __webpack_require__) { + var ctx = __webpack_require__(48); + var invoke = __webpack_require__(185); + var html = __webpack_require__(102); + var cel = __webpack_require__(68); + var global = __webpack_require__(11); + var process4 = global.process; + var setTask = global.setImmediate; + var clearTask = global.clearImmediate; + var MessageChannel = global.MessageChannel; + var Dispatch = global.Dispatch; + var counter = 0; + var queue = {}; + var ONREADYSTATECHANGE = "onreadystatechange"; + var defer, channel, port; + var run = function() { + var id = +this; + if (queue.hasOwnProperty(id)) { + var fn = queue[id]; + delete queue[id]; + fn(); + } + }; + var listener = function(event) { + run.call(event.data); + }; + if (!setTask || !clearTask) { + setTask = function setImmediate(fn) { + var args = []; + var i = 1; + while (arguments.length > i) + args.push(arguments[i++]); + queue[++counter] = function() { + invoke(typeof fn == "function" ? fn : Function(fn), args); + }; + defer(counter); + return counter; + }; + clearTask = function clearImmediate(id) { + delete queue[id]; + }; + if (__webpack_require__(47)(process4) == "process") { + defer = function(id) { + process4.nextTick(ctx(run, id, 1)); + }; + } else if (Dispatch && Dispatch.now) { + defer = function(id) { + Dispatch.now(ctx(run, id, 1)); + }; + } else if (MessageChannel) { + channel = new MessageChannel(); + port = channel.port2; + channel.port1.onmessage = listener; + defer = ctx(port.postMessage, port, 1); + } else if (global.addEventListener && typeof postMessage == "function" && !global.importScripts) { + defer = function(id) { + global.postMessage(id + "", "*"); + }; + global.addEventListener("message", listener, false); + } else if (ONREADYSTATECHANGE in cel("script")) { + defer = function(id) { + html.appendChild(cel("script"))[ONREADYSTATECHANGE] = function() { + html.removeChild(this); + run.call(id); + }; + }; + } else { + defer = function(id) { + setTimeout(ctx(run, id, 1), 0); + }; + } + } + module2.exports = { + set: setTask, + clear: clearTask + }; + }, + function(module2, exports2, __webpack_require__) { + var toInteger = __webpack_require__(73); + var min = Math.min; + module2.exports = function(it) { + return it > 0 ? min(toInteger(it), 9007199254740991) : 0; + }; + }, + function(module2, exports2) { + var id = 0; + var px = Math.random(); + module2.exports = function(key) { + return "Symbol(".concat(key === void 0 ? "" : key, ")_", (++id + px).toString(36)); + }; + }, + function(module2, exports2, __webpack_require__) { + exports2 = module2.exports = createDebug.debug = createDebug["default"] = createDebug; + exports2.coerce = coerce; + exports2.disable = disable; + exports2.enable = enable; + exports2.enabled = enabled; + exports2.humanize = __webpack_require__(229); + exports2.instances = []; + exports2.names = []; + exports2.skips = []; + exports2.formatters = {}; + function selectColor(namespace) { + var hash = 0, i; + for (i in namespace) { + hash = (hash << 5) - hash + namespace.charCodeAt(i); + hash |= 0; + } + return exports2.colors[Math.abs(hash) % exports2.colors.length]; + } + function createDebug(namespace) { + var prevTime; + function debug() { + if (!debug.enabled) + return; + var self2 = debug; + var curr = +new Date(); + var ms = curr - (prevTime || curr); + self2.diff = ms; + self2.prev = prevTime; + self2.curr = curr; + prevTime = curr; + var args = new Array(arguments.length); + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i]; + } + args[0] = exports2.coerce(args[0]); + if ("string" !== typeof args[0]) { + args.unshift("%O"); + } + var index = 0; + args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) { + if (match === "%%") + return match; + index++; + var formatter = exports2.formatters[format]; + if ("function" === typeof formatter) { + var val = args[index]; + match = formatter.call(self2, val); + args.splice(index, 1); + index--; + } + return match; + }); + exports2.formatArgs.call(self2, args); + var logFn = debug.log || exports2.log || console.log.bind(console); + logFn.apply(self2, args); + } + debug.namespace = namespace; + debug.enabled = exports2.enabled(namespace); + debug.useColors = exports2.useColors(); + debug.color = selectColor(namespace); + debug.destroy = destroy; + if ("function" === typeof exports2.init) { + exports2.init(debug); + } + exports2.instances.push(debug); + return debug; + } + function destroy() { + var index = exports2.instances.indexOf(this); + if (index !== -1) { + exports2.instances.splice(index, 1); + return true; + } else { + return false; + } + } + function enable(namespaces) { + exports2.save(namespaces); + exports2.names = []; + exports2.skips = []; + var i; + var split = (typeof namespaces === "string" ? namespaces : "").split(/[\s,]+/); + var len = split.length; + for (i = 0; i < len; i++) { + if (!split[i]) + continue; + namespaces = split[i].replace(/\*/g, ".*?"); + if (namespaces[0] === "-") { + exports2.skips.push(new RegExp("^" + namespaces.substr(1) + "$")); + } else { + exports2.names.push(new RegExp("^" + namespaces + "$")); + } + } + for (i = 0; i < exports2.instances.length; i++) { + var instance = exports2.instances[i]; + instance.enabled = exports2.enabled(instance.namespace); + } + } + function disable() { + exports2.enable(""); + } + function enabled(name) { + if (name[name.length - 1] === "*") { + return true; + } + var i, len; + for (i = 0, len = exports2.skips.length; i < len; i++) { + if (exports2.skips[i].test(name)) { + return false; + } + } + for (i = 0, len = exports2.names.length; i < len; i++) { + if (exports2.names[i].test(name)) { + return true; + } + } + return false; + } + function coerce(val) { + if (val instanceof Error) + return val.stack || val.message; + return val; + } + }, + , + function(module2, exports2, __webpack_require__) { + module2.exports = realpath; + realpath.realpath = realpath; + realpath.sync = realpathSync; + realpath.realpathSync = realpathSync; + realpath.monkeypatch = monkeypatch; + realpath.unmonkeypatch = unmonkeypatch; + var fs = __webpack_require__(3); + var origRealpath = fs.realpath; + var origRealpathSync = fs.realpathSync; + var version = process.version; + var ok = /^v[0-5]\./.test(version); + var old = __webpack_require__(217); + function newError(er) { + return er && er.syscall === "realpath" && (er.code === "ELOOP" || er.code === "ENOMEM" || er.code === "ENAMETOOLONG"); + } + function realpath(p, cache, cb) { + if (ok) { + return origRealpath(p, cache, cb); + } + if (typeof cache === "function") { + cb = cache; + cache = null; + } + origRealpath(p, cache, function(er, result) { + if (newError(er)) { + old.realpath(p, cache, cb); + } else { + cb(er, result); + } + }); + } + function realpathSync(p, cache) { + if (ok) { + return origRealpathSync(p, cache); + } + try { + return origRealpathSync(p, cache); + } catch (er) { + if (newError(er)) { + return old.realpathSync(p, cache); + } else { + throw er; + } + } + } + function monkeypatch() { + fs.realpath = realpath; + fs.realpathSync = realpathSync; + } + function unmonkeypatch() { + fs.realpath = origRealpath; + fs.realpathSync = origRealpathSync; + } + }, + function(module2, exports2, __webpack_require__) { + exports2.alphasort = alphasort; + exports2.alphasorti = alphasorti; + exports2.setopts = setopts; + exports2.ownProp = ownProp; + exports2.makeAbs = makeAbs; + exports2.finish = finish; + exports2.mark = mark; + exports2.isIgnored = isIgnored; + exports2.childrenIgnored = childrenIgnored; + function ownProp(obj, field) { + return Object.prototype.hasOwnProperty.call(obj, field); + } + var path = __webpack_require__(0); + var minimatch = __webpack_require__(60); + var isAbsolute = __webpack_require__(76); + var Minimatch = minimatch.Minimatch; + function alphasorti(a, b) { + return a.toLowerCase().localeCompare(b.toLowerCase()); + } + function alphasort(a, b) { + return a.localeCompare(b); + } + function setupIgnores(self2, options) { + self2.ignore = options.ignore || []; + if (!Array.isArray(self2.ignore)) + self2.ignore = [self2.ignore]; + if (self2.ignore.length) { + self2.ignore = self2.ignore.map(ignoreMap); + } + } + function ignoreMap(pattern) { + var gmatcher = null; + if (pattern.slice(-3) === "/**") { + var gpattern = pattern.replace(/(\/\*\*)+$/, ""); + gmatcher = new Minimatch(gpattern, { dot: true }); + } + return { + matcher: new Minimatch(pattern, { dot: true }), + gmatcher + }; + } + function setopts(self2, pattern, options) { + if (!options) + options = {}; + if (options.matchBase && -1 === pattern.indexOf("/")) { + if (options.noglobstar) { + throw new Error("base matching requires globstar"); + } + pattern = "**/" + pattern; + } + self2.silent = !!options.silent; + self2.pattern = pattern; + self2.strict = options.strict !== false; + self2.realpath = !!options.realpath; + self2.realpathCache = options.realpathCache || /* @__PURE__ */ Object.create(null); + self2.follow = !!options.follow; + self2.dot = !!options.dot; + self2.mark = !!options.mark; + self2.nodir = !!options.nodir; + if (self2.nodir) + self2.mark = true; + self2.sync = !!options.sync; + self2.nounique = !!options.nounique; + self2.nonull = !!options.nonull; + self2.nosort = !!options.nosort; + self2.nocase = !!options.nocase; + self2.stat = !!options.stat; + self2.noprocess = !!options.noprocess; + self2.absolute = !!options.absolute; + self2.maxLength = options.maxLength || Infinity; + self2.cache = options.cache || /* @__PURE__ */ Object.create(null); + self2.statCache = options.statCache || /* @__PURE__ */ Object.create(null); + self2.symlinks = options.symlinks || /* @__PURE__ */ Object.create(null); + setupIgnores(self2, options); + self2.changedCwd = false; + var cwd = process.cwd(); + if (!ownProp(options, "cwd")) + self2.cwd = cwd; + else { + self2.cwd = path.resolve(options.cwd); + self2.changedCwd = self2.cwd !== cwd; + } + self2.root = options.root || path.resolve(self2.cwd, "/"); + self2.root = path.resolve(self2.root); + if (process.platform === "win32") + self2.root = self2.root.replace(/\\/g, "/"); + self2.cwdAbs = isAbsolute(self2.cwd) ? self2.cwd : makeAbs(self2, self2.cwd); + if (process.platform === "win32") + self2.cwdAbs = self2.cwdAbs.replace(/\\/g, "/"); + self2.nomount = !!options.nomount; + options.nonegate = true; + options.nocomment = true; + self2.minimatch = new Minimatch(pattern, options); + self2.options = self2.minimatch.options; + } + function finish(self2) { + var nou = self2.nounique; + var all = nou ? [] : /* @__PURE__ */ Object.create(null); + for (var i = 0, l = self2.matches.length; i < l; i++) { + var matches = self2.matches[i]; + if (!matches || Object.keys(matches).length === 0) { + if (self2.nonull) { + var literal = self2.minimatch.globSet[i]; + if (nou) + all.push(literal); + else + all[literal] = true; + } + } else { + var m = Object.keys(matches); + if (nou) + all.push.apply(all, m); + else + m.forEach(function(m2) { + all[m2] = true; + }); + } + } + if (!nou) + all = Object.keys(all); + if (!self2.nosort) + all = all.sort(self2.nocase ? alphasorti : alphasort); + if (self2.mark) { + for (var i = 0; i < all.length; i++) { + all[i] = self2._mark(all[i]); + } + if (self2.nodir) { + all = all.filter(function(e) { + var notDir = !/\/$/.test(e); + var c = self2.cache[e] || self2.cache[makeAbs(self2, e)]; + if (notDir && c) + notDir = c !== "DIR" && !Array.isArray(c); + return notDir; + }); + } + } + if (self2.ignore.length) + all = all.filter(function(m2) { + return !isIgnored(self2, m2); + }); + self2.found = all; + } + function mark(self2, p) { + var abs = makeAbs(self2, p); + var c = self2.cache[abs]; + var m = p; + if (c) { + var isDir = c === "DIR" || Array.isArray(c); + var slash = p.slice(-1) === "/"; + if (isDir && !slash) + m += "/"; + else if (!isDir && slash) + m = m.slice(0, -1); + if (m !== p) { + var mabs = makeAbs(self2, m); + self2.statCache[mabs] = self2.statCache[abs]; + self2.cache[mabs] = self2.cache[abs]; + } + } + return m; + } + function makeAbs(self2, f) { + var abs = f; + if (f.charAt(0) === "/") { + abs = path.join(self2.root, f); + } else if (isAbsolute(f) || f === "") { + abs = f; + } else if (self2.changedCwd) { + abs = path.resolve(self2.cwd, f); + } else { + abs = path.resolve(f); + } + if (process.platform === "win32") + abs = abs.replace(/\\/g, "/"); + return abs; + } + function isIgnored(self2, path2) { + if (!self2.ignore.length) + return false; + return self2.ignore.some(function(item) { + return item.matcher.match(path2) || !!(item.gmatcher && item.gmatcher.match(path2)); + }); + } + function childrenIgnored(self2, path2) { + if (!self2.ignore.length) + return false; + return self2.ignore.some(function(item) { + return !!(item.gmatcher && item.gmatcher.match(path2)); + }); + } + }, + function(module2, exports2, __webpack_require__) { + var path = __webpack_require__(0); + var fs = __webpack_require__(3); + var _0777 = parseInt("0777", 8); + module2.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; + function mkdirP(p, opts, f, made) { + if (typeof opts === "function") { + f = opts; + opts = {}; + } else if (!opts || typeof opts !== "object") { + opts = { mode: opts }; + } + var mode = opts.mode; + var xfs = opts.fs || fs; + if (mode === void 0) { + mode = _0777 & ~process.umask(); + } + if (!made) + made = null; + var cb = f || function() { + }; + p = path.resolve(p); + xfs.mkdir(p, mode, function(er) { + if (!er) { + made = made || p; + return cb(null, made); + } + switch (er.code) { + case "ENOENT": + mkdirP(path.dirname(p), opts, function(er2, made2) { + if (er2) + cb(er2, made2); + else + mkdirP(p, opts, cb, made2); + }); + break; + default: + xfs.stat(p, function(er2, stat) { + if (er2 || !stat.isDirectory()) + cb(er, made); + else + cb(null, made); + }); + break; + } + }); + } + mkdirP.sync = function sync(p, opts, made) { + if (!opts || typeof opts !== "object") { + opts = { mode: opts }; + } + var mode = opts.mode; + var xfs = opts.fs || fs; + if (mode === void 0) { + mode = _0777 & ~process.umask(); + } + if (!made) + made = null; + p = path.resolve(p); + try { + xfs.mkdirSync(p, mode); + made = made || p; + } catch (err0) { + switch (err0.code) { + case "ENOENT": + made = sync(path.dirname(p), opts, made); + sync(p, opts, made); + break; + default: + var stat; + try { + stat = xfs.statSync(p); + } catch (err1) { + throw err0; + } + if (!stat.isDirectory()) + throw err0; + break; + } + } + return made; + }; + }, + , + , + , + , + , + function(module2, exports2, __webpack_require__) { + "use strict"; + module2.exports = (x) => { + if (typeof x !== "string") { + throw new TypeError("Expected a string, got " + typeof x); + } + if (x.charCodeAt(0) === 65279) { + return x.slice(1); + } + return x; + }; + }, + function(module2, exports2) { + module2.exports = wrappy; + function wrappy(fn, cb) { + if (fn && cb) + return wrappy(fn)(cb); + if (typeof fn !== "function") + throw new TypeError("need wrapper function"); + Object.keys(fn).forEach(function(k) { + wrapper[k] = fn[k]; + }); + return wrapper; + function wrapper() { + var args = new Array(arguments.length); + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i]; + } + var ret = fn.apply(this, args); + var cb2 = args[args.length - 1]; + if (typeof ret === "function" && ret !== cb2) { + Object.keys(cb2).forEach(function(k) { + ret[k] = cb2[k]; + }); + } + return ret; + } + } + }, + , + , + , + , + , + , + , + function(module2, exports2, __webpack_require__) { + var cof = __webpack_require__(47); + module2.exports = Object("z").propertyIsEnumerable(0) ? Object : function(it) { + return cof(it) == "String" ? it.split("") : Object(it); + }; + }, + function(module2, exports2, __webpack_require__) { + var $keys = __webpack_require__(195); + var enumBugKeys = __webpack_require__(101); + module2.exports = Object.keys || function keys(O) { + return $keys(O, enumBugKeys); + }; + }, + function(module2, exports2, __webpack_require__) { + var defined = __webpack_require__(67); + module2.exports = function(it) { + return Object(defined(it)); + }; + }, + , + , + , + , + , + , + , + , + , + , + , + function(module2, exports2) { + module2.exports = { "name": "yarn", "installationMethod": "unknown", "version": "1.10.0-0", "license": "BSD-2-Clause", "preferGlobal": true, "description": "\u{1F4E6}\u{1F408} Fast, reliable, and secure dependency management.", "dependencies": { "@zkochan/cmd-shim": "^2.2.4", "babel-runtime": "^6.26.0", "bytes": "^3.0.0", "camelcase": "^4.0.0", "chalk": "^2.1.0", "commander": "^2.9.0", "death": "^1.0.0", "debug": "^3.0.0", "deep-equal": "^1.0.1", "detect-indent": "^5.0.0", "dnscache": "^1.0.1", "glob": "^7.1.1", "gunzip-maybe": "^1.4.0", "hash-for-dep": "^1.2.3", "imports-loader": "^0.8.0", "ini": "^1.3.4", "inquirer": "^3.0.1", "invariant": "^2.2.0", "is-builtin-module": "^2.0.0", "is-ci": "^1.0.10", "is-webpack-bundle": "^1.0.0", "leven": "^2.0.0", "loud-rejection": "^1.2.0", "micromatch": "^2.3.11", "mkdirp": "^0.5.1", "node-emoji": "^1.6.1", "normalize-url": "^2.0.0", "npm-logical-tree": "^1.2.1", "object-path": "^0.11.2", "proper-lockfile": "^2.0.0", "puka": "^1.0.0", "read": "^1.0.7", "request": "^2.87.0", "request-capture-har": "^1.2.2", "rimraf": "^2.5.0", "semver": "^5.1.0", "ssri": "^5.3.0", "strip-ansi": "^4.0.0", "strip-bom": "^3.0.0", "tar-fs": "^1.16.0", "tar-stream": "^1.6.1", "uuid": "^3.0.1", "v8-compile-cache": "^2.0.0", "validate-npm-package-license": "^3.0.3", "yn": "^2.0.0" }, "devDependencies": { "babel-core": "^6.26.0", "babel-eslint": "^7.2.3", "babel-loader": "^6.2.5", "babel-plugin-array-includes": "^2.0.3", "babel-plugin-transform-builtin-extend": "^1.1.2", "babel-plugin-transform-inline-imports-commonjs": "^1.0.0", "babel-plugin-transform-runtime": "^6.4.3", "babel-preset-env": "^1.6.0", "babel-preset-flow": "^6.23.0", "babel-preset-stage-0": "^6.0.0", "babylon": "^6.5.0", "commitizen": "^2.9.6", "cz-conventional-changelog": "^2.0.0", "eslint": "^4.3.0", "eslint-config-fb-strict": "^22.0.0", "eslint-plugin-babel": "^5.0.0", "eslint-plugin-flowtype": "^2.35.0", "eslint-plugin-jasmine": "^2.6.2", "eslint-plugin-jest": "^21.0.0", "eslint-plugin-jsx-a11y": "^6.0.2", "eslint-plugin-prefer-object-spread": "^1.2.1", "eslint-plugin-prettier": "^2.1.2", "eslint-plugin-react": "^7.1.0", "eslint-plugin-relay": "^0.0.24", "eslint-plugin-yarn-internal": "file:scripts/eslint-rules", "execa": "^0.10.0", "flow-bin": "^0.66.0", "git-release-notes": "^3.0.0", "gulp": "^3.9.0", "gulp-babel": "^7.0.0", "gulp-if": "^2.0.1", "gulp-newer": "^1.0.0", "gulp-plumber": "^1.0.1", "gulp-sourcemaps": "^2.2.0", "gulp-util": "^3.0.7", "gulp-watch": "^5.0.0", "jest": "^22.4.4", "jsinspect": "^0.12.6", "minimatch": "^3.0.4", "mock-stdin": "^0.3.0", "prettier": "^1.5.2", "temp": "^0.8.3", "webpack": "^2.1.0-beta.25", "yargs": "^6.3.0" }, "resolutions": { "sshpk": "^1.14.2" }, "engines": { "node": ">=4.0.0" }, "repository": "yarnpkg/yarn", "bin": { "yarn": "./bin/yarn.js", "yarnpkg": "./bin/yarn.js" }, "scripts": { "build": "gulp build", "build-bundle": "node ./scripts/build-webpack.js", "build-chocolatey": "powershell ./scripts/build-chocolatey.ps1", "build-deb": "./scripts/build-deb.sh", "build-dist": "bash ./scripts/build-dist.sh", "build-win-installer": "scripts\\build-windows-installer.bat", "changelog": "git-release-notes $(git describe --tags --abbrev=0 $(git describe --tags --abbrev=0)^)..$(git describe --tags --abbrev=0) scripts/changelog.md", "dupe-check": "yarn jsinspect ./src", "lint": "eslint . && flow check", "pkg-tests": "yarn --cwd packages/pkg-tests jest yarn.test.js", "prettier": "eslint src __tests__ --fix", "release-branch": "./scripts/release-branch.sh", "test": "yarn lint && yarn test-only", "test-only": "node --max_old_space_size=4096 ", "test-only-debug": "node --inspect-brk --max_old_space_size=4096 ", "test-coverage": "node --max_old_space_size=4096 ", "watch": "gulp watch", "commit": "git-cz" }, "jest": { "collectCoverageFrom": ["src/**/*.js"], "testEnvironment": "node", "modulePathIgnorePatterns": ["__tests__/fixtures/", "packages/pkg-tests/pkg-tests-fixtures", "dist/"], "testPathIgnorePatterns": ["__tests__/(fixtures|__mocks__)/", "updates/", "_(temp|mock|install|init|helpers).js$", "packages/pkg-tests"] }, "config": { "commitizen": { "path": "./" } } }; + }, + , + , + , + , + function(module2, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + exports2.default = stringify; + var _misc; + function _load_misc() { + return _misc = __webpack_require__(12); + } + var _constants; + function _load_constants() { + return _constants = __webpack_require__(6); + } + var _package; + function _load_package() { + return _package = __webpack_require__(145); + } + const NODE_VERSION = process.version; + function shouldWrapKey(str) { + return str.indexOf("true") === 0 || str.indexOf("false") === 0 || /[:\s\n\\",\[\]]/g.test(str) || /^[0-9]/g.test(str) || !/^[a-zA-Z]/g.test(str); + } + function maybeWrap(str) { + if (typeof str === "boolean" || typeof str === "number" || shouldWrapKey(str)) { + return JSON.stringify(str); + } else { + return str; + } + } + const priorities = { + name: 1, + version: 2, + uid: 3, + resolved: 4, + integrity: 5, + registry: 6, + dependencies: 7 + }; + function priorityThenAlphaSort(a, b) { + if (priorities[a] || priorities[b]) { + return (priorities[a] || 100) > (priorities[b] || 100) ? 1 : -1; + } else { + return (0, (_misc || _load_misc()).sortAlpha)(a, b); + } + } + function _stringify(obj, options) { + if (typeof obj !== "object") { + throw new TypeError(); + } + const indent = options.indent; + const lines = []; + const keys = Object.keys(obj).sort(priorityThenAlphaSort); + let addedKeys = []; + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + const val = obj[key]; + if (val == null || addedKeys.indexOf(key) >= 0) { + continue; + } + const valKeys = [key]; + if (typeof val === "object") { + for (let j = i + 1; j < keys.length; j++) { + const key2 = keys[j]; + if (val === obj[key2]) { + valKeys.push(key2); + } + } + } + const keyLine = valKeys.sort((_misc || _load_misc()).sortAlpha).map(maybeWrap).join(", "); + if (typeof val === "string" || typeof val === "boolean" || typeof val === "number") { + lines.push(`${keyLine} ${maybeWrap(val)}`); + } else if (typeof val === "object") { + lines.push(`${keyLine}: +${_stringify(val, { indent: indent + " " })}` + (options.topLevel ? "\n" : "")); + } else { + throw new TypeError(); + } + addedKeys = addedKeys.concat(valKeys); + } + return indent + lines.join(` +${indent}`); + } + function stringify(obj, noHeader, enableVersions) { + const val = _stringify(obj, { + indent: "", + topLevel: true + }); + if (noHeader) { + return val; + } + const lines = []; + lines.push("# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY."); + lines.push(`# yarn lockfile v${(_constants || _load_constants()).LOCKFILE_VERSION}`); + if (enableVersions) { + lines.push(`# yarn v${(_package || _load_package()).version}`); + lines.push(`# node ${NODE_VERSION}`); + } + lines.push("\n"); + lines.push(val); + return lines.join("\n"); + } + }, + , + , + , + , + , + , + , + , + , + , + , + , + , + function(module2, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + exports2.fileDatesEqual = exports2.copyFile = exports2.unlink = void 0; + var _asyncToGenerator2; + function _load_asyncToGenerator() { + return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(1)); + } + let fixTimes = (() => { + var _ref3 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (fd, dest, data) { + const doOpen = fd === void 0; + let openfd = fd ? fd : -1; + if (disableTimestampCorrection === void 0) { + const destStat = yield lstat(dest); + disableTimestampCorrection = fileDatesEqual(destStat.mtime, data.mtime); + } + if (disableTimestampCorrection) { + return; + } + if (doOpen) { + try { + openfd = yield open(dest, "a", data.mode); + } catch (er) { + try { + openfd = yield open(dest, "r", data.mode); + } catch (err) { + return; + } + } + } + try { + if (openfd) { + yield futimes(openfd, data.atime, data.mtime); + } + } catch (er) { + } finally { + if (doOpen && openfd) { + yield close(openfd); + } + } + }); + return function fixTimes2(_x7, _x8, _x9) { + return _ref3.apply(this, arguments); + }; + })(); + var _fs; + function _load_fs() { + return _fs = _interopRequireDefault(__webpack_require__(3)); + } + var _promise; + function _load_promise() { + return _promise = __webpack_require__(40); + } + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { default: obj }; + } + let disableTimestampCorrection = void 0; + const readFileBuffer = (0, (_promise || _load_promise()).promisify)((_fs || _load_fs()).default.readFile); + const close = (0, (_promise || _load_promise()).promisify)((_fs || _load_fs()).default.close); + const lstat = (0, (_promise || _load_promise()).promisify)((_fs || _load_fs()).default.lstat); + const open = (0, (_promise || _load_promise()).promisify)((_fs || _load_fs()).default.open); + const futimes = (0, (_promise || _load_promise()).promisify)((_fs || _load_fs()).default.futimes); + const write = (0, (_promise || _load_promise()).promisify)((_fs || _load_fs()).default.write); + const unlink = exports2.unlink = (0, (_promise || _load_promise()).promisify)(__webpack_require__(233)); + const copyFile = exports2.copyFile = (() => { + var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (data, cleanup) { + try { + yield unlink(data.dest); + yield copyFilePoly(data.src, data.dest, 0, data); + } finally { + if (cleanup) { + cleanup(); + } + } + }); + return function copyFile2(_x, _x2) { + return _ref.apply(this, arguments); + }; + })(); + const copyFilePoly = (src, dest, flags, data) => { + if ((_fs || _load_fs()).default.copyFile) { + return new Promise((resolve, reject) => (_fs || _load_fs()).default.copyFile(src, dest, flags, (err) => { + if (err) { + reject(err); + } else { + fixTimes(void 0, dest, data).then(() => resolve()).catch((ex) => reject(ex)); + } + })); + } else { + return copyWithBuffer(src, dest, flags, data); + } + }; + const copyWithBuffer = (() => { + var _ref2 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (src, dest, flags, data) { + const fd = yield open(dest, "w", data.mode); + try { + const buffer = yield readFileBuffer(src); + yield write(fd, buffer, 0, buffer.length); + yield fixTimes(fd, dest, data); + } finally { + yield close(fd); + } + }); + return function copyWithBuffer2(_x3, _x4, _x5, _x6) { + return _ref2.apply(this, arguments); + }; + })(); + const fileDatesEqual = exports2.fileDatesEqual = (a, b) => { + const aTime = a.getTime(); + const bTime = b.getTime(); + if (process.platform !== "win32") { + return aTime === bTime; + } + if (Math.abs(aTime - bTime) <= 1) { + return true; + } + const aTimeSec = Math.floor(aTime / 1e3); + const bTimeSec = Math.floor(bTime / 1e3); + if (aTime - aTimeSec * 1e3 === 0 || bTime - bTimeSec * 1e3 === 0) { + return aTimeSec === bTimeSec; + } + return aTime === bTime; + }; + }, + , + , + , + , + function(module2, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + exports2.isFakeRoot = isFakeRoot; + exports2.isRootUser = isRootUser; + function getUid() { + if (process.platform !== "win32" && process.getuid) { + return process.getuid(); + } + return null; + } + exports2.default = isRootUser(getUid()) && !isFakeRoot(); + function isFakeRoot() { + return Boolean(process.env.FAKEROOTKEY); + } + function isRootUser(uid) { + return uid === 0; + } + }, + , + function(module2, exports2, __webpack_require__) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { + value: true + }); + exports2.getDataDir = getDataDir; + exports2.getCacheDir = getCacheDir; + exports2.getConfigDir = getConfigDir; + const path = __webpack_require__(0); + const userHome = __webpack_require__(45).default; + const FALLBACK_CONFIG_DIR = path.join(userHome, ".config", "yarn"); + const FALLBACK_CACHE_DIR = path.join(userHome, ".cache", "yarn"); + function getDataDir() { + if (process.platform === "win32") { + const WIN32_APPDATA_DIR = getLocalAppDataDir(); + return WIN32_APPDATA_DIR == null ? FALLBACK_CONFIG_DIR : path.join(WIN32_APPDATA_DIR, "Data"); + } else if (process.env.XDG_DATA_HOME) { + return path.join(process.env.XDG_DATA_HOME, "yarn"); + } else { + return FALLBACK_CONFIG_DIR; + } + } + function getCacheDir() { + if (process.platform === "win32") { + return path.join(getLocalAppDataDir() || path.join(userHome, "AppData", "Local", "Yarn"), "Cache"); + } else if (process.env.XDG_CACHE_HOME) { + return path.join(process.env.XDG_CACHE_HOME, "yarn"); + } else if (process.platform === "darwin") { + return path.join(userHome, "Library", "Caches", "Yarn"); + } else { + return FALLBACK_CACHE_DIR; + } + } + function getConfigDir() { + if (process.platform === "win32") { + const WIN32_APPDATA_DIR = getLocalAppDataDir(); + return WIN32_APPDATA_DIR == null ? FALLBACK_CONFIG_DIR : path.join(WIN32_APPDATA_DIR, "Config"); + } else if (process.env.XDG_CONFIG_HOME) { + return path.join(process.env.XDG_CONFIG_HOME, "yarn"); + } else { + return FALLBACK_CONFIG_DIR; + } + } + function getLocalAppDataDir() { + return process.env.LOCALAPPDATA ? path.join(process.env.LOCALAPPDATA, "Yarn") : null; + } + }, + , + function(module2, exports2, __webpack_require__) { + module2.exports = { "default": __webpack_require__(179), __esModule: true }; + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + module2.exports = balanced; + function balanced(a, b, str) { + if (a instanceof RegExp) + a = maybeMatch(a, str); + if (b instanceof RegExp) + b = maybeMatch(b, str); + var r = range(a, b, str); + return r && { + start: r[0], + end: r[1], + pre: str.slice(0, r[0]), + body: str.slice(r[0] + a.length, r[1]), + post: str.slice(r[1] + b.length) + }; + } + function maybeMatch(reg, str) { + var m = str.match(reg); + return m ? m[0] : null; + } + balanced.range = range; + function range(a, b, str) { + var begs, beg, left, right, result; + var ai = str.indexOf(a); + var bi = str.indexOf(b, ai + 1); + var i = ai; + if (ai >= 0 && bi > 0) { + begs = []; + left = str.length; + while (i >= 0 && !result) { + if (i == ai) { + begs.push(i); + ai = str.indexOf(a, i + 1); + } else if (begs.length == 1) { + result = [begs.pop(), bi]; + } else { + beg = begs.pop(); + if (beg < left) { + left = beg; + right = bi; + } + bi = str.indexOf(b, i + 1); + } + i = ai < bi && ai >= 0 ? ai : bi; + } + if (begs.length) { + result = [left, right]; + } + } + return result; + } + }, + function(module2, exports2, __webpack_require__) { + var concatMap = __webpack_require__(178); + var balanced = __webpack_require__(174); + module2.exports = expandTop; + var escSlash = "\0SLASH" + Math.random() + "\0"; + var escOpen = "\0OPEN" + Math.random() + "\0"; + var escClose = "\0CLOSE" + Math.random() + "\0"; + var escComma = "\0COMMA" + Math.random() + "\0"; + var escPeriod = "\0PERIOD" + Math.random() + "\0"; + function numeric(str) { + return parseInt(str, 10) == str ? parseInt(str, 10) : str.charCodeAt(0); + } + function escapeBraces(str) { + return str.split("\\\\").join(escSlash).split("\\{").join(escOpen).split("\\}").join(escClose).split("\\,").join(escComma).split("\\.").join(escPeriod); + } + function unescapeBraces(str) { + return str.split(escSlash).join("\\").split(escOpen).join("{").split(escClose).join("}").split(escComma).join(",").split(escPeriod).join("."); + } + function parseCommaParts(str) { + if (!str) + return [""]; + var parts = []; + var m = balanced("{", "}", str); + if (!m) + return str.split(","); + var pre = m.pre; + var body = m.body; + var post = m.post; + var p = pre.split(","); + p[p.length - 1] += "{" + body + "}"; + var postParts = parseCommaParts(post); + if (post.length) { + p[p.length - 1] += postParts.shift(); + p.push.apply(p, postParts); + } + parts.push.apply(parts, p); + return parts; + } + function expandTop(str) { + if (!str) + return []; + if (str.substr(0, 2) === "{}") { + str = "\\{\\}" + str.substr(2); + } + return expand3(escapeBraces(str), true).map(unescapeBraces); + } + function identity(e) { + return e; + } + function embrace(str) { + return "{" + str + "}"; + } + function isPadded(el) { + return /^-?0\d/.test(el); + } + function lte(i, y) { + return i <= y; + } + function gte(i, y) { + return i >= y; + } + function expand3(str, isTop) { + var expansions = []; + var m = balanced("{", "}", str); + if (!m || /\$$/.test(m.pre)) + return [str]; + var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + var isSequence = isNumericSequence || isAlphaSequence; + var isOptions = m.body.indexOf(",") >= 0; + if (!isSequence && !isOptions) { + if (m.post.match(/,.*\}/)) { + str = m.pre + "{" + m.body + escClose + m.post; + return expand3(str); + } + return [str]; + } + var n; + if (isSequence) { + n = m.body.split(/\.\./); + } else { + n = parseCommaParts(m.body); + if (n.length === 1) { + n = expand3(n[0], false).map(embrace); + if (n.length === 1) { + var post = m.post.length ? expand3(m.post, false) : [""]; + return post.map(function(p) { + return m.pre + n[0] + p; + }); + } + } + } + var pre = m.pre; + var post = m.post.length ? expand3(m.post, false) : [""]; + var N; + if (isSequence) { + var x = numeric(n[0]); + var y = numeric(n[1]); + var width = Math.max(n[0].length, n[1].length); + var incr = n.length == 3 ? Math.abs(numeric(n[2])) : 1; + var test = lte; + var reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + var pad = n.some(isPadded); + N = []; + for (var i = x; test(i, y); i += incr) { + var c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === "\\") + c = ""; + } else { + c = String(i); + if (pad) { + var need = width - c.length; + if (need > 0) { + var z = new Array(need + 1).join("0"); + if (i < 0) + c = "-" + z + c.slice(1); + else + c = z + c; + } + } + } + N.push(c); + } + } else { + N = concatMap(n, function(el) { + return expand3(el, false); + }); + } + for (var j = 0; j < N.length; j++) { + for (var k = 0; k < post.length; k++) { + var expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) + expansions.push(expansion); + } + } + return expansions; + } + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + function preserveCamelCase(str) { + let isLastCharLower = false; + let isLastCharUpper = false; + let isLastLastCharUpper = false; + for (let i = 0; i < str.length; i++) { + const c = str[i]; + if (isLastCharLower && /[a-zA-Z]/.test(c) && c.toUpperCase() === c) { + str = str.substr(0, i) + "-" + str.substr(i); + isLastCharLower = false; + isLastLastCharUpper = isLastCharUpper; + isLastCharUpper = true; + i++; + } else if (isLastCharUpper && isLastLastCharUpper && /[a-zA-Z]/.test(c) && c.toLowerCase() === c) { + str = str.substr(0, i - 1) + "-" + str.substr(i - 1); + isLastLastCharUpper = isLastCharUpper; + isLastCharUpper = false; + isLastCharLower = true; + } else { + isLastCharLower = c.toLowerCase() === c; + isLastLastCharUpper = isLastCharUpper; + isLastCharUpper = c.toUpperCase() === c; + } + } + return str; + } + module2.exports = function(str) { + if (arguments.length > 1) { + str = Array.from(arguments).map((x) => x.trim()).filter((x) => x.length).join("-"); + } else { + str = str.trim(); + } + if (str.length === 0) { + return ""; + } + if (str.length === 1) { + return str.toLowerCase(); + } + if (/^[a-z0-9]+$/.test(str)) { + return str; + } + const hasUpperCase = str !== str.toLowerCase(); + if (hasUpperCase) { + str = preserveCamelCase(str); + } + return str.replace(/^[_.\- ]+/, "").toLowerCase().replace(/[_.\- ]+(\w|$)/g, (m, p1) => p1.toUpperCase()); + }; + }, + , + function(module2, exports2) { + module2.exports = function(xs, fn) { + var res = []; + for (var i = 0; i < xs.length; i++) { + var x = fn(xs[i], i); + if (isArray(x)) + res.push.apply(res, x); + else + res.push(x); + } + return res; + }; + var isArray = Array.isArray || function(xs) { + return Object.prototype.toString.call(xs) === "[object Array]"; + }; + }, + function(module2, exports2, __webpack_require__) { + __webpack_require__(205); + __webpack_require__(207); + __webpack_require__(210); + __webpack_require__(206); + __webpack_require__(208); + __webpack_require__(209); + module2.exports = __webpack_require__(23).Promise; + }, + function(module2, exports2) { + module2.exports = function() { + }; + }, + function(module2, exports2) { + module2.exports = function(it, Constructor, name, forbiddenField) { + if (!(it instanceof Constructor) || forbiddenField !== void 0 && forbiddenField in it) { + throw TypeError(name + ": incorrect invocation!"); + } + return it; + }; + }, + function(module2, exports2, __webpack_require__) { + var toIObject = __webpack_require__(74); + var toLength = __webpack_require__(110); + var toAbsoluteIndex = __webpack_require__(200); + module2.exports = function(IS_INCLUDES) { + return function($this, el, fromIndex) { + var O = toIObject($this); + var length = toLength(O.length); + var index = toAbsoluteIndex(fromIndex, length); + var value; + if (IS_INCLUDES && el != el) + while (length > index) { + value = O[index++]; + if (value != value) + return true; + } + else + for (; length > index; index++) + if (IS_INCLUDES || index in O) { + if (O[index] === el) + return IS_INCLUDES || index || 0; + } + return !IS_INCLUDES && -1; + }; + }; + }, + function(module2, exports2, __webpack_require__) { + var ctx = __webpack_require__(48); + var call = __webpack_require__(187); + var isArrayIter = __webpack_require__(186); + var anObject = __webpack_require__(27); + var toLength = __webpack_require__(110); + var getIterFn = __webpack_require__(203); + var BREAK = {}; + var RETURN = {}; + var exports2 = module2.exports = function(iterable, entries, fn, that, ITERATOR) { + var iterFn = ITERATOR ? function() { + return iterable; + } : getIterFn(iterable); + var f = ctx(fn, that, entries ? 2 : 1); + var index = 0; + var length, step, iterator2, result; + if (typeof iterFn != "function") + throw TypeError(iterable + " is not iterable!"); + if (isArrayIter(iterFn)) + for (length = toLength(iterable.length); length > index; index++) { + result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]); + if (result === BREAK || result === RETURN) + return result; + } + else + for (iterator2 = iterFn.call(iterable); !(step = iterator2.next()).done; ) { + result = call(iterator2, f, step.value, entries); + if (result === BREAK || result === RETURN) + return result; + } + }; + exports2.BREAK = BREAK; + exports2.RETURN = RETURN; + }, + function(module2, exports2, __webpack_require__) { + module2.exports = !__webpack_require__(33) && !__webpack_require__(85)(function() { + return Object.defineProperty(__webpack_require__(68)("div"), "a", { get: function() { + return 7; + } }).a != 7; + }); + }, + function(module2, exports2) { + module2.exports = function(fn, args, that) { + var un = that === void 0; + switch (args.length) { + case 0: + return un ? fn() : fn.call(that); + case 1: + return un ? fn(args[0]) : fn.call(that, args[0]); + case 2: + return un ? fn(args[0], args[1]) : fn.call(that, args[0], args[1]); + case 3: + return un ? fn(args[0], args[1], args[2]) : fn.call(that, args[0], args[1], args[2]); + case 4: + return un ? fn(args[0], args[1], args[2], args[3]) : fn.call(that, args[0], args[1], args[2], args[3]); + } + return fn.apply(that, args); + }; + }, + function(module2, exports2, __webpack_require__) { + var Iterators = __webpack_require__(35); + var ITERATOR = __webpack_require__(13)("iterator"); + var ArrayProto = Array.prototype; + module2.exports = function(it) { + return it !== void 0 && (Iterators.Array === it || ArrayProto[ITERATOR] === it); + }; + }, + function(module2, exports2, __webpack_require__) { + var anObject = __webpack_require__(27); + module2.exports = function(iterator2, fn, value, entries) { + try { + return entries ? fn(anObject(value)[0], value[1]) : fn(value); + } catch (e) { + var ret = iterator2["return"]; + if (ret !== void 0) + anObject(ret.call(iterator2)); + throw e; + } + }; + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + var create = __webpack_require__(192); + var descriptor = __webpack_require__(106); + var setToStringTag = __webpack_require__(71); + var IteratorPrototype = {}; + __webpack_require__(31)(IteratorPrototype, __webpack_require__(13)("iterator"), function() { + return this; + }); + module2.exports = function(Constructor, NAME, next) { + Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) }); + setToStringTag(Constructor, NAME + " Iterator"); + }; + }, + function(module2, exports2, __webpack_require__) { + var ITERATOR = __webpack_require__(13)("iterator"); + var SAFE_CLOSING = false; + try { + var riter = [7][ITERATOR](); + riter["return"] = function() { + SAFE_CLOSING = true; + }; + Array.from(riter, function() { + throw 2; + }); + } catch (e) { + } + module2.exports = function(exec, skipClosing) { + if (!skipClosing && !SAFE_CLOSING) + return false; + var safe = false; + try { + var arr = [7]; + var iter = arr[ITERATOR](); + iter.next = function() { + return { done: safe = true }; + }; + arr[ITERATOR] = function() { + return iter; + }; + exec(arr); + } catch (e) { + } + return safe; + }; + }, + function(module2, exports2) { + module2.exports = function(done, value) { + return { value, done: !!done }; + }; + }, + function(module2, exports2, __webpack_require__) { + var global = __webpack_require__(11); + var macrotask = __webpack_require__(109).set; + var Observer = global.MutationObserver || global.WebKitMutationObserver; + var process4 = global.process; + var Promise2 = global.Promise; + var isNode = __webpack_require__(47)(process4) == "process"; + module2.exports = function() { + var head, last, notify; + var flush = function() { + var parent, fn; + if (isNode && (parent = process4.domain)) + parent.exit(); + while (head) { + fn = head.fn; + head = head.next; + try { + fn(); + } catch (e) { + if (head) + notify(); + else + last = void 0; + throw e; + } + } + last = void 0; + if (parent) + parent.enter(); + }; + if (isNode) { + notify = function() { + process4.nextTick(flush); + }; + } else if (Observer && !(global.navigator && global.navigator.standalone)) { + var toggle = true; + var node = document.createTextNode(""); + new Observer(flush).observe(node, { characterData: true }); + notify = function() { + node.data = toggle = !toggle; + }; + } else if (Promise2 && Promise2.resolve) { + var promise = Promise2.resolve(void 0); + notify = function() { + promise.then(flush); + }; + } else { + notify = function() { + macrotask.call(global, flush); + }; + } + return function(fn) { + var task = { fn, next: void 0 }; + if (last) + last.next = task; + if (!head) { + head = task; + notify(); + } + last = task; + }; + }; + }, + function(module2, exports2, __webpack_require__) { + var anObject = __webpack_require__(27); + var dPs = __webpack_require__(193); + var enumBugKeys = __webpack_require__(101); + var IE_PROTO = __webpack_require__(72)("IE_PROTO"); + var Empty = function() { + }; + var PROTOTYPE = "prototype"; + var createDict = function() { + var iframe = __webpack_require__(68)("iframe"); + var i = enumBugKeys.length; + var lt = "<"; + var gt = ">"; + var iframeDocument; + iframe.style.display = "none"; + __webpack_require__(102).appendChild(iframe); + iframe.src = "javascript:"; + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(lt + "script" + gt + "document.F=Object" + lt + "/script" + gt); + iframeDocument.close(); + createDict = iframeDocument.F; + while (i--) + delete createDict[PROTOTYPE][enumBugKeys[i]]; + return createDict(); + }; + module2.exports = Object.create || function create(O, Properties) { + var result; + if (O !== null) { + Empty[PROTOTYPE] = anObject(O); + result = new Empty(); + Empty[PROTOTYPE] = null; + result[IE_PROTO] = O; + } else + result = createDict(); + return Properties === void 0 ? result : dPs(result, Properties); + }; + }, + function(module2, exports2, __webpack_require__) { + var dP = __webpack_require__(50); + var anObject = __webpack_require__(27); + var getKeys = __webpack_require__(132); + module2.exports = __webpack_require__(33) ? Object.defineProperties : function defineProperties(O, Properties) { + anObject(O); + var keys = getKeys(Properties); + var length = keys.length; + var i = 0; + var P; + while (length > i) + dP.f(O, P = keys[i++], Properties[P]); + return O; + }; + }, + function(module2, exports2, __webpack_require__) { + var has = __webpack_require__(49); + var toObject = __webpack_require__(133); + var IE_PROTO = __webpack_require__(72)("IE_PROTO"); + var ObjectProto = Object.prototype; + module2.exports = Object.getPrototypeOf || function(O) { + O = toObject(O); + if (has(O, IE_PROTO)) + return O[IE_PROTO]; + if (typeof O.constructor == "function" && O instanceof O.constructor) { + return O.constructor.prototype; + } + return O instanceof Object ? ObjectProto : null; + }; + }, + function(module2, exports2, __webpack_require__) { + var has = __webpack_require__(49); + var toIObject = __webpack_require__(74); + var arrayIndexOf = __webpack_require__(182)(false); + var IE_PROTO = __webpack_require__(72)("IE_PROTO"); + module2.exports = function(object, names) { + var O = toIObject(object); + var i = 0; + var result = []; + var key; + for (key in O) + if (key != IE_PROTO) + has(O, key) && result.push(key); + while (names.length > i) + if (has(O, key = names[i++])) { + ~arrayIndexOf(result, key) || result.push(key); + } + return result; + }; + }, + function(module2, exports2, __webpack_require__) { + var hide = __webpack_require__(31); + module2.exports = function(target, src, safe) { + for (var key in src) { + if (safe && target[key]) + target[key] = src[key]; + else + hide(target, key, src[key]); + } + return target; + }; + }, + function(module2, exports2, __webpack_require__) { + module2.exports = __webpack_require__(31); + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + var global = __webpack_require__(11); + var core = __webpack_require__(23); + var dP = __webpack_require__(50); + var DESCRIPTORS = __webpack_require__(33); + var SPECIES = __webpack_require__(13)("species"); + module2.exports = function(KEY) { + var C = typeof core[KEY] == "function" ? core[KEY] : global[KEY]; + if (DESCRIPTORS && C && !C[SPECIES]) + dP.f(C, SPECIES, { + configurable: true, + get: function() { + return this; + } + }); + }; + }, + function(module2, exports2, __webpack_require__) { + var toInteger = __webpack_require__(73); + var defined = __webpack_require__(67); + module2.exports = function(TO_STRING) { + return function(that, pos) { + var s = String(defined(that)); + var i = toInteger(pos); + var l = s.length; + var a, b; + if (i < 0 || i >= l) + return TO_STRING ? "" : void 0; + a = s.charCodeAt(i); + return a < 55296 || a > 56319 || i + 1 === l || (b = s.charCodeAt(i + 1)) < 56320 || b > 57343 ? TO_STRING ? s.charAt(i) : a : TO_STRING ? s.slice(i, i + 2) : (a - 55296 << 10) + (b - 56320) + 65536; + }; + }; + }, + function(module2, exports2, __webpack_require__) { + var toInteger = __webpack_require__(73); + var max = Math.max; + var min = Math.min; + module2.exports = function(index, length) { + index = toInteger(index); + return index < 0 ? max(index + length, 0) : min(index, length); + }; + }, + function(module2, exports2, __webpack_require__) { + var isObject = __webpack_require__(34); + module2.exports = function(it, S) { + if (!isObject(it)) + return it; + var fn, val; + if (S && typeof (fn = it.toString) == "function" && !isObject(val = fn.call(it))) + return val; + if (typeof (fn = it.valueOf) == "function" && !isObject(val = fn.call(it))) + return val; + if (!S && typeof (fn = it.toString) == "function" && !isObject(val = fn.call(it))) + return val; + throw TypeError("Can't convert object to primitive value"); + }; + }, + function(module2, exports2, __webpack_require__) { + var global = __webpack_require__(11); + var navigator2 = global.navigator; + module2.exports = navigator2 && navigator2.userAgent || ""; + }, + function(module2, exports2, __webpack_require__) { + var classof = __webpack_require__(100); + var ITERATOR = __webpack_require__(13)("iterator"); + var Iterators = __webpack_require__(35); + module2.exports = __webpack_require__(23).getIteratorMethod = function(it) { + if (it != void 0) + return it[ITERATOR] || it["@@iterator"] || Iterators[classof(it)]; + }; + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + var addToUnscopables = __webpack_require__(180); + var step = __webpack_require__(190); + var Iterators = __webpack_require__(35); + var toIObject = __webpack_require__(74); + module2.exports = __webpack_require__(103)(Array, "Array", function(iterated, kind) { + this._t = toIObject(iterated); + this._i = 0; + this._k = kind; + }, function() { + var O = this._t; + var kind = this._k; + var index = this._i++; + if (!O || index >= O.length) { + this._t = void 0; + return step(1); + } + if (kind == "keys") + return step(0, index); + if (kind == "values") + return step(0, O[index]); + return step(0, [index, O[index]]); + }, "values"); + Iterators.Arguments = Iterators.Array; + addToUnscopables("keys"); + addToUnscopables("values"); + addToUnscopables("entries"); + }, + function(module2, exports2) { + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + var LIBRARY = __webpack_require__(69); + var global = __webpack_require__(11); + var ctx = __webpack_require__(48); + var classof = __webpack_require__(100); + var $export = __webpack_require__(41); + var isObject = __webpack_require__(34); + var aFunction = __webpack_require__(46); + var anInstance = __webpack_require__(181); + var forOf = __webpack_require__(183); + var speciesConstructor = __webpack_require__(108); + var task = __webpack_require__(109).set; + var microtask = __webpack_require__(191)(); + var newPromiseCapabilityModule = __webpack_require__(70); + var perform = __webpack_require__(104); + var userAgent3 = __webpack_require__(202); + var promiseResolve = __webpack_require__(105); + var PROMISE = "Promise"; + var TypeError2 = global.TypeError; + var process4 = global.process; + var versions = process4 && process4.versions; + var v8 = versions && versions.v8 || ""; + var $Promise = global[PROMISE]; + var isNode = classof(process4) == "process"; + var empty = function() { + }; + var Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper; + var newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f; + var USE_NATIVE = !!function() { + try { + var promise = $Promise.resolve(1); + var FakePromise = (promise.constructor = {})[__webpack_require__(13)("species")] = function(exec) { + exec(empty, empty); + }; + return (isNode || typeof PromiseRejectionEvent == "function") && promise.then(empty) instanceof FakePromise && v8.indexOf("6.6") !== 0 && userAgent3.indexOf("Chrome/66") === -1; + } catch (e) { + } + }(); + var isThenable = function(it) { + var then; + return isObject(it) && typeof (then = it.then) == "function" ? then : false; + }; + var notify = function(promise, isReject) { + if (promise._n) + return; + promise._n = true; + var chain = promise._c; + microtask(function() { + var value = promise._v; + var ok = promise._s == 1; + var i = 0; + var run = function(reaction) { + var handler2 = ok ? reaction.ok : reaction.fail; + var resolve = reaction.resolve; + var reject = reaction.reject; + var domain = reaction.domain; + var result, then, exited; + try { + if (handler2) { + if (!ok) { + if (promise._h == 2) + onHandleUnhandled(promise); + promise._h = 1; + } + if (handler2 === true) + result = value; + else { + if (domain) + domain.enter(); + result = handler2(value); + if (domain) { + domain.exit(); + exited = true; + } + } + if (result === reaction.promise) { + reject(TypeError2("Promise-chain cycle")); + } else if (then = isThenable(result)) { + then.call(result, resolve, reject); + } else + resolve(result); + } else + reject(value); + } catch (e) { + if (domain && !exited) + domain.exit(); + reject(e); + } + }; + while (chain.length > i) + run(chain[i++]); + promise._c = []; + promise._n = false; + if (isReject && !promise._h) + onUnhandled(promise); + }); + }; + var onUnhandled = function(promise) { + task.call(global, function() { + var value = promise._v; + var unhandled = isUnhandled(promise); + var result, handler2, console2; + if (unhandled) { + result = perform(function() { + if (isNode) { + process4.emit("unhandledRejection", value, promise); + } else if (handler2 = global.onunhandledrejection) { + handler2({ promise, reason: value }); + } else if ((console2 = global.console) && console2.error) { + console2.error("Unhandled promise rejection", value); + } + }); + promise._h = isNode || isUnhandled(promise) ? 2 : 1; + } + promise._a = void 0; + if (unhandled && result.e) + throw result.v; + }); + }; + var isUnhandled = function(promise) { + return promise._h !== 1 && (promise._a || promise._c).length === 0; + }; + var onHandleUnhandled = function(promise) { + task.call(global, function() { + var handler2; + if (isNode) { + process4.emit("rejectionHandled", promise); + } else if (handler2 = global.onrejectionhandled) { + handler2({ promise, reason: promise._v }); + } + }); + }; + var $reject = function(value) { + var promise = this; + if (promise._d) + return; + promise._d = true; + promise = promise._w || promise; + promise._v = value; + promise._s = 2; + if (!promise._a) + promise._a = promise._c.slice(); + notify(promise, true); + }; + var $resolve = function(value) { + var promise = this; + var then; + if (promise._d) + return; + promise._d = true; + promise = promise._w || promise; + try { + if (promise === value) + throw TypeError2("Promise can't be resolved itself"); + if (then = isThenable(value)) { + microtask(function() { + var wrapper = { _w: promise, _d: false }; + try { + then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1)); + } catch (e) { + $reject.call(wrapper, e); + } + }); + } else { + promise._v = value; + promise._s = 1; + notify(promise, false); + } + } catch (e) { + $reject.call({ _w: promise, _d: false }, e); + } + }; + if (!USE_NATIVE) { + $Promise = function Promise2(executor) { + anInstance(this, $Promise, PROMISE, "_h"); + aFunction(executor); + Internal.call(this); + try { + executor(ctx($resolve, this, 1), ctx($reject, this, 1)); + } catch (err) { + $reject.call(this, err); + } + }; + Internal = function Promise2(executor) { + this._c = []; + this._a = void 0; + this._s = 0; + this._d = false; + this._v = void 0; + this._h = 0; + this._n = false; + }; + Internal.prototype = __webpack_require__(196)($Promise.prototype, { + then: function then(onFulfilled, onRejected) { + var reaction = newPromiseCapability(speciesConstructor(this, $Promise)); + reaction.ok = typeof onFulfilled == "function" ? onFulfilled : true; + reaction.fail = typeof onRejected == "function" && onRejected; + reaction.domain = isNode ? process4.domain : void 0; + this._c.push(reaction); + if (this._a) + this._a.push(reaction); + if (this._s) + notify(this, false); + return reaction.promise; + }, + "catch": function(onRejected) { + return this.then(void 0, onRejected); + } + }); + OwnPromiseCapability = function() { + var promise = new Internal(); + this.promise = promise; + this.resolve = ctx($resolve, promise, 1); + this.reject = ctx($reject, promise, 1); + }; + newPromiseCapabilityModule.f = newPromiseCapability = function(C) { + return C === $Promise || C === Wrapper ? new OwnPromiseCapability(C) : newGenericPromiseCapability(C); + }; + } + $export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise }); + __webpack_require__(71)($Promise, PROMISE); + __webpack_require__(198)(PROMISE); + Wrapper = __webpack_require__(23)[PROMISE]; + $export($export.S + $export.F * !USE_NATIVE, PROMISE, { + reject: function reject(r) { + var capability = newPromiseCapability(this); + var $$reject = capability.reject; + $$reject(r); + return capability.promise; + } + }); + $export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, { + resolve: function resolve(x) { + return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x); + } + }); + $export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(189)(function(iter) { + $Promise.all(iter)["catch"](empty); + })), PROMISE, { + all: function all(iterable) { + var C = this; + var capability = newPromiseCapability(C); + var resolve = capability.resolve; + var reject = capability.reject; + var result = perform(function() { + var values = []; + var index = 0; + var remaining = 1; + forOf(iterable, false, function(promise) { + var $index = index++; + var alreadyCalled = false; + values.push(void 0); + remaining++; + C.resolve(promise).then(function(value) { + if (alreadyCalled) + return; + alreadyCalled = true; + values[$index] = value; + --remaining || resolve(values); + }, reject); + }); + --remaining || resolve(values); + }); + if (result.e) + reject(result.v); + return capability.promise; + }, + race: function race(iterable) { + var C = this; + var capability = newPromiseCapability(C); + var reject = capability.reject; + var result = perform(function() { + forOf(iterable, false, function(promise) { + C.resolve(promise).then(capability.resolve, reject); + }); + }); + if (result.e) + reject(result.v); + return capability.promise; + } + }); + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + var $at = __webpack_require__(199)(true); + __webpack_require__(103)(String, "String", function(iterated) { + this._t = String(iterated); + this._i = 0; + }, function() { + var O = this._t; + var index = this._i; + var point; + if (index >= O.length) + return { value: void 0, done: true }; + point = $at(O, index); + this._i += point.length; + return { value: point, done: false }; + }); + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + var $export = __webpack_require__(41); + var core = __webpack_require__(23); + var global = __webpack_require__(11); + var speciesConstructor = __webpack_require__(108); + var promiseResolve = __webpack_require__(105); + $export($export.P + $export.R, "Promise", { "finally": function(onFinally) { + var C = speciesConstructor(this, core.Promise || global.Promise); + var isFunction = typeof onFinally == "function"; + return this.then( + isFunction ? function(x) { + return promiseResolve(C, onFinally()).then(function() { + return x; + }); + } : onFinally, + isFunction ? function(e) { + return promiseResolve(C, onFinally()).then(function() { + throw e; + }); + } : onFinally + ); + } }); + }, + function(module2, exports2, __webpack_require__) { + "use strict"; + var $export = __webpack_require__(41); + var newPromiseCapability = __webpack_require__(70); + var perform = __webpack_require__(104); + $export($export.S, "Promise", { "try": function(callbackfn) { + var promiseCapability = newPromiseCapability.f(this); + var result = perform(callbackfn); + (result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v); + return promiseCapability.promise; + } }); + }, + function(module2, exports2, __webpack_require__) { + __webpack_require__(204); + var global = __webpack_require__(11); + var hide = __webpack_require__(31); + var Iterators = __webpack_require__(35); + var TO_STRING_TAG = __webpack_require__(13)("toStringTag"); + var DOMIterables = "CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,TextTrackList,TouchList".split(","); + for (var i = 0; i < DOMIterables.length; i++) { + var NAME = DOMIterables[i]; + var Collection2 = global[NAME]; + var proto2 = Collection2 && Collection2.prototype; + if (proto2 && !proto2[TO_STRING_TAG]) + hide(proto2, TO_STRING_TAG, NAME); + Iterators[NAME] = Iterators.Array; + } + }, + function(module2, exports2, __webpack_require__) { + exports2 = module2.exports = __webpack_require__(112); + exports2.log = log; + exports2.formatArgs = formatArgs; + exports2.save = save; + exports2.load = load; + exports2.useColors = useColors; + exports2.storage = "undefined" != typeof chrome && "undefined" != typeof chrome.storage ? chrome.storage.local : localstorage(); + exports2.colors = [ + "#0000CC", + "#0000FF", + "#0033CC", + "#0033FF", + "#0066CC", + "#0066FF", + "#0099CC", + "#0099FF", + "#00CC00", + "#00CC33", + "#00CC66", + "#00CC99", + "#00CCCC", + "#00CCFF", + "#3300CC", + "#3300FF", + "#3333CC", + "#3333FF", + "#3366CC", + "#3366FF", + "#3399CC", + "#3399FF", + "#33CC00", + "#33CC33", + "#33CC66", + "#33CC99", + "#33CCCC", + "#33CCFF", + "#6600CC", + "#6600FF", + "#6633CC", + "#6633FF", + "#66CC00", + "#66CC33", + "#9900CC", + "#9900FF", + "#9933CC", + "#9933FF", + "#99CC00", + "#99CC33", + "#CC0000", + "#CC0033", + "#CC0066", + "#CC0099", + "#CC00CC", + "#CC00FF", + "#CC3300", + "#CC3333", + "#CC3366", + "#CC3399", + "#CC33CC", + "#CC33FF", + "#CC6600", + "#CC6633", + "#CC9900", + "#CC9933", + "#CCCC00", + "#CCCC33", + "#FF0000", + "#FF0033", + "#FF0066", + "#FF0099", + "#FF00CC", + "#FF00FF", + "#FF3300", + "#FF3333", + "#FF3366", + "#FF3399", + "#FF33CC", + "#FF33FF", + "#FF6600", + "#FF6633", + "#FF9900", + "#FF9933", + "#FFCC00", + "#FFCC33" + ]; + function useColors() { + if (typeof window !== "undefined" && window.process && window.process.type === "renderer") { + return true; + } + if (typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { + return false; + } + return typeof document !== "undefined" && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || typeof window !== "undefined" && window.console && (window.console.firebug || window.console.exception && window.console.table) || typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31 || typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/); + } + exports2.formatters.j = function(v) { + try { + return JSON.stringify(v); + } catch (err) { + return "[UnexpectedJSONParseError]: " + err.message; + } + }; + function formatArgs(args) { + var useColors2 = this.useColors; + args[0] = (useColors2 ? "%c" : "") + this.namespace + (useColors2 ? " %c" : " ") + args[0] + (useColors2 ? "%c " : " ") + "+" + exports2.humanize(this.diff); + if (!useColors2) + return; + var c = "color: " + this.color; + args.splice(1, 0, c, "color: inherit"); + var index = 0; + var lastC = 0; + args[0].replace(/%[a-zA-Z%]/g, function(match) { + if ("%%" === match) + return; + index++; + if ("%c" === match) { + lastC = index; + } + }); + args.splice(lastC, 0, c); + } + function log() { + return "object" === typeof console && console.log && Function.prototype.apply.call(console.log, console, arguments); + } + function save(namespaces) { + try { + if (null == namespaces) { + exports2.storage.removeItem("debug"); + } else { + exports2.storage.debug = namespaces; + } + } catch (e) { + } + } + function load() { + var r; + try { + r = exports2.storage.debug; + } catch (e) { + } + if (!r && typeof process !== "undefined" && "env" in process) { + r = process.env.DEBUG; + } + return r; + } + exports2.enable(load()); + function localstorage() { + try { + return window.localStorage; + } catch (e) { + } + } + }, + function(module2, exports2, __webpack_require__) { + if (typeof process === "undefined" || process.type === "renderer") { + module2.exports = __webpack_require__(211); + } else { + module2.exports = __webpack_require__(213); + } + }, + function(module2, exports2, __webpack_require__) { + var tty3 = __webpack_require__(79); + var util = __webpack_require__(2); + exports2 = module2.exports = __webpack_require__(112); + exports2.init = init; + exports2.log = log; + exports2.formatArgs = formatArgs; + exports2.save = save; + exports2.load = load; + exports2.useColors = useColors; + exports2.colors = [6, 2, 3, 4, 5, 1]; + try { + var supportsColor3 = __webpack_require__(239); + if (supportsColor3 && supportsColor3.level >= 2) { + exports2.colors = [ + 20, + 21, + 26, + 27, + 32, + 33, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 56, + 57, + 62, + 63, + 68, + 69, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 92, + 93, + 98, + 99, + 112, + 113, + 128, + 129, + 134, + 135, + 148, + 149, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 178, + 179, + 184, + 185, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 214, + 215, + 220, + 221 + ]; + } + } catch (err) { + } + exports2.inspectOpts = Object.keys(process.env).filter(function(key) { + return /^debug_/i.test(key); + }).reduce(function(obj, key) { + var prop = key.substring(6).toLowerCase().replace(/_([a-z])/g, function(_, k) { + return k.toUpperCase(); + }); + var val = process.env[key]; + if (/^(yes|on|true|enabled)$/i.test(val)) + val = true; + else if (/^(no|off|false|disabled)$/i.test(val)) + val = false; + else if (val === "null") + val = null; + else + val = Number(val); + obj[prop] = val; + return obj; + }, {}); + function useColors() { + return "colors" in exports2.inspectOpts ? Boolean(exports2.inspectOpts.colors) : tty3.isatty(process.stderr.fd); + } + exports2.formatters.o = function(v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts).split("\n").map(function(str) { + return str.trim(); + }).join(" "); + }; + exports2.formatters.O = function(v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts); + }; + function formatArgs(args) { + var name = this.namespace; + var useColors2 = this.useColors; + if (useColors2) { + var c = this.color; + var colorCode = "\x1B[3" + (c < 8 ? c : "8;5;" + c); + var prefix = " " + colorCode + ";1m" + name + " \x1B[0m"; + args[0] = prefix + args[0].split("\n").join("\n" + prefix); + args.push(colorCode + "m+" + exports2.humanize(this.diff) + "\x1B[0m"); + } else { + args[0] = getDate() + name + " " + args[0]; + } + } + function getDate() { + if (exports2.inspectOpts.hideDate) { + return ""; + } else { + return new Date().toISOString() + " "; + } + } + function log() { + return process.stderr.write(util.format.apply(util, arguments) + "\n"); + } + function save(namespaces) { + if (null == namespaces) { + delete process.env.DEBUG; + } else { + process.env.DEBUG = namespaces; + } + } + function load() { + return process.env.DEBUG; + } + function init(debug) { + debug.inspectOpts = {}; + var keys = Object.keys(exports2.inspectOpts); + for (var i = 0; i < keys.length; i++) { + debug.inspectOpts[keys[i]] = exports2.inspectOpts[keys[i]]; + } + } + exports2.enable(load()); + }, + , + , + , + function(module2, exports2, __webpack_require__) { + var pathModule = __webpack_require__(0); + var isWindows = process.platform === "win32"; + var fs = __webpack_require__(3); + var DEBUG = process.env.NODE_DEBUG && /fs/.test(process.env.NODE_DEBUG); + function rethrow() { + var callback; + if (DEBUG) { + var backtrace = new Error(); + callback = debugCallback; + } else + callback = missingCallback; + return callback; + function debugCallback(err) { + if (err) { + backtrace.message = err.message; + err = backtrace; + missingCallback(err); + } + } + function missingCallback(err) { + if (err) { + if (process.throwDeprecation) + throw err; + else if (!process.noDeprecation) { + var msg = "fs: missing callback " + (err.stack || err.message); + if (process.traceDeprecation) + console.trace(msg); + else + console.error(msg); + } + } + } + } + function maybeCallback(cb) { + return typeof cb === "function" ? cb : rethrow(); + } + var normalize = pathModule.normalize; + if (isWindows) { + var nextPartRe = /(.*?)(?:[\/\\]+|$)/g; + } else { + var nextPartRe = /(.*?)(?:[\/]+|$)/g; + } + if (isWindows) { + var splitRootRe = /^(?:[a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/][^\\\/]+)?[\\\/]*/; + } else { + var splitRootRe = /^[\/]*/; + } + exports2.realpathSync = function realpathSync(p, cache) { + p = pathModule.resolve(p); + if (cache && Object.prototype.hasOwnProperty.call(cache, p)) { + return cache[p]; + } + var original = p, seenLinks = {}, knownHard = {}; + var pos; + var current; + var base; + var previous; + start(); + function start() { + var m = splitRootRe.exec(p); + pos = m[0].length; + current = m[0]; + base = m[0]; + previous = ""; + if (isWindows && !knownHard[base]) { + fs.lstatSync(base); + knownHard[base] = true; + } + } + while (pos < p.length) { + nextPartRe.lastIndex = pos; + var result = nextPartRe.exec(p); + previous = current; + current += result[0]; + base = previous + result[1]; + pos = nextPartRe.lastIndex; + if (knownHard[base] || cache && cache[base] === base) { + continue; + } + var resolvedLink; + if (cache && Object.prototype.hasOwnProperty.call(cache, base)) { + resolvedLink = cache[base]; + } else { + var stat = fs.lstatSync(base); + if (!stat.isSymbolicLink()) { + knownHard[base] = true; + if (cache) + cache[base] = base; + continue; + } + var linkTarget = null; + if (!isWindows) { + var id = stat.dev.toString(32) + ":" + stat.ino.toString(32); + if (seenLinks.hasOwnProperty(id)) { + linkTarget = seenLinks[id]; + } + } + if (linkTarget === null) { + fs.statSync(base); + linkTarget = fs.readlinkSync(base); + } + resolvedLink = pathModule.resolve(previous, linkTarget); + if (cache) + cache[base] = resolvedLink; + if (!isWindows) + seenLinks[id] = linkTarget; + } + p = pathModule.resolve(resolvedLink, p.slice(pos)); + start(); + } + if (cache) + cache[original] = p; + return p; + }; + exports2.realpath = function realpath(p, cache, cb) { + if (typeof cb !== "function") { + cb = maybeCallback(cache); + cache = null; + } + p = pathModule.resolve(p); + if (cache && Object.prototype.hasOwnProperty.call(cache, p)) { + return process.nextTick(cb.bind(null, null, cache[p])); + } + var original = p, seenLinks = {}, knownHard = {}; + var pos; + var current; + var base; + var previous; + start(); + function start() { + var m = splitRootRe.exec(p); + pos = m[0].length; + current = m[0]; + base = m[0]; + previous = ""; + if (isWindows && !knownHard[base]) { + fs.lstat(base, function(err) { + if (err) + return cb(err); + knownHard[base] = true; + LOOP(); + }); + } else { + process.nextTick(LOOP); + } + } + function LOOP() { + if (pos >= p.length) { + if (cache) + cache[original] = p; + return cb(null, p); + } + nextPartRe.lastIndex = pos; + var result = nextPartRe.exec(p); + previous = current; + current += result[0]; + base = previous + result[1]; + pos = nextPartRe.lastIndex; + if (knownHard[base] || cache && cache[base] === base) { + return process.nextTick(LOOP); + } + if (cache && Object.prototype.hasOwnProperty.call(cache, base)) { + return gotResolvedLink(cache[base]); + } + return fs.lstat(base, gotStat); + } + function gotStat(err, stat) { + if (err) + return cb(err); + if (!stat.isSymbolicLink()) { + knownHard[base] = true; + if (cache) + cache[base] = base; + return process.nextTick(LOOP); + } + if (!isWindows) { + var id = stat.dev.toString(32) + ":" + stat.ino.toString(32); + if (seenLinks.hasOwnProperty(id)) { + return gotTarget(null, seenLinks[id], base); + } + } + fs.stat(base, function(err2) { + if (err2) + return cb(err2); + fs.readlink(base, function(err3, target) { + if (!isWindows) + seenLinks[id] = target; + gotTarget(err3, target); + }); + }); + } + function gotTarget(err, target, base2) { + if (err) + return cb(err); + var resolvedLink = pathModule.resolve(previous, target); + if (cache) + cache[base2] = resolvedLink; + gotResolvedLink(resolvedLink); + } + function gotResolvedLink(resolvedLink) { + p = pathModule.resolve(resolvedLink, p.slice(pos)); + start(); + } + }; + }, + function(module2, exports2, __webpack_require__) { + module2.exports = globSync; + globSync.GlobSync = GlobSync; + var fs = __webpack_require__(3); + var rp = __webpack_require__(114); + var minimatch = __webpack_require__(60); + var Minimatch = minimatch.Minimatch; + var Glob = __webpack_require__(75).Glob; + var util = __webpack_require__(2); + var path = __webpack_require__(0); + var assert2 = __webpack_require__(22); + var isAbsolute = __webpack_require__(76); + var common = __webpack_require__(115); + var alphasort = common.alphasort; + var alphasorti = common.alphasorti; + var setopts = common.setopts; + var ownProp = common.ownProp; + var childrenIgnored = common.childrenIgnored; + var isIgnored = common.isIgnored; + function globSync(pattern, options) { + if (typeof options === "function" || arguments.length === 3) + throw new TypeError("callback provided to sync glob\nSee: https://github.com/isaacs/node-glob/issues/167"); + return new GlobSync(pattern, options).found; + } + function GlobSync(pattern, options) { + if (!pattern) + throw new Error("must provide pattern"); + if (typeof options === "function" || arguments.length === 3) + throw new TypeError("callback provided to sync glob\nSee: https://github.com/isaacs/node-glob/issues/167"); + if (!(this instanceof GlobSync)) + return new GlobSync(pattern, options); + setopts(this, pattern, options); + if (this.noprocess) + return this; + var n = this.minimatch.set.length; + this.matches = new Array(n); + for (var i = 0; i < n; i++) { + this._process(this.minimatch.set[i], i, false); + } + this._finish(); + } + GlobSync.prototype._finish = function() { + assert2(this instanceof GlobSync); + if (this.realpath) { + var self2 = this; + this.matches.forEach(function(matchset, index) { + var set = self2.matches[index] = /* @__PURE__ */ Object.create(null); + for (var p in matchset) { + try { + p = self2._makeAbs(p); + var real = rp.realpathSync(p, self2.realpathCache); + set[real] = true; + } catch (er) { + if (er.syscall === "stat") + set[self2._makeAbs(p)] = true; + else + throw er; + } + } + }); + } + common.finish(this); + }; + GlobSync.prototype._process = function(pattern, index, inGlobStar) { + assert2(this instanceof GlobSync); + var n = 0; + while (typeof pattern[n] === "string") { + n++; + } + var prefix; + switch (n) { + case pattern.length: + this._processSimple(pattern.join("/"), index); + return; + case 0: + prefix = null; + break; + default: + prefix = pattern.slice(0, n).join("/"); + break; + } + var remain = pattern.slice(n); + var read; + if (prefix === null) + read = "."; + else if (isAbsolute(prefix) || isAbsolute(pattern.join("/"))) { + if (!prefix || !isAbsolute(prefix)) + prefix = "/" + prefix; + read = prefix; + } else + read = prefix; + var abs = this._makeAbs(read); + if (childrenIgnored(this, read)) + return; + var isGlobStar = remain[0] === minimatch.GLOBSTAR; + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar); + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar); + }; + GlobSync.prototype._processReaddir = function(prefix, read, abs, remain, index, inGlobStar) { + var entries = this._readdir(abs, inGlobStar); + if (!entries) + return; + var pn = remain[0]; + var negate = !!this.minimatch.negate; + var rawGlob = pn._glob; + var dotOk = this.dot || rawGlob.charAt(0) === "."; + var matchedEntries = []; + for (var i = 0; i < entries.length; i++) { + var e = entries[i]; + if (e.charAt(0) !== "." || dotOk) { + var m; + if (negate && !prefix) { + m = !e.match(pn); + } else { + m = e.match(pn); + } + if (m) + matchedEntries.push(e); + } + } + var len = matchedEntries.length; + if (len === 0) + return; + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = /* @__PURE__ */ Object.create(null); + for (var i = 0; i < len; i++) { + var e = matchedEntries[i]; + if (prefix) { + if (prefix.slice(-1) !== "/") + e = prefix + "/" + e; + else + e = prefix + e; + } + if (e.charAt(0) === "/" && !this.nomount) { + e = path.join(this.root, e); + } + this._emitMatch(index, e); + } + return; + } + remain.shift(); + for (var i = 0; i < len; i++) { + var e = matchedEntries[i]; + var newPattern; + if (prefix) + newPattern = [prefix, e]; + else + newPattern = [e]; + this._process(newPattern.concat(remain), index, inGlobStar); + } + }; + GlobSync.prototype._emitMatch = function(index, e) { + if (isIgnored(this, e)) + return; + var abs = this._makeAbs(e); + if (this.mark) + e = this._mark(e); + if (this.absolute) { + e = abs; + } + if (this.matches[index][e]) + return; + if (this.nodir) { + var c = this.cache[abs]; + if (c === "DIR" || Array.isArray(c)) + return; + } + this.matches[index][e] = true; + if (this.stat) + this._stat(e); + }; + GlobSync.prototype._readdirInGlobStar = function(abs) { + if (this.follow) + return this._readdir(abs, false); + var entries; + var lstat; + var stat; + try { + lstat = fs.lstatSync(abs); + } catch (er) { + if (er.code === "ENOENT") { + return null; + } + } + var isSym = lstat && lstat.isSymbolicLink(); + this.symlinks[abs] = isSym; + if (!isSym && lstat && !lstat.isDirectory()) + this.cache[abs] = "FILE"; + else + entries = this._readdir(abs, false); + return entries; + }; + GlobSync.prototype._readdir = function(abs, inGlobStar) { + var entries; + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs); + if (ownProp(this.cache, abs)) { + var c = this.cache[abs]; + if (!c || c === "FILE") + return null; + if (Array.isArray(c)) + return c; + } + try { + return this._readdirEntries(abs, fs.readdirSync(abs)); + } catch (er) { + this._readdirError(abs, er); + return null; + } + }; + GlobSync.prototype._readdirEntries = function(abs, entries) { + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i++) { + var e = entries[i]; + if (abs === "/") + e = abs + e; + else + e = abs + "/" + e; + this.cache[e] = true; + } + } + this.cache[abs] = entries; + return entries; + }; + GlobSync.prototype._readdirError = function(f, er) { + switch (er.code) { + case "ENOTSUP": + case "ENOTDIR": + var abs = this._makeAbs(f); + this.cache[abs] = "FILE"; + if (abs === this.cwdAbs) { + var error = new Error(er.code + " invalid cwd " + this.cwd); + error.path = this.cwd; + error.code = er.code; + throw error; + } + break; + case "ENOENT": + case "ELOOP": + case "ENAMETOOLONG": + case "UNKNOWN": + this.cache[this._makeAbs(f)] = false; + break; + default: + this.cache[this._makeAbs(f)] = false; + if (this.strict) + throw er; + if (!this.silent) + console.error("glob error", er); + break; + } + }; + GlobSync.prototype._processGlobStar = function(prefix, read, abs, remain, index, inGlobStar) { + var entries = this._readdir(abs, inGlobStar); + if (!entries) + return; + var remainWithoutGlobStar = remain.slice(1); + var gspref = prefix ? [prefix] : []; + var noGlobStar = gspref.concat(remainWithoutGlobStar); + this._process(noGlobStar, index, false); + var len = entries.length; + var isSym = this.symlinks[abs]; + if (isSym && inGlobStar) + return; + for (var i = 0; i < len; i++) { + var e = entries[i]; + if (e.charAt(0) === "." && !this.dot) + continue; + var instead = gspref.concat(entries[i], remainWithoutGlobStar); + this._process(instead, index, true); + var below = gspref.concat(entries[i], remain); + this._process(below, index, true); + } + }; + GlobSync.prototype._processSimple = function(prefix, index) { + var exists = this._stat(prefix); + if (!this.matches[index]) + this.matches[index] = /* @__PURE__ */ Object.create(null); + if (!exists) + return; + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix); + if (prefix.charAt(0) === "/") { + prefix = path.join(this.root, prefix); + } else { + prefix = path.resolve(this.root, prefix); + if (trail) + prefix += "/"; + } + } + if (process.platform === "win32") + prefix = prefix.replace(/\\/g, "/"); + this._emitMatch(index, prefix); + }; + GlobSync.prototype._stat = function(f) { + var abs = this._makeAbs(f); + var needDir = f.slice(-1) === "/"; + if (f.length > this.maxLength) + return false; + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs]; + if (Array.isArray(c)) + c = "DIR"; + if (!needDir || c === "DIR") + return c; + if (needDir && c === "FILE") + return false; + } + var exists; + var stat = this.statCache[abs]; + if (!stat) { + var lstat; + try { + lstat = fs.lstatSync(abs); + } catch (er) { + if (er && (er.code === "ENOENT" || er.code === "ENOTDIR")) { + this.statCache[abs] = false; + return false; + } + } + if (lstat && lstat.isSymbolicLink()) { + try { + stat = fs.statSync(abs); + } catch (er) { + stat = lstat; + } + } else { + stat = lstat; + } + } + this.statCache[abs] = stat; + var c = true; + if (stat) + c = stat.isDirectory() ? "DIR" : "FILE"; + this.cache[abs] = this.cache[abs] || c; + if (needDir && c === "FILE") + return false; + return c; + }; + GlobSync.prototype._mark = function(p) { + return common.mark(this, p); + }; + GlobSync.prototype._makeAbs = function(f) { + return common.makeAbs(this, f); + }; + }, + , + , + function(module2, exports2, __webpack_require__) { + "use strict"; + module2.exports = function(flag, argv) { + argv = argv || process.argv; + var terminatorPos = argv.indexOf("--"); + var prefix = /^--/.test(flag) ? "" : "--"; + var pos = argv.indexOf(prefix + flag); + return pos !== -1 && (terminatorPos !== -1 ? pos < terminatorPos : true); + }; + }, + , + function(module2, exports2, __webpack_require__) { + var wrappy = __webpack_require__(123); + var reqs = /* @__PURE__ */ Object.create(null); + var once = __webpack_require__(61); + module2.exports = wrappy(inflight); + function inflight(key, cb) { + if (reqs[key]) { + reqs[key].push(cb); + return null; + } else { + reqs[key] = [cb]; + return makeres(key); + } + } + function makeres(key) { + return once(function RES() { + var cbs = reqs[key]; + var len = cbs.length; + var args = slice(arguments); + try { + for (var i = 0; i < len; i++) { + cbs[i].apply(null, args); + } + } finally { + if (cbs.length > len) { + cbs.splice(0, len); + process.nextTick(function() { + RES.apply(null, args); + }); + } else { + delete reqs[key]; + } + } + }); + } + function slice(args) { + var length = args.length; + var array = []; + for (var i = 0; i < length; i++) + array[i] = args[i]; + return array; + } + }, + function(module2, exports2) { + if (typeof Object.create === "function") { + module2.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor; + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; + } else { + module2.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor; + var TempCtor = function() { + }; + TempCtor.prototype = superCtor.prototype; + ctor.prototype = new TempCtor(); + ctor.prototype.constructor = ctor; + }; + } + }, + , + , + function(module2, exports2, __webpack_require__) { + module2.exports = typeof __webpack_require__ !== "undefined"; + }, + , + function(module2, exports2) { + var s = 1e3; + var m = s * 60; + var h = m * 60; + var d = h * 24; + var y = d * 365.25; + module2.exports = function(val, options) { + options = options || {}; + var type = typeof val; + if (type === "string" && val.length > 0) { + return parse3(val); + } else if (type === "number" && isNaN(val) === false) { + return options.long ? fmtLong(val) : fmtShort(val); + } + throw new Error( + "val is not a non-empty string or a valid number. val=" + JSON.stringify(val) + ); + }; + function parse3(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || "ms").toLowerCase(); + switch (type) { + case "years": + case "year": + case "yrs": + case "yr": + case "y": + return n * y; + case "days": + case "day": + case "d": + return n * d; + case "hours": + case "hour": + case "hrs": + case "hr": + case "h": + return n * h; + case "minutes": + case "minute": + case "mins": + case "min": + case "m": + return n * m; + case "seconds": + case "second": + case "secs": + case "sec": + case "s": + return n * s; + case "milliseconds": + case "millisecond": + case "msecs": + case "msec": + case "ms": + return n; + default: + return void 0; + } + } + function fmtShort(ms) { + if (ms >= d) { + return Math.round(ms / d) + "d"; + } + if (ms >= h) { + return Math.round(ms / h) + "h"; + } + if (ms >= m) { + return Math.round(ms / m) + "m"; + } + if (ms >= s) { + return Math.round(ms / s) + "s"; + } + return ms + "ms"; + } + function fmtLong(ms) { + return plural(ms, d, "day") || plural(ms, h, "hour") || plural(ms, m, "minute") || plural(ms, s, "second") || ms + " ms"; + } + function plural(ms, n, name) { + if (ms < n) { + return; + } + if (ms < n * 1.5) { + return Math.floor(ms / n) + " " + name; + } + return Math.ceil(ms / n) + " " + name + "s"; + } + }, + , + , + , + function(module2, exports2, __webpack_require__) { + module2.exports = rimraf; + rimraf.sync = rimrafSync; + var assert2 = __webpack_require__(22); + var path = __webpack_require__(0); + var fs = __webpack_require__(3); + var glob = __webpack_require__(75); + var _0666 = parseInt("666", 8); + var defaultGlobOpts = { + nosort: true, + silent: true + }; + var timeout = 0; + var isWindows = process.platform === "win32"; + function defaults(options) { + var methods = [ + "unlink", + "chmod", + "stat", + "lstat", + "rmdir", + "readdir" + ]; + methods.forEach(function(m) { + options[m] = options[m] || fs[m]; + m = m + "Sync"; + options[m] = options[m] || fs[m]; + }); + options.maxBusyTries = options.maxBusyTries || 3; + options.emfileWait = options.emfileWait || 1e3; + if (options.glob === false) { + options.disableGlob = true; + } + options.disableGlob = options.disableGlob || false; + options.glob = options.glob || defaultGlobOpts; + } + function rimraf(p, options, cb) { + if (typeof options === "function") { + cb = options; + options = {}; + } + assert2(p, "rimraf: missing path"); + assert2.equal(typeof p, "string", "rimraf: path should be a string"); + assert2.equal(typeof cb, "function", "rimraf: callback function required"); + assert2(options, "rimraf: invalid options argument provided"); + assert2.equal(typeof options, "object", "rimraf: options should be object"); + defaults(options); + var busyTries = 0; + var errState = null; + var n = 0; + if (options.disableGlob || !glob.hasMagic(p)) + return afterGlob(null, [p]); + options.lstat(p, function(er, stat) { + if (!er) + return afterGlob(null, [p]); + glob(p, options.glob, afterGlob); + }); + function next(er) { + errState = errState || er; + if (--n === 0) + cb(errState); + } + function afterGlob(er, results) { + if (er) + return cb(er); + n = results.length; + if (n === 0) + return cb(); + results.forEach(function(p2) { + rimraf_(p2, options, function CB(er2) { + if (er2) { + if ((er2.code === "EBUSY" || er2.code === "ENOTEMPTY" || er2.code === "EPERM") && busyTries < options.maxBusyTries) { + busyTries++; + var time = busyTries * 100; + return setTimeout(function() { + rimraf_(p2, options, CB); + }, time); + } + if (er2.code === "EMFILE" && timeout < options.emfileWait) { + return setTimeout(function() { + rimraf_(p2, options, CB); + }, timeout++); + } + if (er2.code === "ENOENT") + er2 = null; + } + timeout = 0; + next(er2); + }); + }); + } + } + function rimraf_(p, options, cb) { + assert2(p); + assert2(options); + assert2(typeof cb === "function"); + options.lstat(p, function(er, st) { + if (er && er.code === "ENOENT") + return cb(null); + if (er && er.code === "EPERM" && isWindows) + fixWinEPERM(p, options, er, cb); + if (st && st.isDirectory()) + return rmdir(p, options, er, cb); + options.unlink(p, function(er2) { + if (er2) { + if (er2.code === "ENOENT") + return cb(null); + if (er2.code === "EPERM") + return isWindows ? fixWinEPERM(p, options, er2, cb) : rmdir(p, options, er2, cb); + if (er2.code === "EISDIR") + return rmdir(p, options, er2, cb); + } + return cb(er2); + }); + }); + } + function fixWinEPERM(p, options, er, cb) { + assert2(p); + assert2(options); + assert2(typeof cb === "function"); + if (er) + assert2(er instanceof Error); + options.chmod(p, _0666, function(er2) { + if (er2) + cb(er2.code === "ENOENT" ? null : er); + else + options.stat(p, function(er3, stats) { + if (er3) + cb(er3.code === "ENOENT" ? null : er); + else if (stats.isDirectory()) + rmdir(p, options, er, cb); + else + options.unlink(p, cb); + }); + }); + } + function fixWinEPERMSync(p, options, er) { + assert2(p); + assert2(options); + if (er) + assert2(er instanceof Error); + try { + options.chmodSync(p, _0666); + } catch (er2) { + if (er2.code === "ENOENT") + return; + else + throw er; + } + try { + var stats = options.statSync(p); + } catch (er3) { + if (er3.code === "ENOENT") + return; + else + throw er; + } + if (stats.isDirectory()) + rmdirSync(p, options, er); + else + options.unlinkSync(p); + } + function rmdir(p, options, originalEr, cb) { + assert2(p); + assert2(options); + if (originalEr) + assert2(originalEr instanceof Error); + assert2(typeof cb === "function"); + options.rmdir(p, function(er) { + if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM")) + rmkids(p, options, cb); + else if (er && er.code === "ENOTDIR") + cb(originalEr); + else + cb(er); + }); + } + function rmkids(p, options, cb) { + assert2(p); + assert2(options); + assert2(typeof cb === "function"); + options.readdir(p, function(er, files) { + if (er) + return cb(er); + var n = files.length; + if (n === 0) + return options.rmdir(p, cb); + var errState; + files.forEach(function(f) { + rimraf(path.join(p, f), options, function(er2) { + if (errState) + return; + if (er2) + return cb(errState = er2); + if (--n === 0) + options.rmdir(p, cb); + }); + }); + }); + } + function rimrafSync(p, options) { + options = options || {}; + defaults(options); + assert2(p, "rimraf: missing path"); + assert2.equal(typeof p, "string", "rimraf: path should be a string"); + assert2(options, "rimraf: missing options"); + assert2.equal(typeof options, "object", "rimraf: options should be object"); + var results; + if (options.disableGlob || !glob.hasMagic(p)) { + results = [p]; + } else { + try { + options.lstatSync(p); + results = [p]; + } catch (er) { + results = glob.sync(p, options.glob); + } + } + if (!results.length) + return; + for (var i = 0; i < results.length; i++) { + var p = results[i]; + try { + var st = options.lstatSync(p); + } catch (er) { + if (er.code === "ENOENT") + return; + if (er.code === "EPERM" && isWindows) + fixWinEPERMSync(p, options, er); + } + try { + if (st && st.isDirectory()) + rmdirSync(p, options, null); + else + options.unlinkSync(p); + } catch (er) { + if (er.code === "ENOENT") + return; + if (er.code === "EPERM") + return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er); + if (er.code !== "EISDIR") + throw er; + rmdirSync(p, options, er); + } + } + } + function rmdirSync(p, options, originalEr) { + assert2(p); + assert2(options); + if (originalEr) + assert2(originalEr instanceof Error); + try { + options.rmdirSync(p); + } catch (er) { + if (er.code === "ENOENT") + return; + if (er.code === "ENOTDIR") + throw originalEr; + if (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM") + rmkidsSync(p, options); + } + } + function rmkidsSync(p, options) { + assert2(p); + assert2(options); + options.readdirSync(p).forEach(function(f) { + rimrafSync(path.join(p, f), options); + }); + var retries = isWindows ? 100 : 1; + var i = 0; + do { + var threw = true; + try { + var ret = options.rmdirSync(p, options); + threw = false; + return ret; + } finally { + if (++i < retries && threw) + continue; + } + } while (true); + } + }, + , + , + , + , + , + function(module2, exports2, __webpack_require__) { + "use strict"; + var hasFlag3 = __webpack_require__(221); + var support = function(level) { + if (level === 0) { + return false; + } + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 + }; + }; + var supportLevel = function() { + if (hasFlag3("no-color") || hasFlag3("no-colors") || hasFlag3("color=false")) { + return 0; + } + if (hasFlag3("color=16m") || hasFlag3("color=full") || hasFlag3("color=truecolor")) { + return 3; + } + if (hasFlag3("color=256")) { + return 2; + } + if (hasFlag3("color") || hasFlag3("colors") || hasFlag3("color=true") || hasFlag3("color=always")) { + return 1; + } + if (process.stdout && !process.stdout.isTTY) { + return 0; + } + if (process.platform === "win32") { + return 1; + } + if ("CI" in process.env) { + if ("TRAVIS" in process.env || process.env.CI === "Travis") { + return 1; + } + return 0; + } + if ("TEAMCITY_VERSION" in process.env) { + return process.env.TEAMCITY_VERSION.match(/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/) === null ? 0 : 1; + } + if (/^(screen|xterm)-256(?:color)?/.test(process.env.TERM)) { + return 2; + } + if (/^screen|^xterm|^vt100|color|ansi|cygwin|linux/i.test(process.env.TERM)) { + return 1; + } + if ("COLORTERM" in process.env) { + return 1; + } + if (process.env.TERM === "dumb") { + return 0; + } + return 0; + }(); + if (supportLevel === 0 && "FORCE_COLOR" in process.env) { + supportLevel = 1; + } + module2.exports = process && support(supportLevel); + } + ]); + } +}); + +// +var require_identity = __commonJS({ + ""(exports) { + "use strict"; + var ALIAS = Symbol.for("yaml.alias"); + var DOC = Symbol.for("yaml.document"); + var MAP = Symbol.for("yaml.map"); + var PAIR = Symbol.for("yaml.pair"); + var SCALAR = Symbol.for("yaml.scalar"); + var SEQ = Symbol.for("yaml.seq"); + var NODE_TYPE = Symbol.for("yaml.node.type"); + var isAlias = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === ALIAS; + var isDocument = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === DOC; + var isMap = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === MAP; + var isPair = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === PAIR; + var isScalar = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === SCALAR; + var isSeq = (node) => !!node && typeof node === "object" && node[NODE_TYPE] === SEQ; + function isCollection(node) { + if (node && typeof node === "object") + switch (node[NODE_TYPE]) { + case MAP: + case SEQ: + return true; + } + return false; + } + function isNode(node) { + if (node && typeof node === "object") + switch (node[NODE_TYPE]) { + case ALIAS: + case MAP: + case SCALAR: + case SEQ: + return true; + } + return false; + } + var hasAnchor = (node) => (isScalar(node) || isCollection(node)) && !!node.anchor; + exports.ALIAS = ALIAS; + exports.DOC = DOC; + exports.MAP = MAP; + exports.NODE_TYPE = NODE_TYPE; + exports.PAIR = PAIR; + exports.SCALAR = SCALAR; + exports.SEQ = SEQ; + exports.hasAnchor = hasAnchor; + exports.isAlias = isAlias; + exports.isCollection = isCollection; + exports.isDocument = isDocument; + exports.isMap = isMap; + exports.isNode = isNode; + exports.isPair = isPair; + exports.isScalar = isScalar; + exports.isSeq = isSeq; + } +}); + +// +var require_visit = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var BREAK = Symbol("break visit"); + var SKIP = Symbol("skip children"); + var REMOVE = Symbol("remove node"); + function visit(node, visitor) { + const visitor_ = initVisitor(visitor); + if (identity.isDocument(node)) { + const cd = visit_(null, node.contents, visitor_, Object.freeze([node])); + if (cd === REMOVE) + node.contents = null; + } else + visit_(null, node, visitor_, Object.freeze([])); + } + visit.BREAK = BREAK; + visit.SKIP = SKIP; + visit.REMOVE = REMOVE; + function visit_(key, node, visitor, path) { + const ctrl = callVisitor(key, node, visitor, path); + if (identity.isNode(ctrl) || identity.isPair(ctrl)) { + replaceNode(key, path, ctrl); + return visit_(key, ctrl, visitor, path); + } + if (typeof ctrl !== "symbol") { + if (identity.isCollection(node)) { + path = Object.freeze(path.concat(node)); + for (let i = 0; i < node.items.length; ++i) { + const ci = visit_(i, node.items[i], visitor, path); + if (typeof ci === "number") + i = ci - 1; + else if (ci === BREAK) + return BREAK; + else if (ci === REMOVE) { + node.items.splice(i, 1); + i -= 1; + } + } + } else if (identity.isPair(node)) { + path = Object.freeze(path.concat(node)); + const ck = visit_("key", node.key, visitor, path); + if (ck === BREAK) + return BREAK; + else if (ck === REMOVE) + node.key = null; + const cv = visit_("value", node.value, visitor, path); + if (cv === BREAK) + return BREAK; + else if (cv === REMOVE) + node.value = null; + } + } + return ctrl; + } + async function visitAsync(node, visitor) { + const visitor_ = initVisitor(visitor); + if (identity.isDocument(node)) { + const cd = await visitAsync_(null, node.contents, visitor_, Object.freeze([node])); + if (cd === REMOVE) + node.contents = null; + } else + await visitAsync_(null, node, visitor_, Object.freeze([])); + } + visitAsync.BREAK = BREAK; + visitAsync.SKIP = SKIP; + visitAsync.REMOVE = REMOVE; + async function visitAsync_(key, node, visitor, path) { + const ctrl = await callVisitor(key, node, visitor, path); + if (identity.isNode(ctrl) || identity.isPair(ctrl)) { + replaceNode(key, path, ctrl); + return visitAsync_(key, ctrl, visitor, path); + } + if (typeof ctrl !== "symbol") { + if (identity.isCollection(node)) { + path = Object.freeze(path.concat(node)); + for (let i = 0; i < node.items.length; ++i) { + const ci = await visitAsync_(i, node.items[i], visitor, path); + if (typeof ci === "number") + i = ci - 1; + else if (ci === BREAK) + return BREAK; + else if (ci === REMOVE) { + node.items.splice(i, 1); + i -= 1; + } + } + } else if (identity.isPair(node)) { + path = Object.freeze(path.concat(node)); + const ck = await visitAsync_("key", node.key, visitor, path); + if (ck === BREAK) + return BREAK; + else if (ck === REMOVE) + node.key = null; + const cv = await visitAsync_("value", node.value, visitor, path); + if (cv === BREAK) + return BREAK; + else if (cv === REMOVE) + node.value = null; + } + } + return ctrl; + } + function initVisitor(visitor) { + if (typeof visitor === "object" && (visitor.Collection || visitor.Node || visitor.Value)) { + return Object.assign({ + Alias: visitor.Node, + Map: visitor.Node, + Scalar: visitor.Node, + Seq: visitor.Node + }, visitor.Value && { + Map: visitor.Value, + Scalar: visitor.Value, + Seq: visitor.Value + }, visitor.Collection && { + Map: visitor.Collection, + Seq: visitor.Collection + }, visitor); + } + return visitor; + } + function callVisitor(key, node, visitor, path) { + var _a, _b, _c, _d, _e; + if (typeof visitor === "function") + return visitor(key, node, path); + if (identity.isMap(node)) + return (_a = visitor.Map) == null ? void 0 : _a.call(visitor, key, node, path); + if (identity.isSeq(node)) + return (_b = visitor.Seq) == null ? void 0 : _b.call(visitor, key, node, path); + if (identity.isPair(node)) + return (_c = visitor.Pair) == null ? void 0 : _c.call(visitor, key, node, path); + if (identity.isScalar(node)) + return (_d = visitor.Scalar) == null ? void 0 : _d.call(visitor, key, node, path); + if (identity.isAlias(node)) + return (_e = visitor.Alias) == null ? void 0 : _e.call(visitor, key, node, path); + return void 0; + } + function replaceNode(key, path, node) { + const parent = path[path.length - 1]; + if (identity.isCollection(parent)) { + parent.items[key] = node; + } else if (identity.isPair(parent)) { + if (key === "key") + parent.key = node; + else + parent.value = node; + } else if (identity.isDocument(parent)) { + parent.contents = node; + } else { + const pt = identity.isAlias(parent) ? "alias" : "scalar"; + throw new Error(`Cannot replace node with ${pt} parent`); + } + } + exports.visit = visit; + exports.visitAsync = visitAsync; + } +}); + +// +var require_directives = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var visit = require_visit(); + var escapeChars = { + "!": "%21", + ",": "%2C", + "[": "%5B", + "]": "%5D", + "{": "%7B", + "}": "%7D" + }; + var escapeTagName = (tn) => tn.replace(/[!,[\]{}]/g, (ch) => escapeChars[ch]); + var Directives = class { + constructor(yaml, tags) { + this.docStart = null; + this.docEnd = false; + this.yaml = Object.assign({}, Directives.defaultYaml, yaml); + this.tags = Object.assign({}, Directives.defaultTags, tags); + } + clone() { + const copy = new Directives(this.yaml, this.tags); + copy.docStart = this.docStart; + return copy; + } + atDocument() { + const res = new Directives(this.yaml, this.tags); + switch (this.yaml.version) { + case "1.1": + this.atNextDocument = true; + break; + case "1.2": + this.atNextDocument = false; + this.yaml = { + explicit: Directives.defaultYaml.explicit, + version: "1.2" + }; + this.tags = Object.assign({}, Directives.defaultTags); + break; + } + return res; + } + add(line, onError) { + if (this.atNextDocument) { + this.yaml = { explicit: Directives.defaultYaml.explicit, version: "1.1" }; + this.tags = Object.assign({}, Directives.defaultTags); + this.atNextDocument = false; + } + const parts = line.trim().split(/[ \t]+/); + const name = parts.shift(); + switch (name) { + case "%TAG": { + if (parts.length !== 2) { + onError(0, "%TAG directive should contain exactly two parts"); + if (parts.length < 2) + return false; + } + const [handle, prefix] = parts; + this.tags[handle] = prefix; + return true; + } + case "%YAML": { + this.yaml.explicit = true; + if (parts.length !== 1) { + onError(0, "%YAML directive should contain exactly one part"); + return false; + } + const [version] = parts; + if (version === "1.1" || version === "1.2") { + this.yaml.version = version; + return true; + } else { + const isValid = /^\d+\.\d+$/.test(version); + onError(6, `Unsupported YAML version ${version}`, isValid); + return false; + } + } + default: + onError(0, `Unknown directive ${name}`, true); + return false; + } + } + tagName(source, onError) { + if (source === "!") + return "!"; + if (source[0] !== "!") { + onError(`Not a valid tag: ${source}`); + return null; + } + if (source[1] === "<") { + const verbatim = source.slice(2, -1); + if (verbatim === "!" || verbatim === "!!") { + onError(`Verbatim tags aren't resolved, so ${source} is invalid.`); + return null; + } + if (source[source.length - 1] !== ">") + onError("Verbatim tags must end with a >"); + return verbatim; + } + const [, handle, suffix] = source.match(/^(.*!)([^!]*)$/s); + if (!suffix) + onError(`The ${source} tag has no suffix`); + const prefix = this.tags[handle]; + if (prefix) { + try { + return prefix + decodeURIComponent(suffix); + } catch (error) { + onError(String(error)); + return null; + } + } + if (handle === "!") + return source; + onError(`Could not resolve tag: ${source}`); + return null; + } + tagString(tag) { + for (const [handle, prefix] of Object.entries(this.tags)) { + if (tag.startsWith(prefix)) + return handle + escapeTagName(tag.substring(prefix.length)); + } + return tag[0] === "!" ? tag : `!<${tag}>`; + } + toString(doc) { + const lines = this.yaml.explicit ? [`%YAML ${this.yaml.version || "1.2"}`] : []; + const tagEntries = Object.entries(this.tags); + let tagNames; + if (doc && tagEntries.length > 0 && identity.isNode(doc.contents)) { + const tags = {}; + visit.visit(doc.contents, (_key, node) => { + if (identity.isNode(node) && node.tag) + tags[node.tag] = true; + }); + tagNames = Object.keys(tags); + } else + tagNames = []; + for (const [handle, prefix] of tagEntries) { + if (handle === "!!" && prefix === "tag:yaml.org,2002:") + continue; + if (!doc || tagNames.some((tn) => tn.startsWith(prefix))) + lines.push(`%TAG ${handle} ${prefix}`); + } + return lines.join("\n"); + } + }; + Directives.defaultYaml = { explicit: false, version: "1.2" }; + Directives.defaultTags = { "!!": "tag:yaml.org,2002:" }; + exports.Directives = Directives; + } +}); + +// +var require_anchors = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var visit = require_visit(); + function anchorIsValid(anchor) { + if (/[\x00-\x19\s,[\]{}]/.test(anchor)) { + const sa = JSON.stringify(anchor); + const msg = `Anchor must not contain whitespace or control characters: ${sa}`; + throw new Error(msg); + } + return true; + } + function anchorNames(root) { + const anchors = /* @__PURE__ */ new Set(); + visit.visit(root, { + Value(_key, node) { + if (node.anchor) + anchors.add(node.anchor); + } + }); + return anchors; + } + function findNewAnchor(prefix, exclude) { + for (let i = 1; true; ++i) { + const name = `${prefix}${i}`; + if (!exclude.has(name)) + return name; + } + } + function createNodeAnchors(doc, prefix) { + const aliasObjects = []; + const sourceObjects = /* @__PURE__ */ new Map(); + let prevAnchors = null; + return { + onAnchor: (source) => { + aliasObjects.push(source); + if (!prevAnchors) + prevAnchors = anchorNames(doc); + const anchor = findNewAnchor(prefix, prevAnchors); + prevAnchors.add(anchor); + return anchor; + }, + setAnchors: () => { + for (const source of aliasObjects) { + const ref = sourceObjects.get(source); + if (typeof ref === "object" && ref.anchor && (identity.isScalar(ref.node) || identity.isCollection(ref.node))) { + ref.node.anchor = ref.anchor; + } else { + const error = new Error("Failed to resolve repeated object (this should not happen)"); + error.source = source; + throw error; + } + } + }, + sourceObjects + }; + } + exports.anchorIsValid = anchorIsValid; + exports.anchorNames = anchorNames; + exports.createNodeAnchors = createNodeAnchors; + exports.findNewAnchor = findNewAnchor; + } +}); + +// +var require_applyReviver = __commonJS({ + ""(exports) { + "use strict"; + function applyReviver(reviver, obj, key, val) { + if (val && typeof val === "object") { + if (Array.isArray(val)) { + for (let i = 0, len = val.length; i < len; ++i) { + const v0 = val[i]; + const v1 = applyReviver(reviver, val, String(i), v0); + if (v1 === void 0) + delete val[i]; + else if (v1 !== v0) + val[i] = v1; + } + } else if (val instanceof Map) { + for (const k of Array.from(val.keys())) { + const v0 = val.get(k); + const v1 = applyReviver(reviver, val, k, v0); + if (v1 === void 0) + val.delete(k); + else if (v1 !== v0) + val.set(k, v1); + } + } else if (val instanceof Set) { + for (const v0 of Array.from(val)) { + const v1 = applyReviver(reviver, val, v0, v0); + if (v1 === void 0) + val.delete(v0); + else if (v1 !== v0) { + val.delete(v0); + val.add(v1); + } + } + } else { + for (const [k, v0] of Object.entries(val)) { + const v1 = applyReviver(reviver, val, k, v0); + if (v1 === void 0) + delete val[k]; + else if (v1 !== v0) + val[k] = v1; + } + } + } + return reviver.call(obj, key, val); + } + exports.applyReviver = applyReviver; + } +}); + +// +var require_toJS = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + function toJS(value, arg, ctx) { + if (Array.isArray(value)) + return value.map((v, i) => toJS(v, String(i), ctx)); + if (value && typeof value.toJSON === "function") { + if (!ctx || !identity.hasAnchor(value)) + return value.toJSON(arg, ctx); + const data = { aliasCount: 0, count: 1, res: void 0 }; + ctx.anchors.set(value, data); + ctx.onCreate = (res2) => { + data.res = res2; + delete ctx.onCreate; + }; + const res = value.toJSON(arg, ctx); + if (ctx.onCreate) + ctx.onCreate(res); + return res; + } + if (typeof value === "bigint" && !(ctx == null ? void 0 : ctx.keep)) + return Number(value); + return value; + } + exports.toJS = toJS; + } +}); + +// +var require_Node = __commonJS({ + ""(exports) { + "use strict"; + var applyReviver = require_applyReviver(); + var identity = require_identity(); + var toJS = require_toJS(); + var NodeBase = class { + constructor(type) { + Object.defineProperty(this, identity.NODE_TYPE, { value: type }); + } + clone() { + const copy = Object.create(Object.getPrototypeOf(this), Object.getOwnPropertyDescriptors(this)); + if (this.range) + copy.range = this.range.slice(); + return copy; + } + toJS(doc, { mapAsMap, maxAliasCount, onAnchor, reviver } = {}) { + if (!identity.isDocument(doc)) + throw new TypeError("A document argument is required"); + const ctx = { + anchors: /* @__PURE__ */ new Map(), + doc, + keep: true, + mapAsMap: mapAsMap === true, + mapKeyWarned: false, + maxAliasCount: typeof maxAliasCount === "number" ? maxAliasCount : 100 + }; + const res = toJS.toJS(this, "", ctx); + if (typeof onAnchor === "function") + for (const { count, res: res2 } of ctx.anchors.values()) + onAnchor(res2, count); + return typeof reviver === "function" ? applyReviver.applyReviver(reviver, { "": res }, "", res) : res; + } + }; + exports.NodeBase = NodeBase; + } +}); + +// +var require_Alias = __commonJS({ + ""(exports) { + "use strict"; + var anchors = require_anchors(); + var visit = require_visit(); + var identity = require_identity(); + var Node = require_Node(); + var toJS = require_toJS(); + var Alias = class extends Node.NodeBase { + constructor(source) { + super(identity.ALIAS); + this.source = source; + Object.defineProperty(this, "tag", { + set() { + throw new Error("Alias nodes cannot have tags"); + } + }); + } + resolve(doc) { + let found = void 0; + visit.visit(doc, { + Node: (_key, node) => { + if (node === this) + return visit.visit.BREAK; + if (node.anchor === this.source) + found = node; + } + }); + return found; + } + toJSON(_arg, ctx) { + if (!ctx) + return { source: this.source }; + const { anchors: anchors2, doc, maxAliasCount } = ctx; + const source = this.resolve(doc); + if (!source) { + const msg = `Unresolved alias (the anchor must be set before the alias): ${this.source}`; + throw new ReferenceError(msg); + } + let data = anchors2.get(source); + if (!data) { + toJS.toJS(source, null, ctx); + data = anchors2.get(source); + } + if (!data || data.res === void 0) { + const msg = "This should not happen: Alias anchor was not resolved?"; + throw new ReferenceError(msg); + } + if (maxAliasCount >= 0) { + data.count += 1; + if (data.aliasCount === 0) + data.aliasCount = getAliasCount(doc, source, anchors2); + if (data.count * data.aliasCount > maxAliasCount) { + const msg = "Excessive alias count indicates a resource exhaustion attack"; + throw new ReferenceError(msg); + } + } + return data.res; + } + toString(ctx, _onComment, _onChompKeep) { + const src = `*${this.source}`; + if (ctx) { + anchors.anchorIsValid(this.source); + if (ctx.options.verifyAliasOrder && !ctx.anchors.has(this.source)) { + const msg = `Unresolved alias (the anchor must be set before the alias): ${this.source}`; + throw new Error(msg); + } + if (ctx.implicitKey) + return `${src} `; + } + return src; + } + }; + function getAliasCount(doc, node, anchors2) { + if (identity.isAlias(node)) { + const source = node.resolve(doc); + const anchor = anchors2 && source && anchors2.get(source); + return anchor ? anchor.count * anchor.aliasCount : 0; + } else if (identity.isCollection(node)) { + let count = 0; + for (const item of node.items) { + const c = getAliasCount(doc, item, anchors2); + if (c > count) + count = c; + } + return count; + } else if (identity.isPair(node)) { + const kc = getAliasCount(doc, node.key, anchors2); + const vc = getAliasCount(doc, node.value, anchors2); + return Math.max(kc, vc); + } + return 1; + } + exports.Alias = Alias; + } +}); + +// +var require_Scalar = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var Node = require_Node(); + var toJS = require_toJS(); + var isScalarValue = (value) => !value || typeof value !== "function" && typeof value !== "object"; + var Scalar = class extends Node.NodeBase { + constructor(value) { + super(identity.SCALAR); + this.value = value; + } + toJSON(arg, ctx) { + return (ctx == null ? void 0 : ctx.keep) ? this.value : toJS.toJS(this.value, arg, ctx); + } + toString() { + return String(this.value); + } + }; + Scalar.BLOCK_FOLDED = "BLOCK_FOLDED"; + Scalar.BLOCK_LITERAL = "BLOCK_LITERAL"; + Scalar.PLAIN = "PLAIN"; + Scalar.QUOTE_DOUBLE = "QUOTE_DOUBLE"; + Scalar.QUOTE_SINGLE = "QUOTE_SINGLE"; + exports.Scalar = Scalar; + exports.isScalarValue = isScalarValue; + } +}); + +// +var require_createNode = __commonJS({ + ""(exports) { + "use strict"; + var Alias = require_Alias(); + var identity = require_identity(); + var Scalar = require_Scalar(); + var defaultTagPrefix = "tag:yaml.org,2002:"; + function findTagObject(value, tagName, tags) { + if (tagName) { + const match = tags.filter((t) => t.tag === tagName); + const tagObj = match.find((t) => !t.format) ?? match[0]; + if (!tagObj) + throw new Error(`Tag ${tagName} not found`); + return tagObj; + } + return tags.find((t) => { + var _a; + return ((_a = t.identify) == null ? void 0 : _a.call(t, value)) && !t.format; + }); + } + function createNode(value, tagName, ctx) { + var _a, _b, _c; + if (identity.isDocument(value)) + value = value.contents; + if (identity.isNode(value)) + return value; + if (identity.isPair(value)) { + const map = (_b = (_a = ctx.schema[identity.MAP]).createNode) == null ? void 0 : _b.call(_a, ctx.schema, null, ctx); + map.items.push(value); + return map; + } + if (value instanceof String || value instanceof Number || value instanceof Boolean || typeof BigInt !== "undefined" && value instanceof BigInt) { + value = value.valueOf(); + } + const { aliasDuplicateObjects, onAnchor, onTagObj, schema, sourceObjects } = ctx; + let ref = void 0; + if (aliasDuplicateObjects && value && typeof value === "object") { + ref = sourceObjects.get(value); + if (ref) { + if (!ref.anchor) + ref.anchor = onAnchor(value); + return new Alias.Alias(ref.anchor); + } else { + ref = { anchor: null, node: null }; + sourceObjects.set(value, ref); + } + } + if (tagName == null ? void 0 : tagName.startsWith("!!")) + tagName = defaultTagPrefix + tagName.slice(2); + let tagObj = findTagObject(value, tagName, schema.tags); + if (!tagObj) { + if (value && typeof value.toJSON === "function") { + value = value.toJSON(); + } + if (!value || typeof value !== "object") { + const node2 = new Scalar.Scalar(value); + if (ref) + ref.node = node2; + return node2; + } + tagObj = value instanceof Map ? schema[identity.MAP] : Symbol.iterator in Object(value) ? schema[identity.SEQ] : schema[identity.MAP]; + } + if (onTagObj) { + onTagObj(tagObj); + delete ctx.onTagObj; + } + const node = (tagObj == null ? void 0 : tagObj.createNode) ? tagObj.createNode(ctx.schema, value, ctx) : typeof ((_c = tagObj == null ? void 0 : tagObj.nodeClass) == null ? void 0 : _c.from) === "function" ? tagObj.nodeClass.from(ctx.schema, value, ctx) : new Scalar.Scalar(value); + if (tagName) + node.tag = tagName; + else if (!tagObj.default) + node.tag = tagObj.tag; + if (ref) + ref.node = node; + return node; + } + exports.createNode = createNode; + } +}); + +// +var require_Collection = __commonJS({ + ""(exports) { + "use strict"; + var createNode = require_createNode(); + var identity = require_identity(); + var Node = require_Node(); + function collectionFromPath(schema, path, value) { + let v = value; + for (let i = path.length - 1; i >= 0; --i) { + const k = path[i]; + if (typeof k === "number" && Number.isInteger(k) && k >= 0) { + const a = []; + a[k] = v; + v = a; + } else { + v = /* @__PURE__ */ new Map([[k, v]]); + } + } + return createNode.createNode(v, void 0, { + aliasDuplicateObjects: false, + keepUndefined: false, + onAnchor: () => { + throw new Error("This should not happen, please report a bug."); + }, + schema, + sourceObjects: /* @__PURE__ */ new Map() + }); + } + var isEmptyPath = (path) => path == null || typeof path === "object" && !!path[Symbol.iterator]().next().done; + var Collection2 = class extends Node.NodeBase { + constructor(type, schema) { + super(type); + Object.defineProperty(this, "schema", { + value: schema, + configurable: true, + enumerable: false, + writable: true + }); + } + clone(schema) { + const copy = Object.create(Object.getPrototypeOf(this), Object.getOwnPropertyDescriptors(this)); + if (schema) + copy.schema = schema; + copy.items = copy.items.map((it) => identity.isNode(it) || identity.isPair(it) ? it.clone(schema) : it); + if (this.range) + copy.range = this.range.slice(); + return copy; + } + addIn(path, value) { + if (isEmptyPath(path)) + this.add(value); + else { + const [key, ...rest] = path; + const node = this.get(key, true); + if (identity.isCollection(node)) + node.addIn(rest, value); + else if (node === void 0 && this.schema) + this.set(key, collectionFromPath(this.schema, rest, value)); + else + throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`); + } + } + deleteIn(path) { + const [key, ...rest] = path; + if (rest.length === 0) + return this.delete(key); + const node = this.get(key, true); + if (identity.isCollection(node)) + return node.deleteIn(rest); + else + throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`); + } + getIn(path, keepScalar) { + const [key, ...rest] = path; + const node = this.get(key, true); + if (rest.length === 0) + return !keepScalar && identity.isScalar(node) ? node.value : node; + else + return identity.isCollection(node) ? node.getIn(rest, keepScalar) : void 0; + } + hasAllNullValues(allowScalar) { + return this.items.every((node) => { + if (!identity.isPair(node)) + return false; + const n = node.value; + return n == null || allowScalar && identity.isScalar(n) && n.value == null && !n.commentBefore && !n.comment && !n.tag; + }); + } + hasIn(path) { + const [key, ...rest] = path; + if (rest.length === 0) + return this.has(key); + const node = this.get(key, true); + return identity.isCollection(node) ? node.hasIn(rest) : false; + } + setIn(path, value) { + const [key, ...rest] = path; + if (rest.length === 0) { + this.set(key, value); + } else { + const node = this.get(key, true); + if (identity.isCollection(node)) + node.setIn(rest, value); + else if (node === void 0 && this.schema) + this.set(key, collectionFromPath(this.schema, rest, value)); + else + throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`); + } + } + }; + exports.Collection = Collection2; + exports.collectionFromPath = collectionFromPath; + exports.isEmptyPath = isEmptyPath; + } +}); + +// +var require_stringifyComment = __commonJS({ + ""(exports) { + "use strict"; + var stringifyComment = (str) => str.replace(/^(?!$)(?: $)?/gm, "#"); + function indentComment(comment, indent) { + if (/^\n+$/.test(comment)) + return comment.substring(1); + return indent ? comment.replace(/^(?! *$)/gm, indent) : comment; + } + var lineComment = (str, indent, comment) => str.endsWith("\n") ? indentComment(comment, indent) : comment.includes("\n") ? "\n" + indentComment(comment, indent) : (str.endsWith(" ") ? "" : " ") + comment; + exports.indentComment = indentComment; + exports.lineComment = lineComment; + exports.stringifyComment = stringifyComment; + } +}); + +// +var require_foldFlowLines = __commonJS({ + ""(exports) { + "use strict"; + var FOLD_FLOW = "flow"; + var FOLD_BLOCK = "block"; + var FOLD_QUOTED = "quoted"; + function foldFlowLines(text, indent, mode = "flow", { indentAtStart, lineWidth = 80, minContentWidth = 20, onFold, onOverflow } = {}) { + if (!lineWidth || lineWidth < 0) + return text; + if (lineWidth < minContentWidth) + minContentWidth = 0; + const endStep = Math.max(1 + minContentWidth, 1 + lineWidth - indent.length); + if (text.length <= endStep) + return text; + const folds = []; + const escapedFolds = {}; + let end = lineWidth - indent.length; + if (typeof indentAtStart === "number") { + if (indentAtStart > lineWidth - Math.max(2, minContentWidth)) + folds.push(0); + else + end = lineWidth - indentAtStart; + } + let split = void 0; + let prev = void 0; + let overflow = false; + let i = -1; + let escStart = -1; + let escEnd = -1; + if (mode === FOLD_BLOCK) { + i = consumeMoreIndentedLines(text, i, indent.length); + if (i !== -1) + end = i + endStep; + } + for (let ch; ch = text[i += 1]; ) { + if (mode === FOLD_QUOTED && ch === "\\") { + escStart = i; + switch (text[i + 1]) { + case "x": + i += 3; + break; + case "u": + i += 5; + break; + case "U": + i += 9; + break; + default: + i += 1; + } + escEnd = i; + } + if (ch === "\n") { + if (mode === FOLD_BLOCK) + i = consumeMoreIndentedLines(text, i, indent.length); + end = i + indent.length + endStep; + split = void 0; + } else { + if (ch === " " && prev && prev !== " " && prev !== "\n" && prev !== " ") { + const next = text[i + 1]; + if (next && next !== " " && next !== "\n" && next !== " ") + split = i; + } + if (i >= end) { + if (split) { + folds.push(split); + end = split + endStep; + split = void 0; + } else if (mode === FOLD_QUOTED) { + while (prev === " " || prev === " ") { + prev = ch; + ch = text[i += 1]; + overflow = true; + } + const j = i > escEnd + 1 ? i - 2 : escStart - 1; + if (escapedFolds[j]) + return text; + folds.push(j); + escapedFolds[j] = true; + end = j + endStep; + split = void 0; + } else { + overflow = true; + } + } + } + prev = ch; + } + if (overflow && onOverflow) + onOverflow(); + if (folds.length === 0) + return text; + if (onFold) + onFold(); + let res = text.slice(0, folds[0]); + for (let i2 = 0; i2 < folds.length; ++i2) { + const fold = folds[i2]; + const end2 = folds[i2 + 1] || text.length; + if (fold === 0) + res = ` +${indent}${text.slice(0, end2)}`; + else { + if (mode === FOLD_QUOTED && escapedFolds[fold]) + res += `${text[fold]}\\`; + res += ` +${indent}${text.slice(fold + 1, end2)}`; + } + } + return res; + } + function consumeMoreIndentedLines(text, i, indent) { + let end = i; + let start = i + 1; + let ch = text[start]; + while (ch === " " || ch === " ") { + if (i < start + indent) { + ch = text[++i]; + } else { + do { + ch = text[++i]; + } while (ch && ch !== "\n"); + end = i; + start = i + 1; + ch = text[start]; + } + } + return end; + } + exports.FOLD_BLOCK = FOLD_BLOCK; + exports.FOLD_FLOW = FOLD_FLOW; + exports.FOLD_QUOTED = FOLD_QUOTED; + exports.foldFlowLines = foldFlowLines; + } +}); + +// +var require_stringifyString = __commonJS({ + ""(exports) { + "use strict"; + var Scalar = require_Scalar(); + var foldFlowLines = require_foldFlowLines(); + var getFoldOptions = (ctx, isBlock) => ({ + indentAtStart: isBlock ? ctx.indent.length : ctx.indentAtStart, + lineWidth: ctx.options.lineWidth, + minContentWidth: ctx.options.minContentWidth + }); + var containsDocumentMarker = (str) => /^(%|---|\.\.\.)/m.test(str); + function lineLengthOverLimit(str, lineWidth, indentLength) { + if (!lineWidth || lineWidth < 0) + return false; + const limit = lineWidth - indentLength; + const strLen = str.length; + if (strLen <= limit) + return false; + for (let i = 0, start = 0; i < strLen; ++i) { + if (str[i] === "\n") { + if (i - start > limit) + return true; + start = i + 1; + if (strLen - start <= limit) + return false; + } + } + return true; + } + function doubleQuotedString(value, ctx) { + const json = JSON.stringify(value); + if (ctx.options.doubleQuotedAsJSON) + return json; + const { implicitKey } = ctx; + const minMultiLineLength = ctx.options.doubleQuotedMinMultiLineLength; + const indent = ctx.indent || (containsDocumentMarker(value) ? " " : ""); + let str = ""; + let start = 0; + for (let i = 0, ch = json[i]; ch; ch = json[++i]) { + if (ch === " " && json[i + 1] === "\\" && json[i + 2] === "n") { + str += json.slice(start, i) + "\\ "; + i += 1; + start = i; + ch = "\\"; + } + if (ch === "\\") + switch (json[i + 1]) { + case "u": + { + str += json.slice(start, i); + const code = json.substr(i + 2, 4); + switch (code) { + case "0000": + str += "\\0"; + break; + case "0007": + str += "\\a"; + break; + case "000b": + str += "\\v"; + break; + case "001b": + str += "\\e"; + break; + case "0085": + str += "\\N"; + break; + case "00a0": + str += "\\_"; + break; + case "2028": + str += "\\L"; + break; + case "2029": + str += "\\P"; + break; + default: + if (code.substr(0, 2) === "00") + str += "\\x" + code.substr(2); + else + str += json.substr(i, 6); + } + i += 5; + start = i + 1; + } + break; + case "n": + if (implicitKey || json[i + 2] === '"' || json.length < minMultiLineLength) { + i += 1; + } else { + str += json.slice(start, i) + "\n\n"; + while (json[i + 2] === "\\" && json[i + 3] === "n" && json[i + 4] !== '"') { + str += "\n"; + i += 2; + } + str += indent; + if (json[i + 2] === " ") + str += "\\"; + i += 1; + start = i + 1; + } + break; + default: + i += 1; + } + } + str = start ? str + json.slice(start) : json; + return implicitKey ? str : foldFlowLines.foldFlowLines(str, indent, foldFlowLines.FOLD_QUOTED, getFoldOptions(ctx, false)); + } + function singleQuotedString(value, ctx) { + if (ctx.options.singleQuote === false || ctx.implicitKey && value.includes("\n") || /[ \t]\n|\n[ \t]/.test(value)) + return doubleQuotedString(value, ctx); + const indent = ctx.indent || (containsDocumentMarker(value) ? " " : ""); + const res = "'" + value.replace(/'/g, "''").replace(/\n+/g, `$& +${indent}`) + "'"; + return ctx.implicitKey ? res : foldFlowLines.foldFlowLines(res, indent, foldFlowLines.FOLD_FLOW, getFoldOptions(ctx, false)); + } + function quotedString(value, ctx) { + const { singleQuote } = ctx.options; + let qs; + if (singleQuote === false) + qs = doubleQuotedString; + else { + const hasDouble = value.includes('"'); + const hasSingle = value.includes("'"); + if (hasDouble && !hasSingle) + qs = singleQuotedString; + else if (hasSingle && !hasDouble) + qs = doubleQuotedString; + else + qs = singleQuote ? singleQuotedString : doubleQuotedString; + } + return qs(value, ctx); + } + var blockEndNewlines; + try { + blockEndNewlines = new RegExp("(^|(?\n"; + let chomp; + let endStart; + for (endStart = value.length; endStart > 0; --endStart) { + const ch = value[endStart - 1]; + if (ch !== "\n" && ch !== " " && ch !== " ") + break; + } + let end = value.substring(endStart); + const endNlPos = end.indexOf("\n"); + if (endNlPos === -1) { + chomp = "-"; + } else if (value === end || endNlPos !== end.length - 1) { + chomp = "+"; + if (onChompKeep) + onChompKeep(); + } else { + chomp = ""; + } + if (end) { + value = value.slice(0, -end.length); + if (end[end.length - 1] === "\n") + end = end.slice(0, -1); + end = end.replace(blockEndNewlines, `$&${indent}`); + } + let startWithSpace = false; + let startEnd; + let startNlPos = -1; + for (startEnd = 0; startEnd < value.length; ++startEnd) { + const ch = value[startEnd]; + if (ch === " ") + startWithSpace = true; + else if (ch === "\n") + startNlPos = startEnd; + else + break; + } + let start = value.substring(0, startNlPos < startEnd ? startNlPos + 1 : startEnd); + if (start) { + value = value.substring(start.length); + start = start.replace(/\n+/g, `$&${indent}`); + } + const indentSize = indent ? "2" : "1"; + let header = (startWithSpace ? indentSize : "") + chomp; + if (comment) { + header += " " + commentString(comment.replace(/ ?[\r\n]+/g, " ")); + if (onComment) + onComment(); + } + if (!literal) { + const foldedValue = value.replace(/\n+/g, "\n$&").replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g, "$1$2").replace(/\n+/g, `$&${indent}`); + let literalFallback = false; + const foldOptions = getFoldOptions(ctx, true); + if (blockQuote !== "folded" && type !== Scalar.Scalar.BLOCK_FOLDED) { + foldOptions.onOverflow = () => { + literalFallback = true; + }; + } + const body = foldFlowLines.foldFlowLines(`${start}${foldedValue}${end}`, indent, foldFlowLines.FOLD_BLOCK, foldOptions); + if (!literalFallback) + return `>${header} +${indent}${body}`; + } + value = value.replace(/\n+/g, `$&${indent}`); + return `|${header} +${indent}${start}${value}${end}`; + } + function plainString(item, ctx, onComment, onChompKeep) { + const { type, value } = item; + const { actualString, implicitKey, indent, indentStep, inFlow } = ctx; + if (implicitKey && value.includes("\n") || inFlow && /[[\]{},]/.test(value)) { + return quotedString(value, ctx); + } + if (!value || /^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(value)) { + return implicitKey || inFlow || !value.includes("\n") ? quotedString(value, ctx) : blockString(item, ctx, onComment, onChompKeep); + } + if (!implicitKey && !inFlow && type !== Scalar.Scalar.PLAIN && value.includes("\n")) { + return blockString(item, ctx, onComment, onChompKeep); + } + if (containsDocumentMarker(value)) { + if (indent === "") { + ctx.forceBlockIndent = true; + return blockString(item, ctx, onComment, onChompKeep); + } else if (implicitKey && indent === indentStep) { + return quotedString(value, ctx); + } + } + const str = value.replace(/\n+/g, `$& +${indent}`); + if (actualString) { + const test = (tag) => { + var _a; + return tag.default && tag.tag !== "tag:yaml.org,2002:str" && ((_a = tag.test) == null ? void 0 : _a.test(str)); + }; + const { compat, tags } = ctx.doc.schema; + if (tags.some(test) || (compat == null ? void 0 : compat.some(test))) + return quotedString(value, ctx); + } + return implicitKey ? str : foldFlowLines.foldFlowLines(str, indent, foldFlowLines.FOLD_FLOW, getFoldOptions(ctx, false)); + } + function stringifyString(item, ctx, onComment, onChompKeep) { + const { implicitKey, inFlow } = ctx; + const ss = typeof item.value === "string" ? item : Object.assign({}, item, { value: String(item.value) }); + let { type } = item; + if (type !== Scalar.Scalar.QUOTE_DOUBLE) { + if (/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(ss.value)) + type = Scalar.Scalar.QUOTE_DOUBLE; + } + const _stringify = (_type) => { + switch (_type) { + case Scalar.Scalar.BLOCK_FOLDED: + case Scalar.Scalar.BLOCK_LITERAL: + return implicitKey || inFlow ? quotedString(ss.value, ctx) : blockString(ss, ctx, onComment, onChompKeep); + case Scalar.Scalar.QUOTE_DOUBLE: + return doubleQuotedString(ss.value, ctx); + case Scalar.Scalar.QUOTE_SINGLE: + return singleQuotedString(ss.value, ctx); + case Scalar.Scalar.PLAIN: + return plainString(ss, ctx, onComment, onChompKeep); + default: + return null; + } + }; + let res = _stringify(type); + if (res === null) { + const { defaultKeyType, defaultStringType } = ctx.options; + const t = implicitKey && defaultKeyType || defaultStringType; + res = _stringify(t); + if (res === null) + throw new Error(`Unsupported default string type ${t}`); + } + return res; + } + exports.stringifyString = stringifyString; + } +}); + +// +var require_stringify = __commonJS({ + ""(exports) { + "use strict"; + var anchors = require_anchors(); + var identity = require_identity(); + var stringifyComment = require_stringifyComment(); + var stringifyString = require_stringifyString(); + function createStringifyContext(doc, options) { + const opt = Object.assign({ + blockQuote: true, + commentString: stringifyComment.stringifyComment, + defaultKeyType: null, + defaultStringType: "PLAIN", + directives: null, + doubleQuotedAsJSON: false, + doubleQuotedMinMultiLineLength: 40, + falseStr: "false", + flowCollectionPadding: true, + indentSeq: true, + lineWidth: 80, + minContentWidth: 20, + nullStr: "null", + simpleKeys: false, + singleQuote: null, + trueStr: "true", + verifyAliasOrder: true + }, doc.schema.toStringOptions, options); + let inFlow; + switch (opt.collectionStyle) { + case "block": + inFlow = false; + break; + case "flow": + inFlow = true; + break; + default: + inFlow = null; + } + return { + anchors: /* @__PURE__ */ new Set(), + doc, + flowCollectionPadding: opt.flowCollectionPadding ? " " : "", + indent: "", + indentStep: typeof opt.indent === "number" ? " ".repeat(opt.indent) : " ", + inFlow, + options: opt + }; + } + function getTagObject(tags, item) { + var _a; + if (item.tag) { + const match = tags.filter((t) => t.tag === item.tag); + if (match.length > 0) + return match.find((t) => t.format === item.format) ?? match[0]; + } + let tagObj = void 0; + let obj; + if (identity.isScalar(item)) { + obj = item.value; + let match = tags.filter((t) => { + var _a2; + return (_a2 = t.identify) == null ? void 0 : _a2.call(t, obj); + }); + if (match.length > 1) { + const testMatch = match.filter((t) => t.test); + if (testMatch.length > 0) + match = testMatch; + } + tagObj = match.find((t) => t.format === item.format) ?? match.find((t) => !t.format); + } else { + obj = item; + tagObj = tags.find((t) => t.nodeClass && obj instanceof t.nodeClass); + } + if (!tagObj) { + const name = ((_a = obj == null ? void 0 : obj.constructor) == null ? void 0 : _a.name) ?? typeof obj; + throw new Error(`Tag not resolved for ${name} value`); + } + return tagObj; + } + function stringifyProps(node, tagObj, { anchors: anchors$1, doc }) { + if (!doc.directives) + return ""; + const props = []; + const anchor = (identity.isScalar(node) || identity.isCollection(node)) && node.anchor; + if (anchor && anchors.anchorIsValid(anchor)) { + anchors$1.add(anchor); + props.push(`&${anchor}`); + } + const tag = node.tag ? node.tag : tagObj.default ? null : tagObj.tag; + if (tag) + props.push(doc.directives.tagString(tag)); + return props.join(" "); + } + function stringify(item, ctx, onComment, onChompKeep) { + var _a; + if (identity.isPair(item)) + return item.toString(ctx, onComment, onChompKeep); + if (identity.isAlias(item)) { + if (ctx.doc.directives) + return item.toString(ctx); + if ((_a = ctx.resolvedAliases) == null ? void 0 : _a.has(item)) { + throw new TypeError(`Cannot stringify circular structure without alias nodes`); + } else { + if (ctx.resolvedAliases) + ctx.resolvedAliases.add(item); + else + ctx.resolvedAliases = /* @__PURE__ */ new Set([item]); + item = item.resolve(ctx.doc); + } + } + let tagObj = void 0; + const node = identity.isNode(item) ? item : ctx.doc.createNode(item, { onTagObj: (o) => tagObj = o }); + if (!tagObj) + tagObj = getTagObject(ctx.doc.schema.tags, node); + const props = stringifyProps(node, tagObj, ctx); + if (props.length > 0) + ctx.indentAtStart = (ctx.indentAtStart ?? 0) + props.length + 1; + const str = typeof tagObj.stringify === "function" ? tagObj.stringify(node, ctx, onComment, onChompKeep) : identity.isScalar(node) ? stringifyString.stringifyString(node, ctx, onComment, onChompKeep) : node.toString(ctx, onComment, onChompKeep); + if (!props) + return str; + return identity.isScalar(node) || str[0] === "{" || str[0] === "[" ? `${props} ${str}` : `${props} +${ctx.indent}${str}`; + } + exports.createStringifyContext = createStringifyContext; + exports.stringify = stringify; + } +}); + +// +var require_stringifyPair = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var Scalar = require_Scalar(); + var stringify = require_stringify(); + var stringifyComment = require_stringifyComment(); + function stringifyPair({ key, value }, ctx, onComment, onChompKeep) { + const { allNullValues, doc, indent, indentStep, options: { commentString, indentSeq, simpleKeys } } = ctx; + let keyComment = identity.isNode(key) && key.comment || null; + if (simpleKeys) { + if (keyComment) { + throw new Error("With simple keys, key nodes cannot have comments"); + } + if (identity.isCollection(key) || !identity.isNode(key) && typeof key === "object") { + const msg = "With simple keys, collection cannot be used as a key value"; + throw new Error(msg); + } + } + let explicitKey = !simpleKeys && (!key || keyComment && value == null && !ctx.inFlow || identity.isCollection(key) || (identity.isScalar(key) ? key.type === Scalar.Scalar.BLOCK_FOLDED || key.type === Scalar.Scalar.BLOCK_LITERAL : typeof key === "object")); + ctx = Object.assign({}, ctx, { + allNullValues: false, + implicitKey: !explicitKey && (simpleKeys || !allNullValues), + indent: indent + indentStep + }); + let keyCommentDone = false; + let chompKeep = false; + let str = stringify.stringify(key, ctx, () => keyCommentDone = true, () => chompKeep = true); + if (!explicitKey && !ctx.inFlow && str.length > 1024) { + if (simpleKeys) + throw new Error("With simple keys, single line scalar must not span more than 1024 characters"); + explicitKey = true; + } + if (ctx.inFlow) { + if (allNullValues || value == null) { + if (keyCommentDone && onComment) + onComment(); + return str === "" ? "?" : explicitKey ? `? ${str}` : str; + } + } else if (allNullValues && !simpleKeys || value == null && explicitKey) { + str = `? ${str}`; + if (keyComment && !keyCommentDone) { + str += stringifyComment.lineComment(str, ctx.indent, commentString(keyComment)); + } else if (chompKeep && onChompKeep) + onChompKeep(); + return str; + } + if (keyCommentDone) + keyComment = null; + if (explicitKey) { + if (keyComment) + str += stringifyComment.lineComment(str, ctx.indent, commentString(keyComment)); + str = `? ${str} +${indent}:`; + } else { + str = `${str}:`; + if (keyComment) + str += stringifyComment.lineComment(str, ctx.indent, commentString(keyComment)); + } + let vsb, vcb, valueComment; + if (identity.isNode(value)) { + vsb = !!value.spaceBefore; + vcb = value.commentBefore; + valueComment = value.comment; + } else { + vsb = false; + vcb = null; + valueComment = null; + if (value && typeof value === "object") + value = doc.createNode(value); + } + ctx.implicitKey = false; + if (!explicitKey && !keyComment && identity.isScalar(value)) + ctx.indentAtStart = str.length + 1; + chompKeep = false; + if (!indentSeq && indentStep.length >= 2 && !ctx.inFlow && !explicitKey && identity.isSeq(value) && !value.flow && !value.tag && !value.anchor) { + ctx.indent = ctx.indent.substring(2); + } + let valueCommentDone = false; + const valueStr = stringify.stringify(value, ctx, () => valueCommentDone = true, () => chompKeep = true); + let ws = " "; + if (keyComment || vsb || vcb) { + ws = vsb ? "\n" : ""; + if (vcb) { + const cs = commentString(vcb); + ws += ` +${stringifyComment.indentComment(cs, ctx.indent)}`; + } + if (valueStr === "" && !ctx.inFlow) { + if (ws === "\n") + ws = "\n\n"; + } else { + ws += ` +${ctx.indent}`; + } + } else if (!explicitKey && identity.isCollection(value)) { + const vs0 = valueStr[0]; + const nl0 = valueStr.indexOf("\n"); + const hasNewline = nl0 !== -1; + const flow = ctx.inFlow ?? value.flow ?? value.items.length === 0; + if (hasNewline || !flow) { + let hasPropsLine = false; + if (hasNewline && (vs0 === "&" || vs0 === "!")) { + let sp0 = valueStr.indexOf(" "); + if (vs0 === "&" && sp0 !== -1 && sp0 < nl0 && valueStr[sp0 + 1] === "!") { + sp0 = valueStr.indexOf(" ", sp0 + 1); + } + if (sp0 === -1 || nl0 < sp0) + hasPropsLine = true; + } + if (!hasPropsLine) + ws = ` +${ctx.indent}`; + } + } else if (valueStr === "" || valueStr[0] === "\n") { + ws = ""; + } + str += ws + valueStr; + if (ctx.inFlow) { + if (valueCommentDone && onComment) + onComment(); + } else if (valueComment && !valueCommentDone) { + str += stringifyComment.lineComment(str, ctx.indent, commentString(valueComment)); + } else if (chompKeep && onChompKeep) { + onChompKeep(); + } + return str; + } + exports.stringifyPair = stringifyPair; + } +}); + +// +var require_log = __commonJS({ + ""(exports) { + "use strict"; + var node_process = __require("process"); + function debug(logLevel, ...messages) { + if (logLevel === "debug") + console.log(...messages); + } + function warn(logLevel, warning) { + if (logLevel === "debug" || logLevel === "warn") { + if (typeof node_process.emitWarning === "function") + node_process.emitWarning(warning); + else + console.warn(warning); + } + } + exports.debug = debug; + exports.warn = warn; + } +}); + +// +var require_merge = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var Scalar = require_Scalar(); + var MERGE_KEY = "<<"; + var merge3 = { + identify: (value) => value === MERGE_KEY || typeof value === "symbol" && value.description === MERGE_KEY, + default: "key", + tag: "tag:yaml.org,2002:merge", + test: /^<<$/, + resolve: () => Object.assign(new Scalar.Scalar(Symbol(MERGE_KEY)), { + addToJSMap: addMergeToJSMap + }), + stringify: () => MERGE_KEY + }; + var isMergeKey = (ctx, key) => (merge3.identify(key) || identity.isScalar(key) && (!key.type || key.type === Scalar.Scalar.PLAIN) && merge3.identify(key.value)) && (ctx == null ? void 0 : ctx.doc.schema.tags.some((tag) => tag.tag === merge3.tag && tag.default)); + function addMergeToJSMap(ctx, map, value) { + value = ctx && identity.isAlias(value) ? value.resolve(ctx.doc) : value; + if (identity.isSeq(value)) + for (const it of value.items) + mergeValue(ctx, map, it); + else if (Array.isArray(value)) + for (const it of value) + mergeValue(ctx, map, it); + else + mergeValue(ctx, map, value); + } + function mergeValue(ctx, map, value) { + const source = ctx && identity.isAlias(value) ? value.resolve(ctx.doc) : value; + if (!identity.isMap(source)) + throw new Error("Merge sources must be maps or map aliases"); + const srcMap = source.toJSON(null, ctx, Map); + for (const [key, value2] of srcMap) { + if (map instanceof Map) { + if (!map.has(key)) + map.set(key, value2); + } else if (map instanceof Set) { + map.add(key); + } else if (!Object.prototype.hasOwnProperty.call(map, key)) { + Object.defineProperty(map, key, { + value: value2, + writable: true, + enumerable: true, + configurable: true + }); + } + } + return map; + } + exports.addMergeToJSMap = addMergeToJSMap; + exports.isMergeKey = isMergeKey; + exports.merge = merge3; + } +}); + +// +var require_addPairToJSMap = __commonJS({ + ""(exports) { + "use strict"; + var log = require_log(); + var merge3 = require_merge(); + var stringify = require_stringify(); + var identity = require_identity(); + var toJS = require_toJS(); + function addPairToJSMap(ctx, map, { key, value }) { + if (identity.isNode(key) && key.addToJSMap) + key.addToJSMap(ctx, map, value); + else if (merge3.isMergeKey(ctx, key)) + merge3.addMergeToJSMap(ctx, map, value); + else { + const jsKey = toJS.toJS(key, "", ctx); + if (map instanceof Map) { + map.set(jsKey, toJS.toJS(value, jsKey, ctx)); + } else if (map instanceof Set) { + map.add(jsKey); + } else { + const stringKey = stringifyKey(key, jsKey, ctx); + const jsValue = toJS.toJS(value, stringKey, ctx); + if (stringKey in map) + Object.defineProperty(map, stringKey, { + value: jsValue, + writable: true, + enumerable: true, + configurable: true + }); + else + map[stringKey] = jsValue; + } + } + return map; + } + function stringifyKey(key, jsKey, ctx) { + if (jsKey === null) + return ""; + if (typeof jsKey !== "object") + return String(jsKey); + if (identity.isNode(key) && (ctx == null ? void 0 : ctx.doc)) { + const strCtx = stringify.createStringifyContext(ctx.doc, {}); + strCtx.anchors = /* @__PURE__ */ new Set(); + for (const node of ctx.anchors.keys()) + strCtx.anchors.add(node.anchor); + strCtx.inFlow = true; + strCtx.inStringifyKey = true; + const strKey = key.toString(strCtx); + if (!ctx.mapKeyWarned) { + let jsonStr = JSON.stringify(strKey); + if (jsonStr.length > 40) + jsonStr = jsonStr.substring(0, 36) + '..."'; + log.warn(ctx.doc.options.logLevel, `Keys with collection values will be stringified due to JS Object restrictions: ${jsonStr}. Set mapAsMap: true to use object keys.`); + ctx.mapKeyWarned = true; + } + return strKey; + } + return JSON.stringify(jsKey); + } + exports.addPairToJSMap = addPairToJSMap; + } +}); + +// +var require_Pair = __commonJS({ + ""(exports) { + "use strict"; + var createNode = require_createNode(); + var stringifyPair = require_stringifyPair(); + var addPairToJSMap = require_addPairToJSMap(); + var identity = require_identity(); + function createPair(key, value, ctx) { + const k = createNode.createNode(key, void 0, ctx); + const v = createNode.createNode(value, void 0, ctx); + return new Pair(k, v); + } + var Pair = class { + constructor(key, value = null) { + Object.defineProperty(this, identity.NODE_TYPE, { value: identity.PAIR }); + this.key = key; + this.value = value; + } + clone(schema) { + let { key, value } = this; + if (identity.isNode(key)) + key = key.clone(schema); + if (identity.isNode(value)) + value = value.clone(schema); + return new Pair(key, value); + } + toJSON(_, ctx) { + const pair = (ctx == null ? void 0 : ctx.mapAsMap) ? /* @__PURE__ */ new Map() : {}; + return addPairToJSMap.addPairToJSMap(ctx, pair, this); + } + toString(ctx, onComment, onChompKeep) { + return (ctx == null ? void 0 : ctx.doc) ? stringifyPair.stringifyPair(this, ctx, onComment, onChompKeep) : JSON.stringify(this); + } + }; + exports.Pair = Pair; + exports.createPair = createPair; + } +}); + +// +var require_stringifyCollection = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var stringify = require_stringify(); + var stringifyComment = require_stringifyComment(); + function stringifyCollection(collection, ctx, options) { + const flow = ctx.inFlow ?? collection.flow; + const stringify2 = flow ? stringifyFlowCollection : stringifyBlockCollection; + return stringify2(collection, ctx, options); + } + function stringifyBlockCollection({ comment, items }, ctx, { blockItemPrefix, flowChars, itemIndent, onChompKeep, onComment }) { + const { indent, options: { commentString } } = ctx; + const itemCtx = Object.assign({}, ctx, { indent: itemIndent, type: null }); + let chompKeep = false; + const lines = []; + for (let i = 0; i < items.length; ++i) { + const item = items[i]; + let comment2 = null; + if (identity.isNode(item)) { + if (!chompKeep && item.spaceBefore) + lines.push(""); + addCommentBefore(ctx, lines, item.commentBefore, chompKeep); + if (item.comment) + comment2 = item.comment; + } else if (identity.isPair(item)) { + const ik = identity.isNode(item.key) ? item.key : null; + if (ik) { + if (!chompKeep && ik.spaceBefore) + lines.push(""); + addCommentBefore(ctx, lines, ik.commentBefore, chompKeep); + } + } + chompKeep = false; + let str2 = stringify.stringify(item, itemCtx, () => comment2 = null, () => chompKeep = true); + if (comment2) + str2 += stringifyComment.lineComment(str2, itemIndent, commentString(comment2)); + if (chompKeep && comment2) + chompKeep = false; + lines.push(blockItemPrefix + str2); + } + let str; + if (lines.length === 0) { + str = flowChars.start + flowChars.end; + } else { + str = lines[0]; + for (let i = 1; i < lines.length; ++i) { + const line = lines[i]; + str += line ? ` +${indent}${line}` : "\n"; + } + } + if (comment) { + str += "\n" + stringifyComment.indentComment(commentString(comment), indent); + if (onComment) + onComment(); + } else if (chompKeep && onChompKeep) + onChompKeep(); + return str; + } + function stringifyFlowCollection({ items }, ctx, { flowChars, itemIndent }) { + const { indent, indentStep, flowCollectionPadding: fcPadding, options: { commentString } } = ctx; + itemIndent += indentStep; + const itemCtx = Object.assign({}, ctx, { + indent: itemIndent, + inFlow: true, + type: null + }); + let reqNewline = false; + let linesAtValue = 0; + const lines = []; + for (let i = 0; i < items.length; ++i) { + const item = items[i]; + let comment = null; + if (identity.isNode(item)) { + if (item.spaceBefore) + lines.push(""); + addCommentBefore(ctx, lines, item.commentBefore, false); + if (item.comment) + comment = item.comment; + } else if (identity.isPair(item)) { + const ik = identity.isNode(item.key) ? item.key : null; + if (ik) { + if (ik.spaceBefore) + lines.push(""); + addCommentBefore(ctx, lines, ik.commentBefore, false); + if (ik.comment) + reqNewline = true; + } + const iv = identity.isNode(item.value) ? item.value : null; + if (iv) { + if (iv.comment) + comment = iv.comment; + if (iv.commentBefore) + reqNewline = true; + } else if (item.value == null && (ik == null ? void 0 : ik.comment)) { + comment = ik.comment; + } + } + if (comment) + reqNewline = true; + let str = stringify.stringify(item, itemCtx, () => comment = null); + if (i < items.length - 1) + str += ","; + if (comment) + str += stringifyComment.lineComment(str, itemIndent, commentString(comment)); + if (!reqNewline && (lines.length > linesAtValue || str.includes("\n"))) + reqNewline = true; + lines.push(str); + linesAtValue = lines.length; + } + const { start, end } = flowChars; + if (lines.length === 0) { + return start + end; + } else { + if (!reqNewline) { + const len = lines.reduce((sum, line) => sum + line.length + 2, 2); + reqNewline = ctx.options.lineWidth > 0 && len > ctx.options.lineWidth; + } + if (reqNewline) { + let str = start; + for (const line of lines) + str += line ? ` +${indentStep}${indent}${line}` : "\n"; + return `${str} +${indent}${end}`; + } else { + return `${start}${fcPadding}${lines.join(" ")}${fcPadding}${end}`; + } + } + } + function addCommentBefore({ indent, options: { commentString } }, lines, comment, chompKeep) { + if (comment && chompKeep) + comment = comment.replace(/^\n+/, ""); + if (comment) { + const ic = stringifyComment.indentComment(commentString(comment), indent); + lines.push(ic.trimStart()); + } + } + exports.stringifyCollection = stringifyCollection; + } +}); + +// +var require_YAMLMap = __commonJS({ + ""(exports) { + "use strict"; + var stringifyCollection = require_stringifyCollection(); + var addPairToJSMap = require_addPairToJSMap(); + var Collection2 = require_Collection(); + var identity = require_identity(); + var Pair = require_Pair(); + var Scalar = require_Scalar(); + function findPair(items, key) { + const k = identity.isScalar(key) ? key.value : key; + for (const it of items) { + if (identity.isPair(it)) { + if (it.key === key || it.key === k) + return it; + if (identity.isScalar(it.key) && it.key.value === k) + return it; + } + } + return void 0; + } + var YAMLMap = class extends Collection2.Collection { + static get tagName() { + return "tag:yaml.org,2002:map"; + } + constructor(schema) { + super(identity.MAP, schema); + this.items = []; + } + static from(schema, obj, ctx) { + const { keepUndefined, replacer } = ctx; + const map = new this(schema); + const add = (key, value) => { + if (typeof replacer === "function") + value = replacer.call(obj, key, value); + else if (Array.isArray(replacer) && !replacer.includes(key)) + return; + if (value !== void 0 || keepUndefined) + map.items.push(Pair.createPair(key, value, ctx)); + }; + if (obj instanceof Map) { + for (const [key, value] of obj) + add(key, value); + } else if (obj && typeof obj === "object") { + for (const key of Object.keys(obj)) + add(key, obj[key]); + } + if (typeof schema.sortMapEntries === "function") { + map.items.sort(schema.sortMapEntries); + } + return map; + } + add(pair, overwrite) { + var _a; + let _pair; + if (identity.isPair(pair)) + _pair = pair; + else if (!pair || typeof pair !== "object" || !("key" in pair)) { + _pair = new Pair.Pair(pair, pair == null ? void 0 : pair.value); + } else + _pair = new Pair.Pair(pair.key, pair.value); + const prev = findPair(this.items, _pair.key); + const sortEntries = (_a = this.schema) == null ? void 0 : _a.sortMapEntries; + if (prev) { + if (!overwrite) + throw new Error(`Key ${_pair.key} already set`); + if (identity.isScalar(prev.value) && Scalar.isScalarValue(_pair.value)) + prev.value.value = _pair.value; + else + prev.value = _pair.value; + } else if (sortEntries) { + const i = this.items.findIndex((item) => sortEntries(_pair, item) < 0); + if (i === -1) + this.items.push(_pair); + else + this.items.splice(i, 0, _pair); + } else { + this.items.push(_pair); + } + } + delete(key) { + const it = findPair(this.items, key); + if (!it) + return false; + const del = this.items.splice(this.items.indexOf(it), 1); + return del.length > 0; + } + get(key, keepScalar) { + const it = findPair(this.items, key); + const node = it == null ? void 0 : it.value; + return (!keepScalar && identity.isScalar(node) ? node.value : node) ?? void 0; + } + has(key) { + return !!findPair(this.items, key); + } + set(key, value) { + this.add(new Pair.Pair(key, value), true); + } + toJSON(_, ctx, Type) { + const map = Type ? new Type() : (ctx == null ? void 0 : ctx.mapAsMap) ? /* @__PURE__ */ new Map() : {}; + if (ctx == null ? void 0 : ctx.onCreate) + ctx.onCreate(map); + for (const item of this.items) + addPairToJSMap.addPairToJSMap(ctx, map, item); + return map; + } + toString(ctx, onComment, onChompKeep) { + if (!ctx) + return JSON.stringify(this); + for (const item of this.items) { + if (!identity.isPair(item)) + throw new Error(`Map items must all be pairs; found ${JSON.stringify(item)} instead`); + } + if (!ctx.allNullValues && this.hasAllNullValues(false)) + ctx = Object.assign({}, ctx, { allNullValues: true }); + return stringifyCollection.stringifyCollection(this, ctx, { + blockItemPrefix: "", + flowChars: { start: "{", end: "}" }, + itemIndent: ctx.indent || "", + onChompKeep, + onComment + }); + } + }; + exports.YAMLMap = YAMLMap; + exports.findPair = findPair; + } +}); + +// +var require_map = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var YAMLMap = require_YAMLMap(); + var map = { + collection: "map", + default: true, + nodeClass: YAMLMap.YAMLMap, + tag: "tag:yaml.org,2002:map", + resolve(map2, onError) { + if (!identity.isMap(map2)) + onError("Expected a mapping for this tag"); + return map2; + }, + createNode: (schema, obj, ctx) => YAMLMap.YAMLMap.from(schema, obj, ctx) + }; + exports.map = map; + } +}); + +// +var require_YAMLSeq = __commonJS({ + ""(exports) { + "use strict"; + var createNode = require_createNode(); + var stringifyCollection = require_stringifyCollection(); + var Collection2 = require_Collection(); + var identity = require_identity(); + var Scalar = require_Scalar(); + var toJS = require_toJS(); + var YAMLSeq = class extends Collection2.Collection { + static get tagName() { + return "tag:yaml.org,2002:seq"; + } + constructor(schema) { + super(identity.SEQ, schema); + this.items = []; + } + add(value) { + this.items.push(value); + } + delete(key) { + const idx = asItemIndex(key); + if (typeof idx !== "number") + return false; + const del = this.items.splice(idx, 1); + return del.length > 0; + } + get(key, keepScalar) { + const idx = asItemIndex(key); + if (typeof idx !== "number") + return void 0; + const it = this.items[idx]; + return !keepScalar && identity.isScalar(it) ? it.value : it; + } + has(key) { + const idx = asItemIndex(key); + return typeof idx === "number" && idx < this.items.length; + } + set(key, value) { + const idx = asItemIndex(key); + if (typeof idx !== "number") + throw new Error(`Expected a valid index, not ${key}.`); + const prev = this.items[idx]; + if (identity.isScalar(prev) && Scalar.isScalarValue(value)) + prev.value = value; + else + this.items[idx] = value; + } + toJSON(_, ctx) { + const seq = []; + if (ctx == null ? void 0 : ctx.onCreate) + ctx.onCreate(seq); + let i = 0; + for (const item of this.items) + seq.push(toJS.toJS(item, String(i++), ctx)); + return seq; + } + toString(ctx, onComment, onChompKeep) { + if (!ctx) + return JSON.stringify(this); + return stringifyCollection.stringifyCollection(this, ctx, { + blockItemPrefix: "- ", + flowChars: { start: "[", end: "]" }, + itemIndent: (ctx.indent || "") + " ", + onChompKeep, + onComment + }); + } + static from(schema, obj, ctx) { + const { replacer } = ctx; + const seq = new this(schema); + if (obj && Symbol.iterator in Object(obj)) { + let i = 0; + for (let it of obj) { + if (typeof replacer === "function") { + const key = obj instanceof Set ? it : String(i++); + it = replacer.call(obj, key, it); + } + seq.items.push(createNode.createNode(it, void 0, ctx)); + } + } + return seq; + } + }; + function asItemIndex(key) { + let idx = identity.isScalar(key) ? key.value : key; + if (idx && typeof idx === "string") + idx = Number(idx); + return typeof idx === "number" && Number.isInteger(idx) && idx >= 0 ? idx : null; + } + exports.YAMLSeq = YAMLSeq; + } +}); + +// +var require_seq = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var YAMLSeq = require_YAMLSeq(); + var seq = { + collection: "seq", + default: true, + nodeClass: YAMLSeq.YAMLSeq, + tag: "tag:yaml.org,2002:seq", + resolve(seq2, onError) { + if (!identity.isSeq(seq2)) + onError("Expected a sequence for this tag"); + return seq2; + }, + createNode: (schema, obj, ctx) => YAMLSeq.YAMLSeq.from(schema, obj, ctx) + }; + exports.seq = seq; + } +}); + +// +var require_string = __commonJS({ + ""(exports) { + "use strict"; + var stringifyString = require_stringifyString(); + var string = { + identify: (value) => typeof value === "string", + default: true, + tag: "tag:yaml.org,2002:str", + resolve: (str) => str, + stringify(item, ctx, onComment, onChompKeep) { + ctx = Object.assign({ actualString: true }, ctx); + return stringifyString.stringifyString(item, ctx, onComment, onChompKeep); + } + }; + exports.string = string; + } +}); + +// +var require_null = __commonJS({ + ""(exports) { + "use strict"; + var Scalar = require_Scalar(); + var nullTag = { + identify: (value) => value == null, + createNode: () => new Scalar.Scalar(null), + default: true, + tag: "tag:yaml.org,2002:null", + test: /^(?:~|[Nn]ull|NULL)?$/, + resolve: () => new Scalar.Scalar(null), + stringify: ({ source }, ctx) => typeof source === "string" && nullTag.test.test(source) ? source : ctx.options.nullStr + }; + exports.nullTag = nullTag; + } +}); + +// +var require_bool = __commonJS({ + ""(exports) { + "use strict"; + var Scalar = require_Scalar(); + var boolTag = { + identify: (value) => typeof value === "boolean", + default: true, + tag: "tag:yaml.org,2002:bool", + test: /^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/, + resolve: (str) => new Scalar.Scalar(str[0] === "t" || str[0] === "T"), + stringify({ source, value }, ctx) { + if (source && boolTag.test.test(source)) { + const sv = source[0] === "t" || source[0] === "T"; + if (value === sv) + return source; + } + return value ? ctx.options.trueStr : ctx.options.falseStr; + } + }; + exports.boolTag = boolTag; + } +}); + +// +var require_stringifyNumber = __commonJS({ + ""(exports) { + "use strict"; + function stringifyNumber({ format, minFractionDigits, tag, value }) { + if (typeof value === "bigint") + return String(value); + const num = typeof value === "number" ? value : Number(value); + if (!isFinite(num)) + return isNaN(num) ? ".nan" : num < 0 ? "-.inf" : ".inf"; + let n = JSON.stringify(value); + if (!format && minFractionDigits && (!tag || tag === "tag:yaml.org,2002:float") && /^\d/.test(n)) { + let i = n.indexOf("."); + if (i < 0) { + i = n.length; + n += "."; + } + let d = minFractionDigits - (n.length - i - 1); + while (d-- > 0) + n += "0"; + } + return n; + } + exports.stringifyNumber = stringifyNumber; + } +}); + +// +var require_float = __commonJS({ + ""(exports) { + "use strict"; + var Scalar = require_Scalar(); + var stringifyNumber = require_stringifyNumber(); + var floatNaN = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + test: /^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/, + resolve: (str) => str.slice(-3).toLowerCase() === "nan" ? NaN : str[0] === "-" ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY, + stringify: stringifyNumber.stringifyNumber + }; + var floatExp = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + format: "EXP", + test: /^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/, + resolve: (str) => parseFloat(str), + stringify(node) { + const num = Number(node.value); + return isFinite(num) ? num.toExponential() : stringifyNumber.stringifyNumber(node); + } + }; + var float = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + test: /^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/, + resolve(str) { + const node = new Scalar.Scalar(parseFloat(str)); + const dot = str.indexOf("."); + if (dot !== -1 && str[str.length - 1] === "0") + node.minFractionDigits = str.length - dot - 1; + return node; + }, + stringify: stringifyNumber.stringifyNumber + }; + exports.float = float; + exports.floatExp = floatExp; + exports.floatNaN = floatNaN; + } +}); + +// +var require_int = __commonJS({ + ""(exports) { + "use strict"; + var stringifyNumber = require_stringifyNumber(); + var intIdentify = (value) => typeof value === "bigint" || Number.isInteger(value); + var intResolve = (str, offset, radix, { intAsBigInt }) => intAsBigInt ? BigInt(str) : parseInt(str.substring(offset), radix); + function intStringify(node, radix, prefix) { + const { value } = node; + if (intIdentify(value) && value >= 0) + return prefix + value.toString(radix); + return stringifyNumber.stringifyNumber(node); + } + var intOct = { + identify: (value) => intIdentify(value) && value >= 0, + default: true, + tag: "tag:yaml.org,2002:int", + format: "OCT", + test: /^0o[0-7]+$/, + resolve: (str, _onError, opt) => intResolve(str, 2, 8, opt), + stringify: (node) => intStringify(node, 8, "0o") + }; + var int = { + identify: intIdentify, + default: true, + tag: "tag:yaml.org,2002:int", + test: /^[-+]?[0-9]+$/, + resolve: (str, _onError, opt) => intResolve(str, 0, 10, opt), + stringify: stringifyNumber.stringifyNumber + }; + var intHex = { + identify: (value) => intIdentify(value) && value >= 0, + default: true, + tag: "tag:yaml.org,2002:int", + format: "HEX", + test: /^0x[0-9a-fA-F]+$/, + resolve: (str, _onError, opt) => intResolve(str, 2, 16, opt), + stringify: (node) => intStringify(node, 16, "0x") + }; + exports.int = int; + exports.intHex = intHex; + exports.intOct = intOct; + } +}); + +// +var require_schema = __commonJS({ + ""(exports) { + "use strict"; + var map = require_map(); + var _null = require_null(); + var seq = require_seq(); + var string = require_string(); + var bool = require_bool(); + var float = require_float(); + var int = require_int(); + var schema = [ + map.map, + seq.seq, + string.string, + _null.nullTag, + bool.boolTag, + int.intOct, + int.int, + int.intHex, + float.floatNaN, + float.floatExp, + float.float + ]; + exports.schema = schema; + } +}); + +// +var require_schema2 = __commonJS({ + ""(exports) { + "use strict"; + var Scalar = require_Scalar(); + var map = require_map(); + var seq = require_seq(); + function intIdentify(value) { + return typeof value === "bigint" || Number.isInteger(value); + } + var stringifyJSON = ({ value }) => JSON.stringify(value); + var jsonScalars = [ + { + identify: (value) => typeof value === "string", + default: true, + tag: "tag:yaml.org,2002:str", + resolve: (str) => str, + stringify: stringifyJSON + }, + { + identify: (value) => value == null, + createNode: () => new Scalar.Scalar(null), + default: true, + tag: "tag:yaml.org,2002:null", + test: /^null$/, + resolve: () => null, + stringify: stringifyJSON + }, + { + identify: (value) => typeof value === "boolean", + default: true, + tag: "tag:yaml.org,2002:bool", + test: /^true$|^false$/, + resolve: (str) => str === "true", + stringify: stringifyJSON + }, + { + identify: intIdentify, + default: true, + tag: "tag:yaml.org,2002:int", + test: /^-?(?:0|[1-9][0-9]*)$/, + resolve: (str, _onError, { intAsBigInt }) => intAsBigInt ? BigInt(str) : parseInt(str, 10), + stringify: ({ value }) => intIdentify(value) ? value.toString() : JSON.stringify(value) + }, + { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + test: /^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/, + resolve: (str) => parseFloat(str), + stringify: stringifyJSON + } + ]; + var jsonError = { + default: true, + tag: "", + test: /^/, + resolve(str, onError) { + onError(`Unresolved plain scalar ${JSON.stringify(str)}`); + return str; + } + }; + var schema = [map.map, seq.seq].concat(jsonScalars, jsonError); + exports.schema = schema; + } +}); + +// +var require_binary = __commonJS({ + ""(exports) { + "use strict"; + var node_buffer = __require("buffer"); + var Scalar = require_Scalar(); + var stringifyString = require_stringifyString(); + var binary = { + identify: (value) => value instanceof Uint8Array, + default: false, + tag: "tag:yaml.org,2002:binary", + resolve(src, onError) { + if (typeof node_buffer.Buffer === "function") { + return node_buffer.Buffer.from(src, "base64"); + } else if (typeof atob === "function") { + const str = atob(src.replace(/[\n\r]/g, "")); + const buffer = new Uint8Array(str.length); + for (let i = 0; i < str.length; ++i) + buffer[i] = str.charCodeAt(i); + return buffer; + } else { + onError("This environment does not support reading binary tags; either Buffer or atob is required"); + return src; + } + }, + stringify({ comment, type, value }, ctx, onComment, onChompKeep) { + const buf = value; + let str; + if (typeof node_buffer.Buffer === "function") { + str = buf instanceof node_buffer.Buffer ? buf.toString("base64") : node_buffer.Buffer.from(buf.buffer).toString("base64"); + } else if (typeof btoa === "function") { + let s = ""; + for (let i = 0; i < buf.length; ++i) + s += String.fromCharCode(buf[i]); + str = btoa(s); + } else { + throw new Error("This environment does not support writing binary tags; either Buffer or btoa is required"); + } + if (!type) + type = Scalar.Scalar.BLOCK_LITERAL; + if (type !== Scalar.Scalar.QUOTE_DOUBLE) { + const lineWidth = Math.max(ctx.options.lineWidth - ctx.indent.length, ctx.options.minContentWidth); + const n = Math.ceil(str.length / lineWidth); + const lines = new Array(n); + for (let i = 0, o = 0; i < n; ++i, o += lineWidth) { + lines[i] = str.substr(o, lineWidth); + } + str = lines.join(type === Scalar.Scalar.BLOCK_LITERAL ? "\n" : " "); + } + return stringifyString.stringifyString({ comment, type, value: str }, ctx, onComment, onChompKeep); + } + }; + exports.binary = binary; + } +}); + +// +var require_pairs = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var Pair = require_Pair(); + var Scalar = require_Scalar(); + var YAMLSeq = require_YAMLSeq(); + function resolvePairs(seq, onError) { + if (identity.isSeq(seq)) { + for (let i = 0; i < seq.items.length; ++i) { + let item = seq.items[i]; + if (identity.isPair(item)) + continue; + else if (identity.isMap(item)) { + if (item.items.length > 1) + onError("Each pair must have its own sequence indicator"); + const pair = item.items[0] || new Pair.Pair(new Scalar.Scalar(null)); + if (item.commentBefore) + pair.key.commentBefore = pair.key.commentBefore ? `${item.commentBefore} +${pair.key.commentBefore}` : item.commentBefore; + if (item.comment) { + const cn = pair.value ?? pair.key; + cn.comment = cn.comment ? `${item.comment} +${cn.comment}` : item.comment; + } + item = pair; + } + seq.items[i] = identity.isPair(item) ? item : new Pair.Pair(item); + } + } else + onError("Expected a sequence for this tag"); + return seq; + } + function createPairs(schema, iterable, ctx) { + const { replacer } = ctx; + const pairs2 = new YAMLSeq.YAMLSeq(schema); + pairs2.tag = "tag:yaml.org,2002:pairs"; + let i = 0; + if (iterable && Symbol.iterator in Object(iterable)) + for (let it of iterable) { + if (typeof replacer === "function") + it = replacer.call(iterable, String(i++), it); + let key, value; + if (Array.isArray(it)) { + if (it.length === 2) { + key = it[0]; + value = it[1]; + } else + throw new TypeError(`Expected [key, value] tuple: ${it}`); + } else if (it && it instanceof Object) { + const keys = Object.keys(it); + if (keys.length === 1) { + key = keys[0]; + value = it[key]; + } else { + throw new TypeError(`Expected tuple with one key, not ${keys.length} keys`); + } + } else { + key = it; + } + pairs2.items.push(Pair.createPair(key, value, ctx)); + } + return pairs2; + } + var pairs = { + collection: "seq", + default: false, + tag: "tag:yaml.org,2002:pairs", + resolve: resolvePairs, + createNode: createPairs + }; + exports.createPairs = createPairs; + exports.pairs = pairs; + exports.resolvePairs = resolvePairs; + } +}); + +// +var require_omap = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var toJS = require_toJS(); + var YAMLMap = require_YAMLMap(); + var YAMLSeq = require_YAMLSeq(); + var pairs = require_pairs(); + var YAMLOMap = class extends YAMLSeq.YAMLSeq { + constructor() { + super(); + this.add = YAMLMap.YAMLMap.prototype.add.bind(this); + this.delete = YAMLMap.YAMLMap.prototype.delete.bind(this); + this.get = YAMLMap.YAMLMap.prototype.get.bind(this); + this.has = YAMLMap.YAMLMap.prototype.has.bind(this); + this.set = YAMLMap.YAMLMap.prototype.set.bind(this); + this.tag = YAMLOMap.tag; + } + toJSON(_, ctx) { + if (!ctx) + return super.toJSON(_); + const map = /* @__PURE__ */ new Map(); + if (ctx == null ? void 0 : ctx.onCreate) + ctx.onCreate(map); + for (const pair of this.items) { + let key, value; + if (identity.isPair(pair)) { + key = toJS.toJS(pair.key, "", ctx); + value = toJS.toJS(pair.value, key, ctx); + } else { + key = toJS.toJS(pair, "", ctx); + } + if (map.has(key)) + throw new Error("Ordered maps must not include duplicate keys"); + map.set(key, value); + } + return map; + } + static from(schema, iterable, ctx) { + const pairs$1 = pairs.createPairs(schema, iterable, ctx); + const omap2 = new this(); + omap2.items = pairs$1.items; + return omap2; + } + }; + YAMLOMap.tag = "tag:yaml.org,2002:omap"; + var omap = { + collection: "seq", + identify: (value) => value instanceof Map, + nodeClass: YAMLOMap, + default: false, + tag: "tag:yaml.org,2002:omap", + resolve(seq, onError) { + const pairs$1 = pairs.resolvePairs(seq, onError); + const seenKeys = []; + for (const { key } of pairs$1.items) { + if (identity.isScalar(key)) { + if (seenKeys.includes(key.value)) { + onError(`Ordered maps must not include duplicate keys: ${key.value}`); + } else { + seenKeys.push(key.value); + } + } + } + return Object.assign(new YAMLOMap(), pairs$1); + }, + createNode: (schema, iterable, ctx) => YAMLOMap.from(schema, iterable, ctx) + }; + exports.YAMLOMap = YAMLOMap; + exports.omap = omap; + } +}); + +// +var require_bool2 = __commonJS({ + ""(exports) { + "use strict"; + var Scalar = require_Scalar(); + function boolStringify({ value, source }, ctx) { + const boolObj = value ? trueTag : falseTag; + if (source && boolObj.test.test(source)) + return source; + return value ? ctx.options.trueStr : ctx.options.falseStr; + } + var trueTag = { + identify: (value) => value === true, + default: true, + tag: "tag:yaml.org,2002:bool", + test: /^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/, + resolve: () => new Scalar.Scalar(true), + stringify: boolStringify + }; + var falseTag = { + identify: (value) => value === false, + default: true, + tag: "tag:yaml.org,2002:bool", + test: /^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/, + resolve: () => new Scalar.Scalar(false), + stringify: boolStringify + }; + exports.falseTag = falseTag; + exports.trueTag = trueTag; + } +}); + +// +var require_float2 = __commonJS({ + ""(exports) { + "use strict"; + var Scalar = require_Scalar(); + var stringifyNumber = require_stringifyNumber(); + var floatNaN = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + test: /^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/, + resolve: (str) => str.slice(-3).toLowerCase() === "nan" ? NaN : str[0] === "-" ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY, + stringify: stringifyNumber.stringifyNumber + }; + var floatExp = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + format: "EXP", + test: /^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/, + resolve: (str) => parseFloat(str.replace(/_/g, "")), + stringify(node) { + const num = Number(node.value); + return isFinite(num) ? num.toExponential() : stringifyNumber.stringifyNumber(node); + } + }; + var float = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + test: /^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/, + resolve(str) { + const node = new Scalar.Scalar(parseFloat(str.replace(/_/g, ""))); + const dot = str.indexOf("."); + if (dot !== -1) { + const f = str.substring(dot + 1).replace(/_/g, ""); + if (f[f.length - 1] === "0") + node.minFractionDigits = f.length; + } + return node; + }, + stringify: stringifyNumber.stringifyNumber + }; + exports.float = float; + exports.floatExp = floatExp; + exports.floatNaN = floatNaN; + } +}); + +// +var require_int2 = __commonJS({ + ""(exports) { + "use strict"; + var stringifyNumber = require_stringifyNumber(); + var intIdentify = (value) => typeof value === "bigint" || Number.isInteger(value); + function intResolve(str, offset, radix, { intAsBigInt }) { + const sign = str[0]; + if (sign === "-" || sign === "+") + offset += 1; + str = str.substring(offset).replace(/_/g, ""); + if (intAsBigInt) { + switch (radix) { + case 2: + str = `0b${str}`; + break; + case 8: + str = `0o${str}`; + break; + case 16: + str = `0x${str}`; + break; + } + const n2 = BigInt(str); + return sign === "-" ? BigInt(-1) * n2 : n2; + } + const n = parseInt(str, radix); + return sign === "-" ? -1 * n : n; + } + function intStringify(node, radix, prefix) { + const { value } = node; + if (intIdentify(value)) { + const str = value.toString(radix); + return value < 0 ? "-" + prefix + str.substr(1) : prefix + str; + } + return stringifyNumber.stringifyNumber(node); + } + var intBin = { + identify: intIdentify, + default: true, + tag: "tag:yaml.org,2002:int", + format: "BIN", + test: /^[-+]?0b[0-1_]+$/, + resolve: (str, _onError, opt) => intResolve(str, 2, 2, opt), + stringify: (node) => intStringify(node, 2, "0b") + }; + var intOct = { + identify: intIdentify, + default: true, + tag: "tag:yaml.org,2002:int", + format: "OCT", + test: /^[-+]?0[0-7_]+$/, + resolve: (str, _onError, opt) => intResolve(str, 1, 8, opt), + stringify: (node) => intStringify(node, 8, "0") + }; + var int = { + identify: intIdentify, + default: true, + tag: "tag:yaml.org,2002:int", + test: /^[-+]?[0-9][0-9_]*$/, + resolve: (str, _onError, opt) => intResolve(str, 0, 10, opt), + stringify: stringifyNumber.stringifyNumber + }; + var intHex = { + identify: intIdentify, + default: true, + tag: "tag:yaml.org,2002:int", + format: "HEX", + test: /^[-+]?0x[0-9a-fA-F_]+$/, + resolve: (str, _onError, opt) => intResolve(str, 2, 16, opt), + stringify: (node) => intStringify(node, 16, "0x") + }; + exports.int = int; + exports.intBin = intBin; + exports.intHex = intHex; + exports.intOct = intOct; + } +}); + +// +var require_set = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var Pair = require_Pair(); + var YAMLMap = require_YAMLMap(); + var YAMLSet = class extends YAMLMap.YAMLMap { + constructor(schema) { + super(schema); + this.tag = YAMLSet.tag; + } + add(key) { + let pair; + if (identity.isPair(key)) + pair = key; + else if (key && typeof key === "object" && "key" in key && "value" in key && key.value === null) + pair = new Pair.Pair(key.key, null); + else + pair = new Pair.Pair(key, null); + const prev = YAMLMap.findPair(this.items, pair.key); + if (!prev) + this.items.push(pair); + } + get(key, keepPair) { + const pair = YAMLMap.findPair(this.items, key); + return !keepPair && identity.isPair(pair) ? identity.isScalar(pair.key) ? pair.key.value : pair.key : pair; + } + set(key, value) { + if (typeof value !== "boolean") + throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof value}`); + const prev = YAMLMap.findPair(this.items, key); + if (prev && !value) { + this.items.splice(this.items.indexOf(prev), 1); + } else if (!prev && value) { + this.items.push(new Pair.Pair(key)); + } + } + toJSON(_, ctx) { + return super.toJSON(_, ctx, Set); + } + toString(ctx, onComment, onChompKeep) { + if (!ctx) + return JSON.stringify(this); + if (this.hasAllNullValues(true)) + return super.toString(Object.assign({}, ctx, { allNullValues: true }), onComment, onChompKeep); + else + throw new Error("Set items must all have null values"); + } + static from(schema, iterable, ctx) { + const { replacer } = ctx; + const set2 = new this(schema); + if (iterable && Symbol.iterator in Object(iterable)) + for (let value of iterable) { + if (typeof replacer === "function") + value = replacer.call(iterable, value, value); + set2.items.push(Pair.createPair(value, null, ctx)); + } + return set2; + } + }; + YAMLSet.tag = "tag:yaml.org,2002:set"; + var set = { + collection: "map", + identify: (value) => value instanceof Set, + nodeClass: YAMLSet, + default: false, + tag: "tag:yaml.org,2002:set", + createNode: (schema, iterable, ctx) => YAMLSet.from(schema, iterable, ctx), + resolve(map, onError) { + if (identity.isMap(map)) { + if (map.hasAllNullValues(true)) + return Object.assign(new YAMLSet(), map); + else + onError("Set items must all have null values"); + } else + onError("Expected a mapping for this tag"); + return map; + } + }; + exports.YAMLSet = YAMLSet; + exports.set = set; + } +}); + +// +var require_timestamp = __commonJS({ + ""(exports) { + "use strict"; + var stringifyNumber = require_stringifyNumber(); + function parseSexagesimal(str, asBigInt) { + const sign = str[0]; + const parts = sign === "-" || sign === "+" ? str.substring(1) : str; + const num = (n) => asBigInt ? BigInt(n) : Number(n); + const res = parts.replace(/_/g, "").split(":").reduce((res2, p) => res2 * num(60) + num(p), num(0)); + return sign === "-" ? num(-1) * res : res; + } + function stringifySexagesimal(node) { + let { value } = node; + let num = (n) => n; + if (typeof value === "bigint") + num = (n) => BigInt(n); + else if (isNaN(value) || !isFinite(value)) + return stringifyNumber.stringifyNumber(node); + let sign = ""; + if (value < 0) { + sign = "-"; + value *= num(-1); + } + const _60 = num(60); + const parts = [value % _60]; + if (value < 60) { + parts.unshift(0); + } else { + value = (value - parts[0]) / _60; + parts.unshift(value % _60); + if (value >= 60) { + value = (value - parts[0]) / _60; + parts.unshift(value); + } + } + return sign + parts.map((n) => String(n).padStart(2, "0")).join(":").replace(/000000\d*$/, ""); + } + var intTime = { + identify: (value) => typeof value === "bigint" || Number.isInteger(value), + default: true, + tag: "tag:yaml.org,2002:int", + format: "TIME", + test: /^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/, + resolve: (str, _onError, { intAsBigInt }) => parseSexagesimal(str, intAsBigInt), + stringify: stringifySexagesimal + }; + var floatTime = { + identify: (value) => typeof value === "number", + default: true, + tag: "tag:yaml.org,2002:float", + format: "TIME", + test: /^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*$/, + resolve: (str) => parseSexagesimal(str, false), + stringify: stringifySexagesimal + }; + var timestamp = { + identify: (value) => value instanceof Date, + default: true, + tag: "tag:yaml.org,2002:timestamp", + test: RegExp("^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$"), + resolve(str) { + const match = str.match(timestamp.test); + if (!match) + throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd"); + const [, year, month, day, hour, minute, second] = match.map(Number); + const millisec = match[7] ? Number((match[7] + "00").substr(1, 3)) : 0; + let date = Date.UTC(year, month - 1, day, hour || 0, minute || 0, second || 0, millisec); + const tz = match[8]; + if (tz && tz !== "Z") { + let d = parseSexagesimal(tz, false); + if (Math.abs(d) < 30) + d *= 60; + date -= 6e4 * d; + } + return new Date(date); + }, + stringify: ({ value }) => value.toISOString().replace(/(T00:00:00)?\.000Z$/, "") + }; + exports.floatTime = floatTime; + exports.intTime = intTime; + exports.timestamp = timestamp; + } +}); + +// +var require_schema3 = __commonJS({ + ""(exports) { + "use strict"; + var map = require_map(); + var _null = require_null(); + var seq = require_seq(); + var string = require_string(); + var binary = require_binary(); + var bool = require_bool2(); + var float = require_float2(); + var int = require_int2(); + var merge3 = require_merge(); + var omap = require_omap(); + var pairs = require_pairs(); + var set = require_set(); + var timestamp = require_timestamp(); + var schema = [ + map.map, + seq.seq, + string.string, + _null.nullTag, + bool.trueTag, + bool.falseTag, + int.intBin, + int.intOct, + int.int, + int.intHex, + float.floatNaN, + float.floatExp, + float.float, + binary.binary, + merge3.merge, + omap.omap, + pairs.pairs, + set.set, + timestamp.intTime, + timestamp.floatTime, + timestamp.timestamp + ]; + exports.schema = schema; + } +}); + +// +var require_tags = __commonJS({ + ""(exports) { + "use strict"; + var map = require_map(); + var _null = require_null(); + var seq = require_seq(); + var string = require_string(); + var bool = require_bool(); + var float = require_float(); + var int = require_int(); + var schema = require_schema(); + var schema$1 = require_schema2(); + var binary = require_binary(); + var merge3 = require_merge(); + var omap = require_omap(); + var pairs = require_pairs(); + var schema$2 = require_schema3(); + var set = require_set(); + var timestamp = require_timestamp(); + var schemas = /* @__PURE__ */ new Map([ + ["core", schema.schema], + ["failsafe", [map.map, seq.seq, string.string]], + ["json", schema$1.schema], + ["yaml11", schema$2.schema], + ["yaml-1.1", schema$2.schema] + ]); + var tagsByName = { + binary: binary.binary, + bool: bool.boolTag, + float: float.float, + floatExp: float.floatExp, + floatNaN: float.floatNaN, + floatTime: timestamp.floatTime, + int: int.int, + intHex: int.intHex, + intOct: int.intOct, + intTime: timestamp.intTime, + map: map.map, + merge: merge3.merge, + null: _null.nullTag, + omap: omap.omap, + pairs: pairs.pairs, + seq: seq.seq, + set: set.set, + timestamp: timestamp.timestamp + }; + var coreKnownTags = { + "tag:yaml.org,2002:binary": binary.binary, + "tag:yaml.org,2002:merge": merge3.merge, + "tag:yaml.org,2002:omap": omap.omap, + "tag:yaml.org,2002:pairs": pairs.pairs, + "tag:yaml.org,2002:set": set.set, + "tag:yaml.org,2002:timestamp": timestamp.timestamp + }; + function getTags(customTags, schemaName, addMergeTag) { + const schemaTags = schemas.get(schemaName); + if (schemaTags && !customTags) { + return addMergeTag && !schemaTags.includes(merge3.merge) ? schemaTags.concat(merge3.merge) : schemaTags.slice(); + } + let tags = schemaTags; + if (!tags) { + if (Array.isArray(customTags)) + tags = []; + else { + const keys = Array.from(schemas.keys()).filter((key) => key !== "yaml11").map((key) => JSON.stringify(key)).join(", "); + throw new Error(`Unknown schema "${schemaName}"; use one of ${keys} or define customTags array`); + } + } + if (Array.isArray(customTags)) { + for (const tag of customTags) + tags = tags.concat(tag); + } else if (typeof customTags === "function") { + tags = customTags(tags.slice()); + } + if (addMergeTag) + tags = tags.concat(merge3.merge); + return tags.reduce((tags2, tag) => { + const tagObj = typeof tag === "string" ? tagsByName[tag] : tag; + if (!tagObj) { + const tagName = JSON.stringify(tag); + const keys = Object.keys(tagsByName).map((key) => JSON.stringify(key)).join(", "); + throw new Error(`Unknown custom tag ${tagName}; use one of ${keys}`); + } + if (!tags2.includes(tagObj)) + tags2.push(tagObj); + return tags2; + }, []); + } + exports.coreKnownTags = coreKnownTags; + exports.getTags = getTags; + } +}); + +// +var require_Schema = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var map = require_map(); + var seq = require_seq(); + var string = require_string(); + var tags = require_tags(); + var sortMapEntriesByKey = (a, b) => a.key < b.key ? -1 : a.key > b.key ? 1 : 0; + var Schema = class { + constructor({ compat, customTags, merge: merge3, resolveKnownTags, schema, sortMapEntries, toStringDefaults }) { + this.compat = Array.isArray(compat) ? tags.getTags(compat, "compat") : compat ? tags.getTags(null, compat) : null; + this.name = typeof schema === "string" && schema || "core"; + this.knownTags = resolveKnownTags ? tags.coreKnownTags : {}; + this.tags = tags.getTags(customTags, this.name, merge3); + this.toStringOptions = toStringDefaults ?? null; + Object.defineProperty(this, identity.MAP, { value: map.map }); + Object.defineProperty(this, identity.SCALAR, { value: string.string }); + Object.defineProperty(this, identity.SEQ, { value: seq.seq }); + this.sortMapEntries = typeof sortMapEntries === "function" ? sortMapEntries : sortMapEntries === true ? sortMapEntriesByKey : null; + } + clone() { + const copy = Object.create(Schema.prototype, Object.getOwnPropertyDescriptors(this)); + copy.tags = this.tags.slice(); + return copy; + } + }; + exports.Schema = Schema; + } +}); + +// +var require_stringifyDocument = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var stringify = require_stringify(); + var stringifyComment = require_stringifyComment(); + function stringifyDocument(doc, options) { + var _a; + const lines = []; + let hasDirectives = options.directives === true; + if (options.directives !== false && doc.directives) { + const dir = doc.directives.toString(doc); + if (dir) { + lines.push(dir); + hasDirectives = true; + } else if (doc.directives.docStart) + hasDirectives = true; + } + if (hasDirectives) + lines.push("---"); + const ctx = stringify.createStringifyContext(doc, options); + const { commentString } = ctx.options; + if (doc.commentBefore) { + if (lines.length !== 1) + lines.unshift(""); + const cs = commentString(doc.commentBefore); + lines.unshift(stringifyComment.indentComment(cs, "")); + } + let chompKeep = false; + let contentComment = null; + if (doc.contents) { + if (identity.isNode(doc.contents)) { + if (doc.contents.spaceBefore && hasDirectives) + lines.push(""); + if (doc.contents.commentBefore) { + const cs = commentString(doc.contents.commentBefore); + lines.push(stringifyComment.indentComment(cs, "")); + } + ctx.forceBlockIndent = !!doc.comment; + contentComment = doc.contents.comment; + } + const onChompKeep = contentComment ? void 0 : () => chompKeep = true; + let body = stringify.stringify(doc.contents, ctx, () => contentComment = null, onChompKeep); + if (contentComment) + body += stringifyComment.lineComment(body, "", commentString(contentComment)); + if ((body[0] === "|" || body[0] === ">") && lines[lines.length - 1] === "---") { + lines[lines.length - 1] = `--- ${body}`; + } else + lines.push(body); + } else { + lines.push(stringify.stringify(doc.contents, ctx)); + } + if ((_a = doc.directives) == null ? void 0 : _a.docEnd) { + if (doc.comment) { + const cs = commentString(doc.comment); + if (cs.includes("\n")) { + lines.push("..."); + lines.push(stringifyComment.indentComment(cs, "")); + } else { + lines.push(`... ${cs}`); + } + } else { + lines.push("..."); + } + } else { + let dc = doc.comment; + if (dc && chompKeep) + dc = dc.replace(/^\n+/, ""); + if (dc) { + if ((!chompKeep || contentComment) && lines[lines.length - 1] !== "") + lines.push(""); + lines.push(stringifyComment.indentComment(commentString(dc), "")); + } + } + return lines.join("\n") + "\n"; + } + exports.stringifyDocument = stringifyDocument; + } +}); + +// +var require_Document = __commonJS({ + ""(exports) { + "use strict"; + var Alias = require_Alias(); + var Collection2 = require_Collection(); + var identity = require_identity(); + var Pair = require_Pair(); + var toJS = require_toJS(); + var Schema = require_Schema(); + var stringifyDocument = require_stringifyDocument(); + var anchors = require_anchors(); + var applyReviver = require_applyReviver(); + var createNode = require_createNode(); + var directives = require_directives(); + var Document = class { + constructor(value, replacer, options) { + this.commentBefore = null; + this.comment = null; + this.errors = []; + this.warnings = []; + Object.defineProperty(this, identity.NODE_TYPE, { value: identity.DOC }); + let _replacer = null; + if (typeof replacer === "function" || Array.isArray(replacer)) { + _replacer = replacer; + } else if (options === void 0 && replacer) { + options = replacer; + replacer = void 0; + } + const opt = Object.assign({ + intAsBigInt: false, + keepSourceTokens: false, + logLevel: "warn", + prettyErrors: true, + strict: true, + stringKeys: false, + uniqueKeys: true, + version: "1.2" + }, options); + this.options = opt; + let { version } = opt; + if (options == null ? void 0 : options._directives) { + this.directives = options._directives.atDocument(); + if (this.directives.yaml.explicit) + version = this.directives.yaml.version; + } else + this.directives = new directives.Directives({ version }); + this.setSchema(version, options); + this.contents = value === void 0 ? null : this.createNode(value, _replacer, options); + } + clone() { + const copy = Object.create(Document.prototype, { + [identity.NODE_TYPE]: { value: identity.DOC } + }); + copy.commentBefore = this.commentBefore; + copy.comment = this.comment; + copy.errors = this.errors.slice(); + copy.warnings = this.warnings.slice(); + copy.options = Object.assign({}, this.options); + if (this.directives) + copy.directives = this.directives.clone(); + copy.schema = this.schema.clone(); + copy.contents = identity.isNode(this.contents) ? this.contents.clone(copy.schema) : this.contents; + if (this.range) + copy.range = this.range.slice(); + return copy; + } + add(value) { + if (assertCollection(this.contents)) + this.contents.add(value); + } + addIn(path, value) { + if (assertCollection(this.contents)) + this.contents.addIn(path, value); + } + createAlias(node, name) { + if (!node.anchor) { + const prev = anchors.anchorNames(this); + node.anchor = !name || prev.has(name) ? anchors.findNewAnchor(name || "a", prev) : name; + } + return new Alias.Alias(node.anchor); + } + createNode(value, replacer, options) { + let _replacer = void 0; + if (typeof replacer === "function") { + value = replacer.call({ "": value }, "", value); + _replacer = replacer; + } else if (Array.isArray(replacer)) { + const keyToStr = (v) => typeof v === "number" || v instanceof String || v instanceof Number; + const asStr = replacer.filter(keyToStr).map(String); + if (asStr.length > 0) + replacer = replacer.concat(asStr); + _replacer = replacer; + } else if (options === void 0 && replacer) { + options = replacer; + replacer = void 0; + } + const { aliasDuplicateObjects, anchorPrefix, flow, keepUndefined, onTagObj, tag } = options ?? {}; + const { onAnchor, setAnchors, sourceObjects } = anchors.createNodeAnchors( + this, + anchorPrefix || "a" + ); + const ctx = { + aliasDuplicateObjects: aliasDuplicateObjects ?? true, + keepUndefined: keepUndefined ?? false, + onAnchor, + onTagObj, + replacer: _replacer, + schema: this.schema, + sourceObjects + }; + const node = createNode.createNode(value, tag, ctx); + if (flow && identity.isCollection(node)) + node.flow = true; + setAnchors(); + return node; + } + createPair(key, value, options = {}) { + const k = this.createNode(key, null, options); + const v = this.createNode(value, null, options); + return new Pair.Pair(k, v); + } + delete(key) { + return assertCollection(this.contents) ? this.contents.delete(key) : false; + } + deleteIn(path) { + if (Collection2.isEmptyPath(path)) { + if (this.contents == null) + return false; + this.contents = null; + return true; + } + return assertCollection(this.contents) ? this.contents.deleteIn(path) : false; + } + get(key, keepScalar) { + return identity.isCollection(this.contents) ? this.contents.get(key, keepScalar) : void 0; + } + getIn(path, keepScalar) { + if (Collection2.isEmptyPath(path)) + return !keepScalar && identity.isScalar(this.contents) ? this.contents.value : this.contents; + return identity.isCollection(this.contents) ? this.contents.getIn(path, keepScalar) : void 0; + } + has(key) { + return identity.isCollection(this.contents) ? this.contents.has(key) : false; + } + hasIn(path) { + if (Collection2.isEmptyPath(path)) + return this.contents !== void 0; + return identity.isCollection(this.contents) ? this.contents.hasIn(path) : false; + } + set(key, value) { + if (this.contents == null) { + this.contents = Collection2.collectionFromPath(this.schema, [key], value); + } else if (assertCollection(this.contents)) { + this.contents.set(key, value); + } + } + setIn(path, value) { + if (Collection2.isEmptyPath(path)) { + this.contents = value; + } else if (this.contents == null) { + this.contents = Collection2.collectionFromPath(this.schema, Array.from(path), value); + } else if (assertCollection(this.contents)) { + this.contents.setIn(path, value); + } + } + setSchema(version, options = {}) { + if (typeof version === "number") + version = String(version); + let opt; + switch (version) { + case "1.1": + if (this.directives) + this.directives.yaml.version = "1.1"; + else + this.directives = new directives.Directives({ version: "1.1" }); + opt = { resolveKnownTags: false, schema: "yaml-1.1" }; + break; + case "1.2": + case "next": + if (this.directives) + this.directives.yaml.version = version; + else + this.directives = new directives.Directives({ version }); + opt = { resolveKnownTags: true, schema: "core" }; + break; + case null: + if (this.directives) + delete this.directives; + opt = null; + break; + default: { + const sv = JSON.stringify(version); + throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${sv}`); + } + } + if (options.schema instanceof Object) + this.schema = options.schema; + else if (opt) + this.schema = new Schema.Schema(Object.assign(opt, options)); + else + throw new Error(`With a null YAML version, the { schema: Schema } option is required`); + } + toJS({ json, jsonArg, mapAsMap, maxAliasCount, onAnchor, reviver } = {}) { + const ctx = { + anchors: /* @__PURE__ */ new Map(), + doc: this, + keep: !json, + mapAsMap: mapAsMap === true, + mapKeyWarned: false, + maxAliasCount: typeof maxAliasCount === "number" ? maxAliasCount : 100 + }; + const res = toJS.toJS(this.contents, jsonArg ?? "", ctx); + if (typeof onAnchor === "function") + for (const { count, res: res2 } of ctx.anchors.values()) + onAnchor(res2, count); + return typeof reviver === "function" ? applyReviver.applyReviver(reviver, { "": res }, "", res) : res; + } + toJSON(jsonArg, onAnchor) { + return this.toJS({ json: true, jsonArg, mapAsMap: false, onAnchor }); + } + toString(options = {}) { + if (this.errors.length > 0) + throw new Error("Document with errors cannot be stringified"); + if ("indent" in options && (!Number.isInteger(options.indent) || Number(options.indent) <= 0)) { + const s = JSON.stringify(options.indent); + throw new Error(`"indent" option must be a positive integer, not ${s}`); + } + return stringifyDocument.stringifyDocument(this, options); + } + }; + function assertCollection(contents) { + if (identity.isCollection(contents)) + return true; + throw new Error("Expected a YAML collection as document contents"); + } + exports.Document = Document; + } +}); + +// +var require_errors = __commonJS({ + ""(exports) { + "use strict"; + var YAMLError = class extends Error { + constructor(name, pos, code, message) { + super(); + this.name = name; + this.code = code; + this.message = message; + this.pos = pos; + } + }; + var YAMLParseError = class extends YAMLError { + constructor(pos, code, message) { + super("YAMLParseError", pos, code, message); + } + }; + var YAMLWarning = class extends YAMLError { + constructor(pos, code, message) { + super("YAMLWarning", pos, code, message); + } + }; + var prettifyError = (src, lc) => (error) => { + if (error.pos[0] === -1) + return; + error.linePos = error.pos.map((pos) => lc.linePos(pos)); + const { line, col } = error.linePos[0]; + error.message += ` at line ${line}, column ${col}`; + let ci = col - 1; + let lineStr = src.substring(lc.lineStarts[line - 1], lc.lineStarts[line]).replace(/[\n\r]+$/, ""); + if (ci >= 60 && lineStr.length > 80) { + const trimStart = Math.min(ci - 39, lineStr.length - 79); + lineStr = "\u2026" + lineStr.substring(trimStart); + ci -= trimStart - 1; + } + if (lineStr.length > 80) + lineStr = lineStr.substring(0, 79) + "\u2026"; + if (line > 1 && /^ *$/.test(lineStr.substring(0, ci))) { + let prev = src.substring(lc.lineStarts[line - 2], lc.lineStarts[line - 1]); + if (prev.length > 80) + prev = prev.substring(0, 79) + "\u2026\n"; + lineStr = prev + lineStr; + } + if (/[^ ]/.test(lineStr)) { + let count = 1; + const end = error.linePos[1]; + if (end && end.line === line && end.col > col) { + count = Math.max(1, Math.min(end.col - col, 80 - ci)); + } + const pointer = " ".repeat(ci) + "^".repeat(count); + error.message += `: + +${lineStr} +${pointer} +`; + } + }; + exports.YAMLError = YAMLError; + exports.YAMLParseError = YAMLParseError; + exports.YAMLWarning = YAMLWarning; + exports.prettifyError = prettifyError; + } +}); + +// +var require_resolve_props = __commonJS({ + ""(exports) { + "use strict"; + function resolveProps(tokens, { flow, indicator, next, offset, onError, parentIndent, startOnNewline }) { + let spaceBefore = false; + let atNewline = startOnNewline; + let hasSpace = startOnNewline; + let comment = ""; + let commentSep = ""; + let hasNewline = false; + let reqSpace = false; + let tab = null; + let anchor = null; + let tag = null; + let newlineAfterProp = null; + let comma = null; + let found = null; + let start = null; + for (const token of tokens) { + if (reqSpace) { + if (token.type !== "space" && token.type !== "newline" && token.type !== "comma") + onError(token.offset, "MISSING_CHAR", "Tags and anchors must be separated from the next token by white space"); + reqSpace = false; + } + if (tab) { + if (atNewline && token.type !== "comment" && token.type !== "newline") { + onError(tab, "TAB_AS_INDENT", "Tabs are not allowed as indentation"); + } + tab = null; + } + switch (token.type) { + case "space": + if (!flow && (indicator !== "doc-start" || (next == null ? void 0 : next.type) !== "flow-collection") && token.source.includes(" ")) { + tab = token; + } + hasSpace = true; + break; + case "comment": { + if (!hasSpace) + onError(token, "MISSING_CHAR", "Comments must be separated from other tokens by white space characters"); + const cb = token.source.substring(1) || " "; + if (!comment) + comment = cb; + else + comment += commentSep + cb; + commentSep = ""; + atNewline = false; + break; + } + case "newline": + if (atNewline) { + if (comment) + comment += token.source; + else if (!found || indicator !== "seq-item-ind") + spaceBefore = true; + } else + commentSep += token.source; + atNewline = true; + hasNewline = true; + if (anchor || tag) + newlineAfterProp = token; + hasSpace = true; + break; + case "anchor": + if (anchor) + onError(token, "MULTIPLE_ANCHORS", "A node can have at most one anchor"); + if (token.source.endsWith(":")) + onError(token.offset + token.source.length - 1, "BAD_ALIAS", "Anchor ending in : is ambiguous", true); + anchor = token; + if (start === null) + start = token.offset; + atNewline = false; + hasSpace = false; + reqSpace = true; + break; + case "tag": { + if (tag) + onError(token, "MULTIPLE_TAGS", "A node can have at most one tag"); + tag = token; + if (start === null) + start = token.offset; + atNewline = false; + hasSpace = false; + reqSpace = true; + break; + } + case indicator: + if (anchor || tag) + onError(token, "BAD_PROP_ORDER", `Anchors and tags must be after the ${token.source} indicator`); + if (found) + onError(token, "UNEXPECTED_TOKEN", `Unexpected ${token.source} in ${flow ?? "collection"}`); + found = token; + atNewline = indicator === "seq-item-ind" || indicator === "explicit-key-ind"; + hasSpace = false; + break; + case "comma": + if (flow) { + if (comma) + onError(token, "UNEXPECTED_TOKEN", `Unexpected , in ${flow}`); + comma = token; + atNewline = false; + hasSpace = false; + break; + } + default: + onError(token, "UNEXPECTED_TOKEN", `Unexpected ${token.type} token`); + atNewline = false; + hasSpace = false; + } + } + const last = tokens[tokens.length - 1]; + const end = last ? last.offset + last.source.length : offset; + if (reqSpace && next && next.type !== "space" && next.type !== "newline" && next.type !== "comma" && (next.type !== "scalar" || next.source !== "")) { + onError(next.offset, "MISSING_CHAR", "Tags and anchors must be separated from the next token by white space"); + } + if (tab && (atNewline && tab.indent <= parentIndent || (next == null ? void 0 : next.type) === "block-map" || (next == null ? void 0 : next.type) === "block-seq")) + onError(tab, "TAB_AS_INDENT", "Tabs are not allowed as indentation"); + return { + comma, + found, + spaceBefore, + comment, + hasNewline, + anchor, + tag, + newlineAfterProp, + end, + start: start ?? end + }; + } + exports.resolveProps = resolveProps; + } +}); + +// +var require_util_contains_newline = __commonJS({ + ""(exports) { + "use strict"; + function containsNewline(key) { + if (!key) + return null; + switch (key.type) { + case "alias": + case "scalar": + case "double-quoted-scalar": + case "single-quoted-scalar": + if (key.source.includes("\n")) + return true; + if (key.end) { + for (const st of key.end) + if (st.type === "newline") + return true; + } + return false; + case "flow-collection": + for (const it of key.items) { + for (const st of it.start) + if (st.type === "newline") + return true; + if (it.sep) { + for (const st of it.sep) + if (st.type === "newline") + return true; + } + if (containsNewline(it.key) || containsNewline(it.value)) + return true; + } + return false; + default: + return true; + } + } + exports.containsNewline = containsNewline; + } +}); + +// +var require_util_flow_indent_check = __commonJS({ + ""(exports) { + "use strict"; + var utilContainsNewline = require_util_contains_newline(); + function flowIndentCheck(indent, fc, onError) { + if ((fc == null ? void 0 : fc.type) === "flow-collection") { + const end = fc.end[0]; + if (end.indent === indent && (end.source === "]" || end.source === "}") && utilContainsNewline.containsNewline(fc)) { + const msg = "Flow end indicator should be more indented than parent"; + onError(end, "BAD_INDENT", msg, true); + } + } + } + exports.flowIndentCheck = flowIndentCheck; + } +}); + +// +var require_util_map_includes = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + function mapIncludes(ctx, items, search) { + const { uniqueKeys } = ctx.options; + if (uniqueKeys === false) + return false; + const isEqual = typeof uniqueKeys === "function" ? uniqueKeys : (a, b) => a === b || identity.isScalar(a) && identity.isScalar(b) && a.value === b.value; + return items.some((pair) => isEqual(pair.key, search)); + } + exports.mapIncludes = mapIncludes; + } +}); + +// +var require_resolve_block_map = __commonJS({ + ""(exports) { + "use strict"; + var Pair = require_Pair(); + var YAMLMap = require_YAMLMap(); + var resolveProps = require_resolve_props(); + var utilContainsNewline = require_util_contains_newline(); + var utilFlowIndentCheck = require_util_flow_indent_check(); + var utilMapIncludes = require_util_map_includes(); + var startColMsg = "All mapping items must start at the same column"; + function resolveBlockMap({ composeNode, composeEmptyNode }, ctx, bm, onError, tag) { + var _a; + const NodeClass = (tag == null ? void 0 : tag.nodeClass) ?? YAMLMap.YAMLMap; + const map = new NodeClass(ctx.schema); + if (ctx.atRoot) + ctx.atRoot = false; + let offset = bm.offset; + let commentEnd = null; + for (const collItem of bm.items) { + const { start, key, sep, value } = collItem; + const keyProps = resolveProps.resolveProps(start, { + indicator: "explicit-key-ind", + next: key ?? (sep == null ? void 0 : sep[0]), + offset, + onError, + parentIndent: bm.indent, + startOnNewline: true + }); + const implicitKey = !keyProps.found; + if (implicitKey) { + if (key) { + if (key.type === "block-seq") + onError(offset, "BLOCK_AS_IMPLICIT_KEY", "A block sequence may not be used as an implicit map key"); + else if ("indent" in key && key.indent !== bm.indent) + onError(offset, "BAD_INDENT", startColMsg); + } + if (!keyProps.anchor && !keyProps.tag && !sep) { + commentEnd = keyProps.end; + if (keyProps.comment) { + if (map.comment) + map.comment += "\n" + keyProps.comment; + else + map.comment = keyProps.comment; + } + continue; + } + if (keyProps.newlineAfterProp || utilContainsNewline.containsNewline(key)) { + onError(key ?? start[start.length - 1], "MULTILINE_IMPLICIT_KEY", "Implicit keys need to be on a single line"); + } + } else if (((_a = keyProps.found) == null ? void 0 : _a.indent) !== bm.indent) { + onError(offset, "BAD_INDENT", startColMsg); + } + ctx.atKey = true; + const keyStart = keyProps.end; + const keyNode = key ? composeNode(ctx, key, keyProps, onError) : composeEmptyNode(ctx, keyStart, start, null, keyProps, onError); + if (ctx.schema.compat) + utilFlowIndentCheck.flowIndentCheck(bm.indent, key, onError); + ctx.atKey = false; + if (utilMapIncludes.mapIncludes(ctx, map.items, keyNode)) + onError(keyStart, "DUPLICATE_KEY", "Map keys must be unique"); + const valueProps = resolveProps.resolveProps(sep ?? [], { + indicator: "map-value-ind", + next: value, + offset: keyNode.range[2], + onError, + parentIndent: bm.indent, + startOnNewline: !key || key.type === "block-scalar" + }); + offset = valueProps.end; + if (valueProps.found) { + if (implicitKey) { + if ((value == null ? void 0 : value.type) === "block-map" && !valueProps.hasNewline) + onError(offset, "BLOCK_AS_IMPLICIT_KEY", "Nested mappings are not allowed in compact mappings"); + 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); + if (ctx.schema.compat) + utilFlowIndentCheck.flowIndentCheck(bm.indent, value, onError); + offset = valueNode.range[2]; + const pair = new Pair.Pair(keyNode, valueNode); + if (ctx.options.keepSourceTokens) + pair.srcToken = collItem; + map.items.push(pair); + } else { + if (implicitKey) + onError(keyNode.range, "MISSING_CHAR", "Implicit map keys need to be followed by map values"); + if (valueProps.comment) { + if (keyNode.comment) + keyNode.comment += "\n" + valueProps.comment; + else + keyNode.comment = valueProps.comment; + } + const pair = new Pair.Pair(keyNode); + if (ctx.options.keepSourceTokens) + pair.srcToken = collItem; + map.items.push(pair); + } + } + if (commentEnd && commentEnd < offset) + onError(commentEnd, "IMPOSSIBLE", "Map comment with trailing content"); + map.range = [bm.offset, offset, commentEnd ?? offset]; + return map; + } + exports.resolveBlockMap = resolveBlockMap; + } +}); + +// +var require_resolve_block_seq = __commonJS({ + ""(exports) { + "use strict"; + var YAMLSeq = require_YAMLSeq(); + var resolveProps = require_resolve_props(); + var utilFlowIndentCheck = require_util_flow_indent_check(); + function resolveBlockSeq({ composeNode, composeEmptyNode }, ctx, bs, onError, tag) { + const NodeClass = (tag == null ? void 0 : tag.nodeClass) ?? YAMLSeq.YAMLSeq; + const seq = new NodeClass(ctx.schema); + if (ctx.atRoot) + ctx.atRoot = false; + if (ctx.atKey) + ctx.atKey = false; + let offset = bs.offset; + let commentEnd = null; + for (const { start, value } of bs.items) { + const props = resolveProps.resolveProps(start, { + indicator: "seq-item-ind", + next: value, + offset, + onError, + parentIndent: bs.indent, + startOnNewline: true + }); + if (!props.found) { + if (props.anchor || props.tag || value) { + if (value && value.type === "block-seq") + onError(props.end, "BAD_INDENT", "All sequence items must start at the same column"); + else + onError(offset, "MISSING_CHAR", "Sequence item without - indicator"); + } else { + commentEnd = props.end; + if (props.comment) + seq.comment = props.comment; + continue; + } + } + const node = value ? composeNode(ctx, value, props, onError) : composeEmptyNode(ctx, props.end, start, null, props, onError); + if (ctx.schema.compat) + utilFlowIndentCheck.flowIndentCheck(bs.indent, value, onError); + offset = node.range[2]; + seq.items.push(node); + } + seq.range = [bs.offset, offset, commentEnd ?? offset]; + return seq; + } + exports.resolveBlockSeq = resolveBlockSeq; + } +}); + +// +var require_resolve_end = __commonJS({ + ""(exports) { + "use strict"; + function resolveEnd(end, offset, reqSpace, onError) { + let comment = ""; + if (end) { + let hasSpace = false; + let sep = ""; + for (const token of end) { + const { source, type } = token; + switch (type) { + case "space": + hasSpace = true; + break; + case "comment": { + if (reqSpace && !hasSpace) + onError(token, "MISSING_CHAR", "Comments must be separated from other tokens by white space characters"); + const cb = source.substring(1) || " "; + if (!comment) + comment = cb; + else + comment += sep + cb; + sep = ""; + break; + } + case "newline": + if (comment) + sep += source; + hasSpace = true; + break; + default: + onError(token, "UNEXPECTED_TOKEN", `Unexpected ${type} at node end`); + } + offset += source.length; + } + } + return { comment, offset }; + } + exports.resolveEnd = resolveEnd; + } +}); + +// +var require_resolve_flow_collection = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var Pair = require_Pair(); + var YAMLMap = require_YAMLMap(); + var YAMLSeq = require_YAMLSeq(); + var resolveEnd = require_resolve_end(); + var resolveProps = require_resolve_props(); + var utilContainsNewline = require_util_contains_newline(); + var utilMapIncludes = require_util_map_includes(); + var blockMsg = "Block collections are not allowed within flow collections"; + var isBlock = (token) => token && (token.type === "block-map" || token.type === "block-seq"); + function resolveFlowCollection({ composeNode, composeEmptyNode }, ctx, fc, onError, tag) { + const isMap = fc.start.source === "{"; + const fcName = isMap ? "flow map" : "flow sequence"; + const NodeClass = (tag == null ? void 0 : tag.nodeClass) ?? (isMap ? YAMLMap.YAMLMap : YAMLSeq.YAMLSeq); + const coll = new NodeClass(ctx.schema); + coll.flow = true; + const atRoot = ctx.atRoot; + if (atRoot) + ctx.atRoot = false; + if (ctx.atKey) + ctx.atKey = false; + 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 props = resolveProps.resolveProps(start, { + flow: fcName, + indicator: "explicit-key-ind", + next: key ?? (sep == null ? void 0 : sep[0]), + offset, + onError, + parentIndent: fc.indent, + startOnNewline: false + }); + if (!props.found) { + if (!props.anchor && !props.tag && !sep && !value) { + if (i === 0 && props.comma) + onError(props.comma, "UNEXPECTED_TOKEN", `Unexpected , in ${fcName}`); + else if (i < fc.items.length - 1) + onError(props.start, "UNEXPECTED_TOKEN", `Unexpected empty item in ${fcName}`); + if (props.comment) { + if (coll.comment) + coll.comment += "\n" + props.comment; + else + coll.comment = props.comment; + } + offset = props.end; + continue; + } + if (!isMap && ctx.options.strict && utilContainsNewline.containsNewline(key)) + onError( + key, + "MULTILINE_IMPLICIT_KEY", + "Implicit keys of flow sequence pairs need to be on a single line" + ); + } + if (i === 0) { + if (props.comma) + onError(props.comma, "UNEXPECTED_TOKEN", `Unexpected , in ${fcName}`); + } else { + if (!props.comma) + onError(props.start, "MISSING_CHAR", `Missing , between ${fcName} items`); + if (props.comment) { + let prevItemComment = ""; + loop: + for (const st of start) { + switch (st.type) { + case "comma": + case "space": + break; + case "comment": + prevItemComment = st.source.substring(1); + break loop; + default: + break loop; + } + } + if (prevItemComment) { + let prev = coll.items[coll.items.length - 1]; + if (identity.isPair(prev)) + prev = prev.value ?? prev.key; + if (prev.comment) + prev.comment += "\n" + prevItemComment; + else + prev.comment = prevItemComment; + props.comment = props.comment.substring(prevItemComment.length + 1); + } + } + } + if (!isMap && !sep && !props.found) { + const valueNode = value ? composeNode(ctx, value, props, onError) : composeEmptyNode(ctx, props.end, sep, null, props, onError); + coll.items.push(valueNode); + offset = valueNode.range[2]; + if (isBlock(value)) + onError(valueNode.range, "BLOCK_IN_FLOW", blockMsg); + } else { + ctx.atKey = true; + const keyStart = props.end; + const keyNode = key ? composeNode(ctx, key, props, onError) : composeEmptyNode(ctx, keyStart, start, null, props, onError); + if (isBlock(key)) + onError(keyNode.range, "BLOCK_IN_FLOW", blockMsg); + ctx.atKey = false; + const valueProps = resolveProps.resolveProps(sep ?? [], { + flow: fcName, + indicator: "map-value-ind", + next: value, + offset: keyNode.range[2], + onError, + parentIndent: fc.indent, + startOnNewline: false + }); + if (valueProps.found) { + if (!isMap && !props.found && ctx.options.strict) { + if (sep) + for (const st of sep) { + if (st === valueProps.found) + break; + if (st.type === "newline") { + onError(st, "MULTILINE_IMPLICIT_KEY", "Implicit keys of flow sequence pairs need to be on a single line"); + break; + } + } + if (props.start < valueProps.found.offset - 1024) + onError(valueProps.found, "KEY_OVER_1024_CHARS", "The : indicator must be at most 1024 chars after the start of an implicit flow sequence key"); + } + } else if (value) { + if ("source" in value && value.source && value.source[0] === ":") + onError(value, "MISSING_CHAR", `Missing space after : in ${fcName}`); + 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; + if (valueNode) { + if (isBlock(value)) + onError(valueNode.range, "BLOCK_IN_FLOW", blockMsg); + } else if (valueProps.comment) { + if (keyNode.comment) + keyNode.comment += "\n" + valueProps.comment; + else + keyNode.comment = valueProps.comment; + } + const pair = new Pair.Pair(keyNode, valueNode); + if (ctx.options.keepSourceTokens) + pair.srcToken = collItem; + if (isMap) { + const map = coll; + if (utilMapIncludes.mapIncludes(ctx, map.items, keyNode)) + onError(keyStart, "DUPLICATE_KEY", "Map keys must be unique"); + map.items.push(pair); + } else { + const map = new YAMLMap.YAMLMap(ctx.schema); + map.flow = true; + map.items.push(pair); + const endRange = (valueNode ?? keyNode).range; + map.range = [keyNode.range[0], endRange[1], endRange[2]]; + coll.items.push(map); + } + offset = valueNode ? valueNode.range[2] : valueProps.end; + } + } + const expectedEnd = isMap ? "}" : "]"; + const [ce, ...ee] = fc.end; + let cePos = offset; + if (ce && ce.source === expectedEnd) + cePos = ce.offset + ce.source.length; + else { + const name = fcName[0].toUpperCase() + fcName.substring(1); + const msg = atRoot ? `${name} must end with a ${expectedEnd}` : `${name} in block collection must be sufficiently indented and end with a ${expectedEnd}`; + onError(offset, atRoot ? "MISSING_CHAR" : "BAD_INDENT", msg); + if (ce && ce.source.length !== 1) + ee.unshift(ce); + } + if (ee.length > 0) { + const end = resolveEnd.resolveEnd(ee, cePos, ctx.options.strict, onError); + if (end.comment) { + if (coll.comment) + coll.comment += "\n" + end.comment; + else + coll.comment = end.comment; + } + coll.range = [fc.offset, cePos, end.offset]; + } else { + coll.range = [fc.offset, cePos, cePos]; + } + return coll; + } + exports.resolveFlowCollection = resolveFlowCollection; + } +}); + +// +var require_compose_collection = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var Scalar = require_Scalar(); + var YAMLMap = require_YAMLMap(); + var YAMLSeq = require_YAMLSeq(); + var resolveBlockMap = require_resolve_block_map(); + var resolveBlockSeq = require_resolve_block_seq(); + var resolveFlowCollection = require_resolve_flow_collection(); + function resolveCollection(CN, ctx, token, onError, tagName, tag) { + const coll = token.type === "block-map" ? resolveBlockMap.resolveBlockMap(CN, ctx, token, onError, tag) : token.type === "block-seq" ? resolveBlockSeq.resolveBlockSeq(CN, ctx, token, onError, tag) : resolveFlowCollection.resolveFlowCollection(CN, ctx, token, onError, tag); + const Coll = coll.constructor; + if (tagName === "!" || tagName === Coll.tagName) { + coll.tag = Coll.tagName; + return coll; + } + if (tagName) + coll.tag = tagName; + return coll; + } + function composeCollection(CN, ctx, token, props, onError) { + var _a; + const tagToken = props.tag; + const tagName = !tagToken ? null : ctx.directives.tagName(tagToken.source, (msg) => onError(tagToken, "TAG_RESOLVE_FAILED", msg)); + if (token.type === "block-seq") { + const { anchor, newlineAfterProp: nl } = props; + const lastProp = anchor && tagToken ? anchor.offset > tagToken.offset ? anchor : tagToken : anchor ?? tagToken; + if (lastProp && (!nl || nl.offset < lastProp.offset)) { + const message = "Missing newline after block sequence props"; + onError(lastProp, "MISSING_CHAR", message); + } + } + const expType = token.type === "block-map" ? "map" : token.type === "block-seq" ? "seq" : token.start.source === "{" ? "map" : "seq"; + if (!tagToken || !tagName || tagName === "!" || tagName === YAMLMap.YAMLMap.tagName && expType === "map" || tagName === YAMLSeq.YAMLSeq.tagName && expType === "seq") { + return resolveCollection(CN, ctx, token, onError, tagName); + } + let tag = ctx.schema.tags.find((t) => t.tag === tagName && t.collection === expType); + if (!tag) { + const kt = ctx.schema.knownTags[tagName]; + if (kt && kt.collection === expType) { + ctx.schema.tags.push(Object.assign({}, kt, { default: false })); + tag = kt; + } else { + if (kt == null ? void 0 : kt.collection) { + onError(tagToken, "BAD_COLLECTION_TYPE", `${kt.tag} used for ${expType} collection, but expects ${kt.collection}`, true); + } else { + onError(tagToken, "TAG_RESOLVE_FAILED", `Unresolved tag: ${tagName}`, true); + } + return resolveCollection(CN, ctx, token, onError, tagName); + } + } + const coll = resolveCollection(CN, ctx, token, onError, tagName, tag); + const res = ((_a = tag.resolve) == null ? void 0 : _a.call(tag, coll, (msg) => onError(tagToken, "TAG_RESOLVE_FAILED", msg), ctx.options)) ?? coll; + const node = identity.isNode(res) ? res : new Scalar.Scalar(res); + node.range = coll.range; + node.tag = tagName; + if (tag == null ? void 0 : tag.format) + node.format = tag.format; + return node; + } + exports.composeCollection = composeCollection; + } +}); + +// +var require_resolve_block_scalar = __commonJS({ + ""(exports) { + "use strict"; + var Scalar = require_Scalar(); + function resolveBlockScalar(ctx, scalar, onError) { + const start = scalar.offset; + const header = parseBlockScalarHeader(scalar, ctx.options.strict, onError); + if (!header) + return { value: "", type: null, comment: "", range: [start, start, start] }; + const type = header.mode === ">" ? Scalar.Scalar.BLOCK_FOLDED : Scalar.Scalar.BLOCK_LITERAL; + const lines = scalar.source ? splitLines(scalar.source) : []; + let chompStart = lines.length; + for (let i = lines.length - 1; i >= 0; --i) { + const content = lines[i][1]; + if (content === "" || content === "\r") + chompStart = i; + else + break; + } + if (chompStart === 0) { + const value2 = header.chomp === "+" && lines.length > 0 ? "\n".repeat(Math.max(1, lines.length - 1)) : ""; + let end2 = start + header.length; + if (scalar.source) + end2 += scalar.source.length; + return { value: value2, type, comment: header.comment, range: [start, end2, end2] }; + } + let trimIndent = scalar.indent + header.indent; + let offset = scalar.offset + header.length; + let contentStart = 0; + for (let i = 0; i < chompStart; ++i) { + const [indent, content] = lines[i]; + if (content === "" || content === "\r") { + if (header.indent === 0 && indent.length > trimIndent) + trimIndent = indent.length; + } else { + if (indent.length < trimIndent) { + const message = "Block scalars with more-indented leading empty lines must use an explicit indentation indicator"; + onError(offset + indent.length, "MISSING_CHAR", message); + } + if (header.indent === 0) + trimIndent = indent.length; + contentStart = i; + if (trimIndent === 0 && !ctx.atRoot) { + const message = "Block scalar values in collections must be indented"; + onError(offset, "BAD_INDENT", message); + } + break; + } + offset += indent.length + content.length + 1; + } + for (let i = lines.length - 1; i >= chompStart; --i) { + if (lines[i][0].length > trimIndent) + chompStart = i + 1; + } + let value = ""; + let sep = ""; + let prevMoreIndented = false; + for (let i = 0; i < contentStart; ++i) + value += lines[i][0].slice(trimIndent) + "\n"; + for (let i = contentStart; i < chompStart; ++i) { + let [indent, content] = lines[i]; + offset += indent.length + content.length + 1; + const crlf = content[content.length - 1] === "\r"; + if (crlf) + content = content.slice(0, -1); + if (content && indent.length < trimIndent) { + const src = header.indent ? "explicit indentation indicator" : "first line"; + const message = `Block scalar lines must not be less indented than their ${src}`; + onError(offset - content.length - (crlf ? 2 : 1), "BAD_INDENT", message); + indent = ""; + } + if (type === Scalar.Scalar.BLOCK_LITERAL) { + value += sep + indent.slice(trimIndent) + content; + sep = "\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"; + prevMoreIndented = true; + } else if (content === "") { + if (sep === "\n") + value += "\n"; + else + sep = "\n"; + } else { + value += sep + content; + sep = " "; + prevMoreIndented = false; + } + } + switch (header.chomp) { + case "-": + break; + case "+": + for (let i = chompStart; i < lines.length; ++i) + value += "\n" + lines[i][0].slice(trimIndent); + if (value[value.length - 1] !== "\n") + value += "\n"; + break; + default: + value += "\n"; + } + const end = start + header.length + scalar.source.length; + return { value, type, comment: header.comment, range: [start, end, end] }; + } + function parseBlockScalarHeader({ offset, props }, strict, onError) { + if (props[0].type !== "block-scalar-header") { + onError(props[0], "IMPOSSIBLE", "Block scalar header not found"); + return null; + } + const { source } = props[0]; + const mode = source[0]; + let indent = 0; + let chomp = ""; + let error = -1; + for (let i = 1; i < source.length; ++i) { + const ch = source[i]; + if (!chomp && (ch === "-" || ch === "+")) + chomp = ch; + else { + const n = Number(ch); + if (!indent && n) + indent = n; + else if (error === -1) + error = offset + i; + } + } + if (error !== -1) + onError(error, "UNEXPECTED_TOKEN", `Block scalar header includes extra characters: ${source}`); + let hasSpace = false; + let comment = ""; + let length = source.length; + for (let i = 1; i < props.length; ++i) { + const token = props[i]; + switch (token.type) { + case "space": + hasSpace = true; + case "newline": + length += token.source.length; + break; + case "comment": + if (strict && !hasSpace) { + const message = "Comments must be separated from other tokens by white space characters"; + onError(token, "MISSING_CHAR", message); + } + length += token.source.length; + comment = token.source.substring(1); + break; + case "error": + onError(token, "UNEXPECTED_TOKEN", token.message); + length += token.source.length; + break; + default: { + const message = `Unexpected token in block scalar header: ${token.type}`; + onError(token, "UNEXPECTED_TOKEN", message); + const ts = token.source; + if (ts && typeof ts === "string") + length += ts.length; + } + } + } + return { mode, indent, chomp, comment, length }; + } + function splitLines(source) { + const split = source.split(/\n( *)/); + const first = split[0]; + const m = first.match(/^( *)/); + const line0 = (m == null ? void 0 : m[1]) ? [m[1], first.slice(m[1].length)] : ["", first]; + const lines = [line0]; + for (let i = 1; i < split.length; i += 2) + lines.push([split[i], split[i + 1]]); + return lines; + } + exports.resolveBlockScalar = resolveBlockScalar; + } +}); + +// +var require_resolve_flow_scalar = __commonJS({ + ""(exports) { + "use strict"; + var Scalar = require_Scalar(); + var resolveEnd = require_resolve_end(); + function resolveFlowScalar(scalar, strict, onError) { + const { offset, type, source, end } = scalar; + let _type; + let value; + const _onError = (rel, code, msg) => onError(offset + rel, code, msg); + switch (type) { + case "scalar": + _type = Scalar.Scalar.PLAIN; + value = plainValue(source, _onError); + break; + case "single-quoted-scalar": + _type = Scalar.Scalar.QUOTE_SINGLE; + value = singleQuotedValue(source, _onError); + break; + case "double-quoted-scalar": + _type = Scalar.Scalar.QUOTE_DOUBLE; + value = doubleQuotedValue(source, _onError); + break; + default: + onError(scalar, "UNEXPECTED_TOKEN", `Expected a flow scalar value, but found: ${type}`); + return { + value: "", + type: null, + comment: "", + range: [offset, offset + source.length, offset + source.length] + }; + } + const valueEnd = offset + source.length; + const re = resolveEnd.resolveEnd(end, valueEnd, strict, onError); + return { + value, + type: _type, + comment: re.comment, + range: [offset, valueEnd, re.offset] + }; + } + function plainValue(source, onError) { + let badChar = ""; + switch (source[0]) { + case " ": + badChar = "a tab character"; + break; + case ",": + badChar = "flow indicator character ,"; + break; + case "%": + badChar = "directive indicator character %"; + break; + case "|": + case ">": { + badChar = `block scalar indicator ${source[0]}`; + break; + } + case "@": + case "`": { + badChar = `reserved character ${source[0]}`; + break; + } + } + if (badChar) + onError(0, "BAD_SCALAR_START", `Plain value cannot start with ${badChar}`); + return foldLines(source); + } + function singleQuotedValue(source, onError) { + if (source[source.length - 1] !== "'" || source.length === 1) + onError(source.length, "MISSING_CHAR", "Missing closing 'quote"); + return foldLines(source.slice(1, -1)).replace(/''/g, "'"); + } + function foldLines(source) { + let first, line; + try { + first = new RegExp("(.*?)(? wsStart ? source.slice(wsStart, i + 1) : ch; + } else { + res += ch; + } + } + if (source[source.length - 1] !== '"' || source.length === 1) + onError(source.length, "MISSING_CHAR", 'Missing closing "quote'); + return res; + } + function foldNewline(source, offset) { + let fold = ""; + let ch = source[offset + 1]; + while (ch === " " || ch === " " || ch === "\n" || ch === "\r") { + if (ch === "\r" && source[offset + 2] !== "\n") + break; + if (ch === "\n") + fold += "\n"; + offset += 1; + ch = source[offset + 1]; + } + if (!fold) + fold = " "; + return { fold, offset }; + } + var escapeCodes = { + "0": "\0", + a: "\x07", + b: "\b", + e: "\x1B", + f: "\f", + n: "\n", + r: "\r", + t: " ", + v: "\v", + N: "\x85", + _: "\xA0", + L: "\u2028", + P: "\u2029", + " ": " ", + '"': '"', + "/": "/", + "\\": "\\", + " ": " " + }; + function parseCharCode(source, offset, length, onError) { + const cc = source.substr(offset, length); + const ok = cc.length === length && /^[0-9a-fA-F]+$/.test(cc); + const code = ok ? parseInt(cc, 16) : NaN; + if (isNaN(code)) { + const raw = source.substr(offset - 2, length + 2); + onError(offset - 2, "BAD_DQ_ESCAPE", `Invalid escape sequence ${raw}`); + return raw; + } + return String.fromCodePoint(code); + } + exports.resolveFlowScalar = resolveFlowScalar; + } +}); + +// +var require_compose_scalar = __commonJS({ + ""(exports) { + "use strict"; + var identity = require_identity(); + var Scalar = require_Scalar(); + var resolveBlockScalar = require_resolve_block_scalar(); + var resolveFlowScalar = require_resolve_flow_scalar(); + function composeScalar(ctx, token, tagToken, onError) { + const { value, type, comment, range } = token.type === "block-scalar" ? resolveBlockScalar.resolveBlockScalar(ctx, token, onError) : resolveFlowScalar.resolveFlowScalar(token, ctx.options.strict, onError); + const tagName = tagToken ? ctx.directives.tagName(tagToken.source, (msg) => onError(tagToken, "TAG_RESOLVE_FAILED", msg)) : null; + let tag; + if (ctx.options.stringKeys && ctx.atKey) { + tag = ctx.schema[identity.SCALAR]; + } else if (tagName) + tag = findScalarTagByName(ctx.schema, value, tagName, tagToken, onError); + else if (token.type === "scalar") + tag = findScalarTagByTest(ctx, value, token, onError); + else + tag = ctx.schema[identity.SCALAR]; + let scalar; + try { + const res = tag.resolve(value, (msg) => onError(tagToken ?? token, "TAG_RESOLVE_FAILED", msg), ctx.options); + scalar = identity.isScalar(res) ? res : new Scalar.Scalar(res); + } catch (error) { + const msg = error instanceof Error ? error.message : String(error); + onError(tagToken ?? token, "TAG_RESOLVE_FAILED", msg); + scalar = new Scalar.Scalar(value); + } + scalar.range = range; + scalar.source = value; + if (type) + scalar.type = type; + if (tagName) + scalar.tag = tagName; + if (tag.format) + scalar.format = tag.format; + if (comment) + scalar.comment = comment; + return scalar; + } + function findScalarTagByName(schema, value, tagName, tagToken, onError) { + var _a; + if (tagName === "!") + return schema[identity.SCALAR]; + const matchWithTest = []; + for (const tag of schema.tags) { + if (!tag.collection && tag.tag === tagName) { + if (tag.default && tag.test) + matchWithTest.push(tag); + else + return tag; + } + } + for (const tag of matchWithTest) + if ((_a = tag.test) == null ? void 0 : _a.test(value)) + return tag; + const kt = schema.knownTags[tagName]; + if (kt && !kt.collection) { + schema.tags.push(Object.assign({}, kt, { default: false, test: void 0 })); + return kt; + } + onError(tagToken, "TAG_RESOLVE_FAILED", `Unresolved tag: ${tagName}`, tagName !== "tag:yaml.org,2002:str"); + return schema[identity.SCALAR]; + } + function findScalarTagByTest({ atKey, directives, schema }, value, token, onError) { + const tag = schema.tags.find((tag2) => { + var _a; + return (tag2.default === true || atKey && tag2.default === "key") && ((_a = tag2.test) == null ? void 0 : _a.test(value)); + }) || schema[identity.SCALAR]; + if (schema.compat) { + const compat = schema.compat.find((tag2) => { + var _a; + return tag2.default && ((_a = tag2.test) == null ? void 0 : _a.test(value)); + }) ?? schema[identity.SCALAR]; + if (tag.tag !== compat.tag) { + const ts = directives.tagString(tag.tag); + const cs = directives.tagString(compat.tag); + const msg = `Value may be parsed as either ${ts} or ${cs}`; + onError(token, "TAG_RESOLVE_FAILED", msg, true); + } + } + return tag; + } + exports.composeScalar = composeScalar; + } +}); + +// +var require_util_empty_scalar_position = __commonJS({ + ""(exports) { + "use strict"; + function emptyScalarPosition(offset, before, pos) { + if (before) { + if (pos === null) + pos = before.length; + for (let i = pos - 1; i >= 0; --i) { + let st = before[i]; + switch (st.type) { + case "space": + case "comment": + case "newline": + offset -= st.source.length; + continue; + } + st = before[++i]; + while ((st == null ? void 0 : st.type) === "space") { + offset += st.source.length; + st = before[++i]; + } + break; + } + } + return offset; + } + exports.emptyScalarPosition = emptyScalarPosition; + } +}); + +// +var require_compose_node = __commonJS({ + ""(exports) { + "use strict"; + var Alias = require_Alias(); + var identity = require_identity(); + var composeCollection = require_compose_collection(); + var composeScalar = require_compose_scalar(); + var resolveEnd = require_resolve_end(); + var utilEmptyScalarPosition = require_util_empty_scalar_position(); + var CN = { composeNode, composeEmptyNode }; + function composeNode(ctx, token, props, onError) { + const atKey = ctx.atKey; + const { spaceBefore, comment, anchor, tag } = props; + let node; + let isSrcToken = true; + switch (token.type) { + case "alias": + node = composeAlias(ctx, token, onError); + if (anchor || tag) + onError(token, "ALIAS_PROPS", "An alias node must not specify any properties"); + break; + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": + case "block-scalar": + node = composeScalar.composeScalar(ctx, token, tag, onError); + if (anchor) + node.anchor = anchor.source.substring(1); + break; + case "block-map": + case "block-seq": + case "flow-collection": + node = composeCollection.composeCollection(CN, ctx, token, props, onError); + if (anchor) + node.anchor = anchor.source.substring(1); + break; + default: { + const message = token.type === "error" ? token.message : `Unsupported token (type: ${token.type})`; + onError(token, "UNEXPECTED_TOKEN", message); + node = composeEmptyNode(ctx, token.offset, void 0, null, props, onError); + isSrcToken = false; + } + } + if (anchor && node.anchor === "") + onError(anchor, "BAD_ALIAS", "Anchor cannot be an empty string"); + if (atKey && ctx.options.stringKeys && (!identity.isScalar(node) || typeof node.value !== "string" || node.tag && node.tag !== "tag:yaml.org,2002:str")) { + const msg = "With stringKeys, all keys must be strings"; + onError(tag ?? token, "NON_STRING_KEY", msg); + } + if (spaceBefore) + node.spaceBefore = true; + if (comment) { + if (token.type === "scalar" && token.source === "") + node.comment = comment; + else + node.commentBefore = comment; + } + if (ctx.options.keepSourceTokens && isSrcToken) + node.srcToken = token; + return node; + } + function composeEmptyNode(ctx, offset, before, pos, { spaceBefore, comment, anchor, tag, end }, onError) { + const token = { + type: "scalar", + offset: utilEmptyScalarPosition.emptyScalarPosition(offset, before, pos), + indent: -1, + source: "" + }; + const node = composeScalar.composeScalar(ctx, token, tag, onError); + if (anchor) { + node.anchor = anchor.source.substring(1); + if (node.anchor === "") + onError(anchor, "BAD_ALIAS", "Anchor cannot be an empty string"); + } + if (spaceBefore) + node.spaceBefore = true; + if (comment) { + node.comment = comment; + node.range[2] = end; + } + return node; + } + function composeAlias({ options }, { offset, source, end }, onError) { + const alias = new Alias.Alias(source.substring(1)); + if (alias.source === "") + onError(offset, "BAD_ALIAS", "Alias cannot be an empty string"); + if (alias.source.endsWith(":")) + onError(offset + source.length - 1, "BAD_ALIAS", "Alias ending in : is ambiguous", true); + const valueEnd = offset + source.length; + const re = resolveEnd.resolveEnd(end, valueEnd, options.strict, onError); + alias.range = [offset, valueEnd, re.offset]; + if (re.comment) + alias.comment = re.comment; + return alias; + } + exports.composeEmptyNode = composeEmptyNode; + exports.composeNode = composeNode; + } +}); + +// +var require_compose_doc = __commonJS({ + ""(exports) { + "use strict"; + var Document = require_Document(); + var composeNode = require_compose_node(); + var resolveEnd = require_resolve_end(); + var resolveProps = require_resolve_props(); + function composeDoc(options, directives, { offset, start, value, end }, onError) { + const opts = Object.assign({ _directives: directives }, options); + const doc = new Document.Document(void 0, opts); + const ctx = { + atKey: false, + atRoot: true, + directives: doc.directives, + options: doc.options, + schema: doc.schema + }; + const props = resolveProps.resolveProps(start, { + indicator: "doc-start", + next: value ?? (end == null ? void 0 : end[0]), + offset, + onError, + parentIndent: 0, + startOnNewline: true + }); + if (props.found) { + doc.directives.docStart = true; + if (value && (value.type === "block-map" || value.type === "block-seq") && !props.hasNewline) + onError(props.end, "MISSING_CHAR", "Block collection cannot start on same line with directives-end marker"); + } + doc.contents = value ? composeNode.composeNode(ctx, value, props, onError) : composeNode.composeEmptyNode(ctx, props.end, start, null, props, onError); + const contentEnd = doc.contents.range[2]; + const re = resolveEnd.resolveEnd(end, contentEnd, false, onError); + if (re.comment) + doc.comment = re.comment; + doc.range = [offset, contentEnd, re.offset]; + return doc; + } + exports.composeDoc = composeDoc; + } +}); + +// +var require_composer = __commonJS({ + ""(exports) { + "use strict"; + var node_process = __require("process"); + var directives = require_directives(); + var Document = require_Document(); + var errors = require_errors(); + var identity = require_identity(); + var composeDoc = require_compose_doc(); + var resolveEnd = require_resolve_end(); + function getErrorPos(src) { + if (typeof src === "number") + return [src, src + 1]; + if (Array.isArray(src)) + return src.length === 2 ? src : [src[0], src[1]]; + const { offset, source } = src; + return [offset, offset + (typeof source === "string" ? source.length : 1)]; + } + function parsePrelude(prelude) { + var _a; + let comment = ""; + let atComment = false; + let afterEmptyLine = false; + for (let i = 0; i < prelude.length; ++i) { + const source = prelude[i]; + switch (source[0]) { + case "#": + comment += (comment === "" ? "" : afterEmptyLine ? "\n\n" : "\n") + (source.substring(1) || " "); + atComment = true; + afterEmptyLine = false; + break; + case "%": + if (((_a = prelude[i + 1]) == null ? void 0 : _a[0]) !== "#") + i += 1; + atComment = false; + break; + default: + if (!atComment) + afterEmptyLine = true; + atComment = false; + } + } + return { comment, afterEmptyLine }; + } + var Composer = class { + constructor(options = {}) { + this.doc = null; + this.atDirectives = false; + this.prelude = []; + this.errors = []; + this.warnings = []; + this.onError = (source, code, message, warning) => { + const pos = getErrorPos(source); + if (warning) + this.warnings.push(new errors.YAMLWarning(pos, code, message)); + else + this.errors.push(new errors.YAMLParseError(pos, code, message)); + }; + this.directives = new directives.Directives({ version: options.version || "1.2" }); + this.options = options; + } + decorate(doc, afterDoc) { + const { comment, afterEmptyLine } = parsePrelude(this.prelude); + if (comment) { + const dc = doc.contents; + if (afterDoc) { + doc.comment = doc.comment ? `${doc.comment} +${comment}` : comment; + } else if (afterEmptyLine || doc.directives.docStart || !dc) { + doc.commentBefore = comment; + } else if (identity.isCollection(dc) && !dc.flow && dc.items.length > 0) { + let it = dc.items[0]; + if (identity.isPair(it)) + it = it.key; + const cb = it.commentBefore; + it.commentBefore = cb ? `${comment} +${cb}` : comment; + } else { + const cb = dc.commentBefore; + dc.commentBefore = cb ? `${comment} +${cb}` : comment; + } + } + if (afterDoc) { + Array.prototype.push.apply(doc.errors, this.errors); + Array.prototype.push.apply(doc.warnings, this.warnings); + } else { + doc.errors = this.errors; + doc.warnings = this.warnings; + } + this.prelude = []; + this.errors = []; + this.warnings = []; + } + streamInfo() { + return { + comment: parsePrelude(this.prelude).comment, + directives: this.directives, + errors: this.errors, + warnings: this.warnings + }; + } + *compose(tokens, forceDoc = false, endOffset = -1) { + for (const token of tokens) + yield* this.next(token); + yield* this.end(forceDoc, endOffset); + } + *next(token) { + if (node_process.env.LOG_STREAM) + console.dir(token, { depth: null }); + switch (token.type) { + case "directive": + this.directives.add(token.source, (offset, message, warning) => { + const pos = getErrorPos(token); + pos[0] += offset; + this.onError(pos, "BAD_DIRECTIVE", message, warning); + }); + this.prelude.push(token.source); + this.atDirectives = true; + break; + case "document": { + const doc = composeDoc.composeDoc(this.options, this.directives, token, this.onError); + if (this.atDirectives && !doc.directives.docStart) + this.onError(token, "MISSING_CHAR", "Missing directives-end/doc-start indicator line"); + this.decorate(doc, false); + if (this.doc) + yield this.doc; + this.doc = doc; + this.atDirectives = false; + break; + } + case "byte-order-mark": + case "space": + break; + case "comment": + case "newline": + this.prelude.push(token.source); + break; + case "error": { + const msg = token.source ? `${token.message}: ${JSON.stringify(token.source)}` : token.message; + const error = new errors.YAMLParseError(getErrorPos(token), "UNEXPECTED_TOKEN", msg); + if (this.atDirectives || !this.doc) + this.errors.push(error); + else + this.doc.errors.push(error); + break; + } + case "doc-end": { + if (!this.doc) { + const msg = "Unexpected doc-end without preceding document"; + this.errors.push(new errors.YAMLParseError(getErrorPos(token), "UNEXPECTED_TOKEN", msg)); + break; + } + this.doc.directives.docEnd = true; + const end = resolveEnd.resolveEnd(token.end, token.offset + token.source.length, this.doc.options.strict, this.onError); + this.decorate(this.doc, true); + if (end.comment) { + const dc = this.doc.comment; + this.doc.comment = dc ? `${dc} +${end.comment}` : end.comment; + } + this.doc.range[2] = end.offset; + break; + } + default: + this.errors.push(new errors.YAMLParseError(getErrorPos(token), "UNEXPECTED_TOKEN", `Unsupported token ${token.type}`)); + } + } + *end(forceDoc = false, endOffset = -1) { + if (this.doc) { + this.decorate(this.doc, true); + yield this.doc; + this.doc = null; + } else if (forceDoc) { + const opts = Object.assign({ _directives: this.directives }, this.options); + const doc = new Document.Document(void 0, opts); + if (this.atDirectives) + this.onError(endOffset, "MISSING_CHAR", "Missing directives-end indicator line"); + doc.range = [0, endOffset, endOffset]; + this.decorate(doc, false); + yield doc; + } + } + }; + exports.Composer = Composer; + } +}); + +// +var require_cst_scalar = __commonJS({ + ""(exports) { + "use strict"; + var resolveBlockScalar = require_resolve_block_scalar(); + var resolveFlowScalar = require_resolve_flow_scalar(); + var errors = require_errors(); + var stringifyString = require_stringifyString(); + function resolveAsScalar(token, strict = true, onError) { + if (token) { + const _onError = (pos, code, message) => { + const offset = typeof pos === "number" ? pos : Array.isArray(pos) ? pos[0] : pos.offset; + if (onError) + onError(offset, code, message); + else + throw new errors.YAMLParseError([offset, offset + 1], code, message); + }; + switch (token.type) { + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": + return resolveFlowScalar.resolveFlowScalar(token, strict, _onError); + case "block-scalar": + return resolveBlockScalar.resolveBlockScalar({ options: { strict } }, token, _onError); + } + } + return null; + } + function createScalarToken(value, context2) { + const { implicitKey = false, indent, inFlow = false, offset = -1, type = "PLAIN" } = context2; + const source = stringifyString.stringifyString({ type, value }, { + implicitKey, + indent: indent > 0 ? " ".repeat(indent) : "", + inFlow, + options: { blockQuote: true, lineWidth: -1 } + }); + const end = context2.end ?? [ + { type: "newline", offset: -1, indent, source: "\n" } + ]; + switch (source[0]) { + case "|": + case ">": { + const he = source.indexOf("\n"); + const head = source.substring(0, he); + const body = source.substring(he + 1) + "\n"; + const props = [ + { type: "block-scalar-header", offset, indent, source: head } + ]; + if (!addEndtoBlockProps(props, end)) + props.push({ type: "newline", offset: -1, indent, source: "\n" }); + return { type: "block-scalar", offset, indent, props, source: body }; + } + case '"': + return { type: "double-quoted-scalar", offset, indent, source, end }; + case "'": + return { type: "single-quoted-scalar", offset, indent, source, end }; + default: + return { type: "scalar", offset, indent, source, end }; + } + } + function setScalarValue(token, value, context2 = {}) { + let { afterKey = false, implicitKey = false, inFlow = false, type } = context2; + let indent = "indent" in token ? token.indent : null; + if (afterKey && typeof indent === "number") + indent += 2; + if (!type) + switch (token.type) { + case "single-quoted-scalar": + type = "QUOTE_SINGLE"; + break; + case "double-quoted-scalar": + type = "QUOTE_DOUBLE"; + break; + case "block-scalar": { + const header = token.props[0]; + if (header.type !== "block-scalar-header") + throw new Error("Invalid block scalar header"); + type = header.source[0] === ">" ? "BLOCK_FOLDED" : "BLOCK_LITERAL"; + break; + } + default: + type = "PLAIN"; + } + const source = stringifyString.stringifyString({ type, value }, { + implicitKey: implicitKey || indent === null, + indent: indent !== null && indent > 0 ? " ".repeat(indent) : "", + inFlow, + options: { blockQuote: true, lineWidth: -1 } + }); + switch (source[0]) { + case "|": + case ">": + setBlockScalarValue(token, source); + break; + case '"': + setFlowScalarValue(token, source, "double-quoted-scalar"); + break; + case "'": + setFlowScalarValue(token, source, "single-quoted-scalar"); + break; + default: + setFlowScalarValue(token, source, "scalar"); + } + } + function setBlockScalarValue(token, source) { + const he = source.indexOf("\n"); + const head = source.substring(0, he); + const body = source.substring(he + 1) + "\n"; + if (token.type === "block-scalar") { + const header = token.props[0]; + if (header.type !== "block-scalar-header") + throw new Error("Invalid block scalar header"); + header.source = head; + token.source = body; + } else { + const { offset } = token; + const indent = "indent" in token ? token.indent : -1; + const props = [ + { type: "block-scalar-header", offset, indent, source: head } + ]; + if (!addEndtoBlockProps(props, "end" in token ? token.end : void 0)) + props.push({ type: "newline", offset: -1, indent, source: "\n" }); + for (const key of Object.keys(token)) + if (key !== "type" && key !== "offset") + delete token[key]; + Object.assign(token, { type: "block-scalar", indent, props, source: body }); + } + } + function addEndtoBlockProps(props, end) { + if (end) + for (const st of end) + switch (st.type) { + case "space": + case "comment": + props.push(st); + break; + case "newline": + props.push(st); + return true; + } + return false; + } + function setFlowScalarValue(token, source, type) { + switch (token.type) { + case "scalar": + case "double-quoted-scalar": + case "single-quoted-scalar": + token.type = type; + token.source = source; + break; + case "block-scalar": { + const end = token.props.slice(1); + let oa = source.length; + if (token.props[0].type === "block-scalar-header") + oa -= token.props[0].source.length; + for (const tok of end) + tok.offset += oa; + delete token.props; + Object.assign(token, { type, source, end }); + break; + } + case "block-map": + case "block-seq": { + const offset = token.offset + source.length; + const nl = { type: "newline", offset, indent: token.indent, source: "\n" }; + delete token.items; + Object.assign(token, { type, source, end: [nl] }); + break; + } + default: { + const indent = "indent" in token ? token.indent : -1; + const end = "end" in token && Array.isArray(token.end) ? token.end.filter((st) => st.type === "space" || st.type === "comment" || st.type === "newline") : []; + for (const key of Object.keys(token)) + if (key !== "type" && key !== "offset") + delete token[key]; + Object.assign(token, { type, indent, source, end }); + } + } + } + exports.createScalarToken = createScalarToken; + exports.resolveAsScalar = resolveAsScalar; + exports.setScalarValue = setScalarValue; + } +}); + +// +var require_cst_stringify = __commonJS({ + ""(exports) { + "use strict"; + var stringify = (cst) => "type" in cst ? stringifyToken(cst) : stringifyItem(cst); + function stringifyToken(token) { + switch (token.type) { + case "block-scalar": { + let res = ""; + for (const tok of token.props) + res += stringifyToken(tok); + return res + token.source; + } + case "block-map": + case "block-seq": { + let res = ""; + for (const item of token.items) + res += stringifyItem(item); + return res; + } + case "flow-collection": { + let res = token.start.source; + for (const item of token.items) + res += stringifyItem(item); + for (const st of token.end) + res += st.source; + return res; + } + case "document": { + let res = stringifyItem(token); + if (token.end) + for (const st of token.end) + res += st.source; + return res; + } + default: { + let res = token.source; + if ("end" in token && token.end) + for (const st of token.end) + res += st.source; + return res; + } + } + } + function stringifyItem({ start, key, sep, value }) { + let res = ""; + for (const st of start) + res += st.source; + if (key) + res += stringifyToken(key); + if (sep) + for (const st of sep) + res += st.source; + if (value) + res += stringifyToken(value); + return res; + } + exports.stringify = stringify; + } +}); + +// +var require_cst_visit = __commonJS({ + ""(exports) { + "use strict"; + var BREAK = Symbol("break visit"); + var SKIP = Symbol("skip children"); + var REMOVE = Symbol("remove item"); + function visit(cst, visitor) { + if ("type" in cst && cst.type === "document") + cst = { start: cst.start, value: cst.value }; + _visit(Object.freeze([]), cst, visitor); + } + visit.BREAK = BREAK; + visit.SKIP = SKIP; + visit.REMOVE = REMOVE; + visit.itemAtPath = (cst, path) => { + let item = cst; + for (const [field, index] of path) { + const tok = item == null ? void 0 : item[field]; + if (tok && "items" in tok) { + item = tok.items[index]; + } else + return void 0; + } + return item; + }; + visit.parentCollection = (cst, path) => { + const parent = visit.itemAtPath(cst, path.slice(0, -1)); + const field = path[path.length - 1][0]; + const coll = parent == null ? void 0 : parent[field]; + if (coll && "items" in coll) + return coll; + throw new Error("Parent collection not found"); + }; + function _visit(path, item, visitor) { + let ctrl = visitor(item, path); + if (typeof ctrl === "symbol") + return ctrl; + for (const field of ["key", "value"]) { + const token = item[field]; + if (token && "items" in token) { + for (let i = 0; i < token.items.length; ++i) { + const ci = _visit(Object.freeze(path.concat([[field, i]])), token.items[i], visitor); + if (typeof ci === "number") + i = ci - 1; + else if (ci === BREAK) + return BREAK; + else if (ci === REMOVE) { + token.items.splice(i, 1); + i -= 1; + } + } + if (typeof ctrl === "function" && field === "key") + ctrl = ctrl(item, path); + } + } + return typeof ctrl === "function" ? ctrl(item, path) : ctrl; + } + exports.visit = visit; + } +}); + +// +var require_cst = __commonJS({ + ""(exports) { + "use strict"; + var cstScalar = require_cst_scalar(); + var cstStringify = require_cst_stringify(); + var cstVisit = require_cst_visit(); + var BOM = "\uFEFF"; + var DOCUMENT = ""; + var FLOW_END = ""; + var SCALAR = ""; + var isCollection = (token) => !!token && "items" in token; + var isScalar = (token) => !!token && (token.type === "scalar" || token.type === "single-quoted-scalar" || token.type === "double-quoted-scalar" || token.type === "block-scalar"); + function prettyToken(token) { + switch (token) { + case BOM: + return ""; + case DOCUMENT: + return ""; + case FLOW_END: + return ""; + case SCALAR: + return ""; + default: + return JSON.stringify(token); + } + } + function tokenType(source) { + switch (source) { + case BOM: + return "byte-order-mark"; + case DOCUMENT: + return "doc-mode"; + case FLOW_END: + return "flow-error-end"; + case SCALAR: + return "scalar"; + case "---": + return "doc-start"; + case "...": + return "doc-end"; + case "": + case "\n": + case "\r\n": + return "newline"; + case "-": + return "seq-item-ind"; + case "?": + return "explicit-key-ind"; + case ":": + return "map-value-ind"; + case "{": + return "flow-map-start"; + case "}": + return "flow-map-end"; + case "[": + return "flow-seq-start"; + case "]": + return "flow-seq-end"; + case ",": + return "comma"; + } + switch (source[0]) { + case " ": + case " ": + return "space"; + case "#": + return "comment"; + case "%": + return "directive-line"; + case "*": + return "alias"; + case "&": + return "anchor"; + case "!": + return "tag"; + case "'": + return "single-quoted-scalar"; + case '"': + return "double-quoted-scalar"; + case "|": + case ">": + return "block-scalar-header"; + } + return null; + } + exports.createScalarToken = cstScalar.createScalarToken; + exports.resolveAsScalar = cstScalar.resolveAsScalar; + exports.setScalarValue = cstScalar.setScalarValue; + exports.stringify = cstStringify.stringify; + exports.visit = cstVisit.visit; + exports.BOM = BOM; + exports.DOCUMENT = DOCUMENT; + exports.FLOW_END = FLOW_END; + exports.SCALAR = SCALAR; + exports.isCollection = isCollection; + exports.isScalar = isScalar; + exports.prettyToken = prettyToken; + exports.tokenType = tokenType; + } +}); + +// +var require_lexer = __commonJS({ + ""(exports) { + "use strict"; + var cst = require_cst(); + function isEmpty(ch) { + switch (ch) { + case void 0: + case " ": + case "\n": + case "\r": + case " ": + return true; + default: + return false; + } + } + var hexDigits = new Set("0123456789ABCDEFabcdef"); + var tagChars = new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"); + var flowIndicatorChars = new Set(",[]{}"); + var invalidAnchorChars = new Set(" ,[]{}\n\r "); + var isNotAnchorChar = (ch) => !ch || invalidAnchorChars.has(ch); + var Lexer = class { + constructor() { + this.atEnd = false; + this.blockScalarIndent = -1; + this.blockScalarKeep = false; + this.buffer = ""; + this.flowKey = false; + this.flowLevel = 0; + this.indentNext = 0; + this.indentValue = 0; + this.lineEndPos = null; + this.next = null; + this.pos = 0; + } + *lex(source, incomplete = false) { + if (source) { + if (typeof source !== "string") + throw TypeError("source is not a string"); + this.buffer = this.buffer ? this.buffer + source : source; + this.lineEndPos = null; + } + this.atEnd = !incomplete; + let next = this.next ?? "stream"; + while (next && (incomplete || this.hasChars(1))) + next = yield* this.parseNext(next); + } + atLineEnd() { + let i = this.pos; + let ch = this.buffer[i]; + while (ch === " " || ch === " ") + ch = this.buffer[++i]; + if (!ch || ch === "#" || ch === "\n") + return true; + if (ch === "\r") + return this.buffer[i + 1] === "\n"; + return false; + } + charAt(n) { + return this.buffer[this.pos + n]; + } + continueScalar(offset) { + let ch = this.buffer[offset]; + if (this.indentNext > 0) { + let indent = 0; + while (ch === " ") + ch = this.buffer[++indent + offset]; + if (ch === "\r") { + const next = this.buffer[indent + offset + 1]; + if (next === "\n" || !next && !this.atEnd) + return offset + indent + 1; + } + return ch === "\n" || indent >= this.indentNext || !ch && !this.atEnd ? offset + indent : -1; + } + if (ch === "-" || ch === ".") { + const dt = this.buffer.substr(offset, 3); + if ((dt === "---" || dt === "...") && isEmpty(this.buffer[offset + 3])) + return -1; + } + return offset; + } + getLine() { + let end = this.lineEndPos; + if (typeof end !== "number" || end !== -1 && end < this.pos) { + end = this.buffer.indexOf("\n", this.pos); + this.lineEndPos = end; + } + if (end === -1) + return this.atEnd ? this.buffer.substring(this.pos) : null; + if (this.buffer[end - 1] === "\r") + end -= 1; + return this.buffer.substring(this.pos, end); + } + hasChars(n) { + return this.pos + n <= this.buffer.length; + } + setNext(state) { + this.buffer = this.buffer.substring(this.pos); + this.pos = 0; + this.lineEndPos = null; + this.next = state; + return null; + } + peek(n) { + return this.buffer.substr(this.pos, n); + } + *parseNext(next) { + switch (next) { + case "stream": + return yield* this.parseStream(); + case "line-start": + return yield* this.parseLineStart(); + case "block-start": + return yield* this.parseBlockStart(); + case "doc": + return yield* this.parseDocument(); + case "flow": + return yield* this.parseFlowCollection(); + case "quoted-scalar": + return yield* this.parseQuotedScalar(); + case "block-scalar": + return yield* this.parseBlockScalar(); + case "plain-scalar": + return yield* this.parsePlainScalar(); + } + } + *parseStream() { + let line = this.getLine(); + if (line === null) + return this.setNext("stream"); + if (line[0] === cst.BOM) { + yield* this.pushCount(1); + line = line.substring(1); + } + if (line[0] === "%") { + let dirEnd = line.length; + let cs = line.indexOf("#"); + while (cs !== -1) { + const ch = line[cs - 1]; + if (ch === " " || ch === " ") { + dirEnd = cs - 1; + break; + } else { + cs = line.indexOf("#", cs + 1); + } + } + while (true) { + const ch = line[dirEnd - 1]; + if (ch === " " || ch === " ") + dirEnd -= 1; + else + break; + } + const n = (yield* this.pushCount(dirEnd)) + (yield* this.pushSpaces(true)); + yield* this.pushCount(line.length - n); + this.pushNewline(); + return "stream"; + } + if (this.atLineEnd()) { + const sp = yield* this.pushSpaces(true); + yield* this.pushCount(line.length - sp); + yield* this.pushNewline(); + return "stream"; + } + yield cst.DOCUMENT; + return yield* this.parseLineStart(); + } + *parseLineStart() { + const ch = this.charAt(0); + if (!ch && !this.atEnd) + return this.setNext("line-start"); + if (ch === "-" || ch === ".") { + if (!this.atEnd && !this.hasChars(4)) + return this.setNext("line-start"); + const s = this.peek(3); + if ((s === "---" || s === "...") && isEmpty(this.charAt(3))) { + yield* this.pushCount(3); + this.indentValue = 0; + this.indentNext = 0; + return s === "---" ? "doc" : "stream"; + } + } + this.indentValue = yield* this.pushSpaces(false); + if (this.indentNext > this.indentValue && !isEmpty(this.charAt(1))) + this.indentNext = this.indentValue; + return yield* this.parseBlockStart(); + } + *parseBlockStart() { + const [ch0, ch1] = this.peek(2); + if (!ch1 && !this.atEnd) + return this.setNext("block-start"); + if ((ch0 === "-" || ch0 === "?" || ch0 === ":") && isEmpty(ch1)) { + const n = (yield* this.pushCount(1)) + (yield* this.pushSpaces(true)); + this.indentNext = this.indentValue + 1; + this.indentValue += n; + return yield* this.parseBlockStart(); + } + return "doc"; + } + *parseDocument() { + yield* this.pushSpaces(true); + const line = this.getLine(); + if (line === null) + return this.setNext("doc"); + let n = yield* this.pushIndicators(); + switch (line[n]) { + case "#": + yield* this.pushCount(line.length - n); + case void 0: + yield* this.pushNewline(); + return yield* this.parseLineStart(); + case "{": + case "[": + yield* this.pushCount(1); + this.flowKey = false; + this.flowLevel = 1; + return "flow"; + case "}": + case "]": + yield* this.pushCount(1); + return "doc"; + case "*": + yield* this.pushUntil(isNotAnchorChar); + return "doc"; + case '"': + case "'": + return yield* this.parseQuotedScalar(); + case "|": + case ">": + n += yield* this.parseBlockScalarHeader(); + n += yield* this.pushSpaces(true); + yield* this.pushCount(line.length - n); + yield* this.pushNewline(); + return yield* this.parseBlockScalar(); + default: + return yield* this.parsePlainScalar(); + } + } + *parseFlowCollection() { + let nl, sp; + let indent = -1; + do { + nl = yield* this.pushNewline(); + if (nl > 0) { + sp = yield* this.pushSpaces(false); + this.indentValue = indent = sp; + } else { + sp = 0; + } + sp += yield* this.pushSpaces(true); + } while (nl + sp > 0); + const line = this.getLine(); + if (line === null) + return this.setNext("flow"); + if (indent !== -1 && indent < this.indentNext && line[0] !== "#" || indent === 0 && (line.startsWith("---") || line.startsWith("...")) && isEmpty(line[3])) { + const atFlowEndMarker = indent === this.indentNext - 1 && this.flowLevel === 1 && (line[0] === "]" || line[0] === "}"); + if (!atFlowEndMarker) { + this.flowLevel = 0; + yield cst.FLOW_END; + return yield* this.parseLineStart(); + } + } + let n = 0; + while (line[n] === ",") { + n += yield* this.pushCount(1); + n += yield* this.pushSpaces(true); + this.flowKey = false; + } + n += yield* this.pushIndicators(); + switch (line[n]) { + case void 0: + return "flow"; + case "#": + yield* this.pushCount(line.length - n); + return "flow"; + case "{": + case "[": + yield* this.pushCount(1); + this.flowKey = false; + this.flowLevel += 1; + return "flow"; + case "}": + case "]": + yield* this.pushCount(1); + this.flowKey = true; + this.flowLevel -= 1; + return this.flowLevel ? "flow" : "doc"; + case "*": + yield* this.pushUntil(isNotAnchorChar); + return "flow"; + case '"': + case "'": + this.flowKey = true; + return yield* this.parseQuotedScalar(); + case ":": { + const next = this.charAt(1); + if (this.flowKey || isEmpty(next) || next === ",") { + this.flowKey = false; + yield* this.pushCount(1); + yield* this.pushSpaces(true); + return "flow"; + } + } + default: + this.flowKey = false; + return yield* this.parsePlainScalar(); + } + } + *parseQuotedScalar() { + const quote = this.charAt(0); + let end = this.buffer.indexOf(quote, this.pos + 1); + if (quote === "'") { + while (end !== -1 && this.buffer[end + 1] === "'") + end = this.buffer.indexOf("'", end + 2); + } else { + while (end !== -1) { + let n = 0; + while (this.buffer[end - 1 - n] === "\\") + n += 1; + if (n % 2 === 0) + break; + end = this.buffer.indexOf('"', end + 1); + } + } + const qb = this.buffer.substring(0, end); + let nl = qb.indexOf("\n", this.pos); + if (nl !== -1) { + while (nl !== -1) { + const cs = this.continueScalar(nl + 1); + if (cs === -1) + break; + nl = qb.indexOf("\n", cs); + } + if (nl !== -1) { + end = nl - (qb[nl - 1] === "\r" ? 2 : 1); + } + } + if (end === -1) { + if (!this.atEnd) + return this.setNext("quoted-scalar"); + end = this.buffer.length; + } + yield* this.pushToIndex(end + 1, false); + return this.flowLevel ? "flow" : "doc"; + } + *parseBlockScalarHeader() { + this.blockScalarIndent = -1; + this.blockScalarKeep = false; + let i = this.pos; + while (true) { + const ch = this.buffer[++i]; + if (ch === "+") + this.blockScalarKeep = true; + else if (ch > "0" && ch <= "9") + this.blockScalarIndent = Number(ch) - 1; + else if (ch !== "-") + break; + } + return yield* this.pushUntil((ch) => isEmpty(ch) || ch === "#"); + } + *parseBlockScalar() { + let nl = this.pos - 1; + let indent = 0; + let ch; + loop: + for (let i2 = this.pos; ch = this.buffer[i2]; ++i2) { + switch (ch) { + case " ": + indent += 1; + break; + case "\n": + nl = i2; + indent = 0; + break; + case "\r": { + const next = this.buffer[i2 + 1]; + if (!next && !this.atEnd) + return this.setNext("block-scalar"); + if (next === "\n") + break; + } + default: + break loop; + } + } + if (!ch && !this.atEnd) + return this.setNext("block-scalar"); + if (indent >= this.indentNext) { + if (this.blockScalarIndent === -1) + this.indentNext = indent; + else { + this.indentNext = this.blockScalarIndent + (this.indentNext === 0 ? 1 : this.indentNext); + } + do { + const cs = this.continueScalar(nl + 1); + if (cs === -1) + break; + nl = this.buffer.indexOf("\n", cs); + } while (nl !== -1); + if (nl === -1) { + if (!this.atEnd) + return this.setNext("block-scalar"); + nl = this.buffer.length; + } + } + let i = nl + 1; + ch = this.buffer[i]; + while (ch === " ") + ch = this.buffer[++i]; + if (ch === " ") { + while (ch === " " || ch === " " || ch === "\r" || ch === "\n") + ch = this.buffer[++i]; + nl = i - 1; + } else if (!this.blockScalarKeep) { + do { + let i2 = nl - 1; + let ch2 = this.buffer[i2]; + if (ch2 === "\r") + ch2 = this.buffer[--i2]; + const lastChar = i2; + while (ch2 === " ") + ch2 = this.buffer[--i2]; + if (ch2 === "\n" && i2 >= this.pos && i2 + 1 + indent > lastChar) + nl = i2; + else + break; + } while (true); + } + yield cst.SCALAR; + yield* this.pushToIndex(nl + 1, true); + return yield* this.parseLineStart(); + } + *parsePlainScalar() { + const inFlow = this.flowLevel > 0; + let end = this.pos - 1; + let i = this.pos - 1; + let ch; + while (ch = this.buffer[++i]) { + if (ch === ":") { + const next = this.buffer[i + 1]; + if (isEmpty(next) || inFlow && flowIndicatorChars.has(next)) + break; + end = i; + } else if (isEmpty(ch)) { + let next = this.buffer[i + 1]; + if (ch === "\r") { + if (next === "\n") { + i += 1; + ch = "\n"; + next = this.buffer[i + 1]; + } else + end = i; + } + if (next === "#" || inFlow && flowIndicatorChars.has(next)) + break; + if (ch === "\n") { + const cs = this.continueScalar(i + 1); + if (cs === -1) + break; + i = Math.max(i, cs - 2); + } + } else { + if (inFlow && flowIndicatorChars.has(ch)) + break; + end = i; + } + } + if (!ch && !this.atEnd) + return this.setNext("plain-scalar"); + yield cst.SCALAR; + yield* this.pushToIndex(end + 1, true); + return inFlow ? "flow" : "doc"; + } + *pushCount(n) { + if (n > 0) { + yield this.buffer.substr(this.pos, n); + this.pos += n; + return n; + } + return 0; + } + *pushToIndex(i, allowEmpty) { + const s = this.buffer.slice(this.pos, i); + if (s) { + yield s; + this.pos += s.length; + return s.length; + } else if (allowEmpty) + yield ""; + return 0; + } + *pushIndicators() { + switch (this.charAt(0)) { + case "!": + return (yield* this.pushTag()) + (yield* this.pushSpaces(true)) + (yield* this.pushIndicators()); + case "&": + return (yield* this.pushUntil(isNotAnchorChar)) + (yield* this.pushSpaces(true)) + (yield* this.pushIndicators()); + case "-": + case "?": + case ":": { + const inFlow = this.flowLevel > 0; + const ch1 = this.charAt(1); + if (isEmpty(ch1) || inFlow && flowIndicatorChars.has(ch1)) { + if (!inFlow) + this.indentNext = this.indentValue + 1; + else if (this.flowKey) + this.flowKey = false; + return (yield* this.pushCount(1)) + (yield* this.pushSpaces(true)) + (yield* this.pushIndicators()); + } + } + } + return 0; + } + *pushTag() { + if (this.charAt(1) === "<") { + let i = this.pos + 2; + let ch = this.buffer[i]; + while (!isEmpty(ch) && ch !== ">") + ch = this.buffer[++i]; + return yield* this.pushToIndex(ch === ">" ? i + 1 : i, false); + } else { + let i = this.pos + 1; + let ch = this.buffer[i]; + while (ch) { + if (tagChars.has(ch)) + ch = this.buffer[++i]; + else if (ch === "%" && hexDigits.has(this.buffer[i + 1]) && hexDigits.has(this.buffer[i + 2])) { + ch = this.buffer[i += 3]; + } else + break; + } + return yield* this.pushToIndex(i, false); + } + } + *pushNewline() { + const ch = this.buffer[this.pos]; + if (ch === "\n") + return yield* this.pushCount(1); + else if (ch === "\r" && this.charAt(1) === "\n") + return yield* this.pushCount(2); + else + return 0; + } + *pushSpaces(allowTabs) { + let i = this.pos - 1; + let ch; + do { + ch = this.buffer[++i]; + } while (ch === " " || allowTabs && ch === " "); + const n = i - this.pos; + if (n > 0) { + yield this.buffer.substr(this.pos, n); + this.pos = i; + } + return n; + } + *pushUntil(test) { + let i = this.pos; + let ch = this.buffer[i]; + while (!test(ch)) + ch = this.buffer[++i]; + return yield* this.pushToIndex(i, false); + } + }; + exports.Lexer = Lexer; + } +}); + +// +var require_line_counter = __commonJS({ + ""(exports) { + "use strict"; + var LineCounter = class { + constructor() { + this.lineStarts = []; + this.addNewLine = (offset) => this.lineStarts.push(offset); + this.linePos = (offset) => { + let low = 0; + let high = this.lineStarts.length; + while (low < high) { + const mid = low + high >> 1; + if (this.lineStarts[mid] < offset) + low = mid + 1; + else + high = mid; + } + if (this.lineStarts[low] === offset) + return { line: low + 1, col: 1 }; + if (low === 0) + return { line: 0, col: offset }; + const start = this.lineStarts[low - 1]; + return { line: low, col: offset - start + 1 }; + }; + } + }; + exports.LineCounter = LineCounter; + } +}); + +// +var require_parser = __commonJS({ + ""(exports) { + "use strict"; + var node_process = __require("process"); + var cst = require_cst(); + var lexer = require_lexer(); + function includesToken(list, type) { + for (let i = 0; i < list.length; ++i) + if (list[i].type === type) + return true; + return false; + } + function findNonEmptyIndex(list) { + for (let i = 0; i < list.length; ++i) { + switch (list[i].type) { + case "space": + case "comment": + case "newline": + break; + default: + return i; + } + } + return -1; + } + function isFlowToken(token) { + switch (token == null ? void 0 : token.type) { + case "alias": + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": + case "flow-collection": + return true; + default: + return false; + } + } + function getPrevProps(parent) { + switch (parent.type) { + case "document": + return parent.start; + case "block-map": { + const it = parent.items[parent.items.length - 1]; + return it.sep ?? it.start; + } + case "block-seq": + return parent.items[parent.items.length - 1].start; + default: + return []; + } + } + function getFirstKeyStartProps(prev) { + var _a; + if (prev.length === 0) + return []; + let i = prev.length; + loop: + while (--i >= 0) { + switch (prev[i].type) { + case "doc-start": + case "explicit-key-ind": + case "map-value-ind": + case "seq-item-ind": + case "newline": + break loop; + } + } + while (((_a = prev[++i]) == null ? void 0 : _a.type) === "space") { + } + return prev.splice(i, prev.length); + } + function fixFlowSeqItems(fc) { + if (fc.start.type === "flow-seq-start") { + for (const it of fc.items) { + if (it.sep && !it.value && !includesToken(it.start, "explicit-key-ind") && !includesToken(it.sep, "map-value-ind")) { + if (it.key) + it.value = it.key; + delete it.key; + if (isFlowToken(it.value)) { + if (it.value.end) + Array.prototype.push.apply(it.value.end, it.sep); + else + it.value.end = it.sep; + } else + Array.prototype.push.apply(it.start, it.sep); + delete it.sep; + } + } + } + } + var Parser = class { + constructor(onNewLine) { + this.atNewLine = true; + this.atScalar = false; + this.indent = 0; + this.offset = 0; + this.onKeyLine = false; + this.stack = []; + this.source = ""; + this.type = ""; + this.lexer = new lexer.Lexer(); + this.onNewLine = onNewLine; + } + *parse(source, incomplete = false) { + if (this.onNewLine && this.offset === 0) + this.onNewLine(0); + for (const lexeme of this.lexer.lex(source, incomplete)) + yield* this.next(lexeme); + if (!incomplete) + yield* this.end(); + } + *next(source) { + this.source = source; + if (node_process.env.LOG_TOKENS) + console.log("|", cst.prettyToken(source)); + if (this.atScalar) { + this.atScalar = false; + yield* this.step(); + this.offset += source.length; + return; + } + const type = cst.tokenType(source); + if (!type) { + const message = `Not a YAML token: ${source}`; + yield* this.pop({ type: "error", offset: this.offset, message, source }); + this.offset += source.length; + } else if (type === "scalar") { + this.atNewLine = false; + this.atScalar = true; + this.type = "scalar"; + } else { + this.type = type; + yield* this.step(); + switch (type) { + case "newline": + this.atNewLine = true; + this.indent = 0; + if (this.onNewLine) + this.onNewLine(this.offset + source.length); + break; + case "space": + if (this.atNewLine && source[0] === " ") + this.indent += source.length; + break; + case "explicit-key-ind": + case "map-value-ind": + case "seq-item-ind": + if (this.atNewLine) + this.indent += source.length; + break; + case "doc-mode": + case "flow-error-end": + return; + default: + this.atNewLine = false; + } + this.offset += source.length; + } + } + *end() { + while (this.stack.length > 0) + yield* this.pop(); + } + get sourceToken() { + const st = { + type: this.type, + offset: this.offset, + indent: this.indent, + source: this.source + }; + return st; + } + *step() { + const top = this.peek(1); + if (this.type === "doc-end" && (!top || top.type !== "doc-end")) { + while (this.stack.length > 0) + yield* this.pop(); + this.stack.push({ + type: "doc-end", + offset: this.offset, + source: this.source + }); + return; + } + if (!top) + return yield* this.stream(); + switch (top.type) { + case "document": + return yield* this.document(top); + case "alias": + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": + return yield* this.scalar(top); + case "block-scalar": + return yield* this.blockScalar(top); + case "block-map": + return yield* this.blockMap(top); + case "block-seq": + return yield* this.blockSequence(top); + case "flow-collection": + return yield* this.flowCollection(top); + case "doc-end": + return yield* this.documentEnd(top); + } + yield* this.pop(); + } + peek(n) { + return this.stack[this.stack.length - n]; + } + *pop(error) { + const token = error ?? this.stack.pop(); + if (!token) { + const message = "Tried to pop an empty stack"; + yield { type: "error", offset: this.offset, source: "", message }; + } else if (this.stack.length === 0) { + yield token; + } else { + const top = this.peek(1); + if (token.type === "block-scalar") { + token.indent = "indent" in top ? top.indent : 0; + } else if (token.type === "flow-collection" && top.type === "document") { + token.indent = 0; + } + if (token.type === "flow-collection") + fixFlowSeqItems(token); + switch (top.type) { + case "document": + top.value = token; + break; + case "block-scalar": + top.props.push(token); + break; + case "block-map": { + const it = top.items[top.items.length - 1]; + if (it.value) { + top.items.push({ start: [], key: token, sep: [] }); + this.onKeyLine = true; + return; + } else if (it.sep) { + it.value = token; + } else { + Object.assign(it, { key: token, sep: [] }); + this.onKeyLine = !it.explicitKey; + return; + } + break; + } + case "block-seq": { + const it = top.items[top.items.length - 1]; + if (it.value) + top.items.push({ start: [], value: token }); + else + it.value = token; + break; + } + case "flow-collection": { + const it = top.items[top.items.length - 1]; + if (!it || it.value) + top.items.push({ start: [], key: token, sep: [] }); + else if (it.sep) + it.value = token; + else + Object.assign(it, { key: token, sep: [] }); + return; + } + default: + yield* this.pop(); + yield* this.pop(token); + } + if ((top.type === "document" || top.type === "block-map" || top.type === "block-seq") && (token.type === "block-map" || token.type === "block-seq")) { + const last = token.items[token.items.length - 1]; + if (last && !last.sep && !last.value && last.start.length > 0 && findNonEmptyIndex(last.start) === -1 && (token.indent === 0 || last.start.every((st) => st.type !== "comment" || st.indent < token.indent))) { + if (top.type === "document") + top.end = last.start; + else + top.items.push({ start: last.start }); + token.items.splice(-1, 1); + } + } + } + } + *stream() { + switch (this.type) { + case "directive-line": + yield { type: "directive", offset: this.offset, source: this.source }; + return; + case "byte-order-mark": + case "space": + case "comment": + case "newline": + yield this.sourceToken; + return; + case "doc-mode": + case "doc-start": { + const doc = { + type: "document", + offset: this.offset, + start: [] + }; + if (this.type === "doc-start") + doc.start.push(this.sourceToken); + this.stack.push(doc); + return; + } + } + yield { + type: "error", + offset: this.offset, + message: `Unexpected ${this.type} token in YAML stream`, + source: this.source + }; + } + *document(doc) { + if (doc.value) + return yield* this.lineEnd(doc); + switch (this.type) { + case "doc-start": { + if (findNonEmptyIndex(doc.start) !== -1) { + yield* this.pop(); + yield* this.step(); + } else + doc.start.push(this.sourceToken); + return; + } + case "anchor": + case "tag": + case "space": + case "comment": + case "newline": + doc.start.push(this.sourceToken); + return; + } + const bv = this.startBlockValue(doc); + if (bv) + this.stack.push(bv); + else { + yield { + type: "error", + offset: this.offset, + message: `Unexpected ${this.type} token in YAML document`, + source: this.source + }; + } + } + *scalar(scalar) { + if (this.type === "map-value-ind") { + const prev = getPrevProps(this.peek(2)); + const start = getFirstKeyStartProps(prev); + let sep; + if (scalar.end) { + sep = scalar.end; + sep.push(this.sourceToken); + delete scalar.end; + } else + sep = [this.sourceToken]; + const map = { + type: "block-map", + offset: scalar.offset, + indent: scalar.indent, + items: [{ start, key: scalar, sep }] + }; + this.onKeyLine = true; + this.stack[this.stack.length - 1] = map; + } else + yield* this.lineEnd(scalar); + } + *blockScalar(scalar) { + switch (this.type) { + case "space": + case "comment": + case "newline": + scalar.props.push(this.sourceToken); + return; + case "scalar": + scalar.source = this.source; + this.atNewLine = true; + this.indent = 0; + if (this.onNewLine) { + let nl = this.source.indexOf("\n") + 1; + while (nl !== 0) { + this.onNewLine(this.offset + nl); + nl = this.source.indexOf("\n", nl) + 1; + } + } + yield* this.pop(); + break; + default: + yield* this.pop(); + yield* this.step(); + } + } + *blockMap(map) { + var _a; + const it = map.items[map.items.length - 1]; + switch (this.type) { + case "newline": + this.onKeyLine = false; + if (it.value) { + const end = "end" in it.value ? it.value.end : void 0; + const last = Array.isArray(end) ? end[end.length - 1] : void 0; + if ((last == null ? void 0 : last.type) === "comment") + end == null ? void 0 : end.push(this.sourceToken); + else + map.items.push({ start: [this.sourceToken] }); + } else if (it.sep) { + it.sep.push(this.sourceToken); + } else { + it.start.push(this.sourceToken); + } + return; + case "space": + case "comment": + if (it.value) { + map.items.push({ start: [this.sourceToken] }); + } else if (it.sep) { + it.sep.push(this.sourceToken); + } else { + if (this.atIndentedComment(it.start, map.indent)) { + const prev = map.items[map.items.length - 2]; + const end = (_a = prev == null ? void 0 : prev.value) == null ? void 0 : _a.end; + if (Array.isArray(end)) { + Array.prototype.push.apply(end, it.start); + end.push(this.sourceToken); + map.items.pop(); + return; + } + } + it.start.push(this.sourceToken); + } + return; + } + if (this.indent >= map.indent) { + const atMapIndent = !this.onKeyLine && this.indent === map.indent; + const atNextItem = atMapIndent && (it.sep || it.explicitKey) && this.type !== "seq-item-ind"; + let start = []; + if (atNextItem && it.sep && !it.value) { + const nl = []; + for (let i = 0; i < it.sep.length; ++i) { + const st = it.sep[i]; + switch (st.type) { + case "newline": + nl.push(i); + break; + case "space": + break; + case "comment": + if (st.indent > map.indent) + nl.length = 0; + break; + default: + nl.length = 0; + } + } + if (nl.length >= 2) + start = it.sep.splice(nl[1]); + } + switch (this.type) { + case "anchor": + case "tag": + if (atNextItem || it.value) { + start.push(this.sourceToken); + map.items.push({ start }); + this.onKeyLine = true; + } else if (it.sep) { + it.sep.push(this.sourceToken); + } else { + it.start.push(this.sourceToken); + } + return; + case "explicit-key-ind": + if (!it.sep && !it.explicitKey) { + it.start.push(this.sourceToken); + it.explicitKey = true; + } else if (atNextItem || it.value) { + start.push(this.sourceToken); + map.items.push({ start, explicitKey: true }); + } else { + this.stack.push({ + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start: [this.sourceToken], explicitKey: true }] + }); + } + this.onKeyLine = true; + return; + case "map-value-ind": + if (it.explicitKey) { + if (!it.sep) { + if (includesToken(it.start, "newline")) { + Object.assign(it, { key: null, sep: [this.sourceToken] }); + } else { + const start2 = getFirstKeyStartProps(it.start); + this.stack.push({ + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start: start2, key: null, sep: [this.sourceToken] }] + }); + } + } else if (it.value) { + map.items.push({ start: [], key: null, sep: [this.sourceToken] }); + } else if (includesToken(it.sep, "map-value-ind")) { + this.stack.push({ + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start, key: null, sep: [this.sourceToken] }] + }); + } 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); + delete it.key; + delete it.sep; + this.stack.push({ + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start: start2, key, sep }] + }); + } else if (start.length > 0) { + it.sep = it.sep.concat(start, this.sourceToken); + } else { + it.sep.push(this.sourceToken); + } + } else { + if (!it.sep) { + Object.assign(it, { key: null, sep: [this.sourceToken] }); + } else if (it.value || atNextItem) { + map.items.push({ start, key: null, sep: [this.sourceToken] }); + } else if (includesToken(it.sep, "map-value-ind")) { + this.stack.push({ + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start: [], key: null, sep: [this.sourceToken] }] + }); + } else { + it.sep.push(this.sourceToken); + } + } + this.onKeyLine = true; + return; + case "alias": + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": { + const fs = this.flowScalar(this.type); + if (atNextItem || it.value) { + map.items.push({ start, key: fs, sep: [] }); + this.onKeyLine = true; + } else if (it.sep) { + this.stack.push(fs); + } else { + Object.assign(it, { key: fs, sep: [] }); + this.onKeyLine = true; + } + return; + } + default: { + const bv = this.startBlockValue(map); + if (bv) { + if (atMapIndent && bv.type !== "block-seq") { + map.items.push({ start }); + } + this.stack.push(bv); + return; + } + } + } + } + yield* this.pop(); + yield* this.step(); + } + *blockSequence(seq) { + var _a; + const it = seq.items[seq.items.length - 1]; + switch (this.type) { + case "newline": + if (it.value) { + const end = "end" in it.value ? it.value.end : void 0; + const last = Array.isArray(end) ? end[end.length - 1] : void 0; + if ((last == null ? void 0 : last.type) === "comment") + end == null ? void 0 : end.push(this.sourceToken); + else + seq.items.push({ start: [this.sourceToken] }); + } else + it.start.push(this.sourceToken); + return; + case "space": + case "comment": + if (it.value) + seq.items.push({ start: [this.sourceToken] }); + else { + if (this.atIndentedComment(it.start, seq.indent)) { + const prev = seq.items[seq.items.length - 2]; + const end = (_a = prev == null ? void 0 : prev.value) == null ? void 0 : _a.end; + if (Array.isArray(end)) { + Array.prototype.push.apply(end, it.start); + end.push(this.sourceToken); + seq.items.pop(); + return; + } + } + it.start.push(this.sourceToken); + } + return; + case "anchor": + case "tag": + if (it.value || this.indent <= seq.indent) + break; + it.start.push(this.sourceToken); + return; + case "seq-item-ind": + if (this.indent !== seq.indent) + break; + if (it.value || includesToken(it.start, "seq-item-ind")) + seq.items.push({ start: [this.sourceToken] }); + else + it.start.push(this.sourceToken); + return; + } + if (this.indent > seq.indent) { + const bv = this.startBlockValue(seq); + if (bv) { + this.stack.push(bv); + return; + } + } + yield* this.pop(); + yield* this.step(); + } + *flowCollection(fc) { + const it = fc.items[fc.items.length - 1]; + if (this.type === "flow-error-end") { + let top; + do { + yield* this.pop(); + top = this.peek(1); + } while (top && top.type === "flow-collection"); + } else if (fc.end.length === 0) { + switch (this.type) { + case "comma": + case "explicit-key-ind": + if (!it || it.sep) + fc.items.push({ start: [this.sourceToken] }); + else + it.start.push(this.sourceToken); + return; + case "map-value-ind": + if (!it || it.value) + fc.items.push({ start: [], key: null, sep: [this.sourceToken] }); + else if (it.sep) + it.sep.push(this.sourceToken); + else + Object.assign(it, { key: null, sep: [this.sourceToken] }); + return; + case "space": + case "comment": + case "newline": + case "anchor": + case "tag": + if (!it || it.value) + fc.items.push({ start: [this.sourceToken] }); + else if (it.sep) + it.sep.push(this.sourceToken); + else + it.start.push(this.sourceToken); + return; + case "alias": + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": { + const fs = this.flowScalar(this.type); + if (!it || it.value) + fc.items.push({ start: [], key: fs, sep: [] }); + else if (it.sep) + this.stack.push(fs); + else + Object.assign(it, { key: fs, sep: [] }); + return; + } + case "flow-map-end": + case "flow-seq-end": + fc.end.push(this.sourceToken); + return; + } + const bv = this.startBlockValue(fc); + if (bv) + this.stack.push(bv); + else { + yield* this.pop(); + yield* this.step(); + } + } else { + const parent = this.peek(2); + if (parent.type === "block-map" && (this.type === "map-value-ind" && parent.indent === fc.indent || this.type === "newline" && !parent.items[parent.items.length - 1].sep)) { + yield* this.pop(); + yield* this.step(); + } else if (this.type === "map-value-ind" && parent.type !== "flow-collection") { + const prev = getPrevProps(parent); + const start = getFirstKeyStartProps(prev); + fixFlowSeqItems(fc); + const sep = fc.end.splice(1, fc.end.length); + sep.push(this.sourceToken); + const map = { + type: "block-map", + offset: fc.offset, + indent: fc.indent, + items: [{ start, key: fc, sep }] + }; + this.onKeyLine = true; + this.stack[this.stack.length - 1] = map; + } else { + yield* this.lineEnd(fc); + } + } + } + flowScalar(type) { + if (this.onNewLine) { + let nl = this.source.indexOf("\n") + 1; + while (nl !== 0) { + this.onNewLine(this.offset + nl); + nl = this.source.indexOf("\n", nl) + 1; + } + } + return { + type, + offset: this.offset, + indent: this.indent, + source: this.source + }; + } + startBlockValue(parent) { + switch (this.type) { + case "alias": + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": + return this.flowScalar(this.type); + case "block-scalar-header": + return { + type: "block-scalar", + offset: this.offset, + indent: this.indent, + props: [this.sourceToken], + source: "" + }; + case "flow-map-start": + case "flow-seq-start": + return { + type: "flow-collection", + offset: this.offset, + indent: this.indent, + start: this.sourceToken, + items: [], + end: [] + }; + case "seq-item-ind": + return { + type: "block-seq", + offset: this.offset, + indent: this.indent, + items: [{ start: [this.sourceToken] }] + }; + case "explicit-key-ind": { + this.onKeyLine = true; + const prev = getPrevProps(parent); + const start = getFirstKeyStartProps(prev); + start.push(this.sourceToken); + return { + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start, explicitKey: true }] + }; + } + case "map-value-ind": { + this.onKeyLine = true; + const prev = getPrevProps(parent); + const start = getFirstKeyStartProps(prev); + return { + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start, key: null, sep: [this.sourceToken] }] + }; + } + } + return null; + } + atIndentedComment(start, indent) { + if (this.type !== "comment") + return false; + if (this.indent <= indent) + return false; + return start.every((st) => st.type === "newline" || st.type === "space"); + } + *documentEnd(docEnd) { + if (this.type !== "doc-mode") { + if (docEnd.end) + docEnd.end.push(this.sourceToken); + else + docEnd.end = [this.sourceToken]; + if (this.type === "newline") + yield* this.pop(); + } + } + *lineEnd(token) { + switch (this.type) { + case "comma": + case "doc-start": + case "doc-end": + case "flow-seq-end": + case "flow-map-end": + case "map-value-ind": + yield* this.pop(); + yield* this.step(); + break; + case "newline": + this.onKeyLine = false; + case "space": + case "comment": + default: + if (token.end) + token.end.push(this.sourceToken); + else + token.end = [this.sourceToken]; + if (this.type === "newline") + yield* this.pop(); + } + } + }; + exports.Parser = Parser; + } +}); + +// +var require_public_api = __commonJS({ + ""(exports) { + "use strict"; + var composer = require_composer(); + var Document = require_Document(); + var errors = require_errors(); + var log = require_log(); + var identity = require_identity(); + var lineCounter = require_line_counter(); + var parser = require_parser(); + function parseOptions(options) { + const prettyErrors = options.prettyErrors !== false; + const lineCounter$1 = options.lineCounter || prettyErrors && new lineCounter.LineCounter() || null; + return { lineCounter: lineCounter$1, prettyErrors }; + } + function parseAllDocuments(source, options = {}) { + const { lineCounter: lineCounter2, prettyErrors } = parseOptions(options); + const parser$1 = new parser.Parser(lineCounter2 == null ? void 0 : lineCounter2.addNewLine); + const composer$1 = new composer.Composer(options); + const docs = Array.from(composer$1.compose(parser$1.parse(source))); + if (prettyErrors && lineCounter2) + for (const doc of docs) { + doc.errors.forEach(errors.prettifyError(source, lineCounter2)); + doc.warnings.forEach(errors.prettifyError(source, lineCounter2)); + } + if (docs.length > 0) + return docs; + return Object.assign([], { empty: true }, composer$1.streamInfo()); + } + function parseDocument(source, options = {}) { + const { lineCounter: lineCounter2, prettyErrors } = parseOptions(options); + const parser$1 = new parser.Parser(lineCounter2 == null ? void 0 : lineCounter2.addNewLine); + const composer$1 = new composer.Composer(options); + let doc = null; + for (const _doc of composer$1.compose(parser$1.parse(source), true, source.length)) { + if (!doc) + doc = _doc; + else if (doc.options.logLevel !== "silent") { + doc.errors.push(new errors.YAMLParseError(_doc.range.slice(0, 2), "MULTIPLE_DOCS", "Source contains multiple documents; please use YAML.parseAllDocuments()")); + break; + } + } + if (prettyErrors && lineCounter2) { + doc.errors.forEach(errors.prettifyError(source, lineCounter2)); + doc.warnings.forEach(errors.prettifyError(source, lineCounter2)); + } + return doc; + } + function parse3(src, reviver, options) { + let _reviver = void 0; + if (typeof reviver === "function") { + _reviver = reviver; + } else if (options === void 0 && reviver && typeof reviver === "object") { + options = reviver; + } + const doc = parseDocument(src, options); + if (!doc) + return null; + doc.warnings.forEach((warning) => log.warn(doc.options.logLevel, warning)); + if (doc.errors.length > 0) { + if (doc.options.logLevel !== "silent") + throw doc.errors[0]; + else + doc.errors = []; + } + return doc.toJS(Object.assign({ reviver: _reviver }, options)); + } + function stringify(value, replacer, options) { + let _replacer = null; + if (typeof replacer === "function" || Array.isArray(replacer)) { + _replacer = replacer; + } else if (options === void 0 && replacer) { + options = replacer; + } + if (typeof options === "string") + options = options.length; + if (typeof options === "number") { + const indent = Math.round(options); + options = indent < 1 ? void 0 : indent > 8 ? { indent: 8 } : { indent }; + } + if (value === void 0) { + const { keepUndefined } = options ?? replacer ?? {}; + if (!keepUndefined) + return void 0; + } + if (identity.isDocument(value) && !_replacer) + return value.toString(options); + return new Document.Document(value, _replacer, options).toString(options); + } + exports.parse = parse3; + exports.parseAllDocuments = parseAllDocuments; + exports.parseDocument = parseDocument; + exports.stringify = stringify; + } +}); + +// +var require_dist2 = __commonJS({ + ""(exports) { + "use strict"; + var composer = require_composer(); + var Document = require_Document(); + var Schema = require_Schema(); + var errors = require_errors(); + var Alias = require_Alias(); + var identity = require_identity(); + var Pair = require_Pair(); + var Scalar = require_Scalar(); + var YAMLMap = require_YAMLMap(); + var YAMLSeq = require_YAMLSeq(); + var cst = require_cst(); + var lexer = require_lexer(); + var lineCounter = require_line_counter(); + var parser = require_parser(); + var publicApi = require_public_api(); + var visit = require_visit(); + exports.Composer = composer.Composer; + exports.Document = Document.Document; + exports.Schema = Schema.Schema; + exports.YAMLError = errors.YAMLError; + exports.YAMLParseError = errors.YAMLParseError; + exports.YAMLWarning = errors.YAMLWarning; + exports.Alias = Alias.Alias; + exports.isAlias = identity.isAlias; + exports.isCollection = identity.isCollection; + exports.isDocument = identity.isDocument; + exports.isMap = identity.isMap; + exports.isNode = identity.isNode; + exports.isPair = identity.isPair; + exports.isScalar = identity.isScalar; + exports.isSeq = identity.isSeq; + exports.Pair = Pair.Pair; + exports.Scalar = Scalar.Scalar; + exports.YAMLMap = YAMLMap.YAMLMap; + exports.YAMLSeq = YAMLSeq.YAMLSeq; + exports.CST = cst; + exports.Lexer = lexer.Lexer; + exports.LineCounter = lineCounter.LineCounter; + exports.Parser = parser.Parser; + exports.parse = publicApi.parse; + exports.parseAllDocuments = publicApi.parseAllDocuments; + exports.parseDocument = publicApi.parseDocument; + exports.stringify = publicApi.stringify; + exports.visit = visit.visit; + exports.visitAsync = visit.visitAsync; + } +}); + // var import_core3 = __toESM(require_core(), 1); var import_github3 = __toESM(require_github(), 1); @@ -10086,19 +25036,19 @@ var createStyler = (open, close, parent) => { parent }; }; -var createBuilder = (self, _styler, _isEmpty) => { +var createBuilder = (self2, _styler, _isEmpty) => { const builder = (...arguments_) => applyStyle(builder, arguments_.length === 1 ? "" + arguments_[0] : arguments_.join(" ")); Object.setPrototypeOf(builder, proto); - builder[GENERATOR] = self; + builder[GENERATOR] = self2; builder[STYLER] = _styler; builder[IS_EMPTY] = _isEmpty; return builder; }; -var applyStyle = (self, string) => { - if (self.level <= 0 || !string) { - return self[IS_EMPTY] ? "" : string; +var applyStyle = (self2, string) => { + if (self2.level <= 0 || !string) { + return self2[IS_EMPTY] ? "" : string; } - let styler = self[STYLER]; + let styler = self2[STYLER]; if (styler === void 0) { return string; } @@ -15113,6 +30063,11 @@ Alternatively, a new token can be created at: ${GITHUB_TOKEN_GENERATE_URL} AuthenticatedGitClient._token = null; AuthenticatedGitClient._authenticatedInstance = null; +// +var import_which = __toESM(require_lib2(), 1); +var import_lockfile = __toESM(require_lockfile(), 1); +var import_yaml = __toESM(require_dist2(), 1); + // async function getDeployments() { const { github } = await AuthenticatedGitClient.get(); diff --git a/.github/actions/saucelabs-legacy/action.yml b/.github/actions/saucelabs-legacy/action.yml index d9fa5aa1a704..cdcde69b4c85 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/bazel/setup@2670abf637fa155971cdd1f7e570a7f234922a65 - name: Setup Saucelabs Variables - uses: angular/dev-infra/github-actions/saucelabs@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/saucelabs@2670abf637fa155971cdd1f7e570a7f234922a65 - 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 2512d249c322..165bf34c9459 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/bazel/setup@2670abf637fa155971cdd1f7e570a7f234922a65 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@2670abf637fa155971cdd1f7e570a7f234922a65 - 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + - uses: angular/dev-infra/github-actions/previews/pack-and-upload-artifact@2670abf637fa155971cdd1f7e570a7f234922a65 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 18adeadbea09..d9783450882a 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + - uses: angular/dev-infra/github-actions/previews/upload-artifacts-to-firebase@2670abf637fa155971cdd1f7e570a7f234922a65 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 805782f6f9a1..7b3fc34ab7d3 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + - uses: angular/dev-infra/github-actions/branch-manager@2670abf637fa155971cdd1f7e570a7f234922a65 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/benchmark-compare.yml b/.github/workflows/benchmark-compare.yml index 28dee6c5c322..5913ac3ac21d 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + - uses: angular/dev-infra/github-actions/bazel/configure-remote@2670abf637fa155971cdd1f7e570a7f234922a65 with: bazelrc: ./.bazelrc.user diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0f532d7fa70a..7f0e6435554d 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/bazel/setup@2670abf637fa155971cdd1f7e570a7f234922a65 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@2670abf637fa155971cdd1f7e570a7f234922a65 - 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/bazel/setup@2670abf637fa155971cdd1f7e570a7f234922a65 - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@2670abf637fa155971cdd1f7e570a7f234922a65 - 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/bazel/setup@2670abf637fa155971cdd1f7e570a7f234922a65 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@2670abf637fa155971cdd1f7e570a7f234922a65 - 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/bazel/setup@2670abf637fa155971cdd1f7e570a7f234922a65 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@2670abf637fa155971cdd1f7e570a7f234922a65 - 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/bazel/setup@2670abf637fa155971cdd1f7e570a7f234922a65 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@2670abf637fa155971cdd1f7e570a7f234922a65 - 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/bazel/setup@2670abf637fa155971cdd1f7e570a7f234922a65 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@2670abf637fa155971cdd1f7e570a7f234922a65 - 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 84259ca9a819..e6ee79ed2fd0 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + - uses: angular/dev-infra/github-actions/commit-message-based-labels@2670abf637fa155971cdd1f7e570a7f234922a65 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + - uses: angular/dev-infra/github-actions/post-approval-changes@2670abf637fa155971cdd1f7e570a7f234922a65 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 baadce3ba712..3f360c5b0ca5 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + - uses: angular/dev-infra/github-actions/google-internal-tests@2670abf637fa155971cdd1f7e570a7f234922a65 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 d2998a5f6a06..6b4951c81eba 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/bazel/setup@2670abf637fa155971cdd1f7e570a7f234922a65 - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@2670abf637fa155971cdd1f7e570a7f234922a65 - name: Setup Saucelabs Variables - uses: angular/dev-infra/github-actions/saucelabs@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/saucelabs@2670abf637fa155971cdd1f7e570a7f234922a65 - 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 ab3d39fc3945..d8233c5f784c 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + - uses: angular/dev-infra/github-actions/unified-status-check@2670abf637fa155971cdd1f7e570a7f234922a65 with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/perf.yml b/.github/workflows/perf.yml index 60a3fb73911c..8189d31f0704 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 - 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/bazel/setup@2670abf637fa155971cdd1f7e570a7f234922a65 - 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 b89fd5af5b9b..7579f7fdbee8 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/linting/licenses@2670abf637fa155971cdd1f7e570a7f234922a65 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/bazel/setup@2670abf637fa155971cdd1f7e570a7f234922a65 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@2670abf637fa155971cdd1f7e570a7f234922a65 - 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/bazel/setup@2670abf637fa155971cdd1f7e570a7f234922a65 - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@2670abf637fa155971cdd1f7e570a7f234922a65 - 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/bazel/setup@2670abf637fa155971cdd1f7e570a7f234922a65 - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@2670abf637fa155971cdd1f7e570a7f234922a65 - 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/bazel/setup@2670abf637fa155971cdd1f7e570a7f234922a65 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@2670abf637fa155971cdd1f7e570a7f234922a65 - 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/bazel/setup@2670abf637fa155971cdd1f7e570a7f234922a65 - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@2670abf637fa155971cdd1f7e570a7f234922a65 - 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@2670abf637fa155971cdd1f7e570a7f234922a65 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 e4e7cde06402..03e340232485 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@e8d26efbaea89c31f1580c61c968c8119f5247a6 + uses: angular/dev-infra/github-actions/create-pr-for-changes@2670abf637fa155971cdd1f7e570a7f234922a65 with: branch-prefix: update-cli-help pr-title: 'docs: update Angular CLI help [${{github.ref_name}}]' diff --git a/adev/shared-docs/package.json b/adev/shared-docs/package.json index 2e40eb128956..31691aee9996 100644 --- a/adev/shared-docs/package.json +++ b/adev/shared-docs/package.json @@ -3,13 +3,13 @@ "version": "0.0.0-PLACEHOLDER", "peerDependencies": { "@angular/cdk": "^19.2.0-next", - "@angular/common": "^19.1.0-next", - "@angular/core": "^19.1.0-next", - "@angular/forms": "^19.1.0-next", + "@angular/common": "^19.2.0-next", + "@angular/core": "^19.2.0-next", + "@angular/forms": "^19.2.0-next", "@angular/material": "^19.2.0-next", - "@angular/platform-browser": "^19.1.0-next", - "@angular/router": "^19.1.0-next", - "@angular/ssr": "^19.1.0-next", + "@angular/platform-browser": "^19.2.0-next", + "@angular/router": "^19.2.0-next", + "@angular/ssr": "^19.2.0-next", "algoliasearch": "^5.0.0", "rxjs": "^7.8.1" }, diff --git a/package.json b/package.json index 217d6905b29e..4c730026312a 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.1.0-rc.0", - "@angular-devkit/core": "19.1.0-rc.0", - "@angular-devkit/schematics": "19.1.0-rc.0", - "@angular/build": "19.1.0-rc.0", - "@angular/cdk": "19.2.0-next.0", - "@angular/cli": "19.1.0-rc.0", - "@angular/material": "19.2.0-next.0", - "@angular/ssr": "19.1.0-rc.0", + "@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.0", "@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.1.0-rc.0", + "@schematics/angular": "19.2.0-next.0", "@stackblitz/sdk": "^1.11.0", "@types/angular": "^1.6.47", "@types/babel__core": "7.20.5", @@ -158,11 +158,11 @@ "devDependencies": { "@actions/core": "^1.10.0", "@actions/github": "^6.0.0", - "@angular-devkit/architect-cli": "0.1901.0-rc.0", - "@angular/animations": "^19.1.0-next", - "@angular/build-tooling": "https://github.com/angular/dev-infra-private-build-tooling-builds.git#1298ed34f97ed13cce3177ffd25ac3292385b196", - "@angular/core": "^19.1.0-next", - "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#744e5a754635c8e8e008f957aba8f9dd8011cc8f", + "@angular-devkit/architect-cli": "0.1902.0-next.0", + "@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", "@bazel/bazelisk": "^1.7.5", "@bazel/buildifier": "^8.0.0", "@bazel/ibazel": "^0.16.0", diff --git a/yarn.lock b/yarn.lock index bdf3da6776eb..67ff3cc4946b 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.1901.0-rc.0": - version "0.1901.0-rc.0" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect-cli/-/architect-cli-0.1901.0-rc.0.tgz#5b9aace13ec4ba492377f6687236ede74b9462af" - integrity sha512-yd8cwQN5bPZdiRZnLWfobPmWfkaO4eWz3foIXbSEcEUOAPRGYwOkrXMb8qNf2O9iXYE8JdXmVWh5S+5CmyYbrA== +"@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== dependencies: - "@angular-devkit/architect" "0.1901.0-rc.0" - "@angular-devkit/core" "19.1.0-rc.0" + "@angular-devkit/architect" "0.1902.0-next.0" + "@angular-devkit/core" "19.2.0-next.0" ansi-colors "4.1.3" progress "2.0.3" symbol-observable "4.0.0" @@ -184,18 +184,26 @@ "@angular-devkit/core" "19.1.0-rc.0" rxjs "7.8.1" -"@angular-devkit/build-angular@19.1.0-rc.0": - version "19.1.0-rc.0" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-19.1.0-rc.0.tgz#f47f4e7aa08b1d23fd4345eda7837c48f1f6c412" - integrity sha512-hVuVwGASabKYOFZVnBxCzt+1eqw9bEtNA/N3XZMTkVz0kU12Okw7V78+fmlxODD3T//DuBF39w/UjwpsSAq7ag== +"@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== + dependencies: + "@angular-devkit/core" "19.2.0-next.0" + 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== dependencies: "@ampproject/remapping" "2.3.0" - "@angular-devkit/architect" "0.1901.0-rc.0" - "@angular-devkit/build-webpack" "0.1901.0-rc.0" - "@angular-devkit/core" "19.1.0-rc.0" - "@angular/build" "19.1.0-rc.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.3" + "@babel/generator" "7.26.5" "@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" @@ -204,7 +212,7 @@ "@babel/preset-env" "7.26.0" "@babel/runtime" "7.26.0" "@discoveryjs/json-ext" "0.6.3" - "@ngtools/webpack" "19.1.0-rc.0" + "@ngtools/webpack" "19.2.0-next.0" "@vitejs/plugin-basic-ssl" "1.2.0" ansi-colors "4.1.3" autoprefixer "10.4.20" @@ -218,7 +226,7 @@ istanbul-lib-instrument "6.0.3" jsonc-parser "3.3.1" karma-source-map-support "1.4.0" - less "4.2.1" + less "4.2.2" less-loader "12.2.0" license-webpack-plugin "4.0.2" loader-utils "3.3.1" @@ -227,11 +235,11 @@ ora "5.4.1" picomatch "4.0.2" piscina "4.8.0" - postcss "8.4.49" + postcss "8.5.1" postcss-loader "8.1.1" resolve-url-loader "5.0.0" rxjs "7.8.1" - sass "1.83.1" + sass "1.83.4" sass-loader "16.0.4" semver "7.6.3" source-map-loader "5.0.0" @@ -257,12 +265,12 @@ typescript "3.2.4" webpack-sources "1.3.0" -"@angular-devkit/build-webpack@0.1901.0-rc.0": - version "0.1901.0-rc.0" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1901.0-rc.0.tgz#44b734e3224703649833ced10a4094cc5b7a61c3" - integrity sha512-1rxJ2oNqjeWF7rXkElGWtWeR6F4C+uF1HU1b65OI9pYNjzUp5Wh7+z1V/l3gfexohkv7W+7KyQkAFzFjwoJMpw== +"@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== dependencies: - "@angular-devkit/architect" "0.1901.0-rc.0" + "@angular-devkit/architect" "0.1902.0-next.0" rxjs "7.8.1" "@angular-devkit/core@19.1.0-rc.0": @@ -277,21 +285,33 @@ rxjs "7.8.1" source-map "0.7.4" -"@angular-devkit/schematics@19.1.0-rc.0": - version "19.1.0-rc.0" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-19.1.0-rc.0.tgz#ec47363d7dc98c7d468ed5991fe6b119651cd4fb" - integrity sha512-SfgiXmRsfqH+zn6vkO1Oi4PpzQ9QA6G/ACV65+fgm3YeAaiD2v2h6UXOF/CVC2yjRfzD5ychEIcsY2YPAsvJIA== +"@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== dependencies: - "@angular-devkit/core" "19.1.0-rc.0" + 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" + +"@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== + dependencies: + "@angular-devkit/core" "19.2.0-next.0" jsonc-parser "3.3.1" magic-string "0.30.17" ora "5.4.1" rxjs "7.8.1" -"@angular/animations@^19.1.0-next": - version "19.1.0-rc.0" - resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-19.1.0-rc.0.tgz#08d5b25f3b57eb8acc9cc8fd2d188d0c76bf31b8" - integrity sha512-CAbv8Zr7RLYUFh6afw/3k7OHXvpxJvXDl5YeXWw5gBC7j1zHWochCVcEZVqBnrumGllVhxctM7L6gCI0x+EG/g== +"@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== dependencies: tslib "^2.3.0" @@ -303,10 +323,10 @@ "@angular/core" "^13.0.0 || ^14.0.0-0" reflect-metadata "^0.1.13" -"@angular/build-tooling@https://github.com/angular/dev-infra-private-build-tooling-builds.git#1298ed34f97ed13cce3177ffd25ac3292385b196": - version "0.0.0-e8d26efbaea89c31f1580c61c968c8119f5247a6" - uid "1298ed34f97ed13cce3177ffd25ac3292385b196" - resolved "https://github.com/angular/dev-infra-private-build-tooling-builds.git#1298ed34f97ed13cce3177ffd25ac3292385b196" +"@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" "@angular/build" "19.1.0-rc.0" @@ -374,26 +394,60 @@ optionalDependencies: lmdb "3.2.2" -"@angular/cdk@19.2.0-next.0": +"@angular/build@19.2.0-next.0": version "19.2.0-next.0" - resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-19.2.0-next.0.tgz#1ae58abf35f3b355feb5ace5bed35753eff1fca4" - integrity sha512-QtCNjgobncqbiVGEOfK3l5ieI6O5O4eMH/c7iZTQr+wThnoM9EX64D/GyzW1KbPR2P546EFmZqrTtu2HhBQX6A== + resolved "https://registry.yarnpkg.com/@angular/build/-/build-19.2.0-next.0.tgz#3840f060d286bc14dcda6b704361957279e7b67d" + integrity sha512-Y63iOBcohaQl9uEDRbQ7P/Ra8gaQuYgHyzTD3ATPTTPrKxyIsxYy8DE2r5BJIcYohhimrS59uL6rTvQOG/Njfg== + 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" + "@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" + "@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 "4.0.2" + piscina "4.8.0" + rollup "4.31.0" + sass "1.83.4" + semver "7.6.3" + vite "6.0.11" + watchpack "2.4.2" + optionalDependencies: + lmdb "3.2.2" + +"@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== dependencies: tslib "^2.3.0" optionalDependencies: parse5 "^7.1.2" -"@angular/cli@19.1.0-rc.0": - version "19.1.0-rc.0" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-19.1.0-rc.0.tgz#f83c8fce3addda86d59c4741c676b62270962743" - integrity sha512-NWrXdaGxC4l8mJTeJDVDd8eKFIvWa+S0grQON88orL4Rm5n7LwT8SC3vPPDIrc/W6m8Z9Wc+JBrI3VPI9lZh3w== +"@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== dependencies: - "@angular-devkit/architect" "0.1901.0-rc.0" - "@angular-devkit/core" "19.1.0-rc.0" - "@angular-devkit/schematics" "19.1.0-rc.0" - "@inquirer/prompts" "7.2.1" + "@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" "@listr2/prompt-adapter-inquirer" "2.0.18" - "@schematics/angular" "19.1.0-rc.0" + "@schematics/angular" "19.2.0-next.0" "@yarnpkg/lockfile" "1.1.0" ini "5.0.0" jsonc-parser "3.3.1" @@ -413,24 +467,24 @@ dependencies: tslib "^2.3.0" -"@angular/core@^19.1.0-next": - version "19.1.0-rc.0" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-19.1.0-rc.0.tgz#303dcf8ee8ed8aa196eb71de43eecb291e8d82d9" - integrity sha512-t4zWPx+EyKi7qIjBo+dBhmkk8nZVB88YBj+et5oklG1CNL8//w7q/b8bmmirT+/JGHsB9E044skeMohhayCJ3A== +"@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== dependencies: tslib "^2.3.0" -"@angular/material@19.2.0-next.0": - version "19.2.0-next.0" - resolved "https://registry.yarnpkg.com/@angular/material/-/material-19.2.0-next.0.tgz#08f189a839dc61e72e58dc750ed88e7497a2918a" - integrity sha512-UNx+qtHyCGI0BL0IonAu0cwkoi7N8kT8JthuX5DTl+1Ks8CESnUxk/4dIzWGGObmbMXhNp92yyM29ncqTxb9Ag== +"@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== dependencies: tslib "^2.3.0" -"@angular/ng-dev@https://github.com/angular/dev-infra-private-ng-dev-builds.git#744e5a754635c8e8e008f957aba8f9dd8011cc8f": - version "0.0.0-e8d26efbaea89c31f1580c61c968c8119f5247a6" - uid "744e5a754635c8e8e008f957aba8f9dd8011cc8f" - resolved "https://github.com/angular/dev-infra-private-ng-dev-builds.git#744e5a754635c8e8e008f957aba8f9dd8011cc8f" +"@angular/ng-dev@https://github.com/angular/dev-infra-private-ng-dev-builds.git#2a80accff0f6515819a6c6e77eeca9d6936cd7b9": + version "0.0.0-2670abf637fa155971cdd1f7e570a7f234922a65" + uid "2a80accff0f6515819a6c6e77eeca9d6936cd7b9" + resolved "https://github.com/angular/dev-infra-private-ng-dev-builds.git#2a80accff0f6515819a6c6e77eeca9d6936cd7b9" dependencies: "@google-cloud/spanner" "7.17.1" "@octokit/rest" "21.1.0" @@ -442,12 +496,13 @@ supports-color "10.0.0" typed-graphqlify "^3.1.1" typescript "~4.9.0" + which "^5.0.0" yaml "2.7.0" -"@angular/ssr@19.1.0-rc.0": - version "19.1.0-rc.0" - resolved "https://registry.yarnpkg.com/@angular/ssr/-/ssr-19.1.0-rc.0.tgz#c58daf37b555d580cea07d40f5e29d96a28a51c3" - integrity sha512-hqB/TKcKLjMYcQJg3O6NprL6m0OpD9a25M5o318QduZSjbYqSCsG7GrpuNpKUIbLjGj3U0aBTyV86OoaUG+yeg== +"@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== dependencies: tslib "^2.3.0" @@ -525,17 +580,6 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@7.26.3": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019" - integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ== - dependencies: - "@babel/parser" "^7.26.3" - "@babel/types" "^7.26.3" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^3.0.2" - "@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" @@ -707,7 +751,7 @@ "@babel/template" "^7.25.9" "@babel/types" "^7.26.0" -"@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.3", "@babel/parser@^7.26.5": +"@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": version "7.26.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.5.tgz#6fec9aebddef25ca57a935c86dbb915ae2da3e1f" integrity sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw== @@ -1309,7 +1353,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.3", "@babel/types@^7.26.5", "@babel/types@^7.4.4": +"@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.4.4": version "7.26.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.5.tgz#7a1e1c01d28e26d1fe7f8ec9567b3b92b9d07747" integrity sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg== @@ -2049,7 +2093,7 @@ local-pkg "^0.5.1" mlly "^1.7.3" -"@inquirer/checkbox@^4.0.4", "@inquirer/checkbox@^4.0.6": +"@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== @@ -2068,7 +2112,7 @@ "@inquirer/core" "^10.1.2" "@inquirer/type" "^3.0.2" -"@inquirer/confirm@^5.1.1", "@inquirer/confirm@^5.1.3": +"@inquirer/confirm@5.1.3", "@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== @@ -2091,7 +2135,7 @@ wrap-ansi "^6.2.0" yoctocolors-cjs "^2.1.2" -"@inquirer/editor@^4.2.1", "@inquirer/editor@^4.2.3": +"@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== @@ -2100,7 +2144,7 @@ "@inquirer/type" "^3.0.2" external-editor "^3.1.0" -"@inquirer/expand@^4.0.4", "@inquirer/expand@^4.0.6": +"@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== @@ -2114,7 +2158,7 @@ resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.9.tgz#9d8128f8274cde4ca009ca8547337cab3f37a4a3" integrity sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ== -"@inquirer/input@^4.1.1", "@inquirer/input@^4.1.3": +"@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== @@ -2122,7 +2166,7 @@ "@inquirer/core" "^10.1.4" "@inquirer/type" "^3.0.2" -"@inquirer/number@^3.0.4", "@inquirer/number@^3.0.6": +"@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== @@ -2130,7 +2174,7 @@ "@inquirer/core" "^10.1.4" "@inquirer/type" "^3.0.2" -"@inquirer/password@^4.0.4", "@inquirer/password@^4.0.6": +"@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== @@ -2139,23 +2183,7 @@ "@inquirer/type" "^3.0.2" ansi-escapes "^4.3.2" -"@inquirer/prompts@7.2.1": - version "7.2.1" - resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-7.2.1.tgz#f00fbcf06998a07faebc10741efa289384529950" - integrity sha512-v2JSGri6/HXSfoGIwuKEn8sNCQK6nsB2BNpy2lSX6QH9bsECrMv93QHnj5+f+1ZWpF/VNioIV2B/PDox8EvGuQ== - dependencies: - "@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" - -"@inquirer/prompts@^7.0.0": +"@inquirer/prompts@7.2.3", "@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== @@ -2171,7 +2199,7 @@ "@inquirer/search" "^3.0.6" "@inquirer/select" "^4.0.6" -"@inquirer/rawlist@^4.0.4", "@inquirer/rawlist@^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== @@ -2180,7 +2208,7 @@ "@inquirer/type" "^3.0.2" yoctocolors-cjs "^2.1.2" -"@inquirer/search@^3.0.4", "@inquirer/search@^3.0.6": +"@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== @@ -2190,7 +2218,7 @@ "@inquirer/type" "^3.0.2" yoctocolors-cjs "^2.1.2" -"@inquirer/select@^4.0.4", "@inquirer/select@^4.0.6": +"@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== @@ -2599,10 +2627,10 @@ "@napi-rs/nice-win32-ia32-msvc" "1.0.1" "@napi-rs/nice-win32-x64-msvc" "1.0.1" -"@ngtools/webpack@19.1.0-rc.0": - version "19.1.0-rc.0" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-19.1.0-rc.0.tgz#139fd4576f09be91afbcfc3a8c589af3d1639120" - integrity sha512-alRs/9Lk0x4LBWw6e3MaSS7ISDFoorM4DBwA2qPrIfytYkJR1tbKKCn5m+TwgeNPPp43+QpBzIfftzHhnyiRuw== +"@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== "@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3": version "2.1.8-no-fsevents.3" @@ -3170,96 +3198,191 @@ 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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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== + "@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" @@ -3300,13 +3423,13 @@ argparse "~1.0.9" string-argv "~0.3.1" -"@schematics/angular@19.1.0-rc.0": - version "19.1.0-rc.0" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-19.1.0-rc.0.tgz#9192d8f26d0c26b0ffc895d9392a7d7746ec1408" - integrity sha512-YJi2fO9sUMnUG2fhEDWlb7Ad3Xx6sr1OJHLN4snFq3smZEzgrYKqiOp97/ZMcEsVOtgTpYAQ1l0nci2MJa6YtQ== +"@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== dependencies: - "@angular-devkit/core" "19.1.0-rc.0" - "@angular-devkit/schematics" "19.1.0-rc.0" + "@angular-devkit/core" "19.2.0-next.0" + "@angular-devkit/schematics" "19.2.0-next.0" jsonc-parser "3.3.1" "@shikijs/core@2.0.0": @@ -11386,10 +11509,10 @@ less-loader@12.2.0: resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-12.2.0.tgz#e1e94522f6abe9e064ef396c29a3151bc6c1b6cc" integrity sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg== -less@4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/less/-/less-4.2.1.tgz#fe4c9848525ab44614c0cf2c00abd8d031bb619a" - integrity sha512-CasaJidTIhWmjcqv0Uj5vccMI7pJgfD9lMkKtlnTHAdJdYK/7l8pM9tumLyJ0zhbD4KJLo/YvTj+xznQd5NBhg== +less@4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/less/-/less-4.2.2.tgz#4b59ede113933b58ab152190edf9180fc36846d8" + integrity sha512-tkuLHQlvWUTeQ3doAqnHbNn8T6WX1KA8yvbKG9x4VtKtIjHsVKQZCH11zRgAfbDAXC2UNIg/K9BYAAcEzUIrNg== dependencies: copy-anything "^2.0.1" parse-node-version "^1.0.1" @@ -12458,7 +12581,7 @@ nan@^2.12.1, nan@^2.20.0: resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.0.tgz#31bc433fc33213c97bad36404bb68063de604de3" integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw== -nanoid@^3.3.7, nanoid@^3.3.8: +nanoid@^3.3.8: version "3.3.8" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== @@ -13667,16 +13790,7 @@ postcss-values-parser@^6.0.2: is-url-superb "^4.0.0" quote-unquote "^1.0.0" -postcss@8.4.49: - version "8.4.49" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19" - integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== - dependencies: - nanoid "^3.3.7" - 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: +postcss@8.5.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== @@ -14662,6 +14776,34 @@ rollup@4.30.1, rollup@^4.23.0: "@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== + 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" + fsevents "~2.3.2" + rollup@~1.11.3: version "1.11.3" resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.11.3.tgz#6f436db2a2d6b63f808bf60ad01a177643dedb81" @@ -14820,6 +14962,17 @@ 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== + dependencies: + chokidar "^4.0.0" + immutable "^5.0.2" + source-map-js ">=0.6.2 <2.0.0" + 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" @@ -17207,6 +17360,17 @@ 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== + dependencies: + esbuild "^0.24.2" + postcss "^8.4.49" + rollup "^4.23.0" + 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" From b16d8a1c55f33ee3b578e9d39a4e0f1552ded04b Mon Sep 17 00:00:00 2001 From: Luan Gong Date: Tue, 28 Jan 2025 22:08:47 +0800 Subject: [PATCH 0203/1220] docs(core): Fix typo in documentation of linkedSignal (#59752) PR Close #59752 --- packages/core/src/render3/reactivity/linked_signal.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/src/render3/reactivity/linked_signal.ts b/packages/core/src/render3/reactivity/linked_signal.ts index 6640145bdcae..c63ada935cb5 100644 --- a/packages/core/src/render3/reactivity/linked_signal.ts +++ b/packages/core/src/render3/reactivity/linked_signal.ts @@ -22,7 +22,7 @@ import { const identityFn = (v: T) => v; /** - * Creates a writable signals whose value is initialized and reset by the linked, reactive computation. + * Creates a writable signal whose value is initialized and reset by the linked, reactive computation. * * @developerPreview */ @@ -32,7 +32,7 @@ export function linkedSignal( ): WritableSignal; /** - * Creates a writable signals whose value is initialized and reset by the linked, reactive computation. + * Creates a writable signal whose value is initialized and reset by the linked, reactive computation. * This is an advanced API form where the computation has access to the previous value of the signal and the computation result. * * Note: The computation is reactive, meaning the linked signal will automatically update whenever any of the signals used within the computation change. From ccebbbae6ef893364340483f76f3a8175284ef3e Mon Sep 17 00:00:00 2001 From: Joey Perrott Date: Tue, 28 Jan 2025 16:41:11 +0000 Subject: [PATCH 0204/1220] ci: prevent renovate from updating @bazel/ibazel (#59761) Add @bazel/ibazel to the ignored deps list for renovate to prevent us from updating to a version that is incompatible with our repository. PR Close #59761 --- package.json | 2 +- renovate.json | 25 +++++++++++++------------ yarn.lock | 4 +--- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index 4c730026312a..29d0b55a103e 100644 --- a/package.json +++ b/package.json @@ -165,7 +165,7 @@ "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#2a80accff0f6515819a6c6e77eeca9d6936cd7b9", "@bazel/bazelisk": "^1.7.5", "@bazel/buildifier": "^8.0.0", - "@bazel/ibazel": "^0.16.0", + "@bazel/ibazel": "0.16.2", "@codemirror/autocomplete": "^6.11.1", "@codemirror/commands": "^6.3.2", "@codemirror/lang-angular": "^0.1.2", diff --git a/renovate.json b/renovate.json index c0f90707eb67..a7805f293cf6 100644 --- a/renovate.json +++ b/renovate.json @@ -26,6 +26,9 @@ "executionMode": "branch" }, "ignoreDeps": [ + "@bazel/ibazel", + "@bazel/runfiles", + "@rollup/plugin-node-resolve", "@types/node", "@types/selenium-webdriver", "angular-1.5", @@ -36,29 +39,27 @@ "angular-mocks-1.6", "angular-mocks-1.7", "angular-mocks-1.8", - "remark", - "remark-html", - "selenium-webdriver", - "watchr", - "rxjs", - "glob", + "aspect_bazel_lib", + "build_bazel_rules_nodejs", "chalk", "convert-source-map", - "@rollup/plugin-node-resolve", - "hast-util-is-element", + "glob", "hast-util-has-property", + "hast-util-is-element", "hast-util-to-string", "rehype-slug", + "remark", + "remark-html", "rollup", + "rules_pkg", + "rxjs", + "selenium-webdriver", "systemjs", "unist-util-filter", "unist-util-source", "unist-util-visit", "unist-util-visit-parents", - "rules_pkg", - "aspect_bazel_lib", - "@bazel/runfiles", - "build_bazel_rules_nodejs" + "watchr" ], "packageRules": [ { diff --git a/yarn.lock b/yarn.lock index 67ff3cc4946b..45510d866b93 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" @@ -483,7 +482,6 @@ "@angular/ng-dev@https://github.com/angular/dev-infra-private-ng-dev-builds.git#2a80accff0f6515819a6c6e77eeca9d6936cd7b9": version "0.0.0-2670abf637fa155971cdd1f7e570a7f234922a65" - uid "2a80accff0f6515819a6c6e77eeca9d6936cd7b9" resolved "https://github.com/angular/dev-infra-private-ng-dev-builds.git#2a80accff0f6515819a6c6e77eeca9d6936cd7b9" dependencies: "@google-cloud/spanner" "7.17.1" @@ -1390,7 +1388,7 @@ resolved "https://registry.yarnpkg.com/@bazel/esbuild/-/esbuild-5.8.1.tgz#74668d33bfb29652cbe8e2852aa8dca5e0839e73" integrity sha512-8k4LL8P3ivCnFeBOcjiFxL8U+M5VtEGuOyIqm2hfEiP8xDWsZLS7YQ7KhshKJy7Elh2dlK9oGgMtl0D/x9kxxg== -"@bazel/ibazel@^0.16.0": +"@bazel/ibazel@0.16.2": version "0.16.2" resolved "https://registry.yarnpkg.com/@bazel/ibazel/-/ibazel-0.16.2.tgz#05dd7f06659759fda30f87b15534f1e42f1201bb" integrity sha512-KgqAWMH0emL6f3xH6nqyTryoBMqlJ627LBIe9PT1PRRQPz2FtHib3FIHJPukp1slzF3hJYZvdiVwgPnHbaSOOA== From 97897eebd8a297b62a73d43e8cf1fd7828d53ed3 Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Sun, 26 Jan 2025 11:15:17 -0800 Subject: [PATCH 0205/1220] docs(docs-infra): Remove leading path from zipped files. (#59726) In certain circonstances, a leading slash in the file paths created a incorrect unarchived project. fixes #57075 PR Close #59726 --- adev/shared-docs/utils/zip.utils.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/adev/shared-docs/utils/zip.utils.ts b/adev/shared-docs/utils/zip.utils.ts index ee005aa21e27..54da4f76ec14 100644 --- a/adev/shared-docs/utils/zip.utils.ts +++ b/adev/shared-docs/utils/zip.utils.ts @@ -14,6 +14,9 @@ import {zip, strToU8} from 'fflate'; export async function generateZip(files: FileAndContent[]): Promise { const filesObj: Record = {}; files.forEach(({path, content}) => { + if (path.startsWith('/')) { + path = path.slice(1); + } filesObj[path] = typeof content === 'string' ? strToU8(content) : content; }); From e98b0f1d3989ce23a710db24f2823fcdd5b66e70 Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Sun, 26 Jan 2025 16:42:32 -0800 Subject: [PATCH 0206/1220] docs(docs-infra): Check for files without using `/` as root. (#59726) In certain circonstances, a leading slash in the file paths created a incorrect unarchived project. fixes #57075 PR Close #59726 --- adev/shared-docs/testing/testing-helper.ts | 6 +++++- adev/shared-docs/utils/zip.utils.ts | 3 --- .../editor/node-runtime-sandbox.service.spec.ts | 14 ++++++++++++++ .../src/app/editor/node-runtime-sandbox.service.ts | 2 +- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/adev/shared-docs/testing/testing-helper.ts b/adev/shared-docs/testing/testing-helper.ts index d1cc158599bb..9e57552b0695 100644 --- a/adev/shared-docs/testing/testing-helper.ts +++ b/adev/shared-docs/testing/testing-helper.ts @@ -144,12 +144,16 @@ class FakeFileSystemAPI implements FileSystemAPI { ): Promise[]>; readdir( path: unknown, - options?: unknown, + options?: {encoding?: string | null | undefined; withFileTypes?: boolean} | string | null, ): | Promise | Promise | Promise[]> | Promise[]> { + if (typeof options === 'object' && options?.withFileTypes === true) { + return Promise.resolve([{name: 'fake-file', isFile: () => true, isDirectory: () => false}]); + } + return Promise.resolve(['/fake-dirname']); } diff --git a/adev/shared-docs/utils/zip.utils.ts b/adev/shared-docs/utils/zip.utils.ts index 54da4f76ec14..ee005aa21e27 100644 --- a/adev/shared-docs/utils/zip.utils.ts +++ b/adev/shared-docs/utils/zip.utils.ts @@ -14,9 +14,6 @@ import {zip, strToU8} from 'fflate'; export async function generateZip(files: FileAndContent[]): Promise { const filesObj: Record = {}; files.forEach(({path, content}) => { - if (path.startsWith('/')) { - path = path.slice(1); - } filesObj[path] = typeof content === 'string' ? strToU8(content) : content; }); diff --git a/adev/src/app/editor/node-runtime-sandbox.service.spec.ts b/adev/src/app/editor/node-runtime-sandbox.service.spec.ts index afc06d1737a7..9e22e908eaba 100644 --- a/adev/src/app/editor/node-runtime-sandbox.service.spec.ts +++ b/adev/src/app/editor/node-runtime-sandbox.service.spec.ts @@ -300,4 +300,18 @@ describe('NodeRuntimeSandbox', () => { expect(deleteFileSpy).toHaveBeenCalledWith(fileToDelete); } }); + + it('should not have any filePath starting with "/" in solutions files', async () => { + service['webContainerPromise'] = Promise.resolve( + new FakeWebContainer() as unknown as WebContainer, + ); + setValuesToInitializeProject(); + + await service.init(); + + const files = await service.getSolutionFiles(); + + expect(files.length).toBe(1); + expect(files[0].path).toBe('fake-file'); + }); }); diff --git a/adev/src/app/editor/node-runtime-sandbox.service.ts b/adev/src/app/editor/node-runtime-sandbox.service.ts index 4db6e4d726fe..0ea83c4fe09b 100644 --- a/adev/src/app/editor/node-runtime-sandbox.service.ts +++ b/adev/src/app/editor/node-runtime-sandbox.service.ts @@ -146,7 +146,7 @@ export class NodeRuntimeSandbox { const excludeFolders = ['node_modules', '.angular', 'dist']; return await checkFilesInDirectory( - '/', + '', webContainer.fs, (path?: string) => !!path && !excludeFolders.includes(path), ); From 9ed9c40479ae9f33d2256f86ad7f5f141618f86a Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Sun, 26 Jan 2025 22:11:45 -0800 Subject: [PATCH 0207/1220] docs(docs-infra): remove non-necessary files from playground zip. (#59728) fixes #56739 PR Close #59728 --- adev/shared-docs/utils/filesystem.utils.ts | 10 +++++++--- adev/src/app/editor/node-runtime-sandbox.service.ts | 12 ++++++++++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/adev/shared-docs/utils/filesystem.utils.ts b/adev/shared-docs/utils/filesystem.utils.ts index f4e13381fac8..788e56bc456f 100644 --- a/adev/shared-docs/utils/filesystem.utils.ts +++ b/adev/shared-docs/utils/filesystem.utils.ts @@ -41,7 +41,7 @@ interface FileSystemAPI { export const checkFilesInDirectory = async ( dir: string, fs: FileSystemAPI, - filterFoldersPredicate: (path?: string) => boolean = () => true, + filterFromRootPredicate: ((path: string) => boolean) | null, files: FileAndContent[] = [], ) => { const entries = (await fs.readdir(dir, {withFileTypes: true})) ?? []; @@ -49,11 +49,15 @@ export const checkFilesInDirectory = async ( for (const entry of entries) { const fullPath = normalizePath(`${dir}/${entry.name}`); + if (filterFromRootPredicate && !filterFromRootPredicate?.(entry.name)) { + continue; + } + if (entry.isFile()) { const content = await fs.readFile(fullPath, 'utf-8'); files.push({content, path: fullPath}); - } else if (entry.isDirectory() && filterFoldersPredicate(entry.name)) { - await checkFilesInDirectory(fullPath, fs, filterFoldersPredicate, files); + } else if (entry.isDirectory()) { + await checkFilesInDirectory(fullPath, fs, null, files); } } diff --git a/adev/src/app/editor/node-runtime-sandbox.service.ts b/adev/src/app/editor/node-runtime-sandbox.service.ts index 0ea83c4fe09b..f036194ff369 100644 --- a/adev/src/app/editor/node-runtime-sandbox.service.ts +++ b/adev/src/app/editor/node-runtime-sandbox.service.ts @@ -143,12 +143,20 @@ export class NodeRuntimeSandbox { async getSolutionFiles(): Promise { const webContainer = await this.webContainerPromise!; - const excludeFolders = ['node_modules', '.angular', 'dist']; + const excludeFromRoot = [ + 'node_modules', + '.angular', + 'dist', + 'BUILD.bazel', + 'idx', + 'package.json.template', + 'config.json', + ]; return await checkFilesInDirectory( '', webContainer.fs, - (path?: string) => !!path && !excludeFolders.includes(path), + (path: string) => !excludeFromRoot.includes(path), ); } From 96e602ebe9cdf7355befad22c11f9f91e0436e01 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Tue, 28 Jan 2025 21:54:21 +0100 Subject: [PATCH 0208/1220] fix(core): cancel in-progress request when same value is assigned (#59280) Fixes that `resource` wasn't cancelling its in-progress request if the same value as the current one is assigned. Fixes #59272. PR Close #59280 --- packages/core/src/resource/resource.ts | 6 ++- packages/core/test/resource/resource_spec.ts | 53 ++++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/packages/core/src/resource/resource.ts b/packages/core/src/resource/resource.ts index 7392e511bf19..18ba9d0f7d2d 100644 --- a/packages/core/src/resource/resource.ts +++ b/packages/core/src/resource/resource.ts @@ -221,7 +221,11 @@ class ResourceImpl extends BaseWritableResource implements ResourceRef< } const current = untracked(this.value); - if (this.equal ? this.equal(current, value) : current === value) { + + if ( + untracked(this.status) === ResourceStatus.Local && + (this.equal ? this.equal(current, value) : current === value) + ) { return; } diff --git a/packages/core/test/resource/resource_spec.ts b/packages/core/test/resource/resource_spec.ts index aac793b9eff8..ef04b4d92385 100644 --- a/packages/core/test/resource/resource_spec.ts +++ b/packages/core/test/resource/resource_spec.ts @@ -622,6 +622,59 @@ describe('resource', () => { stream.set({error: 'fail'}); expect(res.value()).toBe(undefined); }); + + it('should interrupt pending request if the same value is set', async () => { + const counter = signal(0); + const backend = new MockEchoBackend<{counter: number} | null>(); + const aborted: ({counter: number} | null)[] = []; + const echoResource = resource<{counter: number} | null, {counter: number} | null>({ + request: () => ({counter: counter()}), + loader: ({request, abortSignal}) => { + abortSignal.addEventListener('abort', () => backend.abort(request)); + return backend.fetch(request).catch((reason) => { + if (reason === 'aborted') { + aborted.push(request); + } + throw new Error(reason); + }); + }, + injector: TestBed.inject(Injector), + }); + + // Start the initial load. + TestBed.flushEffects(); + await Promise.resolve(); + expect(echoResource.status()).toBe(ResourceStatus.Loading); + expect(echoResource.value()).toBe(undefined); + expect(echoResource.error()).toBe(undefined); + expect(aborted).toEqual([]); + + // Interrupt by setting a value before the request has resolved. + echoResource.set(null); + TestBed.flushEffects(); + await backend.flush(); + expect(echoResource.status()).toBe(ResourceStatus.Local); + expect(echoResource.value()).toBe(null); + expect(echoResource.error()).toBe(undefined); + expect(aborted).toEqual([{counter: 0}]); + + // Reload the resource to trigger another request. + echoResource.reload(); + TestBed.flushEffects(); + await Promise.resolve(); + expect(echoResource.status()).toBe(ResourceStatus.Reloading); + expect(echoResource.value()).toBe(null); + expect(echoResource.error()).toBe(undefined); + expect(aborted).toEqual([{counter: 0}]); + + // Interrupt the reload with the same value as before. + echoResource.set(null); + await backend.flush(); + expect(echoResource.status()).toBe(ResourceStatus.Local); + expect(echoResource.value()).toBe(null); + expect(echoResource.error()).toBe(undefined); + expect(aborted).toEqual([{counter: 0}, {counter: 0}]); + }); }); function flushMicrotasks(): Promise { From cf9054248d1b8b5658c5f8b582cea71535f081c2 Mon Sep 17 00:00:00 2001 From: arturovt Date: Sat, 25 Jan 2025 22:26:24 +0200 Subject: [PATCH 0209/1220] fix(core): check whether application is destroyed before printing hydration stats (#59716) In this commit, we check whether the application is destroyed before printing hydration stats. The application may be destroyed before it becomes stable, so when the `whenStableWithTimeout` resolves, the injector might already be in a destroyed state. As a result, calling `injector.get` would throw an error indicating that the injector has already been destroyed. PR Close #59716 --- packages/core/src/hydration/api.ts | 24 +++++--- .../test/full_app_hydration_spec.ts | 59 +++++++++++++++++++ 2 files changed, 76 insertions(+), 7 deletions(-) diff --git a/packages/core/src/hydration/api.ts b/packages/core/src/hydration/api.ts index afd7531c08c6..e40d715aa0f5 100644 --- a/packages/core/src/hydration/api.ts +++ b/packages/core/src/hydration/api.ts @@ -156,12 +156,12 @@ function printHydrationStats(injector: Injector) { /** * Returns a Promise that is resolved when an application becomes stable. */ -function whenStableWithTimeout(appRef: ApplicationRef, injector: Injector): Promise { +function whenStableWithTimeout(appRef: ApplicationRef): Promise { const whenStablePromise = appRef.whenStable(); if (typeof ngDevMode !== 'undefined' && ngDevMode) { const timeoutTime = APPLICATION_IS_STABLE_TIMEOUT; - const console = injector.get(Console); - const ngZone = injector.get(NgZone); + const console = appRef.injector.get(Console); + const ngZone = appRef.injector.get(NgZone); // The following call should not and does not prevent the app to become stable // We cannot use RxJS timer here because the app would remain unstable. @@ -274,7 +274,7 @@ export function withDomHydration(): EnvironmentProviders { useFactory: () => { if (inject(IS_HYDRATION_DOM_REUSE_ENABLED)) { const appRef = inject(ApplicationRef); - const injector = inject(Injector); + return () => { // Wait until an app becomes stable and cleanup all views that // were not claimed during the application bootstrap process. @@ -283,11 +283,21 @@ export function withDomHydration(): EnvironmentProviders { // // Note: the cleanup task *MUST* be scheduled within the Angular zone in Zone apps // to ensure that change detection is properly run afterward. - whenStableWithTimeout(appRef, injector).then(() => { + whenStableWithTimeout(appRef).then(() => { + // Note: we have to check whether the application is destroyed before + // performing other operations with the `injector`. + // The application may be destroyed **before** it becomes stable, so when + // the `whenStableWithTimeout` resolves, the injector might already be in + // a destroyed state. Thus, calling `injector.get` would throw an error + // indicating that the injector has already been destroyed. + if (appRef.destroyed) { + return; + } + cleanupDehydratedViews(appRef); if (typeof ngDevMode !== 'undefined' && ngDevMode) { - countBlocksSkippedByHydration(injector); - printHydrationStats(injector); + countBlocksSkippedByHydration(appRef.injector); + printHydrationStats(appRef.injector); } }); }; diff --git a/packages/platform-server/test/full_app_hydration_spec.ts b/packages/platform-server/test/full_app_hydration_spec.ts index b8d518a321e0..773c946796ec 100644 --- a/packages/platform-server/test/full_app_hydration_spec.ts +++ b/packages/platform-server/test/full_app_hydration_spec.ts @@ -11,6 +11,7 @@ import '@angular/localize/init'; import { CommonModule, DOCUMENT, + isPlatformBrowser, isPlatformServer, NgComponentOutlet, NgFor, @@ -35,6 +36,7 @@ import { inject, Input, NgZone, + PendingTasks, Pipe, PipeTransform, PLATFORM_ID, @@ -7023,6 +7025,63 @@ describe('platform-server full application hydration integration', () => { expect(clientRootNode.textContent).toContain('Hi!'); }, ); + + it('should not throw an error when app is destroyed before becoming stable', async () => { + // Spy manually, because we may not be able to retrieve the `DebugConsole` + // after we destroy the application, but we still want to ensure that + // no error is thrown in the console. + const errorSpy = spyOn(console, 'error').and.callThrough(); + const logs: string[] = []; + + @Component({ + standalone: true, + selector: 'app', + template: `Hi!`, + }) + class SimpleComponent { + constructor() { + const isBrowser = isPlatformBrowser(inject(PLATFORM_ID)); + + if (isBrowser) { + const pendingTasks = inject(PendingTasks); + // Given that, in a real-world scenario, some APIs add a pending + // task and don't remove it until the app is destroyed. + // This could be an HTTP request that contributes to app stability + // and does not respond until the app is destroyed. + pendingTasks.add(); + } + } + } + + const html = await ssr(SimpleComponent); + + resetTViewsFor(SimpleComponent); + + const appRef = await prepareEnvironmentAndHydrate(doc, html, SimpleComponent); + + appRef.isStable.subscribe((isStable) => { + logs.push(`isStable=${isStable}`); + }); + + // Destroy the application before it becomes stable, because we added + // a task and didn't remove it explicitly. + appRef.destroy(); + + expect(logs).toEqual([ + 'isStable=false', + 'isStable=true', + 'isStable=false', + // In the end, the application became stable while being destroyed. + 'isStable=true', + ]); + + // Wait for a microtask so that `whenStableWithTimeout` resolves. + await Promise.resolve(); + + // Ensure no error has been logged in the console, + // such as "injector has already been destroyed." + expect(errorSpy).not.toHaveBeenCalled(); + }); }); describe('@if', () => { From 6b09716754b979c98489a2710eda977e51fe92d0 Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Mon, 27 Jan 2025 10:56:58 +0000 Subject: [PATCH 0210/1220] fix(platform-browser): prepend `baseHref` to `sourceMappingURL` in CSS content (#59730) Implemented functionality to prepend the baseHref to `sourceMappingURL` in CSS content. Added handling to ensure external sourcemaps are loaded relative to the baseHref. Corrected sourcemap URL behavior when accessing pages with multi-segment URLs (e.g., `/foo/bar`). Ensured that when the baseHref is set to `/`, maps are requested from the correct path (e.g., `http://localhost/comp.css.map` instead of `http://localhost/foo/bar/comp.css.map`). Closes #59729 PR Close #59730 --- .../platform-browser/src/dom/dom_renderer.ts | 74 +++++++++++++-- .../test/dom/dom_renderer_spec.ts | 93 +++++++++++++++++++ 2 files changed, 161 insertions(+), 6 deletions(-) diff --git a/packages/platform-browser/src/dom/dom_renderer.ts b/packages/platform-browser/src/dom/dom_renderer.ts index f0d1da86c95a..b116e87ee180 100644 --- a/packages/platform-browser/src/dom/dom_renderer.ts +++ b/packages/platform-browser/src/dom/dom_renderer.ts @@ -43,6 +43,8 @@ export const NAMESPACE_URIS: {[ns: string]: string} = { }; const COMPONENT_REGEX = /%COMP%/g; +const SOURCEMAP_URL_REGEXP = /\/\*#\s*sourceMappingURL=(.+?)\s*\*\//; +const PROTOCOL_REGEXP = /^https?:/; export const COMPONENT_VARIABLE = '%COMP%'; export const HOST_ATTR = `_nghost-${COMPONENT_VARIABLE}`; @@ -80,6 +82,52 @@ export function shimStylesContent(compId: string, styles: string[]): string[] { return styles.map((s) => s.replace(COMPONENT_REGEX, compId)); } +/** + * Prepends a baseHref to the `sourceMappingURL` within the provided CSS content. + * If the `sourceMappingURL` contains an inline (encoded) map, the function skips processing. + * + * @note For inline stylesheets, the `sourceMappingURL` is relative to the page's origin + * and not the provided baseHref. This function is needed as when accessing the page with a URL + * containing two or more segments. + * For example, if the baseHref is set to `/`, and you visit a URL like `http://localhost/foo/bar`, + * the map would be requested from `http://localhost/foo/bar/comp.css.map` instead of what you'd expect, + * which is `http://localhost/comp.css.map`. This behavior is corrected by modifying the `sourceMappingURL` + * to ensure external source maps are loaded relative to the baseHref. + * + + * @param baseHref - The base URL to prepend to the `sourceMappingURL`. + * @param styles - An array of CSS content strings, each potentially containing a `sourceMappingURL`. + * @returns The updated array of CSS content strings with modified `sourceMappingURL` values, + * or the original content if no modification is needed. + */ +export function addBaseHrefToCssSourceMap(baseHref: string, styles: string[]): string[] { + if (!baseHref) { + return styles; + } + + const absoluteBaseHrefUrl = new URL(baseHref, 'http://localhost'); + + return styles.map((cssContent) => { + if (!cssContent.includes('sourceMappingURL=')) { + return cssContent; + } + + return cssContent.replace(SOURCEMAP_URL_REGEXP, (_, sourceMapUrl) => { + if ( + sourceMapUrl[0] === '/' || + sourceMapUrl.startsWith('data:') || + PROTOCOL_REGEXP.test(sourceMapUrl) + ) { + return `/*# sourceMappingURL=${sourceMapUrl} */`; + } + + const {pathname: resolvedSourceMapUrl} = new URL(sourceMapUrl, absoluteBaseHrefUrl); + + return `/*# sourceMappingURL=${resolvedSourceMapUrl} */`; + }); + }); +} + @Injectable() export class DomRendererFactory2 implements RendererFactory2, OnDestroy { private readonly rendererByCompId = new Map< @@ -145,6 +193,7 @@ export class DomRendererFactory2 implements RendererFactory2, OnDestroy { const sharedStylesHost = this.sharedStylesHost; const removeStylesOnCompDestroy = this.removeStylesOnCompDestroy; const platformIsServer = this.platformIsServer; + const tracingService = this.tracingService; switch (type.encapsulation) { case ViewEncapsulation.Emulated: @@ -157,7 +206,7 @@ export class DomRendererFactory2 implements RendererFactory2, OnDestroy { doc, ngZone, platformIsServer, - this.tracingService, + tracingService, ); break; case ViewEncapsulation.ShadowDom: @@ -170,7 +219,7 @@ export class DomRendererFactory2 implements RendererFactory2, OnDestroy { ngZone, this.nonce, platformIsServer, - this.tracingService, + tracingService, ); default: renderer = new NoneEncapsulationDomRenderer( @@ -181,7 +230,7 @@ export class DomRendererFactory2 implements RendererFactory2, OnDestroy { doc, ngZone, platformIsServer, - this.tracingService, + tracingService, ); break; } @@ -449,9 +498,15 @@ class ShadowDomRenderer extends DefaultDomRenderer2 { ) { super(eventManager, doc, ngZone, platformIsServer, tracingService); this.shadowRoot = (hostEl as any).attachShadow({mode: 'open'}); - this.sharedStylesHost.addHost(this.shadowRoot); - const styles = shimStylesContent(component.id, component.styles); + let styles = component.styles; + if (ngDevMode) { + // We only do this in development, as for production users should not add CSS sourcemaps to components. + const baseHref = getDOM().getBaseHref(doc) ?? ''; + styles = addBaseHrefToCssSourceMap(baseHref, styles); + } + + styles = shimStylesContent(component.id, styles); for (const style of styles) { const styleEl = document.createElement('style'); @@ -520,7 +575,14 @@ class NoneEncapsulationDomRenderer extends DefaultDomRenderer2 { compId?: string, ) { super(eventManager, doc, ngZone, platformIsServer, tracingService); - this.styles = compId ? shimStylesContent(compId, component.styles) : component.styles; + let styles = component.styles; + if (ngDevMode) { + // We only do this in development, as for production users should not add CSS sourcemaps to components. + const baseHref = getDOM().getBaseHref(doc) ?? ''; + styles = addBaseHrefToCssSourceMap(baseHref, styles); + } + + this.styles = compId ? shimStylesContent(compId, styles) : styles; this.styleUrls = component.getExternalStyles?.(compId); } diff --git a/packages/platform-browser/test/dom/dom_renderer_spec.ts b/packages/platform-browser/test/dom/dom_renderer_spec.ts index 442419859476..b76a432c149f 100644 --- a/packages/platform-browser/test/dom/dom_renderer_spec.ts +++ b/packages/platform-browser/test/dom/dom_renderer_spec.ts @@ -9,6 +9,7 @@ import {Component, Renderer2, ViewEncapsulation} from '@angular/core'; import {ComponentFixture, TestBed} from '@angular/core/testing'; import {By} from '@angular/platform-browser/src/dom/debug/by'; import { + addBaseHrefToCssSourceMap, NAMESPACE_URIS, REMOVE_STYLES_ON_COMPONENT_DESTROY, } from '@angular/platform-browser/src/dom/dom_renderer'; @@ -268,6 +269,89 @@ describe('DefaultDomRendererV2', () => { } }); }); + + it('should update an external sourceMappingURL by prepending the baseHref as a prefix', () => { + document.head.innerHTML = ``; + TestBed.resetTestingModule(); + TestBed.configureTestingModule({ + declarations: [CmpEncapsulationNoneWithSourceMap], + }); + + const fixture = TestBed.createComponent(CmpEncapsulationNoneWithSourceMap); + fixture.detectChanges(); + + expect(document.head.querySelector('style')?.textContent).toContain( + '/*# sourceMappingURL=/base/cmp-none.css.map */', + ); + + document.head.innerHTML = ''; + }); +}); + +describe('addBaseHrefToCssSourceMap', () => { + it('should return the original styles if baseHref is empty', () => { + const styles = ['body { color: red; }']; + const result = addBaseHrefToCssSourceMap('', styles); + expect(result).toEqual(styles); + }); + + it('should skip styles that do not contain a sourceMappingURL', () => { + const styles = ['body { color: red; }', 'h1 { font-size: 2rem; }']; + const result = addBaseHrefToCssSourceMap('/base/', styles); + expect(result).toEqual(styles); + }); + + it('should not modify inline (encoded) sourceMappingURL maps', () => { + const styles = ['/*# sourceMappingURL=data:application/json;base64,xyz */']; + const result = addBaseHrefToCssSourceMap('/base/', styles); + expect(result).toEqual(styles); + }); + + it('should prepend baseHref to external sourceMappingURL', () => { + const styles = ['/*# sourceMappingURL=style.css */']; + const result = addBaseHrefToCssSourceMap('/base/', styles); + expect(result).toEqual(['/*# sourceMappingURL=/base/style.css */']); + }); + + it('should handle baseHref with a trailing slash correctly', () => { + const styles = ['/*# sourceMappingURL=style.css */']; + const result = addBaseHrefToCssSourceMap('/base/', styles); + expect(result).toEqual(['/*# sourceMappingURL=/base/style.css */']); + }); + + it('should handle baseHref without a trailing slash correctly', () => { + const styles = ['/*# sourceMappingURL=style.css */']; + const result = addBaseHrefToCssSourceMap('/base', styles); + expect(result).toEqual(['/*# sourceMappingURL=/style.css */']); + }); + + it('should not duplicate slashes in the final URL', () => { + const styles = ['/*# sourceMappingURL=./style.css */']; + const result = addBaseHrefToCssSourceMap('/base/', styles); + expect(result).toEqual(['/*# sourceMappingURL=/base/style.css */']); + }); + + it('should not add base href to sourceMappingURL that is absolute', () => { + const styles = ['/*# sourceMappingURL=http://example.com/style.css */']; + const result = addBaseHrefToCssSourceMap('/base/', styles); + expect(result).toEqual(['/*# sourceMappingURL=http://example.com/style.css */']); + }); + + it('should process multiple styles and handle each case correctly', () => { + const styles = [ + '/*# sourceMappingURL=style1.css */', + '/*# sourceMappingURL=data:application/json;base64,xyz */', + 'h1 { font-size: 2rem; }', + '/*# sourceMappingURL=style2.css */', + ]; + const result = addBaseHrefToCssSourceMap('/base/', styles); + expect(result).toEqual([ + '/*# sourceMappingURL=/base/style1.css */', + '/*# sourceMappingURL=data:application/json;base64,xyz */', + 'h1 { font-size: 2rem; }', + '/*# sourceMappingURL=/base/style2.css */', + ]); + }); }); async function styleCount( @@ -309,6 +393,15 @@ class CmpEncapsulationEmulated {} }) class CmpEncapsulationNone {} +@Component({ + selector: 'cmp-none', + template: `
    `, + styles: [`.none { color: lime; }\n/*# sourceMappingURL=cmp-none.css.map */`], + encapsulation: ViewEncapsulation.None, + standalone: false, +}) +class CmpEncapsulationNoneWithSourceMap {} + @Component({ selector: 'cmp-shadow', template: `
    `, From e1504219e915c6679d46345432b108c204d598ba Mon Sep 17 00:00:00 2001 From: muhammadali1658 Date: Wed, 29 Jan 2025 14:21:15 +0000 Subject: [PATCH 0211/1220] docs: fix spelling of 'static-site' (#59780) PR Close #59780 --- adev/src/content/guide/performance/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adev/src/content/guide/performance/overview.md b/adev/src/content/guide/performance/overview.md index 1c9488da3021..1f9fec2d327b 100644 --- a/adev/src/content/guide/performance/overview.md +++ b/adev/src/content/guide/performance/overview.md @@ -7,5 +7,5 @@ One of the top priorities of any developer is ensuring that their application is | Guides Types | Description | | :---------------------------------------- | :--------------------------------------------------------------------------------------------------------- | | [Server-side rendering](/guide/ssr) | Learn how to leverage rendering pages on the server to improve load times. | -| [Build-time prerendering](/guide/prerendering) | Also known as static-side generation (SSG), is an alternate rendering method to improve load times. | +| [Build-time prerendering](/guide/prerendering) | Also known as static-site generation (SSG), is an alternate rendering method to improve load times. | | [Hydration](/guide/hydration) | A process to improve application performance by restoring its state after server-side rendering and reusing existing DOM structure as much as possible. | From e635f42284740dd922e59b03faebcd8cf4125655 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Fri, 24 Jan 2025 20:23:39 +0000 Subject: [PATCH 0212/1220] build: lock file maintenance (#59763) See associated pull request for more information. Closes #59621 as a pr takeover PR Close #59763 --- .github/actions/deploy-docs-site/main.js | 10 +- .../deferrable-views/common/package-lock.json | 1278 ++++++----------- .../first-app/common/package-lock.json | 315 ++-- .../tutorials/homepage/package-lock.json | 195 ++- .../learn-angular/common/package-lock.json | 207 ++- .../playground/common/package-lock.json | 217 ++- package.json | 1 + packages/zone.js/yarn.lock | 129 +- yarn.lock | 1106 ++++++++------ 9 files changed, 1567 insertions(+), 1891 deletions(-) diff --git a/.github/actions/deploy-docs-site/main.js b/.github/actions/deploy-docs-site/main.js index 0f2d2c054deb..a8f92a6bb11b 100644 --- a/.github/actions/deploy-docs-site/main.js +++ b/.github/actions/deploy-docs-site/main.js @@ -26604,7 +26604,7 @@ async function getResponseData(response) { return response.text().catch(() => ""); } const mimetype = (0, import_fast_content_type_parse.safeParse)(contentType); - if (mimetype.type === "application/json") { + if (isJSONResponse(mimetype)) { let text = ""; try { text = await response.text(); @@ -26618,6 +26618,9 @@ async function getResponseData(response) { return response.arrayBuffer().catch(() => new ArrayBuffer(0)); } } +function isJSONResponse(mimetype) { + return mimetype.type === "application/json" || mimetype.type === "application/scim+json"; +} function toErrorMessage(data) { if (typeof data === "string") { return data; @@ -27142,7 +27145,7 @@ async function getResponseData2(response) { return response.text().catch(() => ""); } const mimetype = (0, import_fast_content_type_parse2.safeParse)(contentType); - if (mimetype.type === "application/json") { + if (isJSONResponse2(mimetype)) { let text = ""; try { text = await response.text(); @@ -27156,6 +27159,9 @@ async function getResponseData2(response) { return response.arrayBuffer().catch(() => new ArrayBuffer(0)); } } +function isJSONResponse2(mimetype) { + return mimetype.type === "application/json" || mimetype.type === "application/scim+json"; +} function toErrorMessage2(data) { if (typeof data === "string") { return data; 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 734e85fab027..2db9269eb091 100644 --- a/adev/src/content/tutorials/deferrable-views/common/package-lock.json +++ b/adev/src/content/tutorials/deferrable-views/common/package-lock.json @@ -22,7 +22,7 @@ "@angular/build": "^19.0.0", "@angular/cli": "^19.0.0", "@angular/compiler-cli": "^19.0.0", - "typescript": "~5.6.3" + "typescript": "~5.7.0" } }, "node_modules/@ampproject/remapping": { @@ -40,13 +40,13 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1900.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1900.7.tgz", - "integrity": "sha512-3dRV0IB+MbNYbAGbYEFMcABkMphqcTvn5MG79dQkwcf2a9QZxCq2slwf/rIleWoDUcFm9r1NnVPYrTYNYJaqQg==", + "version": "0.1901.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.4.tgz", + "integrity": "sha512-EoRTN8p7z0YnqOEIJKKu/NwSsCJxFkyGuZOobz7btnUWwlDqG8CNAhJgtlsOXPihwEkHEkzRIm1feDkWEjCYsA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.7", + "@angular-devkit/core": "19.1.4", "rxjs": "7.8.1" }, "engines": { @@ -56,9 +56,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.7.tgz", - "integrity": "sha512-VyuORSitT6LIaGUEF0KEnv2TwNaeWl6L3/4L4stok0BJ23B4joVca2DYVcrLC1hSzz8V4dwVgSlbNIgjgGdVpg==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.4.tgz", + "integrity": "sha512-IDvSSiQgaixH2RtZtIpq1+XaHeuzMiTWfDyNF9DuYcU+S8CdG1SWrc8d59tmOrM/q+IRGyFgbBhTU1un52hNHw==", "dev": true, "license": "MIT", "dependencies": { @@ -84,15 +84,15 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.7.tgz", - "integrity": "sha512-BHXQv6kMc9xo4TH9lhwMv8nrZXHkLioQvLun2qYjwvOsyzt3qd+sUM9wpHwbG6t+01+FIQ05iNN9ox+Cvpndgg==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.4.tgz", + "integrity": "sha512-EKXBkx6EDcvyO+U68w/eXicRaF92zSSzYNvR3tMZszEKYE6xBr3kZxY99PP54HXQHR4zYwLvFJVp+T6bnvte2w==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.7", + "@angular-devkit/core": "19.1.4", "jsonc-parser": "3.3.1", - "magic-string": "0.30.12", + "magic-string": "0.30.17", "ora": "5.4.1", "rxjs": "7.8.1" }, @@ -103,36 +103,36 @@ } }, "node_modules/@angular/build": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.0.7.tgz", - "integrity": "sha512-AFvhRa6sfXG8NmS8AN7TvE8q2kVcMw+zXMZzo981cqwnOwJy4VHU0htqm5OZQnohVJM0pP8SBAuROWO4yRrxCA==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.4.tgz", + "integrity": "sha512-yfvLeUT2a8JTuVBY259vsSv0uLyhikHHgQcWa3VSr0TvCKrwCsBIFDq7vqmhLqIVWi/Z4D7n3J5JQAbDrl38Sg==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1900.7", + "@angular-devkit/architect": "0.1901.4", "@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.0.2", - "@vitejs/plugin-basic-ssl": "1.1.0", - "beasties": "0.1.0", + "@inquirer/confirm": "5.1.1", + "@vitejs/plugin-basic-ssl": "1.2.0", + "beasties": "0.2.0", "browserslist": "^4.23.0", - "esbuild": "0.24.0", - "fast-glob": "3.3.2", - "https-proxy-agent": "7.0.5", + "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.12", + "magic-string": "0.30.17", "mrmime": "2.0.0", "parse5-html-rewriting-stream": "7.0.0", "picomatch": "4.0.2", - "piscina": "4.7.0", - "rollup": "4.26.0", - "sass": "1.80.7", + "piscina": "4.8.0", + "rollup": "4.30.1", + "sass": "1.83.1", "semver": "7.6.3", - "vite": "5.4.11", + "vite": "6.0.7", "watchpack": "2.4.2" }, "engines": { @@ -141,7 +141,7 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "lmdb": "3.1.5" + "lmdb": "3.2.2" }, "peerDependencies": { "@angular/compiler": "^19.0.0", @@ -149,11 +149,12 @@ "@angular/localize": "^19.0.0", "@angular/platform-server": "^19.0.0", "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.0.7", + "@angular/ssr": "^19.1.4", "less": "^4.2.0", + "ng-packagr": "^19.0.0", "postcss": "^8.4.0", "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.5 <5.7" + "typescript": ">=5.5 <5.8" }, "peerDependenciesMeta": { "@angular/localize": { @@ -171,6 +172,9 @@ "less": { "optional": true }, + "ng-packagr": { + "optional": true + }, "postcss": { "optional": true }, @@ -180,26 +184,26 @@ } }, "node_modules/@angular/cli": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.0.7.tgz", - "integrity": "sha512-y6C4B4XdiZwe2+OADLWXyKqUVvW/XDzTuJ2mZ5PhTnSiiXDN4zRWId1F5wA8ve8vlbUKApPHXRQuaqiQJmA24g==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.4.tgz", + "integrity": "sha512-C1Z2OTLjUJIkLsay6RJ1rzY0Tdb1Mj/cBh9dZryDstuits8G0Tphe36hnLownnoHspFQfjSRtVzF4NwKiDlQRw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1900.7", - "@angular-devkit/core": "19.0.7", - "@angular-devkit/schematics": "19.0.7", - "@inquirer/prompts": "7.1.0", + "@angular-devkit/architect": "0.1901.4", + "@angular-devkit/core": "19.1.4", + "@angular-devkit/schematics": "19.1.4", + "@inquirer/prompts": "7.2.1", "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.0.7", + "@schematics/angular": "19.1.4", "@yarnpkg/lockfile": "1.1.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", "listr2": "8.2.5", - "npm-package-arg": "12.0.0", + "npm-package-arg": "12.0.1", "npm-pick-manifest": "10.0.0", "pacote": "20.0.0", - "resolve": "1.22.8", + "resolve": "1.22.10", "semver": "7.6.3", "symbol-observable": "4.0.0", "yargs": "17.7.2" @@ -214,9 +218,9 @@ } }, "node_modules/@angular/common": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.0.6.tgz", - "integrity": "sha512-r9IDD0+UGkrQkjyX+pApeDmIJ9INpr1uYlgmmlWNBJCVNr9SKKIVZV60sssgadew6bGynKN9dW4mGsmEzzb5BA==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.3.tgz", + "integrity": "sha512-r1P0W6FKrON83szIJboF8z6UNCVL4HIxyD+nhmHMMT/iJpu4kDHVugaN/+w2jYLb4oelAJK5xzkzA+1IaHpzLg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -225,14 +229,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.6", + "@angular/core": "19.1.3", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.0.6.tgz", - "integrity": "sha512-g8A6QOsiCJnRi5Hz0sASIpRQoAGxEgnjz0JanfrMNRedY4MpdIS1V0AeCSKTsMRlV7tQl3ng2Gse/tsb51HI3Q==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.3.tgz", + "integrity": "sha512-omX5Gyt3zlJVTUteO2YxsqYWtAIpkvs8kRYSUsLTi79V1gbGo+J1TawFuyBTrWxj4UtTGvwmDgZxiCIwMtP5KQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -241,7 +245,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.0.6" + "@angular/core": "19.1.3" }, "peerDependenciesMeta": { "@angular/core": { @@ -250,9 +254,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.0.6.tgz", - "integrity": "sha512-fHtwI5rCe3LmKDoaqlqLAPdNmLrbeCiMYVe+X1BHgApaqNCyAwcuJxuf8Q5R5su7nHiLmlmB74o1ZS/V+0cQ+g==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.3.tgz", + "integrity": "sha512-nDBvZenQECcr9CClmTp3iJNilRQ6oDKFgBkhlWffEFBx0Z6kBA36MXKKLuCkf31D+NGmt5VJlAkl8Ax8BJ9qJw==", "dev": true, "license": "MIT", "dependencies": { @@ -274,14 +278,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.0.6", - "typescript": ">=5.5 <5.7" + "@angular/compiler": "19.1.3", + "typescript": ">=5.5 <5.8" } }, "node_modules/@angular/core": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.0.6.tgz", - "integrity": "sha512-9N7FmdRHtS7zfXC/wnyap/reX7fgiOrWpVivayHjWP4RkLYXJAzJIpLyew0jrx4vf8r3lZnC0Zmq0PW007Ngjw==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.3.tgz", + "integrity": "sha512-Hh1eHvi+y+gsTRODiEEEWnRj5zqv9WNoou1KmQ1mv1NTOf0Pv61Hg9P2rBWDr0mPIXFSzqUKjyzW30BgdQ+AEA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -295,9 +299,9 @@ } }, "node_modules/@angular/forms": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.0.6.tgz", - "integrity": "sha512-HogauPvgDQHw2xxqKBaFgKTRRcc1xWeI/PByDCf3U6YsaqpF53Mz2CJh8X2bg2bY1RGKb67MZw7DBGFRvXx4bg==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.3.tgz", + "integrity": "sha512-M6eEJBysJm9zSUhm8ggljZCsgHLccZl70P34tyddb8erh9it2uoOXW0aVaZgDt1UAiF5a1EzjdVdN4TZTT/OGA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -306,16 +310,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.6", - "@angular/core": "19.0.6", - "@angular/platform-browser": "19.0.6", + "@angular/common": "19.1.3", + "@angular/core": "19.1.3", + "@angular/platform-browser": "19.1.3", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.0.6.tgz", - "integrity": "sha512-MWiToGy7Pa0rR61sgnEuu7dfZXpAw0g7nkSnw4xdjUf974OOOfI1LS9O9YevJibtdW8sPa1HaoXXwcb7N03B5A==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.3.tgz", + "integrity": "sha512-bLgnM2hRyzUdoWRoUhe+IMenlr74EvrgwyG7anJ27bjg5PcvhQPXrGqU0hri5yPDb9SHVJZminr7OjNCN8QJkQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -324,9 +328,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "19.0.6", - "@angular/common": "19.0.6", - "@angular/core": "19.0.6" + "@angular/animations": "19.1.3", + "@angular/common": "19.1.3", + "@angular/core": "19.1.3" }, "peerDependenciesMeta": { "@angular/animations": { @@ -335,9 +339,9 @@ } }, "node_modules/@angular/router": { - "version": "19.0.6", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.0.6.tgz", - "integrity": "sha512-G1oz+TclPk48h6b6B4s5J3DfrDVJrrxKOA+KWeVQP4e1B8ld7/dCMf5nn3yqS4BGs4yLecxMxyvbOvOiZ//lxw==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.1.3.tgz", + "integrity": "sha512-DJ9BgvtxJV6xohaPQXPdBsFCZoQIEq2OPDyKcoW4L0ST4kIIFpHyI6wJ+AlPnLkhSwmOOoHciH0oxZ2xPVxmiQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -346,9 +350,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.0.6", - "@angular/core": "19.0.6", - "@angular/platform-browser": "19.0.6", + "@angular/common": "19.1.3", + "@angular/core": "19.1.3", + "@angular/platform-browser": "19.1.3", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -568,27 +572,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz", + "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "@babel/types": "^7.26.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", - "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", + "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.5" + "@babel/types": "^7.26.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -629,17 +633,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz", - "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz", + "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.5", - "@babel/parser": "^7.26.5", + "@babel/parser": "^7.26.7", "@babel/template": "^7.25.9", - "@babel/types": "^7.26.5", + "@babel/types": "^7.26.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -648,9 +652,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", - "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", + "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", "dev": true, "license": "MIT", "dependencies": { @@ -662,9 +666,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", - "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "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" ], @@ -679,9 +683,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", - "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "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" ], @@ -696,9 +700,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", - "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "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" ], @@ -713,9 +717,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", - "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", "cpu": [ "x64" ], @@ -730,9 +734,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "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" ], @@ -747,9 +751,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", - "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", "cpu": [ "x64" ], @@ -764,9 +768,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", - "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "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" ], @@ -781,9 +785,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", - "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "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" ], @@ -798,9 +802,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", - "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "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" ], @@ -815,9 +819,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", - "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "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" ], @@ -832,9 +836,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", - "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "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" ], @@ -849,9 +853,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", - "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", "cpu": [ "loong64" ], @@ -866,9 +870,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", - "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "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" ], @@ -883,9 +887,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", - "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "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" ], @@ -900,9 +904,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", - "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "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" ], @@ -917,9 +921,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", - "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "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" ], @@ -934,9 +938,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", - "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", "cpu": [ "x64" ], @@ -950,10 +954,27 @@ "node": ">=18" } }, + "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, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", - "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "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" ], @@ -968,9 +989,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "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" ], @@ -985,9 +1006,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", - "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "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" ], @@ -1002,9 +1023,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", - "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", "cpu": [ "x64" ], @@ -1019,9 +1040,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", - "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", "cpu": [ "arm64" ], @@ -1036,9 +1057,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", - "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "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" ], @@ -1053,9 +1074,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", - "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "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" ], @@ -1090,14 +1111,14 @@ } }, "node_modules/@inquirer/confirm": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.0.2.tgz", - "integrity": "sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==", + "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": { - "@inquirer/core": "^10.1.0", - "@inquirer/type": "^3.0.1" + "@inquirer/core": "^10.1.2", + "@inquirer/type": "^3.0.2" }, "engines": { "node": ">=18" @@ -1226,22 +1247,22 @@ } }, "node_modules/@inquirer/prompts": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.1.0.tgz", - "integrity": "sha512-5U/XiVRH2pp1X6gpNAjWOglMf38/Ys522ncEHIKT1voRUvSj/DQnR22OVxHnwu5S+rCFaUiPQ57JOtMFQayqYA==", + "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": { - "@inquirer/checkbox": "^4.0.2", - "@inquirer/confirm": "^5.0.2", - "@inquirer/editor": "^4.1.0", - "@inquirer/expand": "^4.0.2", - "@inquirer/input": "^4.0.2", - "@inquirer/number": "^3.0.2", - "@inquirer/password": "^4.0.2", - "@inquirer/rawlist": "^4.0.2", - "@inquirer/search": "^3.0.2", - "@inquirer/select": "^4.0.2" + "@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": ">=18" @@ -1539,9 +1560,9 @@ } }, "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.1.5.tgz", - "integrity": "sha512-ue5PSOzHMCIYrfvPP/MRS6hsKKLzqqhcdAvJCO8uFlDdj598EhgnacuOTuqA6uBK5rgiZXfDWyb7DVZSiBKxBA==", + "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" ], @@ -1553,9 +1574,9 @@ ] }, "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.1.5.tgz", - "integrity": "sha512-CGhsb0R5vE6mMNCoSfxHFD8QTvBHM51gs4DBeigTYHWnYv2V5YpJkC4rMo5qAAFifuUcc0+a8a3SIU0c9NrfNw==", + "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" ], @@ -1567,9 +1588,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.1.5.tgz", - "integrity": "sha512-3WeW328DN+xB5PZdhSWmqE+t3+44xWXEbqQ+caWJEZfOFdLp9yklBZEbVqVdqzznkoaXJYxTCp996KD6HmANeg==", + "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" ], @@ -1581,9 +1602,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.1.5.tgz", - "integrity": "sha512-LAjaoOcBHGj6fiYB8ureiqPoph4eygbXu4vcOF+hsxiY74n8ilA7rJMmGUT0K0JOB5lmRQHSmor3mytRjS4qeQ==", + "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" ], @@ -1595,9 +1616,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.1.5.tgz", - "integrity": "sha512-k/IklElP70qdCXOQixclSl2GPLFiopynGoKX1FqDd1/H0E3Fo1oPwjY2rEVu+0nS3AOw1sryStdXk8CW3cVIsw==", + "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" ], @@ -1609,9 +1630,9 @@ ] }, "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.1.5.tgz", - "integrity": "sha512-KYar6W8nraZfSJspcK7Kp7hdj238X/FNauYbZyrqPBrtsXI1hvI4/KcRcRGP50aQoV7fkKDyJERlrQGMGTZUsA==", + "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" ], @@ -2142,9 +2163,9 @@ } }, "node_modules/@npmcli/package-json": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.1.0.tgz", - "integrity": "sha512-t6G+6ZInT4X+tqj2i+wlLIeCKnKOTuz9/VFYDtj+TGTur5q7sp/OYrQA19LdBbWfXDOi0Y4jtedV6xtB8zQ9ug==", + "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": { @@ -2152,9 +2173,9 @@ "glob": "^10.2.2", "hosted-git-info": "^8.0.0", "json-parse-even-better-errors": "^4.0.0", - "normalize-package-data": "^7.0.0", "proc-log": "^5.0.0", - "semver": "^7.5.3" + "semver": "^7.5.3", + "validate-npm-package-license": "^3.0.4" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -2545,9 +2566,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.26.0.tgz", - "integrity": "sha512-gJNwtPDGEaOEgejbaseY6xMFu+CPltsc8/T+diUTTbOQLqD+bnrJq9ulH6WD69TqwqWmrfRAtUv30cCFZlbGTQ==", + "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" ], @@ -2559,9 +2580,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.26.0.tgz", - "integrity": "sha512-YJa5Gy8mEZgz5JquFruhJODMq3lTHWLm1fOy+HIANquLzfIOzE9RA5ie3JjCdVb9r46qfAQY/l947V0zfGJ0OQ==", + "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" ], @@ -2573,9 +2594,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.26.0.tgz", - "integrity": "sha512-ErTASs8YKbqTBoPLp/kA1B1Um5YSom8QAc4rKhg7b9tyyVqDBlQxy7Bf2wW7yIlPGPg2UODDQcbkTlruPzDosw==", + "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" ], @@ -2587,9 +2608,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.26.0.tgz", - "integrity": "sha512-wbgkYDHcdWW+NqP2mnf2NOuEbOLzDblalrOWcPyY6+BRbVhliavon15UploG7PpBRQ2bZJnbmh8o3yLoBvDIHA==", + "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" ], @@ -2601,9 +2622,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.26.0.tgz", - "integrity": "sha512-Y9vpjfp9CDkAG4q/uwuhZk96LP11fBz/bYdyg9oaHYhtGZp7NrbkQrj/66DYMMP2Yo/QPAsVHkV891KyO52fhg==", + "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" ], @@ -2615,9 +2636,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.26.0.tgz", - "integrity": "sha512-A/jvfCZ55EYPsqeaAt/yDAG4q5tt1ZboWMHEvKAH9Zl92DWvMIbnZe/f/eOXze65aJaaKbL+YeM0Hz4kLQvdwg==", + "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" ], @@ -2629,9 +2650,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.26.0.tgz", - "integrity": "sha512-paHF1bMXKDuizaMODm2bBTjRiHxESWiIyIdMugKeLnjuS1TCS54MF5+Y5Dx8Ui/1RBPVRE09i5OUlaLnv8OGnA==", + "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" ], @@ -2643,9 +2664,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.26.0.tgz", - "integrity": "sha512-cwxiHZU1GAs+TMxvgPfUDtVZjdBdTsQwVnNlzRXC5QzIJ6nhfB4I1ahKoe9yPmoaA/Vhf7m9dB1chGPpDRdGXg==", + "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" ], @@ -2657,9 +2678,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.26.0.tgz", - "integrity": "sha512-4daeEUQutGRCW/9zEo8JtdAgtJ1q2g5oHaoQaZbMSKaIWKDQwQ3Yx0/3jJNmpzrsScIPtx/V+1AfibLisb3AMQ==", + "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" ], @@ -2671,9 +2692,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.26.0.tgz", - "integrity": "sha512-eGkX7zzkNxvvS05ROzJ/cO/AKqNvR/7t1jA3VZDi2vRniLKwAWxUr85fH3NsvtxU5vnUUKFHKh8flIBdlo2b3Q==", + "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" ], @@ -2684,10 +2705,24 @@ "linux" ] }, + "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/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.26.0.tgz", - "integrity": "sha512-Odp/lgHbW/mAqw/pU21goo5ruWsytP7/HCC/liOt0zcGG0llYWKrd10k9Fj0pdj3prQ63N5yQLCLiE7HTX+MYw==", + "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" ], @@ -2699,9 +2734,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.26.0.tgz", - "integrity": "sha512-MBR2ZhCTzUgVD0OJdTzNeF4+zsVogIR1U/FsyuFerwcqjZGvg2nYe24SAHp8O5sN8ZkRVbHwlYeHqcSQ8tcYew==", + "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" ], @@ -2713,9 +2748,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.26.0.tgz", - "integrity": "sha512-YYcg8MkbN17fMbRMZuxwmxWqsmQufh3ZJFxFGoHjrE7bv0X+T6l3glcdzd7IKLiwhT+PZOJCblpnNlz1/C3kGQ==", + "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" ], @@ -2727,9 +2762,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.26.0.tgz", - "integrity": "sha512-ZuwpfjCwjPkAOxpjAEjabg6LRSfL7cAJb6gSQGZYjGhadlzKKywDkCUnJ+KEfrNY1jH5EEoSIKLCb572jSiglA==", + "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" ], @@ -2741,9 +2776,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.26.0.tgz", - "integrity": "sha512-+HJD2lFS86qkeF8kNu0kALtifMpPCZU80HvwztIKnYwym3KnA1os6nsX4BGSTLtS2QVAGG1P3guRgsYyMA0Yhg==", + "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" ], @@ -2755,9 +2790,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.26.0.tgz", - "integrity": "sha512-WUQzVFWPSw2uJzX4j6YEbMAiLbs0BUysgysh8s817doAYhR5ybqTI1wtKARQKo6cGop3pHnrUJPFCsXdoFaimQ==", + "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" ], @@ -2769,9 +2804,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.26.0.tgz", - "integrity": "sha512-D4CxkazFKBfN1akAIY6ieyOqzoOoBV1OICxgUblWxff/pSjCA2khXlASUx7mK6W1oP4McqhgcCsu6QaLj3WMWg==", + "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" ], @@ -2783,9 +2818,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.26.0.tgz", - "integrity": "sha512-2x8MO1rm4PGEP0xWbubJW5RtbNLk3puzAMaLQd3B3JHVw4KcHlmXcO+Wewx9zCoo7EUFiMlu/aZbCJ7VjMzAag==", + "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" ], @@ -2797,14 +2832,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.0.7.tgz", - "integrity": "sha512-1WtTqKFPuEaV99VIP+y/gf/XW3TVJh/NbJbbEF4qYpp7qQiJ4ntF4klVZmsJcQzFucZSzlg91QVMPQKev5WZGA==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.4.tgz", + "integrity": "sha512-HFf83SoXbj1K4jkYSSfCg/oXkmSGBx0zG1Lh+dE5GZFdTQmykrBY519aSdrqLVyZzKYjTGfDfSewUeO4a0GE2A==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.7", - "@angular-devkit/schematics": "19.0.7", + "@angular-devkit/core": "19.1.4", + "@angular-devkit/schematics": "19.1.4", "jsonc-parser": "3.3.1" }, "engines": { @@ -2925,9 +2960,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.6.tgz", - "integrity": "sha512-qNiuwC4ZDAUNcY47xgaSuS92cjf8JbSUoaKS77bmLG1rU7MlATVSiw/IlrjtIyyskXBZ8KkNfjK/P5na7rgXbQ==", + "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, @@ -2936,16 +2971,16 @@ } }, "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", - "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", + "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": ">=14.6.0" + "node": ">=14.21.3" }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, "node_modules/@yarnpkg/lockfile": { @@ -2956,13 +2991,13 @@ "license": "BSD-2-Clause" }, "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz", + "integrity": "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==", "dev": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/agent-base": { @@ -3081,9 +3116,9 @@ "license": "MIT" }, "node_modules/beasties": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.1.0.tgz", - "integrity": "sha512-+Ssscd2gVG24qRNC+E2g88D+xsQW4xwakWtKAiGEQ3Pw54/FGdyo9RrfxhGhEv6ilFVbB7r3Lgx+QnAxnSpECw==", + "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": { @@ -3091,10 +3126,13 @@ "css-what": "^6.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", - "htmlparser2": "^9.0.0", + "htmlparser2": "^9.1.0", "picocolors": "^1.1.1", - "postcss": "^8.4.47", + "postcss": "^8.4.49", "postcss-media-query-parser": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" } }, "node_modules/bl": { @@ -3283,9 +3321,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001692", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz", - "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==", + "version": "1.0.30001695", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz", + "integrity": "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==", "dev": true, "funding": [ { @@ -3695,9 +3733,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.82", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.82.tgz", - "integrity": "sha512-Zq16uk1hfQhyGx5GpwPAYDwddJuSGhtRhgOA2mCxANYaDT79nAeGnaXogMGng4KqLaJUVnOnuL0+TDop9nLOiA==", + "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==", "dev": true, "license": "ISC" }, @@ -3777,9 +3815,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -3790,30 +3828,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" + "@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/escalade": { @@ -3863,9 +3902,9 @@ "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "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": { @@ -3873,16 +3912,16 @@ "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" } }, "node_modules/fast-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.5.tgz", - "integrity": "sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", "dev": true, "funding": [ { @@ -4150,13 +4189,13 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "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": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { @@ -4549,9 +4588,9 @@ } }, "node_modules/lmdb": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.1.5.tgz", - "integrity": "sha512-46Mch5Drq+A93Ss3gtbg+Xuvf5BOgIuvhKDWoGa3HcPHI6BL2NCOkRdSx1D4VfzwrxhnsjbyIVsLRlQHu6URvw==", + "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", @@ -4567,12 +4606,12 @@ "download-lmdb-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.1.5", - "@lmdb/lmdb-darwin-x64": "3.1.5", - "@lmdb/lmdb-linux-arm": "3.1.5", - "@lmdb/lmdb-linux-arm64": "3.1.5", - "@lmdb/lmdb-linux-x64": "3.1.5", - "@lmdb/lmdb-win32-x64": "3.1.5" + "@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/log-symbols": { @@ -4732,9 +4771,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "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, "license": "MIT", "dependencies": { @@ -5208,13 +5247,13 @@ "license": "MIT" }, "node_modules/nopt": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.0.0.tgz", - "integrity": "sha512-1L/fTJ4UmV/lUxT2Uf006pfZKTvAgCF+chz+0OgBHO8u2Z67pE7AaAUUj7CJy0lXqHmymUvGFt6NE9R3HER0yw==", + "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": { - "abbrev": "^2.0.0" + "abbrev": "^3.0.0" }, "bin": { "nopt": "bin/nopt.js" @@ -5223,21 +5262,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/normalize-package-data": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-7.0.0.tgz", - "integrity": "sha512-k6U0gKRIuNCTkwHGZqblCfLfBRh+w1vI6tBo+IeJwq2M8FUiOqhX7GH+GArQGScA7azd1WfyRCvxoXDO3hQDIA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^8.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/npm-bundled": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz", @@ -5275,9 +5299,9 @@ } }, "node_modules/npm-package-arg": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.0.tgz", - "integrity": "sha512-ZTE0hbwSdTNL+Stx2zxSqdu2KZfNDcrtrLdIk7XGnQFYBWYDho/ORvXtn5XEePcL3tFpGjHCV3X3xrtDh7eZ+A==", + "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": { @@ -5615,9 +5639,9 @@ } }, "node_modules/piscina": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.7.0.tgz", - "integrity": "sha512-b8hvkpp9zS0zsfa939b/jXbe64Z2gZv0Ha7FYPNUiDIB1y2AtxcOZdfP8xN8HFjUaqQiT9gRlfjAsoL8vdJ1Iw==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.8.0.tgz", + "integrity": "sha512-EZJb+ZxDrQf3dihsUL7p42pjNyrNIFJCrRHPMgxu/svsj+P3xS3fuEWp7k2+rfsavfl1N0G29b1HGs7J0m8rZA==", "dev": true, "license": "MIT", "optionalDependencies": { @@ -5769,19 +5793,22 @@ } }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "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.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5848,9 +5875,9 @@ } }, "node_modules/rollup": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.26.0.tgz", - "integrity": "sha512-ilcl12hnWonG8f+NxU6BlgysVA0gvY2l8N0R84S1HcINbW20bvwuCngJkkInV6LXhwRpucsW5k1ovDwEdBVrNg==", + "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": { @@ -5864,24 +5891,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.26.0", - "@rollup/rollup-android-arm64": "4.26.0", - "@rollup/rollup-darwin-arm64": "4.26.0", - "@rollup/rollup-darwin-x64": "4.26.0", - "@rollup/rollup-freebsd-arm64": "4.26.0", - "@rollup/rollup-freebsd-x64": "4.26.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.26.0", - "@rollup/rollup-linux-arm-musleabihf": "4.26.0", - "@rollup/rollup-linux-arm64-gnu": "4.26.0", - "@rollup/rollup-linux-arm64-musl": "4.26.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.26.0", - "@rollup/rollup-linux-riscv64-gnu": "4.26.0", - "@rollup/rollup-linux-s390x-gnu": "4.26.0", - "@rollup/rollup-linux-x64-gnu": "4.26.0", - "@rollup/rollup-linux-x64-musl": "4.26.0", - "@rollup/rollup-win32-arm64-msvc": "4.26.0", - "@rollup/rollup-win32-ia32-msvc": "4.26.0", - "@rollup/rollup-win32-x64-msvc": "4.26.0", + "@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" } }, @@ -5947,9 +5975,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.80.7", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.7.tgz", - "integrity": "sha512-MVWvN0u5meytrSjsU7AWsbhoXi1sc58zADXFllfZzbsBT1GHjjar6JwBINYPRrkx/zqnQ6uqbQuHgE95O+C+eQ==", + "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": { @@ -6155,9 +6183,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", - "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", + "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" }, @@ -6483,9 +6511,9 @@ } }, "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "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": { @@ -6590,21 +6618,21 @@ } }, "node_modules/vite": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.7.tgz", + "integrity": "sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.24.2", + "postcss": "^8.4.49", + "rollup": "^4.23.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -6613,19 +6641,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.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.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -6646,439 +6680,15 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, "node_modules/watchpack": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.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 79afb475b3b3..5f668eec6891 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.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.3.tgz", - "integrity": "sha512-bXhcSP23MKGRuKjI0j+JEDssuFwyprVS0czIeNswj2VTuWyx9y8GjnH2kJXeDETbX0pNbUjThkMsk8cZ5b2YTg==", + "version": "0.1901.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.4.tgz", + "integrity": "sha512-EoRTN8p7z0YnqOEIJKKu/NwSsCJxFkyGuZOobz7btnUWwlDqG8CNAhJgtlsOXPihwEkHEkzRIm1feDkWEjCYsA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.3", + "@angular-devkit/core": "19.1.4", "rxjs": "7.8.1" }, "engines": { @@ -70,17 +70,17 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.1.3.tgz", - "integrity": "sha512-k9ZLXmtWFDxj/RN4RPKJ+tKDz1rUds7TZeqTvtfvOobgNzT5gSj0ZGlAlnMxcW3HJF7MuCTnAYua51tlJ5aTXw==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.1.4.tgz", + "integrity": "sha512-t8qC26Boz1aAMt2xVKthwEXRqMI4ZVwelxRNfHryLdLTujTaehFt3qbjxukMmRGCWmQObauH0UOvDh3pAA24dQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1901.3", - "@angular-devkit/build-webpack": "0.1901.3", - "@angular-devkit/core": "19.1.3", - "@angular/build": "19.1.3", + "@angular-devkit/architect": "0.1901.4", + "@angular-devkit/build-webpack": "0.1901.4", + "@angular-devkit/core": "19.1.4", + "@angular/build": "19.1.4", "@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.3", + "@ngtools/webpack": "19.1.4", "@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.3", + "@angular/ssr": "^19.1.4", "@web/test-runner": "^0.19.0", "browser-sync": "^3.0.2", "jest": "^29.5.0", @@ -196,9 +196,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@types/node": { - "version": "22.10.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", - "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", + "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", "optional": true, @@ -221,9 +221,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/vite": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.10.tgz", - "integrity": "sha512-MEszunEcMo6pFsfXN1GhCFQqnE25tWRH0MA4f0Q7uanACi4y1Us+ZGpTMnITwCTnYzB2b9cpmnelTlxgTBmaBA==", + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz", + "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==", "dev": true, "license": "MIT", "peer": true, @@ -294,13 +294,13 @@ } }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1901.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1901.3.tgz", - "integrity": "sha512-sv5rL1/xdMuPxJskG+5FVyVpDH8/NMfvHn/bKUvdrYMcTowwepP5EVQ5MZDSfwWrksuCyqrIOxd0K2zIRohNSQ==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1901.3", + "@angular-devkit/architect": "0.1901.4", "rxjs": "7.8.1" }, "engines": { @@ -314,9 +314,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.3.tgz", - "integrity": "sha512-of/TKfJ/vL+/qvr4PbDTtqbFJGFHPfu6bEJrIZsLMYA+Mej8SyTx3kDm4LLnKQBtWVYDqkrxvcpOb4+NmHNLfA==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.4.tgz", + "integrity": "sha512-IDvSSiQgaixH2RtZtIpq1+XaHeuzMiTWfDyNF9DuYcU+S8CdG1SWrc8d59tmOrM/q+IRGyFgbBhTU1un52hNHw==", "dev": true, "license": "MIT", "dependencies": { @@ -342,13 +342,13 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.3.tgz", - "integrity": "sha512-DfN45eJQtfXXeQwjb7vDqSJ+8e6BW3rXUB2i6IC2CbOYrLWhMBgfv3/uTm++IbCFW2zX3Yk3yqq3d4yua2no7w==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.4.tgz", + "integrity": "sha512-EKXBkx6EDcvyO+U68w/eXicRaF92zSSzYNvR3tMZszEKYE6xBr3kZxY99PP54HXQHR4zYwLvFJVp+T6bnvte2w==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.3", + "@angular-devkit/core": "19.1.4", "jsonc-parser": "3.3.1", "magic-string": "0.30.17", "ora": "5.4.1", @@ -361,9 +361,9 @@ } }, "node_modules/@angular/animations": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.1.2.tgz", - "integrity": "sha512-usf/TMBpQKRnVpEK/UzrcxtHrUgWvryMG1UDWOTsTxmfAKsYoLqy+gdcGOkSf9yEiNn8xBxFXeGqPbFPeA1fWQ==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.1.3.tgz", + "integrity": "sha512-MI+Tbp9OOisrQtTQH7o+xiQCODXicCs8WHNpGzdCpnXdRkQuVSOb6xAjD9OXJqcQGotLgeyennnkIJGXdz4RTA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -372,18 +372,18 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.1.2" + "@angular/core": "19.1.3" } }, "node_modules/@angular/build": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.3.tgz", - "integrity": "sha512-NRYBNAyCCn+6XEHv/guVZ+Y/Fan7klW6CL938G2aDzbVipSt5xCCRxYgXwACBv5BzieV16SFnQYldAzyNs0uUg==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.4.tgz", + "integrity": "sha512-yfvLeUT2a8JTuVBY259vsSv0uLyhikHHgQcWa3VSr0TvCKrwCsBIFDq7vqmhLqIVWi/Z4D7n3J5JQAbDrl38Sg==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1901.3", + "@angular-devkit/architect": "0.1901.4", "@babel/core": "7.26.0", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", @@ -422,7 +422,7 @@ "@angular/localize": "^19.0.0", "@angular/platform-server": "^19.0.0", "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.1.3", + "@angular/ssr": "^19.1.4", "less": "^4.2.0", "ng-packagr": "^19.0.0", "postcss": "^8.4.0", @@ -487,9 +487,9 @@ } }, "node_modules/@angular/build/node_modules/@types/node": { - "version": "22.10.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", - "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", + "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, @@ -583,18 +583,18 @@ } }, "node_modules/@angular/cli": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.3.tgz", - "integrity": "sha512-GJGH3Xw7/zm12myA2R4Dg8+ny3p9tW00tx33YIK8vFjOUKycqgWaKfpYCe2s9egrm2Pew/DclHCD+IUwEAz1GQ==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.4.tgz", + "integrity": "sha512-C1Z2OTLjUJIkLsay6RJ1rzY0Tdb1Mj/cBh9dZryDstuits8G0Tphe36hnLownnoHspFQfjSRtVzF4NwKiDlQRw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1901.3", - "@angular-devkit/core": "19.1.3", - "@angular-devkit/schematics": "19.1.3", + "@angular-devkit/architect": "0.1901.4", + "@angular-devkit/core": "19.1.4", + "@angular-devkit/schematics": "19.1.4", "@inquirer/prompts": "7.2.1", "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.1.3", + "@schematics/angular": "19.1.4", "@yarnpkg/lockfile": "1.1.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", @@ -866,9 +866,9 @@ } }, "node_modules/@angular/cli/node_modules/@types/node": { - "version": "22.10.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", - "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", + "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, @@ -903,9 +903,9 @@ } }, "node_modules/@angular/common": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.2.tgz", - "integrity": "sha512-6IhBXwz97pbXA+3vHw1hQlv4M0gc5NrDZSCQeffcraE6wpFMzo8vLcYAiNxpSyTFS7YLzCALdS6kYXVP2FBy1g==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.3.tgz", + "integrity": "sha512-r1P0W6FKrON83szIJboF8z6UNCVL4HIxyD+nhmHMMT/iJpu4kDHVugaN/+w2jYLb4oelAJK5xzkzA+1IaHpzLg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -914,14 +914,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.1.2", + "@angular/core": "19.1.3", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.2.tgz", - "integrity": "sha512-CThpvyims1aoPtqUA5UCB0lEI8lDnWBuY6VpMST4YCxhYuPmDWrwKcYXOJU1w/5yEeR8bAOvWIkKdA83MAEyHw==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.3.tgz", + "integrity": "sha512-omX5Gyt3zlJVTUteO2YxsqYWtAIpkvs8kRYSUsLTi79V1gbGo+J1TawFuyBTrWxj4UtTGvwmDgZxiCIwMtP5KQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -930,7 +930,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.1.2" + "@angular/core": "19.1.3" }, "peerDependenciesMeta": { "@angular/core": { @@ -939,9 +939,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.2.tgz", - "integrity": "sha512-CaZTG9arDVc9mGl/abqWsg79VbHAvo6ABtJa/Z6CJ6m2Y0HQPTJR6psiFqjnTSBUK43LRx8dDV3T8wIZa7DNpg==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.3.tgz", + "integrity": "sha512-nDBvZenQECcr9CClmTp3iJNilRQ6oDKFgBkhlWffEFBx0Z6kBA36MXKKLuCkf31D+NGmt5VJlAkl8Ax8BJ9qJw==", "dev": true, "license": "MIT", "dependencies": { @@ -963,14 +963,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.1.2", + "@angular/compiler": "19.1.3", "typescript": ">=5.5 <5.8" } }, "node_modules/@angular/core": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.2.tgz", - "integrity": "sha512-WrOzn9X2LsXxS27fB1WNjYsFVUKvuDuZ0ERfesWb/t1prz09q7fi/YK0TXx7XOby9CfNe4aXjzRPQL2zgFuMWQ==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.3.tgz", + "integrity": "sha512-Hh1eHvi+y+gsTRODiEEEWnRj5zqv9WNoou1KmQ1mv1NTOf0Pv61Hg9P2rBWDr0mPIXFSzqUKjyzW30BgdQ+AEA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -984,9 +984,9 @@ } }, "node_modules/@angular/forms": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.2.tgz", - "integrity": "sha512-PmHoF4JkGbYK0pdBH2FwAKU9VBydAIjJQlol3anjUQF2zfkITeTqfVNmys1mFhojGR+ZppV0zZ+8MhI/501P7A==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.3.tgz", + "integrity": "sha512-M6eEJBysJm9zSUhm8ggljZCsgHLccZl70P34tyddb8erh9it2uoOXW0aVaZgDt1UAiF5a1EzjdVdN4TZTT/OGA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -995,16 +995,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.1.2", - "@angular/core": "19.1.2", - "@angular/platform-browser": "19.1.2", + "@angular/common": "19.1.3", + "@angular/core": "19.1.3", + "@angular/platform-browser": "19.1.3", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.2.tgz", - "integrity": "sha512-fk/OrL4r5jUjAi1WTv9LGTm+DXWrPtDBpoX4z5Ze6Se+x3/6pTn1Rty1C4MNZvHiTjIQGQNRnq447GdiOjhg9w==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.3.tgz", + "integrity": "sha512-bLgnM2hRyzUdoWRoUhe+IMenlr74EvrgwyG7anJ27bjg5PcvhQPXrGqU0hri5yPDb9SHVJZminr7OjNCN8QJkQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1013,9 +1013,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "19.1.2", - "@angular/common": "19.1.2", - "@angular/core": "19.1.2" + "@angular/animations": "19.1.3", + "@angular/common": "19.1.3", + "@angular/core": "19.1.3" }, "peerDependenciesMeta": { "@angular/animations": { @@ -1024,9 +1024,9 @@ } }, "node_modules/@angular/router": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.1.2.tgz", - "integrity": "sha512-yIz86uSTKFttwgWGnzHeFUvoHP+QNk+2w2OAR9UCbRoXpfx5oDhZj/zZQLmuqqpSAQyJ6qicqucEBUahA938pg==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.1.3.tgz", + "integrity": "sha512-DJ9BgvtxJV6xohaPQXPdBsFCZoQIEq2OPDyKcoW4L0ST4kIIFpHyI6wJ+AlPnLkhSwmOOoHciH0oxZ2xPVxmiQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -1035,9 +1035,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.1.2", - "@angular/core": "19.1.2", - "@angular/platform-browser": "19.1.2", + "@angular/common": "19.1.3", + "@angular/core": "19.1.3", + "@angular/platform-browser": "19.1.3", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -1426,27 +1426,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz", + "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "@babel/types": "^7.26.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", - "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", + "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.5" + "@babel/types": "^7.26.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -2387,13 +2387,13 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", - "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz", + "integrity": "sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -2607,17 +2607,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz", - "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz", + "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.5", - "@babel/parser": "^7.26.5", + "@babel/parser": "^7.26.7", "@babel/template": "^7.25.9", - "@babel/types": "^7.26.5", + "@babel/types": "^7.26.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2643,9 +2643,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", - "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", + "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", "dev": true, "license": "MIT", "dependencies": { @@ -3160,9 +3160,9 @@ } }, "node_modules/@inquirer/core/node_modules/@types/node": { - "version": "22.10.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", - "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", + "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, @@ -3965,9 +3965,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.1.3.tgz", - "integrity": "sha512-O6bKP8J8w8U5NfFCA4ukO82rpmvii5JtXQCo2FCwafZBfYuV5GHw97ezbdUIaTbPML+EC7gq9Y85EuFAyUHtAg==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.1.4.tgz", + "integrity": "sha512-ZmUlbVqu/pz8abxVxNCKgKeY5g2MX1NsKxhM8rRV5tVV/MaAtSYNHgmFSYcKWA178v7k6BUuhnoNNxl5qqc1kw==", "dev": true, "license": "MIT", "engines": { @@ -4138,9 +4138,9 @@ } }, "node_modules/@npmcli/package-json": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.1.0.tgz", - "integrity": "sha512-t6G+6ZInT4X+tqj2i+wlLIeCKnKOTuz9/VFYDtj+TGTur5q7sp/OYrQA19LdBbWfXDOi0Y4jtedV6xtB8zQ9ug==", + "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": { @@ -4148,9 +4148,9 @@ "glob": "^10.2.2", "hosted-git-info": "^8.0.0", "json-parse-even-better-errors": "^4.0.0", - "normalize-package-data": "^7.0.0", "proc-log": "^5.0.0", - "semver": "^7.5.3" + "semver": "^7.5.3", + "validate-npm-package-license": "^3.0.4" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -4906,14 +4906,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.3.tgz", - "integrity": "sha512-LG3OKZG1Dl1lxNIc81jr82WSUaDCYlg/SEJ6A78p8AaZtTFKf14WenJTeG0XZPX45l26BdZSjn9MUTCggxQvGQ==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.4.tgz", + "integrity": "sha512-HFf83SoXbj1K4jkYSSfCg/oXkmSGBx0zG1Lh+dE5GZFdTQmykrBY519aSdrqLVyZzKYjTGfDfSewUeO4a0GE2A==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.3", - "@angular-devkit/schematics": "19.1.3", + "@angular-devkit/core": "19.1.4", + "@angular-devkit/schematics": "19.1.4", "jsonc-parser": "3.3.1" }, "engines": { @@ -5142,13 +5142,6 @@ "@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, - "license": "MIT" - }, "node_modules/@types/cors": { "version": "2.8.17", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", @@ -5266,9 +5259,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "16.18.124", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.124.tgz", - "integrity": "sha512-8ADCm5WzM/IpWxjs1Jhtwo6j+Fb8z4yr/CobP5beUUPdyCI0mg87/bqQYxNcqnhZ24Dc9RME8SQWu5eI/FmSGA==", + "version": "16.18.125", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.125.tgz", + "integrity": "sha512-w7U5ojboSPfZP4zD98d+/cjcN2BDW6lKH2M0ubipt8L8vUC7qUAC6ENKGSJL4tEktH2Saw2K4y1uwSjyRGKMhw==", "dev": true, "license": "MIT" }, @@ -5361,9 +5354,9 @@ } }, "node_modules/@types/ws": { - "version": "8.5.13", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", - "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", + "version": "8.5.14", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.14.tgz", + "integrity": "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==", "dev": true, "license": "MIT", "dependencies": { @@ -5553,13 +5546,13 @@ "license": "BSD-2-Clause" }, "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz", + "integrity": "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==", "dev": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/accepts": { @@ -7040,13 +7033,13 @@ "license": "MIT" }, "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=18" } }, "node_modules/cookie-signature": { @@ -7771,9 +7764,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.84", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.84.tgz", - "integrity": "sha512-I+DQ8xgafao9Ha6y0qjHHvpZ9OfyA1qKlkHkjywxzniORU2awxyz7f/iVJcULmrF2yrM3nHQf+iDjJtbbexd/g==", + "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==", "dev": true, "license": "ISC" }, @@ -7830,18 +7823,17 @@ } }, "node_modules/engine.io": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.2.tgz", - "integrity": "sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==", + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.3.tgz", + "integrity": "sha512-2hkLItQMBkoYSagneiisupWGvsQlWXqzhSMvsjaM8GYbnfUsX7tzYQq9QARnate5LRedVTX+MbkSZAANAr3NtQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/cookie": "^0.4.1", "@types/cors": "^2.8.12", "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", - "cookie": "~0.7.2", + "cookie": "~1.0.2", "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", @@ -11728,13 +11720,13 @@ } }, "node_modules/nopt": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.0.0.tgz", - "integrity": "sha512-1L/fTJ4UmV/lUxT2Uf006pfZKTvAgCF+chz+0OgBHO8u2Z67pE7AaAUUj7CJy0lXqHmymUvGFt6NE9R3HER0yw==", + "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": { - "abbrev": "^2.0.0" + "abbrev": "^3.0.0" }, "bin": { "nopt": "bin/nopt.js" @@ -11743,21 +11735,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/normalize-package-data": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-7.0.0.tgz", - "integrity": "sha512-k6U0gKRIuNCTkwHGZqblCfLfBRh+w1vI6tBo+IeJwq2M8FUiOqhX7GH+GArQGScA7azd1WfyRCvxoXDO3hQDIA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^8.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", diff --git a/adev/src/content/tutorials/homepage/package-lock.json b/adev/src/content/tutorials/homepage/package-lock.json index bba4cfe80747..67c62c5b24e2 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.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.3.tgz", - "integrity": "sha512-bXhcSP23MKGRuKjI0j+JEDssuFwyprVS0czIeNswj2VTuWyx9y8GjnH2kJXeDETbX0pNbUjThkMsk8cZ5b2YTg==", + "version": "0.1901.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.4.tgz", + "integrity": "sha512-EoRTN8p7z0YnqOEIJKKu/NwSsCJxFkyGuZOobz7btnUWwlDqG8CNAhJgtlsOXPihwEkHEkzRIm1feDkWEjCYsA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.3", + "@angular-devkit/core": "19.1.4", "rxjs": "7.8.1" }, "engines": { @@ -55,9 +55,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.3.tgz", - "integrity": "sha512-of/TKfJ/vL+/qvr4PbDTtqbFJGFHPfu6bEJrIZsLMYA+Mej8SyTx3kDm4LLnKQBtWVYDqkrxvcpOb4+NmHNLfA==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.4.tgz", + "integrity": "sha512-IDvSSiQgaixH2RtZtIpq1+XaHeuzMiTWfDyNF9DuYcU+S8CdG1SWrc8d59tmOrM/q+IRGyFgbBhTU1un52hNHw==", "dev": true, "license": "MIT", "dependencies": { @@ -83,13 +83,13 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.3.tgz", - "integrity": "sha512-DfN45eJQtfXXeQwjb7vDqSJ+8e6BW3rXUB2i6IC2CbOYrLWhMBgfv3/uTm++IbCFW2zX3Yk3yqq3d4yua2no7w==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.4.tgz", + "integrity": "sha512-EKXBkx6EDcvyO+U68w/eXicRaF92zSSzYNvR3tMZszEKYE6xBr3kZxY99PP54HXQHR4zYwLvFJVp+T6bnvte2w==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.3", + "@angular-devkit/core": "19.1.4", "jsonc-parser": "3.3.1", "magic-string": "0.30.17", "ora": "5.4.1", @@ -102,14 +102,14 @@ } }, "node_modules/@angular/build": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.3.tgz", - "integrity": "sha512-NRYBNAyCCn+6XEHv/guVZ+Y/Fan7klW6CL938G2aDzbVipSt5xCCRxYgXwACBv5BzieV16SFnQYldAzyNs0uUg==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.4.tgz", + "integrity": "sha512-yfvLeUT2a8JTuVBY259vsSv0uLyhikHHgQcWa3VSr0TvCKrwCsBIFDq7vqmhLqIVWi/Z4D7n3J5JQAbDrl38Sg==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1901.3", + "@angular-devkit/architect": "0.1901.4", "@babel/core": "7.26.0", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", @@ -148,7 +148,7 @@ "@angular/localize": "^19.0.0", "@angular/platform-server": "^19.0.0", "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.1.3", + "@angular/ssr": "^19.1.4", "less": "^4.2.0", "ng-packagr": "^19.0.0", "postcss": "^8.4.0", @@ -183,18 +183,18 @@ } }, "node_modules/@angular/cli": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.3.tgz", - "integrity": "sha512-GJGH3Xw7/zm12myA2R4Dg8+ny3p9tW00tx33YIK8vFjOUKycqgWaKfpYCe2s9egrm2Pew/DclHCD+IUwEAz1GQ==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.4.tgz", + "integrity": "sha512-C1Z2OTLjUJIkLsay6RJ1rzY0Tdb1Mj/cBh9dZryDstuits8G0Tphe36hnLownnoHspFQfjSRtVzF4NwKiDlQRw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1901.3", - "@angular-devkit/core": "19.1.3", - "@angular-devkit/schematics": "19.1.3", + "@angular-devkit/architect": "0.1901.4", + "@angular-devkit/core": "19.1.4", + "@angular-devkit/schematics": "19.1.4", "@inquirer/prompts": "7.2.1", "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.1.3", + "@schematics/angular": "19.1.4", "@yarnpkg/lockfile": "1.1.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", @@ -217,9 +217,9 @@ } }, "node_modules/@angular/common": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.2.tgz", - "integrity": "sha512-6IhBXwz97pbXA+3vHw1hQlv4M0gc5NrDZSCQeffcraE6wpFMzo8vLcYAiNxpSyTFS7YLzCALdS6kYXVP2FBy1g==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.3.tgz", + "integrity": "sha512-r1P0W6FKrON83szIJboF8z6UNCVL4HIxyD+nhmHMMT/iJpu4kDHVugaN/+w2jYLb4oelAJK5xzkzA+1IaHpzLg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -228,14 +228,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.1.2", + "@angular/core": "19.1.3", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.2.tgz", - "integrity": "sha512-CThpvyims1aoPtqUA5UCB0lEI8lDnWBuY6VpMST4YCxhYuPmDWrwKcYXOJU1w/5yEeR8bAOvWIkKdA83MAEyHw==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.3.tgz", + "integrity": "sha512-omX5Gyt3zlJVTUteO2YxsqYWtAIpkvs8kRYSUsLTi79V1gbGo+J1TawFuyBTrWxj4UtTGvwmDgZxiCIwMtP5KQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -244,7 +244,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.1.2" + "@angular/core": "19.1.3" }, "peerDependenciesMeta": { "@angular/core": { @@ -253,9 +253,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.2.tgz", - "integrity": "sha512-CaZTG9arDVc9mGl/abqWsg79VbHAvo6ABtJa/Z6CJ6m2Y0HQPTJR6psiFqjnTSBUK43LRx8dDV3T8wIZa7DNpg==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.3.tgz", + "integrity": "sha512-nDBvZenQECcr9CClmTp3iJNilRQ6oDKFgBkhlWffEFBx0Z6kBA36MXKKLuCkf31D+NGmt5VJlAkl8Ax8BJ9qJw==", "dev": true, "license": "MIT", "dependencies": { @@ -277,14 +277,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.1.2", + "@angular/compiler": "19.1.3", "typescript": ">=5.5 <5.8" } }, "node_modules/@angular/core": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.2.tgz", - "integrity": "sha512-WrOzn9X2LsXxS27fB1WNjYsFVUKvuDuZ0ERfesWb/t1prz09q7fi/YK0TXx7XOby9CfNe4aXjzRPQL2zgFuMWQ==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.3.tgz", + "integrity": "sha512-Hh1eHvi+y+gsTRODiEEEWnRj5zqv9WNoou1KmQ1mv1NTOf0Pv61Hg9P2rBWDr0mPIXFSzqUKjyzW30BgdQ+AEA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -298,9 +298,9 @@ } }, "node_modules/@angular/forms": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.2.tgz", - "integrity": "sha512-PmHoF4JkGbYK0pdBH2FwAKU9VBydAIjJQlol3anjUQF2zfkITeTqfVNmys1mFhojGR+ZppV0zZ+8MhI/501P7A==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.3.tgz", + "integrity": "sha512-M6eEJBysJm9zSUhm8ggljZCsgHLccZl70P34tyddb8erh9it2uoOXW0aVaZgDt1UAiF5a1EzjdVdN4TZTT/OGA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -309,16 +309,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.1.2", - "@angular/core": "19.1.2", - "@angular/platform-browser": "19.1.2", + "@angular/common": "19.1.3", + "@angular/core": "19.1.3", + "@angular/platform-browser": "19.1.3", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.2.tgz", - "integrity": "sha512-fk/OrL4r5jUjAi1WTv9LGTm+DXWrPtDBpoX4z5Ze6Se+x3/6pTn1Rty1C4MNZvHiTjIQGQNRnq447GdiOjhg9w==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.3.tgz", + "integrity": "sha512-bLgnM2hRyzUdoWRoUhe+IMenlr74EvrgwyG7anJ27bjg5PcvhQPXrGqU0hri5yPDb9SHVJZminr7OjNCN8QJkQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -327,9 +327,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "19.1.2", - "@angular/common": "19.1.2", - "@angular/core": "19.1.2" + "@angular/animations": "19.1.3", + "@angular/common": "19.1.3", + "@angular/core": "19.1.3" }, "peerDependenciesMeta": { "@angular/animations": { @@ -553,27 +553,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz", + "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "@babel/types": "^7.26.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", - "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", + "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.5" + "@babel/types": "^7.26.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -614,17 +614,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz", - "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz", + "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.5", - "@babel/parser": "^7.26.5", + "@babel/parser": "^7.26.7", "@babel/template": "^7.25.9", - "@babel/types": "^7.26.5", + "@babel/types": "^7.26.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -633,9 +633,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", - "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", + "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", "dev": true, "license": "MIT", "dependencies": { @@ -2144,9 +2144,9 @@ } }, "node_modules/@npmcli/package-json": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.1.0.tgz", - "integrity": "sha512-t6G+6ZInT4X+tqj2i+wlLIeCKnKOTuz9/VFYDtj+TGTur5q7sp/OYrQA19LdBbWfXDOi0Y4jtedV6xtB8zQ9ug==", + "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": { @@ -2154,9 +2154,9 @@ "glob": "^10.2.2", "hosted-git-info": "^8.0.0", "json-parse-even-better-errors": "^4.0.0", - "normalize-package-data": "^7.0.0", "proc-log": "^5.0.0", - "semver": "^7.5.3" + "semver": "^7.5.3", + "validate-npm-package-license": "^3.0.4" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -2813,14 +2813,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.3.tgz", - "integrity": "sha512-LG3OKZG1Dl1lxNIc81jr82WSUaDCYlg/SEJ6A78p8AaZtTFKf14WenJTeG0XZPX45l26BdZSjn9MUTCggxQvGQ==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.4.tgz", + "integrity": "sha512-HFf83SoXbj1K4jkYSSfCg/oXkmSGBx0zG1Lh+dE5GZFdTQmykrBY519aSdrqLVyZzKYjTGfDfSewUeO4a0GE2A==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.3", - "@angular-devkit/schematics": "19.1.3", + "@angular-devkit/core": "19.1.4", + "@angular-devkit/schematics": "19.1.4", "jsonc-parser": "3.3.1" }, "engines": { @@ -2941,9 +2941,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", - "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", + "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, @@ -2972,13 +2972,13 @@ "license": "BSD-2-Clause" }, "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz", + "integrity": "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==", "dev": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/agent-base": { @@ -3714,9 +3714,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.84", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.84.tgz", - "integrity": "sha512-I+DQ8xgafao9Ha6y0qjHHvpZ9OfyA1qKlkHkjywxzniORU2awxyz7f/iVJcULmrF2yrM3nHQf+iDjJtbbexd/g==", + "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==", "dev": true, "license": "ISC" }, @@ -5228,13 +5228,13 @@ "license": "MIT" }, "node_modules/nopt": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.0.0.tgz", - "integrity": "sha512-1L/fTJ4UmV/lUxT2Uf006pfZKTvAgCF+chz+0OgBHO8u2Z67pE7AaAUUj7CJy0lXqHmymUvGFt6NE9R3HER0yw==", + "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": { - "abbrev": "^2.0.0" + "abbrev": "^3.0.0" }, "bin": { "nopt": "bin/nopt.js" @@ -5243,21 +5243,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/normalize-package-data": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-7.0.0.tgz", - "integrity": "sha512-k6U0gKRIuNCTkwHGZqblCfLfBRh+w1vI6tBo+IeJwq2M8FUiOqhX7GH+GArQGScA7azd1WfyRCvxoXDO3hQDIA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^8.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/npm-bundled": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.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 b0dd97e3bb47..2db9269eb091 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.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.3.tgz", - "integrity": "sha512-bXhcSP23MKGRuKjI0j+JEDssuFwyprVS0czIeNswj2VTuWyx9y8GjnH2kJXeDETbX0pNbUjThkMsk8cZ5b2YTg==", + "version": "0.1901.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.4.tgz", + "integrity": "sha512-EoRTN8p7z0YnqOEIJKKu/NwSsCJxFkyGuZOobz7btnUWwlDqG8CNAhJgtlsOXPihwEkHEkzRIm1feDkWEjCYsA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.3", + "@angular-devkit/core": "19.1.4", "rxjs": "7.8.1" }, "engines": { @@ -56,9 +56,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.3.tgz", - "integrity": "sha512-of/TKfJ/vL+/qvr4PbDTtqbFJGFHPfu6bEJrIZsLMYA+Mej8SyTx3kDm4LLnKQBtWVYDqkrxvcpOb4+NmHNLfA==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.4.tgz", + "integrity": "sha512-IDvSSiQgaixH2RtZtIpq1+XaHeuzMiTWfDyNF9DuYcU+S8CdG1SWrc8d59tmOrM/q+IRGyFgbBhTU1un52hNHw==", "dev": true, "license": "MIT", "dependencies": { @@ -84,13 +84,13 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.3.tgz", - "integrity": "sha512-DfN45eJQtfXXeQwjb7vDqSJ+8e6BW3rXUB2i6IC2CbOYrLWhMBgfv3/uTm++IbCFW2zX3Yk3yqq3d4yua2no7w==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.4.tgz", + "integrity": "sha512-EKXBkx6EDcvyO+U68w/eXicRaF92zSSzYNvR3tMZszEKYE6xBr3kZxY99PP54HXQHR4zYwLvFJVp+T6bnvte2w==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.3", + "@angular-devkit/core": "19.1.4", "jsonc-parser": "3.3.1", "magic-string": "0.30.17", "ora": "5.4.1", @@ -103,14 +103,14 @@ } }, "node_modules/@angular/build": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.3.tgz", - "integrity": "sha512-NRYBNAyCCn+6XEHv/guVZ+Y/Fan7klW6CL938G2aDzbVipSt5xCCRxYgXwACBv5BzieV16SFnQYldAzyNs0uUg==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.4.tgz", + "integrity": "sha512-yfvLeUT2a8JTuVBY259vsSv0uLyhikHHgQcWa3VSr0TvCKrwCsBIFDq7vqmhLqIVWi/Z4D7n3J5JQAbDrl38Sg==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1901.3", + "@angular-devkit/architect": "0.1901.4", "@babel/core": "7.26.0", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", @@ -149,7 +149,7 @@ "@angular/localize": "^19.0.0", "@angular/platform-server": "^19.0.0", "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.1.3", + "@angular/ssr": "^19.1.4", "less": "^4.2.0", "ng-packagr": "^19.0.0", "postcss": "^8.4.0", @@ -184,18 +184,18 @@ } }, "node_modules/@angular/cli": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.3.tgz", - "integrity": "sha512-GJGH3Xw7/zm12myA2R4Dg8+ny3p9tW00tx33YIK8vFjOUKycqgWaKfpYCe2s9egrm2Pew/DclHCD+IUwEAz1GQ==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.4.tgz", + "integrity": "sha512-C1Z2OTLjUJIkLsay6RJ1rzY0Tdb1Mj/cBh9dZryDstuits8G0Tphe36hnLownnoHspFQfjSRtVzF4NwKiDlQRw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1901.3", - "@angular-devkit/core": "19.1.3", - "@angular-devkit/schematics": "19.1.3", + "@angular-devkit/architect": "0.1901.4", + "@angular-devkit/core": "19.1.4", + "@angular-devkit/schematics": "19.1.4", "@inquirer/prompts": "7.2.1", "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.1.3", + "@schematics/angular": "19.1.4", "@yarnpkg/lockfile": "1.1.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", @@ -218,9 +218,9 @@ } }, "node_modules/@angular/common": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.2.tgz", - "integrity": "sha512-6IhBXwz97pbXA+3vHw1hQlv4M0gc5NrDZSCQeffcraE6wpFMzo8vLcYAiNxpSyTFS7YLzCALdS6kYXVP2FBy1g==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.3.tgz", + "integrity": "sha512-r1P0W6FKrON83szIJboF8z6UNCVL4HIxyD+nhmHMMT/iJpu4kDHVugaN/+w2jYLb4oelAJK5xzkzA+1IaHpzLg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -229,14 +229,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.1.2", + "@angular/core": "19.1.3", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.2.tgz", - "integrity": "sha512-CThpvyims1aoPtqUA5UCB0lEI8lDnWBuY6VpMST4YCxhYuPmDWrwKcYXOJU1w/5yEeR8bAOvWIkKdA83MAEyHw==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.3.tgz", + "integrity": "sha512-omX5Gyt3zlJVTUteO2YxsqYWtAIpkvs8kRYSUsLTi79V1gbGo+J1TawFuyBTrWxj4UtTGvwmDgZxiCIwMtP5KQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -245,7 +245,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.1.2" + "@angular/core": "19.1.3" }, "peerDependenciesMeta": { "@angular/core": { @@ -254,9 +254,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.2.tgz", - "integrity": "sha512-CaZTG9arDVc9mGl/abqWsg79VbHAvo6ABtJa/Z6CJ6m2Y0HQPTJR6psiFqjnTSBUK43LRx8dDV3T8wIZa7DNpg==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.3.tgz", + "integrity": "sha512-nDBvZenQECcr9CClmTp3iJNilRQ6oDKFgBkhlWffEFBx0Z6kBA36MXKKLuCkf31D+NGmt5VJlAkl8Ax8BJ9qJw==", "dev": true, "license": "MIT", "dependencies": { @@ -278,14 +278,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.1.2", + "@angular/compiler": "19.1.3", "typescript": ">=5.5 <5.8" } }, "node_modules/@angular/core": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.2.tgz", - "integrity": "sha512-WrOzn9X2LsXxS27fB1WNjYsFVUKvuDuZ0ERfesWb/t1prz09q7fi/YK0TXx7XOby9CfNe4aXjzRPQL2zgFuMWQ==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.3.tgz", + "integrity": "sha512-Hh1eHvi+y+gsTRODiEEEWnRj5zqv9WNoou1KmQ1mv1NTOf0Pv61Hg9P2rBWDr0mPIXFSzqUKjyzW30BgdQ+AEA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -299,9 +299,9 @@ } }, "node_modules/@angular/forms": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.2.tgz", - "integrity": "sha512-PmHoF4JkGbYK0pdBH2FwAKU9VBydAIjJQlol3anjUQF2zfkITeTqfVNmys1mFhojGR+ZppV0zZ+8MhI/501P7A==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.3.tgz", + "integrity": "sha512-M6eEJBysJm9zSUhm8ggljZCsgHLccZl70P34tyddb8erh9it2uoOXW0aVaZgDt1UAiF5a1EzjdVdN4TZTT/OGA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -310,16 +310,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.1.2", - "@angular/core": "19.1.2", - "@angular/platform-browser": "19.1.2", + "@angular/common": "19.1.3", + "@angular/core": "19.1.3", + "@angular/platform-browser": "19.1.3", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.2.tgz", - "integrity": "sha512-fk/OrL4r5jUjAi1WTv9LGTm+DXWrPtDBpoX4z5Ze6Se+x3/6pTn1Rty1C4MNZvHiTjIQGQNRnq447GdiOjhg9w==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.3.tgz", + "integrity": "sha512-bLgnM2hRyzUdoWRoUhe+IMenlr74EvrgwyG7anJ27bjg5PcvhQPXrGqU0hri5yPDb9SHVJZminr7OjNCN8QJkQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -328,9 +328,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "19.1.2", - "@angular/common": "19.1.2", - "@angular/core": "19.1.2" + "@angular/animations": "19.1.3", + "@angular/common": "19.1.3", + "@angular/core": "19.1.3" }, "peerDependenciesMeta": { "@angular/animations": { @@ -339,9 +339,9 @@ } }, "node_modules/@angular/router": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.1.2.tgz", - "integrity": "sha512-yIz86uSTKFttwgWGnzHeFUvoHP+QNk+2w2OAR9UCbRoXpfx5oDhZj/zZQLmuqqpSAQyJ6qicqucEBUahA938pg==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.1.3.tgz", + "integrity": "sha512-DJ9BgvtxJV6xohaPQXPdBsFCZoQIEq2OPDyKcoW4L0ST4kIIFpHyI6wJ+AlPnLkhSwmOOoHciH0oxZ2xPVxmiQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -350,9 +350,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.1.2", - "@angular/core": "19.1.2", - "@angular/platform-browser": "19.1.2", + "@angular/common": "19.1.3", + "@angular/core": "19.1.3", + "@angular/platform-browser": "19.1.3", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -572,27 +572,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz", + "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "@babel/types": "^7.26.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", - "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", + "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.5" + "@babel/types": "^7.26.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -633,17 +633,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz", - "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz", + "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.5", - "@babel/parser": "^7.26.5", + "@babel/parser": "^7.26.7", "@babel/template": "^7.25.9", - "@babel/types": "^7.26.5", + "@babel/types": "^7.26.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -652,9 +652,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", - "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", + "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", "dev": true, "license": "MIT", "dependencies": { @@ -2163,9 +2163,9 @@ } }, "node_modules/@npmcli/package-json": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.1.0.tgz", - "integrity": "sha512-t6G+6ZInT4X+tqj2i+wlLIeCKnKOTuz9/VFYDtj+TGTur5q7sp/OYrQA19LdBbWfXDOi0Y4jtedV6xtB8zQ9ug==", + "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": { @@ -2173,9 +2173,9 @@ "glob": "^10.2.2", "hosted-git-info": "^8.0.0", "json-parse-even-better-errors": "^4.0.0", - "normalize-package-data": "^7.0.0", "proc-log": "^5.0.0", - "semver": "^7.5.3" + "semver": "^7.5.3", + "validate-npm-package-license": "^3.0.4" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -2832,14 +2832,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.3.tgz", - "integrity": "sha512-LG3OKZG1Dl1lxNIc81jr82WSUaDCYlg/SEJ6A78p8AaZtTFKf14WenJTeG0XZPX45l26BdZSjn9MUTCggxQvGQ==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.4.tgz", + "integrity": "sha512-HFf83SoXbj1K4jkYSSfCg/oXkmSGBx0zG1Lh+dE5GZFdTQmykrBY519aSdrqLVyZzKYjTGfDfSewUeO4a0GE2A==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.3", - "@angular-devkit/schematics": "19.1.3", + "@angular-devkit/core": "19.1.4", + "@angular-devkit/schematics": "19.1.4", "jsonc-parser": "3.3.1" }, "engines": { @@ -2960,9 +2960,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", - "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", + "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, @@ -2991,13 +2991,13 @@ "license": "BSD-2-Clause" }, "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz", + "integrity": "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==", "dev": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/agent-base": { @@ -3733,9 +3733,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.84", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.84.tgz", - "integrity": "sha512-I+DQ8xgafao9Ha6y0qjHHvpZ9OfyA1qKlkHkjywxzniORU2awxyz7f/iVJcULmrF2yrM3nHQf+iDjJtbbexd/g==", + "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==", "dev": true, "license": "ISC" }, @@ -5247,13 +5247,13 @@ "license": "MIT" }, "node_modules/nopt": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.0.0.tgz", - "integrity": "sha512-1L/fTJ4UmV/lUxT2Uf006pfZKTvAgCF+chz+0OgBHO8u2Z67pE7AaAUUj7CJy0lXqHmymUvGFt6NE9R3HER0yw==", + "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": { - "abbrev": "^2.0.0" + "abbrev": "^3.0.0" }, "bin": { "nopt": "bin/nopt.js" @@ -5262,21 +5262,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/normalize-package-data": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-7.0.0.tgz", - "integrity": "sha512-k6U0gKRIuNCTkwHGZqblCfLfBRh+w1vI6tBo+IeJwq2M8FUiOqhX7GH+GArQGScA7azd1WfyRCvxoXDO3hQDIA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^8.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/npm-bundled": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz", diff --git a/adev/src/content/tutorials/playground/common/package-lock.json b/adev/src/content/tutorials/playground/common/package-lock.json index 833e32d2b01b..b103a96c7d79 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.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.3.tgz", - "integrity": "sha512-bXhcSP23MKGRuKjI0j+JEDssuFwyprVS0czIeNswj2VTuWyx9y8GjnH2kJXeDETbX0pNbUjThkMsk8cZ5b2YTg==", + "version": "0.1901.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.4.tgz", + "integrity": "sha512-EoRTN8p7z0YnqOEIJKKu/NwSsCJxFkyGuZOobz7btnUWwlDqG8CNAhJgtlsOXPihwEkHEkzRIm1feDkWEjCYsA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.3", + "@angular-devkit/core": "19.1.4", "rxjs": "7.8.1" }, "engines": { @@ -58,9 +58,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.3.tgz", - "integrity": "sha512-of/TKfJ/vL+/qvr4PbDTtqbFJGFHPfu6bEJrIZsLMYA+Mej8SyTx3kDm4LLnKQBtWVYDqkrxvcpOb4+NmHNLfA==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.4.tgz", + "integrity": "sha512-IDvSSiQgaixH2RtZtIpq1+XaHeuzMiTWfDyNF9DuYcU+S8CdG1SWrc8d59tmOrM/q+IRGyFgbBhTU1un52hNHw==", "dev": true, "license": "MIT", "dependencies": { @@ -86,13 +86,13 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.3.tgz", - "integrity": "sha512-DfN45eJQtfXXeQwjb7vDqSJ+8e6BW3rXUB2i6IC2CbOYrLWhMBgfv3/uTm++IbCFW2zX3Yk3yqq3d4yua2no7w==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.4.tgz", + "integrity": "sha512-EKXBkx6EDcvyO+U68w/eXicRaF92zSSzYNvR3tMZszEKYE6xBr3kZxY99PP54HXQHR4zYwLvFJVp+T6bnvte2w==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.3", + "@angular-devkit/core": "19.1.4", "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.2", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.1.2.tgz", - "integrity": "sha512-usf/TMBpQKRnVpEK/UzrcxtHrUgWvryMG1UDWOTsTxmfAKsYoLqy+gdcGOkSf9yEiNn8xBxFXeGqPbFPeA1fWQ==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.1.3.tgz", + "integrity": "sha512-MI+Tbp9OOisrQtTQH7o+xiQCODXicCs8WHNpGzdCpnXdRkQuVSOb6xAjD9OXJqcQGotLgeyennnkIJGXdz4RTA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -116,18 +116,18 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.1.2" + "@angular/core": "19.1.3" } }, "node_modules/@angular/build": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.3.tgz", - "integrity": "sha512-NRYBNAyCCn+6XEHv/guVZ+Y/Fan7klW6CL938G2aDzbVipSt5xCCRxYgXwACBv5BzieV16SFnQYldAzyNs0uUg==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.4.tgz", + "integrity": "sha512-yfvLeUT2a8JTuVBY259vsSv0uLyhikHHgQcWa3VSr0TvCKrwCsBIFDq7vqmhLqIVWi/Z4D7n3J5JQAbDrl38Sg==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1901.3", + "@angular-devkit/architect": "0.1901.4", "@babel/core": "7.26.0", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", @@ -166,7 +166,7 @@ "@angular/localize": "^19.0.0", "@angular/platform-server": "^19.0.0", "@angular/service-worker": "^19.0.0", - "@angular/ssr": "^19.1.3", + "@angular/ssr": "^19.1.4", "less": "^4.2.0", "ng-packagr": "^19.0.0", "postcss": "^8.4.0", @@ -201,9 +201,9 @@ } }, "node_modules/@angular/cdk": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.1.0.tgz", - "integrity": "sha512-h7VSaMA/vFHb7u1bwoHKl3L3mZLIcXNZw6v7Nei9ITfEo1PfSKbrYhleeqpNikzE+LxNDKJrbZtpAckSYHblmA==", + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.1.1.tgz", + "integrity": "sha512-MmfNB9iANuDN1TS+HL8uKqA3/7pdVeCRN+HdAcfqFrcqZmSUUSlYWy8PXqymmyeXxoSwt9p4I/6R0By03VoCMw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -218,18 +218,18 @@ } }, "node_modules/@angular/cli": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.3.tgz", - "integrity": "sha512-GJGH3Xw7/zm12myA2R4Dg8+ny3p9tW00tx33YIK8vFjOUKycqgWaKfpYCe2s9egrm2Pew/DclHCD+IUwEAz1GQ==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.4.tgz", + "integrity": "sha512-C1Z2OTLjUJIkLsay6RJ1rzY0Tdb1Mj/cBh9dZryDstuits8G0Tphe36hnLownnoHspFQfjSRtVzF4NwKiDlQRw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1901.3", - "@angular-devkit/core": "19.1.3", - "@angular-devkit/schematics": "19.1.3", + "@angular-devkit/architect": "0.1901.4", + "@angular-devkit/core": "19.1.4", + "@angular-devkit/schematics": "19.1.4", "@inquirer/prompts": "7.2.1", "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.1.3", + "@schematics/angular": "19.1.4", "@yarnpkg/lockfile": "1.1.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", @@ -252,9 +252,9 @@ } }, "node_modules/@angular/common": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.2.tgz", - "integrity": "sha512-6IhBXwz97pbXA+3vHw1hQlv4M0gc5NrDZSCQeffcraE6wpFMzo8vLcYAiNxpSyTFS7YLzCALdS6kYXVP2FBy1g==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.3.tgz", + "integrity": "sha512-r1P0W6FKrON83szIJboF8z6UNCVL4HIxyD+nhmHMMT/iJpu4kDHVugaN/+w2jYLb4oelAJK5xzkzA+1IaHpzLg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -263,14 +263,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.1.2", + "@angular/core": "19.1.3", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.2.tgz", - "integrity": "sha512-CThpvyims1aoPtqUA5UCB0lEI8lDnWBuY6VpMST4YCxhYuPmDWrwKcYXOJU1w/5yEeR8bAOvWIkKdA83MAEyHw==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.3.tgz", + "integrity": "sha512-omX5Gyt3zlJVTUteO2YxsqYWtAIpkvs8kRYSUsLTi79V1gbGo+J1TawFuyBTrWxj4UtTGvwmDgZxiCIwMtP5KQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -279,7 +279,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.1.2" + "@angular/core": "19.1.3" }, "peerDependenciesMeta": { "@angular/core": { @@ -288,9 +288,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.2.tgz", - "integrity": "sha512-CaZTG9arDVc9mGl/abqWsg79VbHAvo6ABtJa/Z6CJ6m2Y0HQPTJR6psiFqjnTSBUK43LRx8dDV3T8wIZa7DNpg==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.3.tgz", + "integrity": "sha512-nDBvZenQECcr9CClmTp3iJNilRQ6oDKFgBkhlWffEFBx0Z6kBA36MXKKLuCkf31D+NGmt5VJlAkl8Ax8BJ9qJw==", "dev": true, "license": "MIT", "dependencies": { @@ -312,14 +312,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.1.2", + "@angular/compiler": "19.1.3", "typescript": ">=5.5 <5.8" } }, "node_modules/@angular/core": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.2.tgz", - "integrity": "sha512-WrOzn9X2LsXxS27fB1WNjYsFVUKvuDuZ0ERfesWb/t1prz09q7fi/YK0TXx7XOby9CfNe4aXjzRPQL2zgFuMWQ==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.3.tgz", + "integrity": "sha512-Hh1eHvi+y+gsTRODiEEEWnRj5zqv9WNoou1KmQ1mv1NTOf0Pv61Hg9P2rBWDr0mPIXFSzqUKjyzW30BgdQ+AEA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -333,9 +333,9 @@ } }, "node_modules/@angular/forms": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.2.tgz", - "integrity": "sha512-PmHoF4JkGbYK0pdBH2FwAKU9VBydAIjJQlol3anjUQF2zfkITeTqfVNmys1mFhojGR+ZppV0zZ+8MhI/501P7A==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.3.tgz", + "integrity": "sha512-M6eEJBysJm9zSUhm8ggljZCsgHLccZl70P34tyddb8erh9it2uoOXW0aVaZgDt1UAiF5a1EzjdVdN4TZTT/OGA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -344,23 +344,23 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.1.2", - "@angular/core": "19.1.2", - "@angular/platform-browser": "19.1.2", + "@angular/common": "19.1.3", + "@angular/core": "19.1.3", + "@angular/platform-browser": "19.1.3", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/material": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-19.1.0.tgz", - "integrity": "sha512-LTQBWtuRGjNpA7ceQu9PyiUUq0KLfBP8LvL04hLFbEsZ0fIPQ/OO/Otn67/7TMtnHRFnPeezYPHcAHBhiNlR4A==", + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-19.1.1.tgz", + "integrity": "sha512-x/EwyBx3yCIYyu/hve19eecmufJzwltRWOO/3Y74jY4jSNNFrR9046t0ptw4fyEXjN8UQZI6Fp/melcZxl3IiA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/animations": "^19.0.0 || ^20.0.0", - "@angular/cdk": "19.1.0", + "@angular/cdk": "19.1.1", "@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 +369,9 @@ } }, "node_modules/@angular/platform-browser": { - "version": "19.1.2", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.2.tgz", - "integrity": "sha512-fk/OrL4r5jUjAi1WTv9LGTm+DXWrPtDBpoX4z5Ze6Se+x3/6pTn1Rty1C4MNZvHiTjIQGQNRnq447GdiOjhg9w==", + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.3.tgz", + "integrity": "sha512-bLgnM2hRyzUdoWRoUhe+IMenlr74EvrgwyG7anJ27bjg5PcvhQPXrGqU0hri5yPDb9SHVJZminr7OjNCN8QJkQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -380,9 +380,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "19.1.2", - "@angular/common": "19.1.2", - "@angular/core": "19.1.2" + "@angular/animations": "19.1.3", + "@angular/common": "19.1.3", + "@angular/core": "19.1.3" }, "peerDependenciesMeta": { "@angular/animations": { @@ -606,27 +606,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz", + "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "@babel/types": "^7.26.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", - "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", + "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.5" + "@babel/types": "^7.26.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -667,17 +667,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz", - "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz", + "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.5", - "@babel/parser": "^7.26.5", + "@babel/parser": "^7.26.7", "@babel/template": "^7.25.9", - "@babel/types": "^7.26.5", + "@babel/types": "^7.26.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -686,9 +686,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", - "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", + "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", "dev": true, "license": "MIT", "dependencies": { @@ -2197,9 +2197,9 @@ } }, "node_modules/@npmcli/package-json": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.1.0.tgz", - "integrity": "sha512-t6G+6ZInT4X+tqj2i+wlLIeCKnKOTuz9/VFYDtj+TGTur5q7sp/OYrQA19LdBbWfXDOi0Y4jtedV6xtB8zQ9ug==", + "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": { @@ -2207,9 +2207,9 @@ "glob": "^10.2.2", "hosted-git-info": "^8.0.0", "json-parse-even-better-errors": "^4.0.0", - "normalize-package-data": "^7.0.0", "proc-log": "^5.0.0", - "semver": "^7.5.3" + "semver": "^7.5.3", + "validate-npm-package-license": "^3.0.4" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -2866,14 +2866,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.3.tgz", - "integrity": "sha512-LG3OKZG1Dl1lxNIc81jr82WSUaDCYlg/SEJ6A78p8AaZtTFKf14WenJTeG0XZPX45l26BdZSjn9MUTCggxQvGQ==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.4.tgz", + "integrity": "sha512-HFf83SoXbj1K4jkYSSfCg/oXkmSGBx0zG1Lh+dE5GZFdTQmykrBY519aSdrqLVyZzKYjTGfDfSewUeO4a0GE2A==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.3", - "@angular-devkit/schematics": "19.1.3", + "@angular-devkit/core": "19.1.4", + "@angular-devkit/schematics": "19.1.4", "jsonc-parser": "3.3.1" }, "engines": { @@ -2994,9 +2994,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", - "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", + "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, @@ -3025,13 +3025,13 @@ "license": "BSD-2-Clause" }, "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz", + "integrity": "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==", "dev": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/agent-base": { @@ -3767,9 +3767,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.84", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.84.tgz", - "integrity": "sha512-I+DQ8xgafao9Ha6y0qjHHvpZ9OfyA1qKlkHkjywxzniORU2awxyz7f/iVJcULmrF2yrM3nHQf+iDjJtbbexd/g==", + "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==", "dev": true, "license": "ISC" }, @@ -5281,13 +5281,13 @@ "license": "MIT" }, "node_modules/nopt": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.0.0.tgz", - "integrity": "sha512-1L/fTJ4UmV/lUxT2Uf006pfZKTvAgCF+chz+0OgBHO8u2Z67pE7AaAUUj7CJy0lXqHmymUvGFt6NE9R3HER0yw==", + "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": { - "abbrev": "^2.0.0" + "abbrev": "^3.0.0" }, "bin": { "nopt": "bin/nopt.js" @@ -5296,21 +5296,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/normalize-package-data": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-7.0.0.tgz", - "integrity": "sha512-k6U0gKRIuNCTkwHGZqblCfLfBRh+w1vI6tBo+IeJwq2M8FUiOqhX7GH+GArQGScA7azd1WfyRCvxoXDO3hQDIA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^8.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/npm-bundled": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz", diff --git a/package.json b/package.json index 29d0b55a103e..14868803e838 100644 --- a/package.json +++ b/package.json @@ -156,6 +156,7 @@ }, "// 2": "devDependencies are not used under Bazel. Many can be removed after test.sh is deleted.", "devDependencies": { + "@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", diff --git a/packages/zone.js/yarn.lock b/packages/zone.js/yarn.lock index b2b1e42388ac..a861994ee43a 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.0", "@babel/code-frame@^7.26.2": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.9", "@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== @@ -25,27 +25,27 @@ integrity sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg== "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": - 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== + 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.0" - "@babel/generator" "^7.26.0" - "@babel/helper-compilation-targets" "^7.25.9" + "@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.0" - "@babel/parser" "^7.26.0" + "@babel/helpers" "^7.26.7" + "@babel/parser" "^7.26.7" "@babel/template" "^7.25.9" - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.26.0" + "@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.0", "@babel/generator@^7.26.5", "@babel/generator@^7.7.2": +"@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== @@ -56,7 +56,7 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" -"@babel/helper-compilation-targets@^7.25.9": +"@babel/helper-compilation-targets@^7.26.5": version "7.26.5" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz#75d92bb8d8d51301c0d49e52a65c9a7fe94514d8" integrity sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA== @@ -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.0": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4" - integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw== +"@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.0" + "@babel/types" "^7.26.7" -"@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.0", "@babel/parser@^7.26.5": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.5.tgz#6fec9aebddef25ca57a935c86dbb915ae2da3e1f" - integrity sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw== +"@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== dependencies: - "@babel/types" "^7.26.5" + "@babel/types" "^7.26.7" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -247,23 +247,23 @@ "@babel/parser" "^7.25.9" "@babel/types" "^7.25.9" -"@babel/traverse@^7.25.9": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.5.tgz#6d0be3e772ff786456c1a37538208286f6e79021" - integrity sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ== +"@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== dependencies: "@babel/code-frame" "^7.26.2" "@babel/generator" "^7.26.5" - "@babel/parser" "^7.26.5" + "@babel/parser" "^7.26.7" "@babel/template" "^7.25.9" - "@babel/types" "^7.26.5" + "@babel/types" "^7.26.7" 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.0", "@babel/types@^7.26.5", "@babel/types@^7.3.3": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.5.tgz#7a1e1c01d28e26d1fe7f8ec9567b3b92b9d07747" - integrity sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg== +"@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== 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.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.6.tgz#5c6795e71635876039f853cbccd59f523d9e4239" - integrity sha512-qNiuwC4ZDAUNcY47xgaSuS92cjf8JbSUoaKS77bmLG1rU7MlATVSiw/IlrjtIyyskXBZ8KkNfjK/P5na7rgXbQ== + 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== 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.30001692" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz#4585729d95e6b95be5b439da6ab55250cd125bf9" - integrity sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A== + version "1.0.30001695" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz#39dfedd8f94851132795fdf9b79d29659ad9c4d4" + integrity sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw== chalk@4.x, chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" @@ -937,15 +937,6 @@ cjs-module-lexer@^1.0.0: 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== -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" @@ -1084,9 +1075,9 @@ decamelize@^4.0.0: integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== decimal.js@^10.4.2: - version "10.4.3" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" - integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + version "10.5.0" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.5.0.tgz#0f371c7cf6c4898ce0afb09836db73cd82010f22" + integrity sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw== dedent@^1.0.0: version "1.5.3" @@ -1135,9 +1126,9 @@ eastasianwidth@^0.2.0: integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== electron-to-chromium@^1.5.73: - version "1.5.82" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.82.tgz#b9116ac6d6b6346c2baa49f14c1272ba2ce1ccdb" - integrity sha512-Zq16uk1hfQhyGx5GpwPAYDwddJuSGhtRhgOA2mCxANYaDT79nAeGnaXogMGng4KqLaJUVnOnuL0+TDop9nLOiA== + 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== emittery@^0.13.1: version "0.13.1" @@ -2197,9 +2188,9 @@ minimist@1.x: integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== mocha@^11.0.0: - version "11.0.1" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-11.0.1.tgz#85c1c0e806275fe2479245be4ac4a0d81f533aa8" - integrity sha512-+3GkODfsDG71KSCQhc4IekSW+ItCK/kiez1Z28ksWvYhKXV/syxMlerR/sC7whDp7IyreZ4YxceMLdTs5hQE8A== + version "11.1.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-11.1.0.tgz#20d7c6ac4d6d6bcb60a8aa47971fca74c65c3c66" + integrity sha512-8uJR5RTC2NgpY3GrYcgpZrsEd9zKbPDpob1RezyR2upGHRQtHWofmzTMzTMSV6dru3tj5Ukt0+Vnq1qhFEEwAg== dependencies: ansi-colors "^4.1.3" browser-stdout "^1.3.1" @@ -2218,8 +2209,8 @@ mocha@^11.0.0: strip-json-comments "^3.1.1" supports-color "^8.1.1" workerpool "^6.5.1" - yargs "^16.2.0" - yargs-parser "^20.2.9" + yargs "^17.7.2" + yargs-parser "^21.1.1" yargs-unparser "^2.0.0" mock-require@3.0.3: @@ -2946,11 +2937,6 @@ yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yargs-parser@^20.2.2, yargs-parser@^20.2.9: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" @@ -2966,20 +2952,7 @@ yargs-unparser@^2.0.0: flat "^5.0.2" is-plain-obj "^2.1.0" -yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - 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" - -yargs@^17.3.1: +yargs@^17.3.1, yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== diff --git a/yarn.lock b/yarn.lock index 45510d866b93..22c589779c83 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.19.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@algolia/client-abtesting/-/client-abtesting-5.19.0.tgz#0a6e73da05decc8f1bbcd7e5b9a82a8d876e7bf5" - integrity sha512-dMHwy2+nBL0SnIsC1iHvkBao64h4z+roGelOz11cxrDBrAdASxLxmfVMop8gmodQ2yZSacX0Rzevtxa+9SqxCw== - dependencies: - "@algolia/client-common" "5.19.0" - "@algolia/requester-browser-xhr" "5.19.0" - "@algolia/requester-fetch" "5.19.0" - "@algolia/requester-node-http" "5.19.0" - -"@algolia/client-analytics@5.19.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-5.19.0.tgz#45e33343fd4517e05a340a97bb37bebb4466000e" - integrity sha512-CDW4RwnCHzU10upPJqS6N6YwDpDHno7w6/qXT9KPbPbt8szIIzCHrva4O9KIfx1OhdsHzfGSI5hMAiOOYl4DEQ== - dependencies: - "@algolia/client-common" "5.19.0" - "@algolia/requester-browser-xhr" "5.19.0" - "@algolia/requester-fetch" "5.19.0" - "@algolia/requester-node-http" "5.19.0" - -"@algolia/client-common@5.19.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-5.19.0.tgz#efddaaf28f0f478117c2aab22d19c99b06f99761" - integrity sha512-2ERRbICHXvtj5kfFpY5r8qu9pJII/NAHsdgUXnUitQFwPdPL7wXiupcvZJC7DSntOnE8AE0lM7oDsPhrJfj5nQ== - -"@algolia/client-insights@5.19.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@algolia/client-insights/-/client-insights-5.19.0.tgz#81ff8eb3df724f6dd8ea3f423966b9ef7d36f903" - integrity sha512-xPOiGjo6I9mfjdJO7Y+p035aWePcbsItizIp+qVyfkfZiGgD+TbNxM12g7QhFAHIkx/mlYaocxPY/TmwPzTe+A== - dependencies: - "@algolia/client-common" "5.19.0" - "@algolia/requester-browser-xhr" "5.19.0" - "@algolia/requester-fetch" "5.19.0" - "@algolia/requester-node-http" "5.19.0" - -"@algolia/client-personalization@5.19.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-5.19.0.tgz#9a75230b9dec490a1e0851539a40a9371c8cd987" - integrity sha512-B9eoce/fk8NLboGje+pMr72pw+PV7c5Z01On477heTZ7jkxoZ4X92dobeGuEQop61cJ93Gaevd1of4mBr4hu2A== - dependencies: - "@algolia/client-common" "5.19.0" - "@algolia/requester-browser-xhr" "5.19.0" - "@algolia/requester-fetch" "5.19.0" - "@algolia/requester-node-http" "5.19.0" - -"@algolia/client-query-suggestions@5.19.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@algolia/client-query-suggestions/-/client-query-suggestions-5.19.0.tgz#007d1b09818d6a225fbfdf93bbcb2edf8ab17da0" - integrity sha512-6fcP8d4S8XRDtVogrDvmSM6g5g6DndLc0pEm1GCKe9/ZkAzCmM3ZmW1wFYYPxdjMeifWy1vVEDMJK7sbE4W7MA== - dependencies: - "@algolia/client-common" "5.19.0" - "@algolia/requester-browser-xhr" "5.19.0" - "@algolia/requester-fetch" "5.19.0" - "@algolia/requester-node-http" "5.19.0" - -"@algolia/client-search@5.19.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-5.19.0.tgz#04fc5d7e26d41c99144eb33eedb0ea6f9b1c0056" - integrity sha512-Ctg3xXD/1VtcwmkulR5+cKGOMj4r0wC49Y/KZdGQcqpydKn+e86F6l3tb3utLJQVq4lpEJud6kdRykFgcNsp8Q== - dependencies: - "@algolia/client-common" "5.19.0" - "@algolia/requester-browser-xhr" "5.19.0" - "@algolia/requester-fetch" "5.19.0" - "@algolia/requester-node-http" "5.19.0" - -"@algolia/ingestion@1.19.0": - version "1.19.0" - resolved "https://registry.yarnpkg.com/@algolia/ingestion/-/ingestion-1.19.0.tgz#b481bd2283866a1df18af9babba0ecb3f1d1d675" - integrity sha512-LO7w1MDV+ZLESwfPmXkp+KLeYeFrYEgtbCZG6buWjddhYraPQ9MuQWLhLLiaMlKxZ/sZvFTcZYuyI6Jx4WBhcg== - dependencies: - "@algolia/client-common" "5.19.0" - "@algolia/requester-browser-xhr" "5.19.0" - "@algolia/requester-fetch" "5.19.0" - "@algolia/requester-node-http" "5.19.0" - -"@algolia/monitoring@1.19.0": - version "1.19.0" - resolved "https://registry.yarnpkg.com/@algolia/monitoring/-/monitoring-1.19.0.tgz#abc85ac073c25233c7f8dae3000cc0821d582514" - integrity sha512-Mg4uoS0aIKeTpu6iv6O0Hj81s8UHagi5TLm9k2mLIib4vmMtX7WgIAHAcFIaqIZp5D6s5EVy1BaDOoZ7buuJHA== - dependencies: - "@algolia/client-common" "5.19.0" - "@algolia/requester-browser-xhr" "5.19.0" - "@algolia/requester-fetch" "5.19.0" - "@algolia/requester-node-http" "5.19.0" - -"@algolia/recommend@5.19.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-5.19.0.tgz#5898219e9457853c563eb527f0d1cbfcb8998c87" - integrity sha512-PbgrMTbUPlmwfJsxjFhal4XqZO2kpBNRjemLVTkUiti4w/+kzcYO4Hg5zaBgVqPwvFDNQ8JS4SS3TBBem88u+g== - dependencies: - "@algolia/client-common" "5.19.0" - "@algolia/requester-browser-xhr" "5.19.0" - "@algolia/requester-fetch" "5.19.0" - "@algolia/requester-node-http" "5.19.0" - -"@algolia/requester-browser-xhr@5.19.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.19.0.tgz#979a340a81a381214c0dbdd235b51204098e3b4a" - integrity sha512-GfnhnQBT23mW/VMNs7m1qyEyZzhZz093aY2x8p0era96MMyNv8+FxGek5pjVX0b57tmSCZPf4EqNCpkGcGsmbw== - dependencies: - "@algolia/client-common" "5.19.0" - -"@algolia/requester-fetch@5.19.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-fetch/-/requester-fetch-5.19.0.tgz#59fe52733a718fc23bde548b377b52baf7228993" - integrity sha512-oyTt8ZJ4T4fYvW5avAnuEc6Laedcme9fAFryMD9ndUTIUe/P0kn3BuGcCLFjN3FDmdrETHSFkgPPf1hGy3sLCw== - dependencies: - "@algolia/client-common" "5.19.0" - -"@algolia/requester-node-http@5.19.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-5.19.0.tgz#edbd58158d9dec774d608fbf2b2196d0ca4b257c" - integrity sha512-p6t8ue0XZNjcRiqNkb5QAM0qQRAKsCiebZ6n9JjWA+p8fWf8BvnhO55y2fO28g3GW0Imj7PrAuyBuxq8aDVQwQ== - dependencies: - "@algolia/client-common" "5.19.0" +"@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" "@ampproject/remapping@2.3.0", "@ampproject/remapping@^2.2.0": version "2.3.0" @@ -527,6 +527,17 @@ call-me-maybe "^1.0.1" js-yaml "^4.1.0" +"@asamuzakjp/css-color@^2.8.2": + version "2.8.3" + resolved "https://registry.yarnpkg.com/@asamuzakjp/css-color/-/css-color-2.8.3.tgz#665f0f5e8edb95d8f543847529e30fe5cc437ef7" + integrity sha512-GIc76d9UI1hCvOATjZPyHFmE5qhRccp3/zGfMPapK3jBi+yocEzp6BBB0UnfRYP9NP4FANqUZYb0hnfs3TM3hw== + dependencies: + "@csstools/css-calc" "^2.1.1" + "@csstools/css-color-parser" "^3.0.7" + "@csstools/css-parser-algorithms" "^3.0.4" + "@csstools/css-tokenizer" "^3.0.3" + lru-cache "^10.4.3" + "@babel/cli@7.26.4": version "7.26.4" resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.26.4.tgz#4101ff8ee5de8447a6c395397a97921056411d20" @@ -557,7 +568,7 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.5.tgz#df93ac37f4417854130e21d72c66ff3d4b897fc7" integrity sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg== -"@babel/core@7.26.0", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.23.9": +"@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== @@ -578,6 +589,27 @@ 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.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" @@ -596,7 +628,7 @@ dependencies: "@babel/types" "^7.25.9" -"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9": +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9", "@babel/helper-compilation-targets@^7.26.5": version "7.26.5" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz#75d92bb8d8d51301c0d49e52a65c9a7fe94514d8" integrity sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA== @@ -741,20 +773,20 @@ "@babel/traverse" "^7.25.9" "@babel/types" "^7.25.9" -"@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== +"@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.0" + "@babel/types" "^7.26.7" -"@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": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.5.tgz#6fec9aebddef25ca57a935c86dbb915ae2da3e1f" - integrity sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw== +"@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.5" + "@babel/types" "^7.26.7" "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": version "7.25.9" @@ -795,7 +827,7 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/traverse" "^7.25.9" -"@babel/plugin-proposal-async-generator-functions@^7.20.1": +"@babel/plugin-proposal-async-generator-functions@7.20.7", "@babel/plugin-proposal-async-generator-functions@^7.20.1": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== @@ -1201,11 +1233,11 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-typeof-symbol@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz#224ba48a92869ddbf81f9b4a5f1204bbf5a2bc4b" - integrity sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA== + 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== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.26.5" "@babel/plugin-transform-unicode-escapes@^7.25.9": version "7.25.9" @@ -1322,13 +1354,20 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/runtime@7.26.0", "@babel/runtime@^7.8.4": +"@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": + 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" @@ -1338,23 +1377,23 @@ "@babel/parser" "^7.25.9" "@babel/types" "^7.25.9" -"@babel/traverse@^7.25.9", "@babel/traverse@^7.26.5": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.5.tgz#6d0be3e772ff786456c1a37538208286f6e79021" - integrity sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ== +"@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.5" + "@babel/parser" "^7.26.7" "@babel/template" "^7.25.9" - "@babel/types" "^7.26.5" + "@babel/types" "^7.26.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.4.4": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.5.tgz#7a1e1c01d28e26d1fe7f8ec9567b3b92b9d07747" - integrity sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg== +"@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" @@ -1370,9 +1409,9 @@ integrity sha512-0f5eNWhylZQbiTddfVkIXKkugQadzZdonLw4ur58oK4X+gIHOZ42Xv94sepu8Di9UWKFXNc4zxuuTiWM22hGvw== "@bazel/buildifier@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@bazel/buildifier/-/buildifier-8.0.0.tgz#77a9f07d3dfad8b5f410513b8af371b63057cbb5" - integrity sha512-ur5DKaLK6vQjUUptxATC4TpsnBA2leqQDtqSF7qovbNuoCNzOfySJWMof1otT9ATW8ZsJfTFvNSYFRT8+LCVhw== + version "8.0.1" + resolved "https://registry.yarnpkg.com/@bazel/buildifier/-/buildifier-8.0.1.tgz#ddad9c35b1f2ac13fa294aa3dc9803d2942668a4" + integrity sha512-ioXkHJvteN33pFpSsI8zNij2QU4ZlvG4JBB/jxNkeLzU9FPsSY3SiMtxPCWkQj1THjsTtX1p+4bEd4HQNm28LA== "@bazel/concatjs@5.8.1": version "5.8.1" @@ -1640,6 +1679,34 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@csstools/color-helpers@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@csstools/color-helpers/-/color-helpers-5.0.1.tgz#829f1c76f5800b79c51c709e2f36821b728e0e10" + integrity sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA== + +"@csstools/css-calc@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@csstools/css-calc/-/css-calc-2.1.1.tgz#a7dbc66627f5cf458d42aed14bda0d3860562383" + integrity sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag== + +"@csstools/css-color-parser@^3.0.7": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@csstools/css-color-parser/-/css-color-parser-3.0.7.tgz#442d61d58e54ad258d52c309a787fceb33906484" + integrity sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA== + dependencies: + "@csstools/color-helpers" "^5.0.1" + "@csstools/css-calc" "^2.1.1" + +"@csstools/css-parser-algorithms@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz#74426e93bd1c4dcab3e441f5cc7ba4fb35d94356" + integrity sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A== + +"@csstools/css-tokenizer@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz#a5502c8539265fecbd873c1e395a890339f119c2" + integrity sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw== + "@dabh/diagnostics@^2.0.2": version "2.0.3" resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" @@ -1671,9 +1738,9 @@ fd-slicer2 "^1.2.0" "@electric-sql/pglite@^0.2.0": - version "0.2.15" - resolved "https://registry.yarnpkg.com/@electric-sql/pglite/-/pglite-0.2.15.tgz#c9535b50f311baa317ed7ba0113e2fdc0139e045" - integrity sha512-Jiq31Dnk+rg8rMhcSxs4lQvHTyizNo5b269c1gCC3ldQ0sCLrNVPGzy+KnmonKy1ZArTUuXZf23/UamzFMKVaA== + version "0.2.16" + resolved "https://registry.yarnpkg.com/@electric-sql/pglite/-/pglite-0.2.16.tgz#df586341c8143ea997db0e51aae30c2dc1a634fa" + integrity sha512-dCSHpoOKuTxecaYhWDRp2yFTN3XWcMPMrBVl5yOR8VZEUprz4+R3iuU7BipmlsqBnBDO/6l9H/C2ZwJdunkWyw== "@esbuild/aix-ppc64@0.23.1": version "0.23.1" @@ -1926,9 +1993,9 @@ integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== "@google-cloud/cloud-sql-connector@^1.3.3": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@google-cloud/cloud-sql-connector/-/cloud-sql-connector-1.5.0.tgz#1c2dfb9275ee9e7ccb5c1109a3b49ab1ec9ff1ff" - integrity sha512-uI4CzMLb7Sc2WjTohB5wt+5j6kWBUqKLRzJrPfPer8A4sz7yyqUfyOFI2CKap4eRIAtSnVX4WapcNqziX3pBSg== + version "1.6.0" + resolved "https://registry.yarnpkg.com/@google-cloud/cloud-sql-connector/-/cloud-sql-connector-1.6.0.tgz#3ab3d4a4ce18077cd2cae118cfdf7cffaa7c51d6" + integrity sha512-YkgPaxHbWRjp8YS7OCZAGge4qwX/pwFKT/cxKxV5PYyeS4CbaY6URF2f5Lo6Pabn6bs2AxwjB/SA9UeCdLbj7A== dependencies: "@googleapis/sqladmin" "^24.0.0" gaxios "^6.1.1" @@ -2352,9 +2419,9 @@ integrity sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA== "@lezer/css@^1.1.0", "@lezer/css@^1.1.7": - version "1.1.9" - resolved "https://registry.yarnpkg.com/@lezer/css/-/css-1.1.9.tgz#404563d361422c5a1fe917295f1527ee94845ed1" - integrity sha512-TYwgljcDv+YrV0MZFFvYFQHCfGgbPMR6nuqLabBdmZoFH3EP1gvw8t0vae326Ne3PszQkbXfVBjCnf3ZVCr0bA== + version "1.1.10" + resolved "https://registry.yarnpkg.com/@lezer/css/-/css-1.1.10.tgz#99cef68b26bfdefb76e269b9ee13b0de28edd8ed" + integrity sha512-V5/89eDapjeAkWPBpWEfQjZ1Hag3aYUUJOL8213X0dFRuXJ4BXa5NKl9USzOnaLod4AOpmVCkduir2oKwZYZtg== dependencies: "@lezer/common" "^1.2.0" "@lezer/highlight" "^1.0.0" @@ -2721,17 +2788,17 @@ integrity sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA== "@npmcli/package-json@^6.0.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-6.1.0.tgz#34f0875da178b04df1a7746c02bdc26479819afb" - integrity sha512-t6G+6ZInT4X+tqj2i+wlLIeCKnKOTuz9/VFYDtj+TGTur5q7sp/OYrQA19LdBbWfXDOi0Y4jtedV6xtB8zQ9ug== + version "6.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-6.1.1.tgz#78ff92d138fdcb85f31cab907455d5db96d017cb" + integrity sha512-d5qimadRAUCO4A/Txw71VM7UrRZzV+NPclxz/dc+M6B2oYwjWTjqh8HA/sGQgs9VZuJ6I/P7XIAlJvgrl27ZOw== dependencies: "@npmcli/git" "^6.0.0" glob "^10.2.2" hosted-git-info "^8.0.0" json-parse-even-better-errors "^4.0.0" - normalize-package-data "^7.0.0" proc-log "^5.0.0" semver "^7.5.3" + validate-npm-package-license "^3.0.4" "@npmcli/promise-spawn@^8.0.0": version "8.0.2" @@ -2897,9 +2964,9 @@ universal-user-agent "^6.0.0" "@octokit/request@^9.1.4": - version "9.1.4" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-9.1.4.tgz#c1e90bd57c3113253d27337c92609b8fed54d13b" - integrity sha512-tMbOwGm6wDII6vygP3wUVqFTw3Aoo0FnVQyhihh8vVq12uO3P+vQZeo2CKMpWtPSogpACD0yyZAlVlQnjW71DA== + version "9.2.0" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-9.2.0.tgz#21aa1e72ff645f5b99ccf4a590cc33c4578bb356" + integrity sha512-kXLfcxhC4ozCnAXy2ff+cSxpcF0A1UqxjvYMqNuPIeOAzJbVWQ+dy5G2fTylofB/gTbObT8O6JORab+5XtA1Kw== dependencies: "@octokit/endpoint" "^10.0.0" "@octokit/request-error" "^6.0.1" @@ -3201,6 +3268,11 @@ 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-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" @@ -3211,6 +3283,11 @@ 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-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" @@ -3221,6 +3298,11 @@ 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-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" @@ -3231,6 +3313,11 @@ 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-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" @@ -3241,6 +3328,11 @@ 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-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" @@ -3251,6 +3343,11 @@ 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-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" @@ -3261,6 +3358,11 @@ 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-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" @@ -3271,6 +3373,11 @@ 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-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" @@ -3281,6 +3388,11 @@ 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-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" @@ -3291,6 +3403,11 @@ 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-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" @@ -3301,6 +3418,11 @@ 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-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" @@ -3311,6 +3433,11 @@ 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-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" @@ -3321,6 +3448,11 @@ 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-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" @@ -3331,6 +3463,11 @@ 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-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" @@ -3341,6 +3478,11 @@ 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-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" @@ -3351,6 +3493,11 @@ 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-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" @@ -3361,6 +3508,11 @@ 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-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" @@ -3371,6 +3523,11 @@ 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-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" @@ -3381,6 +3538,11 @@ 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== + "@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" @@ -3430,53 +3592,53 @@ "@angular-devkit/schematics" "19.2.0-next.0" jsonc-parser "3.3.1" -"@shikijs/core@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-2.0.0.tgz#e3e7cce8fc7cc03e0fca7d024d0ad8e3a2c26e85" - integrity sha512-BXodyV73f46j8wcwjP5xn7TQ6Ts3puE65lDREfN+DikZWW3/clDduoopGwQi4F7T9agar41G24BLtH3HUT64KQ== +"@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== dependencies: - "@shikijs/engine-javascript" "2.0.0" - "@shikijs/engine-oniguruma" "2.0.0" - "@shikijs/types" "2.0.0" + "@shikijs/engine-javascript" "2.1.0" + "@shikijs/engine-oniguruma" "2.1.0" + "@shikijs/types" "2.1.0" "@shikijs/vscode-textmate" "^10.0.1" "@types/hast" "^3.0.4" hast-util-to-html "^9.0.4" -"@shikijs/engine-javascript@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@shikijs/engine-javascript/-/engine-javascript-2.0.0.tgz#919addbd270bed14170f297c0a8cb41bfbf59aeb" - integrity sha512-ZpnBGCRLk6cjvtH+G6ljX6ajcErahx65F4IAm+9rGepYRvD3/jj6taSW8jevb7umzFxTUPXZxytf+ZBx/c5rVQ== +"@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== dependencies: - "@shikijs/types" "2.0.0" + "@shikijs/types" "2.1.0" "@shikijs/vscode-textmate" "^10.0.1" - oniguruma-to-es "^2.2.0" + oniguruma-to-es "^2.3.0" -"@shikijs/engine-oniguruma@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-2.0.0.tgz#87c83803a9002f5125163d30280c9347801749a6" - integrity sha512-X6LdTRXoT37uE/9Y6j7oNtWMMFR6cVrlsHAoQG3srhYcdcrmBm33FdfRRfWeCVlZRAeCHVuWaFmYBWeCTWVN+A== +"@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== dependencies: - "@shikijs/types" "2.0.0" + "@shikijs/types" "2.1.0" "@shikijs/vscode-textmate" "^10.0.1" -"@shikijs/langs@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@shikijs/langs/-/langs-2.0.0.tgz#dc4398e4438a617cc72f50dfbdd90693f8a981ab" - integrity sha512-xelmNcbbIiX3BO446OgsJcugf5tF9u+4N7V6Wws9XjZoe3qCE0dYtfkHXZiVDdciemI/1QnFeTo+AjPw2fD42w== +"@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== dependencies: - "@shikijs/types" "2.0.0" + "@shikijs/types" "2.1.0" -"@shikijs/themes@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@shikijs/themes/-/themes-2.0.0.tgz#69165878be98f3a72e6e6a9425ba5a3b75ea53e2" - integrity sha512-2v7PjBlTEcYhj96/WW4t4VhMmIR/0DhuKqZzWcPFG+w2RG3EaIiGfQYf9w+NvFYZ8uF7ianO8vxrjIVpDKnglw== +"@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== dependencies: - "@shikijs/types" "2.0.0" + "@shikijs/types" "2.1.0" -"@shikijs/types@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-2.0.0.tgz#eb5d6d483334aa8453d76afee734258c4d577511" - integrity sha512-2gQ9V3NoGE4R1d0pGnsNF0PLStBu7GsJdJdS6H/YbzuTRVjv6cado9slh3sG4KMZBhJPFh7EC8+iIKuyHfNDvA== +"@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== dependencies: "@shikijs/vscode-textmate" "^10.0.1" "@types/hast" "^3.0.4" @@ -3576,10 +3738,10 @@ dependencies: "@ts-graphviz/common" "^2.1.5" -"@ts-graphviz/ast@^2.0.6": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@ts-graphviz/ast/-/ast-2.0.6.tgz#d027b011934f9b933f7f9ba4f3ec712447cc14c2" - integrity sha512-JbOnw6+Pm+C9jRQlNV+qJG0/VTan4oCeZ0sClm++SjaaMBJ0q86O13i6wbcWKY2x8kKt9GP2hVCgM/p/BXtXWQ== +"@ts-graphviz/ast@^2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@ts-graphviz/ast/-/ast-2.0.7.tgz#4ec33492e4b4e998d4632030e97a9f7e149afb86" + integrity sha512-e6+2qtNV99UT6DJSoLbHfkzfyqY84aIuoV8Xlb9+hZAjgpum8iVHprGeAMQ4rF6sKUAxrmY8rfF/vgAwoPc3gw== dependencies: "@ts-graphviz/common" "^2.1.5" @@ -3588,12 +3750,12 @@ resolved "https://registry.yarnpkg.com/@ts-graphviz/common/-/common-2.1.5.tgz#a256dfaea009a5b147d8f73f25e57fb44f6462a2" integrity sha512-S6/9+T6x8j6cr/gNhp+U2olwo1n0jKj/682QVqsh7yXWV6ednHYqxFw0ZsY3LyzT0N8jaZ6jQY9YD99le3cmvg== -"@ts-graphviz/core@^2.0.6": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@ts-graphviz/core/-/core-2.0.6.tgz#a9728dacd2e78c873079956bf46a23e2edcde50c" - integrity sha512-0hvrluFirC0ph3Dn2o1B0O1fI2n7Hre1HlScfmRcO6DDDq/05Vizg5UMI0LfvkJulLuz80RPjUHluh+QfBUBKw== +"@ts-graphviz/core@^2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@ts-graphviz/core/-/core-2.0.7.tgz#2185e390990038b267a2341c3db1cef3680bbee8" + integrity sha512-w071DSzP94YfN6XiWhOxnLpYT3uqtxJBDYdh6Jdjzt+Ce6DNspJsPQgpC7rbts/B8tEkq0LHoYuIF/O5Jh5rPg== dependencies: - "@ts-graphviz/ast" "^2.0.6" + "@ts-graphviz/ast" "^2.0.7" "@ts-graphviz/common" "^2.1.5" "@tsconfig/node10@^1.0.7": @@ -3762,11 +3924,6 @@ resolved "https://registry.yarnpkg.com/@types/convert-source-map/-/convert-source-map-2.0.3.tgz#e586c22ca4af2d670d47d32d7fe365d5c5558695" integrity sha512-ag0BfJLZf6CQz8VIuRIEYQ5Ggwk/82uvTQf27RcpyDNbY0Vw49LIPqAxk5tqYfrCs9xDaIMvl4aj7ZopnYL8bA== -"@types/cookie@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" - integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== - "@types/cors@^2.8.12": version "2.8.17" resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.17.tgz#5d718a5e494a8166f569d986794e49c48b216b2b" @@ -4028,9 +4185,9 @@ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.4.tgz#88c29e3052cec3536d64b6ce5015a30dfcbefca7" - integrity sha512-5kz9ScmzBdzTgB/3susoCgfqNDzBjvLL4taparufgSvlwjdLy6UyUy9T/tCpYd2GIdIilCatC4iSQS0QSYHt0w== + 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== dependencies: "@types/node" "*" "@types/qs" "*" @@ -4080,9 +4237,9 @@ integrity sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g== "@types/geojson@*": - version "7946.0.15" - resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.15.tgz#f9d55fd5a0aa2de9dc80b1b04e437538b7298868" - integrity sha512-9oSxFzDCT2Rj6DfcHF8G++jxBKS7mBqXl5xrRW+Kbvjry6Uduya2iiwqHPhVXpasAVMBYKkEPGgKhd3+/HZ6xA== + version "7946.0.16" + resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.16.tgz#8ebe53d69efada7044454e3305c19017d97ced2a" + integrity sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg== "@types/glob@~7.2.0": version "7.2.0" @@ -4216,9 +4373,9 @@ "@types/node" "*" "@types/node@*", "@types/node@>=10.0.0", "@types/node@>=13.7.0": - version "22.10.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.6.tgz#5c6795e71635876039f853cbccd59f523d9e4239" - integrity sha512-qNiuwC4ZDAUNcY47xgaSuS92cjf8JbSUoaKS77bmLG1rU7MlATVSiw/IlrjtIyyskXBZ8KkNfjK/P5na7rgXbQ== + 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== dependencies: undici-types "~6.20.0" @@ -4233,9 +4390,9 @@ integrity sha512-1RWYiq+5UfozGsU6MwJyFX6BtktcT10XRjvcAQmskCtMcW3tPske88lM/nHv7BQG1w9KBXI1zPGuu5PnNCX14g== "@types/node@^18.11.18", "@types/node@^18.19.21": - version "18.19.70" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.70.tgz#5a77508f5568d16fcd3b711c8102d7a430a04df7" - integrity sha512-RE+K0+KZoEpDUbGGctnGdkrLFwi1eYKTlIHNl2Um98mUkGsm1u2Ff6Ltd0e8DktTtC98uy7rSj+hO8t/QuLoVQ== + version "18.19.74" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.74.tgz#4d093acd2a558ebbc5f0efa4e20ce63791b0cc58" + integrity sha512-HMwEkkifei3L605gFdV+/UwtpxP6JSzM+xFk2Ia6DNFSwSVBRh9qp5Tgf4lNFOMfPVuU0WnkcWpXZpgn5ufO4A== dependencies: undici-types "~5.26.4" @@ -4437,7 +4594,14 @@ resolved "https://registry.yarnpkg.com/@types/which/-/which-1.3.2.tgz#9c246fc0c93ded311c8512df2891fb41f6227fdf" integrity sha512-8oDqyLC7eD4HM307boe2QWKyuzdzWBj56xI/imSl2cpL+U3tCMaTAkMJ4ee5JBZ/FsOJlvRGeIShiZDAl1qERA== -"@types/ws@*", "@types/ws@8.5.13", "@types/ws@^8.5.10": +"@types/ws@*", "@types/ws@^8.5.10": + version "8.5.14" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.14.tgz#93d44b268c9127d96026cf44353725dd9b6c3c21" + integrity sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw== + dependencies: + "@types/node" "*" + +"@types/ws@8.5.13": version "8.5.13" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.13.tgz#6414c280875e2691d0d1e080b05addbf5cb91e20" integrity sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA== @@ -4498,9 +4662,9 @@ debug "^4.1.1" "@ungap/structured-clone@^1.0.0": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.1.tgz#28fa185f67daaf7b7a1a8c1d445132c5d979f8bd" - integrity sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA== + version "1.3.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" + integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== "@vitejs/plugin-basic-ssl@1.2.0": version "1.2.0" @@ -4526,7 +4690,7 @@ "@vue/compiler-core" "3.5.13" "@vue/shared" "3.5.13" -"@vue/compiler-sfc@^3.5.12": +"@vue/compiler-sfc@^3.5.13": version "3.5.13" resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz#461f8bd343b5c06fac4189c4fef8af32dea82b46" integrity sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ== @@ -4753,6 +4917,11 @@ abbrev@^2.0.0: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf" integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== +abbrev@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-3.0.0.tgz#c29a6337e167ac61a84b41b80461b29c5c271a27" + integrity sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA== + abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" @@ -4854,7 +5023,7 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" -ajv@8.17.1, ajv@^8.0.0, ajv@^8.3.0, ajv@^8.9.0: +ajv@8.17.1, ajv@^8.0.0, ajv@^8.17.1, ajv@^8.3.0, ajv@^8.9.0: version "8.17.1" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== @@ -4864,7 +5033,7 @@ ajv@8.17.1, ajv@^8.0.0, ajv@^8.3.0, ajv@^8.9.0: json-schema-traverse "^1.0.0" require-from-string "^2.0.2" -ajv@^6.12.3, ajv@^6.12.5, ajv@^6.12.6: +ajv@^6.12.3, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -4895,23 +5064,23 @@ ajv@~8.13.0: uri-js "^4.4.1" algoliasearch@^5.0.0: - version "5.19.0" - resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-5.19.0.tgz#2a1490bb46a937515797fac30b2d1503fb028536" - integrity sha512-zrLtGhC63z3sVLDDKGW+SlCRN9eJHFTgdEmoAOpsVh6wgGL1GgTTDou7tpCBjevzgIvi3AIyDAQO3Xjbg5eqZg== - dependencies: - "@algolia/client-abtesting" "5.19.0" - "@algolia/client-analytics" "5.19.0" - "@algolia/client-common" "5.19.0" - "@algolia/client-insights" "5.19.0" - "@algolia/client-personalization" "5.19.0" - "@algolia/client-query-suggestions" "5.19.0" - "@algolia/client-search" "5.19.0" - "@algolia/ingestion" "1.19.0" - "@algolia/monitoring" "1.19.0" - "@algolia/recommend" "5.19.0" - "@algolia/requester-browser-xhr" "5.19.0" - "@algolia/requester-fetch" "5.19.0" - "@algolia/requester-node-http" "5.19.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" "angular-1.5@npm:angular@1.5": version "1.5.11" @@ -5314,6 +5483,11 @@ async-each@^1.0.1: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.6.tgz#52f1d9403818c179b7561e11a5d1b77eb2160e77" integrity sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg== +async-function@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" + integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== + async-lock@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/async-lock/-/async-lock-1.4.1.tgz#56b8718915a9b68b10fce2f2a9a3dddf765ef53f" @@ -5438,31 +5612,31 @@ bare-events@^2.0.0, bare-events@^2.2.0: resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.5.4.tgz#16143d435e1ed9eafd1ab85f12b89b3357a41745" integrity sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA== -bare-fs@^2.1.1: - version "2.3.5" - resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-2.3.5.tgz#05daa8e8206aeb46d13c2fe25a2cd3797b0d284a" - integrity sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw== +bare-fs@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-4.0.1.tgz#85844f34da819c76754d545323a8b23ed3617c76" + integrity sha512-ilQs4fm/l9eMfWY2dY0WCIUplSUp7U0CT1vrqMg1MUdeZl4fypu5UP0XcDBK5WBQPJAKP1b7XEodISmekH/CEg== dependencies: bare-events "^2.0.0" - bare-path "^2.0.0" + bare-path "^3.0.0" bare-stream "^2.0.0" -bare-os@^2.1.0: - version "2.4.4" - resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-2.4.4.tgz#01243392eb0a6e947177bb7c8a45123d45c9b1a9" - integrity sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ== +bare-os@^3.0.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-3.4.0.tgz#97be31503f3095beb232a6871f0118859832eb0c" + integrity sha512-9Ous7UlnKbe3fMi7Y+qh0DwAup6A1JkYgPnjvMDNOlmnxNRQvQ/7Nst+OnUQKzk0iAT0m9BisbDVp9gCv8+ETA== -bare-path@^2.0.0, bare-path@^2.1.0: - version "2.1.3" - resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-2.1.3.tgz#594104c829ef660e43b5589ec8daef7df6cedb3e" - integrity sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA== +bare-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-3.0.0.tgz#b59d18130ba52a6af9276db3e96a2e3d3ea52178" + integrity sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw== dependencies: - bare-os "^2.1.0" + bare-os "^3.0.1" bare-stream@^2.0.0: - version "2.6.3" - resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.6.3.tgz#de1110df3b2374109cd88e01fa4a0cffc82efd64" - integrity sha512-AiqV593yTkEU3Lka0Sn+UT8X8U5hZ713RHa5Dg88GtJRite8TeD0oBOESNY6LnaBXTK0LjAW82OVhws+7L4JGA== + version "2.6.4" + resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.6.4.tgz#4226bc8ec7b3ff2c17087385326909978747b149" + integrity sha512-G6i3A74FjNq4nVrrSTUz5h3vgXzBJnjmWAVlBWaZETkgu+LgKd7AiyOml3EDJY1AHlIbBHKDXE+TUT53Ff8OaA== dependencies: streamx "^2.21.0" @@ -6004,9 +6178,9 @@ camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001688: - version "1.0.30001692" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz#4585729d95e6b95be5b439da6ab55250cd125bf9" - integrity sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A== + version "1.0.30001695" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz#39dfedd8f94851132795fdf9b79d29659ad9c4d4" + integrity sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw== canonical-path@1.0.0: version "1.0.0" @@ -6225,18 +6399,10 @@ 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@0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.11.0.tgz#9c3c42ee7b42d8448e9fce8d649dc8bfbcc31153" - integrity sha512-6CJWHkNRoyZyjV9Rwv2lYONZf1Xm0IuDyNq97nwSsxxP3wf5Bwy15K5rOvVKMtJ127jJBmxFUanSAOjgFRxgrA== - dependencies: - mitt "3.0.1" - zod "3.23.8" - -chromium-bidi@0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.12.0.tgz#f4a34a821151086a7fe97f6d537819cefcf66820" - integrity sha512-xzXveJmX826GGq1MeE5okD8XxaDT8172CXByhFJ687eY65rbjOIebdbUuQh+jXKaNyGKI14Veb3KjLLmSueaxA== +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== dependencies: mitt "3.0.1" zod "3.24.1" @@ -6846,10 +7012,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@~0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" - integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== +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== copy-anything@^2.0.1: version "2.0.6" @@ -6973,25 +7139,14 @@ crelt@^1.0.5: resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.6.tgz#7cc898ea74e190fb6ef9dae57f8f81cf7302df72" integrity sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g== -cross-env@^5.1.3: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.2.1.tgz#b2c76c1ca7add66dc874d11798466094f551b34d" - integrity sha512-1yHhtcfAd1r4nwQgknowuUNfIT9E8dOMMspC36g45dN+iD1blloi7xp8X/xAIDnjHWyt1uQ8PHk2fkNaym7soQ== - dependencies: - cross-spawn "^6.0.5" - -cross-spawn@^6.0.5: - version "6.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.6.tgz#30d0efa0712ddb7eb5a76e1e8721bffafa6b5d57" - integrity sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw== +cross-env@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" + cross-spawn "^7.0.1" -cross-spawn@^7.0.0, cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.3, cross-spawn@^7.0.5: version "7.0.6" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== @@ -7051,11 +7206,12 @@ cssesc@^3.0.0: integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== cssstyle@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-4.1.0.tgz#161faee382af1bafadb6d3867a92a19bcb4aea70" - integrity sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA== + version "4.2.1" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-4.2.1.tgz#5142782410fea95db66fb68147714a652a7c2381" + integrity sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw== dependencies: - rrweb-cssom "^0.7.1" + "@asamuzakjp/css-color" "^2.8.2" + rrweb-cssom "^0.8.0" csv-parse@^5.0.4: version "5.6.0" @@ -7463,9 +7619,9 @@ decamelize@^1.2.0: integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decimal.js@^10.4.3: - version "10.4.3" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" - integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + version "10.5.0" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.5.0.tgz#0f371c7cf6c4898ce0afb09836db73cd82010f22" + integrity sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw== decode-uri-component@^0.2.0, decode-uri-component@^0.2.2: version "0.2.2" @@ -7730,12 +7886,12 @@ detective-typescript@^13.0.0: node-source-walk "^7.0.0" detective-vue2@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detective-vue2/-/detective-vue2-2.1.0.tgz#d8744e1d19aa4dcabc2ff9dcce4fbd8adfe3d12b" - integrity sha512-IHQVhwk7dKaJ+GHBsL27mS9NRO1/vLZJPSODqtJgKquij0/UL8NvrbXbADbYeTkwyh1ReW/v9u9IRyEO5dvGZg== + 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== dependencies: "@dependents/detective-less" "^5.0.0" - "@vue/compiler-sfc" "^3.5.12" + "@vue/compiler-sfc" "^3.5.13" detective-es6 "^5.0.0" detective-sass "^6.0.0" detective-scss "^5.0.0" @@ -7754,10 +7910,10 @@ devlop@^1.0.0: dependencies: dequal "^2.0.0" -devtools-protocol@0.0.1367902: - version "0.0.1367902" - resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1367902.tgz#7333bfc4466c5a54a4c6de48a9dfbcb4b811660c" - integrity sha512-XxtPuC3PGakY6PD7dG66/o8KwJ/LkH2/EKe19Dcw58w53dv4/vSQEkn/SzuyhHE2q4zPgCkxQBxus3VV4ql+Pg== +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.818844: version "0.0.818844" @@ -7977,9 +8133,9 @@ ee-first@1.1.1: integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.5.73: - version "1.5.82" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.82.tgz#b9116ac6d6b6346c2baa49f14c1272ba2ce1ccdb" - integrity sha512-Zq16uk1hfQhyGx5GpwPAYDwddJuSGhtRhgOA2mCxANYaDT79nAeGnaXogMGng4KqLaJUVnOnuL0+TDop9nLOiA== + 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== emoji-regex-xs@^1.0.0: version "1.0.0" @@ -8046,9 +8202,9 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1, end-of-stream@ once "^1.4.0" engine.io-client@~6.6.1: - version "6.6.2" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.6.2.tgz#e0a09e1c90effe5d6264da1c56d7281998f1e50b" - integrity sha512-TAr+NKeoVTjEVW8P3iHguO1LO6RlUz9O5Y8o7EY0fU+gY1NYqas7NN3slpFtbXEsLMHk0h90fJMfKjRkQ0qUIw== + version "6.6.3" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.6.3.tgz#815393fa24f30b8e6afa8f77ccca2f28146be6de" + integrity sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w== dependencies: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" @@ -8062,16 +8218,15 @@ engine.io-parser@~5.2.1: integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q== engine.io@~6.6.0: - version "6.6.2" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.6.2.tgz#32bd845b4db708f8c774a4edef4e5c8a98b3da72" - integrity sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw== + version "6.6.3" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.6.3.tgz#a2ec69f72bf17c709ed832868bf17eb1a80a6470" + integrity sha512-2hkLItQMBkoYSagneiisupWGvsQlWXqzhSMvsjaM8GYbnfUsX7tzYQq9QARnate5LRedVTX+MbkSZAANAr3NtQ== 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.7.2" + cookie "~1.0.2" cors "~2.8.5" debug "~4.3.1" engine.io-parser "~5.2.1" @@ -8202,9 +8357,9 @@ es-module-lexer@^1.2.1: integrity sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ== es-object-atoms@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.0.tgz#095de9ecceeb2ca79668212b60ead450ffd323bf" - integrity sha512-Ujz8Al/KfOVR7fkaghAB1WvnLsdYxHDWmfoi2vlA2jZWRg31XhIC1a4B+/I24muD8iSbHxJ1JkrfqmWb65P/Mw== + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== dependencies: es-errors "^1.3.0" @@ -8656,9 +8811,9 @@ fast-levenshtein@^3.0.0: fastest-levenshtein "^1.0.7" fast-uri@^3.0.1: - version "3.0.5" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.5.tgz#19f5f9691d0dab9b85861a7bb5d98fca961da9cd" - integrity sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q== + version "3.0.6" + 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" @@ -8701,9 +8856,9 @@ fd-slicer@~1.1.0: pend "~1.2.0" fdir@^6.2.0: - version "6.4.2" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.2.tgz#ddaa7ce1831b161bc3657bb99cb36e1622702689" - integrity sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ== + version "6.4.3" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.3.tgz#011cdacf837eca9b811c89dbb902df714273db72" + integrity sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw== fecha@^4.2.0: version "4.2.3" @@ -8876,15 +9031,16 @@ fined@^2.0.0: parse-filepath "^1.0.2" firebase-tools@^13.0.0: - version "13.29.1" - resolved "https://registry.yarnpkg.com/firebase-tools/-/firebase-tools-13.29.1.tgz#fc373ad624c1cb48d053ec22a1b38ed7ea89eb08" - integrity sha512-fFiUF9KNdVPzcQKHqtewTzQNsjm6GrvCyVyXiIDiiUFO9zIEmM6m4sI/Y9cKg8dknCTsqr0D4cNv2d6AoUaeWg== + version "13.29.2" + resolved "https://registry.yarnpkg.com/firebase-tools/-/firebase-tools-13.29.2.tgz#30e6a22da541448eb8182eb40e0e39a1e5e4bcdf" + integrity sha512-6P4PR4TcrATPI+ut0qhh7gW3GJ0HYaLC2Fr5lesAXkrdAYw7OvOGDzXaRFuORwkCS5grVQuCcJVSsVbjXKAkew== dependencies: "@electric-sql/pglite" "^0.2.0" "@google-cloud/cloud-sql-connector" "^1.3.3" "@google-cloud/pubsub" "^4.5.0" abort-controller "^3.0.0" - ajv "^6.12.6" + ajv "^8.17.1" + ajv-formats "3.0.1" archiver "^7.0.0" async-lock "1.4.1" body-parser "^1.19.0" @@ -8895,8 +9051,8 @@ firebase-tools@^13.0.0: commander "^5.1.0" configstore "^5.0.1" cors "^2.8.5" - cross-env "^5.1.3" - cross-spawn "^7.0.3" + cross-env "^7.0.3" + cross-spawn "^7.0.5" csv-parse "^5.0.4" deep-equal-in-any-order "^2.0.6" exegesis "^4.2.0" @@ -8979,11 +9135,11 @@ follow-redirects@^1.0.0: integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + version "0.3.4" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.4.tgz#814517ffc303d1399b2564d8165318e735d0341c" + integrity sha512-kKaIINnFpzW6ffJNDjjyjrk21BkDx38c0xa/klsT8VzLCaMEefv4ZTacrcVR4DmgTeBra++jMDAfS/tS799YDw== dependencies: - is-callable "^1.1.3" + is-callable "^1.2.7" for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" @@ -9307,9 +9463,9 @@ get-symbol-description@^1.1.0: get-intrinsic "^1.2.6" get-tsconfig@^4.7.5: - version "4.8.1" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.8.1.tgz#8995eb391ae6e1638d251118c7b56de7eb425471" - integrity sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg== + version "4.10.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.10.0.tgz#403a682b373a823612475a4c2928c7326fc0f6bb" + integrity sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A== dependencies: resolve-pkg-maps "^1.0.0" @@ -9546,9 +9702,9 @@ gonzales-pe@^4.3.0: minimist "^1.2.5" google-auth-library@^9.0.0, google-auth-library@^9.11.0, google-auth-library@^9.2.0, google-auth-library@^9.3.0, google-auth-library@^9.7.0: - version "9.15.0" - resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-9.15.0.tgz#1b009c08557929c881d72f953f17e839e91b009b" - integrity sha512-7ccSEJFDFO7exFbO6NRyC+xH8/mZ1GZGG2xxx9iHxZWcjUjJpjWxIMw3cofAKcueZ6DATiukmmprD7yavQHOyQ== + version "9.15.1" + resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-9.15.1.tgz#0c5d84ed1890b2375f1cd74f03ac7b806b392928" + integrity sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng== dependencies: base64-js "^1.3.0" ecdsa-sig-formatter "^1.0.11" @@ -9637,9 +9793,9 @@ grpc-gcp@^1.0.0: "@grpc/grpc-js" "^1.7.0" gsap@^3.12.3: - version "3.12.5" - resolved "https://registry.yarnpkg.com/gsap/-/gsap-3.12.5.tgz#136c02dad4c673b441bdb1ca00104bfcb4eae7f4" - integrity sha512-srBfnk4n+Oe/ZnMIOXt3gT605BX9x5+rh/prT2F1SsNJsU1XuMiP0E2aptW481OnonOGACZWBqseH5Z7csHxhQ== + 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" @@ -10360,10 +10516,11 @@ is-arrayish@^0.3.1: integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== is-async-function@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.0.tgz#1d1080612c493608e93168fc4458c245074c06a6" - integrity sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ== + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523" + integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== dependencies: + async-function "^1.0.0" call-bound "^1.0.3" get-proto "^1.0.1" has-tostringtag "^1.0.2" @@ -10410,7 +10567,7 @@ is-builtin-module@^3.1.0: dependencies: builtin-modules "^3.3.0" -is-callable@^1.1.3, is-callable@^1.2.7: +is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== @@ -11402,9 +11559,9 @@ karma@~6.4.0: yargs "^16.1.1" katex@^0.16.9: - version "0.16.20" - resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.20.tgz#75c741ded0f7ee8d896a1d31bac307e61af863c3" - integrity sha512-jjuLaMGD/7P8jUTpdKhA9IoqnH+yMFB3sdAFtq5QdAqeP2PjiSbnC3EaguKPNtv6dXXanHxp1ckwvF4a86LBig== + version "0.16.21" + resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.21.tgz#8f63c659e931b210139691f2cc7bb35166b792a3" + integrity sha512-XvqR7FgOHtWupfMiigNzmh+MgUVmDGU2kXZm899ZkPfcuoPuFxyHmXsgATDpFZDAXCI8tvinaVcDo8PIIJSo4A== dependencies: commander "^8.3.0" @@ -11893,7 +12050,7 @@ lru-cache@2.5.0: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.5.0.tgz#d82388ae9c960becbea0c73bb9eb79b6c6ce9aeb" integrity sha512-dVmQmXPBlTgFw77hm60ud//l2bCuDKkqC2on1EBoM7s9Urm9IQDrnujwZ93NFnAq0dVZ0HBXTS7PwEG+YE7+EQ== -lru-cache@^10.0.1, lru-cache@^10.2.0: +lru-cache@^10.0.1, lru-cache@^10.2.0, lru-cache@^10.4.3: version "10.4.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== @@ -12658,11 +12815,6 @@ ngx-progressbar@^14.0.0: dependencies: tslib "^2.3.0" -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - no-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" @@ -12762,11 +12914,11 @@ nopt@^7.0.0: abbrev "^2.0.0" nopt@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-8.0.0.tgz#644f1e78da564b70e3606ab8db4836b0e32e198a" - integrity sha512-1L/fTJ4UmV/lUxT2Uf006pfZKTvAgCF+chz+0OgBHO8u2Z67pE7AaAUUj7CJy0lXqHmymUvGFt6NE9R3HER0yw== + version "8.1.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-8.1.0.tgz#b11d38caf0f8643ce885818518064127f602eae3" + integrity sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A== dependencies: - abbrev "^2.0.0" + abbrev "^3.0.0" normalize-package-data@^6.0.0: version "6.0.2" @@ -12777,15 +12929,6 @@ normalize-package-data@^6.0.0: semver "^7.3.5" validate-npm-package-license "^3.0.4" -normalize-package-data@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-7.0.0.tgz#ab4f49d02f2e25108d3f4326f3c13f0de6fa6a0a" - integrity sha512-k6U0gKRIuNCTkwHGZqblCfLfBRh+w1vI6tBo+IeJwq2M8FUiOqhX7GH+GArQGScA7azd1WfyRCvxoXDO3hQDIA== - dependencies: - hosted-git-info "^8.0.0" - semver "^7.3.5" - validate-npm-package-license "^3.0.4" - normalize-path@3.0.0, normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -13014,10 +13157,10 @@ onetime@^7.0.0: dependencies: mimic-function "^5.0.0" -oniguruma-to-es@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/oniguruma-to-es/-/oniguruma-to-es-2.2.0.tgz#7134ab4f05595cadc52fbc697af5c96788dca493" - integrity sha512-EEsso27ri0sf+t4uRFEj5C5gvXQj0d0w1Y2qq06b+hDLBnvzO1rWTwEW4C7ytan6nhg4WPwE26eLoiPhHUbvKg== +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== dependencies: emoji-regex-xs "^1.0.0" regex "^5.1.1" @@ -13455,11 +13598,6 @@ path-is-inside@^1.0.1: resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== -path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" @@ -13518,9 +13656,9 @@ path-type@^5.0.0: integrity sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg== pathe@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.1.tgz#ee1e6965c5ccfc98dc5a4b366a6ba6dd624a33d6" - integrity sha512-6jpjMpOth5S9ITVu5clZ7NOgHNsv5vRQdheL9ztp2vZmM6fRbLvyua1tiBIL4lk8SAe3ARzeXEly6siXCjDHDw== + version "2.0.2" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.2.tgz#5ed86644376915b3c7ee4d00ac8c348d671da3a5" + integrity sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w== pause-stream@0.0.11: version "0.0.11" @@ -13668,9 +13806,9 @@ pkg-types@^1.2.1, pkg-types@^1.3.0: pathe "^2.0.1" playwright-core@^1.41.2: - version "1.49.1" - resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.49.1.tgz#32c62f046e950f586ff9e35ed490a424f2248015" - integrity sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg== + version "1.50.0" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.50.0.tgz#28dd6a1488211c193933695ed337a5b44d46867c" + integrity sha512-CXkSSlr4JaZs2tZHI40DsZUN/NIwgaUPsyLuOAaIZp2CyF2sN5MM5NJsyB188lFSSozFxQ5fPT4qM+f0tH/6wQ== plugin-error@^2.0.0: version "2.0.1" @@ -14066,15 +14204,15 @@ pupa@^2.1.1: dependencies: escape-goat "^2.0.0" -puppeteer-core@24.0.0: - version "24.0.0" - resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-24.0.0.tgz#a9671518ac4ed0998db153e72c5dbe09170bba40" - integrity sha512-bHVXmnkYnMVSbsD+pJGt8fmGZLaVYOAieVnJcDxtLIVTMq0s5RfYdzN4xVlFoBQ3T06/sPkXxca3VLVfaqLxzg== +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== dependencies: "@puppeteer/browsers" "2.7.0" - chromium-bidi "0.11.0" + chromium-bidi "1.1.0" debug "^4.4.0" - devtools-protocol "0.0.1367902" + devtools-protocol "0.0.1380148" typed-query-selector "^2.12.0" ws "^8.18.0" @@ -14097,15 +14235,15 @@ puppeteer-core@^5.1.0: ws "^7.2.3" puppeteer@*: - version "24.0.0" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-24.0.0.tgz#d95d0765d5ff29dc50865e591e8676a9d4d9c5db" - integrity sha512-KRF2iWdHGSZkQ8pqftR5XR1jqnTqKRVZghMGJfJ665zS8++0cErRG2tXWfp98YqvMzsVLHfzBtTQlk0MMhCxzg== + version "24.1.1" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-24.1.1.tgz#dadcfbe05b25a54aee7061325631145db568890b" + integrity sha512-fuhceZ5HZuDXVuaMIRxUuDHfCJLmK0pXh8FlzVQ0/+OApStevxZhU5kAVeYFOEqeCF5OoAyZjcWbdQK27xW/9A== dependencies: "@puppeteer/browsers" "2.7.0" - chromium-bidi "0.12.0" + chromium-bidi "1.1.0" cosmiconfig "^9.0.0" - devtools-protocol "0.0.1367902" - puppeteer-core "24.0.0" + devtools-protocol "0.0.1380148" + puppeteer-core "24.1.1" typed-query-selector "^2.12.0" q@1.4.1: @@ -14131,11 +14269,11 @@ qs@6.13.0: side-channel "^1.0.6" qs@^6.4.0, qs@^6.6.0, qs@^6.7.0: - version "6.13.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.1.tgz#3ce5fc72bd3a8171b85c99b93c65dd20b7d1b16e" - integrity sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg== + version "6.14.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930" + integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== dependencies: - side-channel "^1.0.6" + side-channel "^1.1.0" qs@~6.5.2: version "6.5.3" @@ -14746,7 +14884,7 @@ rollup-plugin-terser@^7.0.1: serialize-javascript "^4.0.0" terser "^5.0.0" -rollup@4.30.1, rollup@^4.23.0: +rollup@4.30.1: version "4.30.1" resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.30.1.tgz#d5c3d066055259366cdc3eb6f1d051c5d6afaf74" integrity sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w== @@ -14802,6 +14940,34 @@ rollup@4.31.0: "@rollup/rollup-win32-x64-msvc" "4.31.0" 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== + 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" + fsevents "~2.3.2" + rollup@~1.11.3: version "1.11.3" resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.11.3.tgz#6f436db2a2d6b63f808bf60ad01a177643dedb81" @@ -14846,6 +15012,11 @@ rrweb-cssom@^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" + integrity sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw== + run-applescript@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.0.0.tgz#e5a553c2bffd620e169d276c1cd8f1b64778fbeb" @@ -15110,7 +15281,7 @@ 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@^5.3.0, semver@^5.5.0, semver@^5.6.0: +semver@^5.3.0, semver@^5.6.0: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== @@ -15324,13 +15495,6 @@ shallow-clone@^3.0.0: dependencies: kind-of "^6.0.2" -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -15338,11 +15502,6 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.0.0" -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" @@ -15363,16 +15522,16 @@ shelljs@^0.8.5: rechoir "^0.6.2" shiki@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-2.0.0.tgz#97fe361ded9a402804d2cb327de1b5e96f1f5572" - integrity sha512-cU0KHpb2zOMwVrSeJeYTcKNGzSHM+X/chH5KTtsZLg5QCsFUwclJervFoHQPz1Ap+O+94FOsv7mh/+Bmv3iQPA== - dependencies: - "@shikijs/core" "2.0.0" - "@shikijs/engine-javascript" "2.0.0" - "@shikijs/engine-oniguruma" "2.0.0" - "@shikijs/langs" "2.0.0" - "@shikijs/themes" "2.0.0" - "@shikijs/types" "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" "@shikijs/vscode-textmate" "^10.0.1" "@types/hast" "^3.0.4" @@ -15720,9 +15879,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.20" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz#e44ed19ed318dd1e5888f93325cee800f0f51b89" - integrity sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw== + version "3.0.21" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz#6d6e980c9df2b6fc905343a3b2d702a6239536c3" + integrity sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg== spdy-transport@^3.0.0: version "3.0.0" @@ -16230,15 +16389,15 @@ tar-fs@^2.0.0: tar-stream "^2.1.4" tar-fs@^3.0.6: - version "3.0.7" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.7.tgz#b8ecd22f9452e5116b93273a754a1f835edb5319" - integrity sha512-2sAfoF/zw/2n8goUGnGRZTWTD4INtnScPZvyYBI6BDlJ3wNR5o1dw03EfBvuhG6GBLvC4J+C7j7W+64aZ0ogQA== + version "3.0.8" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.8.tgz#8f62012537d5ff89252d01e48690dc4ebed33ab7" + integrity sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg== dependencies: pump "^3.0.0" tar-stream "^3.1.5" optionalDependencies: - bare-fs "^2.1.1" - bare-path "^2.1.0" + bare-fs "^4.0.1" + bare-path "^3.0.0" tar-stream@^1.5.2: version "1.6.2" @@ -16414,17 +16573,17 @@ tinyexec@^0.3.0: resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== -tldts-core@^6.1.71: - version "6.1.71" - resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-6.1.71.tgz#04069cbdcf75b7fcb68fb4c1e00591cd3a2d4a5c" - integrity sha512-LRbChn2YRpic1KxY+ldL1pGXN/oVvKfCVufwfVzEQdFYNo39uF7AJa/WXdo+gYO7PTvdfkCPCed6Hkvz/kR7jg== +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@^6.1.32: - version "6.1.71" - resolved "https://registry.yarnpkg.com/tldts/-/tldts-6.1.71.tgz#e0db0853dd533628729d6a97a211450205fa21e4" - integrity sha512-LQIHmHnuzfZgZWAf2HzL83TIIrD8NhhI0DVxqo9/FdOd4ilec+NTNZOlDZf7EwrTNoutccbsHjvWHYXLAtvxjw== + version "6.1.74" + resolved "https://registry.yarnpkg.com/tldts/-/tldts-6.1.74.tgz#ff7e55614c30795b07cc29a26be53693f167b31c" + integrity sha512-O5vTZ1UmmEmrLl/59U9igitnSMlprALLaLgbv//dEvjobPT9vyURhHXKMCDLEhn3qxZFIkb9PwAfNYV0Ol7RPQ== dependencies: - tldts-core "^6.1.71" + tldts-core "^6.1.74" tmp@0.0.30: version "0.0.30" @@ -16539,13 +16698,13 @@ tr46@~0.0.3: integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== traverse@>=0.2.4: - version "0.6.10" - resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.10.tgz#4c93482381d794dee046882c036f3c4eee481324" - integrity sha512-hN4uFRxbK+PX56DxYiGHsTn2dME3TVr9vbNqlQGcGcPhJAn+tdP126iA+TArMpI4YSgnTkMWyoLl5bf81Hi5TA== + version "0.6.11" + resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.11.tgz#e8daa071b101ae66767fffa6f177aa6f7110068e" + integrity sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w== dependencies: - gopd "^1.0.1" - typedarray.prototype.slice "^1.0.3" - which-typed-array "^1.1.15" + gopd "^1.2.0" + typedarray.prototype.slice "^1.0.5" + which-typed-array "^1.1.18" "traverse@>=0.3.0 <0.4": version "0.3.9" @@ -16588,14 +16747,14 @@ ts-dedent@^2.2.0: integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== ts-graphviz@^2.1.2: - version "2.1.5" - resolved "https://registry.yarnpkg.com/ts-graphviz/-/ts-graphviz-2.1.5.tgz#8b050f5b0632e91eee4225dfece6e4df21c375f4" - integrity sha512-IigMCo40QZvyyURRdYFh0DV6DGDt7OqkPM/TBGXSJKfNKnYmOfRg0tzSlnJS1TQCWFSTEtpBQsqmAZcziXJrWg== + version "2.1.6" + resolved "https://registry.yarnpkg.com/ts-graphviz/-/ts-graphviz-2.1.6.tgz#007fcb42b4e8c55d26543ece9e86395bd3c3cfd6" + integrity sha512-XyLVuhBVvdJTJr2FJJV2L1pc4MwSjMhcunRVgDE9k4wbb2ee7ORYnPewxMWUav12vxyfUM686MSGsqnVRIInuw== dependencies: "@ts-graphviz/adapter" "^2.0.6" - "@ts-graphviz/ast" "^2.0.6" + "@ts-graphviz/ast" "^2.0.7" "@ts-graphviz/common" "^2.1.5" - "@ts-graphviz/core" "^2.0.6" + "@ts-graphviz/core" "^2.0.7" ts-node@^10.9.1: version "10.9.2" @@ -16752,9 +16911,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.32.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.32.0.tgz#55bacdd6f2cf1392b7e9cde894e9b1d726807e97" - integrity sha512-rfgpoi08xagF3JSdtJlCwMq9DGNDE0IMh3Mkpc1wUypg9vPi786AiqeBBKcqvIkq42azsBM85N490fyZjeUftw== + 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== type-is@~1.6.18: version "1.6.18" @@ -16831,7 +16990,7 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typedarray.prototype.slice@^1.0.3: +typedarray.prototype.slice@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.5.tgz#a40f896968573b33cbb466a61622d3ee615a0728" integrity sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg== @@ -16939,16 +17098,16 @@ undici-types@~6.20.0: integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== undici@^5.25.4: - version "5.28.4" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068" - integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g== + version "5.28.5" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.5.tgz#b2b94b6bf8f1d919bc5a6f31f2c01deb02e54d4b" + integrity sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA== dependencies: "@fastify/busboy" "^2.0.0" undici@^6.15.0: - version "6.21.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-6.21.0.tgz#4b3d3afaef984e07b48e7620c34ed8a285ed4cd4" - integrity sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw== + version "6.21.1" + resolved "https://registry.yarnpkg.com/undici/-/undici-6.21.1.tgz#336025a14162e6837e44ad7b819b35b6c6af0e05" + integrity sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.1" @@ -17759,7 +17918,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.15, which-typed-array@^1.1.16, which-typed-array@^1.1.18: +which-typed-array@^1.1.16, which-typed-array@^1.1.18: version "1.1.18" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.18.tgz#df2389ebf3fbb246a71390e90730a9edb6ce17ad" integrity sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA== @@ -17771,7 +17930,7 @@ which-typed-array@^1.1.15, which-typed-array@^1.1.16, which-typed-array@^1.1.18: gopd "^1.2.0" has-tostringtag "^1.0.2" -which@^1.2.1, which@^1.2.14, which@^1.2.9: +which@^1.2.1, which@^1.2.14: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -18116,11 +18275,6 @@ zip-stream@^6.0.1: compress-commons "^6.0.2" readable-stream "^4.0.0" -zod@3.23.8: - version "3.23.8" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" - integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== - zod@3.24.1: version "3.24.1" resolved "https://registry.yarnpkg.com/zod/-/zod-3.24.1.tgz#27445c912738c8ad1e9de1bea0359fa44d9d35ee" From 0c1ecb453c8b01447fb5a9f38fdfe9936a60abe5 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Wed, 29 Jan 2025 09:49:39 +0100 Subject: [PATCH 0213/1220] fix(elements): not setting initial value on signal-based input (#59773) Fixes that `createCustomElement` was incorrectly excluding signal-based inputs when setting the initial values. Fixes #59757. PR Close #59773 --- .../elements/src/create-custom-element.ts | 8 ++--- .../test/create-custom-element_spec.ts | 36 ++++++++++++++++++- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/packages/elements/src/create-custom-element.ts b/packages/elements/src/create-custom-element.ts index 4d1864f2b2a6..17dfd2a2722d 100644 --- a/packages/elements/src/create-custom-element.ts +++ b/packages/elements/src/create-custom-element.ts @@ -156,13 +156,13 @@ export function createCustomElement

    ( // Re-apply pre-existing input values (set as properties on the element) through the // strategy. // TODO(alxhub): why are we doing this? this makes no sense. - inputs.forEach(({propName, transform, isSignal}) => { - if (!this.hasOwnProperty(propName) || isSignal) { - // No pre-existing value for `propName`, or a signal input. + inputs.forEach(({propName, transform}) => { + if (!this.hasOwnProperty(propName)) { + // No pre-existing value for `propName`. return; } - // Delete the property from the instance and re-apply it through the strategy. + // Delete the property from the DOM node and re-apply it through the strategy. const value = (this as any)[propName]; delete (this as any)[propName]; strategy.setInputValue(propName, value, transform); diff --git a/packages/elements/test/create-custom-element_spec.ts b/packages/elements/test/create-custom-element_spec.ts index 3bcd7f2af3f2..d292579b62a6 100644 --- a/packages/elements/test/create-custom-element_spec.ts +++ b/packages/elements/test/create-custom-element_spec.ts @@ -12,6 +12,7 @@ import { DoBootstrap, EventEmitter, Injector, + input, Input, NgModule, Output, @@ -31,6 +32,7 @@ interface WithFooBar { fooFoo: string; barBar: string; fooTransformed: unknown; + fooSignal: string | null; } describe('createCustomElement', () => { @@ -66,7 +68,12 @@ describe('createCustomElement', () => { }); it('should use a default strategy for converting component inputs', () => { - expect(NgElementCtor.observedAttributes).toEqual(['foo-foo', 'barbar', 'foo-transformed']); + expect(NgElementCtor.observedAttributes).toEqual([ + 'foo-foo', + 'barbar', + 'foo-transformed', + 'foo-signal', + ]); }); it('should send input values from attributes when connected', () => { @@ -74,12 +81,14 @@ describe('createCustomElement', () => { element.setAttribute('foo-foo', 'value-foo-foo'); element.setAttribute('barbar', 'value-barbar'); element.setAttribute('foo-transformed', 'truthy'); + element.setAttribute('foo-signal', 'value-signal'); element.connectedCallback(); expect(strategy.connectedElement).toBe(element); expect(strategy.getInputValue('fooFoo')).toBe('value-foo-foo'); expect(strategy.getInputValue('barBar')).toBe('value-barbar'); expect(strategy.getInputValue('fooTransformed')).toBe(true); + expect(strategy.getInputValue('fooSignal')).toBe('value-signal'); }); it('should work even if the constructor is not called (due to polyfill)', () => { @@ -95,12 +104,14 @@ describe('createCustomElement', () => { element.setAttribute('foo-foo', 'value-foo-foo'); element.setAttribute('barbar', 'value-barbar'); element.setAttribute('foo-transformed', 'truthy'); + element.setAttribute('foo-signal', 'value-signal'); element.connectedCallback(); expect(strategy.connectedElement).toBe(element); expect(strategy.getInputValue('fooFoo')).toBe('value-foo-foo'); expect(strategy.getInputValue('barBar')).toBe('value-barbar'); expect(strategy.getInputValue('fooTransformed')).toBe(true); + expect(strategy.getInputValue('fooSignal')).toBe('value-signal'); }); it('should listen to output events after connected', () => { @@ -174,10 +185,12 @@ describe('createCustomElement', () => { element.fooFoo = 'foo-foo-value'; element.barBar = 'barBar-value'; element.fooTransformed = 'truthy'; + element.fooSignal = 'value-signal'; expect(strategy.inputs.get('fooFoo')).toBe('foo-foo-value'); expect(strategy.inputs.get('barBar')).toBe('barBar-value'); expect(strategy.inputs.get('fooTransformed')).toBe(true); + expect(strategy.inputs.get('fooSignal')).toBe('value-signal'); }); it('should properly handle getting/setting properties on the element even if the constructor is not called', () => { @@ -191,10 +204,12 @@ describe('createCustomElement', () => { element.fooFoo = 'foo-foo-value'; element.barBar = 'barBar-value'; element.fooTransformed = 'truthy'; + element.fooSignal = 'value-signal'; expect(strategy.inputs.get('fooFoo')).toBe('foo-foo-value'); expect(strategy.inputs.get('barBar')).toBe('barBar-value'); expect(strategy.inputs.get('fooTransformed')).toBe(true); + expect(strategy.inputs.get('fooSignal')).toBe('value-signal'); }); it('should capture properties set before upgrading the element', () => { @@ -204,10 +219,12 @@ describe('createCustomElement', () => { fooFoo: 'foo-prop-value', barBar: 'bar-prop-value', fooTransformed: 'truthy' as unknown, + fooSignal: 'value-signal', }); expect(element.fooFoo).toBe('foo-prop-value'); expect(element.barBar).toBe('bar-prop-value'); expect(element.fooTransformed).toBe('truthy'); + expect(element.fooSignal).toBe('value-signal'); // Upgrade the element to a Custom Element and insert it into the DOM. customElements.define(selector, ElementCtor); @@ -215,10 +232,12 @@ describe('createCustomElement', () => { expect(element.fooFoo).toBe('foo-prop-value'); expect(element.barBar).toBe('bar-prop-value'); expect(element.fooTransformed).toBe(true); + expect(element.fooSignal).toBe('value-signal'); expect(strategy.inputs.get('fooFoo')).toBe('foo-prop-value'); expect(strategy.inputs.get('barBar')).toBe('bar-prop-value'); expect(strategy.inputs.get('fooTransformed')).toBe(true); + expect(strategy.inputs.get('fooSignal')).toBe('value-signal'); }); it('should capture properties set after upgrading the element but before inserting it into the DOM', () => { @@ -228,10 +247,12 @@ describe('createCustomElement', () => { fooFoo: 'foo-prop-value', barBar: 'bar-prop-value', fooTransformed: 'truthy' as unknown, + fooSignal: 'value-signal', }); expect(element.fooFoo).toBe('foo-prop-value'); expect(element.barBar).toBe('bar-prop-value'); expect(element.fooTransformed).toBe('truthy'); + expect(element.fooSignal).toBe('value-signal'); // Upgrade the element to a Custom Element (without inserting it into the DOM) and update a // property. @@ -239,19 +260,23 @@ describe('createCustomElement', () => { customElements.upgrade(element); element.barBar = 'bar-prop-value-2'; element.fooTransformed = ''; + element.fooSignal = 'value-signal-changed'; expect(element.fooFoo).toBe('foo-prop-value'); expect(element.barBar).toBe('bar-prop-value-2'); expect(element.fooTransformed).toBe(''); + expect(element.fooSignal).toBe('value-signal-changed'); // Insert the element into the DOM. testContainer.appendChild(element); expect(element.fooFoo).toBe('foo-prop-value'); expect(element.barBar).toBe('bar-prop-value-2'); expect(element.fooTransformed).toBe(false); + expect(element.fooSignal).toBe('value-signal-changed'); expect(strategy.inputs.get('fooFoo')).toBe('foo-prop-value'); expect(strategy.inputs.get('barBar')).toBe('bar-prop-value-2'); expect(strategy.inputs.get('fooTransformed')).toBe(false); + expect(strategy.inputs.get('fooSignal')).toBe('value-signal-changed'); }); it('should allow overwriting properties with attributes after upgrading the element but before inserting it into the DOM', () => { @@ -261,10 +286,12 @@ describe('createCustomElement', () => { fooFoo: 'foo-prop-value', barBar: 'bar-prop-value', fooTransformed: 'truthy' as unknown, + fooSignal: 'value-signal', }); expect(element.fooFoo).toBe('foo-prop-value'); expect(element.barBar).toBe('bar-prop-value'); expect(element.fooTransformed).toBe('truthy'); + expect(element.fooSignal).toBe('value-signal'); // Upgrade the element to a Custom Element (without inserting it into the DOM) and set an // attribute. @@ -275,16 +302,19 @@ describe('createCustomElement', () => { expect(element.fooFoo).toBe('foo-prop-value'); expect(element.barBar).toBe('bar-attr-value'); expect(element.fooTransformed).toBe(false); + expect(element.fooSignal).toBe('value-signal'); // Insert the element into the DOM. testContainer.appendChild(element); expect(element.fooFoo).toBe('foo-prop-value'); expect(element.barBar).toBe('bar-attr-value'); expect(element.fooTransformed).toBe(false); + expect(element.fooSignal).toBe('value-signal'); expect(strategy.inputs.get('fooFoo')).toBe('foo-prop-value'); expect(strategy.inputs.get('barBar')).toBe('bar-attr-value'); expect(strategy.inputs.get('fooTransformed')).toBe(false); + expect(strategy.inputs.get('fooSignal')).toBe('value-signal'); }); // Helpers @@ -313,6 +343,10 @@ describe('createCustomElement', () => { @Input('barbar') barBar!: string; @Input({transform: (value: unknown) => !!value}) fooTransformed!: boolean; + // This needs to apply the decorator and pass `isSignal`, because + // the compiler transform doesn't run against JIT tests. + @Input({isSignal: true} as Input) fooSignal = input(null); + @Output() bazBaz = new EventEmitter(); @Output('quxqux') quxQux = new EventEmitter(); } From e6cb411e4393a4b1f5852d3d7c5b9622504399b1 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Tue, 28 Jan 2025 18:05:46 +0100 Subject: [PATCH 0214/1220] fix(platform-browser): automatically disable animations on the server (#59762) Uses `ngServerMode` to automatically disable browser animations on the server. This allows us to decouple `platform-server` from the animations package. PR Close #59762 --- .../animations/async/src/providers.ts | 7 ++++- .../animations/src/providers.ts | 27 +++++++++++++------ 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/packages/platform-browser/animations/async/src/providers.ts b/packages/platform-browser/animations/async/src/providers.ts index 12206af11866..6e0a20aa3cf3 100644 --- a/packages/platform-browser/animations/async/src/providers.ts +++ b/packages/platform-browser/animations/async/src/providers.ts @@ -14,7 +14,6 @@ import { NgZone, RendererFactory2, ɵperformanceMarkFeature as performanceMarkFeature, - InjectionToken, } from '@angular/core'; import {ɵDomRendererFactory2 as DomRendererFactory2} from '@angular/platform-browser'; @@ -51,6 +50,12 @@ export function provideAnimationsAsync( type: 'animations' | 'noop' = 'animations', ): EnvironmentProviders { performanceMarkFeature('NgAsyncAnimations'); + + // Animations don't work on the server so we switch them over to no-op automatically. + if (typeof ngServerMode !== 'undefined' && ngServerMode) { + type = 'noop'; + } + return makeEnvironmentProviders([ { provide: RendererFactory2, diff --git a/packages/platform-browser/animations/src/providers.ts b/packages/platform-browser/animations/src/providers.ts index f8797c332659..f311e965d285 100644 --- a/packages/platform-browser/animations/src/providers.ts +++ b/packages/platform-browser/animations/src/providers.ts @@ -71,20 +71,31 @@ const SHARED_ANIMATION_PROVIDERS: Provider[] = [ /** * Separate providers from the actual module so that we can do a local modification in Google3 to - * include them in the BrowserModule. + * include them in the BrowserTestingModule. */ -export const BROWSER_ANIMATIONS_PROVIDERS: Provider[] = [ - {provide: AnimationDriver, useFactory: () => new WebAnimationsDriver()}, - {provide: ANIMATION_MODULE_TYPE, useValue: 'BrowserAnimations'}, +export const BROWSER_NOOP_ANIMATIONS_PROVIDERS: Provider[] = [ + {provide: AnimationDriver, useClass: NoopAnimationDriver}, + {provide: ANIMATION_MODULE_TYPE, useValue: 'NoopAnimations'}, ...SHARED_ANIMATION_PROVIDERS, ]; /** * Separate providers from the actual module so that we can do a local modification in Google3 to - * include them in the BrowserTestingModule. + * include them in the BrowserModule. */ -export const BROWSER_NOOP_ANIMATIONS_PROVIDERS: Provider[] = [ - {provide: AnimationDriver, useClass: NoopAnimationDriver}, - {provide: ANIMATION_MODULE_TYPE, useValue: 'NoopAnimations'}, +export const BROWSER_ANIMATIONS_PROVIDERS: Provider[] = [ + // Note: the `ngServerMode` happen inside factories to give the variable time to initialize. + { + provide: AnimationDriver, + useFactory: () => + typeof ngServerMode !== 'undefined' && ngServerMode + ? new NoopAnimationDriver() + : new WebAnimationsDriver(), + }, + { + provide: ANIMATION_MODULE_TYPE, + useFactory: () => + typeof ngServerMode !== 'undefined' && ngServerMode ? 'NoopAnimations' : 'BrowserAnimations', + }, ...SHARED_ANIMATION_PROVIDERS, ]; From fc5d187da5e8895d60caa35b7b59e234998eddf0 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Tue, 28 Jan 2025 18:11:22 +0100 Subject: [PATCH 0215/1220] fix(platform-server): decouple server from animations module (#59762) Removes the hard dependency between `platform-server` and `platform-browser/animations` since now the animations module will disable itself automatically. PR Close #59762 --- goldens/public-api/platform-server/index.api.md | 5 ++--- goldens/public-api/platform-server/testing/index.api.md | 5 ++--- packages/platform-server/BUILD.bazel | 2 -- packages/platform-server/package.json | 1 - packages/platform-server/src/provide_server.ts | 3 +-- packages/platform-server/src/server.ts | 2 -- packages/platform-server/testing/BUILD.bazel | 1 - packages/platform-server/testing/src/server.ts | 2 -- 8 files changed, 5 insertions(+), 16 deletions(-) diff --git a/goldens/public-api/platform-server/index.api.md b/goldens/public-api/platform-server/index.api.md index c59b942becff..210b2c933819 100644 --- a/goldens/public-api/platform-server/index.api.md +++ b/goldens/public-api/platform-server/index.api.md @@ -7,8 +7,7 @@ import { ApplicationRef } from '@angular/core'; import { EnvironmentProviders } from '@angular/core'; import * as i0 from '@angular/core'; -import * as i1 from '@angular/platform-browser/animations'; -import * as i2 from '@angular/platform-browser'; +import * as i1 from '@angular/platform-browser'; import { InjectionToken } from '@angular/core'; import { PlatformRef } from '@angular/core'; import { Provider } from '@angular/core'; @@ -66,7 +65,7 @@ export class ServerModule { // (undocumented) static ɵinj: i0.ɵɵInjectorDeclaration; // (undocumented) - static ɵmod: i0.ɵɵNgModuleDeclaration; + static ɵmod: i0.ɵɵNgModuleDeclaration; } // @public (undocumented) diff --git a/goldens/public-api/platform-server/testing/index.api.md b/goldens/public-api/platform-server/testing/index.api.md index 4ef4c87f99fb..69d91c19c9be 100644 --- a/goldens/public-api/platform-server/testing/index.api.md +++ b/goldens/public-api/platform-server/testing/index.api.md @@ -5,8 +5,7 @@ ```ts import * as i0 from '@angular/core'; -import * as i1 from '@angular/platform-browser/animations'; -import * as i2 from '@angular/platform-browser-dynamic/testing'; +import * as i1 from '@angular/platform-browser-dynamic/testing'; import { PlatformRef } from '@angular/core'; import { StaticProvider } from '@angular/core'; @@ -20,7 +19,7 @@ export class ServerTestingModule { // (undocumented) static ɵinj: i0.ɵɵInjectorDeclaration; // (undocumented) - static ɵmod: i0.ɵɵNgModuleDeclaration; + static ɵmod: i0.ɵɵNgModuleDeclaration; } // (No @packageDocumentation comment for this package) diff --git a/packages/platform-server/BUILD.bazel b/packages/platform-server/BUILD.bazel index acd3b5de1544..cc0e649871ad 100644 --- a/packages/platform-server/BUILD.bazel +++ b/packages/platform-server/BUILD.bazel @@ -15,13 +15,11 @@ ng_module( ), deps = [ ":bundled_domino_lib", - "//packages/animations/browser", "//packages/common", "//packages/common/http", "//packages/compiler", "//packages/core", "//packages/platform-browser", - "//packages/platform-browser/animations", "//packages/zone.js/lib:zone_d_ts", "@npm//@types/node", "@npm//rxjs", diff --git a/packages/platform-server/package.json b/packages/platform-server/package.json index dd291777486a..14fa391716da 100644 --- a/packages/platform-server/package.json +++ b/packages/platform-server/package.json @@ -8,7 +8,6 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "0.0.0-PLACEHOLDER", "@angular/common": "0.0.0-PLACEHOLDER", "@angular/compiler": "0.0.0-PLACEHOLDER", "@angular/core": "0.0.0-PLACEHOLDER", diff --git a/packages/platform-server/src/provide_server.ts b/packages/platform-server/src/provide_server.ts index c3114af6c967..83e1adfb1af4 100644 --- a/packages/platform-server/src/provide_server.ts +++ b/packages/platform-server/src/provide_server.ts @@ -7,7 +7,6 @@ */ import {EnvironmentProviders, makeEnvironmentProviders} from '@angular/core'; -import {provideNoopAnimations} from '@angular/platform-browser/animations'; import {PLATFORM_SERVER_PROVIDERS} from './server'; @@ -31,5 +30,5 @@ export function provideServerRendering(): EnvironmentProviders { globalThis['ngServerMode'] = true; } - return makeEnvironmentProviders([provideNoopAnimations(), ...PLATFORM_SERVER_PROVIDERS]); + return makeEnvironmentProviders([...PLATFORM_SERVER_PROVIDERS]); } diff --git a/packages/platform-server/src/server.ts b/packages/platform-server/src/server.ts index 7a70321718b4..cfa579835c5c 100644 --- a/packages/platform-server/src/server.ts +++ b/packages/platform-server/src/server.ts @@ -35,7 +35,6 @@ import { EVENT_MANAGER_PLUGINS, ɵBrowserDomAdapter as BrowserDomAdapter, } from '@angular/platform-browser'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import {DominoAdapter, parseDocument} from './domino_adapter'; import {SERVER_HTTP_PROVIDERS} from './http'; @@ -90,7 +89,6 @@ export const PLATFORM_SERVER_PROVIDERS: Provider[] = [ */ @NgModule({ exports: [BrowserModule], - imports: [NoopAnimationsModule], providers: PLATFORM_SERVER_PROVIDERS, }) export class ServerModule {} diff --git a/packages/platform-server/testing/BUILD.bazel b/packages/platform-server/testing/BUILD.bazel index 7ad75ce764e1..39dff822fbf1 100644 --- a/packages/platform-server/testing/BUILD.bazel +++ b/packages/platform-server/testing/BUILD.bazel @@ -10,7 +10,6 @@ ng_module( deps = [ "//packages/core", "//packages/platform-browser-dynamic/testing", - "//packages/platform-browser/animations", "//packages/platform-server", ], ) diff --git a/packages/platform-server/testing/src/server.ts b/packages/platform-server/testing/src/server.ts index 11746bed7eae..6d899ace6543 100644 --- a/packages/platform-server/testing/src/server.ts +++ b/packages/platform-server/testing/src/server.ts @@ -11,7 +11,6 @@ import { BrowserDynamicTestingModule, ɵplatformCoreDynamicTesting as platformCoreDynamicTesting, } from '@angular/platform-browser-dynamic/testing'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import { ɵINTERNAL_SERVER_PLATFORM_PROVIDERS as INTERNAL_SERVER_PLATFORM_PROVIDERS, ɵSERVER_RENDER_PROVIDERS as SERVER_RENDER_PROVIDERS, @@ -35,7 +34,6 @@ export const platformServerTesting = createPlatformFactory( */ @NgModule({ exports: [BrowserDynamicTestingModule], - imports: [NoopAnimationsModule], providers: SERVER_RENDER_PROVIDERS, }) export class ServerTestingModule {} From ea2ea5e65b0d3299e318a2b9551bbfae52be2afd Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Tue, 28 Jan 2025 19:35:17 +0100 Subject: [PATCH 0216/1220] test(core): update tests that were relying on implicit animations module (#59762) We had some tests that were relying on the fact that the server module was importing animations implicitly. PR Close #59762 --- packages/core/test/acceptance/integration_spec.ts | 3 +++ packages/core/test/acceptance/property_binding_spec.ts | 6 +++++- packages/core/test/change_detection_scheduler_spec.ts | 4 ---- .../core/test/linker/change_detection_integration_spec.ts | 2 ++ packages/platform-server/test/BUILD.bazel | 1 + packages/platform-server/test/integration_spec.ts | 7 +++++-- 6 files changed, 16 insertions(+), 7 deletions(-) diff --git a/packages/core/test/acceptance/integration_spec.ts b/packages/core/test/acceptance/integration_spec.ts index b91be9a4a1e1..62c598f99937 100644 --- a/packages/core/test/acceptance/integration_spec.ts +++ b/packages/core/test/acceptance/integration_spec.ts @@ -38,6 +38,7 @@ import {getLView} from '@angular/core/src/render3/state'; import {ngDevModeResetPerfCounters} from '@angular/core/src/util/ng_dev_mode'; import {fakeAsync, flushMicrotasks, TestBed} from '@angular/core/testing'; import {By} from '@angular/platform-browser'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import {expectPerfCounters} from '@angular/private/testing'; describe('acceptance integration tests', () => { @@ -2889,6 +2890,7 @@ describe('acceptance integration tests', () => { TestBed.configureTestingModule({ declarations: [Cmp, AnimationComp], + imports: [NoopAnimationsModule], providers: [{provide: AnimationDriver, useClass: MockAnimationDriver}], }); const fixture = TestBed.createComponent(Cmp); @@ -2979,6 +2981,7 @@ describe('acceptance integration tests', () => { TestBed.configureTestingModule({ declarations: [Cmp, InnerComp], + imports: [NoopAnimationsModule], providers: [{provide: AnimationDriver, useClass: MockAnimationDriver}], }); const fixture = TestBed.createComponent(Cmp); diff --git a/packages/core/test/acceptance/property_binding_spec.ts b/packages/core/test/acceptance/property_binding_spec.ts index f3adc3b1ff9f..c86532582a45 100644 --- a/packages/core/test/acceptance/property_binding_spec.ts +++ b/packages/core/test/acceptance/property_binding_spec.ts @@ -10,6 +10,7 @@ import {CommonModule} from '@angular/common'; import {Component, Directive, EventEmitter, Input, Output, ViewContainerRef} from '@angular/core'; import {TestBed} from '@angular/core/testing'; import {By, DomSanitizer, SafeUrl} from '@angular/platform-browser'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; describe('property bindings', () => { it('should support bindings to properties', () => { @@ -689,7 +690,10 @@ describe('property bindings', () => { }) class App {} - TestBed.configureTestingModule({declarations: [App, MyDir, MyComp]}); + TestBed.configureTestingModule({ + declarations: [App, MyDir, MyComp], + imports: [NoopAnimationsModule], + }); expect(() => { const fixture = TestBed.createComponent(App); diff --git a/packages/core/test/change_detection_scheduler_spec.ts b/packages/core/test/change_detection_scheduler_spec.ts index 99f49b8ee7c6..82cf6ecf8a41 100644 --- a/packages/core/test/change_detection_scheduler_spec.ts +++ b/packages/core/test/change_detection_scheduler_spec.ts @@ -372,12 +372,8 @@ describe('Angular with zoneless enabled', () => { expect(host.innerHTML).toEqual('binding'); const component2 = createComponent(DynamicCmp, {environmentInjector}); - // TODO(atscott): Only needed because renderFactory will not run if ApplicationRef has no - // views. This should likely be fixed in ApplicationRef appRef.attachView(component2.hostView); appRef.detachView(component.hostView); - // DOM is not synchronously removed because change detection hasn't run - expect(host.innerHTML).toEqual('binding'); expect(isStable()).toBe(false); await whenStable(); expect(host.innerHTML).toEqual(''); diff --git a/packages/core/test/linker/change_detection_integration_spec.ts b/packages/core/test/linker/change_detection_integration_spec.ts index 9106941a94ac..c8552fc4eee4 100644 --- a/packages/core/test/linker/change_detection_integration_spec.ts +++ b/packages/core/test/linker/change_detection_integration_spec.ts @@ -45,6 +45,7 @@ import {isTextNode} from '@angular/platform-browser/testing/src/browser_util'; import {expect} from '@angular/platform-browser/testing/src/matchers'; import {MockResourceLoader} from './resource_loader_mock'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; const TEST_COMPILER_PROVIDERS: Provider[] = [ {provide: ResourceLoader, useClass: MockResourceLoader, deps: []}, @@ -110,6 +111,7 @@ const TEST_COMPILER_PROVIDERS: Provider[] = [ beforeEach(() => { TestBed.configureCompiler({providers: TEST_COMPILER_PROVIDERS}); TestBed.configureTestingModule({ + imports: [NoopAnimationsModule], declarations: [ TestData, TestDirective, diff --git a/packages/platform-server/test/BUILD.bazel b/packages/platform-server/test/BUILD.bazel index 32e504e579d8..bfa6bd2d8811 100644 --- a/packages/platform-server/test/BUILD.bazel +++ b/packages/platform-server/test/BUILD.bazel @@ -47,6 +47,7 @@ ts_library( "//packages/localize", "//packages/localize/init", "//packages/platform-browser", + "//packages/platform-browser/animations", "//packages/platform-server", "//packages/private/testing", "//packages/router", diff --git a/packages/platform-server/test/integration_spec.ts b/packages/platform-server/test/integration_spec.ts index 0505df4addc9..481b3cc2d81b 100644 --- a/packages/platform-server/test/integration_spec.ts +++ b/packages/platform-server/test/integration_spec.ts @@ -66,6 +66,7 @@ import {provideRouter, RouterOutlet, Routes} from '@angular/router'; import {Observable} from 'rxjs'; import {renderApplication, SERVER_CONTEXT} from '../src/utils'; +import {BrowserAnimationsModule, provideAnimations} from '@angular/platform-browser/animations'; const APP_CONFIG: ApplicationConfig = { providers: [provideServerRendering()], @@ -390,11 +391,13 @@ function createMyAnimationApp(standalone: boolean) { } const MyAnimationApp = createMyAnimationApp(false); -const MyAnimationAppStandalone = getStandaloneBootstrapFn(createMyAnimationApp(true)); +const MyAnimationAppStandalone = getStandaloneBootstrapFn(createMyAnimationApp(true), [ + provideAnimations(), +]); @NgModule({ declarations: [MyAnimationApp], - imports: [BrowserModule, ServerModule], + imports: [BrowserModule, BrowserAnimationsModule, ServerModule], bootstrap: [MyAnimationApp], }) class AnimationServerModule {} From c03f45ce8e8e64e7a31311d3b8ea79ba5b5d26ae Mon Sep 17 00:00:00 2001 From: Doug Parker Date: Tue, 28 Jan 2025 11:57:08 -0800 Subject: [PATCH 0217/1220] docs: updates versioning docs to recommend that fixes in an RC period be released as a `-next` release prior to hitting stable (#59766) PR Close #59766 --- contributing-docs/branches-and-versioning.md | 4 ++++ contributing-docs/caretaking.md | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/contributing-docs/branches-and-versioning.md b/contributing-docs/branches-and-versioning.md index b3b7a1d445ad..54a5d56dab3c 100644 --- a/contributing-docs/branches-and-versioning.md +++ b/contributing-docs/branches-and-versioning.md @@ -92,6 +92,10 @@ The vast majority of pull requests will target `major`, `minor`, or `patch` base the code change. In rare cases, a pull request will specify `target: rc` or `target: lts` to explicitly target a special branch. +Note that PRs merged with `target: rc` often benefit from additional testing in an RC release. +Therefore PR authors and caretakers should consider publishing a new `-next` release after merging +any PRs to an RC branch to support extra testing before the stable release. + Breaking changes, marked with `target: major`, can only be merged when `main` represents the next major version. diff --git a/contributing-docs/caretaking.md b/contributing-docs/caretaking.md index 31a2ff653991..c49a2c3c5ca5 100644 --- a/contributing-docs/caretaking.md +++ b/contributing-docs/caretaking.md @@ -39,7 +39,7 @@ adding a review comment that starts with `TESTED=` and then put a reason why the tested. The `requires: TGP` label is automatically added to PRs that affect files matching `separateFilePatterns` in [`.ng-dev/google-sync-config.json`](https://github.com/angular/angular/blob/main/.ng-dev/google-sync-config.json). -An example of specfying a `TESTED=` comment: +An example of specifying a `TESTED=` comment: ``` TESTED=docs only update and does not need a TGP ``` From b5f90181485f731b42e6dac52b2537c60b7786fc Mon Sep 17 00:00:00 2001 From: Dmitry Ivanitskiy Date: Wed, 29 Jan 2025 00:53:41 +0300 Subject: [PATCH 0218/1220] docs: fix programmatic-rendering example (#59768) Fixes example of programmatically rendering of components using dynamic import, as calling dynamic import returns module namespace object rather than component instance PR Close #59768 --- adev/src/content/guide/components/programmatic-rendering.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/adev/src/content/guide/components/programmatic-rendering.md b/adev/src/content/guide/components/programmatic-rendering.md index 52eb65267d5f..9975fae62f3a 100644 --- a/adev/src/content/guide/components/programmatic-rendering.md +++ b/adev/src/content/guide/components/programmatic-rendering.md @@ -117,10 +117,11 @@ JavaScript [dynamic import](https://developer.mozilla.org/docs/Web/JavaScript/Re ` }) export class AdminSettings { - advancedSettings: {new(): AdminSettings} | undefined; + advancedSettings: {new(): AdvancedSettings} | undefined; async loadAdvanced() { - this.advancedSettings = await import('path/to/advanced_settings.js'); + const { AdvancedSettings } = await import('path/to/advanced_settings.js'); + this.advancedSettings = AdvancedSettings; } } ``` From eb9dca3120bb80bb51585b344e9aed332b017a32 Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Wed, 29 Jan 2025 15:10:08 -0800 Subject: [PATCH 0219/1220] docs: release notes for the v19.1.4 release --- CHANGELOG.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8fcc47b1459d..6498de73c0ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,33 @@ + +# 19.1.4 (2025-01-29) +### core +| Commit | Type | Description | +| -- | -- | -- | +| [544b9ee7ca0](https://github.com/angular/angular/commit/544b9ee7ca00925e62b7c74cf7930777a10aaf76) | fix | check whether application is destroyed before printing hydration stats ([#59716](https://github.com/angular/angular/pull/59716)) | +| [d6e78c072dc](https://github.com/angular/angular/commit/d6e78c072dcb5b0b6efc2b098fdb911ccddf6e81) | fix | ensure type is preserved during HMR ([#59700](https://github.com/angular/angular/pull/59700)) | +| [c2436702df9](https://github.com/angular/angular/commit/c2436702df980bbf2db0fe3bee4c72860edb4e63) | fix | fixes test timer-based test flakiness in CI ([#59674](https://github.com/angular/angular/pull/59674)) | +### elements +| Commit | Type | Description | +| -- | -- | -- | +| [44180645992](https://github.com/angular/angular/commit/44180645992f7d9018ccb2d7663530b3cffde36b) | fix | not setting initial value on signal-based input ([#59773](https://github.com/angular/angular/pull/59773)) | +### platform-browser +| Commit | Type | Description | +| -- | -- | -- | +| [1828a840620](https://github.com/angular/angular/commit/1828a8406201827e52549c8afa487bf6364a70c3) | fix | prepend `baseHref` to `sourceMappingURL` in CSS content ([#59730](https://github.com/angular/angular/pull/59730)) | +| [1c84cbca30e](https://github.com/angular/angular/commit/1c84cbca30e6606e6df3f40346989d9434d89bc6) | fix | Update pseudoevent created by createMouseSpecialEvent to populate `_originalEvent` property ([#59690](https://github.com/angular/angular/pull/59690)) | +| [12256574626](https://github.com/angular/angular/commit/12256574626f04f5fe2b41e805f7bdc93d62df0a) | fix | Update pseudoevent created by createMouseSpecialEvent to populate `_originalEvent` property ([#59690](https://github.com/angular/angular/pull/59690)) | +| [3f4d5f636aa](https://github.com/angular/angular/commit/3f4d5f636aac90cabe32ff6c4d75180ced99eb97) | fix | Update pseudoevent created by createMouseSpecialEvent to populate `_originalEvent` property ([#59690](https://github.com/angular/angular/pull/59690)) | +### router +| Commit | Type | Description | +| -- | -- | -- | +| [e3da35ec749](https://github.com/angular/angular/commit/e3da35ec749395239731158f89e29d47e7a9ef36) | fix | prevent error handling when injector is destroyed ([#59457](https://github.com/angular/angular/pull/59457)) | +### service-worker +| Commit | Type | Description | +| -- | -- | -- | +| [522acbf3d7e](https://github.com/angular/angular/commit/522acbf3d7ed502e7802117776acda3529a9a2b4) | fix | add missing `rxjs` peer dependency ([#59747](https://github.com/angular/angular/pull/59747)) | + + + # 19.2.0-next.0 (2025-01-22) ### compiler From 9723f034c3c2ccd71cf0c53d6226d120ce652ae8 Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Wed, 29 Jan 2025 15:14:18 -0800 Subject: [PATCH 0220/1220] release: cut the v19.2.0-next.1 release --- CHANGELOG.md | 39 +++++++++++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6498de73c0ea..fb9e32f0431b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,42 @@ + +# 19.2.0-next.1 (2025-01-29) +### core +| Commit | Type | Description | +| -- | -- | -- | +| [168516462a9](https://github.com/angular/angular/commit/168516462a9673b158fcaa38b8ce17bf684a8ac9) | feat | support default value in `resource()` ([#59655](https://github.com/angular/angular/pull/59655)) | +| [6c92d653493](https://github.com/angular/angular/commit/6c92d653493404a5f13aa59cde390bcbed973fb6) | fix | add `hasValue` narrowing to `ResourceRef` ([#59708](https://github.com/angular/angular/pull/59708)) | +| [96e602ebe9c](https://github.com/angular/angular/commit/96e602ebe9cdf7355befad22c11f9f91e0436e01) | fix | cancel in-progress request when same value is assigned ([#59280](https://github.com/angular/angular/pull/59280)) | +| [cf9054248d1](https://github.com/angular/angular/commit/cf9054248d1b8b5658c5f8b582cea71535f081c2) | fix | check whether application is destroyed before printing hydration stats ([#59716](https://github.com/angular/angular/pull/59716)) | +| [82876242e55](https://github.com/angular/angular/commit/82876242e557abbced793cff06c4d68c4721e6d2) | fix | ensure type is preserved during HMR ([#59700](https://github.com/angular/angular/pull/59700)) | +| [127fc0dc847](https://github.com/angular/angular/commit/127fc0dc847a4e8b62be36cdd980a067c4da974f) | fix | fix `resource()`'s `previous.state` ([#59708](https://github.com/angular/angular/pull/59708)) | +| [f862ace1819](https://github.com/angular/angular/commit/f862ace18191d7fda3b12fc3c6486c035a6b431d) | fix | fixes test timer-based test flakiness in CI ([#59674](https://github.com/angular/angular/pull/59674)) | +### elements +| Commit | Type | Description | +| -- | -- | -- | +| [0c1ecb453c8](https://github.com/angular/angular/commit/0c1ecb453c8b01447fb5a9f38fdfe9936a60abe5) | fix | not setting initial value on signal-based input ([#59773](https://github.com/angular/angular/pull/59773)) | +### platform-browser +| Commit | Type | Description | +| -- | -- | -- | +| [e6cb411e439](https://github.com/angular/angular/commit/e6cb411e4393a4b1f5852d3d7c5b9622504399b1) | fix | automatically disable animations on the server ([#59762](https://github.com/angular/angular/pull/59762)) | +| [6b09716754b](https://github.com/angular/angular/commit/6b09716754b979c98489a2710eda977e51fe92d0) | fix | prepend `baseHref` to `sourceMappingURL` in CSS content ([#59730](https://github.com/angular/angular/pull/59730)) | +| [fd7ee47bf70](https://github.com/angular/angular/commit/fd7ee47bf702029e481ad40362684f0a01ef2ec0) | fix | Update pseudoevent created by createMouseSpecialEvent to populate `_originalEvent` property ([#59690](https://github.com/angular/angular/pull/59690)) | +| [65cf061feb4](https://github.com/angular/angular/commit/65cf061feb402e1532cd06d0fda5d2b7749ac421) | fix | Update pseudoevent created by createMouseSpecialEvent to populate `_originalEvent` property ([#59690](https://github.com/angular/angular/pull/59690)) | +| [af9d74710c4](https://github.com/angular/angular/commit/af9d74710c460b0aaeaf3226533e9e544025523c) | fix | Update pseudoevent created by createMouseSpecialEvent to populate `_originalEvent` property ([#59690](https://github.com/angular/angular/pull/59690)) | +### platform-server +| Commit | Type | Description | +| -- | -- | -- | +| [fc5d187da5e](https://github.com/angular/angular/commit/fc5d187da5e8895d60caa35b7b59e234998eddf0) | fix | decouple server from animations module ([#59762](https://github.com/angular/angular/pull/59762)) | +### router +| Commit | Type | Description | +| -- | -- | -- | +| [c7b6e1107c6](https://github.com/angular/angular/commit/c7b6e1107c6fcc7ed1dbb7c7b8698b09bfa8f1cc) | fix | prevent error handling when injector is destroyed ([#59457](https://github.com/angular/angular/pull/59457)) | +### service-worker +| Commit | Type | Description | +| -- | -- | -- | +| [e2987a1d4ab](https://github.com/angular/angular/commit/e2987a1d4ab09b1abf1f42597c40f2055db116e1) | fix | add missing `rxjs` peer dependency ([#59747](https://github.com/angular/angular/pull/59747)) | + + + # 19.1.4 (2025-01-29) ### core diff --git a/package.json b/package.json index 14868803e838..904026e5add8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "angular-srcs", - "version": "19.2.0-next.0", + "version": "19.2.0-next.1", "private": true, "description": "Angular - a web framework for modern web apps", "homepage": "https://github.com/angular/angular", From 042ee75d1bc956979376deecb099265a9dc7717b Mon Sep 17 00:00:00 2001 From: Sam Knutson Date: Wed, 23 Oct 2024 09:07:37 -0400 Subject: [PATCH 0221/1220] 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 0222/1220] 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 0223/1220] 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 0224/1220] 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 0225/1220] 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 0226/1220] 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 0227/1220] 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 0228/1220] 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 0229/1220] 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 0230/1220] 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 0231/1220] 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 0232/1220] 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 0233/1220] 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 0234/1220] 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 0235/1220] 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 0236/1220] 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 0237/1220] 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 0238/1220] 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 0239/1220] 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 0240/1220] 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 0241/1220] 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 0242/1220] 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 0243/1220] =?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 0244/1220] 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 0245/1220] 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 0246/1220] 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 0247/1220] 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 0248/1220] 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 0249/1220] 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 0250/1220] 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 0251/1220] 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 0252/1220] 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 0253/1220] 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 0254/1220] 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 0255/1220] 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 0256/1220] 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 0257/1220] 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 0258/1220] 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 0259/1220] 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 0260/1220] 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 0261/1220] 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 0262/1220] 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 0263/1220] 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 0264/1220] 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 0265/1220] 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 0266/1220] 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 0267/1220] 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 0268/1220] 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 0269/1220] 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 0270/1220] 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 0271/1220] 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 0272/1220] 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 0273/1220] 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 0274/1220] 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 0275/1220] 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 0276/1220] 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 0277/1220] 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 0278/1220] 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 0279/1220] 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 0280/1220] 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 0281/1220] 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 0282/1220] 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 0283/1220] 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 0284/1220] 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 0285/1220] 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 0286/1220] 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 0287/1220] 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 0288/1220] 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 0289/1220] 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 0290/1220] 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 0291/1220] 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 0292/1220] 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 0293/1220] 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 0294/1220] 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 0295/1220] 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 0296/1220] 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 0297/1220] 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 0298/1220] 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 0299/1220] 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 0300/1220] 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 0301/1220] 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 0302/1220] 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 0303/1220] 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 0304/1220] 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 0305/1220] 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 0306/1220] 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 0307/1220] 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 0308/1220] 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 0309/1220] 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 0310/1220] 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 0311/1220] 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 0312/1220] 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 0313/1220] 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 0314/1220] 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 0315/1220] 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 0316/1220] 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 0317/1220] 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 0318/1220] 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 0319/1220] 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 0320/1220] 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 0321/1220] 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 0322/1220] 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 0323/1220] 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 0324/1220] 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 0325/1220] 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 0326/1220] 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 0327/1220] 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 0328/1220] 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 0329/1220] 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 0330/1220] 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 0331/1220] 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 0332/1220] 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 0333/1220] 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 0334/1220] 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 0335/1220] 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 0336/1220] 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 0337/1220] 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 0338/1220] 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 0339/1220] 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 0340/1220] 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 0341/1220] 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 0342/1220] 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 0343/1220] 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 0344/1220] 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