From bdc287626402a9780c7c177df473ccb94a08132a Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Thu, 13 Mar 2025 18:33:03 +0100 Subject: [PATCH 01/61] feat: add TestBedComponentBuilder.ts for component creation feat: add provider story in angular storybook template --- .../utils/TestBedComponentBuilder.ts | 39 +++++++++++++++++++ .../provider-with-module-wrapper.stories.ts | 24 ++++++++++++ .../test-component/provider-button.ts | 22 +++++++++++ 3 files changed, 85 insertions(+) create mode 100644 code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts create mode 100644 code/frameworks/angular/template/stories/core/provider/provider-with-module-wrapper.stories.ts create mode 100644 code/frameworks/angular/template/stories/core/provider/test-component/provider-button.ts diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts new file mode 100644 index 000000000000..3cd220cdb090 --- /dev/null +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts @@ -0,0 +1,39 @@ +import { TestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting, +} from '@angular/platform-browser-dynamic/testing'; +import { ApplicationRef, Provider, Type } from '@angular/core'; +import { PropertyExtractor } from './PropertyExtractor'; + +export const initTestBed = () => { + TestBed.initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting()); +}; + +export const resetTestBed = () => { + TestBed.resetTestingModule(); + TestBed.resetTestEnvironment(); +}; + +export const buildComponent = async ( + analyzedMetadata: PropertyExtractor, + storyComponent: Type | undefined +) => { + const { imports, declarations, providers } = analyzedMetadata; + await TestBed.configureTestingModule({ + imports: [imports], + declarations: declarations, + providers: providers, + }) + .overrideComponent(storyComponent, { + // set: { + // providers: providers, + // }, + }) + .compileComponents(); + return TestBed.createComponent(storyComponent); +}; + +export const getApplicationRef = () => { + return TestBed.inject(ApplicationRef); +}; diff --git a/code/frameworks/angular/template/stories/core/provider/provider-with-module-wrapper.stories.ts b/code/frameworks/angular/template/stories/core/provider/provider-with-module-wrapper.stories.ts new file mode 100644 index 000000000000..c1df26e6545e --- /dev/null +++ b/code/frameworks/angular/template/stories/core/provider/provider-with-module-wrapper.stories.ts @@ -0,0 +1,24 @@ +import { Meta, StoryObj, moduleMetadata } from '@storybook/angular'; +import ProviderButtonComponent, { ApiService } from './test-component/provider-button'; + +class MockService { + data: string = 'Mock Service'; +} + +const mockService = new MockService(); + +const meta: Meta = { + component: ProviderButtonComponent, + tags: ['autodocs'], + decorators: [ + moduleMetadata({ + providers: [{ provide: ApiService, useValue: mockService }], + }), + ], +}; + +export default meta; + +type Story = StoryObj; + +export const ProviderTest: Story = {}; diff --git a/code/frameworks/angular/template/stories/core/provider/test-component/provider-button.ts b/code/frameworks/angular/template/stories/core/provider/test-component/provider-button.ts new file mode 100644 index 000000000000..2dfcce88a1ee --- /dev/null +++ b/code/frameworks/angular/template/stories/core/provider/test-component/provider-button.ts @@ -0,0 +1,22 @@ +import { Component, Injectable } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +@Injectable() +export class ApiService { + data: string = 'original Api Service'; +} + +@Component({ + standalone: true, + imports: [CommonModule], + // Needs to be a different name to the CLI template button + template: ``, + providers: [ApiService], +}) +export default class ProviderButtonComponent { + constructor(private apiService: ApiService) { + this.label = apiService.data; + } + + label = 'NotSetYet'; +} From 7dfc0d5095ef791430293406280e90203e029e4f Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Tue, 18 Mar 2025 19:51:34 +0100 Subject: [PATCH 02/61] feat: add dependency at component level fix WIP --- code/frameworks/angular/package.json | 4 +- .../client/angular-beta/AbstractRenderer.ts | 39 ++++++++++++++----- .../utils/TestBedComponentBuilder.ts | 20 ++++++---- .../provider-with-module-wrapper.stories.ts | 6 ++- .../test-component/provider-button.ts | 1 + 5 files changed, 50 insertions(+), 20 deletions(-) diff --git a/code/frameworks/angular/package.json b/code/frameworks/angular/package.json index 35ca6a1bbeaa..b84c9091660c 100644 --- a/code/frameworks/angular/package.json +++ b/code/frameworks/angular/package.json @@ -55,14 +55,14 @@ "ts-dedent": "^2.0.0", "tsconfig-paths-webpack-plugin": "^4.0.1", "util-deprecate": "^1.0.2", - "webpack": "5" + "webpack": "5", + "@angular/animations": "^19.1.1" }, "devDependencies": { "@analogjs/vite-plugin-angular": "^1.12.1", "@angular-devkit/architect": "^0.1901.1", "@angular-devkit/build-angular": "^19.1.1", "@angular-devkit/core": "^19.1.1", - "@angular/animations": "^19.1.1", "@angular/cli": "^19.1.1", "@angular/common": "^19.1.1", "@angular/compiler": "^19.1.1", diff --git a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts index b92177e56ce1..3ba41634b30f 100644 --- a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts +++ b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts @@ -4,10 +4,14 @@ import { BehaviorSubject, Subject } from 'rxjs'; import { stringify } from 'telejson'; import { ICollection, StoryFnAngularReturnType } from '../types'; -import { getApplication } from './StorybookModule'; import { storyPropsProvider } from './StorybookProvider'; import { queueBootstrapping } from './utils/BootstrapQueue'; import { PropertyExtractor } from './utils/PropertyExtractor'; +import { + buildComponent, + initTestBed, +} from './utils/TestBedComponentBuilder'; +import { computesTemplateFromComponent } from './ComputesTemplateFromComponent'; type StoryRenderInfo = { storyFnAngular: StoryFnAngularReturnType; @@ -111,12 +115,24 @@ export abstract class AbstractRenderer { element.toggleAttribute(storyUid, true); } - const application = getApplication({ - storyFnAngular, - component, - targetSelector: componentSelector, - analyzedMetadata, - }); + // const application = getApplication({ + // storyFnAngular, + // component, + // targetSelector: componentSelector, + // analyzedMetadata, + // }); + let { template } = storyFnAngular; + console.log('Template', template); + const { props } = storyFnAngular; + const hasTemplate = !(template == null || template == undefined); + if (!hasTemplate && component) { + template = computesTemplateFromComponent(component, props, ''); + } + console.log('Template after', template); + console.log('Component', component); + initTestBed(); + const application = await buildComponent(analyzedMetadata, component, componentSelector); + console.log('ComponentFixture', application); const providers = [ storyPropsProvider(newStoryProps$), @@ -132,14 +148,19 @@ export abstract class AbstractRenderer { providers.unshift(provideExperimentalZonelessChangeDetection()); } } - + console.log('StoryFnAngular', storyFnAngular); + console.log('Providers', providers); const applicationRef = await queueBootstrapping(() => { - return bootstrapApplication(application, { + return bootstrapApplication(application.componentRef.componentType, { ...storyFnAngular.applicationConfig, providers, }); }); + // const applicationRef = getApplicationRef(application, componentSelector); + console.log('AppRef', applicationRef); + console.log('TargetDomNode', targetDOMNode); + applicationRefs.set(targetDOMNode, applicationRef); } diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts index 3cd220cdb090..514f5015d933 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts @@ -1,4 +1,4 @@ -import { TestBed } from '@angular/core/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { BrowserDynamicTestingModule, platformBrowserDynamicTesting, @@ -7,6 +7,7 @@ import { ApplicationRef, Provider, Type } from '@angular/core'; import { PropertyExtractor } from './PropertyExtractor'; export const initTestBed = () => { + resetTestBed(); TestBed.initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting()); }; @@ -17,23 +18,26 @@ export const resetTestBed = () => { export const buildComponent = async ( analyzedMetadata: PropertyExtractor, - storyComponent: Type | undefined + storyComponent: Type | undefined, + selector: string ) => { const { imports, declarations, providers } = analyzedMetadata; await TestBed.configureTestingModule({ - imports: [imports], + imports: imports, declarations: declarations, providers: providers, }) .overrideComponent(storyComponent, { - // set: { - // providers: providers, - // }, + set: { + providers: providers, + selector: selector, + }, }) .compileComponents(); + return TestBed.createComponent(storyComponent); }; -export const getApplicationRef = () => { - return TestBed.inject(ApplicationRef); +export const getApplicationRef = (fixture: ComponentFixture, componentSelector: string) => { + const appRef = TestBed.inject(ApplicationRef); }; diff --git a/code/frameworks/angular/template/stories/core/provider/provider-with-module-wrapper.stories.ts b/code/frameworks/angular/template/stories/core/provider/provider-with-module-wrapper.stories.ts index c1df26e6545e..1f5c33f8a0e0 100644 --- a/code/frameworks/angular/template/stories/core/provider/provider-with-module-wrapper.stories.ts +++ b/code/frameworks/angular/template/stories/core/provider/provider-with-module-wrapper.stories.ts @@ -21,4 +21,8 @@ export default meta; type Story = StoryObj; -export const ProviderTest: Story = {}; +export const ProviderTest: Story = { + args: { + label: 'Test', + }, +}; diff --git a/code/frameworks/angular/template/stories/core/provider/test-component/provider-button.ts b/code/frameworks/angular/template/stories/core/provider/test-component/provider-button.ts index 2dfcce88a1ee..b1579c25efd8 100644 --- a/code/frameworks/angular/template/stories/core/provider/test-component/provider-button.ts +++ b/code/frameworks/angular/template/stories/core/provider/test-component/provider-button.ts @@ -11,6 +11,7 @@ export class ApiService { imports: [CommonModule], // Needs to be a different name to the CLI template button template: ``, + selector: 'app-provider-button', providers: [ApiService], }) export default class ProviderButtonComponent { From df1923d19401b01b5baf1cd236bbd8dcc98810a4 Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Tue, 18 Mar 2025 22:05:09 +0100 Subject: [PATCH 03/61] feat: add dependency at component level fix WIP --- .../client/angular-beta/AbstractRenderer.ts | 40 +++---------------- .../utils/TestBedComponentBuilder.ts | 18 ++++++--- 2 files changed, 18 insertions(+), 40 deletions(-) diff --git a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts index 3ba41634b30f..8f9db240bfa1 100644 --- a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts +++ b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts @@ -7,10 +7,7 @@ import { ICollection, StoryFnAngularReturnType } from '../types'; import { storyPropsProvider } from './StorybookProvider'; import { queueBootstrapping } from './utils/BootstrapQueue'; import { PropertyExtractor } from './utils/PropertyExtractor'; -import { - buildComponent, - initTestBed, -} from './utils/TestBedComponentBuilder'; +import { buildComponent, getApplicationRef, initTestBed, resetTestBed } from './utils/TestBedComponentBuilder'; import { computesTemplateFromComponent } from './ComputesTemplateFromComponent'; type StoryRenderInfo = { @@ -115,25 +112,6 @@ export abstract class AbstractRenderer { element.toggleAttribute(storyUid, true); } - // const application = getApplication({ - // storyFnAngular, - // component, - // targetSelector: componentSelector, - // analyzedMetadata, - // }); - let { template } = storyFnAngular; - console.log('Template', template); - const { props } = storyFnAngular; - const hasTemplate = !(template == null || template == undefined); - if (!hasTemplate && component) { - template = computesTemplateFromComponent(component, props, ''); - } - console.log('Template after', template); - console.log('Component', component); - initTestBed(); - const application = await buildComponent(analyzedMetadata, component, componentSelector); - console.log('ComponentFixture', application); - const providers = [ storyPropsProvider(newStoryProps$), ...analyzedMetadata.applicationProviders, @@ -148,18 +126,12 @@ export abstract class AbstractRenderer { providers.unshift(provideExperimentalZonelessChangeDetection()); } } - console.log('StoryFnAngular', storyFnAngular); - console.log('Providers', providers); - const applicationRef = await queueBootstrapping(() => { - return bootstrapApplication(application.componentRef.componentType, { - ...storyFnAngular.applicationConfig, - providers, - }); - }); - // const applicationRef = getApplicationRef(application, componentSelector); - console.log('AppRef', applicationRef); - console.log('TargetDomNode', targetDOMNode); + initTestBed(); + const application = await buildComponent(analyzedMetadata, component, componentSelector); + // has to bet let or var because const not working + const applicationRef = getApplicationRef(); + applicationRef.bootstrap(application.componentRef.componentType); applicationRefs.set(targetDOMNode, applicationRef); } diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts index 514f5015d933..c920dad49487 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts @@ -7,13 +7,19 @@ import { ApplicationRef, Provider, Type } from '@angular/core'; import { PropertyExtractor } from './PropertyExtractor'; export const initTestBed = () => { - resetTestBed(); - TestBed.initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting()); + if (TestBed.platform == null) { + TestBed.initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting()); + } else { + resetTestBed(); + } }; export const resetTestBed = () => { - TestBed.resetTestingModule(); - TestBed.resetTestEnvironment(); + try { + TestBed.resetTestingModule().resetTestEnvironment(); + } catch (e) { + console.log('Failed to reset', e); + } }; export const buildComponent = async ( @@ -38,6 +44,6 @@ export const buildComponent = async ( return TestBed.createComponent(storyComponent); }; -export const getApplicationRef = (fixture: ComponentFixture, componentSelector: string) => { - const appRef = TestBed.inject(ApplicationRef); +export const getApplicationRef = () => { + return TestBed.inject(ApplicationRef); }; From 2dc32db23168ecd80d6f3893b44a19aa27263554 Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Thu, 3 Apr 2025 17:45:55 +0200 Subject: [PATCH 04/61] fix: error on reset/init testbed module --- .../client/angular-beta/AbstractRenderer.ts | 21 ++-- .../utils/TestBedComponentBuilder.ts | 115 +++++++++++------- 2 files changed, 83 insertions(+), 53 deletions(-) diff --git a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts index 8f9db240bfa1..90659d47bdf8 100644 --- a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts +++ b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts @@ -1,14 +1,11 @@ import { ApplicationRef, NgModule } from '@angular/core'; -import { bootstrapApplication } from '@angular/platform-browser'; import { BehaviorSubject, Subject } from 'rxjs'; import { stringify } from 'telejson'; import { ICollection, StoryFnAngularReturnType } from '../types'; import { storyPropsProvider } from './StorybookProvider'; -import { queueBootstrapping } from './utils/BootstrapQueue'; import { PropertyExtractor } from './utils/PropertyExtractor'; -import { buildComponent, getApplicationRef, initTestBed, resetTestBed } from './utils/TestBedComponentBuilder'; -import { computesTemplateFromComponent } from './ComputesTemplateFromComponent'; +import { TestBedComponentBuilder } from './utils/TestBedComponentBuilder'; type StoryRenderInfo = { storyFnAngular: StoryFnAngularReturnType; @@ -22,7 +19,6 @@ declare global { } const applicationRefs = new Map(); - /** * Attribute name for the story UID that may be written to the targetDOMNode. * @@ -127,11 +123,16 @@ export abstract class AbstractRenderer { } } - initTestBed(); - const application = await buildComponent(analyzedMetadata, component, componentSelector); - // has to bet let or var because const not working - const applicationRef = getApplicationRef(); - applicationRef.bootstrap(application.componentRef.componentType); + const componentBuilder = new TestBedComponentBuilder(); + const componentFixture = await componentBuilder + .setComponent(component) + .setSelector(componentSelector) + .setMetaData(analyzedMetadata) + .configureModule() + .compileComponents(); + + const applicationRef = componentBuilder.getApplicationRef(); + applicationRef.bootstrap(componentFixture.componentRef.componentType); applicationRefs.set(targetDOMNode, applicationRef); } diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts index c920dad49487..799a101aa79e 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts @@ -1,49 +1,78 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ComponentFixture, getTestBed, TestBed } from '@angular/core/testing'; import { BrowserDynamicTestingModule, platformBrowserDynamicTesting, } from '@angular/platform-browser-dynamic/testing'; -import { ApplicationRef, Provider, Type } from '@angular/core'; +import { ApplicationRef, Type } from '@angular/core'; import { PropertyExtractor } from './PropertyExtractor'; -export const initTestBed = () => { - if (TestBed.platform == null) { - TestBed.initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting()); - } else { - resetTestBed(); - } -}; - -export const resetTestBed = () => { - try { - TestBed.resetTestingModule().resetTestEnvironment(); - } catch (e) { - console.log('Failed to reset', e); - } -}; - -export const buildComponent = async ( - analyzedMetadata: PropertyExtractor, - storyComponent: Type | undefined, - selector: string -) => { - const { imports, declarations, providers } = analyzedMetadata; - await TestBed.configureTestingModule({ - imports: imports, - declarations: declarations, - providers: providers, - }) - .overrideComponent(storyComponent, { - set: { - providers: providers, - selector: selector, - }, - }) - .compileComponents(); - - return TestBed.createComponent(storyComponent); -}; - -export const getApplicationRef = () => { - return TestBed.inject(ApplicationRef); -}; +export class TestBedComponentBuilder { + private testBedInstance: TestBed; + + private component: Type | undefined = undefined; + + private imports: any[]; + + private declarations: any[]; + + private providers: any[]; + + private selector: string; + + constructor() { + this.testBedInstance = new TestBed(); + this.testBedInstance.initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() + ); + } + + setComponent(storyComponent: Type | undefined) { + this.component = storyComponent; + return this; + } + + setMetaData(analyzedMetadata: PropertyExtractor) { + const { imports, declarations, providers } = analyzedMetadata; + this.imports = imports; + this.declarations = declarations; + this.providers = providers; + return this; + } + + setSelector(selector: string) { + this.selector = selector; + return this; + } + + configureModule() { + this.throwOnRequiredNullProperties(); + this.testBedInstance + .configureTestingModule({ + imports: this.imports, + declarations: this.declarations, + providers: this.providers, + }) + .overrideComponent(this.component, { + set: { + providers: this.providers, + selector: this.selector, + }, + }); + return this; + } + + async compileComponents() { + await this.testBedInstance.compileComponents(); + return this.testBedInstance.createComponent(this.component); + } + + getApplicationRef() { + return this.testBedInstance.inject(ApplicationRef); + } + + private throwOnRequiredNullProperties() { + if (this.component == null || this.testBedInstance == null) + throw new Error("NullReference") + } +} From 5e90152db976883eabd7397dbeebdbbd0343ed88 Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Fri, 4 Apr 2025 23:58:27 +0200 Subject: [PATCH 05/61] refactor: testbed builder pattern and prop assignment --- .../client/angular-beta/AbstractRenderer.ts | 35 +++--- .../utils/TestBedComponentBuilder.ts | 115 ++++++++++++++---- .../provider-with-module-wrapper.stories.ts | 4 +- 3 files changed, 112 insertions(+), 42 deletions(-) diff --git a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts index 90659d47bdf8..6a274f0e1157 100644 --- a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts +++ b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts @@ -1,4 +1,4 @@ -import { ApplicationRef, NgModule } from '@angular/core'; +import { ApplicationRef, NgModule, Type } from '@angular/core'; import { BehaviorSubject, Subject } from 'rxjs'; import { stringify } from 'telejson'; @@ -19,6 +19,7 @@ declare global { } const applicationRefs = new Map(); +const componentBuilders: TestBedComponentBuilder[] = []; /** * Attribute name for the story UID that may be written to the targetDOMNode. * @@ -82,19 +83,14 @@ export abstract class AbstractRenderer { forced, }) ) { - this.storyProps$.next(storyFnAngular.props); + // ToDo: need some unique id to get the Testbed instance for prop update + // now there can be more instances for one component + this.getTestBedComponentBuilder(component).setAndUpdateProps(storyFnAngular.props); return; } - await this.beforeFullRender(targetDOMNode); - // Complete last BehaviorSubject and set a new one for the current module - if (this.storyProps$) { - this.storyProps$.complete(); - } - this.storyProps$ = newStoryProps$; - this.initAngularRootElement(targetDOMNode, targetSelector); const analyzedMetadata = new PropertyExtractor(storyFnAngular.moduleMetadata, component); @@ -108,7 +104,7 @@ export abstract class AbstractRenderer { element.toggleAttribute(storyUid, true); } - const providers = [ + const environmentProviders = [ storyPropsProvider(newStoryProps$), ...analyzedMetadata.applicationProviders, ...(storyFnAngular.applicationConfig?.providers ?? []), @@ -119,22 +115,28 @@ export abstract class AbstractRenderer { if (!provideExperimentalZonelessChangeDetection) { throw new Error('Experimental zoneless change detection requires Angular 18 or higher'); } else { - providers.unshift(provideExperimentalZonelessChangeDetection()); + environmentProviders.unshift(provideExperimentalZonelessChangeDetection()); } } - const componentBuilder = new TestBedComponentBuilder(); - const componentFixture = await componentBuilder + const componentBuilder = await new TestBedComponentBuilder() + .initTestBed() .setComponent(component) .setSelector(componentSelector) + .setStoryFn(storyFnAngular) .setMetaData(analyzedMetadata) + .setEnvironmentProviders(environmentProviders) .configureModule() .compileComponents(); - const applicationRef = componentBuilder.getApplicationRef(); - applicationRef.bootstrap(componentFixture.componentRef.componentType); + applicationRefs.set(targetDOMNode, componentBuilder.getApplicationRef()); + componentBuilders.push(componentBuilder); + } - applicationRefs.set(targetDOMNode, applicationRef); + getTestBedComponentBuilder(component: Type) { + for (const componentBuilder of componentBuilders) { + if (componentBuilder.isInstanceFor(component)) return componentBuilder; + } } /** @@ -195,7 +197,6 @@ export abstract class AbstractRenderer { forced: boolean; }) { const previousStoryRenderInfo = this.previousStoryRenderInfo.get(targetDOMNode); - const currentStoryRender = { storyFnAngular, moduleMetadataSnapshot: stringify(moduleMetadata, { allowFunction: false }), diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts index 799a101aa79e..31b4957f5084 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts @@ -1,42 +1,66 @@ -import { ComponentFixture, getTestBed, TestBed } from '@angular/core/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { BrowserDynamicTestingModule, platformBrowserDynamicTesting, } from '@angular/platform-browser-dynamic/testing'; -import { ApplicationRef, Type } from '@angular/core'; +import { ApplicationRef, Component, Type } from '@angular/core'; import { PropertyExtractor } from './PropertyExtractor'; +import { ICollection, StoryFnAngularReturnType } from '../../types'; export class TestBedComponentBuilder { private testBedInstance: TestBed; - private component: Type | undefined = undefined; + private component: Type | undefined; - private imports: any[]; + private fixture: ComponentFixture; - private declarations: any[]; + private imports: any[] = []; - private providers: any[]; + private declarations: any[] = []; + + private componentProviders: any[] = []; + + private environmentProvider: any[] = []; private selector: string; - constructor() { - this.testBedInstance = new TestBed(); - this.testBedInstance.initTestEnvironment( - BrowserDynamicTestingModule, - platformBrowserDynamicTesting() - ); - } + private props: ICollection; + + private isUserDefinedTemplate = false; + + private userDefinedTemplate: string; + + private schemas: any[] = []; + + private styles: string[] = []; + + private id: string; setComponent(storyComponent: Type | undefined) { this.component = storyComponent; return this; } - setMetaData(analyzedMetadata: PropertyExtractor) { - const { imports, declarations, providers } = analyzedMetadata; - this.imports = imports; - this.declarations = declarations; - this.providers = providers; + setStoryFn(storyFn: StoryFnAngularReturnType) { + this.styles = storyFn.styles ?? []; + this.schemas = storyFn.moduleMetadata?.schemas ?? []; + this.isUserDefinedTemplate = storyFn.userDefinedTemplate; + this.userDefinedTemplate = storyFn.template; + this.props = storyFn.props; + return this; + } + + setMetaData(metaData: PropertyExtractor) { + const { imports, declarations, providers } = metaData; + this.imports = imports ?? []; + this.declarations = declarations ?? []; + this.componentProviders = providers ?? []; + return this; + } + + setEnvironmentProviders(providers: any[]) { + if (providers == null) return this; + this.environmentProvider = providers ?? []; return this; } @@ -45,34 +69,77 @@ export class TestBedComponentBuilder { return this; } + setAndUpdateProps(props: ICollection) { + this.props = props ?? []; + this.updateComponentProps(); + return this; + } + configureModule() { this.throwOnRequiredNullProperties(); + if (this.isUserDefinedTemplate) { + this.component = getWrapper(this.selector, this.userDefinedTemplate); + } + this.testBedInstance .configureTestingModule({ - imports: this.imports, + providers: this.environmentProvider, declarations: this.declarations, - providers: this.providers, + imports: this.imports, }) .overrideComponent(this.component, { set: { - providers: this.providers, + providers: this.componentProviders, selector: this.selector, + schemas: this.schemas, + styles: this.styles, }, }); return this; } + initTestBed() { + this.testBedInstance = new TestBed(); + this.testBedInstance.initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() + ); + return this; + } + async compileComponents() { await this.testBedInstance.compileComponents(); - return this.testBedInstance.createComponent(this.component); + this.fixture = this.testBedInstance.createComponent(this.component); + this.updateComponentProps(); + this.id = this.fixture.nativeElement.id; + return this; } getApplicationRef() { return this.testBedInstance.inject(ApplicationRef); } + isInstanceFor(component: Type) { + return this.component == component; + } + + private updateComponentProps() { + this.fixture.componentInstance = Object.assign(this.fixture.componentInstance, this.props); + this.fixture.detectChanges(); + return this; + } + private throwOnRequiredNullProperties() { - if (this.component == null || this.testBedInstance == null) - throw new Error("NullReference") + if (this.component == null || this.testBedInstance == null) throw new Error('NullReference'); } } + +export const getWrapper = (selector: string, template: string) => { + @Component({ + selector, + template, + standalone: true, + }) + class CustomWrapperComponent {} + return CustomWrapperComponent; +}; diff --git a/code/frameworks/angular/template/stories/core/provider/provider-with-module-wrapper.stories.ts b/code/frameworks/angular/template/stories/core/provider/provider-with-module-wrapper.stories.ts index 1f5c33f8a0e0..763c002bba91 100644 --- a/code/frameworks/angular/template/stories/core/provider/provider-with-module-wrapper.stories.ts +++ b/code/frameworks/angular/template/stories/core/provider/provider-with-module-wrapper.stories.ts @@ -21,7 +21,9 @@ export default meta; type Story = StoryObj; -export const ProviderTest: Story = { +export const ProviderTestWithoutArgs: Story = {}; + +export const ProviderTestWithArgs: Story = { args: { label: 'Test', }, From 87466cf5d913791339c7d4168ac64bb635a6adcf Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Mon, 14 Apr 2025 18:56:39 +0200 Subject: [PATCH 06/61] fix: not standalone angular schematics --- .../client/angular-beta/AbstractRenderer.ts | 3 +- .../utils/TestBedComponentBuilder.ts | 98 +++++++++++++------ 2 files changed, 71 insertions(+), 30 deletions(-) diff --git a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts index 6a274f0e1157..aa3df690bbf0 100644 --- a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts +++ b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts @@ -72,7 +72,7 @@ export abstract class AbstractRenderer { const targetSelector = this.generateTargetSelectorFromStoryId(targetDOMNode.id); const newStoryProps$ = new BehaviorSubject(storyFnAngular.props); - + console.log('Selector', targetSelector); if ( !this.fullRendererRequired({ targetDOMNode, @@ -137,6 +137,7 @@ export abstract class AbstractRenderer { for (const componentBuilder of componentBuilders) { if (componentBuilder.isInstanceFor(component)) return componentBuilder; } + return null; } /** diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts index 31b4957f5084..dc834315e694 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts @@ -1,9 +1,9 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ComponentFixture, MetadataOverride, TestBed } from '@angular/core/testing'; import { BrowserDynamicTestingModule, platformBrowserDynamicTesting, } from '@angular/platform-browser-dynamic/testing'; -import { ApplicationRef, Component, Type } from '@angular/core'; +import { ApplicationRef, Component, NgModule, Type } from '@angular/core'; import { PropertyExtractor } from './PropertyExtractor'; import { ICollection, StoryFnAngularReturnType } from '../../types'; @@ -20,7 +20,7 @@ export class TestBedComponentBuilder { private componentProviders: any[] = []; - private environmentProvider: any[] = []; + private environmentProviders: any[] = []; private selector: string; @@ -30,9 +30,9 @@ export class TestBedComponentBuilder { private userDefinedTemplate: string; - private schemas: any[] = []; + private schemas: any[]; - private styles: string[] = []; + private styles: string[]; private id: string; @@ -42,8 +42,8 @@ export class TestBedComponentBuilder { } setStoryFn(storyFn: StoryFnAngularReturnType) { - this.styles = storyFn.styles ?? []; - this.schemas = storyFn.moduleMetadata?.schemas ?? []; + this.styles = storyFn.styles; + this.schemas = storyFn.moduleMetadata?.schemas; this.isUserDefinedTemplate = storyFn.userDefinedTemplate; this.userDefinedTemplate = storyFn.template; this.props = storyFn.props; @@ -52,15 +52,15 @@ export class TestBedComponentBuilder { setMetaData(metaData: PropertyExtractor) { const { imports, declarations, providers } = metaData; - this.imports = imports ?? []; - this.declarations = declarations ?? []; - this.componentProviders = providers ?? []; + this.imports = imports; + this.declarations = declarations; + this.componentProviders = providers; return this; } setEnvironmentProviders(providers: any[]) { if (providers == null) return this; - this.environmentProvider = providers ?? []; + this.environmentProviders = providers ?? []; return this; } @@ -70,7 +70,7 @@ export class TestBedComponentBuilder { } setAndUpdateProps(props: ICollection) { - this.props = props ?? []; + this.props = props; this.updateComponentProps(); return this; } @@ -78,26 +78,45 @@ export class TestBedComponentBuilder { configureModule() { this.throwOnRequiredNullProperties(); if (this.isUserDefinedTemplate) { - this.component = getWrapper(this.selector, this.userDefinedTemplate); + this.component = getWrapperComponent( + this.selector, + this.userDefinedTemplate, + this.componentProviders, + this.styles, + this.schemas + ); } - this.testBedInstance - .configureTestingModule({ - providers: this.environmentProvider, - declarations: this.declarations, - imports: this.imports, - }) - .overrideComponent(this.component, { - set: { - providers: this.componentProviders, - selector: this.selector, - schemas: this.schemas, - styles: this.styles, - }, - }); + const metaData = this.generateOverrideMetaData(); + this.testBedInstance.configureTestingModule({}).overrideComponent(this.component, metaData); return this; } + private generateOverrideMetaData() { + const overrideData: MetadataOverride = { set: {} }; + if (this.schemas != null && this.schemas.length != 0) { + overrideData.set.schemas = this.schemas; + } + if (this.componentProviders != null) { + overrideData.set.providers = this.componentProviders; + } + if (this.styles != null) { + overrideData.set.styles = this.styles; + } + if (this.selector != null) { + overrideData.set.selector = this.selector; + } + + const wrapperModule = getWrapperModule( + this.declarations, + this.imports, + this.environmentProviders + ); + overrideData.set.imports = [wrapperModule]; + + return overrideData; + } + initTestBed() { this.testBedInstance = new TestBed(); this.testBedInstance.initTestEnvironment( @@ -124,7 +143,8 @@ export class TestBedComponentBuilder { } private updateComponentProps() { - this.fixture.componentInstance = Object.assign(this.fixture.componentInstance, this.props); + if (this.props != null) + this.fixture.componentInstance = Object.assign(this.fixture.componentInstance, this.props); this.fixture.detectChanges(); return this; } @@ -134,12 +154,32 @@ export class TestBedComponentBuilder { } } -export const getWrapper = (selector: string, template: string) => { +export const getWrapperComponent = ( + selector: string, + template: string, + providers: any[], + styles: string[], + schemas: any[] +) => { @Component({ selector, template, standalone: true, + providers, + styles, + schemas: schemas, }) class CustomWrapperComponent {} return CustomWrapperComponent; }; + +export const getWrapperModule = (declarations: any[], imports: any[], moduleProviders: any[]) => { + @NgModule({ + declarations, + imports, + providers: [...moduleProviders], + exports: [...declarations, ...imports], + }) + class WrapperModule {} + return WrapperModule; +}; From 6937f05a5590f48c0eb19937ebeb2cb804252254 Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Mon, 14 Apr 2025 20:42:25 +0200 Subject: [PATCH 07/61] fix: multiple component declaration by wrapper module --- .../client/angular-beta/AbstractRenderer.ts | 27 ++- .../angular-beta/StorybookWrapperComponent.ts | 163 +++--------------- .../utils/TestBedComponentBuilder.ts | 67 +++---- 3 files changed, 56 insertions(+), 201 deletions(-) diff --git a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts index aa3df690bbf0..525776ce1740 100644 --- a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts +++ b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts @@ -19,7 +19,7 @@ declare global { } const applicationRefs = new Map(); -const componentBuilders: TestBedComponentBuilder[] = []; +let previousComponentBuilder: TestBedComponentBuilder = null; /** * Attribute name for the story UID that may be written to the targetDOMNode. * @@ -71,8 +71,6 @@ export abstract class AbstractRenderer { }) { const targetSelector = this.generateTargetSelectorFromStoryId(targetDOMNode.id); - const newStoryProps$ = new BehaviorSubject(storyFnAngular.props); - console.log('Selector', targetSelector); if ( !this.fullRendererRequired({ targetDOMNode, @@ -81,14 +79,17 @@ export abstract class AbstractRenderer { ...storyFnAngular.moduleMetadata, }, forced, - }) + }) && + previousComponentBuilder != null ) { - // ToDo: need some unique id to get the Testbed instance for prop update - // now there can be more instances for one component - this.getTestBedComponentBuilder(component).setAndUpdateProps(storyFnAngular.props); - + previousComponentBuilder.setAndUpdateProps(storyFnAngular.props); return; } + + if (previousComponentBuilder != null) { + previousComponentBuilder.resetTestBed(); + } + await this.beforeFullRender(targetDOMNode); this.initAngularRootElement(targetDOMNode, targetSelector); @@ -105,7 +106,6 @@ export abstract class AbstractRenderer { } const environmentProviders = [ - storyPropsProvider(newStoryProps$), ...analyzedMetadata.applicationProviders, ...(storyFnAngular.applicationConfig?.providers ?? []), ]; @@ -130,14 +130,7 @@ export abstract class AbstractRenderer { .compileComponents(); applicationRefs.set(targetDOMNode, componentBuilder.getApplicationRef()); - componentBuilders.push(componentBuilder); - } - - getTestBedComponentBuilder(component: Type) { - for (const componentBuilder of componentBuilders) { - if (componentBuilder.isInstanceFor(component)) return componentBuilder; - } - return null; + previousComponentBuilder = componentBuilder; } /** diff --git a/code/frameworks/angular/src/client/angular-beta/StorybookWrapperComponent.ts b/code/frameworks/angular/src/client/angular-beta/StorybookWrapperComponent.ts index 9c4dfa0c7368..9dd3e86036e0 100644 --- a/code/frameworks/angular/src/client/angular-beta/StorybookWrapperComponent.ts +++ b/code/frameworks/angular/src/client/angular-beta/StorybookWrapperComponent.ts @@ -1,153 +1,30 @@ -import { - AfterViewInit, - ChangeDetectorRef, - Component, - ElementRef, - Inject, - NgModule, - OnDestroy, - Type, - ViewChild, - ViewContainerRef, -} from '@angular/core'; -import { Subject, Subscription } from 'rxjs'; -import { map, skip } from 'rxjs/operators'; - -import { ICollection, NgModuleMetadata } from '../types'; -import { STORY_PROPS } from './StorybookProvider'; -import { ComponentInputsOutputs, getComponentInputsOutputs } from './utils/NgComponentAnalyzer'; -import { PropertyExtractor } from './utils/PropertyExtractor'; - -const getNonInputsOutputsProps = ( - ngComponentInputsOutputs: ComponentInputsOutputs, - props: ICollection = {} +import { Component, NgModule } from '@angular/core'; + +export const getWrapperComponent = ( + selector: string, + template: string, + providers: any[], + styles: string[], + schemas: any[] ) => { - const inputs = ngComponentInputsOutputs.inputs - .filter((i) => i.templateName in props) - .map((i) => i.templateName); - const outputs = ngComponentInputsOutputs.outputs - .filter((o) => o.templateName in props) - .map((o) => o.templateName); - return Object.keys(props).filter((k) => ![...inputs, ...outputs].includes(k)); -}; - -/** Wraps the story template into a component */ -export const createStorybookWrapperComponent = ({ - selector, - template, - storyComponent, - styles, - moduleMetadata, - initialProps, - analyzedMetadata, -}: { - selector: string; - template: string; - storyComponent: Type | undefined; - styles: string[]; - moduleMetadata: NgModuleMetadata; - initialProps?: ICollection; - analyzedMetadata: PropertyExtractor; -}): Type => { - // In ivy, a '' selector is not allowed, therefore we need to just set it to anything if - // storyComponent was not provided. - const viewChildSelector = storyComponent ?? '__storybook-noop'; - - const { imports, declarations, providers } = analyzedMetadata; - - @NgModule({ - declarations, - imports, - exports: [...declarations, ...imports], - }) - class StorybookComponentModule {} - - PropertyExtractor.warnImportsModuleWithProviders(analyzedMetadata); - @Component({ selector, template, standalone: true, - imports: [StorybookComponentModule], providers, styles, - schemas: moduleMetadata.schemas, + schemas: schemas, }) - class StorybookWrapperComponent implements AfterViewInit, OnDestroy { - private storyComponentPropsSubscription: Subscription; - - private storyWrapperPropsSubscription: Subscription; - - @ViewChild(viewChildSelector, { static: true }) storyComponentElementRef: ElementRef; - - @ViewChild(viewChildSelector, { read: ViewContainerRef, static: true }) - storyComponentViewContainerRef: ViewContainerRef; - - // Used in case of a component without selector - storyComponent = storyComponent ?? ''; - - constructor( - @Inject(STORY_PROPS) private storyProps$: Subject, - @Inject(ChangeDetectorRef) private changeDetectorRef: ChangeDetectorRef - ) {} - - ngOnInit(): void { - // Subscribes to the observable storyProps$ to keep these properties up to date - this.storyWrapperPropsSubscription = this.storyProps$.subscribe((storyProps = {}) => { - // All props are added as component properties - Object.assign(this, storyProps); - - this.changeDetectorRef.detectChanges(); - this.changeDetectorRef.markForCheck(); - }); - } - - ngAfterViewInit(): void { - // Bind properties to component, if the story have component - if (this.storyComponentElementRef) { - const ngComponentInputsOutputs = getComponentInputsOutputs(storyComponent); - - const initialOtherProps = getNonInputsOutputsProps(ngComponentInputsOutputs, initialProps); - - // Initializes properties that are not Inputs | Outputs - // Allows story props to override local component properties - initialOtherProps.forEach((p) => { - (this.storyComponentElementRef as any)[p] = initialProps[p]; - }); - // `markForCheck` the component in case this uses changeDetection: OnPush - // And then forces the `detectChanges` - this.storyComponentViewContainerRef.injector.get(ChangeDetectorRef).markForCheck(); - this.changeDetectorRef.detectChanges(); - - // Once target component has been initialized, the storyProps$ observable keeps target component properties than are not Input|Output up to date - this.storyComponentPropsSubscription = this.storyProps$ - .pipe( - skip(1), - map((props) => { - const propsKeyToKeep = getNonInputsOutputsProps(ngComponentInputsOutputs, props); - return propsKeyToKeep.reduce((acc, p) => ({ ...acc, [p]: props[p] }), {}); - }) - ) - .subscribe((props) => { - // Replace inputs with new ones from props - Object.assign(this.storyComponentElementRef, props); - - // `markForCheck` the component in case this uses changeDetection: OnPush - // And then forces the `detectChanges` - this.storyComponentViewContainerRef.injector.get(ChangeDetectorRef).markForCheck(); - this.changeDetectorRef.detectChanges(); - }); - } - } + class CustomWrapperComponent {} + return CustomWrapperComponent; +}; - ngOnDestroy(): void { - if (this.storyComponentPropsSubscription != null) { - this.storyComponentPropsSubscription.unsubscribe(); - } - if (this.storyWrapperPropsSubscription != null) { - this.storyWrapperPropsSubscription.unsubscribe(); - } - } - } - return StorybookWrapperComponent; +export const getWrapperModule = (declarations: any[], imports: any[]) => { + @NgModule({ + declarations: declarations, + imports: imports, + exports: [...declarations, ...imports], + }) + class WrapperModule {} + return WrapperModule; }; diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts index dc834315e694..ac62a22d2397 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts @@ -3,9 +3,18 @@ import { BrowserDynamicTestingModule, platformBrowserDynamicTesting, } from '@angular/platform-browser-dynamic/testing'; -import { ApplicationRef, Component, NgModule, Type } from '@angular/core'; +import { + ApplicationRef, + Component, + EnvironmentProviders, + importProvidersFrom, + Type, +} from '@angular/core'; import { PropertyExtractor } from './PropertyExtractor'; import { ICollection, StoryFnAngularReturnType } from '../../types'; +import { BrowserModule } from '@angular/platform-browser'; +import { getWrapperComponent, getWrapperModule } from '../StorybookWrapperComponent'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; export class TestBedComponentBuilder { private testBedInstance: TestBed; @@ -34,7 +43,10 @@ export class TestBedComponentBuilder { private styles: string[]; - private id: string; + // some providers need to be removed, due already provided on module level of testbed + private providersToRemove: EnvironmentProviders[] = [ + importProvidersFrom(BrowserDynamicTestingModule), + ]; setComponent(storyComponent: Type | undefined) { this.component = storyComponent; @@ -61,6 +73,9 @@ export class TestBedComponentBuilder { setEnvironmentProviders(providers: any[]) { if (providers == null) return this; this.environmentProviders = providers ?? []; + console.log('EnvironmentProviders', this.environmentProviders); + console.log('ProvidersToBeRemoved', this.providersToRemove); + console.log('AfterFilter', this.environmentProviders); return this; } @@ -88,7 +103,12 @@ export class TestBedComponentBuilder { } const metaData = this.generateOverrideMetaData(); - this.testBedInstance.configureTestingModule({}).overrideComponent(this.component, metaData); + this.testBedInstance + .configureTestingModule({ + providers: this.environmentProviders, + }) + .overrideComponent(this.component, metaData); + return this; } @@ -107,11 +127,7 @@ export class TestBedComponentBuilder { overrideData.set.selector = this.selector; } - const wrapperModule = getWrapperModule( - this.declarations, - this.imports, - this.environmentProviders - ); + const wrapperModule = getWrapperModule(this.declarations, this.imports); overrideData.set.imports = [wrapperModule]; return overrideData; @@ -130,7 +146,6 @@ export class TestBedComponentBuilder { await this.testBedInstance.compileComponents(); this.fixture = this.testBedInstance.createComponent(this.component); this.updateComponentProps(); - this.id = this.fixture.nativeElement.id; return this; } @@ -138,8 +153,8 @@ export class TestBedComponentBuilder { return this.testBedInstance.inject(ApplicationRef); } - isInstanceFor(component: Type) { - return this.component == component; + resetTestBed() { + this.testBedInstance.resetTestingModule().resetTestEnvironment(); } private updateComponentProps() { @@ -153,33 +168,3 @@ export class TestBedComponentBuilder { if (this.component == null || this.testBedInstance == null) throw new Error('NullReference'); } } - -export const getWrapperComponent = ( - selector: string, - template: string, - providers: any[], - styles: string[], - schemas: any[] -) => { - @Component({ - selector, - template, - standalone: true, - providers, - styles, - schemas: schemas, - }) - class CustomWrapperComponent {} - return CustomWrapperComponent; -}; - -export const getWrapperModule = (declarations: any[], imports: any[], moduleProviders: any[]) => { - @NgModule({ - declarations, - imports, - providers: [...moduleProviders], - exports: [...declarations, ...imports], - }) - class WrapperModule {} - return WrapperModule; -}; From 2f920fb83a704c4d93c30f83774bdf2caa9093d3 Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Mon, 14 Apr 2025 21:46:16 +0200 Subject: [PATCH 08/61] WIP: multiple import of some components causes error --- .../client/angular-beta/AbstractRenderer.ts | 23 +++++++++++-------- .../utils/TestBedComponentBuilder.ts | 12 ++-------- 2 files changed, 15 insertions(+), 20 deletions(-) diff --git a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts index 525776ce1740..b5ddb9b0aaf9 100644 --- a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts +++ b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts @@ -1,9 +1,8 @@ import { ApplicationRef, NgModule, Type } from '@angular/core'; -import { BehaviorSubject, Subject } from 'rxjs'; +import { Subject } from 'rxjs'; import { stringify } from 'telejson'; import { ICollection, StoryFnAngularReturnType } from '../types'; -import { storyPropsProvider } from './StorybookProvider'; import { PropertyExtractor } from './utils/PropertyExtractor'; import { TestBedComponentBuilder } from './utils/TestBedComponentBuilder'; @@ -19,7 +18,7 @@ declare global { } const applicationRefs = new Map(); -let previousComponentBuilder: TestBedComponentBuilder = null; +const componentBuilders: TestBedComponentBuilder[] = []; /** * Attribute name for the story UID that may be written to the targetDOMNode. * @@ -70,6 +69,7 @@ export abstract class AbstractRenderer { targetDOMNode: HTMLElement; }) { const targetSelector = this.generateTargetSelectorFromStoryId(targetDOMNode.id); + const testBedInstance = this.getTestBedInstance(component); if ( !this.fullRendererRequired({ @@ -80,16 +80,12 @@ export abstract class AbstractRenderer { }, forced, }) && - previousComponentBuilder != null + testBedInstance != null ) { - previousComponentBuilder.setAndUpdateProps(storyFnAngular.props); + testBedInstance.setAndUpdateProps(storyFnAngular.props); return; } - if (previousComponentBuilder != null) { - previousComponentBuilder.resetTestBed(); - } - await this.beforeFullRender(targetDOMNode); this.initAngularRootElement(targetDOMNode, targetSelector); @@ -130,7 +126,14 @@ export abstract class AbstractRenderer { .compileComponents(); applicationRefs.set(targetDOMNode, componentBuilder.getApplicationRef()); - previousComponentBuilder = componentBuilder; + componentBuilders.push(componentBuilder); + } + + getTestBedInstance(component: Type): TestBedComponentBuilder | null { + for (const builder of componentBuilders) { + if (builder.isInstanceOf(component)) return builder; + } + return null; } /** diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts index ac62a22d2397..c307055e9804 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts @@ -43,11 +43,6 @@ export class TestBedComponentBuilder { private styles: string[]; - // some providers need to be removed, due already provided on module level of testbed - private providersToRemove: EnvironmentProviders[] = [ - importProvidersFrom(BrowserDynamicTestingModule), - ]; - setComponent(storyComponent: Type | undefined) { this.component = storyComponent; return this; @@ -73,9 +68,6 @@ export class TestBedComponentBuilder { setEnvironmentProviders(providers: any[]) { if (providers == null) return this; this.environmentProviders = providers ?? []; - console.log('EnvironmentProviders', this.environmentProviders); - console.log('ProvidersToBeRemoved', this.providersToRemove); - console.log('AfterFilter', this.environmentProviders); return this; } @@ -153,8 +145,8 @@ export class TestBedComponentBuilder { return this.testBedInstance.inject(ApplicationRef); } - resetTestBed() { - this.testBedInstance.resetTestingModule().resetTestEnvironment(); + isInstanceOf(component: Type) { + return this.fixture.componentRef.componentType == component; } private updateComponentProps() { From c15a3fb225c52c5bcb3a34524ba8d50fbda8710f Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Tue, 15 Apr 2025 23:12:36 +0200 Subject: [PATCH 09/61] refactor: testbed creation to constructor refactor: set wrapper component in render function refactor: wrapper creation refactor: metadata override on TestBedComponentBuilder.ts --- .../client/angular-beta/AbstractRenderer.ts | 7 +- .../angular-beta/StorybookWrapperComponent.ts | 20 +--- .../utils/TestBedComponentBuilder.ts | 99 +++++++------------ 3 files changed, 44 insertions(+), 82 deletions(-) diff --git a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts index b5ddb9b0aaf9..706fe704a57b 100644 --- a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts +++ b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts @@ -5,6 +5,7 @@ import { stringify } from 'telejson'; import { ICollection, StoryFnAngularReturnType } from '../types'; import { PropertyExtractor } from './utils/PropertyExtractor'; import { TestBedComponentBuilder } from './utils/TestBedComponentBuilder'; +import { getWrapperComponent } from './StorybookWrapperComponent'; type StoryRenderInfo = { storyFnAngular: StoryFnAngularReturnType; @@ -115,6 +116,10 @@ export abstract class AbstractRenderer { } } + if (storyFnAngular.userDefinedTemplate) { + component = getWrapperComponent(storyFnAngular.template); + } + const componentBuilder = await new TestBedComponentBuilder() .initTestBed() .setComponent(component) @@ -122,7 +127,7 @@ export abstract class AbstractRenderer { .setStoryFn(storyFnAngular) .setMetaData(analyzedMetadata) .setEnvironmentProviders(environmentProviders) - .configureModule() + .configure() .compileComponents(); applicationRefs.set(targetDOMNode, componentBuilder.getApplicationRef()); diff --git a/code/frameworks/angular/src/client/angular-beta/StorybookWrapperComponent.ts b/code/frameworks/angular/src/client/angular-beta/StorybookWrapperComponent.ts index 9dd3e86036e0..fea156ffa577 100644 --- a/code/frameworks/angular/src/client/angular-beta/StorybookWrapperComponent.ts +++ b/code/frameworks/angular/src/client/angular-beta/StorybookWrapperComponent.ts @@ -1,30 +1,16 @@ import { Component, NgModule } from '@angular/core'; -export const getWrapperComponent = ( - selector: string, - template: string, - providers: any[], - styles: string[], - schemas: any[] -) => { +export const getWrapperComponent = (template: string) => { @Component({ - selector, template, standalone: true, - providers, - styles, - schemas: schemas, }) class CustomWrapperComponent {} return CustomWrapperComponent; }; -export const getWrapperModule = (declarations: any[], imports: any[]) => { - @NgModule({ - declarations: declarations, - imports: imports, - exports: [...declarations, ...imports], - }) +export const getWrapperModule = () => { + @NgModule() class WrapperModule {} return WrapperModule; }; diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts index c307055e9804..45fa5601b995 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts @@ -1,20 +1,12 @@ -import { ComponentFixture, MetadataOverride, TestBed } from '@angular/core/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { BrowserDynamicTestingModule, platformBrowserDynamicTesting, } from '@angular/platform-browser-dynamic/testing'; -import { - ApplicationRef, - Component, - EnvironmentProviders, - importProvidersFrom, - Type, -} from '@angular/core'; +import { ApplicationRef, Type } from '@angular/core'; import { PropertyExtractor } from './PropertyExtractor'; import { ICollection, StoryFnAngularReturnType } from '../../types'; -import { BrowserModule } from '@angular/platform-browser'; -import { getWrapperComponent, getWrapperModule } from '../StorybookWrapperComponent'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { getWrapperModule } from '../StorybookWrapperComponent'; export class TestBedComponentBuilder { private testBedInstance: TestBed; @@ -35,15 +27,24 @@ export class TestBedComponentBuilder { private props: ICollection; - private isUserDefinedTemplate = false; - - private userDefinedTemplate: string; - private schemas: any[]; private styles: string[]; - setComponent(storyComponent: Type | undefined) { + constructor() { + this.testBedInstance = new TestBed(); + } + + initTestBed() { + this.testBedInstance.initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() + ); + this.testBedInstance.configureTestingModule({}); + return this; + } + + setComponent(storyComponent: Type) { this.component = storyComponent; return this; } @@ -51,8 +52,6 @@ export class TestBedComponentBuilder { setStoryFn(storyFn: StoryFnAngularReturnType) { this.styles = storyFn.styles; this.schemas = storyFn.moduleMetadata?.schemas; - this.isUserDefinedTemplate = storyFn.userDefinedTemplate; - this.userDefinedTemplate = storyFn.template; this.props = storyFn.props; return this; } @@ -66,7 +65,6 @@ export class TestBedComponentBuilder { } setEnvironmentProviders(providers: any[]) { - if (providers == null) return this; this.environmentProviders = providers ?? []; return this; } @@ -82,55 +80,28 @@ export class TestBedComponentBuilder { return this; } - configureModule() { + configure() { this.throwOnRequiredNullProperties(); - if (this.isUserDefinedTemplate) { - this.component = getWrapperComponent( - this.selector, - this.userDefinedTemplate, - this.componentProviders, - this.styles, - this.schemas - ); - } - - const metaData = this.generateOverrideMetaData(); + const wrapperModule = getWrapperModule(); this.testBedInstance - .configureTestingModule({ - providers: this.environmentProviders, + .overrideComponent(this.component, { + add: { + schemas: this.schemas ?? [], + providers: this.componentProviders ?? [], + styles: this.styles ?? [], + selector: this.selector, + imports: [wrapperModule], + }, }) - .overrideComponent(this.component, metaData); - - return this; - } - - private generateOverrideMetaData() { - const overrideData: MetadataOverride = { set: {} }; - if (this.schemas != null && this.schemas.length != 0) { - overrideData.set.schemas = this.schemas; - } - if (this.componentProviders != null) { - overrideData.set.providers = this.componentProviders; - } - if (this.styles != null) { - overrideData.set.styles = this.styles; - } - if (this.selector != null) { - overrideData.set.selector = this.selector; - } - - const wrapperModule = getWrapperModule(this.declarations, this.imports); - overrideData.set.imports = [wrapperModule]; - - return overrideData; - } + .overrideModule(wrapperModule, { + set: { + exports: [...this.declarations, ...this.imports], + declarations: this.declarations, + imports: this.imports, + providers: this.environmentProviders, + }, + }); - initTestBed() { - this.testBedInstance = new TestBed(); - this.testBedInstance.initTestEnvironment( - BrowserDynamicTestingModule, - platformBrowserDynamicTesting() - ); return this; } From a217ee28daff827767b9b30f37a219e30cea57b2 Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Mon, 28 Apr 2025 22:59:15 +0200 Subject: [PATCH 10/61] refactor: override meta data generation to file refactor: init testbed on creation --- .../client/angular-beta/AbstractRenderer.ts | 16 ++---- .../utils/TestBedComponentBuilder.ts | 50 +++++++++---------- .../utils/TestBedOverrideMetaDataGenerator.ts | 40 +++++++++++++++ 3 files changed, 67 insertions(+), 39 deletions(-) create mode 100644 code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts diff --git a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts index 706fe704a57b..994387f1e796 100644 --- a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts +++ b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts @@ -70,7 +70,6 @@ export abstract class AbstractRenderer { targetDOMNode: HTMLElement; }) { const targetSelector = this.generateTargetSelectorFromStoryId(targetDOMNode.id); - const testBedInstance = this.getTestBedInstance(component); if ( !this.fullRendererRequired({ @@ -80,10 +79,11 @@ export abstract class AbstractRenderer { ...storyFnAngular.moduleMetadata, }, forced, - }) && - testBedInstance != null + }) ) { - testBedInstance.setAndUpdateProps(storyFnAngular.props); + // need unique attribute to get testbed instance for specific component + // to update props from story + // testbedInstance.setAndUpdateProps(...) return; } @@ -121,7 +121,6 @@ export abstract class AbstractRenderer { } const componentBuilder = await new TestBedComponentBuilder() - .initTestBed() .setComponent(component) .setSelector(componentSelector) .setStoryFn(storyFnAngular) @@ -134,13 +133,6 @@ export abstract class AbstractRenderer { componentBuilders.push(componentBuilder); } - getTestBedInstance(component: Type): TestBedComponentBuilder | null { - for (const builder of componentBuilders) { - if (builder.isInstanceOf(component)) return builder; - } - return null; - } - /** * Only ASCII alphanumerics can be used as HTML tag name. https://html.spec.whatwg.org/#elements-2 * diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts index 45fa5601b995..bfbb2cd8e614 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts @@ -7,6 +7,11 @@ import { ApplicationRef, Type } from '@angular/core'; import { PropertyExtractor } from './PropertyExtractor'; import { ICollection, StoryFnAngularReturnType } from '../../types'; import { getWrapperModule } from '../StorybookWrapperComponent'; +import { + GenerateComponentMetaData, + GenerateModuleMetaData, + // eslint-disable-next-line import/namespace +} from './TestBedOverrideMetaDataGenerator'; export class TestBedComponentBuilder { private testBedInstance: TestBed; @@ -33,15 +38,10 @@ export class TestBedComponentBuilder { constructor() { this.testBedInstance = new TestBed(); - } - - initTestBed() { this.testBedInstance.initTestEnvironment( BrowserDynamicTestingModule, platformBrowserDynamicTesting() ); - this.testBedInstance.configureTestingModule({}); - return this; } setComponent(storyComponent: Type) { @@ -52,6 +52,7 @@ export class TestBedComponentBuilder { setStoryFn(storyFn: StoryFnAngularReturnType) { this.styles = storyFn.styles; this.schemas = storyFn.moduleMetadata?.schemas; + console.log(this.schemas); this.props = storyFn.props; return this; } @@ -84,23 +85,21 @@ export class TestBedComponentBuilder { this.throwOnRequiredNullProperties(); const wrapperModule = getWrapperModule(); this.testBedInstance - .overrideComponent(this.component, { - add: { - schemas: this.schemas ?? [], - providers: this.componentProviders ?? [], - styles: this.styles ?? [], - selector: this.selector, - imports: [wrapperModule], - }, - }) - .overrideModule(wrapperModule, { - set: { - exports: [...this.declarations, ...this.imports], - declarations: this.declarations, - imports: this.imports, - providers: this.environmentProviders, - }, - }); + .configureTestingModule({}) + .overrideComponent( + this.component, + GenerateComponentMetaData( + this.selector, + this.componentProviders, + this.styles, + this.schemas, + wrapperModule + ) + ) + .overrideModule( + wrapperModule, + GenerateModuleMetaData(this.environmentProviders, this.declarations, this.imports) + ); return this; } @@ -116,10 +115,6 @@ export class TestBedComponentBuilder { return this.testBedInstance.inject(ApplicationRef); } - isInstanceOf(component: Type) { - return this.fixture.componentRef.componentType == component; - } - private updateComponentProps() { if (this.props != null) this.fixture.componentInstance = Object.assign(this.fixture.componentInstance, this.props); @@ -128,6 +123,7 @@ export class TestBedComponentBuilder { } private throwOnRequiredNullProperties() { - if (this.component == null || this.testBedInstance == null) throw new Error('NullReference'); + if (this.component == null || this.testBedInstance == null) + throw new Error('Component attribute or testbed instance is null'); } } diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts new file mode 100644 index 000000000000..6057f7b1b8b0 --- /dev/null +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts @@ -0,0 +1,40 @@ +import { Component, NgModule, Type } from '@angular/core'; +import { MetadataOverride } from '@angular/core/testing'; + +export const GenerateComponentMetaData = ( + selector: string, + componentProvider: any[], + styles: string[], + schemas: any[], + wrapperModule: Type +) => { + const overrideMetadata = { + add: { + providers: componentProvider ?? [], + styles: styles ?? [], + selector: selector, + imports: [wrapperModule], + }, + } as MetadataOverride; + + if (schemas != null && schemas.length != 0) { + overrideMetadata.add.schemas = schemas; + } + + return overrideMetadata; +}; + +export const GenerateModuleMetaData = ( + environmentProvider: any[], + declarations: any[], + imports: any[] +) => { + return { + set: { + exports: [...declarations, ...imports], + declarations: declarations, + imports: imports, + providers: environmentProvider, + }, + } as MetadataOverride; +}; From c952ddde73b1d14fa82b32d1f8009d47baf552ca Mon Sep 17 00:00:00 2001 From: Chrisy455 Date: Tue, 29 Apr 2025 18:07:56 +0200 Subject: [PATCH 11/61] remove: console.log --- .../src/client/angular-beta/utils/TestBedComponentBuilder.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts index bfbb2cd8e614..2cf76897ad7e 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts @@ -52,7 +52,6 @@ export class TestBedComponentBuilder { setStoryFn(storyFn: StoryFnAngularReturnType) { this.styles = storyFn.styles; this.schemas = storyFn.moduleMetadata?.schemas; - console.log(this.schemas); this.props = storyFn.props; return this; } From 98bcd5419dd0690e336bb6d9aaff617f07540d11 Mon Sep 17 00:00:00 2001 From: Chrisy455 Date: Wed, 30 Apr 2025 16:06:30 +0200 Subject: [PATCH 12/61] refactor: @angular/animations dependency back to dev-dependencies --- code/frameworks/angular/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/frameworks/angular/package.json b/code/frameworks/angular/package.json index 019e43ab1779..30bdf63e2ea3 100644 --- a/code/frameworks/angular/package.json +++ b/code/frameworks/angular/package.json @@ -62,8 +62,7 @@ "ts-dedent": "^2.0.0", "tsconfig-paths-webpack-plugin": "^4.0.1", "util-deprecate": "^1.0.2", - "webpack": "5", - "@angular/animations": "^19.1.1" + "webpack": "5" }, "devDependencies": { "@analogjs/vite-plugin-angular": "^1.12.1", @@ -78,6 +77,7 @@ "@angular/forms": "^19.1.1", "@angular/platform-browser": "^19.1.1", "@angular/platform-browser-dynamic": "^19.1.1", + "@angular/animations": "^19.1.1", "@types/node": "^22.0.0", "rimraf": "^6.0.1", "typescript": "^5.8.3", From 2feab6581326413fafb31dec60cf8f8c4e1eb70b Mon Sep 17 00:00:00 2001 From: Chrisy455 Date: Fri, 2 May 2025 11:29:39 +0200 Subject: [PATCH 13/61] refactor: split throw on null required values into specific functions --- .../utils/TestBedComponentBuilder.ts | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts index 2cf76897ad7e..492326631f18 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts @@ -10,7 +10,6 @@ import { getWrapperModule } from '../StorybookWrapperComponent'; import { GenerateComponentMetaData, GenerateModuleMetaData, - // eslint-disable-next-line import/namespace } from './TestBedOverrideMetaDataGenerator'; export class TestBedComponentBuilder { @@ -81,7 +80,8 @@ export class TestBedComponentBuilder { } configure() { - this.throwOnRequiredNullProperties(); + this.throwOnMissingTestBedInstance(); + this.throwOnMissingComponent(); const wrapperModule = getWrapperModule(); this.testBedInstance .configureTestingModule({}) @@ -115,14 +115,22 @@ export class TestBedComponentBuilder { } private updateComponentProps() { + this.throwOnMissingFixture(); if (this.props != null) this.fixture.componentInstance = Object.assign(this.fixture.componentInstance, this.props); this.fixture.detectChanges(); return this; } - private throwOnRequiredNullProperties() { - if (this.component == null || this.testBedInstance == null) - throw new Error('Component attribute or testbed instance is null'); + private throwOnMissingComponent() { + if (this.component == null) throw new Error('Component attribute is null'); + } + + private throwOnMissingTestBedInstance() { + if (this.testBedInstance == null) throw new Error('Testbed instance is null'); + } + + private throwOnMissingFixture() { + if (this.fixture == null) throw new Error('Fixture is null'); } } From e736144094fc1ee64058401c0467121e956e920c Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Fri, 2 May 2025 11:48:05 +0200 Subject: [PATCH 14/61] refactor: angular sandbox dependencies and yarn.lock --- code/frameworks/angular/package.json | 4 +- code/yarn.lock | 749 +++++++++++++++++++++++++-- 2 files changed, 717 insertions(+), 36 deletions(-) diff --git a/code/frameworks/angular/package.json b/code/frameworks/angular/package.json index 30bdf63e2ea3..2a3863104431 100644 --- a/code/frameworks/angular/package.json +++ b/code/frameworks/angular/package.json @@ -61,7 +61,6 @@ "telejson": "8.0.0", "ts-dedent": "^2.0.0", "tsconfig-paths-webpack-plugin": "^4.0.1", - "util-deprecate": "^1.0.2", "webpack": "5" }, "devDependencies": { @@ -69,7 +68,7 @@ "@angular-devkit/architect": "^0.1901.1", "@angular-devkit/build-angular": "^19.1.1", "@angular-devkit/core": "^19.1.1", - "@angular/cli": "^19.1.1", + "@angular/animations": "^19.1.1", "@angular/common": "^19.1.1", "@angular/compiler": "^19.1.1", "@angular/compiler-cli": "^19.1.1", @@ -77,7 +76,6 @@ "@angular/forms": "^19.1.1", "@angular/platform-browser": "^19.1.1", "@angular/platform-browser-dynamic": "^19.1.1", - "@angular/animations": "^19.1.1", "@types/node": "^22.0.0", "rimraf": "^6.0.1", "typescript": "^5.8.3", diff --git a/code/yarn.lock b/code/yarn.lock index 80bfce115e70..aa84d6643c1e 100644 --- a/code/yarn.lock +++ b/code/yarn.lock @@ -40,6 +40,16 @@ __metadata: languageName: node linkType: hard +"@angular-devkit/architect@npm:0.1902.10": + version: 0.1902.10 + resolution: "@angular-devkit/architect@npm:0.1902.10" + dependencies: + "@angular-devkit/core": "npm:19.2.10" + rxjs: "npm:7.8.1" + checksum: 10c0/4ce187452618041674ea9b3533183a580a3c0c11c4bc25985801a82b6f02d55e4ab21e25a26f8394deced831accf586225bcd02ed40227f818f2b1636fe00f92 + languageName: node + linkType: hard + "@angular-devkit/architect@npm:0.1902.9": version: 0.1902.9 resolution: "@angular-devkit/architect@npm:0.1902.9" @@ -199,6 +209,25 @@ __metadata: languageName: node linkType: hard +"@angular-devkit/core@npm:19.2.10": + version: 19.2.10 + resolution: "@angular-devkit/core@npm:19.2.10" + dependencies: + ajv: "npm:8.17.1" + ajv-formats: "npm:3.0.1" + jsonc-parser: "npm:3.3.1" + picomatch: "npm:4.0.2" + rxjs: "npm:7.8.1" + source-map: "npm:0.7.4" + peerDependencies: + chokidar: ^4.0.0 + peerDependenciesMeta: + chokidar: + optional: true + checksum: 10c0/a095df28d41f920650bfaf3dbd6de712519f6335abf503f2b7315966abcb2df4e625bf2c26765b03296e06bcc21aafb96271da7f0338b26fba277d08158f4904 + languageName: node + linkType: hard + "@angular-devkit/core@npm:19.2.9, @angular-devkit/core@npm:^19.1.1": version: 19.2.9 resolution: "@angular-devkit/core@npm:19.2.9" @@ -218,6 +247,19 @@ __metadata: languageName: node linkType: hard +"@angular-devkit/schematics@npm:19.2.10": + version: 19.2.10 + resolution: "@angular-devkit/schematics@npm:19.2.10" + dependencies: + "@angular-devkit/core": "npm:19.2.10" + jsonc-parser: "npm:3.3.1" + magic-string: "npm:0.30.17" + ora: "npm:5.4.1" + rxjs: "npm:7.8.1" + checksum: 10c0/ea4fb356b78b5e9b0cb07a764f3bca6fab5a7eb5204d71c877351ed18910f34d569aecb9aa9ea2e85cfa8d3a3c68803f47eeb2d565284ca53acb3c6f1556052a + languageName: node + linkType: hard + "@angular/animations@npm:^19.1.1": version: 19.2.8 resolution: "@angular/animations@npm:19.2.8" @@ -300,6 +342,33 @@ __metadata: languageName: node linkType: hard +"@angular/cli@npm:^19.1.1": + version: 19.2.10 + resolution: "@angular/cli@npm:19.2.10" + dependencies: + "@angular-devkit/architect": "npm:0.1902.10" + "@angular-devkit/core": "npm:19.2.10" + "@angular-devkit/schematics": "npm:19.2.10" + "@inquirer/prompts": "npm:7.3.2" + "@listr2/prompt-adapter-inquirer": "npm:2.0.18" + "@schematics/angular": "npm:19.2.10" + "@yarnpkg/lockfile": "npm:1.1.0" + ini: "npm:5.0.0" + jsonc-parser: "npm:3.3.1" + listr2: "npm:8.2.5" + npm-package-arg: "npm:12.0.2" + npm-pick-manifest: "npm:10.0.0" + pacote: "npm:20.0.0" + resolve: "npm:1.22.10" + semver: "npm:7.7.1" + symbol-observable: "npm:4.0.0" + yargs: "npm:17.7.2" + bin: + ng: bin/ng.js + checksum: 10c0/5f276697832ae901c8766ba9157ac7aade886c0cf901a9882719f67b2fbdcbf71961cab9670418beef4427d6b71ea65d814307691cfb6b191333f7a082e8df2b + languageName: node + linkType: hard + "@angular/common@npm:^19.1.1": version: 19.2.8 resolution: "@angular/common@npm:19.2.8" @@ -3236,6 +3305,24 @@ __metadata: languageName: node linkType: hard +"@inquirer/checkbox@npm:^4.1.2": + version: 4.1.5 + resolution: "@inquirer/checkbox@npm:4.1.5" + dependencies: + "@inquirer/core": "npm:^10.1.10" + "@inquirer/figures": "npm:^1.0.11" + "@inquirer/type": "npm:^3.0.6" + ansi-escapes: "npm:^4.3.2" + yoctocolors-cjs: "npm:^2.1.2" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10c0/b984fb3ce8af34c327f3a85adcfe9fbd9eaac0c689bb9af79a5d55d508acb01de329747e8c923c9f4962e4006c353ed2dbe79e3fc9ae0f85f5851427dbed75ed + languageName: node + linkType: hard + "@inquirer/confirm@npm:5.1.6": version: 5.1.6 resolution: "@inquirer/confirm@npm:5.1.6" @@ -3251,7 +3338,22 @@ __metadata: languageName: node linkType: hard -"@inquirer/core@npm:^10.1.7": +"@inquirer/confirm@npm:^5.1.6": + version: 5.1.9 + resolution: "@inquirer/confirm@npm:5.1.9" + dependencies: + "@inquirer/core": "npm:^10.1.10" + "@inquirer/type": "npm:^3.0.6" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10c0/e35c134303f8151074479d6704c048676b2684debfde18a46ff0fb7585a3ee31dea551899ddcb48169fbef5dfe64c1948d2d8ac17a6939bedd31bb54c39bbea4 + languageName: node + linkType: hard + +"@inquirer/core@npm:^10.1.10, @inquirer/core@npm:^10.1.7": version: 10.1.10 resolution: "@inquirer/core@npm:10.1.10" dependencies: @@ -3272,6 +3374,38 @@ __metadata: languageName: node linkType: hard +"@inquirer/editor@npm:^4.2.7": + version: 4.2.10 + resolution: "@inquirer/editor@npm:4.2.10" + dependencies: + "@inquirer/core": "npm:^10.1.10" + "@inquirer/type": "npm:^3.0.6" + external-editor: "npm:^3.1.0" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10c0/b0213ad3ef45bc30427def4742db22126a1e6a59923033d21cae216276d8cf85d2af8abe432e5567ea24a7f6a31e23e7014e31308405cde684060b974e454a22 + languageName: node + linkType: hard + +"@inquirer/expand@npm:^4.0.9": + version: 4.0.12 + resolution: "@inquirer/expand@npm:4.0.12" + dependencies: + "@inquirer/core": "npm:^10.1.10" + "@inquirer/type": "npm:^3.0.6" + yoctocolors-cjs: "npm:^2.1.2" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10c0/f7abfc09ef942b63504677be5cf6fc443fb8090b5d43f7d2fe09983215cc01c6d82351cd1b596e90723b382a0931c9344d3280d54acf47d898782f4af2030b2e + languageName: node + linkType: hard + "@inquirer/figures@npm:^1.0.11": version: 1.0.11 resolution: "@inquirer/figures@npm:1.0.11" @@ -3279,6 +3413,135 @@ __metadata: languageName: node linkType: hard +"@inquirer/input@npm:^4.1.6": + version: 4.1.9 + resolution: "@inquirer/input@npm:4.1.9" + dependencies: + "@inquirer/core": "npm:^10.1.10" + "@inquirer/type": "npm:^3.0.6" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10c0/db2e661ee482f3f27bf8cb77f054f99aba30291bd24d63b28db62204c4c5efc496199a9ddc03d01e0f6e6455d6967efb3ef92d2cd91e672905948c8c978c67a1 + languageName: node + linkType: hard + +"@inquirer/number@npm:^3.0.9": + version: 3.0.12 + resolution: "@inquirer/number@npm:3.0.12" + dependencies: + "@inquirer/core": "npm:^10.1.10" + "@inquirer/type": "npm:^3.0.6" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10c0/e40726e1c60ba48a374b4867d212bd5e14cb12daae97a6536095906246ba6af91ec7fa68e347ba52607ba5bd84f9e804768d12fbc1250b2cac814187fb5e9628 + languageName: node + linkType: hard + +"@inquirer/password@npm:^4.0.9": + version: 4.0.12 + resolution: "@inquirer/password@npm:4.0.12" + dependencies: + "@inquirer/core": "npm:^10.1.10" + "@inquirer/type": "npm:^3.0.6" + ansi-escapes: "npm:^4.3.2" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10c0/03257985bbbd813c4f0c412effb691737517e348ca2590558864fe09877080daf90eb9910a60d097048fce9cf0c56a900e8f099854a9ae21512ceaadbd986e01 + languageName: node + linkType: hard + +"@inquirer/prompts@npm:7.3.2": + version: 7.3.2 + resolution: "@inquirer/prompts@npm:7.3.2" + dependencies: + "@inquirer/checkbox": "npm:^4.1.2" + "@inquirer/confirm": "npm:^5.1.6" + "@inquirer/editor": "npm:^4.2.7" + "@inquirer/expand": "npm:^4.0.9" + "@inquirer/input": "npm:^4.1.6" + "@inquirer/number": "npm:^3.0.9" + "@inquirer/password": "npm:^4.0.9" + "@inquirer/rawlist": "npm:^4.0.9" + "@inquirer/search": "npm:^3.0.9" + "@inquirer/select": "npm:^4.0.9" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10c0/a318d7c2a963f753f4868151f2ce5673e214f3a6597430e712bc59ef9605c831b71a6b52a9c5ea2f312b23063d2ee9fd633e127cdc9e4999e95ef15a5e90c7e1 + languageName: node + linkType: hard + +"@inquirer/rawlist@npm:^4.0.9": + version: 4.1.0 + resolution: "@inquirer/rawlist@npm:4.1.0" + dependencies: + "@inquirer/core": "npm:^10.1.10" + "@inquirer/type": "npm:^3.0.6" + yoctocolors-cjs: "npm:^2.1.2" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10c0/0e92e8ee7eebd6b6ba7a81d968701f398dd372638f51dd8e3cb1fd3a03520bc0f713e112488d37fdb813f18928f338d82527c575e18a9bebde7ac3273045898c + languageName: node + linkType: hard + +"@inquirer/search@npm:^3.0.9": + version: 3.0.12 + resolution: "@inquirer/search@npm:3.0.12" + dependencies: + "@inquirer/core": "npm:^10.1.10" + "@inquirer/figures": "npm:^1.0.11" + "@inquirer/type": "npm:^3.0.6" + yoctocolors-cjs: "npm:^2.1.2" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10c0/ef764f96b561b48e4d9a99716789d1fc0941d40884d1c9fea715c304360b46ec8c6e3edf603f7425a27d7743915564f405a3ccd1a72f0379a714be22887fe6ff + languageName: node + linkType: hard + +"@inquirer/select@npm:^4.0.9": + version: 4.2.0 + resolution: "@inquirer/select@npm:4.2.0" + dependencies: + "@inquirer/core": "npm:^10.1.10" + "@inquirer/figures": "npm:^1.0.11" + "@inquirer/type": "npm:^3.0.6" + ansi-escapes: "npm:^4.3.2" + yoctocolors-cjs: "npm:^2.1.2" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10c0/b3cfab393d54e48012336710b8e9267a0dd5551878a7727800da3d78602398720aab8777d5687b2138261fb731b0079d1c3ec0f4d0fee194bb1c4496c97b340b + languageName: node + linkType: hard + +"@inquirer/type@npm:^1.5.5": + version: 1.5.5 + resolution: "@inquirer/type@npm:1.5.5" + dependencies: + mute-stream: "npm:^1.0.0" + checksum: 10c0/4c41736c09ba9426b5a9e44993bdd54e8f532e791518802e33866f233a2a6126a25c1c82c19d1abbf1df627e57b1b957dd3f8318ea96073d8bfc32193943bcb3 + languageName: node + linkType: hard + "@inquirer/type@npm:^3.0.4, @inquirer/type@npm:^3.0.6": version: 3.0.6 resolution: "@inquirer/type@npm:3.0.6" @@ -3455,6 +3718,17 @@ __metadata: languageName: node linkType: hard +"@listr2/prompt-adapter-inquirer@npm:2.0.18": + version: 2.0.18 + resolution: "@listr2/prompt-adapter-inquirer@npm:2.0.18" + dependencies: + "@inquirer/type": "npm:^1.5.5" + peerDependencies: + "@inquirer/prompts": ">= 3 < 8" + checksum: 10c0/580d2f0ae414cf3090c2fbfe4623649e448d930b3ff24b0211e64e0e037f1a3ffff5307bc36c10cdc0c4a35fc12f04190585e864c4ce05fbf5f062b41ff29e40 + languageName: node + linkType: hard + "@lit-labs/react@npm:^1.0.2": version: 1.2.1 resolution: "@lit-labs/react@npm:1.2.1" @@ -3959,6 +4233,86 @@ __metadata: languageName: node linkType: hard +"@npmcli/git@npm:^6.0.0": + version: 6.0.3 + resolution: "@npmcli/git@npm:6.0.3" + dependencies: + "@npmcli/promise-spawn": "npm:^8.0.0" + ini: "npm:^5.0.0" + lru-cache: "npm:^10.0.1" + npm-pick-manifest: "npm:^10.0.0" + proc-log: "npm:^5.0.0" + promise-retry: "npm:^2.0.1" + semver: "npm:^7.3.5" + which: "npm:^5.0.0" + checksum: 10c0/a8ff1d5f997f7bfdc149fbe7478017b100efe3d08bd566df6b5ac716fd630d2eff0f7feebc6705831a3a7072a67a955a339a8fea8551ce4faffafa9526306e05 + languageName: node + linkType: hard + +"@npmcli/installed-package-contents@npm:^3.0.0": + version: 3.0.0 + resolution: "@npmcli/installed-package-contents@npm:3.0.0" + dependencies: + npm-bundled: "npm:^4.0.0" + npm-normalize-package-bin: "npm:^4.0.0" + bin: + installed-package-contents: bin/index.js + checksum: 10c0/8bb361251cd13b91ae2d04bfcc59b52ffb8cd475d074259c143b3c29a0c4c0ae90d76cfb2cab00ff61cc76bd0c38591b530ce1bdbbc8a61d60ddc6c9ecbf169b + languageName: node + linkType: hard + +"@npmcli/node-gyp@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/node-gyp@npm:4.0.0" + checksum: 10c0/58422c2ce0693f519135dd32b5c5bcbb441823f08f9294d5ec19d9a22925ba1a5ec04a1b96f606f2ab09a5f5db56e704f6e201a485198ce9d11fb6b2705e6e79 + languageName: node + linkType: hard + +"@npmcli/package-json@npm:^6.0.0": + version: 6.1.1 + resolution: "@npmcli/package-json@npm:6.1.1" + dependencies: + "@npmcli/git": "npm:^6.0.0" + glob: "npm:^10.2.2" + hosted-git-info: "npm:^8.0.0" + json-parse-even-better-errors: "npm:^4.0.0" + proc-log: "npm:^5.0.0" + semver: "npm:^7.5.3" + validate-npm-package-license: "npm:^3.0.4" + checksum: 10c0/ec24e6dc4ade64de205f7964e325de31ee0c2dd7d70c2321a2b822481bf97505fffbe23ec05672fc61862ae68bbae3e9b44d4640439081dbc8f8b2dcdeda2aa3 + languageName: node + linkType: hard + +"@npmcli/promise-spawn@npm:^8.0.0": + version: 8.0.2 + resolution: "@npmcli/promise-spawn@npm:8.0.2" + dependencies: + which: "npm:^5.0.0" + checksum: 10c0/fe987dece7b843d9353d4d38982336ab3beabc2dd3c135862a4ba2921aae55b0d334891fe44c6cbbee20626259e54478bf498ad8d380c14c53732b489ae14f40 + languageName: node + linkType: hard + +"@npmcli/redact@npm:^3.0.0": + version: 3.2.0 + resolution: "@npmcli/redact@npm:3.2.0" + checksum: 10c0/8dde1c4d346a7487b4607b70dc0c19bffba980b7aab981121f58068f1a886aa86f6b7cb1566f0fcef5a454326438fbfefb4641e21354267e4193ff985cc8dc58 + languageName: node + linkType: hard + +"@npmcli/run-script@npm:^9.0.0": + version: 9.1.0 + resolution: "@npmcli/run-script@npm:9.1.0" + dependencies: + "@npmcli/node-gyp": "npm:^4.0.0" + "@npmcli/package-json": "npm:^6.0.0" + "@npmcli/promise-spawn": "npm:^8.0.0" + node-gyp: "npm:^11.0.0" + proc-log: "npm:^5.0.0" + which: "npm:^5.0.0" + checksum: 10c0/4ed8eae5c7722c24814473f819d0bfe950f70e876bf9c52e05a61d3e74f2a044386da95e2e171e5a7a81e4c0b144582535addf2510e5decfd7d4aa7ae9e50931 + languageName: node + linkType: hard + "@nx/devkit@npm:20.2.2": version: 20.2.2 resolution: "@nx/devkit@npm:20.2.2" @@ -5822,6 +6176,17 @@ __metadata: languageName: node linkType: hard +"@schematics/angular@npm:19.2.10": + version: 19.2.10 + resolution: "@schematics/angular@npm:19.2.10" + dependencies: + "@angular-devkit/core": "npm:19.2.10" + "@angular-devkit/schematics": "npm:19.2.10" + jsonc-parser: "npm:3.3.1" + checksum: 10c0/dd6bc6aaf762ee58ec1675b088464c9b45b4734f18ed53179a95ed3be5fb7e1792c6e858c635de85d42143882bfb8df5f2f238d408cd0967e7de02f07a7b10be + languageName: node + linkType: hard + "@sec-ant/readable-stream@npm:^0.4.1": version: 0.4.1 resolution: "@sec-ant/readable-stream@npm:0.4.1" @@ -5852,6 +6217,64 @@ __metadata: languageName: node linkType: hard +"@sigstore/bundle@npm:^3.1.0": + version: 3.1.0 + resolution: "@sigstore/bundle@npm:3.1.0" + dependencies: + "@sigstore/protobuf-specs": "npm:^0.4.0" + checksum: 10c0/f34afa3efe81b0925cf1568eeea7678876c5889799fcdf9b81d1062067108e74fc3f3480b0d2b7daa7389f944e4a2523b5fc98d65dbbaa34d206d8c2edc4fa5a + languageName: node + linkType: hard + +"@sigstore/core@npm:^2.0.0": + version: 2.0.0 + resolution: "@sigstore/core@npm:2.0.0" + checksum: 10c0/bb7e668aedcda68312d2ff7c986fd0ba29057ca4dfbaef516c997b0799cd8858b2fc8017a7946fd2e43f237920adbcaa7455097a0a02909ed86cad9f98d592d4 + languageName: node + linkType: hard + +"@sigstore/protobuf-specs@npm:^0.4.0, @sigstore/protobuf-specs@npm:^0.4.1": + version: 0.4.1 + resolution: "@sigstore/protobuf-specs@npm:0.4.1" + checksum: 10c0/8de75bc84f307b7d7bf4fa265f89a8bfa717d96e091be29ee9be1ffd6036b81355a349955e5036b86570d37f2b30b18a68a43f5e40bd958bd4128aa6bb39a3f3 + languageName: node + linkType: hard + +"@sigstore/sign@npm:^3.1.0": + version: 3.1.0 + resolution: "@sigstore/sign@npm:3.1.0" + dependencies: + "@sigstore/bundle": "npm:^3.1.0" + "@sigstore/core": "npm:^2.0.0" + "@sigstore/protobuf-specs": "npm:^0.4.0" + make-fetch-happen: "npm:^14.0.2" + proc-log: "npm:^5.0.0" + promise-retry: "npm:^2.0.1" + checksum: 10c0/7647f3a1350a09d66e7d77fdf8edf6eeb047f818acc2cd06325fc8ec9f0cd654dd25909876147b7ed052d459dc6a1d64e8cbaa44486300b241c3b139d778f254 + languageName: node + linkType: hard + +"@sigstore/tuf@npm:^3.1.0": + version: 3.1.1 + resolution: "@sigstore/tuf@npm:3.1.1" + dependencies: + "@sigstore/protobuf-specs": "npm:^0.4.1" + tuf-js: "npm:^3.0.1" + checksum: 10c0/08fdafb45c859cd58ef02e4f28e00a2d74f0c309dca36cf20fda17e55e194a3b7ebcfd9c40197c197d044ae4de0ff5d99b363aaec7cb6cbbf09611afa2661a55 + languageName: node + linkType: hard + +"@sigstore/verify@npm:^2.1.0": + version: 2.1.1 + resolution: "@sigstore/verify@npm:2.1.1" + dependencies: + "@sigstore/bundle": "npm:^3.1.0" + "@sigstore/core": "npm:^2.0.0" + "@sigstore/protobuf-specs": "npm:^0.4.1" + checksum: 10c0/4881d8cd798f7d0c5ffe42b643b950c2a8af1f07c96fc3f3a3409bf5f2221b832d4f018104a12ac8ae0740060ecbb837b99dec058765925d1dcb08ccbd92feb4 + languageName: node + linkType: hard + "@sinclair/typebox@npm:^0.27.8": version: 0.27.8 resolution: "@sinclair/typebox@npm:0.27.8" @@ -6057,6 +6480,7 @@ __metadata: "@angular-devkit/build-angular": "npm:^19.1.1" "@angular-devkit/core": "npm:^19.1.1" "@angular/animations": "npm:^19.1.1" + "@angular/cli": "npm:^19.1.1" "@angular/common": "npm:^19.1.1" "@angular/compiler": "npm:^19.1.1" "@angular/compiler-cli": "npm:^19.1.1" @@ -6076,6 +6500,7 @@ __metadata: ts-dedent: "npm:^2.0.0" tsconfig-paths-webpack-plugin: "npm:^4.0.1" typescript: "npm:^5.8.3" + util-deprecate: "npm:^1.0.2" webpack: "npm:5" zone.js: "npm:^0.15.0" peerDependencies: @@ -7242,6 +7667,23 @@ __metadata: languageName: node linkType: hard +"@tufjs/canonical-json@npm:2.0.0": + version: 2.0.0 + resolution: "@tufjs/canonical-json@npm:2.0.0" + checksum: 10c0/52c5ffaef1483ed5c3feedfeba26ca9142fa386eea54464e70ff515bd01c5e04eab05d01eff8c2593291dcaf2397ca7d9c512720e11f52072b04c47a5c279415 + languageName: node + linkType: hard + +"@tufjs/models@npm:3.0.1": + version: 3.0.1 + resolution: "@tufjs/models@npm:3.0.1" + dependencies: + "@tufjs/canonical-json": "npm:2.0.0" + minimatch: "npm:^9.0.5" + checksum: 10c0/0b2022589139102edf28f7fdcd094407fc98ac25bf530ebcf538dd63152baea9b6144b713c8dfc4f6b7580adeff706ab6ecc5f9716c4b816e58a04419abb1926 + languageName: node + linkType: hard + "@tybys/wasm-util@npm:^0.9.0": version: 0.9.0 resolution: "@tybys/wasm-util@npm:0.9.0" @@ -8941,7 +9383,7 @@ __metadata: languageName: node linkType: hard -"@yarnpkg/lockfile@npm:^1.1.0": +"@yarnpkg/lockfile@npm:1.1.0, @yarnpkg/lockfile@npm:^1.1.0": version: 1.1.0 resolution: "@yarnpkg/lockfile@npm:1.1.0" checksum: 10c0/0bfa50a3d756623d1f3409bc23f225a1d069424dbc77c6fd2f14fb377390cd57ec703dc70286e081c564be9051ead9ba85d81d66a3e68eeb6eb506d4e0c0fbda @@ -10644,7 +11086,7 @@ __metadata: languageName: node linkType: hard -"cacache@npm:^19.0.1": +"cacache@npm:^19.0.0, cacache@npm:^19.0.1": version: 19.0.1 resolution: "cacache@npm:19.0.1" dependencies: @@ -10891,6 +11333,13 @@ __metadata: languageName: node linkType: hard +"chardet@npm:^0.7.0": + version: 0.7.0 + resolution: "chardet@npm:0.7.0" + checksum: 10c0/96e4731b9ec8050cbb56ab684e8c48d6c33f7826b755802d14e3ebfdc51c57afeece3ea39bc6b09acc359e4363525388b915e16640c1378053820f5e70d0f27d + languageName: node + linkType: hard + "check-error@npm:^2.1.1": version: 2.1.1 resolution: "check-error@npm:2.1.1" @@ -14415,6 +14864,17 @@ __metadata: languageName: node linkType: hard +"external-editor@npm:^3.1.0": + version: 3.1.0 + resolution: "external-editor@npm:3.1.0" + dependencies: + chardet: "npm:^0.7.0" + iconv-lite: "npm:^0.4.24" + tmp: "npm:^0.0.33" + checksum: 10c0/c98f1ba3efdfa3c561db4447ff366a6adb5c1e2581462522c56a18bf90dfe4da382f9cd1feee3e330108c3595a854b218272539f311ba1b3298f841eb0fbf339 + languageName: node + linkType: hard + "fast-content-type-parse@npm:^2.0.0": version: 2.0.1 resolution: "fast-content-type-parse@npm:2.0.1" @@ -16022,6 +16482,15 @@ __metadata: languageName: node linkType: hard +"hosted-git-info@npm:^8.0.0": + version: 8.1.0 + resolution: "hosted-git-info@npm:8.1.0" + dependencies: + lru-cache: "npm:^10.0.1" + checksum: 10c0/53cc838ecaa7d4aa69a81d9d8edc362c9d415f67b76ad38cdd781d2a2f5b45ad0aa9f9b013fb4ea54a9f64fd2365d0b6386b5a24bdf4cb90c80477cf3175aaa2 + languageName: node + linkType: hard + "hpack.js@npm:^2.1.6": version: 2.1.6 resolution: "hpack.js@npm:2.1.6" @@ -16373,7 +16842,7 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:0.4.24": +"iconv-lite@npm:0.4.24, iconv-lite@npm:^0.4.24": version: 0.4.24 resolution: "iconv-lite@npm:0.4.24" dependencies: @@ -16407,6 +16876,15 @@ __metadata: languageName: node linkType: hard +"ignore-walk@npm:^7.0.0": + version: 7.0.0 + resolution: "ignore-walk@npm:7.0.0" + dependencies: + minimatch: "npm:^9.0.0" + checksum: 10c0/3754bcde369a53a92c1d0835ea93feb6c5b2934984d3f5a8f9dd962d13ac33ee3a9e930901a89b5d46fc061870639d983f497186afdfe3484e135f2ad89f5577 + languageName: node + linkType: hard + "ignore@npm:^4.0.6": version: 4.0.6 resolution: "ignore@npm:4.0.6" @@ -16508,6 +16986,13 @@ __metadata: languageName: node linkType: hard +"ini@npm:5.0.0, ini@npm:^5.0.0": + version: 5.0.0 + resolution: "ini@npm:5.0.0" + checksum: 10c0/657491ce766cbb4b335ab221ee8f72b9654d9f0e35c32fe5ff2eb7ab8c5ce72237ff6456555b50cde88e6507a719a70e28e327b450782b4fc20c90326ec8c1a8 + languageName: node + linkType: hard + "ini@npm:^1.3.4": version: 1.3.8 resolution: "ini@npm:1.3.8" @@ -16515,13 +17000,6 @@ __metadata: languageName: node linkType: hard -"ini@npm:^5.0.0": - version: 5.0.0 - resolution: "ini@npm:5.0.0" - checksum: 10c0/657491ce766cbb4b335ab221ee8f72b9654d9f0e35c32fe5ff2eb7ab8c5ce72237ff6456555b50cde88e6507a719a70e28e327b450782b4fc20c90326ec8c1a8 - languageName: node - linkType: hard - "inline-style-parser@npm:0.2.4": version: 0.2.4 resolution: "inline-style-parser@npm:0.2.4" @@ -17552,6 +18030,13 @@ __metadata: languageName: node linkType: hard +"json-parse-even-better-errors@npm:^4.0.0": + version: 4.0.0 + resolution: "json-parse-even-better-errors@npm:4.0.0" + checksum: 10c0/84cd9304a97e8fb2af3937bf53acb91c026aeb859703c332684e688ea60db27fc2242aa532a84e1883fdcbe1e5c1fb57c2bef38e312021aa1cd300defc63cf16 + languageName: node + linkType: hard + "json-schema-traverse@npm:^0.4.1": version: 0.4.1 resolution: "json-schema-traverse@npm:0.4.1" @@ -17661,6 +18146,13 @@ __metadata: languageName: node linkType: hard +"jsonparse@npm:^1.3.1": + version: 1.3.1 + resolution: "jsonparse@npm:1.3.1" + checksum: 10c0/89bc68080cd0a0e276d4b5ab1b79cacd68f562467008d176dc23e16e97d4efec9e21741d92ba5087a8433526a45a7e6a9d5ef25408696c402ca1cfbc01a90bf0 + languageName: node + linkType: hard + "jsonpointer@npm:^5.0.0": version: 5.0.1 resolution: "jsonpointer@npm:5.0.1" @@ -18491,7 +18983,7 @@ __metadata: languageName: node linkType: hard -"make-fetch-happen@npm:^14.0.3": +"make-fetch-happen@npm:^14.0.0, make-fetch-happen@npm:^14.0.1, make-fetch-happen@npm:^14.0.2, make-fetch-happen@npm:^14.0.3": version: 14.0.3 resolution: "make-fetch-happen@npm:14.0.3" dependencies: @@ -19311,7 +19803,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.3, minimatch@npm:^9.0.4": +"minimatch@npm:^9.0.0, minimatch@npm:^9.0.3, minimatch@npm:^9.0.4, minimatch@npm:^9.0.5": version: 9.0.5 resolution: "minimatch@npm:9.0.5" dependencies: @@ -19596,6 +20088,13 @@ __metadata: languageName: node linkType: hard +"mute-stream@npm:^1.0.0": + version: 1.0.0 + resolution: "mute-stream@npm:1.0.0" + checksum: 10c0/dce2a9ccda171ec979a3b4f869a102b1343dee35e920146776780de182f16eae459644d187e38d59a3d37adf85685e1c17c38cf7bfda7e39a9880f7a1d10a74c + languageName: node + linkType: hard + "mute-stream@npm:^2.0.0": version: 2.0.0 resolution: "mute-stream@npm:2.0.0" @@ -19846,7 +20345,7 @@ __metadata: languageName: node linkType: hard -"node-gyp@npm:latest": +"node-gyp@npm:^11.0.0, node-gyp@npm:latest": version: 11.2.0 resolution: "node-gyp@npm:11.2.0" dependencies: @@ -19967,6 +20466,31 @@ __metadata: languageName: node linkType: hard +"npm-bundled@npm:^4.0.0": + version: 4.0.0 + resolution: "npm-bundled@npm:4.0.0" + dependencies: + npm-normalize-package-bin: "npm:^4.0.0" + checksum: 10c0/e6e20caefbc6a41138d3767ec998f6a2cf55f33371c119417a556ff6052390a2ffeb3b465a74aea127fb211ddfcb7db776620faf12b64e48e60e332b25b5b8a0 + languageName: node + linkType: hard + +"npm-install-checks@npm:^7.1.0": + version: 7.1.1 + resolution: "npm-install-checks@npm:7.1.1" + dependencies: + semver: "npm:^7.1.1" + checksum: 10c0/3cfd705ef3f70add31a32b4a5462d16e0f06d9df636072483fb43c854414a1cc128f496e84a8d9c12c1f1820307b7a3c275643589c564dac3c870eb636f8eea4 + languageName: node + linkType: hard + +"npm-normalize-package-bin@npm:^4.0.0": + version: 4.0.0 + resolution: "npm-normalize-package-bin@npm:4.0.0" + checksum: 10c0/1fa546fcae8eaab61ef9b9ec237b6c795008da50e1883eae030e9e38bb04ffa32c5aabcef9a0400eae3dc1f91809bcfa85e437ce80d677c69b419d1d9cacf0ab + languageName: node + linkType: hard + "npm-package-arg@npm:11.0.1": version: 11.0.1 resolution: "npm-package-arg@npm:11.0.1" @@ -19979,6 +20503,55 @@ __metadata: languageName: node linkType: hard +"npm-package-arg@npm:12.0.2, npm-package-arg@npm:^12.0.0": + version: 12.0.2 + resolution: "npm-package-arg@npm:12.0.2" + dependencies: + hosted-git-info: "npm:^8.0.0" + proc-log: "npm:^5.0.0" + semver: "npm:^7.3.5" + validate-npm-package-name: "npm:^6.0.0" + checksum: 10c0/a507046ca0999862d6f1a4878d2e22d47a728062b49d670ea7a965b0b555fc84ba4473daf34eb72c711b68aeb02e4f567fdb410d54385535cb7e4d85aaf49544 + languageName: node + linkType: hard + +"npm-packlist@npm:^9.0.0": + version: 9.0.0 + resolution: "npm-packlist@npm:9.0.0" + dependencies: + ignore-walk: "npm:^7.0.0" + checksum: 10c0/3eb9e877fff81ed1f97b86a387a13a7d0136a26c4c21d8fab7e49be653e71d604ba63091ec80e3a0b1d1fd879639eab91ddda1a8df45d7631795b83911f2f9b8 + languageName: node + linkType: hard + +"npm-pick-manifest@npm:10.0.0, npm-pick-manifest@npm:^10.0.0": + version: 10.0.0 + resolution: "npm-pick-manifest@npm:10.0.0" + dependencies: + npm-install-checks: "npm:^7.1.0" + npm-normalize-package-bin: "npm:^4.0.0" + npm-package-arg: "npm:^12.0.0" + semver: "npm:^7.3.5" + checksum: 10c0/946e791f6164a04dbc3340749cd7521d4d1f60accb2d0ca901375314b8425c8a12b34b4b70e2850462cc898fba5fa8d1f283221bf788a1d37276f06a85c4562a + languageName: node + linkType: hard + +"npm-registry-fetch@npm:^18.0.0": + version: 18.0.2 + resolution: "npm-registry-fetch@npm:18.0.2" + dependencies: + "@npmcli/redact": "npm:^3.0.0" + jsonparse: "npm:^1.3.1" + make-fetch-happen: "npm:^14.0.0" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^4.0.0" + minizlib: "npm:^3.0.1" + npm-package-arg: "npm:^12.0.0" + proc-log: "npm:^5.0.0" + checksum: 10c0/43e02befb393f67d5014d690a96d55f0b5f837a3eb9a79b17738ff0e3a1f081968480f2f280d1ad77a088ebd88c196793d929b0e4d24a8389a324dfd4006bc39 + languageName: node + linkType: hard + "npm-run-path@npm:^2.0.0": version: 2.0.2 resolution: "npm-run-path@npm:2.0.2" @@ -20702,6 +21275,33 @@ __metadata: languageName: node linkType: hard +"pacote@npm:20.0.0": + version: 20.0.0 + resolution: "pacote@npm:20.0.0" + dependencies: + "@npmcli/git": "npm:^6.0.0" + "@npmcli/installed-package-contents": "npm:^3.0.0" + "@npmcli/package-json": "npm:^6.0.0" + "@npmcli/promise-spawn": "npm:^8.0.0" + "@npmcli/run-script": "npm:^9.0.0" + cacache: "npm:^19.0.0" + fs-minipass: "npm:^3.0.0" + minipass: "npm:^7.0.2" + npm-package-arg: "npm:^12.0.0" + npm-packlist: "npm:^9.0.0" + npm-pick-manifest: "npm:^10.0.0" + npm-registry-fetch: "npm:^18.0.0" + proc-log: "npm:^5.0.0" + promise-retry: "npm:^2.0.1" + sigstore: "npm:^3.0.0" + ssri: "npm:^12.0.0" + tar: "npm:^6.1.11" + bin: + pacote: bin/index.js + checksum: 10c0/435c385446ecc81b1eb1584f4fa3cb102e630a22877f39b5c1a92eddfeaf222bd027b205e32632be2801e3bcbe525165cdffb5ceca5c13bbc81f8132fe1ba49e + languageName: node + linkType: hard + "pako@npm:~0.2.0": version: 0.2.9 resolution: "pako@npm:0.2.9" @@ -22956,7 +23556,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.10.0, resolve@npm:^1.10.1, resolve@npm:^1.12.0, resolve@npm:^1.13.1, resolve@npm:^1.14.2, resolve@npm:^1.15.1, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4, resolve@npm:^1.22.8, resolve@npm:^1.4.0": +"resolve@npm:1.22.10, resolve@npm:^1.10.0, resolve@npm:^1.10.1, resolve@npm:^1.12.0, resolve@npm:^1.13.1, resolve@npm:^1.14.2, resolve@npm:^1.15.1, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4, resolve@npm:^1.22.8, resolve@npm:^1.4.0": version: 1.22.10 resolution: "resolve@npm:1.22.10" dependencies: @@ -22982,7 +23582,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.10.1#optional!builtin, resolve@patch:resolve@npm%3A^1.12.0#optional!builtin, resolve@patch:resolve@npm%3A^1.13.1#optional!builtin, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.15.1#optional!builtin, resolve@patch:resolve@npm%3A^1.17.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin, resolve@patch:resolve@npm%3A^1.4.0#optional!builtin": +"resolve@patch:resolve@npm%3A1.22.10#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.10.1#optional!builtin, resolve@patch:resolve@npm%3A^1.12.0#optional!builtin, resolve@patch:resolve@npm%3A^1.13.1#optional!builtin, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.15.1#optional!builtin, resolve@patch:resolve@npm%3A^1.17.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin, resolve@patch:resolve@npm%3A^1.4.0#optional!builtin": version: 1.22.10 resolution: "resolve@patch:resolve@npm%3A1.22.10#optional!builtin::version=1.22.10&hash=c3c19d" dependencies: @@ -23595,7 +24195,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:7.7.1, semver@npm:^7.0.0, semver@npm:^7.2.1, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.2, semver@npm:^7.6.3, semver@npm:^7.7.1": +"semver@npm:7.7.1, semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.2.1, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.2, semver@npm:^7.6.3, semver@npm:^7.7.1": version: 7.7.1 resolution: "semver@npm:7.7.1" bin: @@ -23952,6 +24552,20 @@ __metadata: languageName: node linkType: hard +"sigstore@npm:^3.0.0": + version: 3.1.0 + resolution: "sigstore@npm:3.1.0" + dependencies: + "@sigstore/bundle": "npm:^3.1.0" + "@sigstore/core": "npm:^2.0.0" + "@sigstore/protobuf-specs": "npm:^0.4.0" + "@sigstore/sign": "npm:^3.1.0" + "@sigstore/tuf": "npm:^3.1.0" + "@sigstore/verify": "npm:^2.1.0" + checksum: 10c0/c037f5526e698ec6de8654f6be6b6fa52bf52f2ffcd78109cdefc6d824bbb8390324522dcb0f84d57a674948ac53aef34dd77f9de66c91bcd91d0af56bb91c7e + languageName: node + linkType: hard + "silent-error@npm:^1.0.0, silent-error@npm:^1.1.1": version: 1.1.1 resolution: "silent-error@npm:1.1.1" @@ -24224,6 +24838,40 @@ __metadata: languageName: node linkType: hard +"spdx-correct@npm:^3.0.0": + version: 3.2.0 + resolution: "spdx-correct@npm:3.2.0" + dependencies: + spdx-expression-parse: "npm:^3.0.0" + spdx-license-ids: "npm:^3.0.0" + checksum: 10c0/49208f008618b9119208b0dadc9208a3a55053f4fd6a0ae8116861bd22696fc50f4142a35ebfdb389e05ccf2de8ad142573fefc9e26f670522d899f7b2fe7386 + languageName: node + linkType: hard + +"spdx-exceptions@npm:^2.1.0": + version: 2.5.0 + resolution: "spdx-exceptions@npm:2.5.0" + checksum: 10c0/37217b7762ee0ea0d8b7d0c29fd48b7e4dfb94096b109d6255b589c561f57da93bf4e328c0290046115961b9209a8051ad9f525e48d433082fc79f496a4ea940 + languageName: node + linkType: hard + +"spdx-expression-parse@npm:^3.0.0": + version: 3.0.1 + resolution: "spdx-expression-parse@npm:3.0.1" + dependencies: + spdx-exceptions: "npm:^2.1.0" + spdx-license-ids: "npm:^3.0.0" + checksum: 10c0/6f8a41c87759fa184a58713b86c6a8b028250f158159f1d03ed9d1b6ee4d9eefdc74181c8ddc581a341aa971c3e7b79e30b59c23b05d2436d5de1c30bdef7171 + languageName: node + linkType: hard + +"spdx-license-ids@npm:^3.0.0": + version: 3.0.21 + resolution: "spdx-license-ids@npm:3.0.21" + checksum: 10c0/ecb24c698d8496aa9efe23e0b1f751f8a7a89faedcdfcbfabae772b546c2db46ccde8f3bc447a238eb86bbcd4f73fea88720ef3b8394f7896381bec3d7736411 + languageName: node + linkType: hard + "spdy-transport@npm:^3.0.0": version: 3.0.0 resolution: "spdy-transport@npm:3.0.0" @@ -24987,6 +25635,13 @@ __metadata: languageName: node linkType: hard +"symbol-observable@npm:4.0.0": + version: 4.0.0 + resolution: "symbol-observable@npm:4.0.0" + checksum: 10c0/5e9a3ab08263a6be8cbee76587ad5880dcc62a47002787ed5ebea56b1eb30dc87da6f0183d67e88286806799fbe21c69077fbd677be4be2188e92318d6c6f31d + languageName: node + linkType: hard + "symlink-or-copy@npm:^1.0.0, symlink-or-copy@npm:^1.0.1, symlink-or-copy@npm:^1.1.8, symlink-or-copy@npm:^1.2.0, symlink-or-copy@npm:^1.3.1": version: 1.3.1 resolution: "symlink-or-copy@npm:1.3.1" @@ -25049,7 +25704,7 @@ __metadata: languageName: node linkType: hard -"tar@npm:^6.2.1": +"tar@npm:^6.1.11, tar@npm:^6.2.1": version: 6.2.1 resolution: "tar@npm:6.2.1" dependencies: @@ -25587,6 +26242,17 @@ __metadata: languageName: node linkType: hard +"tuf-js@npm:^3.0.1": + version: 3.0.1 + resolution: "tuf-js@npm:3.0.1" + dependencies: + "@tufjs/models": "npm:3.0.1" + debug: "npm:^4.3.6" + make-fetch-happen: "npm:^14.0.1" + checksum: 10c0/4214dd6bb1ec8a6cadbc5690e5a8556de0306f0e95022e54fc7c0ff9dbcc229ab379fd4b048511387f9c0023ea8f8c35acd8f7313f6cbc94a1b8af8b289f62ad + languageName: node + linkType: hard + "tween-functions@npm:^1.2.0": version: 1.2.0 resolution: "tween-functions@npm:1.2.0" @@ -26224,6 +26890,16 @@ __metadata: languageName: node linkType: hard +"validate-npm-package-license@npm:^3.0.4": + version: 3.0.4 + resolution: "validate-npm-package-license@npm:3.0.4" + dependencies: + spdx-correct: "npm:^3.0.0" + spdx-expression-parse: "npm:^3.0.0" + checksum: 10c0/7b91e455a8de9a0beaa9fe961e536b677da7f48c9a493edf4d4d4a87fd80a7a10267d438723364e432c2fcd00b5650b5378275cded362383ef570276e6312f4f + languageName: node + linkType: hard + "validate-npm-package-name@npm:^5.0.0": version: 5.0.1 resolution: "validate-npm-package-name@npm:5.0.1" @@ -26231,6 +26907,13 @@ __metadata: languageName: node linkType: hard +"validate-npm-package-name@npm:^6.0.0": + version: 6.0.0 + resolution: "validate-npm-package-name@npm:6.0.0" + checksum: 10c0/35d1896d90a4f00291cfc17077b553910d45018b3562841acc6471731794eeebe39b409f678e8c1fee8ef1786e087cac8dea19abdd43649c30fd0b9c752afa2f + languageName: node + linkType: hard + "vary@npm:~1.1.2": version: 1.1.2 resolution: "vary@npm:1.1.2" @@ -27484,6 +28167,21 @@ __metadata: languageName: node linkType: hard +"yargs@npm:17.7.2, yargs@npm:^17.2.1, yargs@npm:^17.6.2": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: "npm:^8.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.3" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^21.1.1" + checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 + languageName: node + linkType: hard + "yargs@npm:^15.3.1": version: 15.4.1 resolution: "yargs@npm:15.4.1" @@ -27518,21 +28216,6 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^17.2.1, yargs@npm:^17.6.2": - version: 17.7.2 - resolution: "yargs@npm:17.7.2" - dependencies: - cliui: "npm:^8.0.1" - escalade: "npm:^3.1.1" - get-caller-file: "npm:^2.0.5" - require-directory: "npm:^2.1.1" - string-width: "npm:^4.2.3" - y18n: "npm:^5.0.5" - yargs-parser: "npm:^21.1.1" - checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 - languageName: node - linkType: hard - "yn@npm:3.1.1": version: 3.1.1 resolution: "yn@npm:3.1.1" From 93cd136900e2e4c32e12fcd170dec14ed8e62052 Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Fri, 2 May 2025 12:02:45 +0200 Subject: [PATCH 15/61] fix: yarn lock diff on install --- code/yarn.lock | 749 +++---------------------------------------------- 1 file changed, 33 insertions(+), 716 deletions(-) diff --git a/code/yarn.lock b/code/yarn.lock index aa84d6643c1e..80bfce115e70 100644 --- a/code/yarn.lock +++ b/code/yarn.lock @@ -40,16 +40,6 @@ __metadata: languageName: node linkType: hard -"@angular-devkit/architect@npm:0.1902.10": - version: 0.1902.10 - resolution: "@angular-devkit/architect@npm:0.1902.10" - dependencies: - "@angular-devkit/core": "npm:19.2.10" - rxjs: "npm:7.8.1" - checksum: 10c0/4ce187452618041674ea9b3533183a580a3c0c11c4bc25985801a82b6f02d55e4ab21e25a26f8394deced831accf586225bcd02ed40227f818f2b1636fe00f92 - languageName: node - linkType: hard - "@angular-devkit/architect@npm:0.1902.9": version: 0.1902.9 resolution: "@angular-devkit/architect@npm:0.1902.9" @@ -209,25 +199,6 @@ __metadata: languageName: node linkType: hard -"@angular-devkit/core@npm:19.2.10": - version: 19.2.10 - resolution: "@angular-devkit/core@npm:19.2.10" - dependencies: - ajv: "npm:8.17.1" - ajv-formats: "npm:3.0.1" - jsonc-parser: "npm:3.3.1" - picomatch: "npm:4.0.2" - rxjs: "npm:7.8.1" - source-map: "npm:0.7.4" - peerDependencies: - chokidar: ^4.0.0 - peerDependenciesMeta: - chokidar: - optional: true - checksum: 10c0/a095df28d41f920650bfaf3dbd6de712519f6335abf503f2b7315966abcb2df4e625bf2c26765b03296e06bcc21aafb96271da7f0338b26fba277d08158f4904 - languageName: node - linkType: hard - "@angular-devkit/core@npm:19.2.9, @angular-devkit/core@npm:^19.1.1": version: 19.2.9 resolution: "@angular-devkit/core@npm:19.2.9" @@ -247,19 +218,6 @@ __metadata: languageName: node linkType: hard -"@angular-devkit/schematics@npm:19.2.10": - version: 19.2.10 - resolution: "@angular-devkit/schematics@npm:19.2.10" - dependencies: - "@angular-devkit/core": "npm:19.2.10" - jsonc-parser: "npm:3.3.1" - magic-string: "npm:0.30.17" - ora: "npm:5.4.1" - rxjs: "npm:7.8.1" - checksum: 10c0/ea4fb356b78b5e9b0cb07a764f3bca6fab5a7eb5204d71c877351ed18910f34d569aecb9aa9ea2e85cfa8d3a3c68803f47eeb2d565284ca53acb3c6f1556052a - languageName: node - linkType: hard - "@angular/animations@npm:^19.1.1": version: 19.2.8 resolution: "@angular/animations@npm:19.2.8" @@ -342,33 +300,6 @@ __metadata: languageName: node linkType: hard -"@angular/cli@npm:^19.1.1": - version: 19.2.10 - resolution: "@angular/cli@npm:19.2.10" - dependencies: - "@angular-devkit/architect": "npm:0.1902.10" - "@angular-devkit/core": "npm:19.2.10" - "@angular-devkit/schematics": "npm:19.2.10" - "@inquirer/prompts": "npm:7.3.2" - "@listr2/prompt-adapter-inquirer": "npm:2.0.18" - "@schematics/angular": "npm:19.2.10" - "@yarnpkg/lockfile": "npm:1.1.0" - ini: "npm:5.0.0" - jsonc-parser: "npm:3.3.1" - listr2: "npm:8.2.5" - npm-package-arg: "npm:12.0.2" - npm-pick-manifest: "npm:10.0.0" - pacote: "npm:20.0.0" - resolve: "npm:1.22.10" - semver: "npm:7.7.1" - symbol-observable: "npm:4.0.0" - yargs: "npm:17.7.2" - bin: - ng: bin/ng.js - checksum: 10c0/5f276697832ae901c8766ba9157ac7aade886c0cf901a9882719f67b2fbdcbf71961cab9670418beef4427d6b71ea65d814307691cfb6b191333f7a082e8df2b - languageName: node - linkType: hard - "@angular/common@npm:^19.1.1": version: 19.2.8 resolution: "@angular/common@npm:19.2.8" @@ -3305,24 +3236,6 @@ __metadata: languageName: node linkType: hard -"@inquirer/checkbox@npm:^4.1.2": - version: 4.1.5 - resolution: "@inquirer/checkbox@npm:4.1.5" - dependencies: - "@inquirer/core": "npm:^10.1.10" - "@inquirer/figures": "npm:^1.0.11" - "@inquirer/type": "npm:^3.0.6" - ansi-escapes: "npm:^4.3.2" - yoctocolors-cjs: "npm:^2.1.2" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/b984fb3ce8af34c327f3a85adcfe9fbd9eaac0c689bb9af79a5d55d508acb01de329747e8c923c9f4962e4006c353ed2dbe79e3fc9ae0f85f5851427dbed75ed - languageName: node - linkType: hard - "@inquirer/confirm@npm:5.1.6": version: 5.1.6 resolution: "@inquirer/confirm@npm:5.1.6" @@ -3338,22 +3251,7 @@ __metadata: languageName: node linkType: hard -"@inquirer/confirm@npm:^5.1.6": - version: 5.1.9 - resolution: "@inquirer/confirm@npm:5.1.9" - dependencies: - "@inquirer/core": "npm:^10.1.10" - "@inquirer/type": "npm:^3.0.6" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/e35c134303f8151074479d6704c048676b2684debfde18a46ff0fb7585a3ee31dea551899ddcb48169fbef5dfe64c1948d2d8ac17a6939bedd31bb54c39bbea4 - languageName: node - linkType: hard - -"@inquirer/core@npm:^10.1.10, @inquirer/core@npm:^10.1.7": +"@inquirer/core@npm:^10.1.7": version: 10.1.10 resolution: "@inquirer/core@npm:10.1.10" dependencies: @@ -3374,38 +3272,6 @@ __metadata: languageName: node linkType: hard -"@inquirer/editor@npm:^4.2.7": - version: 4.2.10 - resolution: "@inquirer/editor@npm:4.2.10" - dependencies: - "@inquirer/core": "npm:^10.1.10" - "@inquirer/type": "npm:^3.0.6" - external-editor: "npm:^3.1.0" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/b0213ad3ef45bc30427def4742db22126a1e6a59923033d21cae216276d8cf85d2af8abe432e5567ea24a7f6a31e23e7014e31308405cde684060b974e454a22 - languageName: node - linkType: hard - -"@inquirer/expand@npm:^4.0.9": - version: 4.0.12 - resolution: "@inquirer/expand@npm:4.0.12" - dependencies: - "@inquirer/core": "npm:^10.1.10" - "@inquirer/type": "npm:^3.0.6" - yoctocolors-cjs: "npm:^2.1.2" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/f7abfc09ef942b63504677be5cf6fc443fb8090b5d43f7d2fe09983215cc01c6d82351cd1b596e90723b382a0931c9344d3280d54acf47d898782f4af2030b2e - languageName: node - linkType: hard - "@inquirer/figures@npm:^1.0.11": version: 1.0.11 resolution: "@inquirer/figures@npm:1.0.11" @@ -3413,135 +3279,6 @@ __metadata: languageName: node linkType: hard -"@inquirer/input@npm:^4.1.6": - version: 4.1.9 - resolution: "@inquirer/input@npm:4.1.9" - dependencies: - "@inquirer/core": "npm:^10.1.10" - "@inquirer/type": "npm:^3.0.6" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/db2e661ee482f3f27bf8cb77f054f99aba30291bd24d63b28db62204c4c5efc496199a9ddc03d01e0f6e6455d6967efb3ef92d2cd91e672905948c8c978c67a1 - languageName: node - linkType: hard - -"@inquirer/number@npm:^3.0.9": - version: 3.0.12 - resolution: "@inquirer/number@npm:3.0.12" - dependencies: - "@inquirer/core": "npm:^10.1.10" - "@inquirer/type": "npm:^3.0.6" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/e40726e1c60ba48a374b4867d212bd5e14cb12daae97a6536095906246ba6af91ec7fa68e347ba52607ba5bd84f9e804768d12fbc1250b2cac814187fb5e9628 - languageName: node - linkType: hard - -"@inquirer/password@npm:^4.0.9": - version: 4.0.12 - resolution: "@inquirer/password@npm:4.0.12" - dependencies: - "@inquirer/core": "npm:^10.1.10" - "@inquirer/type": "npm:^3.0.6" - ansi-escapes: "npm:^4.3.2" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/03257985bbbd813c4f0c412effb691737517e348ca2590558864fe09877080daf90eb9910a60d097048fce9cf0c56a900e8f099854a9ae21512ceaadbd986e01 - languageName: node - linkType: hard - -"@inquirer/prompts@npm:7.3.2": - version: 7.3.2 - resolution: "@inquirer/prompts@npm:7.3.2" - dependencies: - "@inquirer/checkbox": "npm:^4.1.2" - "@inquirer/confirm": "npm:^5.1.6" - "@inquirer/editor": "npm:^4.2.7" - "@inquirer/expand": "npm:^4.0.9" - "@inquirer/input": "npm:^4.1.6" - "@inquirer/number": "npm:^3.0.9" - "@inquirer/password": "npm:^4.0.9" - "@inquirer/rawlist": "npm:^4.0.9" - "@inquirer/search": "npm:^3.0.9" - "@inquirer/select": "npm:^4.0.9" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/a318d7c2a963f753f4868151f2ce5673e214f3a6597430e712bc59ef9605c831b71a6b52a9c5ea2f312b23063d2ee9fd633e127cdc9e4999e95ef15a5e90c7e1 - languageName: node - linkType: hard - -"@inquirer/rawlist@npm:^4.0.9": - version: 4.1.0 - resolution: "@inquirer/rawlist@npm:4.1.0" - dependencies: - "@inquirer/core": "npm:^10.1.10" - "@inquirer/type": "npm:^3.0.6" - yoctocolors-cjs: "npm:^2.1.2" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/0e92e8ee7eebd6b6ba7a81d968701f398dd372638f51dd8e3cb1fd3a03520bc0f713e112488d37fdb813f18928f338d82527c575e18a9bebde7ac3273045898c - languageName: node - linkType: hard - -"@inquirer/search@npm:^3.0.9": - version: 3.0.12 - resolution: "@inquirer/search@npm:3.0.12" - dependencies: - "@inquirer/core": "npm:^10.1.10" - "@inquirer/figures": "npm:^1.0.11" - "@inquirer/type": "npm:^3.0.6" - yoctocolors-cjs: "npm:^2.1.2" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/ef764f96b561b48e4d9a99716789d1fc0941d40884d1c9fea715c304360b46ec8c6e3edf603f7425a27d7743915564f405a3ccd1a72f0379a714be22887fe6ff - languageName: node - linkType: hard - -"@inquirer/select@npm:^4.0.9": - version: 4.2.0 - resolution: "@inquirer/select@npm:4.2.0" - dependencies: - "@inquirer/core": "npm:^10.1.10" - "@inquirer/figures": "npm:^1.0.11" - "@inquirer/type": "npm:^3.0.6" - ansi-escapes: "npm:^4.3.2" - yoctocolors-cjs: "npm:^2.1.2" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/b3cfab393d54e48012336710b8e9267a0dd5551878a7727800da3d78602398720aab8777d5687b2138261fb731b0079d1c3ec0f4d0fee194bb1c4496c97b340b - languageName: node - linkType: hard - -"@inquirer/type@npm:^1.5.5": - version: 1.5.5 - resolution: "@inquirer/type@npm:1.5.5" - dependencies: - mute-stream: "npm:^1.0.0" - checksum: 10c0/4c41736c09ba9426b5a9e44993bdd54e8f532e791518802e33866f233a2a6126a25c1c82c19d1abbf1df627e57b1b957dd3f8318ea96073d8bfc32193943bcb3 - languageName: node - linkType: hard - "@inquirer/type@npm:^3.0.4, @inquirer/type@npm:^3.0.6": version: 3.0.6 resolution: "@inquirer/type@npm:3.0.6" @@ -3718,17 +3455,6 @@ __metadata: languageName: node linkType: hard -"@listr2/prompt-adapter-inquirer@npm:2.0.18": - version: 2.0.18 - resolution: "@listr2/prompt-adapter-inquirer@npm:2.0.18" - dependencies: - "@inquirer/type": "npm:^1.5.5" - peerDependencies: - "@inquirer/prompts": ">= 3 < 8" - checksum: 10c0/580d2f0ae414cf3090c2fbfe4623649e448d930b3ff24b0211e64e0e037f1a3ffff5307bc36c10cdc0c4a35fc12f04190585e864c4ce05fbf5f062b41ff29e40 - languageName: node - linkType: hard - "@lit-labs/react@npm:^1.0.2": version: 1.2.1 resolution: "@lit-labs/react@npm:1.2.1" @@ -4233,86 +3959,6 @@ __metadata: languageName: node linkType: hard -"@npmcli/git@npm:^6.0.0": - version: 6.0.3 - resolution: "@npmcli/git@npm:6.0.3" - dependencies: - "@npmcli/promise-spawn": "npm:^8.0.0" - ini: "npm:^5.0.0" - lru-cache: "npm:^10.0.1" - npm-pick-manifest: "npm:^10.0.0" - proc-log: "npm:^5.0.0" - promise-retry: "npm:^2.0.1" - semver: "npm:^7.3.5" - which: "npm:^5.0.0" - checksum: 10c0/a8ff1d5f997f7bfdc149fbe7478017b100efe3d08bd566df6b5ac716fd630d2eff0f7feebc6705831a3a7072a67a955a339a8fea8551ce4faffafa9526306e05 - languageName: node - linkType: hard - -"@npmcli/installed-package-contents@npm:^3.0.0": - version: 3.0.0 - resolution: "@npmcli/installed-package-contents@npm:3.0.0" - dependencies: - npm-bundled: "npm:^4.0.0" - npm-normalize-package-bin: "npm:^4.0.0" - bin: - installed-package-contents: bin/index.js - checksum: 10c0/8bb361251cd13b91ae2d04bfcc59b52ffb8cd475d074259c143b3c29a0c4c0ae90d76cfb2cab00ff61cc76bd0c38591b530ce1bdbbc8a61d60ddc6c9ecbf169b - languageName: node - linkType: hard - -"@npmcli/node-gyp@npm:^4.0.0": - version: 4.0.0 - resolution: "@npmcli/node-gyp@npm:4.0.0" - checksum: 10c0/58422c2ce0693f519135dd32b5c5bcbb441823f08f9294d5ec19d9a22925ba1a5ec04a1b96f606f2ab09a5f5db56e704f6e201a485198ce9d11fb6b2705e6e79 - languageName: node - linkType: hard - -"@npmcli/package-json@npm:^6.0.0": - version: 6.1.1 - resolution: "@npmcli/package-json@npm:6.1.1" - dependencies: - "@npmcli/git": "npm:^6.0.0" - glob: "npm:^10.2.2" - hosted-git-info: "npm:^8.0.0" - json-parse-even-better-errors: "npm:^4.0.0" - proc-log: "npm:^5.0.0" - semver: "npm:^7.5.3" - validate-npm-package-license: "npm:^3.0.4" - checksum: 10c0/ec24e6dc4ade64de205f7964e325de31ee0c2dd7d70c2321a2b822481bf97505fffbe23ec05672fc61862ae68bbae3e9b44d4640439081dbc8f8b2dcdeda2aa3 - languageName: node - linkType: hard - -"@npmcli/promise-spawn@npm:^8.0.0": - version: 8.0.2 - resolution: "@npmcli/promise-spawn@npm:8.0.2" - dependencies: - which: "npm:^5.0.0" - checksum: 10c0/fe987dece7b843d9353d4d38982336ab3beabc2dd3c135862a4ba2921aae55b0d334891fe44c6cbbee20626259e54478bf498ad8d380c14c53732b489ae14f40 - languageName: node - linkType: hard - -"@npmcli/redact@npm:^3.0.0": - version: 3.2.0 - resolution: "@npmcli/redact@npm:3.2.0" - checksum: 10c0/8dde1c4d346a7487b4607b70dc0c19bffba980b7aab981121f58068f1a886aa86f6b7cb1566f0fcef5a454326438fbfefb4641e21354267e4193ff985cc8dc58 - languageName: node - linkType: hard - -"@npmcli/run-script@npm:^9.0.0": - version: 9.1.0 - resolution: "@npmcli/run-script@npm:9.1.0" - dependencies: - "@npmcli/node-gyp": "npm:^4.0.0" - "@npmcli/package-json": "npm:^6.0.0" - "@npmcli/promise-spawn": "npm:^8.0.0" - node-gyp: "npm:^11.0.0" - proc-log: "npm:^5.0.0" - which: "npm:^5.0.0" - checksum: 10c0/4ed8eae5c7722c24814473f819d0bfe950f70e876bf9c52e05a61d3e74f2a044386da95e2e171e5a7a81e4c0b144582535addf2510e5decfd7d4aa7ae9e50931 - languageName: node - linkType: hard - "@nx/devkit@npm:20.2.2": version: 20.2.2 resolution: "@nx/devkit@npm:20.2.2" @@ -6176,17 +5822,6 @@ __metadata: languageName: node linkType: hard -"@schematics/angular@npm:19.2.10": - version: 19.2.10 - resolution: "@schematics/angular@npm:19.2.10" - dependencies: - "@angular-devkit/core": "npm:19.2.10" - "@angular-devkit/schematics": "npm:19.2.10" - jsonc-parser: "npm:3.3.1" - checksum: 10c0/dd6bc6aaf762ee58ec1675b088464c9b45b4734f18ed53179a95ed3be5fb7e1792c6e858c635de85d42143882bfb8df5f2f238d408cd0967e7de02f07a7b10be - languageName: node - linkType: hard - "@sec-ant/readable-stream@npm:^0.4.1": version: 0.4.1 resolution: "@sec-ant/readable-stream@npm:0.4.1" @@ -6217,64 +5852,6 @@ __metadata: languageName: node linkType: hard -"@sigstore/bundle@npm:^3.1.0": - version: 3.1.0 - resolution: "@sigstore/bundle@npm:3.1.0" - dependencies: - "@sigstore/protobuf-specs": "npm:^0.4.0" - checksum: 10c0/f34afa3efe81b0925cf1568eeea7678876c5889799fcdf9b81d1062067108e74fc3f3480b0d2b7daa7389f944e4a2523b5fc98d65dbbaa34d206d8c2edc4fa5a - languageName: node - linkType: hard - -"@sigstore/core@npm:^2.0.0": - version: 2.0.0 - resolution: "@sigstore/core@npm:2.0.0" - checksum: 10c0/bb7e668aedcda68312d2ff7c986fd0ba29057ca4dfbaef516c997b0799cd8858b2fc8017a7946fd2e43f237920adbcaa7455097a0a02909ed86cad9f98d592d4 - languageName: node - linkType: hard - -"@sigstore/protobuf-specs@npm:^0.4.0, @sigstore/protobuf-specs@npm:^0.4.1": - version: 0.4.1 - resolution: "@sigstore/protobuf-specs@npm:0.4.1" - checksum: 10c0/8de75bc84f307b7d7bf4fa265f89a8bfa717d96e091be29ee9be1ffd6036b81355a349955e5036b86570d37f2b30b18a68a43f5e40bd958bd4128aa6bb39a3f3 - languageName: node - linkType: hard - -"@sigstore/sign@npm:^3.1.0": - version: 3.1.0 - resolution: "@sigstore/sign@npm:3.1.0" - dependencies: - "@sigstore/bundle": "npm:^3.1.0" - "@sigstore/core": "npm:^2.0.0" - "@sigstore/protobuf-specs": "npm:^0.4.0" - make-fetch-happen: "npm:^14.0.2" - proc-log: "npm:^5.0.0" - promise-retry: "npm:^2.0.1" - checksum: 10c0/7647f3a1350a09d66e7d77fdf8edf6eeb047f818acc2cd06325fc8ec9f0cd654dd25909876147b7ed052d459dc6a1d64e8cbaa44486300b241c3b139d778f254 - languageName: node - linkType: hard - -"@sigstore/tuf@npm:^3.1.0": - version: 3.1.1 - resolution: "@sigstore/tuf@npm:3.1.1" - dependencies: - "@sigstore/protobuf-specs": "npm:^0.4.1" - tuf-js: "npm:^3.0.1" - checksum: 10c0/08fdafb45c859cd58ef02e4f28e00a2d74f0c309dca36cf20fda17e55e194a3b7ebcfd9c40197c197d044ae4de0ff5d99b363aaec7cb6cbbf09611afa2661a55 - languageName: node - linkType: hard - -"@sigstore/verify@npm:^2.1.0": - version: 2.1.1 - resolution: "@sigstore/verify@npm:2.1.1" - dependencies: - "@sigstore/bundle": "npm:^3.1.0" - "@sigstore/core": "npm:^2.0.0" - "@sigstore/protobuf-specs": "npm:^0.4.1" - checksum: 10c0/4881d8cd798f7d0c5ffe42b643b950c2a8af1f07c96fc3f3a3409bf5f2221b832d4f018104a12ac8ae0740060ecbb837b99dec058765925d1dcb08ccbd92feb4 - languageName: node - linkType: hard - "@sinclair/typebox@npm:^0.27.8": version: 0.27.8 resolution: "@sinclair/typebox@npm:0.27.8" @@ -6480,7 +6057,6 @@ __metadata: "@angular-devkit/build-angular": "npm:^19.1.1" "@angular-devkit/core": "npm:^19.1.1" "@angular/animations": "npm:^19.1.1" - "@angular/cli": "npm:^19.1.1" "@angular/common": "npm:^19.1.1" "@angular/compiler": "npm:^19.1.1" "@angular/compiler-cli": "npm:^19.1.1" @@ -6500,7 +6076,6 @@ __metadata: ts-dedent: "npm:^2.0.0" tsconfig-paths-webpack-plugin: "npm:^4.0.1" typescript: "npm:^5.8.3" - util-deprecate: "npm:^1.0.2" webpack: "npm:5" zone.js: "npm:^0.15.0" peerDependencies: @@ -7667,23 +7242,6 @@ __metadata: languageName: node linkType: hard -"@tufjs/canonical-json@npm:2.0.0": - version: 2.0.0 - resolution: "@tufjs/canonical-json@npm:2.0.0" - checksum: 10c0/52c5ffaef1483ed5c3feedfeba26ca9142fa386eea54464e70ff515bd01c5e04eab05d01eff8c2593291dcaf2397ca7d9c512720e11f52072b04c47a5c279415 - languageName: node - linkType: hard - -"@tufjs/models@npm:3.0.1": - version: 3.0.1 - resolution: "@tufjs/models@npm:3.0.1" - dependencies: - "@tufjs/canonical-json": "npm:2.0.0" - minimatch: "npm:^9.0.5" - checksum: 10c0/0b2022589139102edf28f7fdcd094407fc98ac25bf530ebcf538dd63152baea9b6144b713c8dfc4f6b7580adeff706ab6ecc5f9716c4b816e58a04419abb1926 - languageName: node - linkType: hard - "@tybys/wasm-util@npm:^0.9.0": version: 0.9.0 resolution: "@tybys/wasm-util@npm:0.9.0" @@ -9383,7 +8941,7 @@ __metadata: languageName: node linkType: hard -"@yarnpkg/lockfile@npm:1.1.0, @yarnpkg/lockfile@npm:^1.1.0": +"@yarnpkg/lockfile@npm:^1.1.0": version: 1.1.0 resolution: "@yarnpkg/lockfile@npm:1.1.0" checksum: 10c0/0bfa50a3d756623d1f3409bc23f225a1d069424dbc77c6fd2f14fb377390cd57ec703dc70286e081c564be9051ead9ba85d81d66a3e68eeb6eb506d4e0c0fbda @@ -11086,7 +10644,7 @@ __metadata: languageName: node linkType: hard -"cacache@npm:^19.0.0, cacache@npm:^19.0.1": +"cacache@npm:^19.0.1": version: 19.0.1 resolution: "cacache@npm:19.0.1" dependencies: @@ -11333,13 +10891,6 @@ __metadata: languageName: node linkType: hard -"chardet@npm:^0.7.0": - version: 0.7.0 - resolution: "chardet@npm:0.7.0" - checksum: 10c0/96e4731b9ec8050cbb56ab684e8c48d6c33f7826b755802d14e3ebfdc51c57afeece3ea39bc6b09acc359e4363525388b915e16640c1378053820f5e70d0f27d - languageName: node - linkType: hard - "check-error@npm:^2.1.1": version: 2.1.1 resolution: "check-error@npm:2.1.1" @@ -14864,17 +14415,6 @@ __metadata: languageName: node linkType: hard -"external-editor@npm:^3.1.0": - version: 3.1.0 - resolution: "external-editor@npm:3.1.0" - dependencies: - chardet: "npm:^0.7.0" - iconv-lite: "npm:^0.4.24" - tmp: "npm:^0.0.33" - checksum: 10c0/c98f1ba3efdfa3c561db4447ff366a6adb5c1e2581462522c56a18bf90dfe4da382f9cd1feee3e330108c3595a854b218272539f311ba1b3298f841eb0fbf339 - languageName: node - linkType: hard - "fast-content-type-parse@npm:^2.0.0": version: 2.0.1 resolution: "fast-content-type-parse@npm:2.0.1" @@ -16482,15 +16022,6 @@ __metadata: languageName: node linkType: hard -"hosted-git-info@npm:^8.0.0": - version: 8.1.0 - resolution: "hosted-git-info@npm:8.1.0" - dependencies: - lru-cache: "npm:^10.0.1" - checksum: 10c0/53cc838ecaa7d4aa69a81d9d8edc362c9d415f67b76ad38cdd781d2a2f5b45ad0aa9f9b013fb4ea54a9f64fd2365d0b6386b5a24bdf4cb90c80477cf3175aaa2 - languageName: node - linkType: hard - "hpack.js@npm:^2.1.6": version: 2.1.6 resolution: "hpack.js@npm:2.1.6" @@ -16842,7 +16373,7 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:0.4.24, iconv-lite@npm:^0.4.24": +"iconv-lite@npm:0.4.24": version: 0.4.24 resolution: "iconv-lite@npm:0.4.24" dependencies: @@ -16876,15 +16407,6 @@ __metadata: languageName: node linkType: hard -"ignore-walk@npm:^7.0.0": - version: 7.0.0 - resolution: "ignore-walk@npm:7.0.0" - dependencies: - minimatch: "npm:^9.0.0" - checksum: 10c0/3754bcde369a53a92c1d0835ea93feb6c5b2934984d3f5a8f9dd962d13ac33ee3a9e930901a89b5d46fc061870639d983f497186afdfe3484e135f2ad89f5577 - languageName: node - linkType: hard - "ignore@npm:^4.0.6": version: 4.0.6 resolution: "ignore@npm:4.0.6" @@ -16986,13 +16508,6 @@ __metadata: languageName: node linkType: hard -"ini@npm:5.0.0, ini@npm:^5.0.0": - version: 5.0.0 - resolution: "ini@npm:5.0.0" - checksum: 10c0/657491ce766cbb4b335ab221ee8f72b9654d9f0e35c32fe5ff2eb7ab8c5ce72237ff6456555b50cde88e6507a719a70e28e327b450782b4fc20c90326ec8c1a8 - languageName: node - linkType: hard - "ini@npm:^1.3.4": version: 1.3.8 resolution: "ini@npm:1.3.8" @@ -17000,6 +16515,13 @@ __metadata: languageName: node linkType: hard +"ini@npm:^5.0.0": + version: 5.0.0 + resolution: "ini@npm:5.0.0" + checksum: 10c0/657491ce766cbb4b335ab221ee8f72b9654d9f0e35c32fe5ff2eb7ab8c5ce72237ff6456555b50cde88e6507a719a70e28e327b450782b4fc20c90326ec8c1a8 + languageName: node + linkType: hard + "inline-style-parser@npm:0.2.4": version: 0.2.4 resolution: "inline-style-parser@npm:0.2.4" @@ -18030,13 +17552,6 @@ __metadata: languageName: node linkType: hard -"json-parse-even-better-errors@npm:^4.0.0": - version: 4.0.0 - resolution: "json-parse-even-better-errors@npm:4.0.0" - checksum: 10c0/84cd9304a97e8fb2af3937bf53acb91c026aeb859703c332684e688ea60db27fc2242aa532a84e1883fdcbe1e5c1fb57c2bef38e312021aa1cd300defc63cf16 - languageName: node - linkType: hard - "json-schema-traverse@npm:^0.4.1": version: 0.4.1 resolution: "json-schema-traverse@npm:0.4.1" @@ -18146,13 +17661,6 @@ __metadata: languageName: node linkType: hard -"jsonparse@npm:^1.3.1": - version: 1.3.1 - resolution: "jsonparse@npm:1.3.1" - checksum: 10c0/89bc68080cd0a0e276d4b5ab1b79cacd68f562467008d176dc23e16e97d4efec9e21741d92ba5087a8433526a45a7e6a9d5ef25408696c402ca1cfbc01a90bf0 - languageName: node - linkType: hard - "jsonpointer@npm:^5.0.0": version: 5.0.1 resolution: "jsonpointer@npm:5.0.1" @@ -18983,7 +18491,7 @@ __metadata: languageName: node linkType: hard -"make-fetch-happen@npm:^14.0.0, make-fetch-happen@npm:^14.0.1, make-fetch-happen@npm:^14.0.2, make-fetch-happen@npm:^14.0.3": +"make-fetch-happen@npm:^14.0.3": version: 14.0.3 resolution: "make-fetch-happen@npm:14.0.3" dependencies: @@ -19803,7 +19311,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.0, minimatch@npm:^9.0.3, minimatch@npm:^9.0.4, minimatch@npm:^9.0.5": +"minimatch@npm:^9.0.3, minimatch@npm:^9.0.4": version: 9.0.5 resolution: "minimatch@npm:9.0.5" dependencies: @@ -20088,13 +19596,6 @@ __metadata: languageName: node linkType: hard -"mute-stream@npm:^1.0.0": - version: 1.0.0 - resolution: "mute-stream@npm:1.0.0" - checksum: 10c0/dce2a9ccda171ec979a3b4f869a102b1343dee35e920146776780de182f16eae459644d187e38d59a3d37adf85685e1c17c38cf7bfda7e39a9880f7a1d10a74c - languageName: node - linkType: hard - "mute-stream@npm:^2.0.0": version: 2.0.0 resolution: "mute-stream@npm:2.0.0" @@ -20345,7 +19846,7 @@ __metadata: languageName: node linkType: hard -"node-gyp@npm:^11.0.0, node-gyp@npm:latest": +"node-gyp@npm:latest": version: 11.2.0 resolution: "node-gyp@npm:11.2.0" dependencies: @@ -20466,31 +19967,6 @@ __metadata: languageName: node linkType: hard -"npm-bundled@npm:^4.0.0": - version: 4.0.0 - resolution: "npm-bundled@npm:4.0.0" - dependencies: - npm-normalize-package-bin: "npm:^4.0.0" - checksum: 10c0/e6e20caefbc6a41138d3767ec998f6a2cf55f33371c119417a556ff6052390a2ffeb3b465a74aea127fb211ddfcb7db776620faf12b64e48e60e332b25b5b8a0 - languageName: node - linkType: hard - -"npm-install-checks@npm:^7.1.0": - version: 7.1.1 - resolution: "npm-install-checks@npm:7.1.1" - dependencies: - semver: "npm:^7.1.1" - checksum: 10c0/3cfd705ef3f70add31a32b4a5462d16e0f06d9df636072483fb43c854414a1cc128f496e84a8d9c12c1f1820307b7a3c275643589c564dac3c870eb636f8eea4 - languageName: node - linkType: hard - -"npm-normalize-package-bin@npm:^4.0.0": - version: 4.0.0 - resolution: "npm-normalize-package-bin@npm:4.0.0" - checksum: 10c0/1fa546fcae8eaab61ef9b9ec237b6c795008da50e1883eae030e9e38bb04ffa32c5aabcef9a0400eae3dc1f91809bcfa85e437ce80d677c69b419d1d9cacf0ab - languageName: node - linkType: hard - "npm-package-arg@npm:11.0.1": version: 11.0.1 resolution: "npm-package-arg@npm:11.0.1" @@ -20503,55 +19979,6 @@ __metadata: languageName: node linkType: hard -"npm-package-arg@npm:12.0.2, npm-package-arg@npm:^12.0.0": - version: 12.0.2 - resolution: "npm-package-arg@npm:12.0.2" - dependencies: - hosted-git-info: "npm:^8.0.0" - proc-log: "npm:^5.0.0" - semver: "npm:^7.3.5" - validate-npm-package-name: "npm:^6.0.0" - checksum: 10c0/a507046ca0999862d6f1a4878d2e22d47a728062b49d670ea7a965b0b555fc84ba4473daf34eb72c711b68aeb02e4f567fdb410d54385535cb7e4d85aaf49544 - languageName: node - linkType: hard - -"npm-packlist@npm:^9.0.0": - version: 9.0.0 - resolution: "npm-packlist@npm:9.0.0" - dependencies: - ignore-walk: "npm:^7.0.0" - checksum: 10c0/3eb9e877fff81ed1f97b86a387a13a7d0136a26c4c21d8fab7e49be653e71d604ba63091ec80e3a0b1d1fd879639eab91ddda1a8df45d7631795b83911f2f9b8 - languageName: node - linkType: hard - -"npm-pick-manifest@npm:10.0.0, npm-pick-manifest@npm:^10.0.0": - version: 10.0.0 - resolution: "npm-pick-manifest@npm:10.0.0" - dependencies: - npm-install-checks: "npm:^7.1.0" - npm-normalize-package-bin: "npm:^4.0.0" - npm-package-arg: "npm:^12.0.0" - semver: "npm:^7.3.5" - checksum: 10c0/946e791f6164a04dbc3340749cd7521d4d1f60accb2d0ca901375314b8425c8a12b34b4b70e2850462cc898fba5fa8d1f283221bf788a1d37276f06a85c4562a - languageName: node - linkType: hard - -"npm-registry-fetch@npm:^18.0.0": - version: 18.0.2 - resolution: "npm-registry-fetch@npm:18.0.2" - dependencies: - "@npmcli/redact": "npm:^3.0.0" - jsonparse: "npm:^1.3.1" - make-fetch-happen: "npm:^14.0.0" - minipass: "npm:^7.0.2" - minipass-fetch: "npm:^4.0.0" - minizlib: "npm:^3.0.1" - npm-package-arg: "npm:^12.0.0" - proc-log: "npm:^5.0.0" - checksum: 10c0/43e02befb393f67d5014d690a96d55f0b5f837a3eb9a79b17738ff0e3a1f081968480f2f280d1ad77a088ebd88c196793d929b0e4d24a8389a324dfd4006bc39 - languageName: node - linkType: hard - "npm-run-path@npm:^2.0.0": version: 2.0.2 resolution: "npm-run-path@npm:2.0.2" @@ -21275,33 +20702,6 @@ __metadata: languageName: node linkType: hard -"pacote@npm:20.0.0": - version: 20.0.0 - resolution: "pacote@npm:20.0.0" - dependencies: - "@npmcli/git": "npm:^6.0.0" - "@npmcli/installed-package-contents": "npm:^3.0.0" - "@npmcli/package-json": "npm:^6.0.0" - "@npmcli/promise-spawn": "npm:^8.0.0" - "@npmcli/run-script": "npm:^9.0.0" - cacache: "npm:^19.0.0" - fs-minipass: "npm:^3.0.0" - minipass: "npm:^7.0.2" - npm-package-arg: "npm:^12.0.0" - npm-packlist: "npm:^9.0.0" - npm-pick-manifest: "npm:^10.0.0" - npm-registry-fetch: "npm:^18.0.0" - proc-log: "npm:^5.0.0" - promise-retry: "npm:^2.0.1" - sigstore: "npm:^3.0.0" - ssri: "npm:^12.0.0" - tar: "npm:^6.1.11" - bin: - pacote: bin/index.js - checksum: 10c0/435c385446ecc81b1eb1584f4fa3cb102e630a22877f39b5c1a92eddfeaf222bd027b205e32632be2801e3bcbe525165cdffb5ceca5c13bbc81f8132fe1ba49e - languageName: node - linkType: hard - "pako@npm:~0.2.0": version: 0.2.9 resolution: "pako@npm:0.2.9" @@ -23556,7 +22956,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:1.22.10, resolve@npm:^1.10.0, resolve@npm:^1.10.1, resolve@npm:^1.12.0, resolve@npm:^1.13.1, resolve@npm:^1.14.2, resolve@npm:^1.15.1, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4, resolve@npm:^1.22.8, resolve@npm:^1.4.0": +"resolve@npm:^1.10.0, resolve@npm:^1.10.1, resolve@npm:^1.12.0, resolve@npm:^1.13.1, resolve@npm:^1.14.2, resolve@npm:^1.15.1, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4, resolve@npm:^1.22.8, resolve@npm:^1.4.0": version: 1.22.10 resolution: "resolve@npm:1.22.10" dependencies: @@ -23582,7 +22982,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A1.22.10#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.10.1#optional!builtin, resolve@patch:resolve@npm%3A^1.12.0#optional!builtin, resolve@patch:resolve@npm%3A^1.13.1#optional!builtin, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.15.1#optional!builtin, resolve@patch:resolve@npm%3A^1.17.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin, resolve@patch:resolve@npm%3A^1.4.0#optional!builtin": +"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.10.1#optional!builtin, resolve@patch:resolve@npm%3A^1.12.0#optional!builtin, resolve@patch:resolve@npm%3A^1.13.1#optional!builtin, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.15.1#optional!builtin, resolve@patch:resolve@npm%3A^1.17.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin, resolve@patch:resolve@npm%3A^1.4.0#optional!builtin": version: 1.22.10 resolution: "resolve@patch:resolve@npm%3A1.22.10#optional!builtin::version=1.22.10&hash=c3c19d" dependencies: @@ -24195,7 +23595,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:7.7.1, semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.2.1, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.2, semver@npm:^7.6.3, semver@npm:^7.7.1": +"semver@npm:7.7.1, semver@npm:^7.0.0, semver@npm:^7.2.1, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.2, semver@npm:^7.6.3, semver@npm:^7.7.1": version: 7.7.1 resolution: "semver@npm:7.7.1" bin: @@ -24552,20 +23952,6 @@ __metadata: languageName: node linkType: hard -"sigstore@npm:^3.0.0": - version: 3.1.0 - resolution: "sigstore@npm:3.1.0" - dependencies: - "@sigstore/bundle": "npm:^3.1.0" - "@sigstore/core": "npm:^2.0.0" - "@sigstore/protobuf-specs": "npm:^0.4.0" - "@sigstore/sign": "npm:^3.1.0" - "@sigstore/tuf": "npm:^3.1.0" - "@sigstore/verify": "npm:^2.1.0" - checksum: 10c0/c037f5526e698ec6de8654f6be6b6fa52bf52f2ffcd78109cdefc6d824bbb8390324522dcb0f84d57a674948ac53aef34dd77f9de66c91bcd91d0af56bb91c7e - languageName: node - linkType: hard - "silent-error@npm:^1.0.0, silent-error@npm:^1.1.1": version: 1.1.1 resolution: "silent-error@npm:1.1.1" @@ -24838,40 +24224,6 @@ __metadata: languageName: node linkType: hard -"spdx-correct@npm:^3.0.0": - version: 3.2.0 - resolution: "spdx-correct@npm:3.2.0" - dependencies: - spdx-expression-parse: "npm:^3.0.0" - spdx-license-ids: "npm:^3.0.0" - checksum: 10c0/49208f008618b9119208b0dadc9208a3a55053f4fd6a0ae8116861bd22696fc50f4142a35ebfdb389e05ccf2de8ad142573fefc9e26f670522d899f7b2fe7386 - languageName: node - linkType: hard - -"spdx-exceptions@npm:^2.1.0": - version: 2.5.0 - resolution: "spdx-exceptions@npm:2.5.0" - checksum: 10c0/37217b7762ee0ea0d8b7d0c29fd48b7e4dfb94096b109d6255b589c561f57da93bf4e328c0290046115961b9209a8051ad9f525e48d433082fc79f496a4ea940 - languageName: node - linkType: hard - -"spdx-expression-parse@npm:^3.0.0": - version: 3.0.1 - resolution: "spdx-expression-parse@npm:3.0.1" - dependencies: - spdx-exceptions: "npm:^2.1.0" - spdx-license-ids: "npm:^3.0.0" - checksum: 10c0/6f8a41c87759fa184a58713b86c6a8b028250f158159f1d03ed9d1b6ee4d9eefdc74181c8ddc581a341aa971c3e7b79e30b59c23b05d2436d5de1c30bdef7171 - languageName: node - linkType: hard - -"spdx-license-ids@npm:^3.0.0": - version: 3.0.21 - resolution: "spdx-license-ids@npm:3.0.21" - checksum: 10c0/ecb24c698d8496aa9efe23e0b1f751f8a7a89faedcdfcbfabae772b546c2db46ccde8f3bc447a238eb86bbcd4f73fea88720ef3b8394f7896381bec3d7736411 - languageName: node - linkType: hard - "spdy-transport@npm:^3.0.0": version: 3.0.0 resolution: "spdy-transport@npm:3.0.0" @@ -25635,13 +24987,6 @@ __metadata: languageName: node linkType: hard -"symbol-observable@npm:4.0.0": - version: 4.0.0 - resolution: "symbol-observable@npm:4.0.0" - checksum: 10c0/5e9a3ab08263a6be8cbee76587ad5880dcc62a47002787ed5ebea56b1eb30dc87da6f0183d67e88286806799fbe21c69077fbd677be4be2188e92318d6c6f31d - languageName: node - linkType: hard - "symlink-or-copy@npm:^1.0.0, symlink-or-copy@npm:^1.0.1, symlink-or-copy@npm:^1.1.8, symlink-or-copy@npm:^1.2.0, symlink-or-copy@npm:^1.3.1": version: 1.3.1 resolution: "symlink-or-copy@npm:1.3.1" @@ -25704,7 +25049,7 @@ __metadata: languageName: node linkType: hard -"tar@npm:^6.1.11, tar@npm:^6.2.1": +"tar@npm:^6.2.1": version: 6.2.1 resolution: "tar@npm:6.2.1" dependencies: @@ -26242,17 +25587,6 @@ __metadata: languageName: node linkType: hard -"tuf-js@npm:^3.0.1": - version: 3.0.1 - resolution: "tuf-js@npm:3.0.1" - dependencies: - "@tufjs/models": "npm:3.0.1" - debug: "npm:^4.3.6" - make-fetch-happen: "npm:^14.0.1" - checksum: 10c0/4214dd6bb1ec8a6cadbc5690e5a8556de0306f0e95022e54fc7c0ff9dbcc229ab379fd4b048511387f9c0023ea8f8c35acd8f7313f6cbc94a1b8af8b289f62ad - languageName: node - linkType: hard - "tween-functions@npm:^1.2.0": version: 1.2.0 resolution: "tween-functions@npm:1.2.0" @@ -26890,16 +26224,6 @@ __metadata: languageName: node linkType: hard -"validate-npm-package-license@npm:^3.0.4": - version: 3.0.4 - resolution: "validate-npm-package-license@npm:3.0.4" - dependencies: - spdx-correct: "npm:^3.0.0" - spdx-expression-parse: "npm:^3.0.0" - checksum: 10c0/7b91e455a8de9a0beaa9fe961e536b677da7f48c9a493edf4d4d4a87fd80a7a10267d438723364e432c2fcd00b5650b5378275cded362383ef570276e6312f4f - languageName: node - linkType: hard - "validate-npm-package-name@npm:^5.0.0": version: 5.0.1 resolution: "validate-npm-package-name@npm:5.0.1" @@ -26907,13 +26231,6 @@ __metadata: languageName: node linkType: hard -"validate-npm-package-name@npm:^6.0.0": - version: 6.0.0 - resolution: "validate-npm-package-name@npm:6.0.0" - checksum: 10c0/35d1896d90a4f00291cfc17077b553910d45018b3562841acc6471731794eeebe39b409f678e8c1fee8ef1786e087cac8dea19abdd43649c30fd0b9c752afa2f - languageName: node - linkType: hard - "vary@npm:~1.1.2": version: 1.1.2 resolution: "vary@npm:1.1.2" @@ -28167,21 +27484,6 @@ __metadata: languageName: node linkType: hard -"yargs@npm:17.7.2, yargs@npm:^17.2.1, yargs@npm:^17.6.2": - version: 17.7.2 - resolution: "yargs@npm:17.7.2" - dependencies: - cliui: "npm:^8.0.1" - escalade: "npm:^3.1.1" - get-caller-file: "npm:^2.0.5" - require-directory: "npm:^2.1.1" - string-width: "npm:^4.2.3" - y18n: "npm:^5.0.5" - yargs-parser: "npm:^21.1.1" - checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 - languageName: node - linkType: hard - "yargs@npm:^15.3.1": version: 15.4.1 resolution: "yargs@npm:15.4.1" @@ -28216,6 +27518,21 @@ __metadata: languageName: node linkType: hard +"yargs@npm:^17.2.1, yargs@npm:^17.6.2": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: "npm:^8.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.3" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^21.1.1" + checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 + languageName: node + linkType: hard + "yn@npm:3.1.1": version: 3.1.1 resolution: "yn@npm:3.1.1" From df4753fe9a17d84cf6d144ab6eea5236d4ade582 Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Fri, 2 May 2025 17:42:10 +0200 Subject: [PATCH 16/61] feat: add feature switch useTestBedRenderer in parameters --- .../client/angular-beta/AbstractRenderer.ts | 98 ++++++++++- .../client/angular-beta/RendererFactory.ts | 14 +- .../client/angular-beta/StorybookModule.ts | 2 +- .../angular-beta/StorybookWrapperComponent.ts | 155 +++++++++++++++++- .../client/angular-beta/TestBedRenderer.ts | 18 ++ .../angular-beta/TestBedWrapperComponent.ts | 16 ++ .../utils/TestBedComponentBuilder.ts | 2 +- code/frameworks/angular/src/client/render.ts | 13 +- code/frameworks/angular/src/client/types.ts | 1 + .../provider-with-module-wrapper.stories.ts | 3 + 10 files changed, 300 insertions(+), 22 deletions(-) create mode 100644 code/frameworks/angular/src/client/angular-beta/TestBedRenderer.ts create mode 100644 code/frameworks/angular/src/client/angular-beta/TestBedWrapperComponent.ts diff --git a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts index 65fee155ea02..bf847e0842b6 100644 --- a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts +++ b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts @@ -1,11 +1,15 @@ import { ApplicationRef, NgModule, Type } from '@angular/core'; -import { Subject } from 'rxjs'; +import { BehaviorSubject, Subject } from 'rxjs'; import { stringify } from 'telejson'; import { ICollection, StoryFnAngularReturnType } from '../types'; import { PropertyExtractor } from './utils/PropertyExtractor'; import { TestBedComponentBuilder } from './utils/TestBedComponentBuilder'; -import { getWrapperComponent } from './StorybookWrapperComponent'; +import { getWrapperComponent } from './TestBedWrapperComponent'; +import { getApplication, storyPropsProvider } from '../../renderer'; +import { queueBootstrapping } from './utils/BootstrapQueue'; +import { bootstrapApplication } from '@angular/platform-browser'; +import { getNextStoryUID } from './utils/StoryUID'; type StoryRenderInfo = { storyFnAngular: StoryFnAngularReturnType; @@ -19,7 +23,7 @@ declare global { } const applicationRefs = new Map(); -const componentBuilders: TestBedComponentBuilder[] = []; +let componentBuilders: TestBedComponentBuilder[] = []; /** * Attribute name for the story UID that may be written to the targetDOMNode. * @@ -36,6 +40,7 @@ export abstract class AbstractRenderer { appRef.destroy(); } }); + componentBuilders = []; } protected previousStoryRenderInfo = new Map(); @@ -71,6 +76,8 @@ export abstract class AbstractRenderer { }) { const targetSelector = this.generateTargetSelectorFromStoryId(targetDOMNode.id); + const newStoryProps$ = new BehaviorSubject(storyFnAngular.props); + if ( !this.fullRendererRequired({ targetDOMNode, @@ -81,14 +88,93 @@ export abstract class AbstractRenderer { forced, }) ) { - // need unique attribute to get testbed instance for specific component - // to update props from story - // testbedInstance.setAndUpdateProps(...) + this.storyProps$.next(storyFnAngular.props); + return; } await this.beforeFullRender(targetDOMNode); + // Complete last BehaviorSubject and set a new one for the current module + if (this.storyProps$) { + this.storyProps$.complete(); + } + this.storyProps$ = newStoryProps$; + + this.initAngularRootElement(targetDOMNode, targetSelector); + + const analyzedMetadata = new PropertyExtractor(storyFnAngular.moduleMetadata, component); + await analyzedMetadata.init(); + + const storyUid = this.generateStoryUIdFromRawStoryUid( + targetDOMNode.getAttribute(STORY_UID_ATTRIBUTE) + ); + const componentSelector = storyUid !== null ? `${targetSelector}[${storyUid}]` : targetSelector; + if (storyUid !== null) { + const element = targetDOMNode.querySelector(targetSelector); + element.toggleAttribute(storyUid, true); + } + + const application = getApplication({ + storyFnAngular, + component, + targetSelector: componentSelector, + analyzedMetadata, + }); + + const providers = [ + storyPropsProvider(newStoryProps$), + ...analyzedMetadata.applicationProviders, + ...(storyFnAngular.applicationConfig?.providers ?? []), + ]; + + if (STORYBOOK_ANGULAR_OPTIONS?.experimentalZoneless) { + const { provideExperimentalZonelessChangeDetection } = await import('@angular/core'); + if (!provideExperimentalZonelessChangeDetection) { + throw new Error('Experimental zoneless change detection requires Angular 18 or higher'); + } else { + providers.unshift(provideExperimentalZonelessChangeDetection()); + } + } + + const applicationRef = await queueBootstrapping(() => { + return bootstrapApplication(application, { + ...storyFnAngular.applicationConfig, + providers, + }); + }); + + applicationRefs.set(targetDOMNode, applicationRef); + } + + /** + * Bootstrap main angular module with main component with testbed api + * + * @param storyFnAngular {StoryFnAngularReturnType} + * @param forced {boolean} + * @param component {Component} + */ + public async renderWithTestBed({ + storyFnAngular, + forced, + component, + targetDOMNode, + }: { + storyFnAngular: StoryFnAngularReturnType; + forced: boolean; + component?: any; + targetDOMNode: HTMLElement; + }) { + const targetSelector = this.generateTargetSelectorFromStoryId(targetDOMNode.id); + + // need unique attribute to get testbed instance for specific component + // to update props from story + // get instance by id + // testbedInstance.setAndUpdateProps(...) + // return; + + await this.beforeFullRender(targetDOMNode); + this.initAngularRootElement(targetDOMNode, targetSelector); const analyzedMetadata = new PropertyExtractor(storyFnAngular.moduleMetadata, component); diff --git a/code/frameworks/angular/src/client/angular-beta/RendererFactory.ts b/code/frameworks/angular/src/client/angular-beta/RendererFactory.ts index afe1ce91000b..32984b0afa55 100644 --- a/code/frameworks/angular/src/client/angular-beta/RendererFactory.ts +++ b/code/frameworks/angular/src/client/angular-beta/RendererFactory.ts @@ -1,6 +1,7 @@ import { AbstractRenderer } from './AbstractRenderer'; import { CanvasRenderer } from './CanvasRenderer'; import { DocsRenderer } from './DocsRenderer'; +import { TestBedRenderer } from './TestBedRenderer'; type RenderType = 'canvas' | 'docs'; export class RendererFactory { @@ -8,8 +9,12 @@ export class RendererFactory { private rendererMap = new Map(); - public async getRendererInstance(targetDOMNode: HTMLElement): Promise { + public async getRendererInstance( + targetDOMNode: HTMLElement, + useTestBedRenderer: boolean + ): Promise { const targetId = targetDOMNode.id; + // do nothing if the target node is null // fix a problem when the docs asks 2 times the same component at the same time // the 1st targetDOMNode of the 1st requested rendering becomes null 🤷‍♂️ @@ -26,17 +31,20 @@ export class RendererFactory { } if (!this.rendererMap.has(targetId)) { - this.rendererMap.set(targetId, this.buildRenderer(renderType)); + this.rendererMap.set(targetId, this.buildRenderer(renderType, useTestBedRenderer)); } this.lastRenderType = renderType; return this.rendererMap.get(targetId); } - private buildRenderer(renderType: RenderType) { + private buildRenderer(renderType: RenderType, useTestBedRenderer: boolean) { if (renderType === 'docs') { return new DocsRenderer(); } + if (useTestBedRenderer === true) { + return new TestBedRenderer(); + } return new CanvasRenderer(); } } diff --git a/code/frameworks/angular/src/client/angular-beta/StorybookModule.ts b/code/frameworks/angular/src/client/angular-beta/StorybookModule.ts index bd793eaf206b..a0dc3cc6ee92 100644 --- a/code/frameworks/angular/src/client/angular-beta/StorybookModule.ts +++ b/code/frameworks/angular/src/client/angular-beta/StorybookModule.ts @@ -1,7 +1,7 @@ import { StoryFnAngularReturnType } from '../types'; import { computesTemplateFromComponent } from './ComputesTemplateFromComponent'; -import { createStorybookWrapperComponent } from './StorybookWrapperComponent'; import { PropertyExtractor } from './utils/PropertyExtractor'; +import { createStorybookWrapperComponent } from './StorybookWrapperComponent'; export const getApplication = ({ storyFnAngular, diff --git a/code/frameworks/angular/src/client/angular-beta/StorybookWrapperComponent.ts b/code/frameworks/angular/src/client/angular-beta/StorybookWrapperComponent.ts index fea156ffa577..9c4dfa0c7368 100644 --- a/code/frameworks/angular/src/client/angular-beta/StorybookWrapperComponent.ts +++ b/code/frameworks/angular/src/client/angular-beta/StorybookWrapperComponent.ts @@ -1,16 +1,153 @@ -import { Component, NgModule } from '@angular/core'; +import { + AfterViewInit, + ChangeDetectorRef, + Component, + ElementRef, + Inject, + NgModule, + OnDestroy, + Type, + ViewChild, + ViewContainerRef, +} from '@angular/core'; +import { Subject, Subscription } from 'rxjs'; +import { map, skip } from 'rxjs/operators'; + +import { ICollection, NgModuleMetadata } from '../types'; +import { STORY_PROPS } from './StorybookProvider'; +import { ComponentInputsOutputs, getComponentInputsOutputs } from './utils/NgComponentAnalyzer'; +import { PropertyExtractor } from './utils/PropertyExtractor'; + +const getNonInputsOutputsProps = ( + ngComponentInputsOutputs: ComponentInputsOutputs, + props: ICollection = {} +) => { + const inputs = ngComponentInputsOutputs.inputs + .filter((i) => i.templateName in props) + .map((i) => i.templateName); + const outputs = ngComponentInputsOutputs.outputs + .filter((o) => o.templateName in props) + .map((o) => o.templateName); + return Object.keys(props).filter((k) => ![...inputs, ...outputs].includes(k)); +}; + +/** Wraps the story template into a component */ +export const createStorybookWrapperComponent = ({ + selector, + template, + storyComponent, + styles, + moduleMetadata, + initialProps, + analyzedMetadata, +}: { + selector: string; + template: string; + storyComponent: Type | undefined; + styles: string[]; + moduleMetadata: NgModuleMetadata; + initialProps?: ICollection; + analyzedMetadata: PropertyExtractor; +}): Type => { + // In ivy, a '' selector is not allowed, therefore we need to just set it to anything if + // storyComponent was not provided. + const viewChildSelector = storyComponent ?? '__storybook-noop'; + + const { imports, declarations, providers } = analyzedMetadata; + + @NgModule({ + declarations, + imports, + exports: [...declarations, ...imports], + }) + class StorybookComponentModule {} + + PropertyExtractor.warnImportsModuleWithProviders(analyzedMetadata); -export const getWrapperComponent = (template: string) => { @Component({ + selector, template, standalone: true, + imports: [StorybookComponentModule], + providers, + styles, + schemas: moduleMetadata.schemas, }) - class CustomWrapperComponent {} - return CustomWrapperComponent; -}; + class StorybookWrapperComponent implements AfterViewInit, OnDestroy { + private storyComponentPropsSubscription: Subscription; + + private storyWrapperPropsSubscription: Subscription; + + @ViewChild(viewChildSelector, { static: true }) storyComponentElementRef: ElementRef; + + @ViewChild(viewChildSelector, { read: ViewContainerRef, static: true }) + storyComponentViewContainerRef: ViewContainerRef; + + // Used in case of a component without selector + storyComponent = storyComponent ?? ''; + + constructor( + @Inject(STORY_PROPS) private storyProps$: Subject, + @Inject(ChangeDetectorRef) private changeDetectorRef: ChangeDetectorRef + ) {} + + ngOnInit(): void { + // Subscribes to the observable storyProps$ to keep these properties up to date + this.storyWrapperPropsSubscription = this.storyProps$.subscribe((storyProps = {}) => { + // All props are added as component properties + Object.assign(this, storyProps); + + this.changeDetectorRef.detectChanges(); + this.changeDetectorRef.markForCheck(); + }); + } + + ngAfterViewInit(): void { + // Bind properties to component, if the story have component + if (this.storyComponentElementRef) { + const ngComponentInputsOutputs = getComponentInputsOutputs(storyComponent); + + const initialOtherProps = getNonInputsOutputsProps(ngComponentInputsOutputs, initialProps); + + // Initializes properties that are not Inputs | Outputs + // Allows story props to override local component properties + initialOtherProps.forEach((p) => { + (this.storyComponentElementRef as any)[p] = initialProps[p]; + }); + // `markForCheck` the component in case this uses changeDetection: OnPush + // And then forces the `detectChanges` + this.storyComponentViewContainerRef.injector.get(ChangeDetectorRef).markForCheck(); + this.changeDetectorRef.detectChanges(); + + // Once target component has been initialized, the storyProps$ observable keeps target component properties than are not Input|Output up to date + this.storyComponentPropsSubscription = this.storyProps$ + .pipe( + skip(1), + map((props) => { + const propsKeyToKeep = getNonInputsOutputsProps(ngComponentInputsOutputs, props); + return propsKeyToKeep.reduce((acc, p) => ({ ...acc, [p]: props[p] }), {}); + }) + ) + .subscribe((props) => { + // Replace inputs with new ones from props + Object.assign(this.storyComponentElementRef, props); + + // `markForCheck` the component in case this uses changeDetection: OnPush + // And then forces the `detectChanges` + this.storyComponentViewContainerRef.injector.get(ChangeDetectorRef).markForCheck(); + this.changeDetectorRef.detectChanges(); + }); + } + } -export const getWrapperModule = () => { - @NgModule() - class WrapperModule {} - return WrapperModule; + ngOnDestroy(): void { + if (this.storyComponentPropsSubscription != null) { + this.storyComponentPropsSubscription.unsubscribe(); + } + if (this.storyWrapperPropsSubscription != null) { + this.storyWrapperPropsSubscription.unsubscribe(); + } + } + } + return StorybookWrapperComponent; }; diff --git a/code/frameworks/angular/src/client/angular-beta/TestBedRenderer.ts b/code/frameworks/angular/src/client/angular-beta/TestBedRenderer.ts new file mode 100644 index 000000000000..c1a531998c54 --- /dev/null +++ b/code/frameworks/angular/src/client/angular-beta/TestBedRenderer.ts @@ -0,0 +1,18 @@ +import { AbstractRenderer } from './AbstractRenderer'; +import { StoryFnAngularReturnType, Parameters } from '../types'; + +export class TestBedRenderer extends AbstractRenderer { + public async render(options: { + storyFnAngular: StoryFnAngularReturnType; + forced: boolean; + parameters: Parameters; + component: any; + targetDOMNode: HTMLElement; + }) { + await super.renderWithTestBed(options); + } + + async beforeFullRender(): Promise { + TestBedRenderer.resetApplications(); + } +} diff --git a/code/frameworks/angular/src/client/angular-beta/TestBedWrapperComponent.ts b/code/frameworks/angular/src/client/angular-beta/TestBedWrapperComponent.ts new file mode 100644 index 000000000000..fea156ffa577 --- /dev/null +++ b/code/frameworks/angular/src/client/angular-beta/TestBedWrapperComponent.ts @@ -0,0 +1,16 @@ +import { Component, NgModule } from '@angular/core'; + +export const getWrapperComponent = (template: string) => { + @Component({ + template, + standalone: true, + }) + class CustomWrapperComponent {} + return CustomWrapperComponent; +}; + +export const getWrapperModule = () => { + @NgModule() + class WrapperModule {} + return WrapperModule; +}; diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts index 492326631f18..ba6f17f0b585 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts @@ -6,7 +6,7 @@ import { import { ApplicationRef, Type } from '@angular/core'; import { PropertyExtractor } from './PropertyExtractor'; import { ICollection, StoryFnAngularReturnType } from '../../types'; -import { getWrapperModule } from '../StorybookWrapperComponent'; +import { getWrapperModule } from '../TestBedWrapperComponent'; import { GenerateComponentMetaData, GenerateModuleMetaData, diff --git a/code/frameworks/angular/src/client/render.ts b/code/frameworks/angular/src/client/render.ts index 817d985bd16b..73290b728d8e 100644 --- a/code/frameworks/angular/src/client/render.ts +++ b/code/frameworks/angular/src/client/render.ts @@ -4,18 +4,27 @@ import '@angular/compiler'; import { RendererFactory } from './angular-beta/RendererFactory'; import { AngularRenderer } from './types'; +import { TestBedRenderer } from './angular-beta/TestBedRenderer'; export const rendererFactory = new RendererFactory(); export const render: ArgsStoryFn = (props) => ({ props }); export async function renderToCanvas( - { storyFn, showMain, forceRemount, storyContext: { component } }: RenderContext, + { + storyFn, + showMain, + forceRemount, + storyContext: { component, parameters }, + }: RenderContext, element: HTMLElement ) { showMain(); - const renderer = await rendererFactory.getRendererInstance(element); + const renderer = await rendererFactory.getRendererInstance( + element, + parameters.useTestBedRenderer ?? false + ); await renderer.render({ storyFnAngular: storyFn(), diff --git a/code/frameworks/angular/src/client/types.ts b/code/frameworks/angular/src/client/types.ts index 0b526bfb6cd4..ed0d408466dc 100644 --- a/code/frameworks/angular/src/client/types.ts +++ b/code/frameworks/angular/src/client/types.ts @@ -45,6 +45,7 @@ export interface AngularRenderer extends WebRenderer { export type Parameters = DefaultParameters & { bootstrapModuleOptions?: unknown; + useTestBedRenderer?: boolean; }; export type StoryContext = DefaultStoryContext & { parameters: Parameters }; diff --git a/code/frameworks/angular/template/stories/core/provider/provider-with-module-wrapper.stories.ts b/code/frameworks/angular/template/stories/core/provider/provider-with-module-wrapper.stories.ts index 763c002bba91..5626e9d1ed34 100644 --- a/code/frameworks/angular/template/stories/core/provider/provider-with-module-wrapper.stories.ts +++ b/code/frameworks/angular/template/stories/core/provider/provider-with-module-wrapper.stories.ts @@ -15,6 +15,9 @@ const meta: Meta = { providers: [{ provide: ApiService, useValue: mockService }], }), ], + parameters: { + useTestBedRenderer: true, + }, }; export default meta; From a4d719f08126acf16373a5eadb54bbab0d31f316 Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Sat, 3 May 2025 10:48:52 +0200 Subject: [PATCH 17/61] fix: preview didnt visualized correctly --- .../client/angular-beta/AbstractRenderer.ts | 28 +++++----- .../client/angular-beta/RendererFactory.ts | 17 +++++-- .../angular-beta/TestBedDocsRenderer.ts | 51 +++++++++++++++++++ .../client/angular-beta/TestBedRenderer.ts | 2 +- .../angular-beta/utils/PropertyExtractor.ts | 6 +++ .../utils/TestBedComponentBuilder.ts | 22 ++++++++ .../utils/TestBedOverrideMetaDataGenerator.ts | 2 +- code/frameworks/angular/src/client/render.ts | 12 ++--- 8 files changed, 108 insertions(+), 32 deletions(-) create mode 100644 code/frameworks/angular/src/client/angular-beta/TestBedDocsRenderer.ts diff --git a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts index bf847e0842b6..08d366e1b7cf 100644 --- a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts +++ b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts @@ -1,15 +1,13 @@ -import { ApplicationRef, NgModule, Type } from '@angular/core'; +import { ApplicationRef, NgModule } from '@angular/core'; import { BehaviorSubject, Subject } from 'rxjs'; import { stringify } from 'telejson'; - import { ICollection, StoryFnAngularReturnType } from '../types'; import { PropertyExtractor } from './utils/PropertyExtractor'; import { TestBedComponentBuilder } from './utils/TestBedComponentBuilder'; -import { getWrapperComponent } from './TestBedWrapperComponent'; import { getApplication, storyPropsProvider } from '../../renderer'; import { queueBootstrapping } from './utils/BootstrapQueue'; import { bootstrapApplication } from '@angular/platform-browser'; -import { getNextStoryUID } from './utils/StoryUID'; +import { getWrapperComponent } from './TestBedWrapperComponent'; type StoryRenderInfo = { storyFnAngular: StoryFnAngularReturnType; @@ -23,7 +21,6 @@ declare global { } const applicationRefs = new Map(); -let componentBuilders: TestBedComponentBuilder[] = []; /** * Attribute name for the story UID that may be written to the targetDOMNode. * @@ -40,7 +37,6 @@ export abstract class AbstractRenderer { appRef.destroy(); } }); - componentBuilders = []; } protected previousStoryRenderInfo = new Map(); @@ -144,7 +140,7 @@ export abstract class AbstractRenderer { }); }); - applicationRefs.set(targetDOMNode, applicationRef); + this.setApplicationRef(targetDOMNode, applicationRef); } /** @@ -167,13 +163,7 @@ export abstract class AbstractRenderer { }) { const targetSelector = this.generateTargetSelectorFromStoryId(targetDOMNode.id); - // need unique attribute to get testbed instance for specific component - // to update props from story - // get instance by id - // testbedInstance.setAndUpdateProps(...) - // return; - - await this.beforeFullRender(targetDOMNode); + await this.beforeFullRender(); this.initAngularRootElement(targetDOMNode, targetSelector); @@ -212,12 +202,18 @@ export abstract class AbstractRenderer { .setSelector(componentSelector) .setStoryFn(storyFnAngular) .setMetaData(analyzedMetadata) + .setTargetNode(targetDOMNode) .setEnvironmentProviders(environmentProviders) .configure() .compileComponents(); - applicationRefs.set(targetDOMNode, componentBuilder.getApplicationRef()); - componentBuilders.push(componentBuilder); + componentBuilder.copyComponentIntoTargetNode(); + + this.setApplicationRef(targetDOMNode, componentBuilder.getApplicationRef()); + } + + public setApplicationRef(targetDOMNode: HTMLElement, applicationRef: ApplicationRef) { + applicationRefs.set(targetDOMNode, applicationRef); } /** diff --git a/code/frameworks/angular/src/client/angular-beta/RendererFactory.ts b/code/frameworks/angular/src/client/angular-beta/RendererFactory.ts index 32984b0afa55..324e664a2175 100644 --- a/code/frameworks/angular/src/client/angular-beta/RendererFactory.ts +++ b/code/frameworks/angular/src/client/angular-beta/RendererFactory.ts @@ -2,6 +2,7 @@ import { AbstractRenderer } from './AbstractRenderer'; import { CanvasRenderer } from './CanvasRenderer'; import { DocsRenderer } from './DocsRenderer'; import { TestBedRenderer } from './TestBedRenderer'; +import { TestBedDocsRenderer } from './TestBedDocsRenderer'; type RenderType = 'canvas' | 'docs'; export class RendererFactory { @@ -39,12 +40,15 @@ export class RendererFactory { } private buildRenderer(renderType: RenderType, useTestBedRenderer: boolean) { - if (renderType === 'docs') { - return new DocsRenderer(); - } if (useTestBedRenderer === true) { + if (renderType === 'docs') { + return new TestBedDocsRenderer(); + } return new TestBedRenderer(); } + if (renderType === 'docs') { + return new DocsRenderer(); + } return new CanvasRenderer(); } } @@ -54,13 +58,16 @@ export const getRenderType = (targetDOMNode: HTMLElement): RenderType => { }; export function clearRootHTMLElement(renderType: RenderType) { + let element; switch (renderType) { case 'canvas': - global.document.getElementById('storybook-docs').innerHTML = ''; + element = global.document.getElementById('storybook-docs'); + if (element !== null) element.innerHTML = ''; break; case 'docs': - global.document.getElementById('storybook-root').innerHTML = ''; + element = global.document.getElementById('storybook-root'); + if (element !== null) element.innerHTML = ''; break; default: break; diff --git a/code/frameworks/angular/src/client/angular-beta/TestBedDocsRenderer.ts b/code/frameworks/angular/src/client/angular-beta/TestBedDocsRenderer.ts new file mode 100644 index 000000000000..e37b6d8a2140 --- /dev/null +++ b/code/frameworks/angular/src/client/angular-beta/TestBedDocsRenderer.ts @@ -0,0 +1,51 @@ +import { DOCS_RENDERED, STORY_CHANGED } from 'storybook/internal/core-events'; +import { addons } from 'storybook/preview-api'; + +import { Parameters, StoryFnAngularReturnType } from '../types'; +import { AbstractRenderer, STORY_UID_ATTRIBUTE } from './AbstractRenderer'; +import { getNextStoryUID } from './utils/StoryUID'; +export class TestBedDocsRenderer extends AbstractRenderer { + public async render(options: { + storyFnAngular: StoryFnAngularReturnType; + forced: boolean; + component: any; + parameters: Parameters; + targetDOMNode: HTMLElement; + }) { + const channel = addons.getChannel(); + /** + * Destroy and recreate the PlatformBrowserDynamic of angular For several stories to be rendered + * in the same docs we should not destroy angular between each rendering but do it when the + * rendered stories are not needed anymore. + * + * Note for improvement: currently there is one event per story rendered in the doc. But one + * event could be enough for the whole docs + */ + channel.once(STORY_CHANGED, async () => { + await TestBedDocsRenderer.resetApplications(); + }); + + /** + * Destroy and recreate the PlatformBrowserDynamic of angular when doc re render. Allows to call + * ngOnDestroy of angular for previous component + */ + channel.once(DOCS_RENDERED, async () => { + await TestBedDocsRenderer.resetApplications(); + }); + + await super.renderWithTestBed({ ...options, forced: true }); + } + + async beforeFullRender(domNode?: HTMLElement): Promise { + TestBedDocsRenderer.resetApplications(domNode); + } + + protected override initAngularRootElement( + targetDOMNode: HTMLElement, + targetSelector: string + ): void { + super.initAngularRootElement(targetDOMNode, targetSelector); + + targetDOMNode.setAttribute(STORY_UID_ATTRIBUTE, getNextStoryUID(targetDOMNode.id)); + } +} diff --git a/code/frameworks/angular/src/client/angular-beta/TestBedRenderer.ts b/code/frameworks/angular/src/client/angular-beta/TestBedRenderer.ts index c1a531998c54..eaa267973011 100644 --- a/code/frameworks/angular/src/client/angular-beta/TestBedRenderer.ts +++ b/code/frameworks/angular/src/client/angular-beta/TestBedRenderer.ts @@ -9,7 +9,7 @@ export class TestBedRenderer extends AbstractRenderer { component: any; targetDOMNode: HTMLElement; }) { - await super.renderWithTestBed(options); + await this.renderWithTestBed({ ...options }); } async beforeFullRender(): Promise { diff --git a/code/frameworks/angular/src/client/angular-beta/utils/PropertyExtractor.ts b/code/frameworks/angular/src/client/angular-beta/utils/PropertyExtractor.ts index 64b43723abc2..c997d520919a 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/PropertyExtractor.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/PropertyExtractor.ts @@ -163,6 +163,12 @@ export class PropertyExtractor implements NgModuleMetadata { return [false]; }; + static getTemplate = (component: any) => { + const decorators = reflectionCapabilities.annotations(component); + console.log(decorators); + return decorators[0].template; + }; + static analyzeDecorators = (component: any) => { const decorators = reflectionCapabilities.annotations(component); diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts index ba6f17f0b585..20eed3c7f14f 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts @@ -35,6 +35,8 @@ export class TestBedComponentBuilder { private styles: string[]; + private targetNode: HTMLElement | null = null; + constructor() { this.testBedInstance = new TestBed(); this.testBedInstance.initTestEnvironment( @@ -43,11 +45,20 @@ export class TestBedComponentBuilder { ); } + getFixture() { + return this.fixture; + } + setComponent(storyComponent: Type) { this.component = storyComponent; return this; } + setTargetNode(targetNode: HTMLElement) { + this.targetNode = targetNode; + return this; + } + setStoryFn(storyFn: StoryFnAngularReturnType) { this.styles = storyFn.styles; this.schemas = storyFn.moduleMetadata?.schemas; @@ -114,6 +125,13 @@ export class TestBedComponentBuilder { return this.testBedInstance.inject(ApplicationRef); } + copyComponentIntoTargetNode() { + this.throwOnMissingFixture(); + this.throwOnMissingTargetNode(); + this.targetNode.appendChild(this.fixture.nativeElement); + this.fixture.detectChanges(); + } + private updateComponentProps() { this.throwOnMissingFixture(); if (this.props != null) @@ -133,4 +151,8 @@ export class TestBedComponentBuilder { private throwOnMissingFixture() { if (this.fixture == null) throw new Error('Fixture is null'); } + + private throwOnMissingTargetNode() { + if (this.targetNode == null) throw new Error('TargetNode is null'); + } } diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts index 6057f7b1b8b0..ec5340e363b2 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts @@ -30,7 +30,7 @@ export const GenerateModuleMetaData = ( imports: any[] ) => { return { - set: { + add: { exports: [...declarations, ...imports], declarations: declarations, imports: imports, diff --git a/code/frameworks/angular/src/client/render.ts b/code/frameworks/angular/src/client/render.ts index 73290b728d8e..37c21cb3a4c5 100644 --- a/code/frameworks/angular/src/client/render.ts +++ b/code/frameworks/angular/src/client/render.ts @@ -4,31 +4,25 @@ import '@angular/compiler'; import { RendererFactory } from './angular-beta/RendererFactory'; import { AngularRenderer } from './types'; -import { TestBedRenderer } from './angular-beta/TestBedRenderer'; export const rendererFactory = new RendererFactory(); export const render: ArgsStoryFn = (props) => ({ props }); export async function renderToCanvas( - { - storyFn, - showMain, - forceRemount, - storyContext: { component, parameters }, - }: RenderContext, + { storyFn, showMain, forceRemount, storyContext }: RenderContext, element: HTMLElement ) { showMain(); const renderer = await rendererFactory.getRendererInstance( element, - parameters.useTestBedRenderer ?? false + storyContext.parameters.useTestBedRenderer ?? false ); await renderer.render({ storyFnAngular: storyFn(), - component, + component: storyContext.component, forced: !forceRemount, targetDOMNode: element, }); From 7c4873325212b691b4f879bdfc3d43795c812efb Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Sat, 3 May 2025 12:20:09 +0200 Subject: [PATCH 18/61] refactor: render function to move duplicate code into own function --- .../client/angular-beta/AbstractRenderer.ts | 94 ++++++++----------- .../client/angular-beta/RendererFactory.ts | 2 +- 2 files changed, 41 insertions(+), 55 deletions(-) diff --git a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts index 08d366e1b7cf..dc41b062b738 100644 --- a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts +++ b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts @@ -70,8 +70,6 @@ export abstract class AbstractRenderer { component?: any; targetDOMNode: HTMLElement; }) { - const targetSelector = this.generateTargetSelectorFromStoryId(targetDOMNode.id); - const newStoryProps$ = new BehaviorSubject(storyFnAngular.props); if ( @@ -89,7 +87,9 @@ export abstract class AbstractRenderer { return; } - await this.beforeFullRender(targetDOMNode); + const { environmentProviders, componentSelector, analyzedMetadata } = + await this.prepareMetaData(storyFnAngular, targetDOMNode, component); + environmentProviders.push(storyPropsProvider(newStoryProps$)); // Complete last BehaviorSubject and set a new one for the current module if (this.storyProps$) { @@ -97,20 +97,6 @@ export abstract class AbstractRenderer { } this.storyProps$ = newStoryProps$; - this.initAngularRootElement(targetDOMNode, targetSelector); - - const analyzedMetadata = new PropertyExtractor(storyFnAngular.moduleMetadata, component); - await analyzedMetadata.init(); - - const storyUid = this.generateStoryUIdFromRawStoryUid( - targetDOMNode.getAttribute(STORY_UID_ATTRIBUTE) - ); - const componentSelector = storyUid !== null ? `${targetSelector}[${storyUid}]` : targetSelector; - if (storyUid !== null) { - const element = targetDOMNode.querySelector(targetSelector); - element.toggleAttribute(storyUid, true); - } - const application = getApplication({ storyFnAngular, component, @@ -118,25 +104,10 @@ export abstract class AbstractRenderer { analyzedMetadata, }); - const providers = [ - storyPropsProvider(newStoryProps$), - ...analyzedMetadata.applicationProviders, - ...(storyFnAngular.applicationConfig?.providers ?? []), - ]; - - if (STORYBOOK_ANGULAR_OPTIONS?.experimentalZoneless) { - const { provideExperimentalZonelessChangeDetection } = await import('@angular/core'); - if (!provideExperimentalZonelessChangeDetection) { - throw new Error('Experimental zoneless change detection requires Angular 18 or higher'); - } else { - providers.unshift(provideExperimentalZonelessChangeDetection()); - } - } - const applicationRef = await queueBootstrapping(() => { return bootstrapApplication(application, { ...storyFnAngular.applicationConfig, - providers, + providers: environmentProviders, }); }); @@ -161,6 +132,37 @@ export abstract class AbstractRenderer { component?: any; targetDOMNode: HTMLElement; }) { + const { environmentProviders, componentSelector, analyzedMetadata } = + await this.prepareMetaData(storyFnAngular, targetDOMNode, component); + + if (storyFnAngular.userDefinedTemplate) { + component = getWrapperComponent(storyFnAngular.template); + } + + const componentBuilder = await new TestBedComponentBuilder() + .setComponent(component) + .setSelector(componentSelector) + .setStoryFn(storyFnAngular) + .setMetaData(analyzedMetadata) + .setTargetNode(targetDOMNode) + .setEnvironmentProviders(environmentProviders) + .configure() + .compileComponents(); + + componentBuilder.copyComponentIntoTargetNode(); + + this.setApplicationRef(targetDOMNode, componentBuilder.getApplicationRef()); + } + + public setApplicationRef(targetDOMNode: HTMLElement, applicationRef: ApplicationRef) { + applicationRefs.set(targetDOMNode, applicationRef); + } + + private async prepareMetaData( + storyFnAngular: StoryFnAngularReturnType, + targetDOMNode: HTMLElement, + component?: any + ) { const targetSelector = this.generateTargetSelectorFromStoryId(targetDOMNode.id); await this.beforeFullRender(); @@ -193,27 +195,11 @@ export abstract class AbstractRenderer { } } - if (storyFnAngular.userDefinedTemplate) { - component = getWrapperComponent(storyFnAngular.template); - } - - const componentBuilder = await new TestBedComponentBuilder() - .setComponent(component) - .setSelector(componentSelector) - .setStoryFn(storyFnAngular) - .setMetaData(analyzedMetadata) - .setTargetNode(targetDOMNode) - .setEnvironmentProviders(environmentProviders) - .configure() - .compileComponents(); - - componentBuilder.copyComponentIntoTargetNode(); - - this.setApplicationRef(targetDOMNode, componentBuilder.getApplicationRef()); - } - - public setApplicationRef(targetDOMNode: HTMLElement, applicationRef: ApplicationRef) { - applicationRefs.set(targetDOMNode, applicationRef); + return { + environmentProviders, + componentSelector, + analyzedMetadata, + }; } /** diff --git a/code/frameworks/angular/src/client/angular-beta/RendererFactory.ts b/code/frameworks/angular/src/client/angular-beta/RendererFactory.ts index 324e664a2175..6b1b4602fd28 100644 --- a/code/frameworks/angular/src/client/angular-beta/RendererFactory.ts +++ b/code/frameworks/angular/src/client/angular-beta/RendererFactory.ts @@ -40,7 +40,7 @@ export class RendererFactory { } private buildRenderer(renderType: RenderType, useTestBedRenderer: boolean) { - if (useTestBedRenderer === true) { + if (useTestBedRenderer == true) { if (renderType === 'docs') { return new TestBedDocsRenderer(); } From df05233b7701f5984c7baad8308374bea3c1467f Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Sat, 3 May 2025 12:30:00 +0200 Subject: [PATCH 19/61] fix: RendererFactory.test.ts due new parameter --- .../angular-beta/RendererFactory.test.ts | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/code/frameworks/angular/src/client/angular-beta/RendererFactory.test.ts b/code/frameworks/angular/src/client/angular-beta/RendererFactory.test.ts index f5550730b3e4..8a66c30f48a1 100644 --- a/code/frameworks/angular/src/client/angular-beta/RendererFactory.test.ts +++ b/code/frameworks/angular/src/client/angular-beta/RendererFactory.test.ts @@ -40,12 +40,12 @@ describe('RendererFactory', () => { describe('CanvasRenderer', () => { it('should get CanvasRenderer instance', async () => { - const render = await rendererFactory.getRendererInstance(rootTargetDOMNode); + const render = await rendererFactory.getRendererInstance(rootTargetDOMNode, false); expect(render).toBeInstanceOf(CanvasRenderer); }); it('should render my-story for story template', async () => { - const render = await rendererFactory.getRendererInstance(rootTargetDOMNode); + const render = await rendererFactory.getRendererInstance(rootTargetDOMNode, false); await render?.render({ storyFnAngular: { template: '🦊', @@ -62,7 +62,7 @@ describe('RendererFactory', () => { @Component({ selector: 'foo', template: '🦊' }) class FooComponent {} - const render = await rendererFactory.getRendererInstance(rootTargetDOMNode); + const render = await rendererFactory.getRendererInstance(rootTargetDOMNode, false); await render?.render({ storyFnAngular: { props: {}, @@ -87,7 +87,7 @@ describe('RendererFactory', () => { } const token = new Thing(); - const render = await rendererFactory.getRendererInstance(rootTargetDOMNode); + const render = await rendererFactory.getRendererInstance(rootTargetDOMNode, false); await render?.render({ storyFnAngular: { @@ -105,7 +105,7 @@ describe('RendererFactory', () => { describe('when forced=true', () => { beforeEach(async () => { // Init first render - const render = await rendererFactory.getRendererInstance(rootTargetDOMNode); + const render = await rendererFactory.getRendererInstance(rootTargetDOMNode, false); await render?.render({ storyFnAngular: { template: '{{ logo }}: {{ name }}', @@ -125,7 +125,7 @@ describe('RendererFactory', () => { it('should not be re-rendered when only props change', async () => { // only props change - const render = await rendererFactory.getRendererInstance(rootTargetDOMNode); + const render = await rendererFactory.getRendererInstance(rootTargetDOMNode, false); await render?.render({ storyFnAngular: { props: { @@ -140,7 +140,7 @@ describe('RendererFactory', () => { }); it('should be re-rendered when template change', async () => { - const render = await rendererFactory.getRendererInstance(rootTargetDOMNode); + const render = await rendererFactory.getRendererInstance(rootTargetDOMNode, false); await render?.render({ storyFnAngular: { template: '{{ beer }}', @@ -161,7 +161,7 @@ describe('RendererFactory', () => { describe('when canvas render is done before', () => { beforeEach(async () => { // Init first Canvas render - const render = await rendererFactory.getRendererInstance(rootTargetDOMNode); + const render = await rendererFactory.getRendererInstance(rootTargetDOMNode, false); await render?.render({ storyFnAngular: { template: 'Canvas 🖼', @@ -177,13 +177,13 @@ describe('RendererFactory', () => { .appendChild(global.document.createElement('👾')); expect(global.document.getElementById('storybook-root').innerHTML).toContain('Canvas 🖼'); - await rendererFactory.getRendererInstance(rootDocstargetDOMNode); + await rendererFactory.getRendererInstance(rootDocstargetDOMNode, false); expect(global.document.getElementById('storybook-root').innerHTML).toBe(''); }); }); it('should get DocsRenderer instance', async () => { - const render = await rendererFactory.getRendererInstance(rootDocstargetDOMNode); + const render = await rendererFactory.getRendererInstance(rootDocstargetDOMNode, false); expect(render).toBeInstanceOf(DocsRenderer); }); @@ -193,7 +193,8 @@ describe('RendererFactory', () => { class FooComponent {} const render = await rendererFactory.getRendererInstance( - global.document.getElementById('storybook-docs') + global.document.getElementById('storybook-docs'), + false ); const targetDOMNode1 = global.document.createElement('div'); @@ -235,7 +236,8 @@ describe('RendererFactory', () => { class FooComponent {} const render = await rendererFactory.getRendererInstance( - global.document.getElementById('storybook-docs') + global.document.getElementById('storybook-docs'), + false ); const targetDOMNode1 = global.document.createElement('div'); From 392224039e0004dec6dfb55f68711a0705079e8c Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Fri, 9 May 2025 12:06:47 +0200 Subject: [PATCH 20/61] Update code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- .../angular-beta/utils/TestBedOverrideMetaDataGenerator.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts index ec5340e363b2..c583347c0dd3 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts @@ -17,7 +17,7 @@ export const GenerateComponentMetaData = ( }, } as MetadataOverride; - if (schemas != null && schemas.length != 0) { + if (schemas !== null && schemas.length !== 0) { overrideMetadata.add.schemas = schemas; } From c06bce6cd079c51b417666baf096a9e1767a4469 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Fri, 9 May 2025 14:50:58 +0200 Subject: [PATCH 21/61] Introduce experimental_afterEach wrapper for testing purposes --- code/frameworks/angular/src/client/config.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/frameworks/angular/src/client/config.ts b/code/frameworks/angular/src/client/config.ts index 9ae855751d07..5e28b7e4801c 100644 --- a/code/frameworks/angular/src/client/config.ts +++ b/code/frameworks/angular/src/client/config.ts @@ -4,3 +4,7 @@ export { render, renderToCanvas } from './render'; export { decorateStory as applyDecorators } from './decorateStory'; export const parameters = { renderer: 'angular' as const }; + +export const experimental_afterEach = () => { + console.log('afterEach'); +}; From 1c67e3a69198758816715b3ed6cbec841a36d7c9 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Fri, 9 May 2025 14:54:33 +0200 Subject: [PATCH 22/61] Use beforeEach hook instead of afterEach --- code/frameworks/angular/src/client/config.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/frameworks/angular/src/client/config.ts b/code/frameworks/angular/src/client/config.ts index 5e28b7e4801c..c827fa7ec8a9 100644 --- a/code/frameworks/angular/src/client/config.ts +++ b/code/frameworks/angular/src/client/config.ts @@ -5,6 +5,8 @@ export { decorateStory as applyDecorators } from './decorateStory'; export const parameters = { renderer: 'angular' as const }; -export const experimental_afterEach = () => { - console.log('afterEach'); +export const beforeEach = () => { + return () => { + console.log('Will run when switching/reloading stories'); + }; }; From 529255a6bed5d2b2af7b09a7c66b48190bd0da56 Mon Sep 17 00:00:00 2001 From: Chrisy455 Date: Mon, 12 May 2025 19:06:13 +0200 Subject: [PATCH 23/61] feat: add new testcases for error with testbed rendering --- .../not-standalone-component.ts | 24 ++++++++++++++ .../core/provider/provide-router.stories.ts | 33 +++++++++++++++++++ ...providers-for-not-standalone-components.ts | 19 +++++++++++ .../router-component/router-component.ts | 18 ++++++++++ .../sanatizer/dom-sanitizer-test.stories.ts | 14 ++++++++ .../sanitizer-test-component.ts | 31 +++++++++++++++++ 6 files changed, 139 insertions(+) create mode 100644 code/frameworks/angular/template/stories/core/provider/not-standalone-component/not-standalone-component.ts create mode 100644 code/frameworks/angular/template/stories/core/provider/provide-router.stories.ts create mode 100644 code/frameworks/angular/template/stories/core/provider/providers-for-not-standalone-components.ts create mode 100644 code/frameworks/angular/template/stories/core/provider/router-component/router-component.ts create mode 100644 code/frameworks/angular/template/stories/core/sanatizer/dom-sanitizer-test.stories.ts create mode 100644 code/frameworks/angular/template/stories/core/sanatizer/test-component/sanitizer-test-component.ts diff --git a/code/frameworks/angular/template/stories/core/provider/not-standalone-component/not-standalone-component.ts b/code/frameworks/angular/template/stories/core/provider/not-standalone-component/not-standalone-component.ts new file mode 100644 index 000000000000..0ef8bb0eb232 --- /dev/null +++ b/code/frameworks/angular/template/stories/core/provider/not-standalone-component/not-standalone-component.ts @@ -0,0 +1,24 @@ +import { Component, Injectable, NgModule } from '@angular/core'; + +@Injectable() +export class ApiService { + data: string = 'If you see this theres no injection error'; +} + +@NgModule({ + providers: [ApiService], +}) +export class ApiModule {} + +@Component({ + template: `{{ testForProvider }}`, + selector: 'not-standalone-component', +}) +export default class NotStandaloneComponent { + + testForProvider = ""; + + constructor(private service: ApiService) { + this.testForProvider = service.data; + } +} diff --git a/code/frameworks/angular/template/stories/core/provider/provide-router.stories.ts b/code/frameworks/angular/template/stories/core/provider/provide-router.stories.ts new file mode 100644 index 000000000000..a879d865558f --- /dev/null +++ b/code/frameworks/angular/template/stories/core/provider/provide-router.stories.ts @@ -0,0 +1,33 @@ + +import { Meta, StoryObj, applicationConfig, moduleMetadata } from "@storybook/angular"; +import { RouterModule } from "@angular/router"; +import { Component, importProvidersFrom } from "@angular/core"; +import ProvideRouterComponent from "./router-component/router-component"; + +@Component({ + template: "", +}) +class EmptyComponent {} + +const meta: Meta = { + component: ProvideRouterComponent, + tags: ['autodocs'], + decorators: [ + moduleMetadata({ + imports: [RouterModule], + }), + applicationConfig({ + providers: [ + importProvidersFrom( + RouterModule.forRoot([{ path: "**", component: EmptyComponent }], { useHash: true }), + ), + ], + }), + ], +}; + +export default meta; + +type Story = StoryObj; + +export const ProvideRouterWithoutArgs: Story = {}; \ No newline at end of file diff --git a/code/frameworks/angular/template/stories/core/provider/providers-for-not-standalone-components.ts b/code/frameworks/angular/template/stories/core/provider/providers-for-not-standalone-components.ts new file mode 100644 index 000000000000..e4d91cffe7e3 --- /dev/null +++ b/code/frameworks/angular/template/stories/core/provider/providers-for-not-standalone-components.ts @@ -0,0 +1,19 @@ +import { Meta, StoryObj, moduleMetadata } from '@storybook/angular'; +import NotStandaloneComponent, { ApiModule } from "./not-standalone-component/not-standalone-component"; + + +const meta: Meta = { + component: NotStandaloneComponent, + tags: ['autodocs'], + decorators: [ + moduleMetadata({ + imports: [ApiModule], + }), + ], +}; + +export default meta; + +type Story = StoryObj; + +export const ProviderOnNotStandaloneWithoutArgs: Story = {}; diff --git a/code/frameworks/angular/template/stories/core/provider/router-component/router-component.ts b/code/frameworks/angular/template/stories/core/provider/router-component/router-component.ts new file mode 100644 index 000000000000..27aca70f895b --- /dev/null +++ b/code/frameworks/angular/template/stories/core/provider/router-component/router-component.ts @@ -0,0 +1,18 @@ +import { Component, Injectable } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { RouterModule } from "@angular/router"; + +@Injectable() +export class ApiService { + data: string = 'original Api Service'; +} + +@Component({ + standalone: true, + imports: [CommonModule, RouterModule], + // Needs to be a different name to the CLI template button + template: `Router works`, + selector: 'router-provider-button', +}) +export default class ProvideRouterComponent { +} diff --git a/code/frameworks/angular/template/stories/core/sanatizer/dom-sanitizer-test.stories.ts b/code/frameworks/angular/template/stories/core/sanatizer/dom-sanitizer-test.stories.ts new file mode 100644 index 000000000000..2a3e06c3a7ca --- /dev/null +++ b/code/frameworks/angular/template/stories/core/sanatizer/dom-sanitizer-test.stories.ts @@ -0,0 +1,14 @@ +import { Meta, StoryObj } from '@storybook/angular'; +import SanitizerTestComponent from "./test-component/sanitizer-test-component"; + + +const meta: Meta = { + component: SanitizerTestComponent, + tags: ['autodocs'], +}; + +export default meta; + +type Story = StoryObj; + +export const TestSanitizerWithoutArgs: Story = {}; diff --git a/code/frameworks/angular/template/stories/core/sanatizer/test-component/sanitizer-test-component.ts b/code/frameworks/angular/template/stories/core/sanatizer/test-component/sanitizer-test-component.ts new file mode 100644 index 000000000000..279f2b0ba96d --- /dev/null +++ b/code/frameworks/angular/template/stories/core/sanatizer/test-component/sanitizer-test-component.ts @@ -0,0 +1,31 @@ +import { Component, Injectable, OnChanges } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { DomSanitizer, SafeResourceUrl } from "@angular/platform-browser"; + +@Injectable() +export class ApiService { + data: string = 'original Api Service'; +} + +@Component({ + standalone: true, + imports: [CommonModule], + // Needs to be a different name to the CLI template button + template: `@if (src) { + + }`, + selector: 'app-provider-button', + providers: [ApiService], +}) +export default class SanitizerTestComponent implements OnChanges { + src: SafeResourceUrl; + svgAsBase64 = "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IS0tIFVwbG9hZGVkIHRvOiBTVkcgUmVwbywgd3d3LnN2Z3JlcG8uY29tLCBHZW5lcmF0b3I6IFNWRyBSZXBvIE1peGVyIFRvb2xzIC0tPgo8c3ZnIHdpZHRoPSI4MDBweCIgaGVpZ2h0PSI4MDBweCIgdmlld0JveD0iMCAwIDQwMCA0MDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+DQo8cGF0aCBkPSJNMTg2LjYxNCA3Mi40NzMxQzIyNC4zNzkgNDguNzQ3OSAyNDkuMTI1IDk1Ljg4NzcgMjE3LjU3MyAxMjIuODcyQzIxMS4yMTYgMTI4LjMwNyAyMDMuOTUgMTMxIDE5NS41NzUgMTMxQzE2Ni42NjMgMTMxIDE3NC44MjIgOTguMDE4MSAxODAuOTExIDc5Ljc4ODYiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuOSIgc3Ryb2tlLXdpZHRoPSIxNiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+DQo8cGF0aCBkPSJNMTU5LjU5OSAxMzUuMzA2QzE1OS41OTkgMTY1LjgxNCAxNjYuMTYxIDE5Mi42NzYgMTY3LjI0NSAyMjAuMTk3QzE2OC41OTQgMjU0LjQzOSAxNjYuOTQ4IDI5NC42MjYgMTU5LjU5NCAzNjcuNDI5IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjkiIHN0cm9rZS13aWR0aD0iMTYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPg0KPHBhdGggZD0iTTIzMy44MTcgMTQwLjk0OEMyMzYuNTI2IDE2Ny4xNDEgMjI5Ljg5NCAxODQuMzg0IDIyOC40ODUgMTk2LjA1QzIzMi4yOTQgMzMyLjc5OCAyMzcuMzcyIDM1MS43MjkgMjM3LjM3MiAzNzEuMTM0IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjkiIHN0cm9rZS13aWR0aD0iMTYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPg0KPHBhdGggZD0iTTIzMy44MzMgMTQwLjk0NkMyNTQuMTggMTI5Ljg2MyAyODcuODY2IDEyMC4xMTYgMjgzLjYwMyA5MC4yODc4QzI4My4wOTMgODYuNzE5OCAyODQuNDY1IDg0Ljk1NTcgMjgwLjA0OCA4NC45NTU3IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjkiIHN0cm9rZS13aWR0aD0iMTYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPg0KPHBhdGggZD0iTTE1Ny4yNTIgMTM2LjU3OEMxMjYuMDIzIDEzOS41MjMgMTA3LjQ4OCAxMDEuNDc5IDExNi45OTMgNzIuOTYzNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utb3BhY2l0eT0iMC45IiBzdHJva2Utd2lkdGg9IjE2IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4NCjxwYXRoIGQ9Ik0xMTkuODMgNjEuMzkyOUMxMDcuNDcxIDQzLjQ5OTUgMTQxLjE0NiAxNC42MzkzIDE1My42NjIgMzQuNjYyOUMxNTkuMTk2IDQzLjUxNTQgMTQ1LjUzNiA2OS43OTk3IDEzNS43MDIgNjMuODk5OCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utb3BhY2l0eT0iMC45IiBzdHJva2Utd2lkdGg9IjE2IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4NCjxwYXRoIGQ9Ik0yODQuMTY1IDcyLjQ5OUMyODQuOTkgNjcuODg4NCAyODUgNjMuMDMzNyAyODUgNTguMjk4NEMyODUgMTMuNDY1NCAyMjYuMTYgNDUuNzMxOSAyNTEuNTg1IDU2LjYyOThDMjU2LjY2IDU4LjgwMjQgMjU4LjE1MSA2Mi4yMTY2IDI2NC4xMTcgNjEuMjI0NSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utb3BhY2l0eT0iMC45IiBzdHJva2Utd2lkdGg9IjE2IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4NCjxwYXRoIGQ9Ik0xNzUuMTM3IDIyMy44NjZDMTkyLjMwOSAyMjMuNjQzIDIxMC4xMzYgMjE5LjYyNyAyMjcuMzQ4IDIyMS43NzUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuOSIgc3Ryb2tlLXdpZHRoPSIxNiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+DQo8cGF0aCBkPSJNMTcwLjIwNyAyNjcuODMyQzE4OS4zODkgMjY4LjkzMyAyMTEuMjU3IDI2My45OTkgMjI5LjkzMyAyNjguNjY4IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjkiIHN0cm9rZS13aWR0aD0iMTYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPg0KPHBhdGggZD0iTTE5OS4zODcgMjM0Ljc4N0MxOTkuMzg3IDIzMS4yMjYgMTk5LjM4NyAyMzAuMzcxIDE5OS4zODcgMjI2LjgyOCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utb3BhY2l0eT0iMC45IiBzdHJva2Utd2lkdGg9IjE2IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4NCjxwYXRoIGQ9Ik0xNDguOTgzIDM3MC4wODFDMTUxLjQxMyAzNjguOTAyIDE1NC4xNTggMzY4LjUwMSAxNTYuOTQyIDM2Ny40MjgiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuOSIgc3Ryb2tlLXdpZHRoPSIxNiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+DQo8cGF0aCBkPSJNMjM5LjE3OSAzNzEuMDQ3QzI0Mi45OTkgMzcwLjE3NyAyNDYuMzk3IDM3MS4xNzcgMjUwLjA1MyAzNzEuMTc3IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjkiIHN0cm9rZS13aWR0aD0iMTYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPg0KPC9zdmc+"; + + constructor(public sanitizer: DomSanitizer) { } + + ngOnChanges() { + this.src = this.sanitizer.bypassSecurityTrustResourceUrl( + "data:image/svg+xml;base64," + this.svgAsBase64, + ); + } +} From f4c72093c8019b23d54747cd3a5ecac60edb7395 Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Mon, 12 May 2025 20:59:01 +0200 Subject: [PATCH 24/61] refactor: testbed renderer error tests --- .../utils/TestBedOverrideMetaDataGenerator.ts | 3 ++- .../core/provider/provide-router.stories.ts | 18 ++++++++------- ...-for-not-standalone-components.stories.ts} | 8 +++++-- .../sanatizer/dom-sanitizer-test.stories.ts | 6 +++-- .../sanitizer-test-component.ts | 23 ++++++++----------- 5 files changed, 32 insertions(+), 26 deletions(-) rename code/frameworks/angular/template/stories/core/provider/{providers-for-not-standalone-components.ts => providers-for-not-standalone-components.stories.ts} (70%) diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts index c583347c0dd3..d74f6dfa57f8 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts @@ -1,5 +1,6 @@ import { Component, NgModule, Type } from '@angular/core'; import { MetadataOverride } from '@angular/core/testing'; +import { Router } from '@angular/router'; export const GenerateComponentMetaData = ( selector: string, @@ -17,7 +18,7 @@ export const GenerateComponentMetaData = ( }, } as MetadataOverride; - if (schemas !== null && schemas.length !== 0) { + if (schemas !== null && schemas !== undefined && schemas.length !== 0) { overrideMetadata.add.schemas = schemas; } diff --git a/code/frameworks/angular/template/stories/core/provider/provide-router.stories.ts b/code/frameworks/angular/template/stories/core/provider/provide-router.stories.ts index a879d865558f..f5f1df575173 100644 --- a/code/frameworks/angular/template/stories/core/provider/provide-router.stories.ts +++ b/code/frameworks/angular/template/stories/core/provider/provide-router.stories.ts @@ -1,11 +1,10 @@ - -import { Meta, StoryObj, applicationConfig, moduleMetadata } from "@storybook/angular"; -import { RouterModule } from "@angular/router"; -import { Component, importProvidersFrom } from "@angular/core"; -import ProvideRouterComponent from "./router-component/router-component"; +import { Meta, StoryObj, applicationConfig, moduleMetadata } from '@storybook/angular'; +import { RouterModule } from '@angular/router'; +import { Component, importProvidersFrom } from '@angular/core'; +import ProvideRouterComponent from './router-component/router-component'; @Component({ - template: "", + template: '', }) class EmptyComponent {} @@ -19,15 +18,18 @@ const meta: Meta = { applicationConfig({ providers: [ importProvidersFrom( - RouterModule.forRoot([{ path: "**", component: EmptyComponent }], { useHash: true }), + RouterModule.forRoot([{ path: '**', component: EmptyComponent }], { useHash: true }) ), ], }), ], + parameters: { + useTestBedRenderer: true, + }, }; export default meta; type Story = StoryObj; -export const ProvideRouterWithoutArgs: Story = {}; \ No newline at end of file +export const ProvideRouterWithoutArgs: Story = {}; diff --git a/code/frameworks/angular/template/stories/core/provider/providers-for-not-standalone-components.ts b/code/frameworks/angular/template/stories/core/provider/providers-for-not-standalone-components.stories.ts similarity index 70% rename from code/frameworks/angular/template/stories/core/provider/providers-for-not-standalone-components.ts rename to code/frameworks/angular/template/stories/core/provider/providers-for-not-standalone-components.stories.ts index e4d91cffe7e3..80c3d5914eaa 100644 --- a/code/frameworks/angular/template/stories/core/provider/providers-for-not-standalone-components.ts +++ b/code/frameworks/angular/template/stories/core/provider/providers-for-not-standalone-components.stories.ts @@ -1,6 +1,7 @@ import { Meta, StoryObj, moduleMetadata } from '@storybook/angular'; -import NotStandaloneComponent, { ApiModule } from "./not-standalone-component/not-standalone-component"; - +import NotStandaloneComponent, { + ApiModule, +} from './not-standalone-component/not-standalone-component'; const meta: Meta = { component: NotStandaloneComponent, @@ -10,6 +11,9 @@ const meta: Meta = { imports: [ApiModule], }), ], + parameters: { + useTestBedRenderer: true, + }, }; export default meta; diff --git a/code/frameworks/angular/template/stories/core/sanatizer/dom-sanitizer-test.stories.ts b/code/frameworks/angular/template/stories/core/sanatizer/dom-sanitizer-test.stories.ts index 2a3e06c3a7ca..b1ea67dc8fea 100644 --- a/code/frameworks/angular/template/stories/core/sanatizer/dom-sanitizer-test.stories.ts +++ b/code/frameworks/angular/template/stories/core/sanatizer/dom-sanitizer-test.stories.ts @@ -1,10 +1,12 @@ import { Meta, StoryObj } from '@storybook/angular'; -import SanitizerTestComponent from "./test-component/sanitizer-test-component"; - +import SanitizerTestComponent from './test-component/sanitizer-test-component'; const meta: Meta = { component: SanitizerTestComponent, tags: ['autodocs'], + parameters: { + useTestBedRenderer: true, + }, }; export default meta; diff --git a/code/frameworks/angular/template/stories/core/sanatizer/test-component/sanitizer-test-component.ts b/code/frameworks/angular/template/stories/core/sanatizer/test-component/sanitizer-test-component.ts index 279f2b0ba96d..b616b00fc6fa 100644 --- a/code/frameworks/angular/template/stories/core/sanatizer/test-component/sanitizer-test-component.ts +++ b/code/frameworks/angular/template/stories/core/sanatizer/test-component/sanitizer-test-component.ts @@ -1,6 +1,6 @@ import { Component, Injectable, OnChanges } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { DomSanitizer, SafeResourceUrl } from "@angular/platform-browser"; +import { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser'; @Injectable() export class ApiService { @@ -9,23 +9,20 @@ export class ApiService { @Component({ standalone: true, - imports: [CommonModule], // Needs to be a different name to the CLI template button template: `@if (src) { - - }`, - selector: 'app-provider-button', - providers: [ApiService], + +}`, + selector: 'sanitizer-component', }) export default class SanitizerTestComponent implements OnChanges { - src: SafeResourceUrl; - svgAsBase64 = "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IS0tIFVwbG9hZGVkIHRvOiBTVkcgUmVwbywgd3d3LnN2Z3JlcG8uY29tLCBHZW5lcmF0b3I6IFNWRyBSZXBvIE1peGVyIFRvb2xzIC0tPgo8c3ZnIHdpZHRoPSI4MDBweCIgaGVpZ2h0PSI4MDBweCIgdmlld0JveD0iMCAwIDQwMCA0MDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+DQo8cGF0aCBkPSJNMTg2LjYxNCA3Mi40NzMxQzIyNC4zNzkgNDguNzQ3OSAyNDkuMTI1IDk1Ljg4NzcgMjE3LjU3MyAxMjIuODcyQzIxMS4yMTYgMTI4LjMwNyAyMDMuOTUgMTMxIDE5NS41NzUgMTMxQzE2Ni42NjMgMTMxIDE3NC44MjIgOTguMDE4MSAxODAuOTExIDc5Ljc4ODYiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuOSIgc3Ryb2tlLXdpZHRoPSIxNiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+DQo8cGF0aCBkPSJNMTU5LjU5OSAxMzUuMzA2QzE1OS41OTkgMTY1LjgxNCAxNjYuMTYxIDE5Mi42NzYgMTY3LjI0NSAyMjAuMTk3QzE2OC41OTQgMjU0LjQzOSAxNjYuOTQ4IDI5NC42MjYgMTU5LjU5NCAzNjcuNDI5IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjkiIHN0cm9rZS13aWR0aD0iMTYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPg0KPHBhdGggZD0iTTIzMy44MTcgMTQwLjk0OEMyMzYuNTI2IDE2Ny4xNDEgMjI5Ljg5NCAxODQuMzg0IDIyOC40ODUgMTk2LjA1QzIzMi4yOTQgMzMyLjc5OCAyMzcuMzcyIDM1MS43MjkgMjM3LjM3MiAzNzEuMTM0IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjkiIHN0cm9rZS13aWR0aD0iMTYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPg0KPHBhdGggZD0iTTIzMy44MzMgMTQwLjk0NkMyNTQuMTggMTI5Ljg2MyAyODcuODY2IDEyMC4xMTYgMjgzLjYwMyA5MC4yODc4QzI4My4wOTMgODYuNzE5OCAyODQuNDY1IDg0Ljk1NTcgMjgwLjA0OCA4NC45NTU3IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjkiIHN0cm9rZS13aWR0aD0iMTYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPg0KPHBhdGggZD0iTTE1Ny4yNTIgMTM2LjU3OEMxMjYuMDIzIDEzOS41MjMgMTA3LjQ4OCAxMDEuNDc5IDExNi45OTMgNzIuOTYzNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utb3BhY2l0eT0iMC45IiBzdHJva2Utd2lkdGg9IjE2IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4NCjxwYXRoIGQ9Ik0xMTkuODMgNjEuMzkyOUMxMDcuNDcxIDQzLjQ5OTUgMTQxLjE0NiAxNC42MzkzIDE1My42NjIgMzQuNjYyOUMxNTkuMTk2IDQzLjUxNTQgMTQ1LjUzNiA2OS43OTk3IDEzNS43MDIgNjMuODk5OCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utb3BhY2l0eT0iMC45IiBzdHJva2Utd2lkdGg9IjE2IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4NCjxwYXRoIGQ9Ik0yODQuMTY1IDcyLjQ5OUMyODQuOTkgNjcuODg4NCAyODUgNjMuMDMzNyAyODUgNTguMjk4NEMyODUgMTMuNDY1NCAyMjYuMTYgNDUuNzMxOSAyNTEuNTg1IDU2LjYyOThDMjU2LjY2IDU4LjgwMjQgMjU4LjE1MSA2Mi4yMTY2IDI2NC4xMTcgNjEuMjI0NSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utb3BhY2l0eT0iMC45IiBzdHJva2Utd2lkdGg9IjE2IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4NCjxwYXRoIGQ9Ik0xNzUuMTM3IDIyMy44NjZDMTkyLjMwOSAyMjMuNjQzIDIxMC4xMzYgMjE5LjYyNyAyMjcuMzQ4IDIyMS43NzUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuOSIgc3Ryb2tlLXdpZHRoPSIxNiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+DQo8cGF0aCBkPSJNMTcwLjIwNyAyNjcuODMyQzE4OS4zODkgMjY4LjkzMyAyMTEuMjU3IDI2My45OTkgMjI5LjkzMyAyNjguNjY4IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjkiIHN0cm9rZS13aWR0aD0iMTYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPg0KPHBhdGggZD0iTTE5OS4zODcgMjM0Ljc4N0MxOTkuMzg3IDIzMS4yMjYgMTk5LjM4NyAyMzAuMzcxIDE5OS4zODcgMjI2LjgyOCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utb3BhY2l0eT0iMC45IiBzdHJva2Utd2lkdGg9IjE2IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4NCjxwYXRoIGQ9Ik0xNDguOTgzIDM3MC4wODFDMTUxLjQxMyAzNjguOTAyIDE1NC4xNTggMzY4LjUwMSAxNTYuOTQyIDM2Ny40MjgiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuOSIgc3Ryb2tlLXdpZHRoPSIxNiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+DQo8cGF0aCBkPSJNMjM5LjE3OSAzNzEuMDQ3QzI0Mi45OTkgMzcwLjE3NyAyNDYuMzk3IDM3MS4xNzcgMjUwLjA1MyAzNzEuMTc3IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjkiIHN0cm9rZS13aWR0aD0iMTYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPg0KPC9zdmc+"; - - constructor(public sanitizer: DomSanitizer) { } + src: SafeResourceUrl | null = null; + svgAsBase64 = + 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IS0tIFVwbG9hZGVkIHRvOiBTVkcgUmVwbywgd3d3LnN2Z3JlcG8uY29tLCBHZW5lcmF0b3I6IFNWRyBSZXBvIE1peGVyIFRvb2xzIC0tPgo8c3ZnIHdpZHRoPSI4MDBweCIgaGVpZ2h0PSI4MDBweCIgdmlld0JveD0iMCAwIDQwMCA0MDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+DQo8cGF0aCBkPSJNMTg2LjYxNCA3Mi40NzMxQzIyNC4zNzkgNDguNzQ3OSAyNDkuMTI1IDk1Ljg4NzcgMjE3LjU3MyAxMjIuODcyQzIxMS4yMTYgMTI4LjMwNyAyMDMuOTUgMTMxIDE5NS41NzUgMTMxQzE2Ni42NjMgMTMxIDE3NC44MjIgOTguMDE4MSAxODAuOTExIDc5Ljc4ODYiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuOSIgc3Ryb2tlLXdpZHRoPSIxNiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+DQo8cGF0aCBkPSJNMTU5LjU5OSAxMzUuMzA2QzE1OS41OTkgMTY1LjgxNCAxNjYuMTYxIDE5Mi42NzYgMTY3LjI0NSAyMjAuMTk3QzE2OC41OTQgMjU0LjQzOSAxNjYuOTQ4IDI5NC42MjYgMTU5LjU5NCAzNjcuNDI5IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjkiIHN0cm9rZS13aWR0aD0iMTYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPg0KPHBhdGggZD0iTTIzMy44MTcgMTQwLjk0OEMyMzYuNTI2IDE2Ny4xNDEgMjI5Ljg5NCAxODQuMzg0IDIyOC40ODUgMTk2LjA1QzIzMi4yOTQgMzMyLjc5OCAyMzcuMzcyIDM1MS43MjkgMjM3LjM3MiAzNzEuMTM0IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjkiIHN0cm9rZS13aWR0aD0iMTYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPg0KPHBhdGggZD0iTTIzMy44MzMgMTQwLjk0NkMyNTQuMTggMTI5Ljg2MyAyODcuODY2IDEyMC4xMTYgMjgzLjYwMyA5MC4yODc4QzI4My4wOTMgODYuNzE5OCAyODQuNDY1IDg0Ljk1NTcgMjgwLjA0OCA4NC45NTU3IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjkiIHN0cm9rZS13aWR0aD0iMTYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPg0KPHBhdGggZD0iTTE1Ny4yNTIgMTM2LjU3OEMxMjYuMDIzIDEzOS41MjMgMTA3LjQ4OCAxMDEuNDc5IDExNi45OTMgNzIuOTYzNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utb3BhY2l0eT0iMC45IiBzdHJva2Utd2lkdGg9IjE2IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4NCjxwYXRoIGQ9Ik0xMTkuODMgNjEuMzkyOUMxMDcuNDcxIDQzLjQ5OTUgMTQxLjE0NiAxNC42MzkzIDE1My42NjIgMzQuNjYyOUMxNTkuMTk2IDQzLjUxNTQgMTQ1LjUzNiA2OS43OTk3IDEzNS43MDIgNjMuODk5OCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utb3BhY2l0eT0iMC45IiBzdHJva2Utd2lkdGg9IjE2IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4NCjxwYXRoIGQ9Ik0yODQuMTY1IDcyLjQ5OUMyODQuOTkgNjcuODg4NCAyODUgNjMuMDMzNyAyODUgNTguMjk4NEMyODUgMTMuNDY1NCAyMjYuMTYgNDUuNzMxOSAyNTEuNTg1IDU2LjYyOThDMjU2LjY2IDU4LjgwMjQgMjU4LjE1MSA2Mi4yMTY2IDI2NC4xMTcgNjEuMjI0NSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utb3BhY2l0eT0iMC45IiBzdHJva2Utd2lkdGg9IjE2IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4NCjxwYXRoIGQ9Ik0xNzUuMTM3IDIyMy44NjZDMTkyLjMwOSAyMjMuNjQzIDIxMC4xMzYgMjE5LjYyNyAyMjcuMzQ4IDIyMS43NzUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuOSIgc3Ryb2tlLXdpZHRoPSIxNiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+DQo8cGF0aCBkPSJNMTcwLjIwNyAyNjcuODMyQzE4OS4zODkgMjY4LjkzMyAyMTEuMjU3IDI2My45OTkgMjI5LjkzMyAyNjguNjY4IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjkiIHN0cm9rZS13aWR0aD0iMTYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPg0KPHBhdGggZD0iTTE5OS4zODcgMjM0Ljc4N0MxOTkuMzg3IDIzMS4yMjYgMTk5LjM4NyAyMzAuMzcxIDE5OS4zODcgMjI2LjgyOCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utb3BhY2l0eT0iMC45IiBzdHJva2Utd2lkdGg9IjE2IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4NCjxwYXRoIGQ9Ik0xNDguOTgzIDM3MC4wODFDMTUxLjQxMyAzNjguOTAyIDE1NC4xNTggMzY4LjUwMSAxNTYuOTQyIDM2Ny40MjgiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuOSIgc3Ryb2tlLXdpZHRoPSIxNiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+DQo8cGF0aCBkPSJNMjM5LjE3OSAzNzEuMDQ3QzI0Mi45OTkgMzcwLjE3NyAyNDYuMzk3IDM3MS4xNzcgMjUwLjA1MyAzNzEuMTc3IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjkiIHN0cm9rZS13aWR0aD0iMTYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPg0KPC9zdmc+'; + + constructor(public sanitizer: DomSanitizer) {} ngOnChanges() { - this.src = this.sanitizer.bypassSecurityTrustResourceUrl( - "data:image/svg+xml;base64," + this.svgAsBase64, - ); + this.src = this.sanitizer.bypassSecurityTrustResourceUrl(this.svgAsBase64); } } From 1f7f26213d0f145071c065ad06bbb8181bb4333e Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Mon, 12 May 2025 21:08:47 +0200 Subject: [PATCH 25/61] fix: multiple declaration in modules --- code/frameworks/angular/src/client/config.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/frameworks/angular/src/client/config.ts b/code/frameworks/angular/src/client/config.ts index c827fa7ec8a9..fc496feb7c9c 100644 --- a/code/frameworks/angular/src/client/config.ts +++ b/code/frameworks/angular/src/client/config.ts @@ -1,4 +1,5 @@ import './globals'; +import { TestBed } from '@angular/core/testing'; export { render, renderToCanvas } from './render'; export { decorateStory as applyDecorators } from './decorateStory'; @@ -7,6 +8,6 @@ export const parameters = { renderer: 'angular' as const }; export const beforeEach = () => { return () => { - console.log('Will run when switching/reloading stories'); + TestBed.resetTestingModule().resetTestEnvironment(); }; }; From ab1171027a7ab905f9f8dcaddbeefebcbabfc8ed Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Tue, 13 May 2025 22:57:31 +0200 Subject: [PATCH 26/61] fix: prop assignment did not trigger angular lifecycle hooks --- .../utils/TestBedComponentBuilder.ts | 29 +++++++++++++------ .../not-standalone-component.ts | 6 ++-- .../sanatizer/dom-sanitizer-test.stories.ts | 6 +++- .../sanitizer-test-component.ts | 5 +++- 4 files changed, 32 insertions(+), 14 deletions(-) diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts index 20eed3c7f14f..d13ae492491a 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts @@ -3,7 +3,7 @@ import { BrowserDynamicTestingModule, platformBrowserDynamicTesting, } from '@angular/platform-browser-dynamic/testing'; -import { ApplicationRef, Type } from '@angular/core'; +import { ApplicationRef, ComponentFactoryResolver, Type } from '@angular/core'; import { PropertyExtractor } from './PropertyExtractor'; import { ICollection, StoryFnAngularReturnType } from '../../types'; import { getWrapperModule } from '../TestBedWrapperComponent'; @@ -17,6 +17,8 @@ export class TestBedComponentBuilder { private component: Type | undefined; + private componentInputs: string[] = []; + private fixture: ComponentFixture; private imports: any[] = []; @@ -84,12 +86,6 @@ export class TestBedComponentBuilder { return this; } - setAndUpdateProps(props: ICollection) { - this.props = props; - this.updateComponentProps(); - return this; - } - configure() { this.throwOnMissingTestBedInstance(); this.throwOnMissingComponent(); @@ -129,13 +125,28 @@ export class TestBedComponentBuilder { this.throwOnMissingFixture(); this.throwOnMissingTargetNode(); this.targetNode.appendChild(this.fixture.nativeElement); - this.fixture.detectChanges(); + this.fixture.autoDetectChanges(true); + } + + private calculateComponentInputs() { + if (this.props == null) return; + const componentResolver = this.testBedInstance.inject(ComponentFactoryResolver); + this.componentInputs = componentResolver + .resolveComponentFactory(this.component) + .inputs.map((input) => input.propName); } private updateComponentProps() { this.throwOnMissingFixture(); - if (this.props != null) + this.calculateComponentInputs(); + if (this.props != null) { this.fixture.componentInstance = Object.assign(this.fixture.componentInstance, this.props); + for (const key in this.props) { + if (!this.componentInputs.includes(key)) continue; + // had to be done to trigger angular's lifecycle hook like ngOnchange + this.fixture.componentRef.setInput(key, this.props[key]); + } + } this.fixture.detectChanges(); return this; } diff --git a/code/frameworks/angular/template/stories/core/provider/not-standalone-component/not-standalone-component.ts b/code/frameworks/angular/template/stories/core/provider/not-standalone-component/not-standalone-component.ts index 0ef8bb0eb232..94b44f0d7f96 100644 --- a/code/frameworks/angular/template/stories/core/provider/not-standalone-component/not-standalone-component.ts +++ b/code/frameworks/angular/template/stories/core/provider/not-standalone-component/not-standalone-component.ts @@ -13,11 +13,11 @@ export class ApiModule {} @Component({ template: `{{ testForProvider }}`, selector: 'not-standalone-component', + imports: [ApiModule], }) export default class NotStandaloneComponent { - - testForProvider = ""; - + testForProvider = ''; + constructor(private service: ApiService) { this.testForProvider = service.data; } diff --git a/code/frameworks/angular/template/stories/core/sanatizer/dom-sanitizer-test.stories.ts b/code/frameworks/angular/template/stories/core/sanatizer/dom-sanitizer-test.stories.ts index b1ea67dc8fea..8cc90e508900 100644 --- a/code/frameworks/angular/template/stories/core/sanatizer/dom-sanitizer-test.stories.ts +++ b/code/frameworks/angular/template/stories/core/sanatizer/dom-sanitizer-test.stories.ts @@ -13,4 +13,8 @@ export default meta; type Story = StoryObj; -export const TestSanitizerWithoutArgs: Story = {}; +export const TestSanitizer: Story = { + args: { + caption: "Here's my caption", + }, +}; diff --git a/code/frameworks/angular/template/stories/core/sanatizer/test-component/sanitizer-test-component.ts b/code/frameworks/angular/template/stories/core/sanatizer/test-component/sanitizer-test-component.ts index b616b00fc6fa..22ce1fd522c0 100644 --- a/code/frameworks/angular/template/stories/core/sanatizer/test-component/sanitizer-test-component.ts +++ b/code/frameworks/angular/template/stories/core/sanatizer/test-component/sanitizer-test-component.ts @@ -1,4 +1,4 @@ -import { Component, Injectable, OnChanges } from '@angular/core'; +import { Component, Injectable, Input, OnChanges } from '@angular/core'; import { CommonModule } from '@angular/common'; import { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser'; @@ -12,10 +12,12 @@ export class ApiService { // Needs to be a different name to the CLI template button template: `@if (src) { + {{ caption }} }`, selector: 'sanitizer-component', }) export default class SanitizerTestComponent implements OnChanges { + @Input() caption: string = ''; src: SafeResourceUrl | null = null; svgAsBase64 = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IS0tIFVwbG9hZGVkIHRvOiBTVkcgUmVwbywgd3d3LnN2Z3JlcG8uY29tLCBHZW5lcmF0b3I6IFNWRyBSZXBvIE1peGVyIFRvb2xzIC0tPgo8c3ZnIHdpZHRoPSI4MDBweCIgaGVpZ2h0PSI4MDBweCIgdmlld0JveD0iMCAwIDQwMCA0MDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+DQo8cGF0aCBkPSJNMTg2LjYxNCA3Mi40NzMxQzIyNC4zNzkgNDguNzQ3OSAyNDkuMTI1IDk1Ljg4NzcgMjE3LjU3MyAxMjIuODcyQzIxMS4yMTYgMTI4LjMwNyAyMDMuOTUgMTMxIDE5NS41NzUgMTMxQzE2Ni42NjMgMTMxIDE3NC44MjIgOTguMDE4MSAxODAuOTExIDc5Ljc4ODYiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuOSIgc3Ryb2tlLXdpZHRoPSIxNiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+DQo8cGF0aCBkPSJNMTU5LjU5OSAxMzUuMzA2QzE1OS41OTkgMTY1LjgxNCAxNjYuMTYxIDE5Mi42NzYgMTY3LjI0NSAyMjAuMTk3QzE2OC41OTQgMjU0LjQzOSAxNjYuOTQ4IDI5NC42MjYgMTU5LjU5NCAzNjcuNDI5IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjkiIHN0cm9rZS13aWR0aD0iMTYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPg0KPHBhdGggZD0iTTIzMy44MTcgMTQwLjk0OEMyMzYuNTI2IDE2Ny4xNDEgMjI5Ljg5NCAxODQuMzg0IDIyOC40ODUgMTk2LjA1QzIzMi4yOTQgMzMyLjc5OCAyMzcuMzcyIDM1MS43MjkgMjM3LjM3MiAzNzEuMTM0IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjkiIHN0cm9rZS13aWR0aD0iMTYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPg0KPHBhdGggZD0iTTIzMy44MzMgMTQwLjk0NkMyNTQuMTggMTI5Ljg2MyAyODcuODY2IDEyMC4xMTYgMjgzLjYwMyA5MC4yODc4QzI4My4wOTMgODYuNzE5OCAyODQuNDY1IDg0Ljk1NTcgMjgwLjA0OCA4NC45NTU3IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjkiIHN0cm9rZS13aWR0aD0iMTYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPg0KPHBhdGggZD0iTTE1Ny4yNTIgMTM2LjU3OEMxMjYuMDIzIDEzOS41MjMgMTA3LjQ4OCAxMDEuNDc5IDExNi45OTMgNzIuOTYzNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utb3BhY2l0eT0iMC45IiBzdHJva2Utd2lkdGg9IjE2IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4NCjxwYXRoIGQ9Ik0xMTkuODMgNjEuMzkyOUMxMDcuNDcxIDQzLjQ5OTUgMTQxLjE0NiAxNC42MzkzIDE1My42NjIgMzQuNjYyOUMxNTkuMTk2IDQzLjUxNTQgMTQ1LjUzNiA2OS43OTk3IDEzNS43MDIgNjMuODk5OCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utb3BhY2l0eT0iMC45IiBzdHJva2Utd2lkdGg9IjE2IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4NCjxwYXRoIGQ9Ik0yODQuMTY1IDcyLjQ5OUMyODQuOTkgNjcuODg4NCAyODUgNjMuMDMzNyAyODUgNTguMjk4NEMyODUgMTMuNDY1NCAyMjYuMTYgNDUuNzMxOSAyNTEuNTg1IDU2LjYyOThDMjU2LjY2IDU4LjgwMjQgMjU4LjE1MSA2Mi4yMTY2IDI2NC4xMTcgNjEuMjI0NSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utb3BhY2l0eT0iMC45IiBzdHJva2Utd2lkdGg9IjE2IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4NCjxwYXRoIGQ9Ik0xNzUuMTM3IDIyMy44NjZDMTkyLjMwOSAyMjMuNjQzIDIxMC4xMzYgMjE5LjYyNyAyMjcuMzQ4IDIyMS43NzUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuOSIgc3Ryb2tlLXdpZHRoPSIxNiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+DQo8cGF0aCBkPSJNMTcwLjIwNyAyNjcuODMyQzE4OS4zODkgMjY4LjkzMyAyMTEuMjU3IDI2My45OTkgMjI5LjkzMyAyNjguNjY4IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjkiIHN0cm9rZS13aWR0aD0iMTYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPg0KPHBhdGggZD0iTTE5OS4zODcgMjM0Ljc4N0MxOTkuMzg3IDIzMS4yMjYgMTk5LjM4NyAyMzAuMzcxIDE5OS4zODcgMjI2LjgyOCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utb3BhY2l0eT0iMC45IiBzdHJva2Utd2lkdGg9IjE2IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4NCjxwYXRoIGQ9Ik0xNDguOTgzIDM3MC4wODFDMTUxLjQxMyAzNjguOTAyIDE1NC4xNTggMzY4LjUwMSAxNTYuOTQyIDM2Ny40MjgiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuOSIgc3Ryb2tlLXdpZHRoPSIxNiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+DQo8cGF0aCBkPSJNMjM5LjE3OSAzNzEuMDQ3QzI0Mi45OTkgMzcwLjE3NyAyNDYuMzk3IDM3MS4xNzcgMjUwLjA1MyAzNzEuMTc3IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjkiIHN0cm9rZS13aWR0aD0iMTYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPg0KPC9zdmc+'; @@ -24,5 +26,6 @@ export default class SanitizerTestComponent implements OnChanges { ngOnChanges() { this.src = this.sanitizer.bypassSecurityTrustResourceUrl(this.svgAsBase64); + console.log(this.src); } } From a084f95251787cdd889faf686077c75e1e3b02ab Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Thu, 29 May 2025 09:34:18 +0200 Subject: [PATCH 27/61] [Angular] feat: add rendering bug as test story --- .../rendering-bug-component.ts | 18 ++++++++++ .../rendering-overrides-attributes.stories.ts | 34 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 code/frameworks/angular/template/stories/core/parameters/rendering-bug-component/rendering-bug-component.ts create mode 100644 code/frameworks/angular/template/stories/core/parameters/rendering-overrides-attributes.stories.ts diff --git a/code/frameworks/angular/template/stories/core/parameters/rendering-bug-component/rendering-bug-component.ts b/code/frameworks/angular/template/stories/core/parameters/rendering-bug-component/rendering-bug-component.ts new file mode 100644 index 000000000000..aa1494e4c9bf --- /dev/null +++ b/code/frameworks/angular/template/stories/core/parameters/rendering-bug-component/rendering-bug-component.ts @@ -0,0 +1,18 @@ +import { Component, Input } from '@angular/core'; + +@Component({ + standalone: true, + template: ``, + selector: 'rendering-bug-component', +}) +export default class RenderingBugComponent { + @Input() label = 'button'; + + buttonClick() { + this.sample123('Original Message'); + } + + private sample123(someArgument: string) { + console.log(someArgument); + } +} diff --git a/code/frameworks/angular/template/stories/core/parameters/rendering-overrides-attributes.stories.ts b/code/frameworks/angular/template/stories/core/parameters/rendering-overrides-attributes.stories.ts new file mode 100644 index 000000000000..72d7ad5fe4b5 --- /dev/null +++ b/code/frameworks/angular/template/stories/core/parameters/rendering-overrides-attributes.stories.ts @@ -0,0 +1,34 @@ +import { Meta, StoryObj } from '@storybook/angular'; +import RenderingBugComponent from './rendering-bug-component/rendering-bug-component'; + +const meta: Meta = { + component: RenderingBugComponent, + tags: ['autodocs'], + parameters: { + useTestBedRenderer: true, + }, +}; + +export default meta; + +type Story = StoryObj; + +export const RenderFuncOerridesAttributes: Story = { + args: { + label: 'Just a Test', + }, + render: (args) => { + const sample123 = (someArgument: string) => { + console.log('Overridden', someArgument); + }; + return { + template: ` +
+ Check Logs + +
`, + props: { ...args, sample123 }, + component: RenderingBugComponent, + }; + }, +}; From d07394b8f539453ae9f6c001d7a10fba0f5c65c5 Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Thu, 29 May 2025 09:40:33 +0200 Subject: [PATCH 28/61] [Angular] feat: add routes as parameter attributes for story for specification --- code/frameworks/angular/src/client/types.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/frameworks/angular/src/client/types.ts b/code/frameworks/angular/src/client/types.ts index ed0d408466dc..5db362961493 100644 --- a/code/frameworks/angular/src/client/types.ts +++ b/code/frameworks/angular/src/client/types.ts @@ -3,8 +3,8 @@ import { StoryContext as DefaultStoryContext, WebRenderer, } from 'storybook/internal/types'; - -import { Provider, importProvidersFrom } from '@angular/core'; +import { Routes } from '@angular/router'; +import { Provider } from '@angular/core'; import { ApplicationConfig } from '@angular/platform-browser'; export interface NgModuleMetadata { @@ -46,6 +46,7 @@ export interface AngularRenderer extends WebRenderer { export type Parameters = DefaultParameters & { bootstrapModuleOptions?: unknown; useTestBedRenderer?: boolean; + routes?: Routes[]; }; export type StoryContext = DefaultStoryContext & { parameters: Parameters }; From f4f82f244091b4579cbd8b029e8f966068b20d5e Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Thu, 29 May 2025 10:42:07 +0200 Subject: [PATCH 29/61] [Angular] refactor: routing attributes to moduleMedatada and Application config --- .../frameworks/angular/src/client/decorators.ts | 5 +---- code/frameworks/angular/src/client/types.ts | 17 +++++++++++++---- .../core/provider/provide-router.stories.ts | 11 ++++++----- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/code/frameworks/angular/src/client/decorators.ts b/code/frameworks/angular/src/client/decorators.ts index d2feef65823f..28b531d71aa0 100644 --- a/code/frameworks/angular/src/client/decorators.ts +++ b/code/frameworks/angular/src/client/decorators.ts @@ -1,11 +1,8 @@ import { DecoratorFunction, StoryContext } from 'storybook/internal/types'; - import { Type } from '@angular/core'; -import { ApplicationConfig } from '@angular/platform-browser'; - import { computesTemplateFromComponent } from './angular-beta/ComputesTemplateFromComponent'; import { isComponent } from './angular-beta/utils/NgComponentAnalyzer'; -import { AngularRenderer, ICollection, NgModuleMetadata } from './types'; +import { AngularRenderer, ApplicationConfig, ICollection, NgModuleMetadata } from './types'; // We use `any` here as the default type rather than `Args` because we need something that is // castable to any component-specific args type when the user is being careful. diff --git a/code/frameworks/angular/src/client/types.ts b/code/frameworks/angular/src/client/types.ts index 5db362961493..dd58c3a79e9a 100644 --- a/code/frameworks/angular/src/client/types.ts +++ b/code/frameworks/angular/src/client/types.ts @@ -3,14 +3,14 @@ import { StoryContext as DefaultStoryContext, WebRenderer, } from 'storybook/internal/types'; -import { Routes } from '@angular/router'; -import { Provider } from '@angular/core'; -import { ApplicationConfig } from '@angular/platform-browser'; +import { ExtraOptions, Routes } from '@angular/router'; +import { EnvironmentProviders, Provider } from '@angular/core'; export interface NgModuleMetadata { /** List of components, directives, and pipes that belong to your component. */ declarations?: any[]; entryComponents?: any[]; + routing?: RoutingConfig; /** * List of modules that should be available to the root Storybook Component and all its children. * If you want to register application providers or if you want to use the forRoot() pattern, @@ -29,6 +29,16 @@ export interface ICollection { [p: string]: any; } +export interface ApplicationConfig { + providers?: Array; + routing?: RoutingConfig; +} + +export interface RoutingConfig { + routes?: Routes; + options?: ExtraOptions; +} + export interface StoryFnAngularReturnType { props?: ICollection; moduleMetadata?: NgModuleMetadata; @@ -46,7 +56,6 @@ export interface AngularRenderer extends WebRenderer { export type Parameters = DefaultParameters & { bootstrapModuleOptions?: unknown; useTestBedRenderer?: boolean; - routes?: Routes[]; }; export type StoryContext = DefaultStoryContext & { parameters: Parameters }; diff --git a/code/frameworks/angular/template/stories/core/provider/provide-router.stories.ts b/code/frameworks/angular/template/stories/core/provider/provide-router.stories.ts index f5f1df575173..d0b3fdf5379c 100644 --- a/code/frameworks/angular/template/stories/core/provider/provide-router.stories.ts +++ b/code/frameworks/angular/template/stories/core/provider/provide-router.stories.ts @@ -16,11 +16,12 @@ const meta: Meta = { imports: [RouterModule], }), applicationConfig({ - providers: [ - importProvidersFrom( - RouterModule.forRoot([{ path: '**', component: EmptyComponent }], { useHash: true }) - ), - ], + routing: { + routes: [{ path: '**', component: EmptyComponent }], + options: { + useHash: true, + }, + }, }), ], parameters: { From e64564012b98507f14632b36e4665639e068155e Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Fri, 30 May 2025 09:48:21 +0200 Subject: [PATCH 30/61] [Angular] feat: add routing functionalities for testbed rendering --- .../client/angular-beta/AbstractRenderer.ts | 1 + .../utils/TestBedComponentBuilder.ts | 21 ++++++++++++++++++- code/frameworks/angular/src/client/types.ts | 1 - .../router-component/router-component.ts | 18 ---------------- .../router-component/router-component.ts | 17 +++++++++++++++ .../router.stories.ts} | 21 ++++++++++++++++--- 6 files changed, 56 insertions(+), 23 deletions(-) delete mode 100644 code/frameworks/angular/template/stories/core/provider/router-component/router-component.ts create mode 100644 code/frameworks/angular/template/stories/core/router/router-component/router-component.ts rename code/frameworks/angular/template/stories/core/{provider/provide-router.stories.ts => router/router.stories.ts} (59%) diff --git a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts index dc41b062b738..7e51d3882caa 100644 --- a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts +++ b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts @@ -147,6 +147,7 @@ export abstract class AbstractRenderer { .setTargetNode(targetDOMNode) .setEnvironmentProviders(environmentProviders) .configure() + .initRouter() .compileComponents(); componentBuilder.copyComponentIntoTargetNode(); diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts index d13ae492491a..045e6baeb116 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts @@ -3,6 +3,8 @@ import { BrowserDynamicTestingModule, platformBrowserDynamicTesting, } from '@angular/platform-browser-dynamic/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { Router } from '@angular/router'; import { ApplicationRef, ComponentFactoryResolver, Type } from '@angular/core'; import { PropertyExtractor } from './PropertyExtractor'; import { ICollection, StoryFnAngularReturnType } from '../../types'; @@ -29,6 +31,8 @@ export class TestBedComponentBuilder { private environmentProviders: any[] = []; + private routes: { routes?: any[]; options?: any }; + private selector: string; private props: ICollection; @@ -64,6 +68,7 @@ export class TestBedComponentBuilder { setStoryFn(storyFn: StoryFnAngularReturnType) { this.styles = storyFn.styles; this.schemas = storyFn.moduleMetadata?.schemas; + this.routes = storyFn.applicationConfig?.routing; this.props = storyFn.props; return this; } @@ -91,7 +96,9 @@ export class TestBedComponentBuilder { this.throwOnMissingComponent(); const wrapperModule = getWrapperModule(); this.testBedInstance - .configureTestingModule({}) + .configureTestingModule({ + imports: [this.getRouteModuleImport()], + }) .overrideComponent( this.component, GenerateComponentMetaData( @@ -110,6 +117,12 @@ export class TestBedComponentBuilder { return this; } + initRouter() { + const router = this.testBedInstance.inject(Router); + router.initialNavigation(); + return this; + } + async compileComponents() { await this.testBedInstance.compileComponents(); this.fixture = this.testBedInstance.createComponent(this.component); @@ -151,6 +164,12 @@ export class TestBedComponentBuilder { return this; } + private getRouteModuleImport(): any[] { + if (this.routes === null || this.routes === undefined) return []; + + return [RouterTestingModule.withRoutes(this.routes.routes, this.routes.options)]; + } + private throwOnMissingComponent() { if (this.component == null) throw new Error('Component attribute is null'); } diff --git a/code/frameworks/angular/src/client/types.ts b/code/frameworks/angular/src/client/types.ts index dd58c3a79e9a..caf1f884bbe1 100644 --- a/code/frameworks/angular/src/client/types.ts +++ b/code/frameworks/angular/src/client/types.ts @@ -10,7 +10,6 @@ export interface NgModuleMetadata { /** List of components, directives, and pipes that belong to your component. */ declarations?: any[]; entryComponents?: any[]; - routing?: RoutingConfig; /** * List of modules that should be available to the root Storybook Component and all its children. * If you want to register application providers or if you want to use the forRoot() pattern, diff --git a/code/frameworks/angular/template/stories/core/provider/router-component/router-component.ts b/code/frameworks/angular/template/stories/core/provider/router-component/router-component.ts deleted file mode 100644 index 27aca70f895b..000000000000 --- a/code/frameworks/angular/template/stories/core/provider/router-component/router-component.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Component, Injectable } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { RouterModule } from "@angular/router"; - -@Injectable() -export class ApiService { - data: string = 'original Api Service'; -} - -@Component({ - standalone: true, - imports: [CommonModule, RouterModule], - // Needs to be a different name to the CLI template button - template: `Router works`, - selector: 'router-provider-button', -}) -export default class ProvideRouterComponent { -} diff --git a/code/frameworks/angular/template/stories/core/router/router-component/router-component.ts b/code/frameworks/angular/template/stories/core/router/router-component/router-component.ts new file mode 100644 index 000000000000..c7538b2cff83 --- /dev/null +++ b/code/frameworks/angular/template/stories/core/router/router-component/router-component.ts @@ -0,0 +1,17 @@ +import { Component, OnInit } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { Router, RouterModule } from '@angular/router'; + +@Component({ + standalone: true, + imports: [CommonModule, RouterModule], + template: ``, + selector: 'router-provider-button', +}) +export default class ProvideRouterComponent { + constructor(private router: Router) {} + + routeToNonExistingUrl() { + this.router.navigate(['/nonExisting']); + } +} diff --git a/code/frameworks/angular/template/stories/core/provider/provide-router.stories.ts b/code/frameworks/angular/template/stories/core/router/router.stories.ts similarity index 59% rename from code/frameworks/angular/template/stories/core/provider/provide-router.stories.ts rename to code/frameworks/angular/template/stories/core/router/router.stories.ts index d0b3fdf5379c..8122a7c57030 100644 --- a/code/frameworks/angular/template/stories/core/provider/provide-router.stories.ts +++ b/code/frameworks/angular/template/stories/core/router/router.stories.ts @@ -1,10 +1,13 @@ import { Meta, StoryObj, applicationConfig, moduleMetadata } from '@storybook/angular'; import { RouterModule } from '@angular/router'; -import { Component, importProvidersFrom } from '@angular/core'; +import { Component } from '@angular/core'; import ProvideRouterComponent from './router-component/router-component'; @Component({ - template: '', + template: `
+ Empty Component works! + Home +
`, }) class EmptyComponent {} @@ -17,7 +20,11 @@ const meta: Meta = { }), applicationConfig({ routing: { - routes: [{ path: '**', component: EmptyComponent }], + routes: [ + { path: '', redirectTo: '/home', pathMatch: 'full' }, + { path: 'home', component: ProvideRouterComponent }, + { path: '**', component: EmptyComponent }, + ], options: { useHash: true, }, @@ -27,6 +34,14 @@ const meta: Meta = { parameters: { useTestBedRenderer: true, }, + render: (args) => { + return { + template: ` +
+ +
`, + }; + }, }; export default meta; From 68853bc9af75cc2340e32fc4dd264bec7aac3de2 Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Fri, 6 Jun 2025 18:06:10 +0200 Subject: [PATCH 31/61] [Angular] fix: router dependency --- code/frameworks/angular/package.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/frameworks/angular/package.json b/code/frameworks/angular/package.json index a3c030a7310d..681b8eb6fb19 100644 --- a/code/frameworks/angular/package.json +++ b/code/frameworks/angular/package.json @@ -76,6 +76,7 @@ "@angular/forms": "^19.1.1", "@angular/platform-browser": "^19.1.1", "@angular/platform-browser-dynamic": "^19.1.1", + "@angular/router": "^19.1.1", "@types/node": "^22.0.0", "rimraf": "^6.0.1", "typescript": "^5.8.3", @@ -95,6 +96,7 @@ "@angular/forms": ">=18.0.0 < 21.0.0", "@angular/platform-browser": ">=18.0.0 < 21.0.0", "@angular/platform-browser-dynamic": ">=18.0.0 < 21.0.0", + "@angular/router": ">=18.0.0 < 21.0.0", "rxjs": "^6.5.3 || ^7.4.0", "storybook": "workspace:^", "typescript": "^4.9.0 || ^5.0.0", From b6fb228ee4dee75bed85bd3f04cd2b4d2ab0c973 Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Fri, 6 Jun 2025 18:12:01 +0200 Subject: [PATCH 32/61] [Angular] fix: changed lockfile --- code/yarn.lock | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/code/yarn.lock b/code/yarn.lock index 41c2fb00707a..fc1f118e5aba 100644 --- a/code/yarn.lock +++ b/code/yarn.lock @@ -400,6 +400,20 @@ __metadata: languageName: node linkType: hard +"@angular/router@npm:^19.1.1": + version: 19.2.14 + resolution: "@angular/router@npm:19.2.14" + dependencies: + tslib: "npm:^2.3.0" + peerDependencies: + "@angular/common": 19.2.14 + "@angular/core": 19.2.14 + "@angular/platform-browser": 19.2.14 + rxjs: ^6.5.3 || ^7.4.0 + checksum: 10c0/e70855ba7a88f6f3a69b6540bfaf34673db7d298ddf573e454c57b6a5e5802555dcc3a44a6d93fa75ca4deb71d2e93e832b82df49b6aed32ab84338a8e1b3526 + languageName: node + linkType: hard + "@aw-web-design/x-default-browser@npm:1.4.126": version: 1.4.126 resolution: "@aw-web-design/x-default-browser@npm:1.4.126" @@ -6115,6 +6129,7 @@ __metadata: "@angular/forms": "npm:^19.1.1" "@angular/platform-browser": "npm:^19.1.1" "@angular/platform-browser-dynamic": "npm:^19.1.1" + "@angular/router": "npm:^19.1.1" "@storybook/builder-webpack5": "workspace:*" "@storybook/core-webpack": "workspace:*" "@storybook/global": "npm:^5.0.0" @@ -6142,6 +6157,7 @@ __metadata: "@angular/forms": ">=18.0.0 < 21.0.0" "@angular/platform-browser": ">=18.0.0 < 21.0.0" "@angular/platform-browser-dynamic": ">=18.0.0 < 21.0.0" + "@angular/router": ">=18.0.0 < 21.0.0" rxjs: ^6.5.3 || ^7.4.0 storybook: "workspace:^" typescript: ^4.9.0 || ^5.0.0 From 686f5dc356cf28e34fa0171760bb9f27e3c8f478 Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Fri, 6 Jun 2025 19:17:48 +0200 Subject: [PATCH 33/61] [Angular] fix: dependency for pipeline --- code/frameworks/angular/package.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/frameworks/angular/package.json b/code/frameworks/angular/package.json index 681b8eb6fb19..d26a5fe50b74 100644 --- a/code/frameworks/angular/package.json +++ b/code/frameworks/angular/package.json @@ -52,6 +52,8 @@ "prep": "rimraf dist && jiti ../../../scripts/prepare/tsc.ts" }, "dependencies": { + "@angular/platform-browser-dynamic": "^19.1.1", + "@angular/router": "^19.1.1", "@storybook/builder-webpack5": "workspace:*", "@storybook/core-webpack": "workspace:*", "@storybook/global": "^5.0.0", From c67765c470f6b81e241833eb9f7df8920e6b256d Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Fri, 6 Jun 2025 21:10:52 +0200 Subject: [PATCH 34/61] [Angular] fix: circular dependency and tests --- .../angular/src/client/angular-beta/AbstractRenderer.ts | 5 +++-- .../angular/src/client/angular-beta/RendererFactory.test.ts | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts index 7e51d3882caa..c1b49016a2da 100644 --- a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts +++ b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts @@ -3,11 +3,12 @@ import { BehaviorSubject, Subject } from 'rxjs'; import { stringify } from 'telejson'; import { ICollection, StoryFnAngularReturnType } from '../types'; import { PropertyExtractor } from './utils/PropertyExtractor'; -import { TestBedComponentBuilder } from './utils/TestBedComponentBuilder'; -import { getApplication, storyPropsProvider } from '../../renderer'; +import { TestBedComponentBuilder } from './utils/TestBedComponentBuilder';; import { queueBootstrapping } from './utils/BootstrapQueue'; import { bootstrapApplication } from '@angular/platform-browser'; import { getWrapperComponent } from './TestBedWrapperComponent'; +import { storyPropsProvider } from './StorybookProvider'; +import { getApplication } from './StorybookModule'; type StoryRenderInfo = { storyFnAngular: StoryFnAngularReturnType; diff --git a/code/frameworks/angular/src/client/angular-beta/RendererFactory.test.ts b/code/frameworks/angular/src/client/angular-beta/RendererFactory.test.ts index 8a66c30f48a1..db386b95ded0 100644 --- a/code/frameworks/angular/src/client/angular-beta/RendererFactory.test.ts +++ b/code/frameworks/angular/src/client/angular-beta/RendererFactory.test.ts @@ -224,7 +224,7 @@ describe('RendererFactory', () => { expect(global.document.querySelectorAll('#story-1 > story-1')[0].innerHTML).toBe( '🦊' ); - expect(global.document.querySelectorAll('#story-1 > story-1')[1].innerHTML).toBe( + expect(global.document.querySelectorAll('#story-1 > story-1')[0].innerHTML).toBe( '🦊' ); }); From 595db1266e253907051b7b447fd8f5fdb547dfdb Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Fri, 6 Jun 2025 21:23:18 +0200 Subject: [PATCH 35/61] [Angular] fix: angular versions --- code/frameworks/angular/package.json | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/code/frameworks/angular/package.json b/code/frameworks/angular/package.json index d26a5fe50b74..6088aef3ef2d 100644 --- a/code/frameworks/angular/package.json +++ b/code/frameworks/angular/package.json @@ -67,18 +67,18 @@ }, "devDependencies": { "@analogjs/vite-plugin-angular": "^1.12.1", - "@angular-devkit/architect": "^0.1901.1", - "@angular-devkit/build-angular": "^19.1.1", - "@angular-devkit/core": "^19.1.1", - "@angular/animations": "^19.1.1", - "@angular/common": "^19.1.1", - "@angular/compiler": "^19.1.1", - "@angular/compiler-cli": "^19.1.1", - "@angular/core": "^19.1.1", - "@angular/forms": "^19.1.1", - "@angular/platform-browser": "^19.1.1", - "@angular/platform-browser-dynamic": "^19.1.1", - "@angular/router": "^19.1.1", + "@angular-devkit/architect": ">=0.1800.0 < 0.2100.0", + "@angular-devkit/build-angular": ">=0.1800.0 < 0.2100.0", + "@angular-devkit/core": ">=0.1800.0 < 0.2100.0", + "@angular/animations": ">=0.1800.0 < 0.2100.0", + "@angular/common": ">=0.1800.0 < 0.2100.0", + "@angular/compiler": ">=0.1800.0 < 0.2100.0", + "@angular/compiler-cli": ">=0.1800.0 < 0.2100.0", + "@angular/core": ">=0.1800.0 < 0.2100.0", + "@angular/forms": ">=0.1800.0 < 0.2100.0", + "@angular/platform-browser": ">=0.1800.0 < 0.2100.0", + "@angular/platform-browser-dynamic": ">=0.1800.0 < 0.2100.0", + "@angular/router": ">=0.1800.0 < 0.2100.0", "@types/node": "^22.0.0", "rimraf": "^6.0.1", "typescript": "^5.8.3", @@ -87,7 +87,7 @@ }, "peerDependencies": { "@angular-devkit/architect": ">=0.1800.0 < 0.2100.0", - "@angular-devkit/build-angular": ">=18.0.0 < 21.0.0", + "@angular-devkit/build-angular": ">=0.1800.0 < 0.2100.0", "@angular-devkit/core": ">=18.0.0 < 21.0.0", "@angular/animations": ">=18.0.0 < 21.0.0", "@angular/cli": ">=18.0.0 < 21.0.0", From 5e39790a896685b1520f8928b6e6ba5f276d11b0 Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Fri, 6 Jun 2025 21:26:14 +0200 Subject: [PATCH 36/61] [Angular] fix: angular versions --- code/frameworks/angular/package.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/code/frameworks/angular/package.json b/code/frameworks/angular/package.json index 6088aef3ef2d..f002bc455e72 100644 --- a/code/frameworks/angular/package.json +++ b/code/frameworks/angular/package.json @@ -52,8 +52,8 @@ "prep": "rimraf dist && jiti ../../../scripts/prepare/tsc.ts" }, "dependencies": { - "@angular/platform-browser-dynamic": "^19.1.1", - "@angular/router": "^19.1.1", + "@angular/platform-browser-dynamic": ">=18.0.0 < 21.0.0", + "@angular/router": ">=18.0.0 < 21.0.0", "@storybook/builder-webpack5": "workspace:*", "@storybook/core-webpack": "workspace:*", "@storybook/global": "^5.0.0", @@ -70,15 +70,15 @@ "@angular-devkit/architect": ">=0.1800.0 < 0.2100.0", "@angular-devkit/build-angular": ">=0.1800.0 < 0.2100.0", "@angular-devkit/core": ">=0.1800.0 < 0.2100.0", - "@angular/animations": ">=0.1800.0 < 0.2100.0", - "@angular/common": ">=0.1800.0 < 0.2100.0", - "@angular/compiler": ">=0.1800.0 < 0.2100.0", - "@angular/compiler-cli": ">=0.1800.0 < 0.2100.0", - "@angular/core": ">=0.1800.0 < 0.2100.0", - "@angular/forms": ">=0.1800.0 < 0.2100.0", - "@angular/platform-browser": ">=0.1800.0 < 0.2100.0", - "@angular/platform-browser-dynamic": ">=0.1800.0 < 0.2100.0", - "@angular/router": ">=0.1800.0 < 0.2100.0", + "@angular/animations": ">=18.0.0 < 21.0.0", + "@angular/common": ">=18.0.0 < 21.0.0", + "@angular/compiler": ">=18.0.0 < 21.0.0", + "@angular/compiler-cli": ">=18.0.0 < 21.0.0", + "@angular/core": ">=18.0.0 < 21.0.0", + "@angular/forms": ">=18.0.0 < 21.0.0", + "@angular/platform-browser": ">=18.0.0 < 21.0.0", + "@angular/platform-browser-dynamic": ">=18.0.0 < 21.0.0", + "@angular/router": ">=18.0.0 < 21.0.0", "@types/node": "^22.0.0", "rimraf": "^6.0.1", "typescript": "^5.8.3", @@ -88,7 +88,7 @@ "peerDependencies": { "@angular-devkit/architect": ">=0.1800.0 < 0.2100.0", "@angular-devkit/build-angular": ">=0.1800.0 < 0.2100.0", - "@angular-devkit/core": ">=18.0.0 < 21.0.0", + "@angular-devkit/core": ">=0.1800.0 < 0.2100.0", "@angular/animations": ">=18.0.0 < 21.0.0", "@angular/cli": ">=18.0.0 < 21.0.0", "@angular/common": ">=18.0.0 < 21.0.0", From ced20e3a46412ded70b71f5628ed199fc63a6c50 Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Fri, 6 Jun 2025 21:30:27 +0200 Subject: [PATCH 37/61] [Angular] fix: angular versions --- code/frameworks/angular/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/frameworks/angular/package.json b/code/frameworks/angular/package.json index f002bc455e72..ba8ab14e90ce 100644 --- a/code/frameworks/angular/package.json +++ b/code/frameworks/angular/package.json @@ -52,8 +52,8 @@ "prep": "rimraf dist && jiti ../../../scripts/prepare/tsc.ts" }, "dependencies": { - "@angular/platform-browser-dynamic": ">=18.0.0 < 21.0.0", - "@angular/router": ">=18.0.0 < 21.0.0", + "@angular/platform-browser-dynamic": "^21.0.0", + "@angular/router": "^21.0.0", "@storybook/builder-webpack5": "workspace:*", "@storybook/core-webpack": "workspace:*", "@storybook/global": "^5.0.0", From 88ad304e574cac1a4f581b24c0fb5a7867eab9c7 Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Fri, 6 Jun 2025 21:46:09 +0200 Subject: [PATCH 38/61] [Angular] fix: angular versions --- code/frameworks/angular/package.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/code/frameworks/angular/package.json b/code/frameworks/angular/package.json index ba8ab14e90ce..bef7f363ee5b 100644 --- a/code/frameworks/angular/package.json +++ b/code/frameworks/angular/package.json @@ -67,18 +67,18 @@ }, "devDependencies": { "@analogjs/vite-plugin-angular": "^1.12.1", - "@angular-devkit/architect": ">=0.1800.0 < 0.2100.0", - "@angular-devkit/build-angular": ">=0.1800.0 < 0.2100.0", - "@angular-devkit/core": ">=0.1800.0 < 0.2100.0", - "@angular/animations": ">=18.0.0 < 21.0.0", - "@angular/common": ">=18.0.0 < 21.0.0", - "@angular/compiler": ">=18.0.0 < 21.0.0", - "@angular/compiler-cli": ">=18.0.0 < 21.0.0", - "@angular/core": ">=18.0.0 < 21.0.0", - "@angular/forms": ">=18.0.0 < 21.0.0", - "@angular/platform-browser": ">=18.0.0 < 21.0.0", - "@angular/platform-browser-dynamic": ">=18.0.0 < 21.0.0", - "@angular/router": ">=18.0.0 < 21.0.0", + "@angular-devkit/architect": "^0.2000.1", + "@angular-devkit/build-angular": "^0.2000.1", + "@angular-devkit/core": "^0.2000.1", + "@angular/animations": "^20.0.0", + "@angular/common": "^20.0.0", + "@angular/compiler": "^20.0.0", + "@angular/compiler-cli": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/forms": "^20.0.0", + "@angular/platform-browser": "^20.0.0", + "@angular/platform-browser-dynamic": "^20.0.0", + "@angular/router": "^20.0.0", "@types/node": "^22.0.0", "rimraf": "^6.0.1", "typescript": "^5.8.3", From 3d64710b7be4c1784cf1567ebe5b77a66c8f7c22 Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Fri, 6 Jun 2025 21:54:13 +0200 Subject: [PATCH 39/61] [Angular] fix: angular versions --- code/frameworks/angular/package.json | 4 +- code/yarn.lock | 2186 ++++++++++++++++++++------ 2 files changed, 1683 insertions(+), 507 deletions(-) diff --git a/code/frameworks/angular/package.json b/code/frameworks/angular/package.json index bef7f363ee5b..2219aaa7339d 100644 --- a/code/frameworks/angular/package.json +++ b/code/frameworks/angular/package.json @@ -68,8 +68,8 @@ "devDependencies": { "@analogjs/vite-plugin-angular": "^1.12.1", "@angular-devkit/architect": "^0.2000.1", - "@angular-devkit/build-angular": "^0.2000.1", - "@angular-devkit/core": "^0.2000.1", + "@angular-devkit/build-angular": "^20.0.0", + "@angular-devkit/core": "^20.0.0", "@angular/animations": "^20.0.0", "@angular/common": "^20.0.0", "@angular/compiler": "^20.0.0", diff --git a/code/yarn.lock b/code/yarn.lock index fc1f118e5aba..c8c52dbd642c 100644 --- a/code/yarn.lock +++ b/code/yarn.lock @@ -40,107 +40,103 @@ __metadata: languageName: node linkType: hard -"@angular-devkit/architect@npm:0.1902.9": - version: 0.1902.9 - resolution: "@angular-devkit/architect@npm:0.1902.9" +"@angular-devkit/architect@npm:0.2000.1, @angular-devkit/architect@npm:^0.2000.1": + version: 0.2000.1 + resolution: "@angular-devkit/architect@npm:0.2000.1" dependencies: - "@angular-devkit/core": "npm:19.2.9" - rxjs: "npm:7.8.1" - checksum: 10c0/68f280ae3f708c3c662739d0414f4478da6859ae2e533838427ea0351be7cb8f51a037710e7014ba6f49538ee154c7b0e72efb21028438fa99a50811cf6f649a + "@angular-devkit/core": "npm:20.0.1" + rxjs: "npm:7.8.2" + checksum: 10c0/33ae31bf9aecfa02566349644f2873a7d98e46088160aa79df3375598c6c465a6de7e0e7a69145f643c85b99a491e7480e615429652d477bfb88ec32a0b5def2 languageName: node linkType: hard -"@angular-devkit/architect@npm:^0.1901.1": - version: 0.1901.9 - resolution: "@angular-devkit/architect@npm:0.1901.9" - dependencies: - "@angular-devkit/core": "npm:19.1.9" - rxjs: "npm:7.8.1" - checksum: 10c0/ce613e00f7777bcfc8e7df4623b449d6a81a989c8ae01c30ef72fa30bbbae36a656ca09fd654c2df34c915cbe1e850e1b829edbc9b0a3816eb5ea0fdbaf0bd36 - languageName: node - linkType: hard - -"@angular-devkit/build-angular@npm:^19.1.1": - version: 19.2.9 - resolution: "@angular-devkit/build-angular@npm:19.2.9" +"@angular-devkit/build-angular@npm:^20.0.0": + version: 20.0.1 + resolution: "@angular-devkit/build-angular@npm:20.0.1" dependencies: "@ampproject/remapping": "npm:2.3.0" - "@angular-devkit/architect": "npm:0.1902.9" - "@angular-devkit/build-webpack": "npm:0.1902.9" - "@angular-devkit/core": "npm:19.2.9" - "@angular/build": "npm:19.2.9" - "@babel/core": "npm:7.26.10" - "@babel/generator": "npm:7.26.10" - "@babel/helper-annotate-as-pure": "npm:7.25.9" + "@angular-devkit/architect": "npm:0.2000.1" + "@angular-devkit/build-webpack": "npm:0.2000.1" + "@angular-devkit/core": "npm:20.0.1" + "@angular/build": "npm:20.0.1" + "@babel/core": "npm:7.27.1" + "@babel/generator": "npm:7.27.1" + "@babel/helper-annotate-as-pure": "npm:7.27.1" "@babel/helper-split-export-declaration": "npm:7.24.7" - "@babel/plugin-transform-async-generator-functions": "npm:7.26.8" - "@babel/plugin-transform-async-to-generator": "npm:7.25.9" - "@babel/plugin-transform-runtime": "npm:7.26.10" - "@babel/preset-env": "npm:7.26.9" - "@babel/runtime": "npm:7.26.10" + "@babel/plugin-transform-async-generator-functions": "npm:7.27.1" + "@babel/plugin-transform-async-to-generator": "npm:7.27.1" + "@babel/plugin-transform-runtime": "npm:7.27.1" + "@babel/preset-env": "npm:7.27.2" + "@babel/runtime": "npm:7.27.1" "@discoveryjs/json-ext": "npm:0.6.3" - "@ngtools/webpack": "npm:19.2.9" - "@vitejs/plugin-basic-ssl": "npm:1.2.0" + "@ngtools/webpack": "npm:20.0.1" + "@vitejs/plugin-basic-ssl": "npm:2.0.0" ansi-colors: "npm:4.1.3" - autoprefixer: "npm:10.4.20" - babel-loader: "npm:9.2.1" + autoprefixer: "npm:10.4.21" + babel-loader: "npm:10.0.0" browserslist: "npm:^4.21.5" - copy-webpack-plugin: "npm:12.0.2" + copy-webpack-plugin: "npm:13.0.0" css-loader: "npm:7.1.2" - esbuild: "npm:0.25.1" - esbuild-wasm: "npm:0.25.1" + esbuild: "npm:0.25.5" + esbuild-wasm: "npm:0.25.5" fast-glob: "npm:3.3.3" http-proxy-middleware: "npm:3.0.5" istanbul-lib-instrument: "npm:6.0.3" jsonc-parser: "npm:3.3.1" karma-source-map-support: "npm:1.4.0" - less: "npm:4.2.2" - less-loader: "npm:12.2.0" + less: "npm:4.3.0" + less-loader: "npm:12.3.0" license-webpack-plugin: "npm:4.0.2" loader-utils: "npm:3.3.1" mini-css-extract-plugin: "npm:2.9.2" - open: "npm:10.1.0" - ora: "npm:5.4.1" + open: "npm:10.1.2" + ora: "npm:8.2.0" picomatch: "npm:4.0.2" - piscina: "npm:4.8.0" - postcss: "npm:8.5.2" + piscina: "npm:5.0.0" + postcss: "npm:8.5.3" postcss-loader: "npm:8.1.1" resolve-url-loader: "npm:5.0.0" - rxjs: "npm:7.8.1" - sass: "npm:1.85.0" + rxjs: "npm:7.8.2" + sass: "npm:1.88.0" sass-loader: "npm:16.0.5" - semver: "npm:7.7.1" + semver: "npm:7.7.2" source-map-loader: "npm:5.0.0" source-map-support: "npm:0.5.21" - terser: "npm:5.39.0" + terser: "npm:5.39.1" tree-kill: "npm:1.2.2" tslib: "npm:2.8.1" - webpack: "npm:5.98.0" + webpack: "npm:5.99.8" webpack-dev-middleware: "npm:7.4.2" - webpack-dev-server: "npm:5.2.0" + webpack-dev-server: "npm:5.2.1" webpack-merge: "npm:6.0.1" webpack-subresource-integrity: "npm:5.1.0" peerDependencies: - "@angular/compiler-cli": ^19.0.0 || ^19.2.0-next.0 - "@angular/localize": ^19.0.0 || ^19.2.0-next.0 - "@angular/platform-server": ^19.0.0 || ^19.2.0-next.0 - "@angular/service-worker": ^19.0.0 || ^19.2.0-next.0 - "@angular/ssr": ^19.2.9 + "@angular/compiler-cli": ^20.0.0 + "@angular/core": ^20.0.0 + "@angular/localize": ^20.0.0 + "@angular/platform-browser": ^20.0.0 + "@angular/platform-server": ^20.0.0 + "@angular/service-worker": ^20.0.0 + "@angular/ssr": ^20.0.1 "@web/test-runner": ^0.20.0 browser-sync: ^3.0.2 jest: ^29.5.0 jest-environment-jsdom: ^29.5.0 karma: ^6.3.0 - ng-packagr: ^19.0.0 || ^19.2.0-next.0 + ng-packagr: ^20.0.0 protractor: ^7.0.0 tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0 - typescript: ">=5.5 <5.9" + typescript: ">=5.8 <5.9" dependenciesMeta: esbuild: optional: true peerDependenciesMeta: + "@angular/core": + optional: true "@angular/localize": optional: true + "@angular/platform-browser": + optional: true "@angular/platform-server": optional: true "@angular/service-worker": @@ -163,123 +159,112 @@ __metadata: optional: true tailwindcss: optional: true - checksum: 10c0/08b4e5614efe1ef94c64b1e873fa204ccfbaba662a3bd0e3642525f70ba3651d3de3eac0488388ae1108967a2a38825b046313a1987202c1dc2d4d7da067050f + checksum: 10c0/5be4940a9bf77e711449e0023f1603702b71e9b4cfbac26eb0980061d77bb30b4a2724f67df3e5043621dd77fb861f6db42b704f20dd623ce528f85b409d92ca languageName: node linkType: hard -"@angular-devkit/build-webpack@npm:0.1902.9": - version: 0.1902.9 - resolution: "@angular-devkit/build-webpack@npm:0.1902.9" +"@angular-devkit/build-webpack@npm:0.2000.1": + version: 0.2000.1 + resolution: "@angular-devkit/build-webpack@npm:0.2000.1" dependencies: - "@angular-devkit/architect": "npm:0.1902.9" - rxjs: "npm:7.8.1" + "@angular-devkit/architect": "npm:0.2000.1" + rxjs: "npm:7.8.2" peerDependencies: webpack: ^5.30.0 webpack-dev-server: ^5.0.2 - checksum: 10c0/d684e2ac53d519949dff9829ce013dc12fa9c12bb7708baa61b77f5a18233fe8ae2cd401d980d703b31ff16440885c256cb049f77a54a598399a1b148abb05f0 - languageName: node - linkType: hard - -"@angular-devkit/core@npm:19.1.9": - version: 19.1.9 - resolution: "@angular-devkit/core@npm:19.1.9" - dependencies: - ajv: "npm:8.17.1" - ajv-formats: "npm:3.0.1" - jsonc-parser: "npm:3.3.1" - picomatch: "npm:4.0.2" - rxjs: "npm:7.8.1" - source-map: "npm:0.7.4" - peerDependencies: - chokidar: ^4.0.0 - peerDependenciesMeta: - chokidar: - optional: true - checksum: 10c0/a9a5fadddd58bb0a4b40463bd99c7648e4b67ed3fbbe00c5ddd1eee29fc89dcc78376558c97193bbff76111699a5c73b820cdcf6c9f8bc9fcae182c276f4870b + checksum: 10c0/e8e39f60734dbc0590d5e470b09d7c2d94e2984d89688ade6c8f0e351ee7ff96cba41c228e8e73d26a75892eda0a76f42605b5ed7be27af8485cffcff2e31454 languageName: node linkType: hard -"@angular-devkit/core@npm:19.2.9, @angular-devkit/core@npm:^19.1.1": - version: 19.2.9 - resolution: "@angular-devkit/core@npm:19.2.9" +"@angular-devkit/core@npm:20.0.1, @angular-devkit/core@npm:^20.0.0": + version: 20.0.1 + resolution: "@angular-devkit/core@npm:20.0.1" dependencies: ajv: "npm:8.17.1" ajv-formats: "npm:3.0.1" jsonc-parser: "npm:3.3.1" picomatch: "npm:4.0.2" - rxjs: "npm:7.8.1" + rxjs: "npm:7.8.2" source-map: "npm:0.7.4" peerDependencies: chokidar: ^4.0.0 peerDependenciesMeta: chokidar: optional: true - checksum: 10c0/c1a7fde1d7346ffdf32ad0b8030ad00d2ce5a41abd51f468454fecb23e1590d1fd32272c553d7677501228767181ddc36833a60888464137cfefcc918342c780 + checksum: 10c0/e6f2d1f8702c7076d74d7283e5e474a5227050553ae6776532ffc59607cf47497b329c3506f89b04da59ebf5f7ef2e39486e0812571fb79dd5e1154354b79612 languageName: node linkType: hard -"@angular/animations@npm:^19.1.1": - version: 19.2.8 - resolution: "@angular/animations@npm:19.2.8" +"@angular/animations@npm:^20.0.0": + version: 20.0.2 + resolution: "@angular/animations@npm:20.0.2" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/common": 19.2.8 - "@angular/core": 19.2.8 - checksum: 10c0/8b277abe21e9794adfa04288110acdf70b71e93b0be3d66e3d273e0e143bb8d580abece229cc30cdac9f4a665249f0100a0aefcf9a5faa19e1655b67469ed126 + "@angular/common": 20.0.2 + "@angular/core": 20.0.2 + checksum: 10c0/58af0e07689b9cbb14ee02d4acf2b0947abdeb34dfa75d5d51188428029cb0ec81b74e12aafebe4d9fd1b2b3f08062439caf991135ce7e175b56d2d619bff8f0 languageName: node linkType: hard -"@angular/build@npm:19.2.9": - version: 19.2.9 - resolution: "@angular/build@npm:19.2.9" +"@angular/build@npm:20.0.1": + version: 20.0.1 + resolution: "@angular/build@npm:20.0.1" dependencies: "@ampproject/remapping": "npm:2.3.0" - "@angular-devkit/architect": "npm:0.1902.9" - "@babel/core": "npm:7.26.10" - "@babel/helper-annotate-as-pure": "npm:7.25.9" + "@angular-devkit/architect": "npm:0.2000.1" + "@babel/core": "npm:7.27.1" + "@babel/helper-annotate-as-pure": "npm:7.27.1" "@babel/helper-split-export-declaration": "npm:7.24.7" - "@babel/plugin-syntax-import-attributes": "npm:7.26.0" - "@inquirer/confirm": "npm:5.1.6" - "@vitejs/plugin-basic-ssl": "npm:1.2.0" - beasties: "npm:0.3.2" + "@inquirer/confirm": "npm:5.1.10" + "@vitejs/plugin-basic-ssl": "npm:2.0.0" + beasties: "npm:0.3.4" browserslist: "npm:^4.23.0" - esbuild: "npm:0.25.1" - fast-glob: "npm:3.3.3" + esbuild: "npm:0.25.5" https-proxy-agent: "npm:7.0.6" istanbul-lib-instrument: "npm:6.0.3" - listr2: "npm:8.2.5" - lmdb: "npm:3.2.6" + jsonc-parser: "npm:3.3.1" + listr2: "npm:8.3.3" + lmdb: "npm:3.3.0" magic-string: "npm:0.30.17" mrmime: "npm:2.0.1" - parse5-html-rewriting-stream: "npm:7.0.0" + parse5-html-rewriting-stream: "npm:7.1.0" picomatch: "npm:4.0.2" - piscina: "npm:4.8.0" - rollup: "npm:4.34.8" - sass: "npm:1.85.0" - semver: "npm:7.7.1" + piscina: "npm:5.0.0" + rollup: "npm:4.40.2" + sass: "npm:1.88.0" + semver: "npm:7.7.2" source-map-support: "npm:0.5.21" - vite: "npm:6.2.6" + tinyglobby: "npm:0.2.13" + vite: "npm:6.3.5" watchpack: "npm:2.4.2" peerDependencies: - "@angular/compiler": ^19.0.0 || ^19.2.0-next.0 - "@angular/compiler-cli": ^19.0.0 || ^19.2.0-next.0 - "@angular/localize": ^19.0.0 || ^19.2.0-next.0 - "@angular/platform-server": ^19.0.0 || ^19.2.0-next.0 - "@angular/service-worker": ^19.0.0 || ^19.2.0-next.0 - "@angular/ssr": ^19.2.9 + "@angular/compiler": ^20.0.0 + "@angular/compiler-cli": ^20.0.0 + "@angular/core": ^20.0.0 + "@angular/localize": ^20.0.0 + "@angular/platform-browser": ^20.0.0 + "@angular/platform-server": ^20.0.0 + "@angular/service-worker": ^20.0.0 + "@angular/ssr": ^20.0.1 karma: ^6.4.0 less: ^4.2.0 - ng-packagr: ^19.0.0 || ^19.2.0-next.0 + ng-packagr: ^20.0.0 postcss: ^8.4.0 tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0 - typescript: ">=5.5 <5.9" + tslib: ^2.3.0 + typescript: ">=5.8 <5.9" + vitest: ^3.1.1 dependenciesMeta: lmdb: optional: true peerDependenciesMeta: + "@angular/core": + optional: true "@angular/localize": optional: true + "@angular/platform-browser": + optional: true "@angular/platform-server": optional: true "@angular/service-worker": @@ -296,121 +281,131 @@ __metadata: optional: true tailwindcss: optional: true - checksum: 10c0/65c3ee65d45a51431f6ea0ce4f17d52fd60961850876be408a663dafd0c0c3f28c052b4935ae15b9fd26c6454158c23d23c7c9202ed13b0cbc8f29eeab921620 + vitest: + optional: true + checksum: 10c0/fafe6b15be6ebc4cc39d14a68d80fd8d91a0d46b7903e5cc9d6d9577f4f63e961f6a0f3ecdee6c902c55061e36241194c828c1bcd6f123711f5b2bfa50b41c5e languageName: node linkType: hard -"@angular/common@npm:^19.1.1": - version: 19.2.8 - resolution: "@angular/common@npm:19.2.8" +"@angular/common@npm:^20.0.0": + version: 20.0.2 + resolution: "@angular/common@npm:20.0.2" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/core": 19.2.8 + "@angular/core": 20.0.2 rxjs: ^6.5.3 || ^7.4.0 - checksum: 10c0/ea4469b876f0ff0543a48d8a44d15d57f1dfbea5f6d065cafc81db9370336d2326dbd00e532df77b7724a830e8f34b559011589b0c7b6ce41b98804633dd3f3d + checksum: 10c0/e67fc70351ca771972d06da96175c58535431c06c44a9025b0c0d655b80fe5eae2ba51650932a4706872fdab23d672fbba2b83f0a5551fae36e76003e371bc1b languageName: node linkType: hard -"@angular/compiler-cli@npm:^19.1.1": - version: 19.2.8 - resolution: "@angular/compiler-cli@npm:19.2.8" +"@angular/compiler-cli@npm:^20.0.0": + version: 20.0.2 + resolution: "@angular/compiler-cli@npm:20.0.2" dependencies: - "@babel/core": "npm:7.26.9" + "@babel/core": "npm:7.27.4" "@jridgewell/sourcemap-codec": "npm:^1.4.14" chokidar: "npm:^4.0.0" convert-source-map: "npm:^1.5.1" reflect-metadata: "npm:^0.2.0" semver: "npm:^7.0.0" tslib: "npm:^2.3.0" - yargs: "npm:^17.2.1" + yargs: "npm:^18.0.0" peerDependencies: - "@angular/compiler": 19.2.8 - typescript: ">=5.5 <5.9" + "@angular/compiler": 20.0.2 + typescript: ">=5.8 <5.9" + peerDependenciesMeta: + typescript: + optional: true bin: ng-xi18n: bundles/src/bin/ng_xi18n.js ngc: bundles/src/bin/ngc.js - ngcc: bundles/ngcc/index.js - checksum: 10c0/742aba706f330ef36ce6031087212ee20c62a2d86541050253af6f0acd119066f172bd073215355488053b50dcc6efef7420ce7493fbb143bca59fa5176b7d47 + checksum: 10c0/842e608a0659f3c99681fba55c7558615d4e75a314df77696ab71b4b2b5217051da0c8b1e802632fcb511ac65356a60d9228d55201ecf4b6412062165ec6df07 languageName: node linkType: hard -"@angular/compiler@npm:^19.1.1": - version: 19.2.8 - resolution: "@angular/compiler@npm:19.2.8" +"@angular/compiler@npm:^20.0.0": + version: 20.0.2 + resolution: "@angular/compiler@npm:20.0.2" dependencies: tslib: "npm:^2.3.0" - checksum: 10c0/87692380a34029bbdd92359ce203d9c1b447254d8643a6450c6200e47208de44c10ccea0f75d614c7f2b73975cfa7d84620680881cdff1eb9d280e0d782c3126 + checksum: 10c0/51a7b0ad44fb749a79f0b0b689537974754fee52e0533223b356967dc1f8b7046464843c238d202d9344f8ebace46f06bf8e62daed46bc49cfdaef46e8c65fd0 languageName: node linkType: hard -"@angular/core@npm:^19.1.1": - version: 19.2.8 - resolution: "@angular/core@npm:19.2.8" +"@angular/core@npm:^20.0.0": + version: 20.0.2 + resolution: "@angular/core@npm:20.0.2" dependencies: tslib: "npm:^2.3.0" peerDependencies: + "@angular/compiler": 20.0.2 rxjs: ^6.5.3 || ^7.4.0 zone.js: ~0.15.0 - checksum: 10c0/2757a577de5b4cdbfff0cd9eb6515fa40ce89375bd404f277e019ac52a445c957695c3588570627e22cf700592846d0aabc09b387f07646d880bb81808a54618 + peerDependenciesMeta: + "@angular/compiler": + optional: true + zone.js: + optional: true + checksum: 10c0/a6f74360ab3ed72a519495a6a66ee638f74d33922ef9d4b390113fb8ef7a74dd701e0e956a765c9cbc7d8419c5dbbbffa2a9f397fc017828516de306ff5ac3d6 languageName: node linkType: hard -"@angular/forms@npm:^19.1.1": - version: 19.2.8 - resolution: "@angular/forms@npm:19.2.8" +"@angular/forms@npm:^20.0.0": + version: 20.0.2 + resolution: "@angular/forms@npm:20.0.2" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/common": 19.2.8 - "@angular/core": 19.2.8 - "@angular/platform-browser": 19.2.8 + "@angular/common": 20.0.2 + "@angular/core": 20.0.2 + "@angular/platform-browser": 20.0.2 rxjs: ^6.5.3 || ^7.4.0 - checksum: 10c0/244e1a21a68ce776b75adc8bfa721bf8b1f7b0b3651a7ff6357ba6f2ccf4fd1ee8ab9429c8b11abda019904ae7f3f313d4409eacc19b477c2b4f4dc7bca00d96 + checksum: 10c0/5ef3795649f480830be75ee933537c168740af69c3ee4ea8ee6c2770d47a9c41f9c541282c119d78c85d08ccc8245383afef2e0a4a7d1759def9863d20bade21 languageName: node linkType: hard -"@angular/platform-browser-dynamic@npm:^19.1.1": - version: 19.2.8 - resolution: "@angular/platform-browser-dynamic@npm:19.2.8" +"@angular/platform-browser-dynamic@npm:^20.0.0": + version: 20.0.2 + resolution: "@angular/platform-browser-dynamic@npm:20.0.2" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/common": 19.2.8 - "@angular/compiler": 19.2.8 - "@angular/core": 19.2.8 - "@angular/platform-browser": 19.2.8 - checksum: 10c0/a1b8f0a7591a5e4dbb1c123c4aeb67dcb3a7757f7977b99c83c713f785f1532ce509bf99a84db4cf510689687e97140282232d4ec3e56cb1ed6d117bc452348e + "@angular/common": 20.0.2 + "@angular/compiler": 20.0.2 + "@angular/core": 20.0.2 + "@angular/platform-browser": 20.0.2 + checksum: 10c0/228d0878e5c77f4f466217b012120c13c03248555274246fc30b5dc028befe4b6cccf4dba2cf41888b005a2e22ff9480669c44f5fcf1cfee94c1aeaee202a797 languageName: node linkType: hard -"@angular/platform-browser@npm:^19.1.1": - version: 19.2.8 - resolution: "@angular/platform-browser@npm:19.2.8" +"@angular/platform-browser@npm:^20.0.0": + version: 20.0.2 + resolution: "@angular/platform-browser@npm:20.0.2" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/animations": 19.2.8 - "@angular/common": 19.2.8 - "@angular/core": 19.2.8 + "@angular/animations": 20.0.2 + "@angular/common": 20.0.2 + "@angular/core": 20.0.2 peerDependenciesMeta: "@angular/animations": optional: true - checksum: 10c0/5cd32125d6a5e58bb3fc23c613aacb0f261cee95ca663fb827c9e4d89a2e3182ff9342bc501a04eb38828920889821877d6ca2d304430c6a83dac37cde06a413 + checksum: 10c0/c36335b903b99bed883a3cb151cd358c7d42b2b8432cad372cbd68679184f4d3035fe48575399abac6c81382400219a5adbff265ae8f70db474931942cc1bdab languageName: node linkType: hard -"@angular/router@npm:^19.1.1": - version: 19.2.14 - resolution: "@angular/router@npm:19.2.14" +"@angular/router@npm:^20.0.0": + version: 20.0.2 + resolution: "@angular/router@npm:20.0.2" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/common": 19.2.14 - "@angular/core": 19.2.14 - "@angular/platform-browser": 19.2.14 + "@angular/common": 20.0.2 + "@angular/core": 20.0.2 + "@angular/platform-browser": 20.0.2 rxjs: ^6.5.3 || ^7.4.0 - checksum: 10c0/e70855ba7a88f6f3a69b6540bfaf34673db7d298ddf573e454c57b6a5e5802555dcc3a44a6d93fa75ca4deb71d2e93e832b82df49b6aed32ab84338a8e1b3526 + checksum: 10c0/88896fb3a5f3a398539e471b198a65d8595e6ed2ede18af4aa38231c49275eb9f59ff5488ea002175400896efd995f470e36376ef5947478077504f62aa1f824 languageName: node linkType: hard @@ -436,6 +431,17 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/code-frame@npm:7.27.1" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.27.1" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.1.1" + checksum: 10c0/5dd9a18baa5fce4741ba729acc3a3272c49c25cb8736c4b18e113099520e7ef7b545a4096a26d600e4416157e63e87d66db46aa3fbf0a5f2286da2705c12da00 + languageName: node + linkType: hard + "@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.26.8": version: 7.26.8 resolution: "@babel/compat-data@npm:7.26.8" @@ -443,49 +449,79 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:7.26.10, @babel/core@npm:^7.12.0, @babel/core@npm:^7.18.9, @babel/core@npm:^7.23.0, @babel/core@npm:^7.23.2, @babel/core@npm:^7.23.9, @babel/core@npm:^7.24.4, @babel/core@npm:^7.26.10, @babel/core@npm:^7.26.9, @babel/core@npm:^7.3.4, @babel/core@npm:^7.7.5": - version: 7.26.10 - resolution: "@babel/core@npm:7.26.10" +"@babel/compat-data@npm:^7.27.2": + version: 7.27.5 + resolution: "@babel/compat-data@npm:7.27.5" + checksum: 10c0/da2751fcd0b58eea958f2b2f7ff7d6de1280712b709fa1ad054b73dc7d31f589e353bb50479b9dc96007935f3ed3cada68ac5b45ce93086b7122ddc32e60dc00 + languageName: node + linkType: hard + +"@babel/core@npm:7.27.1": + version: 7.27.1 + resolution: "@babel/core@npm:7.27.1" dependencies: "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.26.2" - "@babel/generator": "npm:^7.26.10" - "@babel/helper-compilation-targets": "npm:^7.26.5" - "@babel/helper-module-transforms": "npm:^7.26.0" - "@babel/helpers": "npm:^7.26.10" - "@babel/parser": "npm:^7.26.10" - "@babel/template": "npm:^7.26.9" - "@babel/traverse": "npm:^7.26.10" - "@babel/types": "npm:^7.26.10" + "@babel/code-frame": "npm:^7.27.1" + "@babel/generator": "npm:^7.27.1" + "@babel/helper-compilation-targets": "npm:^7.27.1" + "@babel/helper-module-transforms": "npm:^7.27.1" + "@babel/helpers": "npm:^7.27.1" + "@babel/parser": "npm:^7.27.1" + "@babel/template": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" + "@babel/types": "npm:^7.27.1" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10c0/e046e0e988ab53841b512ee9d263ca409f6c46e2a999fe53024688b92db394346fa3aeae5ea0866331f62133982eee05a675d22922a4603c3f603aa09a581d62 + checksum: 10c0/0fc31f87f5401ac5d375528cb009f4ea5527fc8c5bb5b64b5b22c033b60fd0ad723388933a5f3f5db14e1edd13c958e9dd7e5c68f9b68c767aeb496199c8a4bb languageName: node linkType: hard -"@babel/core@npm:7.26.9": - version: 7.26.9 - resolution: "@babel/core@npm:7.26.9" +"@babel/core@npm:7.27.4": + version: 7.27.4 + resolution: "@babel/core@npm:7.27.4" + dependencies: + "@ampproject/remapping": "npm:^2.2.0" + "@babel/code-frame": "npm:^7.27.1" + "@babel/generator": "npm:^7.27.3" + "@babel/helper-compilation-targets": "npm:^7.27.2" + "@babel/helper-module-transforms": "npm:^7.27.3" + "@babel/helpers": "npm:^7.27.4" + "@babel/parser": "npm:^7.27.4" + "@babel/template": "npm:^7.27.2" + "@babel/traverse": "npm:^7.27.4" + "@babel/types": "npm:^7.27.3" + convert-source-map: "npm:^2.0.0" + debug: "npm:^4.1.0" + gensync: "npm:^1.0.0-beta.2" + json5: "npm:^2.2.3" + semver: "npm:^6.3.1" + checksum: 10c0/d2d17b106a8d91d3eda754bb3f26b53a12eb7646df73c2b2d2e9b08d90529186bc69e3823f70a96ec6e5719dc2372fb54e14ad499da47ceeb172d2f7008787b5 + languageName: node + linkType: hard + +"@babel/core@npm:^7.12.0, @babel/core@npm:^7.18.9, @babel/core@npm:^7.23.0, @babel/core@npm:^7.23.2, @babel/core@npm:^7.23.9, @babel/core@npm:^7.24.4, @babel/core@npm:^7.26.10, @babel/core@npm:^7.26.9, @babel/core@npm:^7.3.4, @babel/core@npm:^7.7.5": + version: 7.26.10 + resolution: "@babel/core@npm:7.26.10" dependencies: "@ampproject/remapping": "npm:^2.2.0" "@babel/code-frame": "npm:^7.26.2" - "@babel/generator": "npm:^7.26.9" + "@babel/generator": "npm:^7.26.10" "@babel/helper-compilation-targets": "npm:^7.26.5" "@babel/helper-module-transforms": "npm:^7.26.0" - "@babel/helpers": "npm:^7.26.9" - "@babel/parser": "npm:^7.26.9" + "@babel/helpers": "npm:^7.26.10" + "@babel/parser": "npm:^7.26.10" "@babel/template": "npm:^7.26.9" - "@babel/traverse": "npm:^7.26.9" - "@babel/types": "npm:^7.26.9" + "@babel/traverse": "npm:^7.26.10" + "@babel/types": "npm:^7.26.10" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10c0/ed7212ff42a9453765787019b7d191b167afcacd4bd8fec10b055344ef53fa0cc648c9a80159ae4ecf870016a6318731e087042dcb68d1a2a9d34eb290dc014b + checksum: 10c0/e046e0e988ab53841b512ee9d263ca409f6c46e2a999fe53024688b92db394346fa3aeae5ea0866331f62133982eee05a675d22922a4603c3f603aa09a581d62 languageName: node linkType: hard @@ -500,16 +536,16 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:7.26.10": - version: 7.26.10 - resolution: "@babel/generator@npm:7.26.10" +"@babel/generator@npm:7.27.1": + version: 7.27.1 + resolution: "@babel/generator@npm:7.27.1" dependencies: - "@babel/parser": "npm:^7.26.10" - "@babel/types": "npm:^7.26.10" + "@babel/parser": "npm:^7.27.1" + "@babel/types": "npm:^7.27.1" "@jridgewell/gen-mapping": "npm:^0.3.5" "@jridgewell/trace-mapping": "npm:^0.3.25" jsesc: "npm:^3.0.2" - checksum: 10c0/88b3b3ea80592fc89349c4e1a145e1386e4042866d2507298adf452bf972f68d13bf699a845e6ab8c028bd52c2247013eb1221b86e1db5c9779faacba9c4b10e + checksum: 10c0/c4156434b21818f558ebd93ce45f027c53ee570ce55a84fd2d9ba45a79ad204c17e0bff753c886fb6c07df3385445a9e34dc7ccb070d0ac7e80bb91c8b57f423 languageName: node linkType: hard @@ -526,7 +562,29 @@ __metadata: languageName: node linkType: hard -"@babel/helper-annotate-as-pure@npm:7.25.9, @babel/helper-annotate-as-pure@npm:^7.18.6, @babel/helper-annotate-as-pure@npm:^7.25.9": +"@babel/generator@npm:^7.27.1, @babel/generator@npm:^7.27.3": + version: 7.27.5 + resolution: "@babel/generator@npm:7.27.5" + dependencies: + "@babel/parser": "npm:^7.27.5" + "@babel/types": "npm:^7.27.3" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^3.0.2" + checksum: 10c0/8f649ef4cd81765c832bb11de4d6064b035ffebdecde668ba7abee68a7b0bce5c9feabb5dc5bb8aeba5bd9e5c2afa3899d852d2bd9ca77a711ba8c8379f416f0 + languageName: node + linkType: hard + +"@babel/helper-annotate-as-pure@npm:7.27.1": + version: 7.27.1 + resolution: "@babel/helper-annotate-as-pure@npm:7.27.1" + dependencies: + "@babel/types": "npm:^7.27.1" + checksum: 10c0/fc4751b59c8f5417e1acb0455d6ffce53fa5e79b3aca690299fbbf73b1b65bfaef3d4a18abceb190024c5836bb6cfbc3711e83888648df93df54e18152a1196c + languageName: node + linkType: hard + +"@babel/helper-annotate-as-pure@npm:^7.18.6, @babel/helper-annotate-as-pure@npm:^7.25.9": version: 7.25.9 resolution: "@babel/helper-annotate-as-pure@npm:7.25.9" dependencies: @@ -535,6 +593,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-annotate-as-pure@npm:^7.27.1": + version: 7.27.3 + resolution: "@babel/helper-annotate-as-pure@npm:7.27.3" + dependencies: + "@babel/types": "npm:^7.27.3" + checksum: 10c0/94996ce0a05b7229f956033e6dcd69393db2b0886d0db6aff41e704390402b8cdcca11f61449cb4f86cfd9e61b5ad3a73e4fa661eeed7846b125bd1c33dbc633 + languageName: node + linkType: hard + "@babel/helper-compilation-targets@npm:^7.12.0, @babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.25.9, @babel/helper-compilation-targets@npm:^7.26.5": version: 7.27.0 resolution: "@babel/helper-compilation-targets@npm:7.27.0" @@ -548,6 +615,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-compilation-targets@npm:^7.27.1, @babel/helper-compilation-targets@npm:^7.27.2": + version: 7.27.2 + resolution: "@babel/helper-compilation-targets@npm:7.27.2" + dependencies: + "@babel/compat-data": "npm:^7.27.2" + "@babel/helper-validator-option": "npm:^7.27.1" + browserslist: "npm:^4.24.0" + lru-cache: "npm:^5.1.1" + semver: "npm:^6.3.1" + checksum: 10c0/f338fa00dcfea931804a7c55d1a1c81b6f0a09787e528ec580d5c21b3ecb3913f6cb0f361368973ce953b824d910d3ac3e8a8ee15192710d3563826447193ad1 + languageName: node + linkType: hard + "@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.21.0, @babel/helper-create-class-features-plugin@npm:^7.25.9, @babel/helper-create-class-features-plugin@npm:^7.27.0": version: 7.27.0 resolution: "@babel/helper-create-class-features-plugin@npm:7.27.0" @@ -565,6 +645,23 @@ __metadata: languageName: node linkType: hard +"@babel/helper-create-class-features-plugin@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-create-class-features-plugin@npm:7.27.1" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.27.1" + "@babel/helper-member-expression-to-functions": "npm:^7.27.1" + "@babel/helper-optimise-call-expression": "npm:^7.27.1" + "@babel/helper-replace-supers": "npm:^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/4ee199671d6b9bdd4988aa2eea4bdced9a73abfc831d81b00c7634f49a8fc271b3ceda01c067af58018eb720c6151322015d463abea7072a368ee13f35adbb4c + languageName: node + linkType: hard + "@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.25.9": version: 7.27.0 resolution: "@babel/helper-create-regexp-features-plugin@npm:7.27.0" @@ -578,6 +675,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-create-regexp-features-plugin@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.27.1" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.27.1" + regexpu-core: "npm:^6.2.0" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/591fe8bd3bb39679cc49588889b83bd628d8c4b99c55bafa81e80b1e605a348b64da955e3fd891c4ba3f36fd015367ba2eadea22af6a7de1610fbb5bcc2d3df0 + languageName: node + linkType: hard + "@babel/helper-define-polyfill-provider@npm:^0.6.3, @babel/helper-define-polyfill-provider@npm:^0.6.4": version: 0.6.4 resolution: "@babel/helper-define-polyfill-provider@npm:0.6.4" @@ -631,6 +741,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-member-expression-to-functions@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-member-expression-to-functions@npm:7.27.1" + dependencies: + "@babel/traverse": "npm:^7.27.1" + "@babel/types": "npm:^7.27.1" + checksum: 10c0/5762ad009b6a3d8b0e6e79ff6011b3b8fdda0fefad56cfa8bfbe6aa02d5a8a8a9680a45748fe3ac47e735a03d2d88c0a676e3f9f59f20ae9fadcc8d51ccd5a53 + languageName: node + linkType: hard + "@babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.25.9, @babel/helper-module-imports@npm:^7.8.3": version: 7.25.9 resolution: "@babel/helper-module-imports@npm:7.25.9" @@ -641,6 +761,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-imports@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-module-imports@npm:7.27.1" + dependencies: + "@babel/traverse": "npm:^7.27.1" + "@babel/types": "npm:^7.27.1" + checksum: 10c0/e00aace096e4e29290ff8648455c2bc4ed982f0d61dbf2db1b5e750b9b98f318bf5788d75a4f974c151bd318fd549e81dbcab595f46b14b81c12eda3023f51e8 + languageName: node + linkType: hard + "@babel/helper-module-transforms@npm:^7.25.9, @babel/helper-module-transforms@npm:^7.26.0": version: 7.26.0 resolution: "@babel/helper-module-transforms@npm:7.26.0" @@ -654,6 +784,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-transforms@npm:^7.27.1, @babel/helper-module-transforms@npm:^7.27.3": + version: 7.27.3 + resolution: "@babel/helper-module-transforms@npm:7.27.3" + dependencies: + "@babel/helper-module-imports": "npm:^7.27.1" + "@babel/helper-validator-identifier": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.3" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/fccb4f512a13b4c069af51e1b56b20f54024bcf1591e31e978a30f3502567f34f90a80da6a19a6148c249216292a8074a0121f9e52602510ef0f32dbce95ca01 + languageName: node + linkType: hard + "@babel/helper-optimise-call-expression@npm:^7.25.9": version: 7.25.9 resolution: "@babel/helper-optimise-call-expression@npm:7.25.9" @@ -663,6 +806,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-optimise-call-expression@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-optimise-call-expression@npm:7.27.1" + dependencies: + "@babel/types": "npm:^7.27.1" + checksum: 10c0/6b861e7fcf6031b9c9fc2de3cd6c005e94a459d6caf3621d93346b52774925800ca29d4f64595a5ceacf4d161eb0d27649ae385110ed69491d9776686fa488e6 + languageName: node + linkType: hard + "@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.20.2, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.25.9, @babel/helper-plugin-utils@npm:^7.26.5, @babel/helper-plugin-utils@npm:^7.8.0": version: 7.26.5 resolution: "@babel/helper-plugin-utils@npm:7.26.5" @@ -670,6 +822,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-plugin-utils@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-plugin-utils@npm:7.27.1" + checksum: 10c0/94cf22c81a0c11a09b197b41ab488d416ff62254ce13c57e62912c85700dc2e99e555225787a4099ff6bae7a1812d622c80fbaeda824b79baa10a6c5ac4cf69b + languageName: node + linkType: hard + "@babel/helper-remap-async-to-generator@npm:^7.25.9": version: 7.25.9 resolution: "@babel/helper-remap-async-to-generator@npm:7.25.9" @@ -683,6 +842,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-remap-async-to-generator@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-remap-async-to-generator@npm:7.27.1" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.27.1" + "@babel/helper-wrap-function": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/5ba6258f4bb57c7c9fa76b55f416b2d18c867b48c1af4f9f2f7cd7cc933fe6da7514811d08ceb4972f1493be46f4b69c40282b811d1397403febae13c2ec57b5 + languageName: node + linkType: hard + "@babel/helper-replace-supers@npm:^7.25.9, @babel/helper-replace-supers@npm:^7.26.5": version: 7.26.5 resolution: "@babel/helper-replace-supers@npm:7.26.5" @@ -696,6 +868,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-replace-supers@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-replace-supers@npm:7.27.1" + dependencies: + "@babel/helper-member-expression-to-functions": "npm:^7.27.1" + "@babel/helper-optimise-call-expression": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/4f2eaaf5fcc196580221a7ccd0f8873447b5d52745ad4096418f6101a1d2e712e9f93722c9a32bc9769a1dc197e001f60d6f5438d4dfde4b9c6a9e4df719354c + languageName: node + linkType: hard + "@babel/helper-skip-transparent-expression-wrappers@npm:^7.25.9": version: 7.25.9 resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.25.9" @@ -706,6 +891,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.27.1" + dependencies: + "@babel/traverse": "npm:^7.27.1" + "@babel/types": "npm:^7.27.1" + checksum: 10c0/f625013bcdea422c470223a2614e90d2c1cc9d832e97f32ca1b4f82b34bb4aa67c3904cb4b116375d3b5b753acfb3951ed50835a1e832e7225295c7b0c24dff7 + languageName: node + linkType: hard + "@babel/helper-split-export-declaration@npm:7.24.7, @babel/helper-split-export-declaration@npm:^7.22.6": version: 7.24.7 resolution: "@babel/helper-split-export-declaration@npm:7.24.7" @@ -722,6 +917,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-string-parser@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-string-parser@npm:7.27.1" + checksum: 10c0/8bda3448e07b5583727c103560bcf9c4c24b3c1051a4c516d4050ef69df37bb9a4734a585fe12725b8c2763de0a265aa1e909b485a4e3270b7cfd3e4dbe4b602 + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.16.7, @babel/helper-validator-identifier@npm:^7.25.9": version: 7.25.9 resolution: "@babel/helper-validator-identifier@npm:7.25.9" @@ -729,6 +931,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-identifier@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-validator-identifier@npm:7.27.1" + checksum: 10c0/c558f11c4871d526498e49d07a84752d1800bf72ac0d3dad100309a2eaba24efbf56ea59af5137ff15e3a00280ebe588560534b0e894a4750f8b1411d8f78b84 + languageName: node + linkType: hard + "@babel/helper-validator-option@npm:^7.25.9": version: 7.25.9 resolution: "@babel/helper-validator-option@npm:7.25.9" @@ -736,6 +945,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-option@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-validator-option@npm:7.27.1" + checksum: 10c0/6fec5f006eba40001a20f26b1ef5dbbda377b7b68c8ad518c05baa9af3f396e780bdfded24c4eef95d14bb7b8fd56192a6ed38d5d439b97d10efc5f1a191d148 + languageName: node + linkType: hard + "@babel/helper-wrap-function@npm:^7.25.9": version: 7.25.9 resolution: "@babel/helper-wrap-function@npm:7.25.9" @@ -747,7 +963,18 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.26.10, @babel/helpers@npm:^7.26.9": +"@babel/helper-wrap-function@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-wrap-function@npm:7.27.1" + dependencies: + "@babel/template": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" + "@babel/types": "npm:^7.27.1" + checksum: 10c0/c472f75c0951bc657ab0a117538c7c116566ae7579ed47ac3f572c42dc78bd6f1e18f52ebe80d38300c991c3fcaa06979e2f8864ee919369dabd59072288de30 + languageName: node + linkType: hard + +"@babel/helpers@npm:^7.26.10": version: 7.27.0 resolution: "@babel/helpers@npm:7.27.0" dependencies: @@ -757,6 +984,16 @@ __metadata: languageName: node linkType: hard +"@babel/helpers@npm:^7.27.1, @babel/helpers@npm:^7.27.4": + version: 7.27.6 + resolution: "@babel/helpers@npm:7.27.6" + dependencies: + "@babel/template": "npm:^7.27.2" + "@babel/types": "npm:^7.27.6" + checksum: 10c0/448bac96ef8b0f21f2294a826df9de6bf4026fd023f8a6bb6c782fe3e61946801ca24381490b8e58d861fee75cd695a1882921afbf1f53b0275ee68c938bd6d3 + languageName: node + linkType: hard + "@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.5, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.22.5, @babel/parser@npm:^7.23.0, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.7, @babel/parser@npm:^7.25.3, @babel/parser@npm:^7.25.4, @babel/parser@npm:^7.26.10, @babel/parser@npm:^7.26.9, @babel/parser@npm:^7.27.0, @babel/parser@npm:^7.4.5, @babel/parser@npm:^7.6.0, @babel/parser@npm:^7.9.6": version: 7.27.0 resolution: "@babel/parser@npm:7.27.0" @@ -768,6 +1005,17 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.27.1, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.27.4, @babel/parser@npm:^7.27.5": + version: 7.27.5 + resolution: "@babel/parser@npm:7.27.5" + dependencies: + "@babel/types": "npm:^7.27.3" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/f7faaebf21cc1f25d9ca8ac02c447ed38ef3460ea95be7ea760916dcf529476340d72a5a6010c6641d9ed9d12ad827c8424840277ec2295c5b082ba0f291220a + languageName: node + linkType: hard + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.25.9" @@ -780,6 +1028,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/7dfffa978ae1cd179641a7c4b4ad688c6828c2c58ec96b118c2fb10bc3715223de6b88bff1ebff67056bb5fccc568ae773e3b83c592a1b843423319f80c99ebd + languageName: node + linkType: hard + "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.25.9" @@ -791,6 +1051,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/2cd7a55a856e5e59bbd9484247c092a41e0d9f966778e7019da324d9e0928892d26afc4fbb2ac3d76a3c5a631cd3cf0d72dd2653b44f634f6c663b9e6f80aacd + languageName: node + linkType: hard + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.25.9" @@ -802,6 +1073,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/cf29835498c4a25bd470908528919729a0799b2ec94e89004929a5532c94a5e4b1a49bc5d6673a22e5afe05d08465873e14ee3b28c42eb3db489cdf5ca47c680 + languageName: node + linkType: hard + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.25.9" @@ -815,6 +1097,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" + "@babel/plugin-transform-optional-chaining": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.13.0 + checksum: 10c0/eddcd056f76e198868cbff883eb148acfade8f0890973ab545295df0c08e39573a72e65372bcc0b0bfadba1b043fe1aea6b0907d0b4889453ac154c404194ebc + languageName: node + linkType: hard + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.25.9" @@ -827,6 +1122,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/b94e6c3fc019e988b1499490829c327a1067b4ddea8ad402f6d0554793c9124148c2125338c723661b6dff040951abc1f092afbf3f2d234319cd580b68e52445 + languageName: node + linkType: hard + "@babel/plugin-proposal-class-properties@npm:^7.16.5": version: 7.18.6 resolution: "@babel/plugin-proposal-class-properties@npm:7.18.6" @@ -942,7 +1249,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-import-attributes@npm:7.26.0, @babel/plugin-syntax-import-attributes@npm:^7.26.0": +"@babel/plugin-syntax-import-assertions@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/06a954ee672f7a7c44d52b6e55598da43a7064e80df219765c51c37a0692641277e90411028f7cae4f4d1dedeed084f0c453576fa421c35a81f1603c5e3e0146 + languageName: node + linkType: hard + +"@babel/plugin-syntax-import-attributes@npm:^7.26.0": version: 7.26.0 resolution: "@babel/plugin-syntax-import-attributes@npm:7.26.0" dependencies: @@ -953,6 +1271,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-import-attributes@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/e66f7a761b8360419bbb93ab67d87c8a97465ef4637a985ff682ce7ba6918b34b29d81190204cf908d0933058ee7b42737423cd8a999546c21b3aabad4affa9a + languageName: node + linkType: hard + "@babel/plugin-syntax-jsx@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-syntax-jsx@npm:7.25.9" @@ -1009,7 +1338,31 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:7.26.8, @babel/plugin-transform-async-generator-functions@npm:^7.26.8": +"@babel/plugin-transform-arrow-functions@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/19abd7a7d11eef58c9340408a4c2594503f6c4eaea1baa7b0e5fbdda89df097e50663edb3448ad2300170b39efca98a75e5767af05cad3b0facb4944326896a3 + languageName: node + linkType: hard + +"@babel/plugin-transform-async-generator-functions@npm:7.27.1, @babel/plugin-transform-async-generator-functions@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-remap-async-to-generator": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/772e449c69ee42a466443acefb07083bd89efb1a1d95679a4dc99ea3be9d8a3c43a2b74d2da95d7c818e9dd9e0b72bfa7c03217a1feaf108f21b7e542f0943c0 + languageName: node + linkType: hard + +"@babel/plugin-transform-async-generator-functions@npm:^7.26.8": version: 7.26.8 resolution: "@babel/plugin-transform-async-generator-functions@npm:7.26.8" dependencies: @@ -1022,7 +1375,20 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-async-to-generator@npm:7.25.9, @babel/plugin-transform-async-to-generator@npm:^7.25.9": +"@babel/plugin-transform-async-to-generator@npm:7.27.1, @babel/plugin-transform-async-to-generator@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.27.1" + dependencies: + "@babel/helper-module-imports": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-remap-async-to-generator": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/e76b1f6f9c3bbf72e17d7639406d47f09481806de4db99a8de375a0bb40957ea309b20aa705f0c25ab1d7c845e3f365af67eafa368034521151a0e352a03ef2f + languageName: node + linkType: hard + +"@babel/plugin-transform-async-to-generator@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-async-to-generator@npm:7.25.9" dependencies: @@ -1046,6 +1412,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-block-scoped-functions@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/3313130ba3bf0699baad0e60da1c8c3c2f0c2c0a7039cd0063e54e72e739c33f1baadfc9d8c73b3fea8c85dd7250c3964fb09c8e1fa62ba0b24a9fefe0a8dbde + languageName: node + linkType: hard + "@babel/plugin-transform-block-scoping@npm:^7.25.9, @babel/plugin-transform-block-scoping@npm:^7.8.3": version: 7.27.0 resolution: "@babel/plugin-transform-block-scoping@npm:7.27.0" @@ -1057,6 +1434,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-block-scoping@npm:^7.27.1": + version: 7.27.5 + resolution: "@babel/plugin-transform-block-scoping@npm:7.27.5" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/5c1a61f312f18d3807c4df25868161301a7bd0807092b86951fa6b9918e07ee382d58d61a204c3f9ad0b72b8f6f1d18586f8e485c355a3e959c26a070397e95e + languageName: node + linkType: hard + "@babel/plugin-transform-class-properties@npm:^7.22.5, @babel/plugin-transform-class-properties@npm:^7.24.1, @babel/plugin-transform-class-properties@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-class-properties@npm:7.25.9" @@ -1069,6 +1457,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-class-properties@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-class-properties@npm:7.27.1" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/cc0662633c0fe6df95819fef223506ddf26c369c8d64ab21a728d9007ec866bf9436a253909819216c24a82186b6ccbc1ec94d7aaf3f82df227c7c02fa6a704b + languageName: node + linkType: hard + "@babel/plugin-transform-class-static-block@npm:^7.26.0": version: 7.26.0 resolution: "@babel/plugin-transform-class-static-block@npm:7.26.0" @@ -1081,8 +1481,20 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.25.9": - version: 7.25.9 +"@babel/plugin-transform-class-static-block@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-class-static-block@npm:7.27.1" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.12.0 + checksum: 10c0/396997dd81fc1cf242b921e337d25089d6b9dc3596e81322ff11a6359326dc44f2f8b82dcc279c2e514cafaf8964dc7ed39e9fab4b8af1308b57387d111f6a20 + languageName: node + linkType: hard + +"@babel/plugin-transform-classes@npm:^7.25.9": + version: 7.25.9 resolution: "@babel/plugin-transform-classes@npm:7.25.9" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.25.9" @@ -1097,6 +1509,22 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-classes@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-classes@npm:7.27.1" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.27.1" + "@babel/helper-compilation-targets": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-replace-supers": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" + globals: "npm:^11.1.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/1071f4cb1ed5deb5e6f8d0442f2293a540cac5caa5ab3c25ad0571aadcbf961f61e26d367a67894976165a543e02f3a19e40b63b909afbed6e710801a590635c + languageName: node + linkType: hard + "@babel/plugin-transform-computed-properties@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-computed-properties@npm:7.25.9" @@ -1109,6 +1537,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-computed-properties@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-computed-properties@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/template": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/e09a12f8c8ae0e6a6144c102956947b4ec05f6c844169121d0ec4529c2d30ad1dc59fee67736193b87a402f44552c888a519a680a31853bdb4d34788c28af3b0 + languageName: node + linkType: hard + "@babel/plugin-transform-destructuring@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-destructuring@npm:7.25.9" @@ -1120,6 +1560,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-destructuring@npm:^7.27.1, @babel/plugin-transform-destructuring@npm:^7.27.3": + version: 7.27.3 + resolution: "@babel/plugin-transform-destructuring@npm:7.27.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/f8ac96deef6f9a4cb1dff148dfa2a43116ca1c48434bba433964498c4ef5cef5557693b47463e64a71ffaaf10191c7fab0270844e8dbdc47dc4d120435025df5 + languageName: node + linkType: hard + "@babel/plugin-transform-dotall-regex@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-dotall-regex@npm:7.25.9" @@ -1132,6 +1583,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-dotall-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.27.1" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/f9caddfad9a551b4dabe0dcb7c040f458fbaaa7bbb44200c20198b32c8259be8e050e58d2c853fdac901a4cfe490b86aa857036d8d461b192dd010d0e242dedb + languageName: node + linkType: hard + "@babel/plugin-transform-duplicate-keys@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-duplicate-keys@npm:7.25.9" @@ -1143,6 +1606,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-duplicate-keys@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/22a822e5342b7066f83eaedc4fd9bb044ac6bc68725484690b33ba04a7104980e43ea3229de439286cb8db8e7db4a865733a3f05123ab58a10f189f03553746f + languageName: node + linkType: hard + "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.25.9" @@ -1155,6 +1629,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.27.1" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/121502a252b3206913e1e990a47fea34397b4cbf7804d4cd872d45961bc45b603423f60ca87f3a3023a62528f5feb475ac1c9ec76096899ec182fcb135eba375 + languageName: node + linkType: hard + "@babel/plugin-transform-dynamic-import@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-dynamic-import@npm:7.25.9" @@ -1166,6 +1652,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-dynamic-import@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/8dcd3087aca134b064fc361d2cc34eec1f900f6be039b6368104afcef10bb75dea726bb18cabd046716b89b0edaa771f50189fa16bc5c5914a38cbcf166350f7 + languageName: node + linkType: hard + "@babel/plugin-transform-exponentiation-operator@npm:^7.26.3": version: 7.26.3 resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.26.3" @@ -1177,6 +1674,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-exponentiation-operator@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/953d21e01fed76da8e08fb5094cade7bf8927c1bb79301916bec2db0593b41dbcfbca1024ad5db886b72208a93ada8f57a219525aad048cf15814eeb65cf760d + languageName: node + linkType: hard + "@babel/plugin-transform-export-namespace-from@npm:^7.24.1, @babel/plugin-transform-export-namespace-from@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-export-namespace-from@npm:7.25.9" @@ -1188,6 +1696,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-export-namespace-from@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/d7165cad11f571a54c8d9263d6c6bf2b817aff4874f747cb51e6e49efb32f2c9b37a6850cdb5e3b81e0b638141bb77dc782a6ec1a94128859fbdf7767581e07c + languageName: node + linkType: hard + "@babel/plugin-transform-flow-strip-types@npm:^7.25.9": version: 7.26.5 resolution: "@babel/plugin-transform-flow-strip-types@npm:7.26.5" @@ -1212,6 +1731,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-for-of@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-for-of@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/4635763173a23aae24480681f2b0996b4f54a0cb2368880301a1801638242e263132d1e8adbe112ab272913d1d900ee0d6f7dea79443aef9d3325168cd88b3fb + languageName: node + linkType: hard + "@babel/plugin-transform-function-name@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-function-name@npm:7.25.9" @@ -1225,6 +1756,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-function-name@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-function-name@npm:7.27.1" + dependencies: + "@babel/helper-compilation-targets": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/5abdc7b5945fbd807269dcc6e76e52b69235056023b0b35d311e8f5dfd6c09d9f225839798998fc3b663f50cf701457ddb76517025a0d7a5474f3fe56e567a4c + languageName: node + linkType: hard + "@babel/plugin-transform-json-strings@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-json-strings@npm:7.25.9" @@ -1236,6 +1780,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-json-strings@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-json-strings@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/2379714aca025516452a7c1afa1ca42a22b9b51a5050a653cc6198a51665ab82bdecf36106d32d731512706a1e373c5637f5ff635737319aa42f3827da2326d6 + languageName: node + linkType: hard + "@babel/plugin-transform-literals@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-literals@npm:7.25.9" @@ -1247,6 +1802,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-literals@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-literals@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/c40dc3eb2f45a92ee476412314a40e471af51a0f51a24e91b85cef5fc59f4fe06758088f541643f07f949d2c67ee7bdce10e11c5ec56791ae09b15c3b451eeca + languageName: node + linkType: hard + "@babel/plugin-transform-logical-assignment-operators@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.25.9" @@ -1258,6 +1824,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-logical-assignment-operators@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/5b0abc7c0d09d562bf555c646dce63a30288e5db46fd2ce809a61d064415da6efc3b2b3c59b8e4fe98accd072c89a2f7c3765b400e4bf488651735d314d9feeb + languageName: node + linkType: hard + "@babel/plugin-transform-member-expression-literals@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-member-expression-literals@npm:7.25.9" @@ -1269,6 +1846,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-member-expression-literals@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/0874ccebbd1c6a155e5f6b3b29729fade1221b73152567c1af1e1a7c12848004dffecbd7eded6dc463955120040ae57c17cb586b53fb5a7a27fcd88177034c30 + languageName: node + linkType: hard + "@babel/plugin-transform-modules-amd@npm:^7.13.0, @babel/plugin-transform-modules-amd@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-modules-amd@npm:7.25.9" @@ -1281,6 +1869,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-amd@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-modules-amd@npm:7.27.1" + dependencies: + "@babel/helper-module-transforms": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/76e86cd278b6a3c5b8cca8dfb3428e9cd0c81a5df7096e04c783c506696b916a9561386d610a9d846ef64804640e0bd818ea47455fed0ee89b7f66c555b29537 + languageName: node + linkType: hard + "@babel/plugin-transform-modules-commonjs@npm:^7.23.0, @babel/plugin-transform-modules-commonjs@npm:^7.26.3": version: 7.26.3 resolution: "@babel/plugin-transform-modules-commonjs@npm:7.26.3" @@ -1293,6 +1893,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-commonjs@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.27.1" + dependencies: + "@babel/helper-module-transforms": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/4def972dcd23375a266ea1189115a4ff61744b2c9366fc1de648b3fab2c650faf1a94092de93a33ff18858d2e6c4dddeeee5384cb42ba0129baeab01a5cdf1e2 + languageName: node + linkType: hard + "@babel/plugin-transform-modules-systemjs@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-modules-systemjs@npm:7.25.9" @@ -1307,6 +1919,20 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-systemjs@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.27.1" + dependencies: + "@babel/helper-module-transforms": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-validator-identifier": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/f16fca62d144d9cbf558e7b5f83e13bb6d0f21fdeff3024b0cecd42ffdec0b4151461da42bd0963512783ece31aafa5ffe03446b4869220ddd095b24d414e2b5 + languageName: node + linkType: hard + "@babel/plugin-transform-modules-umd@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-modules-umd@npm:7.25.9" @@ -1319,6 +1945,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-umd@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-modules-umd@npm:7.27.1" + dependencies: + "@babel/helper-module-transforms": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/e5962a8874889da2ab1aa32eb93ec21d419c7423c766e4befb39b4bb512b9ad44b47837b6cd1c8f1065445cbbcc6dc2be10298ac6e734e5ca1059fc23698daed + languageName: node + linkType: hard + "@babel/plugin-transform-named-capturing-groups-regex@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.25.9" @@ -1331,6 +1969,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.27.1" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/8eaa8c9aee00a00f3bd8bd8b561d3f569644d98cb2cfe3026d7398aabf9b29afd62f24f142b4112fa1f572d9b0e1928291b099cde59f56d6b59f4d565e58abf2 + languageName: node + linkType: hard + "@babel/plugin-transform-new-target@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-new-target@npm:7.25.9" @@ -1342,6 +1992,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-new-target@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-new-target@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/9b0581412fcc5ab1b9a2d86a0c5407bd959391f0a1e77a46953fef9f7a57f3f4020d75f71098c5f9e5dcc680a87f9fd99b3205ab12e25ef8c19eed038c1e4b28 + languageName: node + linkType: hard + "@babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.11, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.26.6": version: 7.26.6 resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.26.6" @@ -1353,6 +2014,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/a435fc03aaa65c6ef8e99b2d61af0994eb5cdd4a28562d78c3b0b0228ca7e501aa255e1dff091a6996d7d3ea808eb5a65fd50ecd28dfb10687a8a1095dcadc7a + languageName: node + linkType: hard + "@babel/plugin-transform-numeric-separator@npm:^7.24.1, @babel/plugin-transform-numeric-separator@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-numeric-separator@npm:7.25.9" @@ -1364,6 +2036,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-numeric-separator@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/b72cbebbfe46fcf319504edc1cf59f3f41c992dd6840db766367f6a1d232cd2c52143c5eaf57e0316710bee251cae94be97c6d646b5022fcd9274ccb131b470c + languageName: node + linkType: hard + "@babel/plugin-transform-object-assign@npm:^7.8.3": version: 7.25.9 resolution: "@babel/plugin-transform-object-assign@npm:7.25.9" @@ -1388,6 +2071,20 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-object-rest-spread@npm:^7.27.2": + version: 7.27.3 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.27.3" + dependencies: + "@babel/helper-compilation-targets": "npm:^7.27.2" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/plugin-transform-destructuring": "npm:^7.27.3" + "@babel/plugin-transform-parameters": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/f2d04f59f773a9480bbaabd082fecdb5fb2b6ae5e77147ae8df34a8b773b6148d0c4260d2beaa4755eb5f548a105f2069124b9cea96f9387128656cbb0730ee4 + languageName: node + linkType: hard + "@babel/plugin-transform-object-super@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-object-super@npm:7.25.9" @@ -1400,6 +2097,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-object-super@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-object-super@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-replace-supers": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/efa2d092ef55105deb06d30aff4e460c57779b94861188128489b72378bf1f0ab0f06a4a4d68b9ae2a59a79719fbb2d148b9a3dca19ceff9c73b1f1a95e0527c + languageName: node + linkType: hard + "@babel/plugin-transform-optional-catch-binding@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.25.9" @@ -1411,6 +2120,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-optional-catch-binding@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/807a4330f1fac08e2682d57bc82e714868fc651c8876f9a8b3a3fd8f53c129e87371f8243e712ac7dae11e090b737a2219a02fe1b6459a29e664fa073c3277bb + languageName: node + linkType: hard + "@babel/plugin-transform-optional-chaining@npm:^7.23.0, @babel/plugin-transform-optional-chaining@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-optional-chaining@npm:7.25.9" @@ -1423,6 +2143,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-optional-chaining@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/5b18ff5124e503f0a25d6b195be7351a028b3992d6f2a91fb4037e2a2c386400d66bc1df8f6df0a94c708524f318729e81a95c41906e5a7919a06a43e573a525 + languageName: node + linkType: hard + "@babel/plugin-transform-parameters@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-parameters@npm:7.25.9" @@ -1434,6 +2166,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-parameters@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-parameters@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/453a9618735eeff5551d4c7f02c250606586fe1dd210ec9f69a4f15629ace180cd944339ebff2b0f11e1a40567d83a229ba1c567620e70b2ebedea576e12196a + languageName: node + linkType: hard + "@babel/plugin-transform-private-methods@npm:^7.22.5, @babel/plugin-transform-private-methods@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-private-methods@npm:7.25.9" @@ -1446,6 +2189,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-private-methods@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-private-methods@npm:7.27.1" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/232bedfe9d28df215fb03cc7623bdde468b1246bdd6dc24465ff4bf9cc5f5a256ae33daea1fafa6cc59705e4d29da9024bb79baccaa5cd92811ac5db9b9244f2 + languageName: node + linkType: hard + "@babel/plugin-transform-private-property-in-object@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-private-property-in-object@npm:7.25.9" @@ -1459,6 +2214,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-private-property-in-object@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.27.1" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.27.1" + "@babel/helper-create-class-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/a8c4536273ca716dcc98e74ea25ca76431528554922f184392be3ddaf1761d4aa0e06f1311577755bd1613f7054fb51d29de2ada1130f743d329170a1aa1fe56 + languageName: node + linkType: hard + "@babel/plugin-transform-property-literals@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-property-literals@npm:7.25.9" @@ -1470,6 +2238,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-property-literals@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-property-literals@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/15713a87edd6db620d6e66eb551b4fbfff5b8232c460c7c76cedf98efdc5cd21080c97040231e19e06594c6d7dfa66e1ab3d0951e29d5814fb25e813f6d6209c + languageName: node + linkType: hard + "@babel/plugin-transform-react-display-name@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-react-display-name@npm:7.25.9" @@ -1553,6 +2332,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-regenerator@npm:^7.27.1": + version: 7.27.5 + resolution: "@babel/plugin-transform-regenerator@npm:7.27.5" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/4ace8ced76b421cd44dd9fa08bebc2f3fd76ec84e532cd1027738f411afdbc239789edd6c96dd1db412fc4a42cead5c1ac98a8aef94f35102f5de1049e64c07a + languageName: node + linkType: hard + "@babel/plugin-transform-regexp-modifiers@npm:^7.26.0": version: 7.26.0 resolution: "@babel/plugin-transform-regexp-modifiers@npm:7.26.0" @@ -1565,6 +2355,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-regexp-modifiers@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-regexp-modifiers@npm:7.27.1" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/31ae596ab56751cf43468a6c0a9d6bc3521d306d2bee9c6957cdb64bea53812ce24bd13a32f766150d62b737bca5b0650b2c62db379382fff0dccbf076055c33 + languageName: node + linkType: hard + "@babel/plugin-transform-reserved-words@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-reserved-words@npm:7.25.9" @@ -1576,7 +2378,34 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-runtime@npm:7.26.10, @babel/plugin-transform-runtime@npm:^7.13.9, @babel/plugin-transform-runtime@npm:^7.23.2, @babel/plugin-transform-runtime@npm:^7.24.3": +"@babel/plugin-transform-reserved-words@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-reserved-words@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/e1a87691cce21a644a474d7c9a8107d4486c062957be32042d40f0a3d0cc66e00a3150989655019c255ff020d2640ac16aaf544792717d586f219f3bad295567 + languageName: node + linkType: hard + +"@babel/plugin-transform-runtime@npm:7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-runtime@npm:7.27.1" + dependencies: + "@babel/helper-module-imports": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + babel-plugin-polyfill-corejs2: "npm:^0.4.10" + babel-plugin-polyfill-corejs3: "npm:^0.11.0" + babel-plugin-polyfill-regenerator: "npm:^0.6.1" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/7abbae60a6441ba8546dee3fcbc00b38038304250ba2419adaf0c76267bff43420ff75b7049003a24a829e01d9fde2ac8a422352af6d88aebd31996a83f04c2f + languageName: node + linkType: hard + +"@babel/plugin-transform-runtime@npm:^7.13.9, @babel/plugin-transform-runtime@npm:^7.23.2, @babel/plugin-transform-runtime@npm:^7.24.3": version: 7.26.10 resolution: "@babel/plugin-transform-runtime@npm:7.26.10" dependencies: @@ -1603,6 +2432,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-shorthand-properties@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/bd5544b89520a22c41a6df5ddac9039821d3334c0ef364d18b0ba9674c5071c223bcc98be5867dc3865cb10796882b7594e2c40dedaff38e1b1273913fe353e1 + languageName: node + linkType: hard + "@babel/plugin-transform-spread@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-spread@npm:7.25.9" @@ -1615,6 +2455,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-spread@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-spread@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/b34fc58b33bd35b47d67416655c2cbc8578fbb3948b4592bc15eb6d8b4046986e25c06e3b9929460fa4ab08e9653582415e7ef8b87d265e1239251bdf5a4c162 + languageName: node + linkType: hard + "@babel/plugin-transform-sticky-regex@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-sticky-regex@npm:7.25.9" @@ -1626,6 +2478,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-sticky-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/5698df2d924f0b1b7bdb7ef370e83f99ed3f0964eb3b9c27d774d021bee7f6d45f9a73e2be369d90b4aff1603ce29827f8743f091789960e7669daf9c3cda850 + languageName: node + linkType: hard + "@babel/plugin-transform-template-literals@npm:^7.26.8": version: 7.26.8 resolution: "@babel/plugin-transform-template-literals@npm:7.26.8" @@ -1637,6 +2500,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-template-literals@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-template-literals@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/c90f403e42ef062b60654d1c122c70f3ec6f00c2f304b0931ebe6d0b432498ef8a5ef9266ddf00debc535f8390842207e44d3900eff1d2bab0cc1a700f03e083 + languageName: node + linkType: hard + "@babel/plugin-transform-typeof-symbol@npm:^7.26.7": version: 7.27.0 resolution: "@babel/plugin-transform-typeof-symbol@npm:7.27.0" @@ -1648,6 +2522,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-typeof-symbol@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/a13c68015311fefa06a51830bc69d5badd06c881b13d5cf9ba04bf7c73e3fc6311cc889e18d9645ce2a64a79456dc9c7be88476c0b6802f62a686cb6f662ecd6 + languageName: node + linkType: hard + "@babel/plugin-transform-typescript@npm:^7.13.0, @babel/plugin-transform-typescript@npm:^7.27.0": version: 7.27.0 resolution: "@babel/plugin-transform-typescript@npm:7.27.0" @@ -1674,15 +2559,38 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-escapes@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/a6809e0ca69d77ee9804e0c1164e8a2dea5e40718f6dcf234aeddf7292e7414f7ee331d87f17eb6f160823a329d1d6751bd49b35b392ac4a6efc032e4d3038d8 + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-property-regex@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.25.9" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/1685836fc38af4344c3d2a9edbd46f7c7b28d369b63967d5b83f2f6849ec45b97223461cea3d14cc3f0be6ebb284938e637a5ca3955c0e79c873d62f593d615c + languageName: node + linkType: hard + +"@babel/plugin-transform-unicode-property-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.27.1" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/1685836fc38af4344c3d2a9edbd46f7c7b28d369b63967d5b83f2f6849ec45b97223461cea3d14cc3f0be6ebb284938e637a5ca3955c0e79c873d62f593d615c + checksum: 10c0/a332bc3cb3eeea67c47502bc52d13a0f8abae5a7bfcb08b93a8300ddaff8d9e1238f912969494c1b494c1898c6f19687054440706700b6d12cb0b90d88beb4d0 languageName: node linkType: hard @@ -1698,6 +2606,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.27.1" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/6abda1bcffb79feba6f5c691859cdbe984cc96481ea65d5af5ba97c2e843154005f0886e25006a37a2d213c0243506a06eaeafd93a040dbe1f79539016a0d17a + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-sets-regex@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.25.9" @@ -1710,6 +2630,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-sets-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.27.1" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/236645f4d0a1fba7c18dc8ffe3975933af93e478f2665650c2d91cf528cfa1587cde5cfe277e0e501fc03b5bf57638369575d6539cef478632fb93bd7d7d7178 + languageName: node + linkType: hard + "@babel/polyfill@npm:^7.11.5": version: 7.12.1 resolution: "@babel/polyfill@npm:7.12.1" @@ -1720,7 +2652,86 @@ __metadata: languageName: node linkType: hard -"@babel/preset-env@npm:7.26.9, @babel/preset-env@npm:^7.16.5, @babel/preset-env@npm:^7.23.2, @babel/preset-env@npm:^7.24.4": +"@babel/preset-env@npm:7.27.2": + version: 7.27.2 + resolution: "@babel/preset-env@npm:7.27.2" + dependencies: + "@babel/compat-data": "npm:^7.27.2" + "@babel/helper-compilation-targets": "npm:^7.27.2" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-validator-option": "npm:^7.27.1" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.27.1" + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "npm:^7.27.1" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.27.1" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.27.1" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.27.1" + "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-import-assertions": "npm:^7.27.1" + "@babel/plugin-syntax-import-attributes": "npm:^7.27.1" + "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" + "@babel/plugin-transform-arrow-functions": "npm:^7.27.1" + "@babel/plugin-transform-async-generator-functions": "npm:^7.27.1" + "@babel/plugin-transform-async-to-generator": "npm:^7.27.1" + "@babel/plugin-transform-block-scoped-functions": "npm:^7.27.1" + "@babel/plugin-transform-block-scoping": "npm:^7.27.1" + "@babel/plugin-transform-class-properties": "npm:^7.27.1" + "@babel/plugin-transform-class-static-block": "npm:^7.27.1" + "@babel/plugin-transform-classes": "npm:^7.27.1" + "@babel/plugin-transform-computed-properties": "npm:^7.27.1" + "@babel/plugin-transform-destructuring": "npm:^7.27.1" + "@babel/plugin-transform-dotall-regex": "npm:^7.27.1" + "@babel/plugin-transform-duplicate-keys": "npm:^7.27.1" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.27.1" + "@babel/plugin-transform-dynamic-import": "npm:^7.27.1" + "@babel/plugin-transform-exponentiation-operator": "npm:^7.27.1" + "@babel/plugin-transform-export-namespace-from": "npm:^7.27.1" + "@babel/plugin-transform-for-of": "npm:^7.27.1" + "@babel/plugin-transform-function-name": "npm:^7.27.1" + "@babel/plugin-transform-json-strings": "npm:^7.27.1" + "@babel/plugin-transform-literals": "npm:^7.27.1" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.27.1" + "@babel/plugin-transform-member-expression-literals": "npm:^7.27.1" + "@babel/plugin-transform-modules-amd": "npm:^7.27.1" + "@babel/plugin-transform-modules-commonjs": "npm:^7.27.1" + "@babel/plugin-transform-modules-systemjs": "npm:^7.27.1" + "@babel/plugin-transform-modules-umd": "npm:^7.27.1" + "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.27.1" + "@babel/plugin-transform-new-target": "npm:^7.27.1" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.27.1" + "@babel/plugin-transform-numeric-separator": "npm:^7.27.1" + "@babel/plugin-transform-object-rest-spread": "npm:^7.27.2" + "@babel/plugin-transform-object-super": "npm:^7.27.1" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.27.1" + "@babel/plugin-transform-optional-chaining": "npm:^7.27.1" + "@babel/plugin-transform-parameters": "npm:^7.27.1" + "@babel/plugin-transform-private-methods": "npm:^7.27.1" + "@babel/plugin-transform-private-property-in-object": "npm:^7.27.1" + "@babel/plugin-transform-property-literals": "npm:^7.27.1" + "@babel/plugin-transform-regenerator": "npm:^7.27.1" + "@babel/plugin-transform-regexp-modifiers": "npm:^7.27.1" + "@babel/plugin-transform-reserved-words": "npm:^7.27.1" + "@babel/plugin-transform-shorthand-properties": "npm:^7.27.1" + "@babel/plugin-transform-spread": "npm:^7.27.1" + "@babel/plugin-transform-sticky-regex": "npm:^7.27.1" + "@babel/plugin-transform-template-literals": "npm:^7.27.1" + "@babel/plugin-transform-typeof-symbol": "npm:^7.27.1" + "@babel/plugin-transform-unicode-escapes": "npm:^7.27.1" + "@babel/plugin-transform-unicode-property-regex": "npm:^7.27.1" + "@babel/plugin-transform-unicode-regex": "npm:^7.27.1" + "@babel/plugin-transform-unicode-sets-regex": "npm:^7.27.1" + "@babel/preset-modules": "npm:0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2: "npm:^0.4.10" + babel-plugin-polyfill-corejs3: "npm:^0.11.0" + babel-plugin-polyfill-regenerator: "npm:^0.6.1" + core-js-compat: "npm:^3.40.0" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/fd7ec310832a9ff26ed8d56bc0832cdbdb3a188e022050b74790796650649fb8373568af05b320b58b3ff922507979bad50ff95a4d504ab0081134480103504e + languageName: node + linkType: hard + +"@babel/preset-env@npm:^7.16.5, @babel/preset-env@npm:^7.23.2, @babel/preset-env@npm:^7.24.4": version: 7.26.9 resolution: "@babel/preset-env@npm:7.26.9" dependencies: @@ -1880,12 +2891,10 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:7.26.10": - version: 7.26.10 - resolution: "@babel/runtime@npm:7.26.10" - dependencies: - regenerator-runtime: "npm:^0.14.0" - checksum: 10c0/6dc6d88c7908f505c4f7770fb4677dfa61f68f659b943c2be1f2a99cb6680343462867abf2d49822adc435932919b36c77ac60125793e719ea8745f2073d3745 +"@babel/runtime@npm:7.27.1": + version: 7.27.1 + resolution: "@babel/runtime@npm:7.27.1" + checksum: 10c0/530a7332f86ac5a7442250456823a930906911d895c0b743bf1852efc88a20a016ed4cd26d442d0ca40ae6d5448111e02a08dd638a4f1064b47d080e2875dc05 languageName: node linkType: hard @@ -1927,6 +2936,17 @@ __metadata: languageName: node linkType: hard +"@babel/template@npm:^7.27.1, @babel/template@npm:^7.27.2": + version: 7.27.2 + resolution: "@babel/template@npm:7.27.2" + dependencies: + "@babel/code-frame": "npm:^7.27.1" + "@babel/parser": "npm:^7.27.2" + "@babel/types": "npm:^7.27.1" + checksum: 10c0/ed9e9022651e463cc5f2cc21942f0e74544f1754d231add6348ff1b472985a3b3502041c0be62dc99ed2d12cfae0c51394bf827452b98a2f8769c03b87aadc81 + languageName: node + linkType: hard + "@babel/traverse@npm:7.23.2": version: 7.23.2 resolution: "@babel/traverse@npm:7.23.2" @@ -1960,6 +2980,21 @@ __metadata: languageName: node linkType: hard +"@babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.27.3, @babel/traverse@npm:^7.27.4": + version: 7.27.4 + resolution: "@babel/traverse@npm:7.27.4" + dependencies: + "@babel/code-frame": "npm:^7.27.1" + "@babel/generator": "npm:^7.27.3" + "@babel/parser": "npm:^7.27.4" + "@babel/template": "npm:^7.27.2" + "@babel/types": "npm:^7.27.3" + debug: "npm:^4.3.1" + globals: "npm:^11.1.0" + checksum: 10c0/6de8aa2a0637a6ee6d205bf48b9e923928a02415771fdec60085ed754dcdf605e450bb3315c2552fa51c31a4662275b45d5ae4ad527ce55a7db9acebdbbbb8ed + languageName: node + linkType: hard + "@babel/types@npm:7.17.0": version: 7.17.0 resolution: "@babel/types@npm:7.17.0" @@ -1970,7 +3005,7 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.17.0, @babel/types@npm:^7.18.9, @babel/types@npm:^7.2.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.23.0, @babel/types@npm:^7.24.0, @babel/types@npm:^7.24.7, @babel/types@npm:^7.25.4, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.10, @babel/types@npm:^7.26.8, @babel/types@npm:^7.26.9, @babel/types@npm:^7.27.0, @babel/types@npm:^7.4.4, @babel/types@npm:^7.6.1, @babel/types@npm:^7.7.2, @babel/types@npm:^7.9.6": +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.17.0, @babel/types@npm:^7.18.9, @babel/types@npm:^7.2.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.23.0, @babel/types@npm:^7.24.0, @babel/types@npm:^7.24.7, @babel/types@npm:^7.25.4, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.10, @babel/types@npm:^7.26.8, @babel/types@npm:^7.27.0, @babel/types@npm:^7.4.4, @babel/types@npm:^7.6.1, @babel/types@npm:^7.7.2, @babel/types@npm:^7.9.6": version: 7.27.0 resolution: "@babel/types@npm:7.27.0" dependencies: @@ -1980,6 +3015,16 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.27.6": + version: 7.27.6 + resolution: "@babel/types@npm:7.27.6" + dependencies: + "@babel/helper-string-parser": "npm:^7.27.1" + "@babel/helper-validator-identifier": "npm:^7.27.1" + checksum: 10c0/39d556be114f2a6d874ea25ad39826a9e3a0e98de0233ae6d932f6d09a4b222923a90a7274c635ed61f1ba49bbd345329226678800900ad1c8d11afabd573aaf + languageName: node + linkType: hard + "@base2/pretty-print-object@npm:1.0.1": version: 1.0.1 resolution: "@base2/pretty-print-object@npm:1.0.1" @@ -3250,27 +4295,27 @@ __metadata: languageName: node linkType: hard -"@inquirer/confirm@npm:5.1.6": - version: 5.1.6 - resolution: "@inquirer/confirm@npm:5.1.6" +"@inquirer/confirm@npm:5.1.10": + version: 5.1.10 + resolution: "@inquirer/confirm@npm:5.1.10" dependencies: - "@inquirer/core": "npm:^10.1.7" - "@inquirer/type": "npm:^3.0.4" + "@inquirer/core": "npm:^10.1.11" + "@inquirer/type": "npm:^3.0.6" peerDependencies: "@types/node": ">=18" peerDependenciesMeta: "@types/node": optional: true - checksum: 10c0/57b667f8096ec261504b613656e7b7718a238a73e059870a2b8e97c3127bc50085251100ed371250733b7cc5cd68122d8694d6a04a46de95d08bb590a8437b11 + checksum: 10c0/71a1b1c1007b0edd06984c356a9e13764ca917bdbf947a59ce0f55084d36e653daffe56b3806fc9959337aae80ff7b37eeaf01a40746e5f60de86475fdf0502a languageName: node linkType: hard -"@inquirer/core@npm:^10.1.7": - version: 10.1.10 - resolution: "@inquirer/core@npm:10.1.10" +"@inquirer/core@npm:^10.1.11": + version: 10.1.13 + resolution: "@inquirer/core@npm:10.1.13" dependencies: - "@inquirer/figures": "npm:^1.0.11" - "@inquirer/type": "npm:^3.0.6" + "@inquirer/figures": "npm:^1.0.12" + "@inquirer/type": "npm:^3.0.7" ansi-escapes: "npm:^4.3.2" cli-width: "npm:^4.1.0" mute-stream: "npm:^2.0.0" @@ -3282,18 +4327,18 @@ __metadata: peerDependenciesMeta: "@types/node": optional: true - checksum: 10c0/8d0a3b725e42e40efbdc6ed087283795f1e36e642b119dd7dd3cbf31fce74bdbdb1b987da16159cd2475f45b2ede7e33293ae92bad3ac481832889c230df3fc0 + checksum: 10c0/919208a31307297d5a07a44b9ebe69a999ce1470b31a2e1b5a04538bc36624d2053808cd6c677637a61690af09bdbdd635bd7031b64e3dd86c5b18df3ca7c3f9 languageName: node linkType: hard -"@inquirer/figures@npm:^1.0.11": - version: 1.0.11 - resolution: "@inquirer/figures@npm:1.0.11" - checksum: 10c0/6270e24eebbe42bbc4e7f8e761e906be66b4896787f31ab3e7484ad271c8edc90bce4ec20e232a5da447aee4fc73803397b2dda8cf645f4f7eea83e773b44e1e +"@inquirer/figures@npm:^1.0.12": + version: 1.0.12 + resolution: "@inquirer/figures@npm:1.0.12" + checksum: 10c0/08694288bdf9aa474571ca94272113a5ac443229519ce71447eba9eb7d5a2007901bdc3e92216d929a69746dcbac29683886c20e67b7864a7c7f6c59b99d3269 languageName: node linkType: hard -"@inquirer/type@npm:^3.0.4, @inquirer/type@npm:^3.0.6": +"@inquirer/type@npm:^3.0.6": version: 3.0.6 resolution: "@inquirer/type@npm:3.0.6" peerDependencies: @@ -3305,6 +4350,18 @@ __metadata: languageName: node linkType: hard +"@inquirer/type@npm:^3.0.7": + version: 3.0.7 + resolution: "@inquirer/type@npm:3.0.7" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 10c0/bbaa33c274a10f70d3a587264e1db6dbfcd8c1458d595c54870d1d5b3fc113ab5063203ec12a098485bb9e2fcef1a87d8c6ecd2a6d44ddc575f5c4715379be5e + languageName: node + linkType: hard + "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -3492,44 +4549,51 @@ __metadata: languageName: node linkType: hard -"@lmdb/lmdb-darwin-arm64@npm:3.2.6": - version: 3.2.6 - resolution: "@lmdb/lmdb-darwin-arm64@npm:3.2.6" +"@lmdb/lmdb-darwin-arm64@npm:3.3.0": + version: 3.3.0 + resolution: "@lmdb/lmdb-darwin-arm64@npm:3.3.0" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@lmdb/lmdb-darwin-x64@npm:3.2.6": - version: 3.2.6 - resolution: "@lmdb/lmdb-darwin-x64@npm:3.2.6" +"@lmdb/lmdb-darwin-x64@npm:3.3.0": + version: 3.3.0 + resolution: "@lmdb/lmdb-darwin-x64@npm:3.3.0" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@lmdb/lmdb-linux-arm64@npm:3.2.6": - version: 3.2.6 - resolution: "@lmdb/lmdb-linux-arm64@npm:3.2.6" +"@lmdb/lmdb-linux-arm64@npm:3.3.0": + version: 3.3.0 + resolution: "@lmdb/lmdb-linux-arm64@npm:3.3.0" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@lmdb/lmdb-linux-arm@npm:3.2.6": - version: 3.2.6 - resolution: "@lmdb/lmdb-linux-arm@npm:3.2.6" +"@lmdb/lmdb-linux-arm@npm:3.3.0": + version: 3.3.0 + resolution: "@lmdb/lmdb-linux-arm@npm:3.3.0" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@lmdb/lmdb-linux-x64@npm:3.2.6": - version: 3.2.6 - resolution: "@lmdb/lmdb-linux-x64@npm:3.2.6" +"@lmdb/lmdb-linux-x64@npm:3.3.0": + version: 3.3.0 + resolution: "@lmdb/lmdb-linux-x64@npm:3.3.0" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@lmdb/lmdb-win32-x64@npm:3.2.6": - version: 3.2.6 - resolution: "@lmdb/lmdb-win32-x64@npm:3.2.6" +"@lmdb/lmdb-win32-arm64@npm:3.3.0": + version: 3.3.0 + resolution: "@lmdb/lmdb-win32-arm64@npm:3.3.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@lmdb/lmdb-win32-x64@npm:3.3.0": + version: 3.3.0 + resolution: "@lmdb/lmdb-win32-x64@npm:3.3.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -3906,14 +4970,14 @@ __metadata: languageName: node linkType: hard -"@ngtools/webpack@npm:19.2.9": - version: 19.2.9 - resolution: "@ngtools/webpack@npm:19.2.9" +"@ngtools/webpack@npm:20.0.1": + version: 20.0.1 + resolution: "@ngtools/webpack@npm:20.0.1" peerDependencies: - "@angular/compiler-cli": ^19.0.0 || ^19.2.0-next.0 - typescript: ">=5.5 <5.9" + "@angular/compiler-cli": ^20.0.0 + typescript: ">=5.8 <5.9" webpack: ^5.54.0 - checksum: 10c0/984e75335a381bb748a079b53e7dc05e4e2230d283258c7cc6735f1dd82c191817c95e5886ed518756c3b3a99eb7ce420c4625585f906a5d91e9fa2067bddbd7 + checksum: 10c0/9bc8fe5d600b5d940e49091d9ccae3f1f709cb01745c18b1c4c1b3e24eb61dbbfc9f4478268fc3d95407050b8ee69dab7e9fe480ba55af821d0cc688a999e2ce languageName: node linkType: hard @@ -5563,13 +6627,6 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.34.8": - version: 4.34.8 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.34.8" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - "@rollup/rollup-android-arm-eabi@npm:4.40.1": version: 4.40.1 resolution: "@rollup/rollup-android-arm-eabi@npm:4.40.1" @@ -5577,10 +6634,10 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.34.8": - version: 4.34.8 - resolution: "@rollup/rollup-android-arm64@npm:4.34.8" - conditions: os=android & cpu=arm64 +"@rollup/rollup-android-arm-eabi@npm:4.40.2": + version: 4.40.2 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.40.2" + conditions: os=android & cpu=arm languageName: node linkType: hard @@ -5591,10 +6648,10 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.34.8": - version: 4.34.8 - resolution: "@rollup/rollup-darwin-arm64@npm:4.34.8" - conditions: os=darwin & cpu=arm64 +"@rollup/rollup-android-arm64@npm:4.40.2": + version: 4.40.2 + resolution: "@rollup/rollup-android-arm64@npm:4.40.2" + conditions: os=android & cpu=arm64 languageName: node linkType: hard @@ -5605,10 +6662,10 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.34.8": - version: 4.34.8 - resolution: "@rollup/rollup-darwin-x64@npm:4.34.8" - conditions: os=darwin & cpu=x64 +"@rollup/rollup-darwin-arm64@npm:4.40.2": + version: 4.40.2 + resolution: "@rollup/rollup-darwin-arm64@npm:4.40.2" + conditions: os=darwin & cpu=arm64 languageName: node linkType: hard @@ -5619,10 +6676,10 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-freebsd-arm64@npm:4.34.8": - version: 4.34.8 - resolution: "@rollup/rollup-freebsd-arm64@npm:4.34.8" - conditions: os=freebsd & cpu=arm64 +"@rollup/rollup-darwin-x64@npm:4.40.2": + version: 4.40.2 + resolution: "@rollup/rollup-darwin-x64@npm:4.40.2" + conditions: os=darwin & cpu=x64 languageName: node linkType: hard @@ -5633,10 +6690,10 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-freebsd-x64@npm:4.34.8": - version: 4.34.8 - resolution: "@rollup/rollup-freebsd-x64@npm:4.34.8" - conditions: os=freebsd & cpu=x64 +"@rollup/rollup-freebsd-arm64@npm:4.40.2": + version: 4.40.2 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.40.2" + conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard @@ -5647,10 +6704,10 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.34.8": - version: 4.34.8 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.34.8" - conditions: os=linux & cpu=arm & libc=glibc +"@rollup/rollup-freebsd-x64@npm:4.40.2": + version: 4.40.2 + resolution: "@rollup/rollup-freebsd-x64@npm:4.40.2" + conditions: os=freebsd & cpu=x64 languageName: node linkType: hard @@ -5661,10 +6718,10 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.34.8": - version: 4.34.8 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.34.8" - conditions: os=linux & cpu=arm & libc=musl +"@rollup/rollup-linux-arm-gnueabihf@npm:4.40.2": + version: 4.40.2 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.40.2" + conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard @@ -5675,10 +6732,10 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.34.8": - version: 4.34.8 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.34.8" - conditions: os=linux & cpu=arm64 & libc=glibc +"@rollup/rollup-linux-arm-musleabihf@npm:4.40.2": + version: 4.40.2 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.40.2" + conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard @@ -5689,10 +6746,10 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.34.8": - version: 4.34.8 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.34.8" - conditions: os=linux & cpu=arm64 & libc=musl +"@rollup/rollup-linux-arm64-gnu@npm:4.40.2": + version: 4.40.2 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.40.2" + conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard @@ -5703,10 +6760,10 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-loongarch64-gnu@npm:4.34.8": - version: 4.34.8 - resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.34.8" - conditions: os=linux & cpu=loong64 & libc=glibc +"@rollup/rollup-linux-arm64-musl@npm:4.40.2": + version: 4.40.2 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.40.2" + conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard @@ -5717,10 +6774,10 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.34.8": - version: 4.34.8 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.34.8" - conditions: os=linux & cpu=ppc64 & libc=glibc +"@rollup/rollup-linux-loongarch64-gnu@npm:4.40.2": + version: 4.40.2 + resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.40.2" + conditions: os=linux & cpu=loong64 & libc=glibc languageName: node linkType: hard @@ -5731,10 +6788,10 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.34.8": - version: 4.34.8 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.34.8" - conditions: os=linux & cpu=riscv64 & libc=glibc +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.40.2": + version: 4.40.2 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.40.2" + conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard @@ -5745,6 +6802,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-riscv64-gnu@npm:4.40.2": + version: 4.40.2 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.40.2" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-riscv64-musl@npm:4.40.1": version: 4.40.1 resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.40.1" @@ -5752,10 +6816,10 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.34.8": - version: 4.34.8 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.34.8" - conditions: os=linux & cpu=s390x & libc=glibc +"@rollup/rollup-linux-riscv64-musl@npm:4.40.2": + version: 4.40.2 + resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.40.2" + conditions: os=linux & cpu=riscv64 & libc=musl languageName: node linkType: hard @@ -5766,10 +6830,10 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.34.8": - version: 4.34.8 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.34.8" - conditions: os=linux & cpu=x64 & libc=glibc +"@rollup/rollup-linux-s390x-gnu@npm:4.40.2": + version: 4.40.2 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.40.2" + conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard @@ -5780,10 +6844,10 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.34.8": - version: 4.34.8 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.34.8" - conditions: os=linux & cpu=x64 & libc=musl +"@rollup/rollup-linux-x64-gnu@npm:4.40.2": + version: 4.40.2 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.40.2" + conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard @@ -5794,10 +6858,10 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.34.8": - version: 4.34.8 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.34.8" - conditions: os=win32 & cpu=arm64 +"@rollup/rollup-linux-x64-musl@npm:4.40.2": + version: 4.40.2 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.40.2" + conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard @@ -5808,10 +6872,10 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.34.8": - version: 4.34.8 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.34.8" - conditions: os=win32 & cpu=ia32 +"@rollup/rollup-win32-arm64-msvc@npm:4.40.2": + version: 4.40.2 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.40.2" + conditions: os=win32 & cpu=arm64 languageName: node linkType: hard @@ -5822,10 +6886,10 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.34.8": - version: 4.34.8 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.34.8" - conditions: os=win32 & cpu=x64 +"@rollup/rollup-win32-ia32-msvc@npm:4.40.2": + version: 4.40.2 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.40.2" + conditions: os=win32 & cpu=ia32 languageName: node linkType: hard @@ -5836,6 +6900,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-win32-x64-msvc@npm:4.40.2": + version: 4.40.2 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.40.2" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@rtsao/scc@npm:^1.1.0": version: 1.1.0 resolution: "@rtsao/scc@npm:1.1.0" @@ -6118,18 +7189,18 @@ __metadata: resolution: "@storybook/angular@workspace:frameworks/angular" dependencies: "@analogjs/vite-plugin-angular": "npm:^1.12.1" - "@angular-devkit/architect": "npm:^0.1901.1" - "@angular-devkit/build-angular": "npm:^19.1.1" - "@angular-devkit/core": "npm:^19.1.1" - "@angular/animations": "npm:^19.1.1" - "@angular/common": "npm:^19.1.1" - "@angular/compiler": "npm:^19.1.1" - "@angular/compiler-cli": "npm:^19.1.1" - "@angular/core": "npm:^19.1.1" - "@angular/forms": "npm:^19.1.1" - "@angular/platform-browser": "npm:^19.1.1" - "@angular/platform-browser-dynamic": "npm:^19.1.1" - "@angular/router": "npm:^19.1.1" + "@angular-devkit/architect": "npm:^0.2000.1" + "@angular-devkit/build-angular": "npm:^20.0.0" + "@angular-devkit/core": "npm:^20.0.0" + "@angular/animations": "npm:^20.0.0" + "@angular/common": "npm:^20.0.0" + "@angular/compiler": "npm:^20.0.0" + "@angular/compiler-cli": "npm:^20.0.0" + "@angular/core": "npm:^20.0.0" + "@angular/forms": "npm:^20.0.0" + "@angular/platform-browser": "npm:^20.0.0" + "@angular/platform-browser-dynamic": "npm:^20.0.0" + "@angular/router": "npm:^20.0.0" "@storybook/builder-webpack5": "workspace:*" "@storybook/core-webpack": "workspace:*" "@storybook/global": "npm:^5.0.0" @@ -6146,8 +7217,8 @@ __metadata: zone.js: "npm:^0.15.0" peerDependencies: "@angular-devkit/architect": ">=0.1800.0 < 0.2100.0" - "@angular-devkit/build-angular": ">=18.0.0 < 21.0.0" - "@angular-devkit/core": ">=18.0.0 < 21.0.0" + "@angular-devkit/build-angular": ">=0.1800.0 < 0.2100.0" + "@angular-devkit/core": ">=0.1800.0 < 0.2100.0" "@angular/animations": ">=18.0.0 < 21.0.0" "@angular/cli": ">=18.0.0 < 21.0.0" "@angular/common": ">=18.0.0 < 21.0.0" @@ -7541,13 +8612,6 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:1.0.6": - version: 1.0.6 - resolution: "@types/estree@npm:1.0.6" - checksum: 10c0/cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a - languageName: node - linkType: hard - "@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^5.0.0": version: 5.0.6 resolution: "@types/express-serve-static-core@npm:5.0.6" @@ -7560,7 +8624,7 @@ __metadata: languageName: node linkType: hard -"@types/express-serve-static-core@npm:^4.17.33": +"@types/express-serve-static-core@npm:^4.17.21, @types/express-serve-static-core@npm:^4.17.33": version: 4.19.6 resolution: "@types/express-serve-static-core@npm:4.19.6" dependencies: @@ -8390,12 +9454,12 @@ __metadata: languageName: node linkType: hard -"@vitejs/plugin-basic-ssl@npm:1.2.0": - version: 1.2.0 - resolution: "@vitejs/plugin-basic-ssl@npm:1.2.0" +"@vitejs/plugin-basic-ssl@npm:2.0.0": + version: 2.0.0 + resolution: "@vitejs/plugin-basic-ssl@npm:2.0.0" peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 - checksum: 10c0/0d360fcca01f91ade6e451edbea09a107ff9e95cd3c3766c7a069d1a168709df92d96c0bd1eccc66e2739a153e07c75a45321ec487450c0da942606200d8441d + vite: ^6.0.0 + checksum: 10c0/673f46dc5ee042f6fcfa7ecf514e717e770085f8979d4608cab952f3e9003fe7aed589cc812a67f3dcd5e80655975c6490ce8a07a4b6feef98766003256d4283 languageName: node linkType: hard @@ -9747,21 +10811,21 @@ __metadata: languageName: node linkType: hard -"autoprefixer@npm:10.4.20": - version: 10.4.20 - resolution: "autoprefixer@npm:10.4.20" +"autoprefixer@npm:10.4.21": + version: 10.4.21 + resolution: "autoprefixer@npm:10.4.21" dependencies: - browserslist: "npm:^4.23.3" - caniuse-lite: "npm:^1.0.30001646" + browserslist: "npm:^4.24.4" + caniuse-lite: "npm:^1.0.30001702" fraction.js: "npm:^4.3.7" normalize-range: "npm:^0.1.2" - picocolors: "npm:^1.0.1" + picocolors: "npm:^1.1.1" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.1.0 bin: autoprefixer: bin/autoprefixer - checksum: 10c0/e1f00978a26e7c5b54ab12036d8c13833fad7222828fc90914771b1263f51b28c7ddb5803049de4e77696cbd02bb25cfc3634e80533025bb26c26aacdf938940 + checksum: 10c0/de5b71d26d0baff4bbfb3d59f7cf7114a6030c9eeb66167acf49a32c5b61c68e308f1e0f869d92334436a221035d08b51cd1b2f2c4689b8d955149423c16d4d4 languageName: node linkType: hard @@ -9808,6 +10872,18 @@ __metadata: languageName: node linkType: hard +"babel-loader@npm:10.0.0": + version: 10.0.0 + resolution: "babel-loader@npm:10.0.0" + dependencies: + find-up: "npm:^5.0.0" + peerDependencies: + "@babel/core": ^7.12.0 + webpack: ">=5.61.0" + checksum: 10c0/882dfacde3ee24b432ad57e468832cd0821e2a410f6c5b75ff945f069a8956592b28c6c357df5bb03db73d2741ec3db5febb106ac0bb3591c3d4288f2cf4df0e + languageName: node + linkType: hard + "babel-loader@npm:9.1.3": version: 9.1.3 resolution: "babel-loader@npm:9.1.3" @@ -9821,7 +10897,7 @@ __metadata: languageName: node linkType: hard -"babel-loader@npm:9.2.1, babel-loader@npm:^9.1.3": +"babel-loader@npm:^9.1.3": version: 9.2.1 resolution: "babel-loader@npm:9.2.1" dependencies: @@ -10023,9 +11099,9 @@ __metadata: languageName: node linkType: hard -"beasties@npm:0.3.2": - version: 0.3.2 - resolution: "beasties@npm:0.3.2" +"beasties@npm:0.3.4": + version: 0.3.4 + resolution: "beasties@npm:0.3.4" dependencies: css-select: "npm:^5.1.0" css-what: "npm:^6.1.0" @@ -10035,7 +11111,7 @@ __metadata: picocolors: "npm:^1.1.1" postcss: "npm:^8.4.49" postcss-media-query-parser: "npm:^0.2.3" - checksum: 10c0/ed6d4356f8b0448ce360eabfba80bd3d9f8d6592a6dc2fa78467e6522da62fee87d8116d7b94aa695dc51bef18f332b3962435a414b759939264a8754702faa3 + checksum: 10c0/e87d6eac3c2bb370789ae50a6e0818451694979bef05383283119fe2098ba6b92ab8210d68437adfb816d24b87b91a4716691e6d604e8876d5330ecc0e1c8c35 languageName: node linkType: hard @@ -10571,7 +11647,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.21.5, browserslist@npm:^4.23.0, browserslist@npm:^4.23.3, browserslist@npm:^4.24.0, browserslist@npm:^4.24.2, browserslist@npm:^4.24.4": +"browserslist@npm:^4.21.5, browserslist@npm:^4.23.0, browserslist@npm:^4.24.0, browserslist@npm:^4.24.2, browserslist@npm:^4.24.4": version: 4.24.4 resolution: "browserslist@npm:4.24.4" dependencies: @@ -10819,13 +11895,20 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001579, caniuse-lite@npm:^1.0.30001646, caniuse-lite@npm:^1.0.30001687, caniuse-lite@npm:^1.0.30001688": +"caniuse-lite@npm:^1.0.30001579, caniuse-lite@npm:^1.0.30001687, caniuse-lite@npm:^1.0.30001688": version: 1.0.30001715 resolution: "caniuse-lite@npm:1.0.30001715" checksum: 10c0/0109a7da797ffbe1aa197baa5242b205011098eecec1087ef3d0c58ceea19be325ab6679b2751a78660adc3051a9f77e99d5789938fd1eb1235e6fdf6a1dbf8e languageName: node linkType: hard +"caniuse-lite@npm:^1.0.30001702": + version: 1.0.30001721 + resolution: "caniuse-lite@npm:1.0.30001721" + checksum: 10c0/fa3a8926899824b385279f1f886fe34c5efb1321c9ece1b9df25c8d567a2706db8450cc5b4d969e769e641593e08ea644909324aba93636a43e4949a75f81c4c + languageName: node + linkType: hard + "case-sensitive-paths-webpack-plugin@npm:^2.4.0": version: 2.4.0 resolution: "case-sensitive-paths-webpack-plugin@npm:2.4.0" @@ -11135,7 +12218,7 @@ __metadata: languageName: node linkType: hard -"cli-spinners@npm:^2.5.0": +"cli-spinners@npm:^2.5.0, cli-spinners@npm:^2.9.2": version: 2.9.2 resolution: "cli-spinners@npm:2.9.2" checksum: 10c0/907a1c227ddf0d7a101e7ab8b300affc742ead4b4ebe920a5bf1bc6d45dce2958fcd195eb28fa25275062fe6fa9b109b93b63bc8033396ed3bcb50297008b3a3 @@ -11222,6 +12305,17 @@ __metadata: languageName: node linkType: hard +"cliui@npm:^9.0.1": + version: 9.0.1 + resolution: "cliui@npm:9.0.1" + dependencies: + string-width: "npm:^7.2.0" + strip-ansi: "npm:^7.1.0" + wrap-ansi: "npm:^9.0.0" + checksum: 10c0/13441832e9efe7c7a76bd2b8e683555c478d461a9f249dc5db9b17fe8d4b47fa9277b503914b90bd00e4a151abb6b9b02b2288972ffe2e5e3ca40bcb1c2330d3 + languageName: node + linkType: hard + "clone-deep@npm:^4.0.1": version: 4.0.1 resolution: "clone-deep@npm:4.0.1" @@ -11656,19 +12750,18 @@ __metadata: languageName: node linkType: hard -"copy-webpack-plugin@npm:12.0.2": - version: 12.0.2 - resolution: "copy-webpack-plugin@npm:12.0.2" +"copy-webpack-plugin@npm:13.0.0": + version: 13.0.0 + resolution: "copy-webpack-plugin@npm:13.0.0" dependencies: - fast-glob: "npm:^3.3.2" glob-parent: "npm:^6.0.1" - globby: "npm:^14.0.0" normalize-path: "npm:^3.0.0" schema-utils: "npm:^4.2.0" serialize-javascript: "npm:^6.0.2" + tinyglobby: "npm:^0.2.12" peerDependencies: webpack: ^5.1.0 - checksum: 10c0/1a2715a1280a37b81b7040b89ed962db4aa75475b164f84f266fa4e81f209269b13f8bff10b104dff7558854bafedcdd4f30c40fd23ecd8fa28af45516b459cd + checksum: 10c0/955037f77c6beb249b690710c35bacceb03b61bb5b7c5fc59ac7dff122c706eb794ef601bc3d9bbdb1350bda3e2615e0b43bf33f1ce2ca14ed934d9a89f43637 languageName: node linkType: hard @@ -13118,7 +14211,7 @@ __metadata: languageName: node linkType: hard -"entities@npm:^4.2.0, entities@npm:^4.3.0, entities@npm:^4.5.0": +"entities@npm:^4.2.0, entities@npm:^4.5.0": version: 4.5.0 resolution: "entities@npm:4.5.0" checksum: 10c0/5b039739f7621f5d1ad996715e53d964035f75ad3b9a4d38c6b3804bb226e282ffeae2443624d8fdd9c47d8e926ae9ac009c54671243f0c3294c26af7cc85250 @@ -13421,12 +14514,12 @@ __metadata: languageName: node linkType: hard -"esbuild-wasm@npm:0.25.1": - version: 0.25.1 - resolution: "esbuild-wasm@npm:0.25.1" +"esbuild-wasm@npm:0.25.5": + version: 0.25.5 + resolution: "esbuild-wasm@npm:0.25.5" bin: esbuild: bin/esbuild - checksum: 10c0/9cc20c0f1c31c686f26202b86279a80307225ac82e52f1713d2971638baf7afd7e89ab5602648f53e1b9c331b7bfea99a76a75e38bb310ecb18c655fa7a9fd63 + checksum: 10c0/5893a8e09ec576154a2144989708998ec6081f2c6b6353cdba7df1d0ca9f12db8292302391ba04decdde45119a384cfbba19307c15c05991da826202f7357129 languageName: node linkType: hard @@ -15655,7 +16748,7 @@ __metadata: languageName: node linkType: hard -"globby@npm:^14.0.0, globby@npm:^14.0.1": +"globby@npm:^14.0.1": version: 14.1.0 resolution: "globby@npm:14.1.0" dependencies: @@ -16974,6 +18067,13 @@ __metadata: languageName: node linkType: hard +"is-interactive@npm:^2.0.0": + version: 2.0.0 + resolution: "is-interactive@npm:2.0.0" + checksum: 10c0/801c8f6064f85199dc6bf99b5dd98db3282e930c3bc197b32f2c5b89313bb578a07d1b8a01365c4348c2927229234f3681eb861b9c2c92bee72ff397390fa600 + languageName: node + linkType: hard + "is-lite@npm:^0.8.2": version: 0.8.2 resolution: "is-lite@npm:0.8.2" @@ -17182,6 +18282,13 @@ __metadata: languageName: node linkType: hard +"is-unicode-supported@npm:^1.3.0": + version: 1.3.0 + resolution: "is-unicode-supported@npm:1.3.0" + checksum: 10c0/b8674ea95d869f6faabddc6a484767207058b91aea0250803cbf1221345cb0c56f466d4ecea375dc77f6633d248d33c47bd296fb8f4cdba0b4edba8917e83d8a + languageName: node + linkType: hard + "is-unicode-supported@npm:^2.0.0": version: 2.1.0 resolution: "is-unicode-supported@npm:2.1.0" @@ -17930,9 +19037,9 @@ __metadata: languageName: node linkType: hard -"less-loader@npm:12.2.0": - version: 12.2.0 - resolution: "less-loader@npm:12.2.0" +"less-loader@npm:12.3.0": + version: 12.3.0 + resolution: "less-loader@npm:12.3.0" peerDependencies: "@rspack/core": 0.x || 1.x less: ^3.5.0 || ^4.0.0 @@ -17942,13 +19049,13 @@ __metadata: optional: true webpack: optional: true - checksum: 10c0/54eea545727930801d2ccc0b586332cd07d0f922b14ab7c8b3f03199944d770ac363081081ed2fda5f23da904336367cb2bb40007c033970dce25f7f9c906ba2 + checksum: 10c0/11814ce601fe9a9a148f28643ffcb6041939b1142b21538c2c0a7a220f79e35f7eeffd4ac5f4d9495e41f1f25aabb98652fa18792d22eebb1d151716d8297332 languageName: node linkType: hard -"less@npm:4.2.2": - version: 4.2.2 - resolution: "less@npm:4.2.2" +"less@npm:4.3.0": + version: 4.3.0 + resolution: "less@npm:4.3.0" dependencies: copy-anything: "npm:^2.0.1" errno: "npm:^0.1.1" @@ -17977,7 +19084,7 @@ __metadata: optional: true bin: lessc: bin/lessc - checksum: 10c0/d472c203a41fb3722a9bf5677f5348e59d8b6589bf2e3933a77c305b42b2ebbe1e3accf145f05b6d2415ba1dad08add7803646947bf867eec7a2a279d758d99a + checksum: 10c0/69a9260d4613387fd1f2da3b0904005423272c59f304b27475c145a62f6890be5d38729fd78ef2a65cba3d1d9b02760f309074cad0be4764252934ad04efb2ae languageName: node linkType: hard @@ -18086,9 +19193,9 @@ __metadata: languageName: node linkType: hard -"listr2@npm:8.2.5": - version: 8.2.5 - resolution: "listr2@npm:8.2.5" +"listr2@npm:8.3.3": + version: 8.3.3 + resolution: "listr2@npm:8.3.3" dependencies: cli-truncate: "npm:^4.0.0" colorette: "npm:^2.0.20" @@ -18096,7 +19203,7 @@ __metadata: log-update: "npm:^6.1.0" rfdc: "npm:^1.4.1" wrap-ansi: "npm:^9.0.0" - checksum: 10c0/f5a9599514b00c27d7eb32d1117c83c61394b2a985ec20e542c798bf91cf42b19340215701522736f5b7b42f557e544afeadec47866e35e5d4f268f552729671 + checksum: 10c0/0792f8a7fd482fa516e21689e012e07081cab3653172ca606090622cfa0024c784a1eba8095a17948a0e9a4aa98a80f7c9c90f78a0dd35173d6802f9cc123a82 languageName: node linkType: hard @@ -18142,16 +19249,17 @@ __metadata: languageName: node linkType: hard -"lmdb@npm:3.2.6": - version: 3.2.6 - resolution: "lmdb@npm:3.2.6" - dependencies: - "@lmdb/lmdb-darwin-arm64": "npm:3.2.6" - "@lmdb/lmdb-darwin-x64": "npm:3.2.6" - "@lmdb/lmdb-linux-arm": "npm:3.2.6" - "@lmdb/lmdb-linux-arm64": "npm:3.2.6" - "@lmdb/lmdb-linux-x64": "npm:3.2.6" - "@lmdb/lmdb-win32-x64": "npm:3.2.6" +"lmdb@npm:3.3.0": + version: 3.3.0 + resolution: "lmdb@npm:3.3.0" + dependencies: + "@lmdb/lmdb-darwin-arm64": "npm:3.3.0" + "@lmdb/lmdb-darwin-x64": "npm:3.3.0" + "@lmdb/lmdb-linux-arm": "npm:3.3.0" + "@lmdb/lmdb-linux-arm64": "npm:3.3.0" + "@lmdb/lmdb-linux-x64": "npm:3.3.0" + "@lmdb/lmdb-win32-arm64": "npm:3.3.0" + "@lmdb/lmdb-win32-x64": "npm:3.3.0" msgpackr: "npm:^1.11.2" node-addon-api: "npm:^6.1.0" node-gyp: "npm:latest" @@ -18169,11 +19277,13 @@ __metadata: optional: true "@lmdb/lmdb-linux-x64": optional: true + "@lmdb/lmdb-win32-arm64": + optional: true "@lmdb/lmdb-win32-x64": optional: true bin: download-lmdb-prebuilds: bin/download-prebuilds.js - checksum: 10c0/1b7a4e17351f41ae5cbe79a8db7782f34f24484ffbcba6614b91c7d5d4431284c55d8912065e50d05598de0d6dcd0417608d3705d930a207fbf76019219cc43d + checksum: 10c0/91b22b552ad79ce39d05dc0025613fa9edd61762fadbac280c400fb0d7b680e3880833d7067e1f537ed3ef4376ea58c2a4b1ec79b83425866f2bce116e56f910 languageName: node linkType: hard @@ -18406,6 +19516,16 @@ __metadata: languageName: node linkType: hard +"log-symbols@npm:^6.0.0": + version: 6.0.0 + resolution: "log-symbols@npm:6.0.0" + dependencies: + chalk: "npm:^5.3.0" + is-unicode-supported: "npm:^1.3.0" + checksum: 10c0/36636cacedba8f067d2deb4aad44e91a89d9efb3ead27e1846e7b82c9a10ea2e3a7bd6ce28a7ca616bebc60954ff25c67b0f92d20a6a746bb3cc52c3701891f6 + languageName: node + linkType: hard + "log-update@npm:^5.0.1": version: 5.0.1 resolution: "log-update@npm:5.0.1" @@ -20498,15 +21618,15 @@ __metadata: languageName: node linkType: hard -"open@npm:10.1.0": - version: 10.1.0 - resolution: "open@npm:10.1.0" +"open@npm:10.1.2": + version: 10.1.2 + resolution: "open@npm:10.1.2" dependencies: default-browser: "npm:^5.2.1" define-lazy-prop: "npm:^3.0.0" is-inside-container: "npm:^1.0.0" is-wsl: "npm:^3.1.0" - checksum: 10c0/c86d0b94503d5f735f674158d5c5d339c25ec2927562f00ee74590727292ed23e1b8d9336cb41ffa7e1fa4d3641d29b199b4ea37c78cb557d72b511743e90ebb + checksum: 10c0/1bee796f06e549ce764f693272100323fbc04da8fa3c5b0402d6c2d11b3d76fa0aac0be7535e710015ff035326638e3b9a563f3b0e7ac3266473ed5663caae6d languageName: node linkType: hard @@ -20581,7 +21701,24 @@ __metadata: languageName: node linkType: hard -"ora@npm:5.4.1, ora@npm:^5.4.1": +"ora@npm:8.2.0": + version: 8.2.0 + resolution: "ora@npm:8.2.0" + dependencies: + chalk: "npm:^5.3.0" + cli-cursor: "npm:^5.0.0" + cli-spinners: "npm:^2.9.2" + is-interactive: "npm:^2.0.0" + is-unicode-supported: "npm:^2.0.0" + log-symbols: "npm:^6.0.0" + stdin-discarder: "npm:^0.2.2" + string-width: "npm:^7.2.0" + strip-ansi: "npm:^7.1.0" + checksum: 10c0/7d9291255db22e293ea164f520b6042a3e906576ab06c9cf408bf9ef5664ba0a9f3bd258baa4ada058cfcc2163ef9b6696d51237a866682ce33295349ba02c3a + languageName: node + linkType: hard + +"ora@npm:^5.4.1": version: 5.4.1 resolution: "ora@npm:5.4.1" dependencies: @@ -20935,14 +22072,14 @@ __metadata: languageName: node linkType: hard -"parse5-html-rewriting-stream@npm:7.0.0": - version: 7.0.0 - resolution: "parse5-html-rewriting-stream@npm:7.0.0" +"parse5-html-rewriting-stream@npm:7.1.0": + version: 7.1.0 + resolution: "parse5-html-rewriting-stream@npm:7.1.0" dependencies: - entities: "npm:^4.3.0" + entities: "npm:^6.0.0" parse5: "npm:^7.0.0" parse5-sax-parser: "npm:^7.0.0" - checksum: 10c0/658d3e2bae038e515bcce6ab6fba9484332d641f3ba82a6450649e1105492fe0a353101dbf751bddfc063509d06b55260bd4567970df3eaaa8391ae79d25ffbf + checksum: 10c0/e44a2f52a0012ace6c04e4eb7b9733dabdc86d9a6d7ffc30e980b89bfaa6cab7f1e74c2a4d09017037247119589eb0532c1ab0790b6ce64674cbbcc2bbaf0de7 languageName: node linkType: hard @@ -21229,15 +22366,15 @@ __metadata: languageName: node linkType: hard -"piscina@npm:4.8.0": - version: 4.8.0 - resolution: "piscina@npm:4.8.0" +"piscina@npm:5.0.0": + version: 5.0.0 + resolution: "piscina@npm:5.0.0" dependencies: "@napi-rs/nice": "npm:^1.0.1" dependenciesMeta: "@napi-rs/nice": optional: true - checksum: 10c0/963ee0dc0862e936c88357b21b0b4fa32407ab21e9600756504411f368dcfae7478c8a19e13d0dd8afed56a8252a8e5967ee4413aa33dd436751b7ee2804531e + checksum: 10c0/91316fa6d7da348430104a5d0cdeff3114e736fdd7605b8ad7b605236cc1fddc0de53e075dbfb0a01c8f603c18ad1601cd74d8742d356ae8d73de275cdea0594 languageName: node linkType: hard @@ -21540,18 +22677,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:8.5.2": - version: 8.5.2 - resolution: "postcss@npm:8.5.2" - dependencies: - nanoid: "npm:^3.3.8" - picocolors: "npm:^1.1.1" - source-map-js: "npm:^1.2.1" - checksum: 10c0/3044d49bc725029ab62292e8bf9849741251b95f3b754e191bf8b4025414d40ec3b4ac05c5a563d4b50060b5c8e96683eb4d783d8d8fa3867eb7b763cbe66127 - languageName: node - linkType: hard - -"postcss@npm:^8.2.14, postcss@npm:^8.4.33, postcss@npm:^8.4.38, postcss@npm:^8.4.48, postcss@npm:^8.4.49, postcss@npm:^8.5.3": +"postcss@npm:8.5.3, postcss@npm:^8.2.14, postcss@npm:^8.4.33, postcss@npm:^8.4.38, postcss@npm:^8.4.48, postcss@npm:^8.4.49, postcss@npm:^8.5.3": version: 8.5.3 resolution: "postcss@npm:8.5.3" dependencies: @@ -23289,30 +24415,31 @@ __metadata: languageName: node linkType: hard -"rollup@npm:4.34.8": - version: 4.34.8 - resolution: "rollup@npm:4.34.8" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.34.8" - "@rollup/rollup-android-arm64": "npm:4.34.8" - "@rollup/rollup-darwin-arm64": "npm:4.34.8" - "@rollup/rollup-darwin-x64": "npm:4.34.8" - "@rollup/rollup-freebsd-arm64": "npm:4.34.8" - "@rollup/rollup-freebsd-x64": "npm:4.34.8" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.34.8" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.34.8" - "@rollup/rollup-linux-arm64-gnu": "npm:4.34.8" - "@rollup/rollup-linux-arm64-musl": "npm:4.34.8" - "@rollup/rollup-linux-loongarch64-gnu": "npm:4.34.8" - "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.34.8" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.34.8" - "@rollup/rollup-linux-s390x-gnu": "npm:4.34.8" - "@rollup/rollup-linux-x64-gnu": "npm:4.34.8" - "@rollup/rollup-linux-x64-musl": "npm:4.34.8" - "@rollup/rollup-win32-arm64-msvc": "npm:4.34.8" - "@rollup/rollup-win32-ia32-msvc": "npm:4.34.8" - "@rollup/rollup-win32-x64-msvc": "npm:4.34.8" - "@types/estree": "npm:1.0.6" +"rollup@npm:4.40.2": + version: 4.40.2 + resolution: "rollup@npm:4.40.2" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.40.2" + "@rollup/rollup-android-arm64": "npm:4.40.2" + "@rollup/rollup-darwin-arm64": "npm:4.40.2" + "@rollup/rollup-darwin-x64": "npm:4.40.2" + "@rollup/rollup-freebsd-arm64": "npm:4.40.2" + "@rollup/rollup-freebsd-x64": "npm:4.40.2" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.40.2" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.40.2" + "@rollup/rollup-linux-arm64-gnu": "npm:4.40.2" + "@rollup/rollup-linux-arm64-musl": "npm:4.40.2" + "@rollup/rollup-linux-loongarch64-gnu": "npm:4.40.2" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.40.2" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.40.2" + "@rollup/rollup-linux-riscv64-musl": "npm:4.40.2" + "@rollup/rollup-linux-s390x-gnu": "npm:4.40.2" + "@rollup/rollup-linux-x64-gnu": "npm:4.40.2" + "@rollup/rollup-linux-x64-musl": "npm:4.40.2" + "@rollup/rollup-win32-arm64-msvc": "npm:4.40.2" + "@rollup/rollup-win32-ia32-msvc": "npm:4.40.2" + "@rollup/rollup-win32-x64-msvc": "npm:4.40.2" + "@types/estree": "npm:1.0.7" fsevents: "npm:~2.3.2" dependenciesMeta: "@rollup/rollup-android-arm-eabi": @@ -23341,6 +24468,8 @@ __metadata: optional: true "@rollup/rollup-linux-riscv64-gnu": optional: true + "@rollup/rollup-linux-riscv64-musl": + optional: true "@rollup/rollup-linux-s390x-gnu": optional: true "@rollup/rollup-linux-x64-gnu": @@ -23357,7 +24486,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10c0/b9e711e33413112fbb761107c3fddc4561dfc74335c393542a829a85ccfb2763bfd17bf2422d84a2e9bee7646e5367018973e97005fdf64e49c2e209612f0eb6 + checksum: 10c0/cbe9b766891da74fbf7c3b50420bb75102e5c59afc0ea45751f7e43a581d2cd93367763f521f820b72e341cf1f6b9951fbdcd3be67a1b0aa774b754525a8b9c7 languageName: node linkType: hard @@ -23375,7 +24504,7 @@ __metadata: languageName: node linkType: hard -"rollup@npm:^4.30.1, rollup@npm:^4.34.9": +"rollup@npm:^4.34.9": version: 4.40.1 resolution: "rollup@npm:4.40.1" dependencies: @@ -23487,16 +24616,7 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:7.8.1": - version: 7.8.1 - resolution: "rxjs@npm:7.8.1" - dependencies: - tslib: "npm:^2.1.0" - checksum: 10c0/3c49c1ecd66170b175c9cacf5cef67f8914dcbc7cd0162855538d365c83fea631167cacb644b3ce533b2ea0e9a4d0b12175186985f89d75abe73dbd8f7f06f68 - languageName: node - linkType: hard - -"rxjs@npm:^7.8.2": +"rxjs@npm:7.8.2, rxjs@npm:^7.8.2": version: 7.8.2 resolution: "rxjs@npm:7.8.2" dependencies: @@ -23628,9 +24748,9 @@ __metadata: languageName: node linkType: hard -"sass@npm:1.85.0": - version: 1.85.0 - resolution: "sass@npm:1.85.0" +"sass@npm:1.88.0": + version: 1.88.0 + resolution: "sass@npm:1.88.0" dependencies: "@parcel/watcher": "npm:^2.4.1" chokidar: "npm:^4.0.0" @@ -23641,7 +24761,7 @@ __metadata: optional: true bin: sass: sass.js - checksum: 10c0/a1af0c0596ae1904f66337d0c70a684db6e12210f97be4326cc3dcf18b0f956d7bc45ab2bcc7a8422d433d3eb3c9cb2cc8e60b2dafbdd01fb1ae5a23f5424690 + checksum: 10c0/dcb16dc29116bfa5a90485d24fd8020d2b0d95155bd2e31285901588729343b59fefe44365c5f146b2ba5a9ebadef90b23a7220b902507bdbd91ca2ba0a0b688 languageName: node linkType: hard @@ -23746,12 +24866,12 @@ __metadata: languageName: node linkType: hard -"semver@npm:7.7.1, semver@npm:^7.0.0, semver@npm:^7.2.1, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.2, semver@npm:^7.6.3, semver@npm:^7.7.1": - version: 7.7.1 - resolution: "semver@npm:7.7.1" +"semver@npm:7.7.2": + version: 7.7.2 + resolution: "semver@npm:7.7.2" bin: semver: bin/semver.js - checksum: 10c0/fd603a6fb9c399c6054015433051bdbe7b99a940a8fb44b85c2b524c4004b023d7928d47cb22154f8d054ea7ee8597f586605e05b52047f048278e4ac56ae958 + checksum: 10c0/aca305edfbf2383c22571cb7714f48cadc7ac95371b4b52362fb8eeffdfbc0de0669368b82b2b15978f8848f01d7114da65697e56cd8c37b0dab8c58e543f9ea languageName: node linkType: hard @@ -23773,6 +24893,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:^7.0.0, semver@npm:^7.2.1, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.2, semver@npm:^7.6.3, semver@npm:^7.7.1": + version: 7.7.1 + resolution: "semver@npm:7.7.1" + bin: + semver: bin/semver.js + checksum: 10c0/fd603a6fb9c399c6054015433051bdbe7b99a940a8fb44b85c2b524c4004b023d7928d47cb22154f8d054ea7ee8597f586605e05b52047f048278e4ac56ae958 + languageName: node + linkType: hard + "send@npm:0.19.0": version: 0.19.0 resolution: "send@npm:0.19.0" @@ -24462,6 +25591,13 @@ __metadata: languageName: node linkType: hard +"stdin-discarder@npm:^0.2.2": + version: 0.2.2 + resolution: "stdin-discarder@npm:0.2.2" + checksum: 10c0/c78375e82e956d7a64be6e63c809c7f058f5303efcaf62ea48350af072bacdb99c06cba39209b45a071c1acbd49116af30df1df9abb448df78a6005b72f10537 + languageName: node + linkType: hard + "stop-iteration-iterator@npm:^1.0.0": version: 1.1.0 resolution: "stop-iteration-iterator@npm:1.1.0" @@ -25248,7 +26384,21 @@ __metadata: languageName: node linkType: hard -"terser@npm:5.39.0, terser@npm:^5.10.0, terser@npm:^5.31.1": +"terser@npm:5.39.1": + version: 5.39.1 + resolution: "terser@npm:5.39.1" + dependencies: + "@jridgewell/source-map": "npm:^0.3.3" + acorn: "npm:^8.8.2" + commander: "npm:^2.20.0" + source-map-support: "npm:~0.5.20" + bin: + terser: bin/terser + checksum: 10c0/d49e06dd4dd03661dac41f45c9cf187b2aa3fe80775235e838398c29311705169387c007f398ab44cd1bd8f89b14a1eea383feaa95c1cae29e3f5b6b606b6b37 + languageName: node + linkType: hard + +"terser@npm:^5.10.0, terser@npm:^5.31.1": version: 5.39.0 resolution: "terser@npm:5.39.0" dependencies: @@ -25372,7 +26522,7 @@ __metadata: languageName: node linkType: hard -"tinyglobby@npm:^0.2.10, tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.13, tinyglobby@npm:^0.2.9": +"tinyglobby@npm:0.2.13, tinyglobby@npm:^0.2.10, tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.13, tinyglobby@npm:^0.2.9": version: 0.2.13 resolution: "tinyglobby@npm:0.2.13" dependencies: @@ -26572,14 +27722,17 @@ __metadata: languageName: node linkType: hard -"vite@npm:6.2.6": - version: 6.2.6 - resolution: "vite@npm:6.2.6" +"vite@npm:6.3.5": + version: 6.3.5 + resolution: "vite@npm:6.3.5" dependencies: esbuild: "npm:^0.25.0" + fdir: "npm:^6.4.4" fsevents: "npm:~2.3.3" + picomatch: "npm:^4.0.2" postcss: "npm:^8.5.3" - rollup: "npm:^4.30.1" + rollup: "npm:^4.34.9" + tinyglobby: "npm:^0.2.13" peerDependencies: "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 jiti: ">=1.21.0" @@ -26620,7 +27773,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10c0/68a2ed3e61bdd654c59b817b4f3203065241c66d1739faa707499130f3007bc3a666c7a8320a4198e275e62b5e4d34d9b78a6533f69e321d366e76f5093b2071 + checksum: 10c0/df70201659085133abffc6b88dcdb8a57ef35f742a01311fc56a4cfcda6a404202860729cc65a2c401a724f6e25f9ab40ce4339ed4946f550541531ced6fe41c languageName: node linkType: hard @@ -27082,13 +28235,14 @@ __metadata: languageName: node linkType: hard -"webpack-dev-server@npm:5.2.0": - version: 5.2.0 - resolution: "webpack-dev-server@npm:5.2.0" +"webpack-dev-server@npm:5.2.1": + version: 5.2.1 + resolution: "webpack-dev-server@npm:5.2.1" dependencies: "@types/bonjour": "npm:^3.5.13" "@types/connect-history-api-fallback": "npm:^1.5.4" "@types/express": "npm:^4.17.21" + "@types/express-serve-static-core": "npm:^4.17.21" "@types/serve-index": "npm:^1.9.4" "@types/serve-static": "npm:^1.15.5" "@types/sockjs": "npm:^0.3.36" @@ -27122,7 +28276,7 @@ __metadata: optional: true bin: webpack-dev-server: bin/webpack-dev-server.js - checksum: 10c0/afb2e51945ac54ef3039e11e377241e1cb97a8d3f526f39f13c3fa924c530fb6063200c2c3ae4e33e6bcc110d4abed777c09ce18e2d261012853d81f3c5820ab + checksum: 10c0/22bcf2bcc7c72cd2065883ed4368fbcdf20078bc746b07689d10a0546ee99ea00bc50f0474112278ffd8598a5bc237df2bf7bb7f6dcda940a16b1eb91137efea languageName: node linkType: hard @@ -27224,12 +28378,13 @@ __metadata: languageName: node linkType: hard -"webpack@npm:5.98.0": - version: 5.98.0 - resolution: "webpack@npm:5.98.0" +"webpack@npm:5.99.8": + version: 5.99.8 + resolution: "webpack@npm:5.99.8" dependencies: "@types/eslint-scope": "npm:^3.7.7" "@types/estree": "npm:^1.0.6" + "@types/json-schema": "npm:^7.0.15" "@webassemblyjs/ast": "npm:^1.14.1" "@webassemblyjs/wasm-edit": "npm:^1.14.1" "@webassemblyjs/wasm-parser": "npm:^1.14.1" @@ -27246,7 +28401,7 @@ __metadata: loader-runner: "npm:^4.2.0" mime-types: "npm:^2.1.27" neo-async: "npm:^2.6.2" - schema-utils: "npm:^4.3.0" + schema-utils: "npm:^4.3.2" tapable: "npm:^2.1.1" terser-webpack-plugin: "npm:^5.3.11" watchpack: "npm:^2.4.1" @@ -27256,7 +28411,7 @@ __metadata: optional: true bin: webpack: bin/webpack.js - checksum: 10c0/bee4fa77f444802f0beafb2ff30eb5454a606163ad7d3cc9a5dcc9d24033c62407bed04601b25dea49ea3969b352c1b530a86c753246f42560a4a084eefb094e + checksum: 10c0/c4852c3b795ed3fba799d2925802a4e259b2de7c2c597f0aaf0e228acfdc6755389ed8c29f1dad86610a9c6ad968c0b57c702b93891d60f09d302af63b2debe0 languageName: node linkType: hard @@ -27692,6 +28847,13 @@ __metadata: languageName: node linkType: hard +"yargs-parser@npm:^22.0.0": + version: 22.0.0 + resolution: "yargs-parser@npm:22.0.0" + checksum: 10c0/cb7ef81759c4271cb1d96b9351dbbc9a9ce35d3e1122d2b739bf6c432603824fa02c67cc12dcef6ea80283379d63495686e8f41cc7b06c6576e792aba4d33e1c + languageName: node + linkType: hard + "yargs@npm:^15.3.1": version: 15.4.1 resolution: "yargs@npm:15.4.1" @@ -27726,7 +28888,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^17.2.1, yargs@npm:^17.6.2": +"yargs@npm:^17.6.2": version: 17.7.2 resolution: "yargs@npm:17.7.2" dependencies: @@ -27741,6 +28903,20 @@ __metadata: languageName: node linkType: hard +"yargs@npm:^18.0.0": + version: 18.0.0 + resolution: "yargs@npm:18.0.0" + dependencies: + cliui: "npm:^9.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + string-width: "npm:^7.2.0" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^22.0.0" + checksum: 10c0/bf290e4723876ea9c638c786a5c42ac28e03c9ca2325e1424bf43b94e5876456292d3ed905b853ebbba6daf43ed29e772ac2a6b3c5fb1b16533245d6211778f3 + languageName: node + linkType: hard + "yn@npm:3.1.1": version: 3.1.1 resolution: "yn@npm:3.1.1" From 3b2808de2fe4d71ffec4ba9bbad93756eeb15368 Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Fri, 6 Jun 2025 22:06:05 +0200 Subject: [PATCH 40/61] [Angular] fix: angular router versions --- code/frameworks/angular/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/frameworks/angular/package.json b/code/frameworks/angular/package.json index 2219aaa7339d..4fbb2663e14d 100644 --- a/code/frameworks/angular/package.json +++ b/code/frameworks/angular/package.json @@ -52,8 +52,8 @@ "prep": "rimraf dist && jiti ../../../scripts/prepare/tsc.ts" }, "dependencies": { - "@angular/platform-browser-dynamic": "^21.0.0", - "@angular/router": "^21.0.0", + "@angular/platform-browser-dynamic": "^20.0.0", + "@angular/router": "^20.0.0", "@storybook/builder-webpack5": "workspace:*", "@storybook/core-webpack": "workspace:*", "@storybook/global": "^5.0.0", From 60809076e1bb147daa769868c2356c27be77d8bc Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Fri, 6 Jun 2025 22:13:16 +0200 Subject: [PATCH 41/61] [Angular] remove: provideExperimentalZonelessChangeDetection in AbstractRenderer --- .../client/angular-beta/AbstractRenderer.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts index c1b49016a2da..c90fbfb746c7 100644 --- a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts +++ b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts @@ -3,7 +3,7 @@ import { BehaviorSubject, Subject } from 'rxjs'; import { stringify } from 'telejson'; import { ICollection, StoryFnAngularReturnType } from '../types'; import { PropertyExtractor } from './utils/PropertyExtractor'; -import { TestBedComponentBuilder } from './utils/TestBedComponentBuilder';; +import { TestBedComponentBuilder } from './utils/TestBedComponentBuilder'; import { queueBootstrapping } from './utils/BootstrapQueue'; import { bootstrapApplication } from '@angular/platform-browser'; import { getWrapperComponent } from './TestBedWrapperComponent'; @@ -188,14 +188,14 @@ export abstract class AbstractRenderer { ...(storyFnAngular.applicationConfig?.providers ?? []), ]; - if (STORYBOOK_ANGULAR_OPTIONS?.experimentalZoneless) { - const { provideExperimentalZonelessChangeDetection } = await import('@angular/core'); - if (!provideExperimentalZonelessChangeDetection) { - throw new Error('Experimental zoneless change detection requires Angular 18 or higher'); - } else { - environmentProviders.unshift(provideExperimentalZonelessChangeDetection()); - } - } + // if (STORYBOOK_ANGULAR_OPTIONS?.experimentalZoneless) { + // const { provideExperimentalZonelessChangeDetection } = await import('@angular/core'); + // if (!provideExperimentalZonelessChangeDetection) { + // throw new Error('Experimental zoneless change detection requires Angular 18 or higher'); + // } else { + // environmentProviders.unshift(provideExperimentalZonelessChangeDetection()); + // } + // } return { environmentProviders, From 155a2a2cbabf881953b51a958e4195ed259ece9e Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Fri, 6 Jun 2025 22:32:19 +0200 Subject: [PATCH 42/61] [Angular] fix: versioning --- code/frameworks/angular/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/frameworks/angular/package.json b/code/frameworks/angular/package.json index 4fbb2663e14d..f425af24c2b4 100644 --- a/code/frameworks/angular/package.json +++ b/code/frameworks/angular/package.json @@ -87,8 +87,8 @@ }, "peerDependencies": { "@angular-devkit/architect": ">=0.1800.0 < 0.2100.0", - "@angular-devkit/build-angular": ">=0.1800.0 < 0.2100.0", - "@angular-devkit/core": ">=0.1800.0 < 0.2100.0", + "@angular-devkit/build-angular": ">=18.0.0 < 21.0.0", + "@angular-devkit/core": ">=18.0.0 < 21.0.0", "@angular/animations": ">=18.0.0 < 21.0.0", "@angular/cli": ">=18.0.0 < 21.0.0", "@angular/common": ">=18.0.0 < 21.0.0", From d350fd222f97a31a088af7cbbd9d230818e75071 Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Fri, 6 Jun 2025 22:35:52 +0200 Subject: [PATCH 43/61] [Angular] fix: modfing lock file --- code/yarn.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/yarn.lock b/code/yarn.lock index c8c52dbd642c..2e5046b3d949 100644 --- a/code/yarn.lock +++ b/code/yarn.lock @@ -7217,8 +7217,8 @@ __metadata: zone.js: "npm:^0.15.0" peerDependencies: "@angular-devkit/architect": ">=0.1800.0 < 0.2100.0" - "@angular-devkit/build-angular": ">=0.1800.0 < 0.2100.0" - "@angular-devkit/core": ">=0.1800.0 < 0.2100.0" + "@angular-devkit/build-angular": ">=18.0.0 < 21.0.0" + "@angular-devkit/core": ">=18.0.0 < 21.0.0" "@angular/animations": ">=18.0.0 < 21.0.0" "@angular/cli": ">=18.0.0 < 21.0.0" "@angular/common": ">=18.0.0 < 21.0.0" From 933fd0c5cb09aa6e6633a2f55a4fbca44e896cc4 Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Sat, 7 Jun 2025 09:54:43 +0200 Subject: [PATCH 44/61] [Angular] feat: add destroy platform on before-each --- code/frameworks/angular/src/client/config.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/frameworks/angular/src/client/config.ts b/code/frameworks/angular/src/client/config.ts index b32b9eafeb80..27afd7de9898 100644 --- a/code/frameworks/angular/src/client/config.ts +++ b/code/frameworks/angular/src/client/config.ts @@ -8,6 +8,7 @@ import { enhanceArgTypes } from 'storybook/internal/docs-tools'; import { ArgTypesEnhancer, Parameters } from 'storybook/internal/types'; import { extractArgTypes, extractComponentDescription } from './compodoc'; +import { destroyPlatform, getPlatform } from '@angular/core'; export const parameters: Parameters = { renderer: 'angular', @@ -22,6 +23,7 @@ export const argTypesEnhancers: ArgTypesEnhancer[] = [enhanceArgTypes]; export const beforeEach = () => { return () => { + if (getPlatform()) destroyPlatform(); TestBed.resetTestingModule().resetTestEnvironment(); }; }; From f4ae462c38e8f14119f182d8fd427b41fdc14772 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Tue, 22 Jul 2025 10:26:59 +0200 Subject: [PATCH 45/61] Make @angular/router optional --- code/frameworks/angular/package.json | 6 ++-- .../client/angular-beta/AbstractRenderer.ts | 20 +++++++----- .../angular-beta/TestBedDocsRenderer.ts | 2 +- .../client/angular-beta/TestBedRenderer.ts | 2 +- .../utils/TestBedComponentBuilder.ts | 31 +++++++++++++------ .../utils/TestBedOverrideMetaDataGenerator.ts | 5 ++- .../router-component/router-component.ts | 5 +-- .../router/router.stories.ts | 3 +- 8 files changed, 46 insertions(+), 28 deletions(-) rename code/frameworks/angular/template/{stories/core => stories_angular-cli-default-ts}/router/router-component/router-component.ts (74%) rename code/frameworks/angular/template/{stories/core => stories_angular-cli-default-ts}/router/router.stories.ts (89%) diff --git a/code/frameworks/angular/package.json b/code/frameworks/angular/package.json index 788bcfd0699a..38a99b5fec12 100644 --- a/code/frameworks/angular/package.json +++ b/code/frameworks/angular/package.json @@ -89,7 +89,6 @@ }, "dependencies": { "@angular/platform-browser-dynamic": "^20.0.0", - "@angular/router": "^20.0.0", "@storybook/builder-webpack5": "workspace:*", "@storybook/global": "^5.0.0", "telejson": "8.0.0", @@ -146,6 +145,9 @@ "@angular/cli": { "optional": true }, + "@angular/router": { + "optional": true + }, "zone.js": { "optional": true } @@ -174,4 +176,4 @@ ] }, "gitHead": "e6a7fd8a655c69780bc20b9749c2699e44beae16" -} \ No newline at end of file +} diff --git a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts index 675b1e1ed7a6..9ee4ea201920 100644 --- a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts +++ b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts @@ -1,7 +1,8 @@ -import { ApplicationRef, NgModule } from '@angular/core'; -import { BehaviorSubject, Subject } from 'rxjs'; +import type { ApplicationRef, NgModule } from '@angular/core'; +import type { Subject } from 'rxjs'; +import { BehaviorSubject } from 'rxjs'; import { stringify } from 'telejson'; -import { ICollection, StoryFnAngularReturnType } from '../types'; +import type { ICollection, StoryFnAngularReturnType } from '../types'; import { PropertyExtractor } from './utils/PropertyExtractor'; import { TestBedComponentBuilder } from './utils/TestBedComponentBuilder'; import { queueBootstrapping } from './utils/BootstrapQueue'; @@ -125,12 +126,10 @@ export abstract class AbstractRenderer { */ public async renderWithTestBed({ storyFnAngular, - forced, component, targetDOMNode, }: { storyFnAngular: StoryFnAngularReturnType; - forced: boolean; component?: any; targetDOMNode: HTMLElement; }) { @@ -148,9 +147,14 @@ export abstract class AbstractRenderer { .setMetaData(analyzedMetadata) .setTargetNode(targetDOMNode) .setEnvironmentProviders(environmentProviders) - .configure() - .initRouter() - .compileComponents(); + .configure(); + + try { + const { Router } = await import('@angular/router'); + componentBuilder.initRouter(Router).compileComponents(); + } catch (e) { + componentBuilder.compileComponents(); + } componentBuilder.copyComponentIntoTargetNode(); diff --git a/code/frameworks/angular/src/client/angular-beta/TestBedDocsRenderer.ts b/code/frameworks/angular/src/client/angular-beta/TestBedDocsRenderer.ts index e37b6d8a2140..af8378772b79 100644 --- a/code/frameworks/angular/src/client/angular-beta/TestBedDocsRenderer.ts +++ b/code/frameworks/angular/src/client/angular-beta/TestBedDocsRenderer.ts @@ -1,7 +1,7 @@ import { DOCS_RENDERED, STORY_CHANGED } from 'storybook/internal/core-events'; import { addons } from 'storybook/preview-api'; -import { Parameters, StoryFnAngularReturnType } from '../types'; +import type { Parameters, StoryFnAngularReturnType } from '../types'; import { AbstractRenderer, STORY_UID_ATTRIBUTE } from './AbstractRenderer'; import { getNextStoryUID } from './utils/StoryUID'; export class TestBedDocsRenderer extends AbstractRenderer { diff --git a/code/frameworks/angular/src/client/angular-beta/TestBedRenderer.ts b/code/frameworks/angular/src/client/angular-beta/TestBedRenderer.ts index eaa267973011..19c27394e80f 100644 --- a/code/frameworks/angular/src/client/angular-beta/TestBedRenderer.ts +++ b/code/frameworks/angular/src/client/angular-beta/TestBedRenderer.ts @@ -1,5 +1,5 @@ import { AbstractRenderer } from './AbstractRenderer'; -import { StoryFnAngularReturnType, Parameters } from '../types'; +import type { StoryFnAngularReturnType, Parameters } from '../types'; export class TestBedRenderer extends AbstractRenderer { public async render(options: { diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts index 045e6baeb116..cf0d6f906ff1 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts @@ -1,13 +1,13 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; +import type { ComponentFixture } from '@angular/core/testing'; +import { TestBed } from '@angular/core/testing'; import { BrowserDynamicTestingModule, platformBrowserDynamicTesting, } from '@angular/platform-browser-dynamic/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { Router } from '@angular/router'; -import { ApplicationRef, ComponentFactoryResolver, Type } from '@angular/core'; -import { PropertyExtractor } from './PropertyExtractor'; -import { ICollection, StoryFnAngularReturnType } from '../../types'; +import type { Type } from '@angular/core'; +import { ApplicationRef, ComponentFactoryResolver } from '@angular/core'; +import type { PropertyExtractor } from './PropertyExtractor'; +import type { ICollection, StoryFnAngularReturnType } from '../../types'; import { getWrapperModule } from '../TestBedWrapperComponent'; import { GenerateComponentMetaData, @@ -91,13 +91,22 @@ export class TestBedComponentBuilder { return this; } - configure() { + async configure() { this.throwOnMissingTestBedInstance(); this.throwOnMissingComponent(); const wrapperModule = getWrapperModule(); + const imports = await (async () => { + try { + const { RouterTestingModule } = await import('@angular/router/testing'); + const routeModuleImport = this.getRouteModuleImport(RouterTestingModule); + if (routeModuleImport.length > 0) return [routeModuleImport]; + } catch (e) { + return []; + } + })(); this.testBedInstance .configureTestingModule({ - imports: [this.getRouteModuleImport()], + imports, }) .overrideComponent( this.component, @@ -117,7 +126,7 @@ export class TestBedComponentBuilder { return this; } - initRouter() { + initRouter(Router: typeof import('@angular/router').Router) { const router = this.testBedInstance.inject(Router); router.initialNavigation(); return this; @@ -164,7 +173,9 @@ export class TestBedComponentBuilder { return this; } - private getRouteModuleImport(): any[] { + private getRouteModuleImport( + RouterTestingModule: typeof import('@angular/router/testing').RouterTestingModule + ): any[] { if (this.routes === null || this.routes === undefined) return []; return [RouterTestingModule.withRoutes(this.routes.routes, this.routes.options)]; diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts index d74f6dfa57f8..f9dce11f3987 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts @@ -1,6 +1,5 @@ -import { Component, NgModule, Type } from '@angular/core'; -import { MetadataOverride } from '@angular/core/testing'; -import { Router } from '@angular/router'; +import type { Component, NgModule, Type } from '@angular/core'; +import type { MetadataOverride } from '@angular/core/testing'; export const GenerateComponentMetaData = ( selector: string, diff --git a/code/frameworks/angular/template/stories/core/router/router-component/router-component.ts b/code/frameworks/angular/template/stories_angular-cli-default-ts/router/router-component/router-component.ts similarity index 74% rename from code/frameworks/angular/template/stories/core/router/router-component/router-component.ts rename to code/frameworks/angular/template/stories_angular-cli-default-ts/router/router-component/router-component.ts index c7538b2cff83..107439111fcf 100644 --- a/code/frameworks/angular/template/stories/core/router/router-component/router-component.ts +++ b/code/frameworks/angular/template/stories_angular-cli-default-ts/router/router-component/router-component.ts @@ -1,6 +1,7 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { Router, RouterModule } from '@angular/router'; +import type { Router } from '@angular/router'; +import { RouterModule } from '@angular/router'; @Component({ standalone: true, diff --git a/code/frameworks/angular/template/stories/core/router/router.stories.ts b/code/frameworks/angular/template/stories_angular-cli-default-ts/router/router.stories.ts similarity index 89% rename from code/frameworks/angular/template/stories/core/router/router.stories.ts rename to code/frameworks/angular/template/stories_angular-cli-default-ts/router/router.stories.ts index 8122a7c57030..1de7ff827de9 100644 --- a/code/frameworks/angular/template/stories/core/router/router.stories.ts +++ b/code/frameworks/angular/template/stories_angular-cli-default-ts/router/router.stories.ts @@ -1,4 +1,5 @@ -import { Meta, StoryObj, applicationConfig, moduleMetadata } from '@storybook/angular'; +import type { Meta, StoryObj } from '@storybook/angular'; +import { applicationConfig, moduleMetadata } from '@storybook/angular'; import { RouterModule } from '@angular/router'; import { Component } from '@angular/core'; import ProvideRouterComponent from './router-component/router-component'; From 2a5164909e8352c00a5d0b8dfe8c0886ff1850b5 Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Tue, 22 Jul 2025 22:11:36 +0200 Subject: [PATCH 46/61] [Angular] fix: add missing await statements --- .../angular/src/client/angular-beta/AbstractRenderer.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts index 9ee4ea201920..589b2e291f90 100644 --- a/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts +++ b/code/frameworks/angular/src/client/angular-beta/AbstractRenderer.ts @@ -151,9 +151,9 @@ export abstract class AbstractRenderer { try { const { Router } = await import('@angular/router'); - componentBuilder.initRouter(Router).compileComponents(); + await componentBuilder.initRouter(Router).compileComponents(); } catch (e) { - componentBuilder.compileComponents(); + await componentBuilder.compileComponents(); } componentBuilder.copyComponentIntoTargetNode(); From 2d6b1931fab1c0d1f354ae4d2934e3d7b6114142 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Wed, 23 Jul 2025 13:56:57 +0200 Subject: [PATCH 47/61] Introduce previewTestBedRenderer feature for enhanced component rendering --- code/core/src/types/modules/core-common.ts | 7 +++++++ code/frameworks/angular/src/client/render.ts | 2 +- code/frameworks/angular/src/client/types.ts | 1 - .../rendering-overrides-attributes.stories.ts | 5 +---- .../provider-with-module-wrapper.stories.ts | 6 ++---- ...viders-for-not-standalone-components.stories.ts | 6 ++---- .../core/sanatizer/dom-sanitizer-test.stories.ts | 5 +---- .../router/router.stories.ts | 3 --- code/lib/cli-storybook/src/sandbox-templates.ts | 14 ++++++++++++++ 9 files changed, 28 insertions(+), 21 deletions(-) diff --git a/code/core/src/types/modules/core-common.ts b/code/core/src/types/modules/core-common.ts index caff102504df..ba7c4028cb15 100644 --- a/code/core/src/types/modules/core-common.ts +++ b/code/core/src/types/modules/core-common.ts @@ -448,6 +448,13 @@ export interface StorybookConfigRaw { * Set NODE_ENV to development in built Storybooks for better testability and debuggability */ developmentModeForBuild?: boolean; + + /** + * Use TestBed to render Angular components in the preview instead of the default renderer. See: + * https://github.com/storybookjs/storybook/discussions/31088 + */ + previewTestBedRenderer?: boolean; + /** Only show input controls in Angular */ angularFilterNonInputControls?: boolean; }; diff --git a/code/frameworks/angular/src/client/render.ts b/code/frameworks/angular/src/client/render.ts index e7ac4c3cce65..e0f9b827cf24 100644 --- a/code/frameworks/angular/src/client/render.ts +++ b/code/frameworks/angular/src/client/render.ts @@ -17,7 +17,7 @@ export async function renderToCanvas( const renderer = await rendererFactory.getRendererInstance( element, - storyContext.parameters.useTestBedRenderer ?? false + globalThis.FEATURES?.previewTestBedRenderer ?? false ); await renderer.render({ diff --git a/code/frameworks/angular/src/client/types.ts b/code/frameworks/angular/src/client/types.ts index 893702b3608b..463939244712 100644 --- a/code/frameworks/angular/src/client/types.ts +++ b/code/frameworks/angular/src/client/types.ts @@ -54,7 +54,6 @@ export interface AngularRenderer extends WebRenderer { export type Parameters = DefaultParameters & { bootstrapModuleOptions?: unknown; - useTestBedRenderer?: boolean; }; export type StoryContext = DefaultStoryContext & { parameters: Parameters }; diff --git a/code/frameworks/angular/template/stories/core/parameters/rendering-overrides-attributes.stories.ts b/code/frameworks/angular/template/stories/core/parameters/rendering-overrides-attributes.stories.ts index 72d7ad5fe4b5..0d3d663275f8 100644 --- a/code/frameworks/angular/template/stories/core/parameters/rendering-overrides-attributes.stories.ts +++ b/code/frameworks/angular/template/stories/core/parameters/rendering-overrides-attributes.stories.ts @@ -1,12 +1,9 @@ -import { Meta, StoryObj } from '@storybook/angular'; +import type { Meta, StoryObj } from '@storybook/angular'; import RenderingBugComponent from './rendering-bug-component/rendering-bug-component'; const meta: Meta = { component: RenderingBugComponent, tags: ['autodocs'], - parameters: { - useTestBedRenderer: true, - }, }; export default meta; diff --git a/code/frameworks/angular/template/stories/core/provider/provider-with-module-wrapper.stories.ts b/code/frameworks/angular/template/stories/core/provider/provider-with-module-wrapper.stories.ts index 5626e9d1ed34..30baae691d5b 100644 --- a/code/frameworks/angular/template/stories/core/provider/provider-with-module-wrapper.stories.ts +++ b/code/frameworks/angular/template/stories/core/provider/provider-with-module-wrapper.stories.ts @@ -1,4 +1,5 @@ -import { Meta, StoryObj, moduleMetadata } from '@storybook/angular'; +import type { Meta, StoryObj } from '@storybook/angular'; +import { moduleMetadata } from '@storybook/angular'; import ProviderButtonComponent, { ApiService } from './test-component/provider-button'; class MockService { @@ -15,9 +16,6 @@ const meta: Meta = { providers: [{ provide: ApiService, useValue: mockService }], }), ], - parameters: { - useTestBedRenderer: true, - }, }; export default meta; diff --git a/code/frameworks/angular/template/stories/core/provider/providers-for-not-standalone-components.stories.ts b/code/frameworks/angular/template/stories/core/provider/providers-for-not-standalone-components.stories.ts index 80c3d5914eaa..0e5e1854dbe6 100644 --- a/code/frameworks/angular/template/stories/core/provider/providers-for-not-standalone-components.stories.ts +++ b/code/frameworks/angular/template/stories/core/provider/providers-for-not-standalone-components.stories.ts @@ -1,4 +1,5 @@ -import { Meta, StoryObj, moduleMetadata } from '@storybook/angular'; +import type { Meta, StoryObj } from '@storybook/angular'; +import { moduleMetadata } from '@storybook/angular'; import NotStandaloneComponent, { ApiModule, } from './not-standalone-component/not-standalone-component'; @@ -11,9 +12,6 @@ const meta: Meta = { imports: [ApiModule], }), ], - parameters: { - useTestBedRenderer: true, - }, }; export default meta; diff --git a/code/frameworks/angular/template/stories/core/sanatizer/dom-sanitizer-test.stories.ts b/code/frameworks/angular/template/stories/core/sanatizer/dom-sanitizer-test.stories.ts index 8cc90e508900..30884a1c5842 100644 --- a/code/frameworks/angular/template/stories/core/sanatizer/dom-sanitizer-test.stories.ts +++ b/code/frameworks/angular/template/stories/core/sanatizer/dom-sanitizer-test.stories.ts @@ -1,12 +1,9 @@ -import { Meta, StoryObj } from '@storybook/angular'; +import type { Meta, StoryObj } from '@storybook/angular'; import SanitizerTestComponent from './test-component/sanitizer-test-component'; const meta: Meta = { component: SanitizerTestComponent, tags: ['autodocs'], - parameters: { - useTestBedRenderer: true, - }, }; export default meta; diff --git a/code/frameworks/angular/template/stories_angular-cli-default-ts/router/router.stories.ts b/code/frameworks/angular/template/stories_angular-cli-default-ts/router/router.stories.ts index 1de7ff827de9..988c26787d70 100644 --- a/code/frameworks/angular/template/stories_angular-cli-default-ts/router/router.stories.ts +++ b/code/frameworks/angular/template/stories_angular-cli-default-ts/router/router.stories.ts @@ -32,9 +32,6 @@ const meta: Meta = { }, }), ], - parameters: { - useTestBedRenderer: true, - }, render: (args) => { return { template: ` diff --git a/code/lib/cli-storybook/src/sandbox-templates.ts b/code/lib/cli-storybook/src/sandbox-templates.ts index a997e083f96e..77ee096893fe 100644 --- a/code/lib/cli-storybook/src/sandbox-templates.ts +++ b/code/lib/cli-storybook/src/sandbox-templates.ts @@ -479,6 +479,13 @@ export const baseTemplates = { renderer: '@storybook/angular', builder: '@storybook/builder-webpack5', }, + modifications: { + mainConfig: { + features: { + previewTestBedRenderer: true, + }, + }, + }, skipTasks: ['e2e-tests-dev', 'bench', 'vitest-integration'], }, 'angular-cli/default-ts': { @@ -490,6 +497,13 @@ export const baseTemplates = { renderer: '@storybook/angular', builder: '@storybook/builder-webpack5', }, + modifications: { + mainConfig: { + features: { + previewTestBedRenderer: true, + }, + }, + }, skipTasks: ['e2e-tests-dev', 'bench', 'vitest-integration'], }, 'svelte-kit/skeleton-ts': { From 49c603c2e2989547af3a6697529c33b11bc3161f Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Wed, 23 Jul 2025 16:14:29 +0200 Subject: [PATCH 48/61] Remove previewTestBedRenderer feature from Angular templates --- code/lib/cli-storybook/src/sandbox-templates.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/lib/cli-storybook/src/sandbox-templates.ts b/code/lib/cli-storybook/src/sandbox-templates.ts index 77ee096893fe..a89f066f1673 100644 --- a/code/lib/cli-storybook/src/sandbox-templates.ts +++ b/code/lib/cli-storybook/src/sandbox-templates.ts @@ -482,7 +482,7 @@ export const baseTemplates = { modifications: { mainConfig: { features: { - previewTestBedRenderer: true, + previewTestBedRenderer: false, }, }, }, @@ -500,7 +500,7 @@ export const baseTemplates = { modifications: { mainConfig: { features: { - previewTestBedRenderer: true, + previewTestBedRenderer: false, }, }, }, From 04efc4f4c7ab526d1a621d173a10814b521305e6 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Wed, 23 Jul 2025 16:18:25 +0200 Subject: [PATCH 49/61] Refactor TestBedDocsRenderer to remove forced rendering option --- .../angular/src/client/angular-beta/TestBedDocsRenderer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/frameworks/angular/src/client/angular-beta/TestBedDocsRenderer.ts b/code/frameworks/angular/src/client/angular-beta/TestBedDocsRenderer.ts index af8378772b79..71f15bc07b89 100644 --- a/code/frameworks/angular/src/client/angular-beta/TestBedDocsRenderer.ts +++ b/code/frameworks/angular/src/client/angular-beta/TestBedDocsRenderer.ts @@ -33,7 +33,7 @@ export class TestBedDocsRenderer extends AbstractRenderer { await TestBedDocsRenderer.resetApplications(); }); - await super.renderWithTestBed({ ...options, forced: true }); + await super.renderWithTestBed({ ...options }); } async beforeFullRender(domNode?: HTMLElement): Promise { From fc7e5742f0d5b92ca2a58949c14758575480b310 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Wed, 23 Jul 2025 21:50:05 +0200 Subject: [PATCH 50/61] Angular: Disable prod mode if new TestBed renderer is used --- code/frameworks/angular/src/preset.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/code/frameworks/angular/src/preset.ts b/code/frameworks/angular/src/preset.ts index 965fa5f32b2a..bcafd8674a43 100644 --- a/code/frameworks/angular/src/preset.ts +++ b/code/frameworks/angular/src/preset.ts @@ -3,6 +3,7 @@ import { dirname, join } from 'node:path'; import type { PresetProperty } from 'storybook/internal/types'; import type { StandaloneOptions } from './builders/utils/standalone-options'; +import { logger } from 'storybook/internal/node-logger'; const getAbsolutePath = (input: I): I => dirname(require.resolve(join(input, 'package.json'))) as any; @@ -19,12 +20,22 @@ export const previewAnnotations: PresetProperty<'previewAnnotations'> = async ( const config = join(getAbsolutePath('@storybook/angular'), 'dist/client/config.mjs'); const annotations = [...entries, config]; - if ((options as any as StandaloneOptions).enableProdMode) { + const isTestBedRenderer = options.features?.previewTestBedRenderer ?? false; + const isProdMode = (options as any as StandaloneOptions).enableProdMode; + + if (isProdMode && isTestBedRenderer !== true) { + logger.info('Angular is running in production mode'); const previewProdPath = join( getAbsolutePath('@storybook/angular'), 'dist/client/preview-prod.mjs' ); annotations.unshift(previewProdPath); + } else { + logger.info( + isProdMode + ? 'New TestBed Renderer is enabled: Angular is running in development mode' + : 'Angular is running in development mode' + ); } const docsConfig = await options.presets.apply('docs', {}, options); From 63a06a30e41c6305ab46961c23f5a7c1405d7de3 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Wed, 23 Jul 2025 21:50:16 +0200 Subject: [PATCH 51/61] Update sandbox-templates to enable previewTestBedRenderer feature for enhanced component rendering --- code/lib/cli-storybook/src/sandbox-templates.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/lib/cli-storybook/src/sandbox-templates.ts b/code/lib/cli-storybook/src/sandbox-templates.ts index a89f066f1673..77ee096893fe 100644 --- a/code/lib/cli-storybook/src/sandbox-templates.ts +++ b/code/lib/cli-storybook/src/sandbox-templates.ts @@ -482,7 +482,7 @@ export const baseTemplates = { modifications: { mainConfig: { features: { - previewTestBedRenderer: false, + previewTestBedRenderer: true, }, }, }, @@ -500,7 +500,7 @@ export const baseTemplates = { modifications: { mainConfig: { features: { - previewTestBedRenderer: false, + previewTestBedRenderer: true, }, }, }, From 927762ceb5c182b5adb09f2233a289f1ea7c255f Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Wed, 23 Jul 2025 21:50:56 +0200 Subject: [PATCH 52/61] Fix linting --- .../sanatizer/test-component/sanitizer-test-component.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/frameworks/angular/template/stories/core/sanatizer/test-component/sanitizer-test-component.ts b/code/frameworks/angular/template/stories/core/sanatizer/test-component/sanitizer-test-component.ts index 22ce1fd522c0..88402a475bef 100644 --- a/code/frameworks/angular/template/stories/core/sanatizer/test-component/sanitizer-test-component.ts +++ b/code/frameworks/angular/template/stories/core/sanatizer/test-component/sanitizer-test-component.ts @@ -1,6 +1,6 @@ -import { Component, Injectable, Input, OnChanges } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser'; +import type { OnChanges } from '@angular/core'; +import { Component, Injectable, Input } from '@angular/core'; +import type { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser'; @Injectable() export class ApiService { From 2506aed741d8a0f0d0fff8465e351bcecde05e3d Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Sat, 26 Jul 2025 12:13:36 +0200 Subject: [PATCH 53/61] [Angular] fix: story html width --- .../src/client/angular-beta/utils/TestBedComponentBuilder.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts index cf0d6f906ff1..621e4981e824 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts @@ -146,8 +146,8 @@ export class TestBedComponentBuilder { copyComponentIntoTargetNode() { this.throwOnMissingFixture(); this.throwOnMissingTargetNode(); - this.targetNode.appendChild(this.fixture.nativeElement); - this.fixture.autoDetectChanges(true); + this.targetNode.append(...this.fixture.nativeElement.childNodes); + this.fixture.detectChanges(); } private calculateComponentInputs() { From 2c5872983fa7150f25a00ffb363f220ef8c7408b Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Sat, 26 Jul 2025 12:24:43 +0200 Subject: [PATCH 54/61] [Angular] fix: chip module story --- .../stories/basics/ng-module/import-module-chip.stories.ts | 2 +- .../template/stories/basics/ng-module/import-module.stories.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/frameworks/angular/template/stories/basics/ng-module/import-module-chip.stories.ts b/code/frameworks/angular/template/stories/basics/ng-module/import-module-chip.stories.ts index 95d9e49a2f83..00b5d7fb6d94 100644 --- a/code/frameworks/angular/template/stories/basics/ng-module/import-module-chip.stories.ts +++ b/code/frameworks/angular/template/stories/basics/ng-module/import-module-chip.stories.ts @@ -8,7 +8,7 @@ const meta: Meta = { component: ChipComponent, decorators: [ moduleMetadata({ - imports: [ChipsModule], + imports: [ChipsModule.forRoot()], }), ], }; diff --git a/code/frameworks/angular/template/stories/basics/ng-module/import-module.stories.ts b/code/frameworks/angular/template/stories/basics/ng-module/import-module.stories.ts index 4865dfb2f9f4..c6c026f83a38 100644 --- a/code/frameworks/angular/template/stories/basics/ng-module/import-module.stories.ts +++ b/code/frameworks/angular/template/stories/basics/ng-module/import-module.stories.ts @@ -9,7 +9,7 @@ const meta: Meta = { component: ChipsGroupComponent, decorators: [ moduleMetadata({ - imports: [ChipsModule], + imports: [ChipsModule.forRoot()], }), ], }; From 37604c98fd97ee175481b1d2c062109a6be6a0c0 Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Sat, 26 Jul 2025 15:13:06 +0200 Subject: [PATCH 55/61] [Angular] fix: getting provider from ModuleWithProviders --- .../angular-beta/utils/TestBedComponentBuilder.ts | 7 ++++++- .../utils/TestBedOverrideMetaDataGenerator.ts | 14 ++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts index 621e4981e824..71083de575eb 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts @@ -77,6 +77,7 @@ export class TestBedComponentBuilder { const { imports, declarations, providers } = metaData; this.imports = imports; this.declarations = declarations; + // only works on standalone component this.componentProviders = providers; return this; } @@ -120,7 +121,11 @@ export class TestBedComponentBuilder { ) .overrideModule( wrapperModule, - GenerateModuleMetaData(this.environmentProviders, this.declarations, this.imports) + GenerateModuleMetaData( + [...this.componentProviders, ...this.environmentProviders], + this.declarations, + this.imports + ) ); return this; diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts index f9dce11f3987..356a03040b6b 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts @@ -1,4 +1,4 @@ -import type { Component, NgModule, Type } from '@angular/core'; +import type { Component, ModuleWithProviders, NgModule, Type } from '@angular/core'; import type { MetadataOverride } from '@angular/core/testing'; export const GenerateComponentMetaData = ( @@ -29,12 +29,18 @@ export const GenerateModuleMetaData = ( declarations: any[], imports: any[] ) => { + const moduleWithProviders = imports.filter(isModuleWithProviders) as ModuleWithProviders[]; + const plainModules = imports.filter((imp) => !isModuleWithProviders(imp)); return { add: { - exports: [...declarations, ...imports], + exports: [...declarations, ...moduleWithProviders.map((x) => x.ngModule), ...plainModules], declarations: declarations, - imports: imports, - providers: environmentProvider, + imports: [...moduleWithProviders.map((x) => x.ngModule), ...plainModules], + providers: [...environmentProvider, ...moduleWithProviders.flatMap((x) => x.providers)], }, } as MetadataOverride; }; + +function isModuleWithProviders(obj: any): obj is ModuleWithProviders { + return obj && typeof obj === 'object' && 'ngModule' in obj; +} From 3b5df69c895ea41aa0a24b2eefea63f560511c81 Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Mon, 28 Jul 2025 14:19:48 +0200 Subject: [PATCH 56/61] [Angular] fix: getting provider from ModuleWithProviders --- .../angular-beta/utils/TestBedComponentBuilder.ts | 11 ++++++++--- .../utils/TestBedOverrideMetaDataGenerator.ts | 14 ++++---------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts index 71083de575eb..81d90fbf301a 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts @@ -4,7 +4,7 @@ import { BrowserDynamicTestingModule, platformBrowserDynamicTesting, } from '@angular/platform-browser-dynamic/testing'; -import type { Type } from '@angular/core'; +import type { ModuleWithProviders, Type } from '@angular/core'; import { ApplicationRef, ComponentFactoryResolver } from '@angular/core'; import type { PropertyExtractor } from './PropertyExtractor'; import type { ICollection, StoryFnAngularReturnType } from '../../types'; @@ -100,14 +100,15 @@ export class TestBedComponentBuilder { try { const { RouterTestingModule } = await import('@angular/router/testing'); const routeModuleImport = this.getRouteModuleImport(RouterTestingModule); - if (routeModuleImport.length > 0) return [routeModuleImport]; + return routeModuleImport.length > 0 ? [routeModuleImport] : []; } catch (e) { return []; } })(); + const moduleWithProviders = this.imports.filter(this.isModuleWithProviders); this.testBedInstance .configureTestingModule({ - imports, + imports: [...imports, ...moduleWithProviders], }) .overrideComponent( this.component, @@ -201,4 +202,8 @@ export class TestBedComponentBuilder { private throwOnMissingTargetNode() { if (this.targetNode == null) throw new Error('TargetNode is null'); } + + private isModuleWithProviders(obj: any): obj is ModuleWithProviders { + return obj && typeof obj === 'object' && 'ngModule' in obj; + } } diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts index 356a03040b6b..f9dce11f3987 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts @@ -1,4 +1,4 @@ -import type { Component, ModuleWithProviders, NgModule, Type } from '@angular/core'; +import type { Component, NgModule, Type } from '@angular/core'; import type { MetadataOverride } from '@angular/core/testing'; export const GenerateComponentMetaData = ( @@ -29,18 +29,12 @@ export const GenerateModuleMetaData = ( declarations: any[], imports: any[] ) => { - const moduleWithProviders = imports.filter(isModuleWithProviders) as ModuleWithProviders[]; - const plainModules = imports.filter((imp) => !isModuleWithProviders(imp)); return { add: { - exports: [...declarations, ...moduleWithProviders.map((x) => x.ngModule), ...plainModules], + exports: [...declarations, ...imports], declarations: declarations, - imports: [...moduleWithProviders.map((x) => x.ngModule), ...plainModules], - providers: [...environmentProvider, ...moduleWithProviders.flatMap((x) => x.providers)], + imports: imports, + providers: environmentProvider, }, } as MetadataOverride; }; - -function isModuleWithProviders(obj: any): obj is ModuleWithProviders { - return obj && typeof obj === 'object' && 'ngModule' in obj; -} From 474b9ee5d7b14a3c32704d1a1d336fc53a0736df Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Tue, 29 Jul 2025 19:41:50 +0200 Subject: [PATCH 57/61] [Angular] fix: input signals error due invalid value set --- .../utils/TestBedComponentBuilder.ts | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts index 81d90fbf301a..55029b88184e 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts @@ -108,7 +108,7 @@ export class TestBedComponentBuilder { const moduleWithProviders = this.imports.filter(this.isModuleWithProviders); this.testBedInstance .configureTestingModule({ - imports: [...imports, ...moduleWithProviders], + imports: [...imports, ...moduleWithProviders, wrapperModule], }) .overrideComponent( this.component, @@ -125,7 +125,7 @@ export class TestBedComponentBuilder { GenerateModuleMetaData( [...this.componentProviders, ...this.environmentProviders], this.declarations, - this.imports + [...this.imports, ...moduleWithProviders.map((x) => x.ngModule)] ) ); @@ -167,10 +167,17 @@ export class TestBedComponentBuilder { private updateComponentProps() { this.throwOnMissingFixture(); this.calculateComponentInputs(); - if (this.props != null) { - this.fixture.componentInstance = Object.assign(this.fixture.componentInstance, this.props); - for (const key in this.props) { - if (!this.componentInputs.includes(key)) continue; + if (this.props == null) { + this.fixture.detectChanges(); + return this; + } + for (const key in this.props) { + if (!this.componentInputs.includes(key)) { + this.fixture.componentInstance = Object.assign( + this.fixture.componentInstance, + this.props[key] + ); + } else { // had to be done to trigger angular's lifecycle hook like ngOnchange this.fixture.componentRef.setInput(key, this.props[key]); } From 7dbd6a30afbfb557f17c68b69da9f2336084498f Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Tue, 29 Jul 2025 19:53:26 +0200 Subject: [PATCH 58/61] [Angular] fix: circular dependency wrapper module --- .../client/angular-beta/utils/TestBedComponentBuilder.ts | 8 +------- .../utils/TestBedOverrideMetaDataGenerator.ts | 4 +--- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts index 55029b88184e..d7649144f1ef 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts @@ -112,13 +112,7 @@ export class TestBedComponentBuilder { }) .overrideComponent( this.component, - GenerateComponentMetaData( - this.selector, - this.componentProviders, - this.styles, - this.schemas, - wrapperModule - ) + GenerateComponentMetaData(this.selector, this.componentProviders, this.styles, this.schemas) ) .overrideModule( wrapperModule, diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts index f9dce11f3987..d25fba31d0a1 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts @@ -5,15 +5,13 @@ export const GenerateComponentMetaData = ( selector: string, componentProvider: any[], styles: string[], - schemas: any[], - wrapperModule: Type + schemas: any[] ) => { const overrideMetadata = { add: { providers: componentProvider ?? [], styles: styles ?? [], selector: selector, - imports: [wrapperModule], }, } as MetadataOverride; From e418f7820f3ea840e8e8d5f4e69f46db59e5be1c Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Wed, 30 Jul 2025 22:44:40 +0200 Subject: [PATCH 59/61] [Angular] fix: declarations --- .../utils/TestBedComponentBuilder.ts | 21 ++++++++++++------- .../utils/TestBedOverrideMetaDataGenerator.ts | 11 ++++------ 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts index d7649144f1ef..fc8cbe58ff13 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedComponentBuilder.ts @@ -108,19 +108,26 @@ export class TestBedComponentBuilder { const moduleWithProviders = this.imports.filter(this.isModuleWithProviders); this.testBedInstance .configureTestingModule({ - imports: [...imports, ...moduleWithProviders, wrapperModule], + imports: [...imports, ...moduleWithProviders], + declarations: [...this.declarations], + providers: [...this.componentProviders, ...this.environmentProviders], }) .overrideComponent( this.component, - GenerateComponentMetaData(this.selector, this.componentProviders, this.styles, this.schemas) + GenerateComponentMetaData( + this.selector, + this.componentProviders, + this.styles, + this.schemas, + wrapperModule + ) ) .overrideModule( wrapperModule, - GenerateModuleMetaData( - [...this.componentProviders, ...this.environmentProviders], - this.declarations, - [...this.imports, ...moduleWithProviders.map((x) => x.ngModule)] - ) + GenerateModuleMetaData(this.declarations, [ + ...this.imports, + ...moduleWithProviders.map((x) => x.ngModule), + ]) ); return this; diff --git a/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts b/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts index d25fba31d0a1..b149ae1082bf 100644 --- a/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts +++ b/code/frameworks/angular/src/client/angular-beta/utils/TestBedOverrideMetaDataGenerator.ts @@ -5,13 +5,15 @@ export const GenerateComponentMetaData = ( selector: string, componentProvider: any[], styles: string[], - schemas: any[] + schemas: any[], + wrapperModule: any ) => { const overrideMetadata = { add: { providers: componentProvider ?? [], styles: styles ?? [], selector: selector, + imports: [wrapperModule], }, } as MetadataOverride; @@ -22,17 +24,12 @@ export const GenerateComponentMetaData = ( return overrideMetadata; }; -export const GenerateModuleMetaData = ( - environmentProvider: any[], - declarations: any[], - imports: any[] -) => { +export const GenerateModuleMetaData = (declarations: any[], imports: any[]) => { return { add: { exports: [...declarations, ...imports], declarations: declarations, imports: imports, - providers: environmentProvider, }, } as MetadataOverride; }; From 1ed7890860996c0207488424f16578ec83dec7bd Mon Sep 17 00:00:00 2001 From: christophrogalla Date: Mon, 11 Aug 2025 16:40:37 +0200 Subject: [PATCH 60/61] [Angular] feat: add reactive stories for debugging --- .../cli/button.component.ts | 48 +++++++++++ .../cli/button.stories.ts | 49 +++++++++++ .../cli/header.component.ts | 76 +++++++++++++++++ .../cli/header.stories.ts | 33 ++++++++ .../cli/page.component.ts | 82 +++++++++++++++++++ .../cli/page.stories.ts | 32 ++++++++ .../cli/user.ts | 3 + 7 files changed, 323 insertions(+) create mode 100644 code/frameworks/angular/template/stories_angular-cli-default-ts/cli/button.component.ts create mode 100644 code/frameworks/angular/template/stories_angular-cli-default-ts/cli/button.stories.ts create mode 100644 code/frameworks/angular/template/stories_angular-cli-default-ts/cli/header.component.ts create mode 100644 code/frameworks/angular/template/stories_angular-cli-default-ts/cli/header.stories.ts create mode 100644 code/frameworks/angular/template/stories_angular-cli-default-ts/cli/page.component.ts create mode 100644 code/frameworks/angular/template/stories_angular-cli-default-ts/cli/page.stories.ts create mode 100644 code/frameworks/angular/template/stories_angular-cli-default-ts/cli/user.ts diff --git a/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/button.component.ts b/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/button.component.ts new file mode 100644 index 000000000000..a1cdf6a939e3 --- /dev/null +++ b/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/button.component.ts @@ -0,0 +1,48 @@ +import { CommonModule } from '@angular/common'; +import { Component, Input, Output, EventEmitter } from '@angular/core'; + +@Component({ + selector: 'storybook-button', + standalone: true, + imports: [CommonModule], + template: ` `, + styleUrls: ['./button.css'], +}) +export class ButtonComponent { + /** Is this the principal call to action on the page? */ + @Input() + primary = false; + + /** What background color to use */ + @Input() + backgroundColor?: string; + + /** How large should the button be? */ + @Input() + size: 'small' | 'medium' | 'large' = 'medium'; + + /** + * Button contents + * + * @required + */ + @Input() + label = 'Button'; + + /** Optional click handler */ + @Output() + onClick = new EventEmitter(); + + public get classes(): string[] { + const mode = this.primary ? 'storybook-button--primary' : 'storybook-button--secondary'; + + return ['storybook-button', `storybook-button--${this.size}`, mode]; + } +} diff --git a/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/button.stories.ts b/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/button.stories.ts new file mode 100644 index 000000000000..5c12e3141883 --- /dev/null +++ b/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/button.stories.ts @@ -0,0 +1,49 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { fn } from 'storybook/test'; + +import { ButtonComponent } from './button.component'; + +// More on how to set up stories at: https://storybook.js.org/docs/writing-stories +const meta: Meta = { + title: 'Example/Button', + component: ButtonComponent, + tags: ['autodocs'], + argTypes: { + backgroundColor: { + control: 'color', + }, + }, + // Use `fn` to spy on the onClick arg, which will appear in the actions panel once invoked: https://storybook.js.org/docs/essentials/actions#action-args + args: { onClick: fn() }, +}; + +export default meta; +type Story = StoryObj; + +// More on writing stories with args: https://storybook.js.org/docs/writing-stories/args +export const Primary: Story = { + args: { + primary: true, + label: 'Button', + }, +}; + +export const Secondary: Story = { + args: { + label: 'Button', + }, +}; + +export const Large: Story = { + args: { + size: 'large', + label: 'Button', + }, +}; + +export const Small: Story = { + args: { + size: 'small', + label: 'Button', + }, +}; diff --git a/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/header.component.ts b/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/header.component.ts new file mode 100644 index 000000000000..4d3a4fdc53b6 --- /dev/null +++ b/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/header.component.ts @@ -0,0 +1,76 @@ +import { Component, Input, Output, EventEmitter } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +import { ButtonComponent } from './button.component'; +import type { User } from './user'; + +@Component({ + selector: 'storybook-header', + standalone: true, + imports: [CommonModule, ButtonComponent], + template: `
+
+
+ + + + + + + +

Acme

+
+
+
+ + Welcome, {{ user.name }}! + + +
+
+ + +
+
+
+
`, + styleUrls: ['./header.css'], +}) +export class HeaderComponent { + @Input() + user: User | null = null; + + @Output() + onLogin = new EventEmitter(); + + @Output() + onLogout = new EventEmitter(); + + @Output() + onCreateAccount = new EventEmitter(); +} diff --git a/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/header.stories.ts b/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/header.stories.ts new file mode 100644 index 000000000000..8a9f73b151c8 --- /dev/null +++ b/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/header.stories.ts @@ -0,0 +1,33 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { fn } from 'storybook/test'; + +import { HeaderComponent } from './header.component'; + +const meta: Meta = { + title: 'Example/Header', + component: HeaderComponent, + // This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/writing-docs/autodocs + tags: ['autodocs'], + parameters: { + // More on how to position stories at: https://storybook.js.org/docs/configure/story-layout + layout: 'fullscreen', + }, + args: { + onLogin: fn(), + onLogout: fn(), + onCreateAccount: fn(), + }, +}; + +export default meta; +type Story = StoryObj; + +export const LoggedIn: Story = { + args: { + user: { + name: 'Jane Doe', + }, + }, +}; + +export const LoggedOut: Story = {}; diff --git a/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/page.component.ts b/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/page.component.ts new file mode 100644 index 000000000000..fca9d299d000 --- /dev/null +++ b/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/page.component.ts @@ -0,0 +1,82 @@ +import { Component } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +import { HeaderComponent } from './header.component'; +import type { User } from './user'; + +@Component({ + selector: 'storybook-page', + standalone: true, + imports: [CommonModule, HeaderComponent], + template: `
+ +
+

Pages in Storybook

+

+ We recommend building UIs with a + + component-driven + + process starting with atomic components and ending with pages. +

+

+ Render pages with mock data. This makes it easy to build and review page states without + needing to navigate to them in your app. Here are some handy patterns for managing page data + in Storybook: +

+
    +
  • + Use a higher-level connected component. Storybook helps you compose such data from the + "args" of child component stories +
  • +
  • + Assemble data in the page component from your services. You can mock these services out + using Storybook. +
  • +
+

+ Get a guided tutorial on component-driven development at + + Storybook tutorials + + . Read more in the + docs + . +

+
+ Tip Adjust the width of the canvas with the + + + + + + Viewports addon in the toolbar +
+
+
`, + styleUrls: ['./page.css'], +}) +export class PageComponent { + user: User | null = null; + + doLogout() { + this.user = null; + } + + doLogin() { + this.user = { name: 'Jane Doe' }; + } + + doCreateAccount() { + this.user = { name: 'Jane Doe' }; + } +} diff --git a/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/page.stories.ts b/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/page.stories.ts new file mode 100644 index 000000000000..659a14c1effb --- /dev/null +++ b/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/page.stories.ts @@ -0,0 +1,32 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { expect, userEvent, within } from 'storybook/test'; + +import { PageComponent } from './page.component'; + +const meta: Meta = { + title: 'Example/Page', + component: PageComponent, + parameters: { + // More on how to position stories at: https://storybook.js.org/docs/configure/story-layout + layout: 'fullscreen', + }, +}; + +export default meta; +type Story = StoryObj; + +export const LoggedOut: Story = {}; + +// More on component testing: https://storybook.js.org/docs/writing-tests/interaction-testing +export const LoggedIn: Story = { + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + const loginButton = canvas.getByRole('button', { name: /Log in/i }); + await expect(loginButton).toBeInTheDocument(); + await userEvent.click(loginButton); + await expect(loginButton).not.toBeInTheDocument(); + + const logoutButton = canvas.getByRole('button', { name: /Log out/i }); + await expect(logoutButton).toBeInTheDocument(); + }, +}; diff --git a/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/user.ts b/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/user.ts new file mode 100644 index 000000000000..c66461927e2a --- /dev/null +++ b/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/user.ts @@ -0,0 +1,3 @@ +export interface User { + name: string; +} From 2286ce18de227d01ea9e11efabaea1d43346ddf3 Mon Sep 17 00:00:00 2001 From: Chrisy455 Date: Mon, 11 Aug 2025 20:01:42 +0200 Subject: [PATCH 61/61] remove: debug stories --- .../cli/button.component.ts | 48 ----------- .../cli/button.stories.ts | 49 ----------- .../cli/header.component.ts | 76 ----------------- .../cli/header.stories.ts | 33 -------- .../cli/page.component.ts | 82 ------------------- .../cli/page.stories.ts | 32 -------- .../cli/user.ts | 3 - 7 files changed, 323 deletions(-) delete mode 100644 code/frameworks/angular/template/stories_angular-cli-default-ts/cli/button.component.ts delete mode 100644 code/frameworks/angular/template/stories_angular-cli-default-ts/cli/button.stories.ts delete mode 100644 code/frameworks/angular/template/stories_angular-cli-default-ts/cli/header.component.ts delete mode 100644 code/frameworks/angular/template/stories_angular-cli-default-ts/cli/header.stories.ts delete mode 100644 code/frameworks/angular/template/stories_angular-cli-default-ts/cli/page.component.ts delete mode 100644 code/frameworks/angular/template/stories_angular-cli-default-ts/cli/page.stories.ts delete mode 100644 code/frameworks/angular/template/stories_angular-cli-default-ts/cli/user.ts diff --git a/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/button.component.ts b/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/button.component.ts deleted file mode 100644 index a1cdf6a939e3..000000000000 --- a/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/button.component.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { Component, Input, Output, EventEmitter } from '@angular/core'; - -@Component({ - selector: 'storybook-button', - standalone: true, - imports: [CommonModule], - template: ` `, - styleUrls: ['./button.css'], -}) -export class ButtonComponent { - /** Is this the principal call to action on the page? */ - @Input() - primary = false; - - /** What background color to use */ - @Input() - backgroundColor?: string; - - /** How large should the button be? */ - @Input() - size: 'small' | 'medium' | 'large' = 'medium'; - - /** - * Button contents - * - * @required - */ - @Input() - label = 'Button'; - - /** Optional click handler */ - @Output() - onClick = new EventEmitter(); - - public get classes(): string[] { - const mode = this.primary ? 'storybook-button--primary' : 'storybook-button--secondary'; - - return ['storybook-button', `storybook-button--${this.size}`, mode]; - } -} diff --git a/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/button.stories.ts b/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/button.stories.ts deleted file mode 100644 index 5c12e3141883..000000000000 --- a/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/button.stories.ts +++ /dev/null @@ -1,49 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/angular'; -import { fn } from 'storybook/test'; - -import { ButtonComponent } from './button.component'; - -// More on how to set up stories at: https://storybook.js.org/docs/writing-stories -const meta: Meta = { - title: 'Example/Button', - component: ButtonComponent, - tags: ['autodocs'], - argTypes: { - backgroundColor: { - control: 'color', - }, - }, - // Use `fn` to spy on the onClick arg, which will appear in the actions panel once invoked: https://storybook.js.org/docs/essentials/actions#action-args - args: { onClick: fn() }, -}; - -export default meta; -type Story = StoryObj; - -// More on writing stories with args: https://storybook.js.org/docs/writing-stories/args -export const Primary: Story = { - args: { - primary: true, - label: 'Button', - }, -}; - -export const Secondary: Story = { - args: { - label: 'Button', - }, -}; - -export const Large: Story = { - args: { - size: 'large', - label: 'Button', - }, -}; - -export const Small: Story = { - args: { - size: 'small', - label: 'Button', - }, -}; diff --git a/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/header.component.ts b/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/header.component.ts deleted file mode 100644 index 4d3a4fdc53b6..000000000000 --- a/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/header.component.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { Component, Input, Output, EventEmitter } from '@angular/core'; -import { CommonModule } from '@angular/common'; - -import { ButtonComponent } from './button.component'; -import type { User } from './user'; - -@Component({ - selector: 'storybook-header', - standalone: true, - imports: [CommonModule, ButtonComponent], - template: `
-
-
- - - - - - - -

Acme

-
-
-
- - Welcome, {{ user.name }}! - - -
-
- - -
-
-
-
`, - styleUrls: ['./header.css'], -}) -export class HeaderComponent { - @Input() - user: User | null = null; - - @Output() - onLogin = new EventEmitter(); - - @Output() - onLogout = new EventEmitter(); - - @Output() - onCreateAccount = new EventEmitter(); -} diff --git a/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/header.stories.ts b/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/header.stories.ts deleted file mode 100644 index 8a9f73b151c8..000000000000 --- a/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/header.stories.ts +++ /dev/null @@ -1,33 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/angular'; -import { fn } from 'storybook/test'; - -import { HeaderComponent } from './header.component'; - -const meta: Meta = { - title: 'Example/Header', - component: HeaderComponent, - // This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/writing-docs/autodocs - tags: ['autodocs'], - parameters: { - // More on how to position stories at: https://storybook.js.org/docs/configure/story-layout - layout: 'fullscreen', - }, - args: { - onLogin: fn(), - onLogout: fn(), - onCreateAccount: fn(), - }, -}; - -export default meta; -type Story = StoryObj; - -export const LoggedIn: Story = { - args: { - user: { - name: 'Jane Doe', - }, - }, -}; - -export const LoggedOut: Story = {}; diff --git a/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/page.component.ts b/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/page.component.ts deleted file mode 100644 index fca9d299d000..000000000000 --- a/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/page.component.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { Component } from '@angular/core'; -import { CommonModule } from '@angular/common'; - -import { HeaderComponent } from './header.component'; -import type { User } from './user'; - -@Component({ - selector: 'storybook-page', - standalone: true, - imports: [CommonModule, HeaderComponent], - template: `
- -
-

Pages in Storybook

-

- We recommend building UIs with a - - component-driven - - process starting with atomic components and ending with pages. -

-

- Render pages with mock data. This makes it easy to build and review page states without - needing to navigate to them in your app. Here are some handy patterns for managing page data - in Storybook: -

-
    -
  • - Use a higher-level connected component. Storybook helps you compose such data from the - "args" of child component stories -
  • -
  • - Assemble data in the page component from your services. You can mock these services out - using Storybook. -
  • -
-

- Get a guided tutorial on component-driven development at - - Storybook tutorials - - . Read more in the - docs - . -

-
- Tip Adjust the width of the canvas with the - - - - - - Viewports addon in the toolbar -
-
-
`, - styleUrls: ['./page.css'], -}) -export class PageComponent { - user: User | null = null; - - doLogout() { - this.user = null; - } - - doLogin() { - this.user = { name: 'Jane Doe' }; - } - - doCreateAccount() { - this.user = { name: 'Jane Doe' }; - } -} diff --git a/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/page.stories.ts b/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/page.stories.ts deleted file mode 100644 index 659a14c1effb..000000000000 --- a/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/page.stories.ts +++ /dev/null @@ -1,32 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/angular'; -import { expect, userEvent, within } from 'storybook/test'; - -import { PageComponent } from './page.component'; - -const meta: Meta = { - title: 'Example/Page', - component: PageComponent, - parameters: { - // More on how to position stories at: https://storybook.js.org/docs/configure/story-layout - layout: 'fullscreen', - }, -}; - -export default meta; -type Story = StoryObj; - -export const LoggedOut: Story = {}; - -// More on component testing: https://storybook.js.org/docs/writing-tests/interaction-testing -export const LoggedIn: Story = { - play: async ({ canvasElement }) => { - const canvas = within(canvasElement); - const loginButton = canvas.getByRole('button', { name: /Log in/i }); - await expect(loginButton).toBeInTheDocument(); - await userEvent.click(loginButton); - await expect(loginButton).not.toBeInTheDocument(); - - const logoutButton = canvas.getByRole('button', { name: /Log out/i }); - await expect(logoutButton).toBeInTheDocument(); - }, -}; diff --git a/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/user.ts b/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/user.ts deleted file mode 100644 index c66461927e2a..000000000000 --- a/code/frameworks/angular/template/stories_angular-cli-default-ts/cli/user.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface User { - name: string; -}