@ng-forge/dynamic-forms 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/fesm2022/ng-forge-dynamic-forms-integration.mjs +23 -18
- package/fesm2022/ng-forge-dynamic-forms-integration.mjs.map +1 -1
- package/fesm2022/{ng-forge-dynamic-forms-ng-forge-dynamic-forms-CMSmISSp.mjs → ng-forge-dynamic-forms-ng-forge-dynamic-forms-DHxoGouT.mjs} +248 -61
- package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-DHxoGouT.mjs.map +1 -0
- package/fesm2022/{ng-forge-dynamic-forms-page-field.component-rdGD8A9d.mjs → ng-forge-dynamic-forms-page-field.component-Bt6blv9I.mjs} +13 -7
- package/fesm2022/ng-forge-dynamic-forms-page-field.component-Bt6blv9I.mjs.map +1 -0
- package/fesm2022/{ng-forge-dynamic-forms-testing-test-button.harness-0iXHLraC.mjs → ng-forge-dynamic-forms-testing-test-button.harness-C79EBW0o.mjs} +4 -4
- package/fesm2022/{ng-forge-dynamic-forms-testing-test-button.harness-0iXHLraC.mjs.map → ng-forge-dynamic-forms-testing-test-button.harness-C79EBW0o.mjs.map} +1 -1
- package/fesm2022/ng-forge-dynamic-forms-testing.mjs +32 -30
- package/fesm2022/ng-forge-dynamic-forms-testing.mjs.map +1 -1
- package/fesm2022/{ng-forge-dynamic-forms-text-field.component-CDxka2KD.mjs → ng-forge-dynamic-forms-text-field.component-DKCx7Z_U.mjs} +5 -5
- package/fesm2022/{ng-forge-dynamic-forms-text-field.component-CDxka2KD.mjs.map → ng-forge-dynamic-forms-text-field.component-DKCx7Z_U.mjs.map} +1 -1
- package/fesm2022/ng-forge-dynamic-forms.mjs +1 -1
- package/package.json +9 -9
- package/types/ng-forge-dynamic-forms-integration.d.ts +58 -18
- package/types/ng-forge-dynamic-forms-testing.d.ts +7 -1
- package/types/ng-forge-dynamic-forms.d.ts +375 -167
- package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-CMSmISSp.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-page-field.component-rdGD8A9d.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-forge-dynamic-forms-testing.mjs","sources":["../../../../packages/dynamic-forms/testing/src/delay.ts","../../../../packages/dynamic-forms/testing/src/mock-logger.ts","../../../../packages/dynamic-forms/testing/src/dynamic-form-test-utils.ts","../../../../packages/dynamic-forms/testing/src/mapper-test-utils.ts","../../../../packages/dynamic-forms/testing/src/simple-test-utils.ts","../../../../packages/dynamic-forms/testing/src/harnesses/test-input.harness.ts","../../../../packages/dynamic-forms/testing/src/harnesses/test-checkbox.harness.ts","../../../../packages/dynamic-forms/testing/src/harnesses/test-select.harness.ts","../../../../packages/dynamic-forms/testing/src/fake-translation.service.ts","../../../../packages/dynamic-forms/testing/src/ng-forge-dynamic-forms-testing.ts"],"sourcesContent":["/**\n * Creates a promise that resolves after the specified delay.\n *\n * Utility function for testing scenarios where you need to wait for\n * asynchronous operations, animations, or timing-dependent behavior.\n *\n * @param ms - Delay in milliseconds (defaults to 0 for next tick)\n * @returns Promise that resolves after the specified delay\n *\n * @example\n * ```typescript\n * // Wait for async operations in tests\n * await delay(100);\n * expect(component.isLoaded).toBe(true);\n *\n * // Wait for next tick (micro-task)\n * await delay();\n * fixture.detectChanges();\n * ```\n */\nexport function delay(ms = 0): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import { Provider } from '@angular/core';\nimport { vi, type Mock } from 'vitest';\nimport { DynamicFormLogger, ConsoleLogger } from '@ng-forge/dynamic-forms';\nimport type { Logger } from '@ng-forge/dynamic-forms';\n\n/**\n * Mock logger with vitest spies for testing.\n */\nexport interface MockLogger extends Logger {\n debug: Mock;\n info: Mock;\n warn: Mock;\n error: Mock;\n}\n\n/**\n * Creates a mock logger with vitest spies for all methods.\n * Useful for testing code that uses the logger.\n */\nexport function createMockLogger(): MockLogger {\n return {\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n };\n}\n\n/**\n * Provider for a console logger in tests.\n * Add this to TestBed.configureTestingModule providers when not using provideDynamicForm().\n */\nexport function provideTestLogger(): Provider {\n return { provide: DynamicFormLogger, useValue: new ConsoleLogger() };\n}\n","import { ComponentFixture, TestBed } from '@angular/core/testing';\nimport { computed, Signal } from '@angular/core';\nimport { ValidationError } from '@angular/forms/signals';\nimport { firstValueFrom, race, timer } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { DynamicForm, FormConfig, FieldDef, FieldTypeDefinition, BUILT_IN_FIELDS } from '@ng-forge/dynamic-forms';\nimport { InputField, SelectField, checkboxFieldMapper, valueFieldMapper } from '@ng-forge/dynamic-forms/integration';\nimport { delay } from './delay';\n\n/**\n * Internal interface for field registry operations needed by test utilities\n */\ninterface FieldRegistryWriter {\n registerTypes(types: FieldTypeDefinition[]): void;\n}\n\n/**\n * Configuration for creating a dynamic form test\n */\nexport interface DynamicFormTestConfig {\n config: FormConfig;\n initialValue?: Record<string, unknown>;\n registerTestFields?: boolean;\n}\n\n/**\n * Result of creating a dynamic form test\n */\nexport interface DynamicFormTestResult {\n component: DynamicForm;\n fixture: ComponentFixture<DynamicForm>;\n}\n\n/**\n * Fluent API for building form configurations\n */\nexport class FormConfigBuilder {\n private fields: FieldDef<unknown>[] = [];\n\n field(field: FieldDef<unknown>): FormConfigBuilder {\n this.fields.push(field);\n return this;\n }\n\n inputField(key: string, props?: Record<string, unknown>): FormConfigBuilder {\n return this.field({\n key,\n type: 'input',\n label: key.charAt(0).toUpperCase() + key.slice(1),\n props: { placeholder: `Enter ${key}`, ...props },\n });\n }\n\n requiredInputField(key: string, props?: Record<string, unknown>): FormConfigBuilder {\n const inputField: InputField<Record<string, unknown>> = {\n key,\n type: 'input',\n label: key.charAt(0).toUpperCase() + key.slice(1),\n required: true,\n props: { placeholder: `Enter ${key}`, ...props },\n };\n return this.field(inputField);\n }\n\n selectField(key: string, options: Array<{ value: string; label: string }>, props?: Record<string, unknown>): FormConfigBuilder {\n const selectField: SelectField<string, Record<string, unknown>> = {\n key,\n type: 'select',\n label: key.charAt(0).toUpperCase() + key.slice(1),\n options,\n props: props || {},\n };\n return this.field(selectField);\n }\n\n checkboxField(key: string, props?: Record<string, unknown>): FormConfigBuilder {\n return this.field({\n key,\n type: 'checkbox',\n label: key.charAt(0).toUpperCase() + key.slice(1),\n props: props || {},\n });\n }\n\n rowField(key: string, fields: FieldDef<unknown>[]): FormConfigBuilder {\n return this.field({\n key,\n type: 'row',\n fields,\n } as FieldDef<unknown>);\n }\n\n groupField(key: string, fields: FieldDef<unknown>[]): FormConfigBuilder {\n return this.field({\n key,\n type: 'group',\n fields,\n } as FieldDef<unknown>);\n }\n\n buttonField(key: string, props?: Record<string, unknown>): FormConfigBuilder {\n return this.field({\n key,\n type: 'button',\n label: key.charAt(0).toUpperCase() + key.slice(1),\n props: props || {},\n });\n }\n\n pageField(key: string, fields: FieldDef<unknown>[], title?: string): FormConfigBuilder {\n const pageFields = title ? [{ key: `${key}-title`, type: 'text', label: title }, ...fields] : fields;\n return this.field({\n key,\n type: 'page',\n fields: pageFields,\n } as FieldDef<unknown>);\n }\n\n build(): FormConfig {\n return { fields: this.fields } as unknown as FormConfig;\n }\n}\n\n/**\n * Utility class for testing dynamic forms\n */\nexport class DynamicFormTestUtils {\n /**\n * Creates a new form config builder\n */\n static builder(): FormConfigBuilder {\n return new FormConfigBuilder();\n }\n\n /**\n * Creates a dynamic form test setup with optional test field registration\n */\n static async createTest(testConfig: DynamicFormTestConfig): Promise<DynamicFormTestResult> {\n const fixture = TestBed.createComponent(DynamicForm);\n const component = fixture.componentInstance;\n // Access fieldRegistry from the component instance (injected by Angular DI)\n const fieldRegistry = component['fieldRegistry'] as FieldRegistryWriter;\n\n // Register test fields if requested\n if (testConfig.registerTestFields !== false) {\n DynamicFormTestUtils.registerTestFields(fieldRegistry);\n }\n\n // Set up the component - use 'dynamic-form' as the input name since config uses alias: 'dynamic-form'\n fixture.componentRef.setInput('dynamic-form', testConfig.config);\n if (testConfig.initialValue !== undefined) {\n fixture.componentRef.setInput('value', testConfig.initialValue);\n }\n\n fixture.detectChanges();\n await DynamicFormTestUtils.waitForInit(fixture as ComponentFixture<DynamicForm>);\n\n return {\n component: component as DynamicForm,\n fixture: fixture as ComponentFixture<DynamicForm>,\n };\n }\n\n /**\n * Registers common test field types including built-in types like page, row, group\n * @internal\n */\n private static registerTestFields(fieldRegistry: FieldRegistryWriter): void {\n // Input field mapper that extends value field mapper (returns Signal)\n const inputMapper = (fieldDef: FieldDef<unknown>): Signal<Record<string, unknown>> => {\n const baseInputsSignal = valueFieldMapper(fieldDef);\n\n // Return computed signal that adds input-specific inputs\n return computed(() => ({\n ...baseInputsSignal(),\n type: (fieldDef.props as Record<string, unknown>)?.['type'] || 'text',\n placeholder: (fieldDef.props as Record<string, unknown>)?.['placeholder'] || '',\n }));\n };\n\n // Select field mapper that extends value field mapper (returns Signal)\n const selectMapper = (fieldDef: FieldDef<unknown>): Signal<Record<string, unknown>> => {\n const baseInputsSignal = valueFieldMapper(fieldDef);\n\n // Return computed signal that adds select-specific inputs\n return computed(() => ({\n ...baseInputsSignal(),\n options: (fieldDef as unknown as Record<string, unknown>).options || [], // Safe cast: SelectField extends FieldDef with options property\n }));\n };\n\n // Checkbox field mapper - uses checked instead of value (already returns Signal)\n const checkboxMapper = (fieldDef: FieldDef<unknown>): Signal<Record<string, unknown>> => {\n return checkboxFieldMapper(fieldDef);\n };\n\n // Button field mapper that extends value field mapper (already returns Signal)\n const buttonMapper = (fieldDef: FieldDef<unknown>): Signal<Record<string, unknown>> => {\n return valueFieldMapper(fieldDef);\n };\n\n // Register built-in fields first (page, row, group)\n fieldRegistry.registerTypes(BUILT_IN_FIELDS);\n\n // Then register test field types\n fieldRegistry.registerTypes([\n {\n name: 'input',\n loadComponent: () => import('./harnesses/test-input.harness'),\n mapper: inputMapper,\n },\n {\n name: 'select',\n loadComponent: () => import('./harnesses/test-select.harness'),\n mapper: selectMapper,\n },\n {\n name: 'checkbox',\n loadComponent: () => import('./harnesses/test-checkbox.harness'),\n mapper: checkboxMapper,\n },\n {\n name: 'button',\n loadComponent: () => import('./harnesses/test-button.harness'),\n mapper: buttonMapper,\n },\n ]);\n }\n\n /**\n * Waits for the dynamic form to initialize.\n * Uses the initialized$ observable directly which has shareReplay for late subscribers.\n * @param fixture - The component fixture\n * @param timeoutMs - Maximum time to wait for initialization (default: 100ms)\n */\n static async waitForInit(fixture: ComponentFixture<DynamicForm>, timeoutMs = 100): Promise<void> {\n const component = fixture.componentInstance;\n\n // Trigger initial change detection\n fixture.detectChanges();\n TestBed.flushEffects();\n\n // Use the initialized$ observable directly (with shareReplay) for proper replay behavior\n // Race against a timeout to prevent hanging if initialization already happened\n await firstValueFrom(race(component.initialized$.pipe(map(() => true)), timer(timeoutMs).pipe(map(() => false))));\n\n // Stabilization cycles for async components\n for (let i = 0; i < 2; i++) {\n TestBed.flushEffects();\n fixture.detectChanges();\n await delay(0);\n }\n\n await fixture.whenStable();\n TestBed.flushEffects();\n fixture.detectChanges();\n }\n\n /**\n * Waits for an element to appear in the DOM with retries\n */\n private static async waitForElement<T extends Element>(\n fixture: ComponentFixture<DynamicForm>,\n selector: string,\n maxAttempts = 10,\n ): Promise<T> {\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n const element = fixture.nativeElement.querySelector(selector) as T;\n if (element) {\n return element;\n }\n\n // Wait and retry\n TestBed.flushEffects();\n fixture.detectChanges();\n await delay(50);\n }\n\n throw new Error(`[Dynamic Forms] Element not found with selector: ${selector} after ${maxAttempts} attempts`);\n }\n\n /**\n * Simulates user input on a field element\n */\n static async simulateInput(fixture: ComponentFixture<DynamicForm>, selector: string, value: string): Promise<void> {\n const input = await DynamicFormTestUtils.waitForElement<HTMLInputElement>(fixture, selector);\n\n input.value = value;\n input.dispatchEvent(new Event('input', { bubbles: true }));\n fixture.detectChanges();\n await delay(0);\n }\n\n /**\n * Simulates user blur on a field element\n */\n static async simulateBlur(fixture: ComponentFixture<DynamicForm>, selector: string): Promise<void> {\n const element = await DynamicFormTestUtils.waitForElement<Element>(fixture, selector);\n\n element.dispatchEvent(new Event('blur', { bubbles: true }));\n fixture.detectChanges();\n await delay(0);\n }\n\n /**\n * Simulates user selection on a select element\n */\n static async simulateSelect(fixture: ComponentFixture<DynamicForm>, selector: string, value: string): Promise<void> {\n const select = await DynamicFormTestUtils.waitForElement<HTMLSelectElement>(fixture, selector);\n\n select.value = value;\n select.dispatchEvent(new Event('change', { bubbles: true }));\n fixture.detectChanges();\n await delay(0);\n }\n\n /**\n * Simulates checkbox toggle\n */\n static async simulateCheckbox(fixture: ComponentFixture<DynamicForm>, selector: string, checked: boolean): Promise<void> {\n const checkbox = await DynamicFormTestUtils.waitForElement<HTMLInputElement>(fixture, selector);\n\n checkbox.checked = checked;\n checkbox.dispatchEvent(new Event('input', { bubbles: true }));\n checkbox.dispatchEvent(new Event('change', { bubbles: true }));\n fixture.detectChanges();\n await delay(0);\n }\n\n /**\n * Simulates button click\n */\n static async simulateButtonClick(fixture: ComponentFixture<DynamicForm>, selector: string): Promise<void> {\n const button = await DynamicFormTestUtils.waitForElement<HTMLButtonElement>(fixture, selector);\n\n button.click();\n fixture.detectChanges();\n await delay(0);\n }\n\n /**\n * Gets the current form value from the component\n */\n static getFormValue(component: DynamicForm): Record<string, unknown> | undefined {\n return component.formValue();\n }\n\n /**\n * Gets validation errors from the component\n */\n static getFormErrors(component: DynamicForm): ValidationError[] {\n return component.errors();\n }\n\n /**\n * Checks if the form is valid\n */\n static isFormValid(component: DynamicForm): boolean {\n return component.valid();\n }\n\n /**\n * Gets all field elements from the fixture\n */\n static getFieldElements(fixture: ComponentFixture<DynamicForm>, fieldType: string): NodeListOf<Element> {\n return fixture.nativeElement.querySelectorAll(`df-test-${fieldType}`);\n }\n\n /**\n * Asserts that a field has a specific value\n */\n static async assertFieldValue(fixture: ComponentFixture<DynamicForm>, fieldSelector: string, expectedValue: string): Promise<void> {\n const element = await DynamicFormTestUtils.waitForElement<HTMLInputElement>(fixture, fieldSelector);\n\n const actualValue = element.type === 'checkbox' ? element.checked.toString() : element.value;\n if (actualValue !== expectedValue) {\n throw new Error(`[Dynamic Forms] Expected field value to be \"${expectedValue}\", but got \"${actualValue}\"`);\n }\n }\n\n /**\n * Asserts that the form has a specific value\n */\n static assertFormValue(component: DynamicForm, expectedValue: Record<string, unknown>): void {\n const actualValue = component.formValue();\n if (JSON.stringify(actualValue) !== JSON.stringify(expectedValue)) {\n throw new Error(`[Dynamic Forms] Expected form value to be ${JSON.stringify(expectedValue)}, but got ${JSON.stringify(actualValue)}`);\n }\n }\n}\n","import { Injector, runInInjectionContext, signal, WritableSignal } from '@angular/core';\nimport { form } from '@angular/forms/signals';\nimport { FieldSignalContext } from '@ng-forge/dynamic-forms';\nimport { FIELD_SIGNAL_CONTEXT } from '@ng-forge/dynamic-forms';\nimport { ValidationMessages } from '@ng-forge/dynamic-forms';\n\n/**\n * Configuration for creating a test form injector with field signal context\n */\nexport interface TestFieldContextConfig<TModel extends Record<string, unknown> = Record<string, unknown>> {\n /**\n * Parent injector to use. If not provided, uses an empty injector.\n */\n parentInjector?: Injector;\n\n /**\n * Initial value for the form. If not provided, uses an empty object.\n */\n initialValue?: Partial<TModel>;\n\n /**\n * Default values function. If not provided, returns the initial value.\n */\n defaultValues?: () => TModel;\n\n /**\n * Default validation messages for the form.\n */\n defaultValidationMessages?: ValidationMessages;\n\n /**\n * Custom value signal. If provided, this will be used instead of creating a new one.\n */\n valueSignal?: WritableSignal<Partial<TModel> | undefined>;\n\n /**\n * Custom form instance. If provided, this will be used instead of creating a new one.\n */\n form?: ReturnType<typeof form<TModel>>;\n}\n\n/**\n * Creates a test injector with FIELD_SIGNAL_CONTEXT provided.\n *\n * This utility simplifies testing of mappers and components that inject FIELD_SIGNAL_CONTEXT.\n *\n * @example\n * ```typescript\n * // Basic usage\n * const testInjector = createTestFormInjector();\n *\n * // With custom initial value\n * const testInjector = createTestFormInjector({\n * initialValue: { username: 'test' }\n * });\n *\n * // With validation messages\n * const testInjector = createTestFormInjector({\n * defaultValidationMessages: { required: 'This field is required' }\n * });\n * ```\n */\nexport function createTestFormInjector<TModel extends Record<string, unknown> = Record<string, unknown>>(\n config: TestFieldContextConfig<TModel> = {},\n): Injector {\n const {\n parentInjector,\n initialValue = {} as Partial<TModel>,\n defaultValues = () => initialValue as TModel,\n defaultValidationMessages,\n valueSignal,\n form: customForm,\n } = config;\n\n // Create value signal\n const value = valueSignal ?? signal<Partial<TModel> | undefined>(initialValue);\n\n // Create form instance in injection context\n let formInstance: ReturnType<typeof form<TModel>>;\n if (customForm) {\n formInstance = customForm;\n } else {\n const tempInjector = parentInjector || Injector.create({ providers: [] });\n formInstance = runInInjectionContext(tempInjector, () => form(value)) as ReturnType<typeof form<TModel>>;\n }\n\n // Create field signal context\n const fieldSignalContext: FieldSignalContext<TModel> = {\n injector: parentInjector || Injector.create({ providers: [] }),\n value,\n defaultValues,\n form: formInstance,\n defaultValidationMessages,\n };\n\n // Create injector with context\n return Injector.create({\n parent: parentInjector,\n providers: [\n {\n provide: FIELD_SIGNAL_CONTEXT,\n useValue: fieldSignalContext,\n },\n ],\n });\n}\n\n/**\n * Runs a mapper function in a test injection context.\n *\n * This is a convenience wrapper that creates a test injector and runs the mapper\n * function within it, returning the result.\n *\n * @example\n * ```typescript\n * // Test a mapper without context overrides\n * const bindings = testMapper(() => mapValueField(fieldDef));\n *\n * // Test a mapper with custom context\n * const bindings = testMapper(\n * () => mapValueField(fieldDef),\n * { initialValue: { username: 'test' } }\n * );\n *\n * // Test a mapper with validation messages\n * const bindings = testMapper(\n * () => mapValueField(fieldDef),\n * { defaultValidationMessages: { required: 'Required field' } }\n * );\n * ```\n */\nexport function testMapper<T>(mapperFn: () => T, context?: TestFieldContextConfig<Record<string, unknown>>): T {\n const testInjector = createTestFormInjector(context);\n return runInInjectionContext(testInjector, mapperFn);\n}\n\n/**\n * Creates a field signal context for testing without creating an injector.\n *\n * Useful when you need to manually provide the context or test context creation logic.\n *\n * @example\n * ```typescript\n * const context = createTestFieldContext({\n * initialValue: { name: 'test' }\n * });\n *\n * // Use in your own injector\n * const injector = Injector.create({\n * providers: [\n * { provide: FIELD_SIGNAL_CONTEXT, useValue: context }\n * ]\n * });\n * ```\n */\nexport function createTestFieldContext<TModel extends Record<string, unknown> = Record<string, unknown>>(\n config: TestFieldContextConfig<TModel> = {},\n): FieldSignalContext<TModel> {\n const {\n parentInjector,\n initialValue = {} as Partial<TModel>,\n defaultValues = () => initialValue as TModel,\n defaultValidationMessages,\n valueSignal,\n form: customForm,\n } = config;\n\n const injector = parentInjector || Injector.create({ providers: [] });\n const value = valueSignal ?? signal<Partial<TModel> | undefined>(initialValue);\n\n let formInstance: ReturnType<typeof form<TModel>>;\n if (customForm) {\n formInstance = customForm;\n } else {\n formInstance = runInInjectionContext(injector, () => form(value)) as ReturnType<typeof form<TModel>>;\n }\n\n return {\n injector,\n value,\n defaultValues,\n form: formInstance,\n defaultValidationMessages,\n };\n}\n","import { ComponentFixture, TestBed } from '@angular/core/testing';\nimport { DynamicForm } from '@ng-forge/dynamic-forms';\nimport { delay } from './delay';\nimport { FieldDef } from '@ng-forge/dynamic-forms';\nimport { provideDynamicForm } from '@ng-forge/dynamic-forms';\nimport { Component, computed, Injector, input, runInInjectionContext, signal, Type } from '@angular/core';\nimport { FIELD_REGISTRY } from '@ng-forge/dynamic-forms';\nimport { FieldTypeDefinition } from '@ng-forge/dynamic-forms';\nimport { FIELD_SIGNAL_CONTEXT } from '@ng-forge/dynamic-forms';\nimport { EventBus } from '@ng-forge/dynamic-forms';\nimport { form } from '@angular/forms/signals';\nimport { RegisteredFieldTypes } from '@ng-forge/dynamic-forms';\n\n/**\n * Simple form configuration interface for testing\n */\nexport interface TestFormConfig {\n fields: FieldDef<unknown>[];\n}\n\n/**\n * Configuration for creating a dynamic form test\n */\nexport interface SimpleTestConfig<T = Record<string, unknown>> {\n config: TestFormConfig;\n initialValue?: T;\n}\n\n/**\n * Result of creating a dynamic form test.\n * Uses the base DynamicForm type without generic constraints for flexibility in tests.\n */\nexport interface SimpleTestResult {\n component: DynamicForm<RegisteredFieldTypes[]>;\n fixture: ComponentFixture<DynamicForm<RegisteredFieldTypes[]>>;\n}\n\n/**\n * Fluent API for building form configurations using existing field structure\n */\nexport class TestFormConfigBuilder<T = Record<string, unknown>> {\n private fields: FieldDef<unknown>[] = [];\n\n field(field: FieldDef<unknown>): TestFormConfigBuilder<T> {\n this.fields.push(field);\n return this;\n }\n\n inputField(key: string, props?: Record<string, unknown>): TestFormConfigBuilder<T> {\n return this.field({\n key,\n type: 'input',\n label: key.charAt(0).toUpperCase() + key.slice(1),\n ...props,\n });\n }\n\n requiredInputField(key: string, props?: Record<string, unknown>): TestFormConfigBuilder<T> {\n return this.inputField(key, { required: true, ...props });\n }\n\n checkboxField(key: string, props?: Record<string, unknown>): TestFormConfigBuilder<T> {\n return this.field({\n key,\n type: 'checkbox',\n label: key.charAt(0).toUpperCase() + key.slice(1),\n ...props,\n });\n }\n\n build(): TestFormConfig {\n return { fields: this.fields };\n }\n}\n\n/**\n * Simple utility class for testing dynamic forms\n */\nexport class SimpleTestUtils {\n /**\n * Creates a new form config builder\n */\n static builder<T = Record<string, unknown>>(): TestFormConfigBuilder<T> {\n return new TestFormConfigBuilder<T>();\n }\n\n /**\n * Creates a simple test component - assumes TestBed is already configured\n */\n static createComponent<T = Record<string, unknown>>(config: TestFormConfig = { fields: [] }, initialValue?: T): SimpleTestResult {\n const fixture = TestBed.createComponent(DynamicForm);\n const component = fixture.componentInstance;\n\n // Use 'dynamic-form' as the input name since config uses alias: 'dynamic-form'\n fixture.componentRef.setInput('dynamic-form', config);\n if (initialValue !== undefined) {\n fixture.componentRef.setInput('value', initialValue);\n }\n\n fixture.detectChanges();\n TestBed.flushEffects();\n // Cast to SimpleTestResult - type variance in DynamicForm generics doesn't affect runtime behavior\n return { component, fixture } as SimpleTestResult;\n }\n\n /**\n * Waits for the dynamic form to initialize\n */\n static async waitForInit(fixture: ComponentFixture<DynamicForm>): Promise<void> {\n await delay(0);\n fixture.detectChanges();\n TestBed.flushEffects();\n await delay(0);\n }\n\n /**\n * Simulates user input on a field element\n */\n static async simulateInput(fixture: ComponentFixture<DynamicForm>, selector: string, value: string): Promise<void> {\n const input = fixture.nativeElement.querySelector(selector) as HTMLInputElement;\n if (!input) {\n throw new Error(`[Dynamic Forms] Input element not found with selector: ${selector}`);\n }\n\n input.value = value;\n input.dispatchEvent(new Event('input', { bubbles: true }));\n fixture.detectChanges();\n await delay(0);\n }\n\n /**\n * Simulates checkbox toggle\n */\n static async simulateCheckbox(fixture: ComponentFixture<DynamicForm>, selector: string, checked: boolean): Promise<void> {\n const checkbox = fixture.nativeElement.querySelector(selector) as HTMLInputElement;\n if (!checkbox) {\n throw new Error(`[Dynamic Forms] Checkbox element not found with selector: ${selector}`);\n }\n\n checkbox.checked = checked;\n checkbox.dispatchEvent(new Event('change', { bubbles: true }));\n fixture.detectChanges();\n await delay(0);\n }\n\n /**\n * Gets the current form value from the component\n */\n static getFormValue(component: DynamicForm): Record<string, unknown> | undefined {\n return component.formValue();\n }\n\n /**\n * Checks if the form is valid\n */\n static isFormValid(component: DynamicForm): boolean {\n return component.valid();\n }\n\n /**\n * Asserts that the form has a specific value\n */\n static assertFormValue(component: DynamicForm, expectedValue: Record<string, unknown>): void {\n const actualValue = component.formValue();\n if (JSON.stringify(actualValue) !== JSON.stringify(expectedValue)) {\n throw new Error(`[Dynamic Forms] Expected form value to be ${JSON.stringify(expectedValue)}, but got ${JSON.stringify(actualValue)}`);\n }\n }\n}\n\n// Mock field component for testing\n// Includes all inputs that baseFieldMapper and valueFieldMapper might create bindings for\n@Component({\n selector: 'df-test-field',\n template: '<div>Test Field: {{ value() }}</div>',\n})\nexport class TestFieldComponent {\n // Field tree input\n field = input<unknown>();\n\n // Required inputs from baseFieldMapper\n key = input<string>('');\n label = input<string>('');\n className = input<string>('');\n tabIndex = input<number | undefined>(undefined);\n props = input<Record<string, unknown> | undefined>(undefined);\n placeholder = input<string>('');\n\n // Array-related inputs\n arrayContext = input<unknown>(undefined);\n fields = input<unknown[]>([]);\n\n // Validation inputs from valueFieldMapper\n validationMessages = input<Record<string, string> | undefined>(undefined);\n defaultValidationMessages = input<Record<string, string> | undefined>(undefined);\n\n value = signal('test');\n}\n\n/**\n * Configuration for setting up a simple component test\n */\nexport interface SimpleComponentTestConfig<T = unknown> {\n field: FieldDef<unknown>;\n value?: T;\n pageIndex?: number;\n isVisible?: boolean;\n [key: string]: unknown; // Allow additional inputs for flexible component testing\n}\n\n/**\n * Result of setting up a simple component test\n */\nexport interface SimpleComponentTestResult<T = unknown> {\n component: T;\n fixture: ComponentFixture<T>;\n}\n\n/**\n * Creates a simple test setup for individual field components\n */\nexport function setupSimpleTest<T>(componentType: Type<T>, config: SimpleComponentTestConfig): SimpleComponentTestResult<T> {\n const mockFieldType: FieldTypeDefinition = {\n name: 'test',\n loadComponent: async () => TestFieldComponent,\n mapper: () => computed(() => ({})), // Simple mapper that returns empty inputs signal for testing\n };\n\n TestBed.configureTestingModule({\n imports: [componentType],\n providers: [\n provideDynamicForm(),\n EventBus,\n {\n provide: FIELD_REGISTRY,\n useValue: new Map([['test', mockFieldType]]),\n },\n {\n provide: FIELD_SIGNAL_CONTEXT,\n useFactory: (injector: Injector) => {\n // Create test context using factory\n return runInInjectionContext(injector, () => {\n const defaultValue = (config.value || {}) as T & Record<string, unknown>;\n const valueSignal = signal(defaultValue);\n const formInstance = form(valueSignal);\n return {\n injector,\n value: valueSignal,\n defaultValues: () => defaultValue,\n form: formInstance,\n defaultValidationMessages: undefined,\n };\n });\n },\n deps: [Injector],\n },\n ],\n });\n\n const fixture = TestBed.createComponent(componentType);\n const component = fixture.componentInstance;\n\n fixture.componentRef.setInput('field', config.field);\n fixture.componentRef.setInput('key', config.field.key);\n if (config.value !== undefined) {\n fixture.componentRef.setInput('value', config.value);\n }\n if (config.pageIndex !== undefined) {\n fixture.componentRef.setInput('pageIndex', config.pageIndex);\n }\n if (config.isVisible !== undefined) {\n fixture.componentRef.setInput('isVisible', config.isVisible);\n }\n\n // Set any additional inputs provided in config\n Object.keys(config).forEach((key) => {\n if (!['field', 'value', 'pageIndex', 'isVisible'].includes(key) && config[key] !== undefined) {\n fixture.componentRef.setInput(key, config[key]);\n }\n });\n\n fixture.detectChanges();\n\n return { component, fixture };\n}\n\n/**\n * Creates a simple test field definition\n */\nexport function createSimpleTestField(key: string, label: string): FieldDef<unknown> {\n return {\n key,\n type: 'test',\n label,\n };\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { FormField, FieldTree } from '@angular/forms/signals';\nimport { ValidationMessages } from '@ng-forge/dynamic-forms';\n\n@Component({\n selector: 'df-test-input',\n template: `<input [type]=\"type()\" [formField]=\"field()\" />`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FormField],\n})\nexport default class TestInputHarness {\n readonly field = input.required<FieldTree<string>>();\n readonly key = input.required<string>();\n\n // Field-specific properties\n readonly label = input<string>('');\n readonly placeholder = input<string>('');\n readonly type = input<string>('text');\n readonly props = input<Record<string, unknown>>({});\n readonly className = input<string>('');\n readonly validationMessages = input<ValidationMessages>();\n readonly defaultValidationMessages = input<ValidationMessages>();\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { FormField, FieldTree } from '@angular/forms/signals';\nimport { ValidationMessages } from '@ng-forge/dynamic-forms';\n\n@Component({\n selector: 'df-test-checkbox',\n template: ` <input type=\"checkbox\" [formField]=\"field()\" /> `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FormField],\n})\nexport default class TestCheckboxHarness {\n readonly field = input.required<FieldTree<boolean>>();\n readonly key = input.required<string>();\n\n // Field-specific properties\n readonly label = input<string>('');\n readonly props = input<Record<string, unknown>>({});\n readonly className = input<string>('');\n readonly validationMessages = input<ValidationMessages>();\n readonly defaultValidationMessages = input<ValidationMessages>();\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { FormField, FieldTree } from '@angular/forms/signals';\n\n/**\n * Test harness component for select fields\n */\n@Component({\n selector: 'df-test-select',\n template: `\n @let f = field();\n <select [formField]=\"f\">\n <option value=\"\">Select...</option>\n @for (option of options(); track option.value) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </select>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FormField],\n})\nexport default class TestSelectHarness {\n readonly field = input.required<FieldTree<string>>();\n readonly key = input.required<string>();\n\n // Field-specific properties\n readonly label = input<string>('');\n readonly options = input<Array<{ value: string; label: string }>>([]);\n readonly className = input<string>('');\n readonly tabIndex = input<number | undefined>(undefined);\n readonly hidden = input<boolean>(false);\n readonly readonly = input<boolean>(false);\n readonly props = input<Record<string, unknown>>({});\n}\n","import { Injectable, signal } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\n/**\n * Fake translation service for testing dynamic text functionality.\n * Provides Observable-based translation methods with language switching simulation.\n *\n * @example\n * ```typescript\n * TestBed.configureTestingModule({\n * providers: [\n * { provide: TranslationService, useClass: FakeTranslationService }\n * ]\n * });\n *\n * const service = TestBed.inject(FakeTranslationService);\n * service.setTranslations({\n * 'form.username.label': 'Username',\n * 'validation.required': 'This field is required'\n * });\n * ```\n *\n * @public\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class FakeTranslationService {\n private readonly translations = new BehaviorSubject<Record<string, string>>({});\n private readonly currentLanguage = signal('en');\n\n /**\n * Set the translation dictionary\n */\n setTranslations(translations: Record<string, string>): void {\n this.translations.next(translations);\n }\n\n /**\n * Add translations to the existing dictionary\n */\n addTranslations(translations: Record<string, string>): void {\n const current = this.translations.value;\n this.translations.next({ ...current, ...translations });\n }\n\n /**\n * Simulate language change\n */\n setLanguage(language: string): void {\n this.currentLanguage.set(language);\n // Trigger translation updates by emitting current translations\n this.translations.next(this.translations.value);\n }\n\n /**\n * Get current language as signal\n */\n getLanguage() {\n return this.currentLanguage;\n }\n\n /**\n * Translate a key and return an Observable\n * Supports parameter interpolation using {{param}} syntax\n */\n translate(key: string, params?: Record<string, unknown>): Observable<string> {\n return this.translations.pipe(\n map((translations) => {\n const translatedValue = translations[key] || key;\n return this.interpolateParams(translatedValue, params);\n }),\n );\n }\n\n /**\n * Get instant translation (synchronous)\n * Supports parameter interpolation using {{param}} syntax\n */\n instant(key: string, params?: Record<string, unknown>): string {\n const translations = this.translations.value;\n const translatedValue = translations[key] || key;\n return this.interpolateParams(translatedValue, params);\n }\n\n /**\n * Simulate translation for validation errors\n * Uses validation.${errorKind} pattern\n */\n translateValidationError(errorKind: string, params?: Record<string, unknown>): Observable<string> {\n const key = `validation.${errorKind}`;\n return this.translate(key, params);\n }\n\n /**\n * Get all current translations\n */\n getTranslations(): Record<string, string> {\n return this.translations.value;\n }\n\n /**\n * Clear all translations\n */\n clearTranslations(): void {\n this.translations.next({});\n }\n\n private interpolateParams(template: string, params?: Record<string, unknown>): string {\n if (!params) {\n return template;\n }\n\n let result = template;\n Object.entries(params).forEach(([key, value]) => {\n const placeholder = new RegExp(`{{\\\\s*${key}\\\\s*}}`, 'g');\n result = result.replace(placeholder, String(value));\n });\n\n return result;\n }\n}\n\n/**\n * Default translations for common form fields and validation messages\n * Useful for quick testing setup\n */\nexport const DEFAULT_TEST_TRANSLATIONS = {\n // Form field labels\n 'form.username.label': 'Username',\n 'form.email.label': 'Email Address',\n 'form.password.label': 'Password',\n 'form.firstName.label': 'First Name',\n 'form.lastName.label': 'Last Name',\n 'form.phone.label': 'Phone Number',\n 'form.address.label': 'Address',\n\n // Form field placeholders\n 'form.username.placeholder': 'Enter your username',\n 'form.email.placeholder': 'Enter your email address',\n 'form.password.placeholder': 'Enter your password',\n\n // Validation messages\n 'validation.required': 'This field is required',\n 'validation.email': 'Please enter a valid email address',\n 'validation.min': 'Value must be at least {{min}}',\n 'validation.max': 'Value must be at most {{max}}',\n 'validation.minLength': 'Must be at least {{requiredLength}} characters',\n 'validation.maxLength': 'Must be at most {{requiredLength}} characters',\n 'validation.pattern': 'Invalid format',\n\n // Button labels\n 'buttons.submit': 'Submit',\n 'buttons.cancel': 'Cancel',\n 'buttons.save': 'Save',\n 'buttons.delete': 'Delete',\n 'buttons.edit': 'Edit',\n\n // Multi-language examples for testing language switching\n greeting: 'Hello',\n goodbye: 'Goodbye',\n};\n\n/**\n * Alternative translations for testing language switching\n */\nexport const SPANISH_TEST_TRANSLATIONS = {\n 'form.username.label': 'Nombre de usuario',\n 'form.email.label': 'Dirección de correo electrónico',\n 'form.password.label': 'Contraseña',\n 'validation.required': 'Este campo es obligatorio',\n 'validation.email': 'Por favor ingrese una dirección de correo válida',\n greeting: 'Hola',\n goodbye: 'Adiós',\n};\n\n/**\n * Test utility to create a configured FakeTranslationService with default translations\n */\nexport function createTestTranslationService(\n initialTranslations: Record<string, string> = DEFAULT_TEST_TRANSLATIONS,\n): FakeTranslationService {\n const service = new FakeTranslationService();\n service.setTranslations(initialTranslations);\n return service;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;;;;;;;;AAAA;;;;;;;;;;;;;;;;;;;AAmBG;AACG,SAAU,KAAK,CAAC,EAAE,GAAG,CAAC,EAAA;AAC1B,IAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC1D;;ACPA;;;AAGG;SACa,gBAAgB,GAAA;IAC9B,OAAO;AACL,QAAA,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;AACd,QAAA,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;AACb,QAAA,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;AACb,QAAA,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;KACf;AACH;AAEA;;;AAGG;SACa,iBAAiB,GAAA;IAC/B,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,IAAI,aAAa,EAAE,EAAE;AACtE;;ACDA;;AAEG;MACU,iBAAiB,CAAA;IACpB,MAAM,GAAwB,EAAE;AAExC,IAAA,KAAK,CAAC,KAAwB,EAAA;AAC5B,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;AACvB,QAAA,OAAO,IAAI;IACb;IAEA,UAAU,CAAC,GAAW,EAAE,KAA+B,EAAA;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC;YAChB,GAAG;AACH,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;YACjD,KAAK,EAAE,EAAE,WAAW,EAAE,CAAA,MAAA,EAAS,GAAG,CAAA,CAAE,EAAE,GAAG,KAAK,EAAE;AACjD,SAAA,CAAC;IACJ;IAEA,kBAAkB,CAAC,GAAW,EAAE,KAA+B,EAAA;AAC7D,QAAA,MAAM,UAAU,GAAwC;YACtD,GAAG;AACH,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AACjD,YAAA,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,EAAE,WAAW,EAAE,CAAA,MAAA,EAAS,GAAG,CAAA,CAAE,EAAE,GAAG,KAAK,EAAE;SACjD;AACD,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;IAC/B;AAEA,IAAA,WAAW,CAAC,GAAW,EAAE,OAAgD,EAAE,KAA+B,EAAA;AACxG,QAAA,MAAM,WAAW,GAAiD;YAChE,GAAG;AACH,YAAA,IAAI,EAAE,QAAQ;AACd,YAAA,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;YACjD,OAAO;YACP,KAAK,EAAE,KAAK,IAAI,EAAE;SACnB;AACD,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;IAChC;IAEA,aAAa,CAAC,GAAW,EAAE,KAA+B,EAAA;QACxD,OAAO,IAAI,CAAC,KAAK,CAAC;YAChB,GAAG;AACH,YAAA,IAAI,EAAE,UAAU;AAChB,YAAA,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;YACjD,KAAK,EAAE,KAAK,IAAI,EAAE;AACnB,SAAA,CAAC;IACJ;IAEA,QAAQ,CAAC,GAAW,EAAE,MAA2B,EAAA;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC;YAChB,GAAG;AACH,YAAA,IAAI,EAAE,KAAK;YACX,MAAM;AACc,SAAA,CAAC;IACzB;IAEA,UAAU,CAAC,GAAW,EAAE,MAA2B,EAAA;QACjD,OAAO,IAAI,CAAC,KAAK,CAAC;YAChB,GAAG;AACH,YAAA,IAAI,EAAE,OAAO;YACb,MAAM;AACc,SAAA,CAAC;IACzB;IAEA,WAAW,CAAC,GAAW,EAAE,KAA+B,EAAA;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC;YAChB,GAAG;AACH,YAAA,IAAI,EAAE,QAAQ;AACd,YAAA,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;YACjD,KAAK,EAAE,KAAK,IAAI,EAAE;AACnB,SAAA,CAAC;IACJ;AAEA,IAAA,SAAS,CAAC,GAAW,EAAE,MAA2B,EAAE,KAAc,EAAA;AAChE,QAAA,MAAM,UAAU,GAAG,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,CAAA,EAAG,GAAG,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,MAAM;QACpG,OAAO,IAAI,CAAC,KAAK,CAAC;YAChB,GAAG;AACH,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,MAAM,EAAE,UAAU;AACE,SAAA,CAAC;IACzB;IAEA,KAAK,GAAA;AACH,QAAA,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAA2B;IACzD;AACD;AAED;;AAEG;MACU,oBAAoB,CAAA;AAC/B;;AAEG;AACH,IAAA,OAAO,OAAO,GAAA;QACZ,OAAO,IAAI,iBAAiB,EAAE;IAChC;AAEA;;AAEG;AACH,IAAA,aAAa,UAAU,CAAC,UAAiC,EAAA;QACvD,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC;AACpD,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,iBAAiB;;AAE3C,QAAA,MAAM,aAAa,GAAG,SAAS,CAAC,eAAe,CAAwB;;AAGvE,QAAA,IAAI,UAAU,CAAC,kBAAkB,KAAK,KAAK,EAAE;AAC3C,YAAA,oBAAoB,CAAC,kBAAkB,CAAC,aAAa,CAAC;QACxD;;QAGA,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,cAAc,EAAE,UAAU,CAAC,MAAM,CAAC;AAChE,QAAA,IAAI,UAAU,CAAC,YAAY,KAAK,SAAS,EAAE;YACzC,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,YAAY,CAAC;QACjE;QAEA,OAAO,CAAC,aAAa,EAAE;AACvB,QAAA,MAAM,oBAAoB,CAAC,WAAW,CAAC,OAAwC,CAAC;QAEhF,OAAO;AACL,YAAA,SAAS,EAAE,SAAwB;AACnC,YAAA,OAAO,EAAE,OAAwC;SAClD;IACH;AAEA;;;AAGG;IACK,OAAO,kBAAkB,CAAC,aAAkC,EAAA;;AAElE,QAAA,MAAM,WAAW,GAAG,CAAC,QAA2B,KAAqC;AACnF,YAAA,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,QAAQ,CAAC;;AAGnD,YAAA,OAAO,QAAQ,CAAC,OAAO;AACrB,gBAAA,GAAG,gBAAgB,EAAE;gBACrB,IAAI,EAAG,QAAQ,CAAC,KAAiC,GAAG,MAAM,CAAC,IAAI,MAAM;gBACrE,WAAW,EAAG,QAAQ,CAAC,KAAiC,GAAG,aAAa,CAAC,IAAI,EAAE;AAChF,aAAA,CAAC,CAAC;AACL,QAAA,CAAC;;AAGD,QAAA,MAAM,YAAY,GAAG,CAAC,QAA2B,KAAqC;AACpF,YAAA,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,QAAQ,CAAC;;AAGnD,YAAA,OAAO,QAAQ,CAAC,OAAO;AACrB,gBAAA,GAAG,gBAAgB,EAAE;AACrB,gBAAA,OAAO,EAAG,QAA+C,CAAC,OAAO,IAAI,EAAE;AACxE,aAAA,CAAC,CAAC;AACL,QAAA,CAAC;;AAGD,QAAA,MAAM,cAAc,GAAG,CAAC,QAA2B,KAAqC;AACtF,YAAA,OAAO,mBAAmB,CAAC,QAAQ,CAAC;AACtC,QAAA,CAAC;;AAGD,QAAA,MAAM,YAAY,GAAG,CAAC,QAA2B,KAAqC;AACpF,YAAA,OAAO,gBAAgB,CAAC,QAAQ,CAAC;AACnC,QAAA,CAAC;;AAGD,QAAA,aAAa,CAAC,aAAa,CAAC,eAAe,CAAC;;QAG5C,aAAa,CAAC,aAAa,CAAC;AAC1B,YAAA;AACE,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,aAAa,EAAE,MAAM,iEAAwC;AAC7D,gBAAA,MAAM,EAAE,WAAW;AACpB,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,aAAa,EAAE,MAAM,kEAAyC;AAC9D,gBAAA,MAAM,EAAE,YAAY;AACrB,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,UAAU;AAChB,gBAAA,aAAa,EAAE,MAAM,oEAA2C;AAChE,gBAAA,MAAM,EAAE,cAAc;AACvB,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,aAAa,EAAE,MAAM,OAAO,mEAAiC,CAAC;AAC9D,gBAAA,MAAM,EAAE,YAAY;AACrB,aAAA;AACF,SAAA,CAAC;IACJ;AAEA;;;;;AAKG;IACH,aAAa,WAAW,CAAC,OAAsC,EAAE,SAAS,GAAG,GAAG,EAAA;AAC9E,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,iBAAiB;;QAG3C,OAAO,CAAC,aAAa,EAAE;QACvB,OAAO,CAAC,YAAY,EAAE;;;AAItB,QAAA,MAAM,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC;;AAGjH,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1B,OAAO,CAAC,YAAY,EAAE;YACtB,OAAO,CAAC,aAAa,EAAE;AACvB,YAAA,MAAM,KAAK,CAAC,CAAC,CAAC;QAChB;AAEA,QAAA,MAAM,OAAO,CAAC,UAAU,EAAE;QAC1B,OAAO,CAAC,YAAY,EAAE;QACtB,OAAO,CAAC,aAAa,EAAE;IACzB;AAEA;;AAEG;IACK,aAAa,cAAc,CACjC,OAAsC,EACtC,QAAgB,EAChB,WAAW,GAAG,EAAE,EAAA;AAEhB,QAAA,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE;YACtD,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAM;YAClE,IAAI,OAAO,EAAE;AACX,gBAAA,OAAO,OAAO;YAChB;;YAGA,OAAO,CAAC,YAAY,EAAE;YACtB,OAAO,CAAC,aAAa,EAAE;AACvB,YAAA,MAAM,KAAK,CAAC,EAAE,CAAC;QACjB;QAEA,MAAM,IAAI,KAAK,CAAC,CAAA,iDAAA,EAAoD,QAAQ,CAAA,OAAA,EAAU,WAAW,CAAA,SAAA,CAAW,CAAC;IAC/G;AAEA;;AAEG;IACH,aAAa,aAAa,CAAC,OAAsC,EAAE,QAAgB,EAAE,KAAa,EAAA;QAChG,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,cAAc,CAAmB,OAAO,EAAE,QAAQ,CAAC;AAE5F,QAAA,KAAK,CAAC,KAAK,GAAG,KAAK;AACnB,QAAA,KAAK,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,aAAa,EAAE;AACvB,QAAA,MAAM,KAAK,CAAC,CAAC,CAAC;IAChB;AAEA;;AAEG;AACH,IAAA,aAAa,YAAY,CAAC,OAAsC,EAAE,QAAgB,EAAA;QAChF,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,cAAc,CAAU,OAAO,EAAE,QAAQ,CAAC;AAErF,QAAA,OAAO,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,aAAa,EAAE;AACvB,QAAA,MAAM,KAAK,CAAC,CAAC,CAAC;IAChB;AAEA;;AAEG;IACH,aAAa,cAAc,CAAC,OAAsC,EAAE,QAAgB,EAAE,KAAa,EAAA;QACjG,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,cAAc,CAAoB,OAAO,EAAE,QAAQ,CAAC;AAE9F,QAAA,MAAM,CAAC,KAAK,GAAG,KAAK;AACpB,QAAA,MAAM,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,aAAa,EAAE;AACvB,QAAA,MAAM,KAAK,CAAC,CAAC,CAAC;IAChB;AAEA;;AAEG;IACH,aAAa,gBAAgB,CAAC,OAAsC,EAAE,QAAgB,EAAE,OAAgB,EAAA;QACtG,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,cAAc,CAAmB,OAAO,EAAE,QAAQ,CAAC;AAE/F,QAAA,QAAQ,CAAC,OAAO,GAAG,OAAO;AAC1B,QAAA,QAAQ,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7D,QAAA,QAAQ,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,OAAO,CAAC,aAAa,EAAE;AACvB,QAAA,MAAM,KAAK,CAAC,CAAC,CAAC;IAChB;AAEA;;AAEG;AACH,IAAA,aAAa,mBAAmB,CAAC,OAAsC,EAAE,QAAgB,EAAA;QACvF,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,cAAc,CAAoB,OAAO,EAAE,QAAQ,CAAC;QAE9F,MAAM,CAAC,KAAK,EAAE;QACd,OAAO,CAAC,aAAa,EAAE;AACvB,QAAA,MAAM,KAAK,CAAC,CAAC,CAAC;IAChB;AAEA;;AAEG;IACH,OAAO,YAAY,CAAC,SAAsB,EAAA;AACxC,QAAA,OAAO,SAAS,CAAC,SAAS,EAAE;IAC9B;AAEA;;AAEG;IACH,OAAO,aAAa,CAAC,SAAsB,EAAA;AACzC,QAAA,OAAO,SAAS,CAAC,MAAM,EAAE;IAC3B;AAEA;;AAEG;IACH,OAAO,WAAW,CAAC,SAAsB,EAAA;AACvC,QAAA,OAAO,SAAS,CAAC,KAAK,EAAE;IAC1B;AAEA;;AAEG;AACH,IAAA,OAAO,gBAAgB,CAAC,OAAsC,EAAE,SAAiB,EAAA;QAC/E,OAAO,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAA,QAAA,EAAW,SAAS,CAAA,CAAE,CAAC;IACvE;AAEA;;AAEG;IACH,aAAa,gBAAgB,CAAC,OAAsC,EAAE,aAAqB,EAAE,aAAqB,EAAA;QAChH,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,cAAc,CAAmB,OAAO,EAAE,aAAa,CAAC;QAEnG,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,KAAK,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,KAAK;AAC5F,QAAA,IAAI,WAAW,KAAK,aAAa,EAAE;YACjC,MAAM,IAAI,KAAK,CAAC,CAAA,4CAAA,EAA+C,aAAa,CAAA,YAAA,EAAe,WAAW,CAAA,CAAA,CAAG,CAAC;QAC5G;IACF;AAEA;;AAEG;AACH,IAAA,OAAO,eAAe,CAAC,SAAsB,EAAE,aAAsC,EAAA;AACnF,QAAA,MAAM,WAAW,GAAG,SAAS,CAAC,SAAS,EAAE;AACzC,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE;AACjE,YAAA,MAAM,IAAI,KAAK,CAAC,6CAA6C,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA,UAAA,EAAa,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA,CAAE,CAAC;QACvI;IACF;AACD;;AC5VD;;;;;;;;;;;;;;;;;;;;AAoBG;AACG,SAAU,sBAAsB,CACpC,MAAA,GAAyC,EAAE,EAAA;IAE3C,MAAM,EACJ,cAAc,EACd,YAAY,GAAG,EAAqB,EACpC,aAAa,GAAG,MAAM,YAAsB,EAC5C,yBAAyB,EACzB,WAAW,EACX,IAAI,EAAE,UAAU,GACjB,GAAG,MAAM;;IAGV,MAAM,KAAK,GAAG,WAAW,IAAI,MAAM,CAA8B,YAAY,CAAC;;AAG9E,IAAA,IAAI,YAA6C;IACjD,IAAI,UAAU,EAAE;QACd,YAAY,GAAG,UAAU;IAC3B;SAAO;AACL,QAAA,MAAM,YAAY,GAAG,cAAc,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;AACzE,QAAA,YAAY,GAAG,qBAAqB,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,CAAoC;IAC1G;;AAGA,IAAA,MAAM,kBAAkB,GAA+B;AACrD,QAAA,QAAQ,EAAE,cAAc,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;QAC9D,KAAK;QACL,aAAa;AACb,QAAA,IAAI,EAAE,YAAY;QAClB,yBAAyB;KAC1B;;IAGD,OAAO,QAAQ,CAAC,MAAM,CAAC;AACrB,QAAA,MAAM,EAAE,cAAc;AACtB,QAAA,SAAS,EAAE;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,oBAAoB;AAC7B,gBAAA,QAAQ,EAAE,kBAAkB;AAC7B,aAAA;AACF,SAAA;AACF,KAAA,CAAC;AACJ;AAEA;;;;;;;;;;;;;;;;;;;;;;;AAuBG;AACG,SAAU,UAAU,CAAI,QAAiB,EAAE,OAAyD,EAAA;AACxG,IAAA,MAAM,YAAY,GAAG,sBAAsB,CAAC,OAAO,CAAC;AACpD,IAAA,OAAO,qBAAqB,CAAC,YAAY,EAAE,QAAQ,CAAC;AACtD;AAEA;;;;;;;;;;;;;;;;;;AAkBG;AACG,SAAU,sBAAsB,CACpC,MAAA,GAAyC,EAAE,EAAA;IAE3C,MAAM,EACJ,cAAc,EACd,YAAY,GAAG,EAAqB,EACpC,aAAa,GAAG,MAAM,YAAsB,EAC5C,yBAAyB,EACzB,WAAW,EACX,IAAI,EAAE,UAAU,GACjB,GAAG,MAAM;AAEV,IAAA,MAAM,QAAQ,GAAG,cAAc,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IACrE,MAAM,KAAK,GAAG,WAAW,IAAI,MAAM,CAA8B,YAAY,CAAC;AAE9E,IAAA,IAAI,YAA6C;IACjD,IAAI,UAAU,EAAE;QACd,YAAY,GAAG,UAAU;IAC3B;SAAO;AACL,QAAA,YAAY,GAAG,qBAAqB,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,CAAoC;IACtG;IAEA,OAAO;QACL,QAAQ;QACR,KAAK;QACL,aAAa;AACb,QAAA,IAAI,EAAE,YAAY;QAClB,yBAAyB;KAC1B;AACH;;ACnJA;;AAEG;MACU,qBAAqB,CAAA;IACxB,MAAM,GAAwB,EAAE;AAExC,IAAA,KAAK,CAAC,KAAwB,EAAA;AAC5B,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;AACvB,QAAA,OAAO,IAAI;IACb;IAEA,UAAU,CAAC,GAAW,EAAE,KAA+B,EAAA;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC;YAChB,GAAG;AACH,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AACjD,YAAA,GAAG,KAAK;AACT,SAAA,CAAC;IACJ;IAEA,kBAAkB,CAAC,GAAW,EAAE,KAA+B,EAAA;AAC7D,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC;IAC3D;IAEA,aAAa,CAAC,GAAW,EAAE,KAA+B,EAAA;QACxD,OAAO,IAAI,CAAC,KAAK,CAAC;YAChB,GAAG;AACH,YAAA,IAAI,EAAE,UAAU;AAChB,YAAA,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AACjD,YAAA,GAAG,KAAK;AACT,SAAA,CAAC;IACJ;IAEA,KAAK,GAAA;AACH,QAAA,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;IAChC;AACD;AAED;;AAEG;MACU,eAAe,CAAA;AAC1B;;AAEG;AACH,IAAA,OAAO,OAAO,GAAA;QACZ,OAAO,IAAI,qBAAqB,EAAK;IACvC;AAEA;;AAEG;IACH,OAAO,eAAe,CAA8B,MAAA,GAAyB,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,YAAgB,EAAA;QAC3G,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC;AACpD,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,iBAAiB;;QAG3C,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;AACrD,QAAA,IAAI,YAAY,KAAK,SAAS,EAAE;YAC9B,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;QACtD;QAEA,OAAO,CAAC,aAAa,EAAE;QACvB,OAAO,CAAC,YAAY,EAAE;;AAEtB,QAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAsB;IACnD;AAEA;;AAEG;AACH,IAAA,aAAa,WAAW,CAAC,OAAsC,EAAA;AAC7D,QAAA,MAAM,KAAK,CAAC,CAAC,CAAC;QACd,OAAO,CAAC,aAAa,EAAE;QACvB,OAAO,CAAC,YAAY,EAAE;AACtB,QAAA,MAAM,KAAK,CAAC,CAAC,CAAC;IAChB;AAEA;;AAEG;IACH,aAAa,aAAa,CAAC,OAAsC,EAAE,QAAgB,EAAE,KAAa,EAAA;QAChG,MAAM,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAqB;QAC/E,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,MAAM,IAAI,KAAK,CAAC,0DAA0D,QAAQ,CAAA,CAAE,CAAC;QACvF;AAEA,QAAA,KAAK,CAAC,KAAK,GAAG,KAAK;AACnB,QAAA,KAAK,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,aAAa,EAAE;AACvB,QAAA,MAAM,KAAK,CAAC,CAAC,CAAC;IAChB;AAEA;;AAEG;IACH,aAAa,gBAAgB,CAAC,OAAsC,EAAE,QAAgB,EAAE,OAAgB,EAAA;QACtG,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAqB;QAClF,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,MAAM,IAAI,KAAK,CAAC,6DAA6D,QAAQ,CAAA,CAAE,CAAC;QAC1F;AAEA,QAAA,QAAQ,CAAC,OAAO,GAAG,OAAO;AAC1B,QAAA,QAAQ,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,OAAO,CAAC,aAAa,EAAE;AACvB,QAAA,MAAM,KAAK,CAAC,CAAC,CAAC;IAChB;AAEA;;AAEG;IACH,OAAO,YAAY,CAAC,SAAsB,EAAA;AACxC,QAAA,OAAO,SAAS,CAAC,SAAS,EAAE;IAC9B;AAEA;;AAEG;IACH,OAAO,WAAW,CAAC,SAAsB,EAAA;AACvC,QAAA,OAAO,SAAS,CAAC,KAAK,EAAE;IAC1B;AAEA;;AAEG;AACH,IAAA,OAAO,eAAe,CAAC,SAAsB,EAAE,aAAsC,EAAA;AACnF,QAAA,MAAM,WAAW,GAAG,SAAS,CAAC,SAAS,EAAE;AACzC,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE;AACjE,YAAA,MAAM,IAAI,KAAK,CAAC,6CAA6C,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA,UAAA,EAAa,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA,CAAE,CAAC;QACvI;IACF;AACD;AAED;AACA;MAKa,kBAAkB,CAAA;;IAE7B,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAW;;AAGxB,IAAA,GAAG,GAAG,KAAK,CAAS,EAAE,+CAAC;AACvB,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC;AACzB,IAAA,SAAS,GAAG,KAAK,CAAS,EAAE,qDAAC;AAC7B,IAAA,QAAQ,GAAG,KAAK,CAAqB,SAAS,oDAAC;AAC/C,IAAA,KAAK,GAAG,KAAK,CAAsC,SAAS,iDAAC;AAC7D,IAAA,WAAW,GAAG,KAAK,CAAS,EAAE,uDAAC;;AAG/B,IAAA,YAAY,GAAG,KAAK,CAAU,SAAS,wDAAC;AACxC,IAAA,MAAM,GAAG,KAAK,CAAY,EAAE,kDAAC;;AAG7B,IAAA,kBAAkB,GAAG,KAAK,CAAqC,SAAS,8DAAC;AACzE,IAAA,yBAAyB,GAAG,KAAK,CAAqC,SAAS,qEAAC;AAEhF,IAAA,KAAK,GAAG,MAAM,CAAC,MAAM,iDAAC;uGApBX,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,yhDAFnB,sCAAsC,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;2FAErC,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAJ9B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,eAAe;AACzB,oBAAA,QAAQ,EAAE,sCAAsC;AACjD,iBAAA;;AA2CD;;AAEG;AACG,SAAU,eAAe,CAAI,aAAsB,EAAE,MAAiC,EAAA;AAC1F,IAAA,MAAM,aAAa,GAAwB;AACzC,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,aAAa,EAAE,YAAY,kBAAkB;AAC7C,QAAA,MAAM,EAAE,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;KACnC;IAED,OAAO,CAAC,sBAAsB,CAAC;QAC7B,OAAO,EAAE,CAAC,aAAa,CAAC;AACxB,QAAA,SAAS,EAAE;AACT,YAAA,kBAAkB,EAAE;YACpB,QAAQ;AACR,YAAA;AACE,gBAAA,OAAO,EAAE,cAAc;gBACvB,QAAQ,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;AAC7C,aAAA;AACD,YAAA;AACE,gBAAA,OAAO,EAAE,oBAAoB;AAC7B,gBAAA,UAAU,EAAE,CAAC,QAAkB,KAAI;;AAEjC,oBAAA,OAAO,qBAAqB,CAAC,QAAQ,EAAE,MAAK;wBAC1C,MAAM,YAAY,IAAI,MAAM,CAAC,KAAK,IAAI,EAAE,CAAgC;AACxE,wBAAA,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,uDAAC;AACxC,wBAAA,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC;wBACtC,OAAO;4BACL,QAAQ;AACR,4BAAA,KAAK,EAAE,WAAW;AAClB,4BAAA,aAAa,EAAE,MAAM,YAAY;AACjC,4BAAA,IAAI,EAAE,YAAY;AAClB,4BAAA,yBAAyB,EAAE,SAAS;yBACrC;AACH,oBAAA,CAAC,CAAC;gBACJ,CAAC;gBACD,IAAI,EAAE,CAAC,QAAQ,CAAC;AACjB,aAAA;AACF,SAAA;AACF,KAAA,CAAC;IAEF,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,aAAa,CAAC;AACtD,IAAA,MAAM,SAAS,GAAG,OAAO,CAAC,iBAAiB;IAE3C,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;AACpD,IAAA,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;AACtD,IAAA,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE;QAC9B,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;IACtD;AACA,IAAA,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE;QAClC,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC;IAC9D;AACA,IAAA,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE;QAClC,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC;IAC9D;;IAGA,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;QAClC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE;AAC5F,YAAA,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QACjD;AACF,IAAA,CAAC,CAAC;IAEF,OAAO,CAAC,aAAa,EAAE;AAEvB,IAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE;AAC/B;AAEA;;AAEG;AACG,SAAU,qBAAqB,CAAC,GAAW,EAAE,KAAa,EAAA;IAC9D,OAAO;QACL,GAAG;AACH,QAAA,IAAI,EAAE,MAAM;QACZ,KAAK;KACN;AACH;;AC7Rc,MAAO,gBAAgB,CAAA;AAC1B,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,gDAAqB;AAC3C,IAAA,GAAG,GAAG,KAAK,CAAC,QAAQ,8CAAU;;AAG9B,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC;AACzB,IAAA,WAAW,GAAG,KAAK,CAAS,EAAE,uDAAC;AAC/B,IAAA,IAAI,GAAG,KAAK,CAAS,MAAM,gDAAC;AAC5B,IAAA,KAAK,GAAG,KAAK,CAA0B,EAAE,iDAAC;AAC1C,IAAA,SAAS,GAAG,KAAK,CAAS,EAAE,qDAAC;IAC7B,kBAAkB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAsB;IAChD,yBAAyB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,2BAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAsB;uGAX7C,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,yBAAA,EAAA,EAAA,iBAAA,EAAA,2BAAA,EAAA,UAAA,EAAA,2BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAJzB,CAAA,+CAAA,CAAiD,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEjD,SAAS,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAEA,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBANpC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,eAAe;AACzB,oBAAA,QAAQ,EAAE,CAAA,+CAAA,CAAiD;oBAC3D,eAAe,EAAE,uBAAuB,CAAC,MAAM;oBAC/C,OAAO,EAAE,CAAC,SAAS,CAAC;AACrB,iBAAA;;;;;;;;ACCa,MAAO,mBAAmB,CAAA;AAC7B,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,gDAAsB;AAC5C,IAAA,GAAG,GAAG,KAAK,CAAC,QAAQ,8CAAU;;AAG9B,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC;AACzB,IAAA,KAAK,GAAG,KAAK,CAA0B,EAAE,iDAAC;AAC1C,IAAA,SAAS,GAAG,KAAK,CAAS,EAAE,qDAAC;IAC7B,kBAAkB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAsB;IAChD,yBAAyB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,2BAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAsB;uGAT7C,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,yBAAA,EAAA,EAAA,iBAAA,EAAA,2BAAA,EAAA,UAAA,EAAA,2BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAJ5B,CAAA,iDAAA,CAAmD,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEnD,SAAS,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAEA,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBANvC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kBAAkB;AAC5B,oBAAA,QAAQ,EAAE,CAAA,iDAAA,CAAmD;oBAC7D,eAAe,EAAE,uBAAuB,CAAC,MAAM;oBAC/C,OAAO,EAAE,CAAC,SAAS,CAAC;AACrB,iBAAA;;;;;;;;ACND;;AAEG;AAeW,MAAO,iBAAiB,CAAA;AAC3B,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,gDAAqB;AAC3C,IAAA,GAAG,GAAG,KAAK,CAAC,QAAQ,8CAAU;;AAG9B,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC;AACzB,IAAA,OAAO,GAAG,KAAK,CAA0C,EAAE,mDAAC;AAC5D,IAAA,SAAS,GAAG,KAAK,CAAS,EAAE,qDAAC;AAC7B,IAAA,QAAQ,GAAG,KAAK,CAAqB,SAAS,oDAAC;AAC/C,IAAA,MAAM,GAAG,KAAK,CAAU,KAAK,kDAAC;AAC9B,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,oDAAC;AAChC,IAAA,KAAK,GAAG,KAAK,CAA0B,EAAE,iDAAC;uGAXhC,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAZ1B;;;;;;;;AAQT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAES,SAAS,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAEA,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAdrC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,QAAQ,EAAE;;;;;;;;AAQT,EAAA,CAAA;oBACD,eAAe,EAAE,uBAAuB,CAAC,MAAM;oBAC/C,OAAO,EAAE,CAAC,SAAS,CAAC;AACrB,iBAAA;;;;;;;;ACfD;;;;;;;;;;;;;;;;;;;;AAoBG;MAIU,sBAAsB,CAAA;AAChB,IAAA,YAAY,GAAG,IAAI,eAAe,CAAyB,EAAE,CAAC;AAC9D,IAAA,eAAe,GAAG,MAAM,CAAC,IAAI,2DAAC;AAE/C;;AAEG;AACH,IAAA,eAAe,CAAC,YAAoC,EAAA;AAClD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;IACtC;AAEA;;AAEG;AACH,IAAA,eAAe,CAAC,YAAoC,EAAA;AAClD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK;AACvC,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,YAAY,EAAE,CAAC;IACzD;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,QAAgB,EAAA;AAC1B,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC;;QAElC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;IACjD;AAEA;;AAEG;IACH,WAAW,GAAA;QACT,OAAO,IAAI,CAAC,eAAe;IAC7B;AAEA;;;AAGG;IACH,SAAS,CAAC,GAAW,EAAE,MAAgC,EAAA;QACrD,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAC3B,GAAG,CAAC,CAAC,YAAY,KAAI;YACnB,MAAM,eAAe,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG;YAChD,OAAO,IAAI,CAAC,iBAAiB,CAAC,eAAe,EAAE,MAAM,CAAC;QACxD,CAAC,CAAC,CACH;IACH;AAEA;;;AAGG;IACH,OAAO,CAAC,GAAW,EAAE,MAAgC,EAAA;AACnD,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK;QAC5C,MAAM,eAAe,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG;QAChD,OAAO,IAAI,CAAC,iBAAiB,CAAC,eAAe,EAAE,MAAM,CAAC;IACxD;AAEA;;;AAGG;IACH,wBAAwB,CAAC,SAAiB,EAAE,MAAgC,EAAA;AAC1E,QAAA,MAAM,GAAG,GAAG,CAAA,WAAA,EAAc,SAAS,EAAE;QACrC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC;IACpC;AAEA;;AAEG;IACH,eAAe,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK;IAChC;AAEA;;AAEG;IACH,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;IAC5B;IAEQ,iBAAiB,CAAC,QAAgB,EAAE,MAAgC,EAAA;QAC1E,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,QAAQ;QACjB;QAEA,IAAI,MAAM,GAAG,QAAQ;AACrB,QAAA,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;YAC9C,MAAM,WAAW,GAAG,IAAI,MAAM,CAAC,CAAA,MAAA,EAAS,GAAG,CAAA,MAAA,CAAQ,EAAE,GAAG,CAAC;AACzD,YAAA,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;AACrD,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,MAAM;IACf;uGA7FW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,cAFrB,MAAM,EAAA,CAAA;;2FAEP,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAHlC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;AAiGD;;;AAGG;AACI,MAAM,yBAAyB,GAAG;;AAEvC,IAAA,qBAAqB,EAAE,UAAU;AACjC,IAAA,kBAAkB,EAAE,eAAe;AACnC,IAAA,qBAAqB,EAAE,UAAU;AACjC,IAAA,sBAAsB,EAAE,YAAY;AACpC,IAAA,qBAAqB,EAAE,WAAW;AAClC,IAAA,kBAAkB,EAAE,cAAc;AAClC,IAAA,oBAAoB,EAAE,SAAS;;AAG/B,IAAA,2BAA2B,EAAE,qBAAqB;AAClD,IAAA,wBAAwB,EAAE,0BAA0B;AACpD,IAAA,2BAA2B,EAAE,qBAAqB;;AAGlD,IAAA,qBAAqB,EAAE,wBAAwB;AAC/C,IAAA,kBAAkB,EAAE,oCAAoC;AACxD,IAAA,gBAAgB,EAAE,gCAAgC;AAClD,IAAA,gBAAgB,EAAE,+BAA+B;AACjD,IAAA,sBAAsB,EAAE,gDAAgD;AACxE,IAAA,sBAAsB,EAAE,+CAA+C;AACvE,IAAA,oBAAoB,EAAE,gBAAgB;;AAGtC,IAAA,gBAAgB,EAAE,QAAQ;AAC1B,IAAA,gBAAgB,EAAE,QAAQ;AAC1B,IAAA,cAAc,EAAE,MAAM;AACtB,IAAA,gBAAgB,EAAE,QAAQ;AAC1B,IAAA,cAAc,EAAE,MAAM;;AAGtB,IAAA,QAAQ,EAAE,OAAO;AACjB,IAAA,OAAO,EAAE,SAAS;;AAGpB;;AAEG;AACI,MAAM,yBAAyB,GAAG;AACvC,IAAA,qBAAqB,EAAE,mBAAmB;AAC1C,IAAA,kBAAkB,EAAE,iCAAiC;AACrD,IAAA,qBAAqB,EAAE,YAAY;AACnC,IAAA,qBAAqB,EAAE,2BAA2B;AAClD,IAAA,kBAAkB,EAAE,kDAAkD;AACtE,IAAA,QAAQ,EAAE,MAAM;AAChB,IAAA,OAAO,EAAE,OAAO;;AAGlB;;AAEG;AACG,SAAU,4BAA4B,CAC1C,mBAAA,GAA8C,yBAAyB,EAAA;AAEvE,IAAA,MAAM,OAAO,GAAG,IAAI,sBAAsB,EAAE;AAC5C,IAAA,OAAO,CAAC,eAAe,CAAC,mBAAmB,CAAC;AAC5C,IAAA,OAAO,OAAO;AAChB;;AC1LA;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"ng-forge-dynamic-forms-testing.mjs","sources":["../../../../packages/dynamic-forms/testing/src/delay.ts","../../../../packages/dynamic-forms/testing/src/mock-logger.ts","../../../../packages/dynamic-forms/testing/src/dynamic-form-test-utils.ts","../../../../packages/dynamic-forms/testing/src/mapper-test-utils.ts","../../../../packages/dynamic-forms/testing/src/simple-test-utils.ts","../../../../packages/dynamic-forms/testing/src/harnesses/test-input.harness.ts","../../../../packages/dynamic-forms/testing/src/harnesses/test-checkbox.harness.ts","../../../../packages/dynamic-forms/testing/src/harnesses/test-select.harness.ts","../../../../packages/dynamic-forms/testing/src/fake-translation.service.ts","../../../../packages/dynamic-forms/testing/src/ng-forge-dynamic-forms-testing.ts"],"sourcesContent":["/**\n * Creates a promise that resolves after the specified delay.\n *\n * Utility function for testing scenarios where you need to wait for\n * asynchronous operations, animations, or timing-dependent behavior.\n *\n * @param ms - Delay in milliseconds (defaults to 0 for next tick)\n * @returns Promise that resolves after the specified delay\n *\n * @example\n * ```typescript\n * // Wait for async operations in tests\n * await delay(100);\n * expect(component.isLoaded).toBe(true);\n *\n * // Wait for next tick (micro-task)\n * await delay();\n * fixture.detectChanges();\n * ```\n */\nexport function delay(ms = 0): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import { Provider } from '@angular/core';\nimport { vi, type Mock } from 'vitest';\nimport { DynamicFormLogger, ConsoleLogger } from '@ng-forge/dynamic-forms';\nimport type { Logger } from '@ng-forge/dynamic-forms';\n\n/**\n * Mock logger with vitest spies for testing.\n */\nexport interface MockLogger extends Logger {\n debug: Mock;\n info: Mock;\n warn: Mock;\n error: Mock;\n}\n\n/**\n * Creates a mock logger with vitest spies for all methods.\n * Useful for testing code that uses the logger.\n */\nexport function createMockLogger(): MockLogger {\n return {\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n };\n}\n\n/**\n * Provider for a console logger in tests.\n * Add this to TestBed.configureTestingModule providers when not using provideDynamicForm().\n */\nexport function provideTestLogger(): Provider {\n return { provide: DynamicFormLogger, useValue: new ConsoleLogger() };\n}\n","import { ComponentFixture, TestBed } from '@angular/core/testing';\nimport { computed, Signal } from '@angular/core';\nimport { ValidationError } from '@angular/forms/signals';\nimport { firstValueFrom, race, timer } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { DynamicForm, FormConfig, FieldDef, FieldTypeDefinition, BUILT_IN_FIELDS } from '@ng-forge/dynamic-forms';\nimport { InputField, SelectField, checkboxFieldMapper, valueFieldMapper } from '@ng-forge/dynamic-forms/integration';\nimport { delay } from './delay';\n\n/**\n * Internal interface for field registry operations needed by test utilities\n */\ninterface FieldRegistryWriter {\n registerTypes(types: FieldTypeDefinition[]): void;\n}\n\n/**\n * Configuration for creating a dynamic form test\n */\nexport interface DynamicFormTestConfig {\n config: FormConfig;\n initialValue?: Record<string, unknown>;\n registerTestFields?: boolean;\n}\n\n/**\n * Result of creating a dynamic form test\n */\nexport interface DynamicFormTestResult {\n component: DynamicForm;\n fixture: ComponentFixture<DynamicForm>;\n}\n\n/**\n * Fluent API for building form configurations\n */\nexport class FormConfigBuilder {\n private fields: FieldDef<unknown>[] = [];\n\n field(field: FieldDef<unknown>): FormConfigBuilder {\n this.fields.push(field);\n return this;\n }\n\n inputField(key: string, props?: Record<string, unknown>): FormConfigBuilder {\n return this.field({\n key,\n type: 'input',\n label: key.charAt(0).toUpperCase() + key.slice(1),\n props: { placeholder: `Enter ${key}`, ...props },\n });\n }\n\n requiredInputField(key: string, props?: Record<string, unknown>): FormConfigBuilder {\n const inputField: InputField<Record<string, unknown>> = {\n key,\n type: 'input',\n label: key.charAt(0).toUpperCase() + key.slice(1),\n required: true,\n props: { placeholder: `Enter ${key}`, ...props },\n };\n return this.field(inputField);\n }\n\n selectField(key: string, options: Array<{ value: string; label: string }>, props?: Record<string, unknown>): FormConfigBuilder {\n const selectField: SelectField<string, Record<string, unknown>> = {\n key,\n type: 'select',\n label: key.charAt(0).toUpperCase() + key.slice(1),\n options,\n props: props || {},\n };\n return this.field(selectField);\n }\n\n checkboxField(key: string, props?: Record<string, unknown>): FormConfigBuilder {\n return this.field({\n key,\n type: 'checkbox',\n label: key.charAt(0).toUpperCase() + key.slice(1),\n props: props || {},\n });\n }\n\n rowField(key: string, fields: FieldDef<unknown>[]): FormConfigBuilder {\n return this.field({\n key,\n type: 'row',\n fields,\n } as FieldDef<unknown>);\n }\n\n groupField(key: string, fields: FieldDef<unknown>[]): FormConfigBuilder {\n return this.field({\n key,\n type: 'group',\n fields,\n } as FieldDef<unknown>);\n }\n\n buttonField(key: string, props?: Record<string, unknown>): FormConfigBuilder {\n return this.field({\n key,\n type: 'button',\n label: key.charAt(0).toUpperCase() + key.slice(1),\n props: props || {},\n });\n }\n\n pageField(key: string, fields: FieldDef<unknown>[], title?: string): FormConfigBuilder {\n const pageFields = title ? [{ key: `${key}-title`, type: 'text', label: title }, ...fields] : fields;\n return this.field({\n key,\n type: 'page',\n fields: pageFields,\n } as FieldDef<unknown>);\n }\n\n build(): FormConfig {\n return { fields: this.fields } as unknown as FormConfig;\n }\n}\n\n/**\n * Utility class for testing dynamic forms\n */\nexport class DynamicFormTestUtils {\n /**\n * Creates a new form config builder\n */\n static builder(): FormConfigBuilder {\n return new FormConfigBuilder();\n }\n\n /**\n * Creates a dynamic form test setup with optional test field registration\n */\n static async createTest(testConfig: DynamicFormTestConfig): Promise<DynamicFormTestResult> {\n const fixture = TestBed.createComponent(DynamicForm);\n const component = fixture.componentInstance;\n // Access fieldRegistry from the component instance (injected by Angular DI)\n const fieldRegistry = component['fieldRegistry'] as FieldRegistryWriter;\n\n // Register test fields if requested\n if (testConfig.registerTestFields !== false) {\n DynamicFormTestUtils.registerTestFields(fieldRegistry);\n }\n\n // Set up the component - use 'dynamic-form' as the input name since config uses alias: 'dynamic-form'\n fixture.componentRef.setInput('dynamic-form', testConfig.config);\n if (testConfig.initialValue !== undefined) {\n fixture.componentRef.setInput('value', testConfig.initialValue);\n }\n\n fixture.detectChanges();\n await DynamicFormTestUtils.waitForInit(fixture as ComponentFixture<DynamicForm>);\n\n return {\n component: component as DynamicForm,\n fixture: fixture as ComponentFixture<DynamicForm>,\n };\n }\n\n /**\n * Registers common test field types including built-in types like page, row, group\n * @internal\n */\n private static registerTestFields(fieldRegistry: FieldRegistryWriter): void {\n // Input field mapper that extends value field mapper (returns Signal)\n const inputMapper = (fieldDef: FieldDef<unknown>): Signal<Record<string, unknown>> => {\n const baseInputsSignal = valueFieldMapper(fieldDef);\n\n // Return computed signal that adds input-specific inputs\n return computed(() => ({\n ...baseInputsSignal(),\n type: (fieldDef.props as Record<string, unknown>)?.['type'] || 'text',\n placeholder: (fieldDef.props as Record<string, unknown>)?.['placeholder'] || '',\n }));\n };\n\n // Select field mapper that extends value field mapper (returns Signal)\n const selectMapper = (fieldDef: FieldDef<unknown>): Signal<Record<string, unknown>> => {\n const baseInputsSignal = valueFieldMapper(fieldDef);\n\n // Return computed signal that adds select-specific inputs\n return computed(() => ({\n ...baseInputsSignal(),\n options: (fieldDef as unknown as Record<string, unknown>).options || [], // Safe cast: SelectField extends FieldDef with options property\n }));\n };\n\n // Checkbox field mapper - uses checked instead of value (already returns Signal)\n const checkboxMapper = (fieldDef: FieldDef<unknown>): Signal<Record<string, unknown>> => {\n return checkboxFieldMapper(fieldDef);\n };\n\n // Button field mapper that extends value field mapper (already returns Signal)\n const buttonMapper = (fieldDef: FieldDef<unknown>): Signal<Record<string, unknown>> => {\n return valueFieldMapper(fieldDef);\n };\n\n // Register built-in fields first (page, row, group)\n fieldRegistry.registerTypes(BUILT_IN_FIELDS);\n\n // Then register test field types\n fieldRegistry.registerTypes([\n {\n name: 'input',\n loadComponent: () => import('./harnesses/test-input.harness'),\n mapper: inputMapper,\n },\n {\n name: 'select',\n loadComponent: () => import('./harnesses/test-select.harness'),\n mapper: selectMapper,\n },\n {\n name: 'checkbox',\n loadComponent: () => import('./harnesses/test-checkbox.harness'),\n mapper: checkboxMapper,\n },\n {\n name: 'button',\n loadComponent: () => import('./harnesses/test-button.harness'),\n mapper: buttonMapper,\n },\n ]);\n }\n\n /**\n * Waits for the dynamic form to initialize.\n * Uses the initialized$ observable directly which has shareReplay for late subscribers.\n * @param fixture - The component fixture\n * @param timeoutMs - Maximum time to wait for initialization (default: 100ms)\n */\n static async waitForInit(fixture: ComponentFixture<DynamicForm>, timeoutMs = 100): Promise<void> {\n const component = fixture.componentInstance;\n\n // Trigger initial change detection\n fixture.detectChanges();\n TestBed.flushEffects();\n\n // Use the initialized$ observable directly (with shareReplay) for proper replay behavior\n // Race against a timeout to prevent hanging if initialization already happened\n await firstValueFrom(race(component.initialized$.pipe(map(() => true)), timer(timeoutMs).pipe(map(() => false))));\n\n // Stabilization cycles for async components\n for (let i = 0; i < 2; i++) {\n TestBed.flushEffects();\n fixture.detectChanges();\n await delay(0);\n }\n\n await fixture.whenStable();\n TestBed.flushEffects();\n fixture.detectChanges();\n }\n\n /**\n * Waits for an element to appear in the DOM with retries\n */\n private static async waitForElement<T extends Element>(\n fixture: ComponentFixture<DynamicForm>,\n selector: string,\n maxAttempts = 10,\n ): Promise<T> {\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n const element = fixture.nativeElement.querySelector(selector) as T;\n if (element) {\n return element;\n }\n\n // Wait and retry\n TestBed.flushEffects();\n fixture.detectChanges();\n await delay(50);\n }\n\n throw new Error(`[Dynamic Forms] Element not found with selector: ${selector} after ${maxAttempts} attempts`);\n }\n\n /**\n * Simulates user input on a field element\n */\n static async simulateInput(fixture: ComponentFixture<DynamicForm>, selector: string, value: string): Promise<void> {\n const input = await DynamicFormTestUtils.waitForElement<HTMLInputElement>(fixture, selector);\n\n input.value = value;\n input.dispatchEvent(new Event('input', { bubbles: true }));\n fixture.detectChanges();\n await delay(0);\n }\n\n /**\n * Simulates user blur on a field element\n */\n static async simulateBlur(fixture: ComponentFixture<DynamicForm>, selector: string): Promise<void> {\n const element = await DynamicFormTestUtils.waitForElement<Element>(fixture, selector);\n\n element.dispatchEvent(new Event('blur', { bubbles: true }));\n fixture.detectChanges();\n await delay(0);\n }\n\n /**\n * Simulates user selection on a select element\n */\n static async simulateSelect(fixture: ComponentFixture<DynamicForm>, selector: string, value: string): Promise<void> {\n const select = await DynamicFormTestUtils.waitForElement<HTMLSelectElement>(fixture, selector);\n\n select.value = value;\n select.dispatchEvent(new Event('change', { bubbles: true }));\n fixture.detectChanges();\n await delay(0);\n }\n\n /**\n * Simulates checkbox toggle\n */\n static async simulateCheckbox(fixture: ComponentFixture<DynamicForm>, selector: string, checked: boolean): Promise<void> {\n const checkbox = await DynamicFormTestUtils.waitForElement<HTMLInputElement>(fixture, selector);\n\n checkbox.checked = checked;\n checkbox.dispatchEvent(new Event('input', { bubbles: true }));\n checkbox.dispatchEvent(new Event('change', { bubbles: true }));\n fixture.detectChanges();\n await delay(0);\n }\n\n /**\n * Simulates button click\n */\n static async simulateButtonClick(fixture: ComponentFixture<DynamicForm>, selector: string): Promise<void> {\n const button = await DynamicFormTestUtils.waitForElement<HTMLButtonElement>(fixture, selector);\n\n button.click();\n fixture.detectChanges();\n await delay(0);\n }\n\n /**\n * Gets the current form value from the component\n */\n static getFormValue(component: DynamicForm): Record<string, unknown> | undefined {\n return component.formValue();\n }\n\n /**\n * Gets validation errors from the component\n */\n static getFormErrors(component: DynamicForm): ValidationError[] {\n return component.errors();\n }\n\n /**\n * Checks if the form is valid\n */\n static isFormValid(component: DynamicForm): boolean {\n return component.valid();\n }\n\n /**\n * Gets all field elements from the fixture\n */\n static getFieldElements(fixture: ComponentFixture<DynamicForm>, fieldType: string): NodeListOf<Element> {\n return fixture.nativeElement.querySelectorAll(`df-test-${fieldType}`);\n }\n\n /**\n * Asserts that a field has a specific value\n */\n static async assertFieldValue(fixture: ComponentFixture<DynamicForm>, fieldSelector: string, expectedValue: string): Promise<void> {\n const element = await DynamicFormTestUtils.waitForElement<HTMLInputElement>(fixture, fieldSelector);\n\n const actualValue = element.type === 'checkbox' ? element.checked.toString() : element.value;\n if (actualValue !== expectedValue) {\n throw new Error(`[Dynamic Forms] Expected field value to be \"${expectedValue}\", but got \"${actualValue}\"`);\n }\n }\n\n /**\n * Asserts that the form has a specific value\n */\n static assertFormValue(component: DynamicForm, expectedValue: Record<string, unknown>): void {\n const actualValue = component.formValue();\n if (JSON.stringify(actualValue) !== JSON.stringify(expectedValue)) {\n throw new Error(`[Dynamic Forms] Expected form value to be ${JSON.stringify(expectedValue)}, but got ${JSON.stringify(actualValue)}`);\n }\n }\n}\n","import { Injector, runInInjectionContext, signal, StaticProvider, WritableSignal } from '@angular/core';\nimport { form } from '@angular/forms/signals';\nimport {\n DEFAULT_VALIDATION_MESSAGES,\n FIELD_SIGNAL_CONTEXT,\n FieldSignalContext,\n FORM_OPTIONS,\n FormOptions,\n ValidationMessages,\n} from '@ng-forge/dynamic-forms';\n\n/**\n * Configuration for creating a test form injector with field signal context\n */\nexport interface TestFieldContextConfig<TModel extends Record<string, unknown> = Record<string, unknown>> {\n /**\n * Parent injector to use. If not provided, uses an empty injector.\n */\n parentInjector?: Injector;\n\n /**\n * Initial value for the form. If not provided, uses an empty object.\n */\n initialValue?: Partial<TModel>;\n\n /**\n * Default values function. If not provided, returns the initial value.\n */\n defaultValues?: () => TModel;\n\n /**\n * Default validation messages for the form.\n * Provided via DEFAULT_VALIDATION_MESSAGES injection token.\n */\n defaultValidationMessages?: ValidationMessages;\n\n /**\n * Form options for button disabled state defaults.\n * Provided via FORM_OPTIONS injection token.\n */\n formOptions?: FormOptions;\n\n /**\n * Custom value signal. If provided, this will be used instead of creating a new one.\n */\n valueSignal?: WritableSignal<Partial<TModel> | undefined>;\n\n /**\n * Custom form instance. If provided, this will be used instead of creating a new one.\n */\n form?: ReturnType<typeof form<TModel>>;\n}\n\n/**\n * Creates a test injector with FIELD_SIGNAL_CONTEXT provided.\n *\n * This utility simplifies testing of mappers and components that inject FIELD_SIGNAL_CONTEXT.\n *\n * @example\n * ```typescript\n * // Basic usage\n * const testInjector = createTestFormInjector();\n *\n * // With custom initial value\n * const testInjector = createTestFormInjector({\n * initialValue: { username: 'test' }\n * });\n *\n * // With validation messages\n * const testInjector = createTestFormInjector({\n * defaultValidationMessages: { required: 'This field is required' }\n * });\n * ```\n */\nexport function createTestFormInjector<TModel extends Record<string, unknown> = Record<string, unknown>>(\n config: TestFieldContextConfig<TModel> = {},\n): Injector {\n const {\n parentInjector,\n initialValue = {} as Partial<TModel>,\n defaultValues = () => initialValue as TModel,\n defaultValidationMessages,\n formOptions,\n valueSignal,\n form: customForm,\n } = config;\n\n // Create value signal\n const value = valueSignal ?? signal<Partial<TModel> | undefined>(initialValue);\n\n // Create form instance in injection context\n let formInstance: ReturnType<typeof form<TModel>>;\n if (customForm) {\n formInstance = customForm;\n } else {\n const tempInjector = parentInjector || Injector.create({ providers: [] });\n formInstance = runInInjectionContext(tempInjector, () => form(value)) as ReturnType<typeof form<TModel>>;\n }\n\n // Create field signal context (form-level config now provided via dedicated tokens)\n const fieldSignalContext: FieldSignalContext<TModel> = {\n injector: parentInjector || Injector.create({ providers: [] }),\n value,\n defaultValues,\n form: formInstance,\n };\n\n // Build providers array with all tokens\n const providers: StaticProvider[] = [{ provide: FIELD_SIGNAL_CONTEXT, useValue: fieldSignalContext }];\n\n if (defaultValidationMessages !== undefined) {\n providers.push({ provide: DEFAULT_VALIDATION_MESSAGES, useValue: defaultValidationMessages });\n }\n\n if (formOptions !== undefined) {\n providers.push({ provide: FORM_OPTIONS, useValue: formOptions });\n }\n\n // Create injector with context and tokens\n return Injector.create({\n parent: parentInjector,\n providers,\n });\n}\n\n/**\n * Runs a mapper function in a test injection context.\n *\n * This is a convenience wrapper that creates a test injector and runs the mapper\n * function within it, returning the result.\n *\n * @example\n * ```typescript\n * // Test a mapper without context overrides\n * const bindings = testMapper(() => mapValueField(fieldDef));\n *\n * // Test a mapper with custom context\n * const bindings = testMapper(\n * () => mapValueField(fieldDef),\n * { initialValue: { username: 'test' } }\n * );\n *\n * // Test a mapper with validation messages\n * const bindings = testMapper(\n * () => mapValueField(fieldDef),\n * { defaultValidationMessages: { required: 'Required field' } }\n * );\n * ```\n */\nexport function testMapper<T>(mapperFn: () => T, context?: TestFieldContextConfig<Record<string, unknown>>): T {\n const testInjector = createTestFormInjector(context);\n return runInInjectionContext(testInjector, mapperFn);\n}\n\n/**\n * Creates a field signal context for testing without creating an injector.\n *\n * Useful when you need to manually provide the context or test context creation logic.\n *\n * @example\n * ```typescript\n * const context = createTestFieldContext({\n * initialValue: { name: 'test' }\n * });\n *\n * // Use in your own injector\n * const injector = Injector.create({\n * providers: [\n * { provide: FIELD_SIGNAL_CONTEXT, useValue: context }\n * ]\n * });\n * ```\n */\nexport function createTestFieldContext<TModel extends Record<string, unknown> = Record<string, unknown>>(\n config: TestFieldContextConfig<TModel> = {},\n): FieldSignalContext<TModel> {\n const {\n parentInjector,\n initialValue = {} as Partial<TModel>,\n defaultValues = () => initialValue as TModel,\n valueSignal,\n form: customForm,\n } = config;\n\n const injector = parentInjector || Injector.create({ providers: [] });\n const value = valueSignal ?? signal<Partial<TModel> | undefined>(initialValue);\n\n let formInstance: ReturnType<typeof form<TModel>>;\n if (customForm) {\n formInstance = customForm;\n } else {\n formInstance = runInInjectionContext(injector, () => form(value)) as ReturnType<typeof form<TModel>>;\n }\n\n // Note: defaultValidationMessages and formOptions are no longer in FieldSignalContext\n // They should be provided via their respective injection tokens\n return {\n injector,\n value,\n defaultValues,\n form: formInstance,\n };\n}\n","import { ComponentFixture, TestBed } from '@angular/core/testing';\nimport { DynamicForm } from '@ng-forge/dynamic-forms';\nimport { delay } from './delay';\nimport { FieldDef } from '@ng-forge/dynamic-forms';\nimport { provideDynamicForm } from '@ng-forge/dynamic-forms';\nimport { Component, computed, Injector, input, runInInjectionContext, signal, Type } from '@angular/core';\nimport { FIELD_REGISTRY } from '@ng-forge/dynamic-forms';\nimport { FieldTypeDefinition } from '@ng-forge/dynamic-forms';\nimport { FIELD_SIGNAL_CONTEXT } from '@ng-forge/dynamic-forms';\nimport { EventBus } from '@ng-forge/dynamic-forms';\nimport { form } from '@angular/forms/signals';\nimport { RegisteredFieldTypes } from '@ng-forge/dynamic-forms';\n\n/**\n * Simple form configuration interface for testing\n */\nexport interface TestFormConfig {\n fields: FieldDef<unknown>[];\n}\n\n/**\n * Configuration for creating a dynamic form test\n */\nexport interface SimpleTestConfig<T = Record<string, unknown>> {\n config: TestFormConfig;\n initialValue?: T;\n}\n\n/**\n * Result of creating a dynamic form test.\n * Uses the base DynamicForm type without generic constraints for flexibility in tests.\n */\nexport interface SimpleTestResult {\n component: DynamicForm<RegisteredFieldTypes[]>;\n fixture: ComponentFixture<DynamicForm<RegisteredFieldTypes[]>>;\n}\n\n/**\n * Fluent API for building form configurations using existing field structure\n */\nexport class TestFormConfigBuilder<T = Record<string, unknown>> {\n private fields: FieldDef<unknown>[] = [];\n\n field(field: FieldDef<unknown>): TestFormConfigBuilder<T> {\n this.fields.push(field);\n return this;\n }\n\n inputField(key: string, props?: Record<string, unknown>): TestFormConfigBuilder<T> {\n return this.field({\n key,\n type: 'input',\n label: key.charAt(0).toUpperCase() + key.slice(1),\n ...props,\n });\n }\n\n requiredInputField(key: string, props?: Record<string, unknown>): TestFormConfigBuilder<T> {\n return this.inputField(key, { required: true, ...props });\n }\n\n checkboxField(key: string, props?: Record<string, unknown>): TestFormConfigBuilder<T> {\n return this.field({\n key,\n type: 'checkbox',\n label: key.charAt(0).toUpperCase() + key.slice(1),\n ...props,\n });\n }\n\n build(): TestFormConfig {\n return { fields: this.fields };\n }\n}\n\n/**\n * Simple utility class for testing dynamic forms\n */\nexport class SimpleTestUtils {\n /**\n * Creates a new form config builder\n */\n static builder<T = Record<string, unknown>>(): TestFormConfigBuilder<T> {\n return new TestFormConfigBuilder<T>();\n }\n\n /**\n * Creates a simple test component - assumes TestBed is already configured\n */\n static createComponent<T = Record<string, unknown>>(config: TestFormConfig = { fields: [] }, initialValue?: T): SimpleTestResult {\n const fixture = TestBed.createComponent(DynamicForm);\n const component = fixture.componentInstance;\n\n // Use 'dynamic-form' as the input name since config uses alias: 'dynamic-form'\n fixture.componentRef.setInput('dynamic-form', config);\n if (initialValue !== undefined) {\n fixture.componentRef.setInput('value', initialValue);\n }\n\n fixture.detectChanges();\n TestBed.flushEffects();\n // Cast to SimpleTestResult - type variance in DynamicForm generics doesn't affect runtime behavior\n return { component, fixture } as SimpleTestResult;\n }\n\n /**\n * Waits for the dynamic form to initialize\n */\n static async waitForInit(fixture: ComponentFixture<DynamicForm>): Promise<void> {\n await delay(0);\n fixture.detectChanges();\n TestBed.flushEffects();\n await delay(0);\n }\n\n /**\n * Simulates user input on a field element\n */\n static async simulateInput(fixture: ComponentFixture<DynamicForm>, selector: string, value: string): Promise<void> {\n const input = fixture.nativeElement.querySelector(selector) as HTMLInputElement;\n if (!input) {\n throw new Error(`[Dynamic Forms] Input element not found with selector: ${selector}`);\n }\n\n input.value = value;\n input.dispatchEvent(new Event('input', { bubbles: true }));\n fixture.detectChanges();\n await delay(0);\n }\n\n /**\n * Simulates checkbox toggle\n */\n static async simulateCheckbox(fixture: ComponentFixture<DynamicForm>, selector: string, checked: boolean): Promise<void> {\n const checkbox = fixture.nativeElement.querySelector(selector) as HTMLInputElement;\n if (!checkbox) {\n throw new Error(`[Dynamic Forms] Checkbox element not found with selector: ${selector}`);\n }\n\n checkbox.checked = checked;\n checkbox.dispatchEvent(new Event('change', { bubbles: true }));\n fixture.detectChanges();\n await delay(0);\n }\n\n /**\n * Gets the current form value from the component\n */\n static getFormValue(component: DynamicForm): Record<string, unknown> | undefined {\n return component.formValue();\n }\n\n /**\n * Checks if the form is valid\n */\n static isFormValid(component: DynamicForm): boolean {\n return component.valid();\n }\n\n /**\n * Asserts that the form has a specific value\n */\n static assertFormValue(component: DynamicForm, expectedValue: Record<string, unknown>): void {\n const actualValue = component.formValue();\n if (JSON.stringify(actualValue) !== JSON.stringify(expectedValue)) {\n throw new Error(`[Dynamic Forms] Expected form value to be ${JSON.stringify(expectedValue)}, but got ${JSON.stringify(actualValue)}`);\n }\n }\n}\n\n// Mock field component for testing\n// Includes all inputs that baseFieldMapper and valueFieldMapper might create bindings for\n@Component({\n selector: 'df-test-field',\n template: '<div>Test Field: {{ value() }}</div>',\n})\nexport class TestFieldComponent {\n // Field tree input\n field = input<unknown>();\n\n // Required inputs from baseFieldMapper\n key = input<string>('');\n label = input<string>('');\n className = input<string>('');\n tabIndex = input<number | undefined>(undefined);\n props = input<Record<string, unknown> | undefined>(undefined);\n placeholder = input<string>('');\n\n // Array-related inputs\n arrayContext = input<unknown>(undefined);\n fields = input<unknown[]>([]);\n\n // Validation inputs from valueFieldMapper\n validationMessages = input<Record<string, string> | undefined>(undefined);\n defaultValidationMessages = input<Record<string, string> | undefined>(undefined);\n\n value = signal('test');\n}\n\n/**\n * Configuration for setting up a simple component test\n */\nexport interface SimpleComponentTestConfig<T = unknown> {\n field: FieldDef<unknown>;\n value?: T;\n pageIndex?: number;\n isVisible?: boolean;\n [key: string]: unknown; // Allow additional inputs for flexible component testing\n}\n\n/**\n * Result of setting up a simple component test\n */\nexport interface SimpleComponentTestResult<T = unknown> {\n component: T;\n fixture: ComponentFixture<T>;\n}\n\n/**\n * Creates a simple test setup for individual field components\n */\nexport function setupSimpleTest<T>(componentType: Type<T>, config: SimpleComponentTestConfig): SimpleComponentTestResult<T> {\n const mockFieldType: FieldTypeDefinition = {\n name: 'test',\n loadComponent: async () => TestFieldComponent,\n mapper: () => computed(() => ({})), // Simple mapper that returns empty inputs signal for testing\n };\n\n TestBed.configureTestingModule({\n imports: [componentType],\n providers: [\n provideDynamicForm(),\n EventBus,\n {\n provide: FIELD_REGISTRY,\n useValue: new Map([['test', mockFieldType]]),\n },\n {\n provide: FIELD_SIGNAL_CONTEXT,\n useFactory: (injector: Injector) => {\n // Create test context using factory\n return runInInjectionContext(injector, () => {\n const defaultValue = (config.value || {}) as T & Record<string, unknown>;\n const valueSignal = signal(defaultValue);\n const formInstance = form(valueSignal);\n return {\n injector,\n value: valueSignal,\n defaultValues: () => defaultValue,\n form: formInstance,\n };\n });\n },\n deps: [Injector],\n },\n ],\n });\n\n const fixture = TestBed.createComponent(componentType);\n const component = fixture.componentInstance;\n\n fixture.componentRef.setInput('field', config.field);\n fixture.componentRef.setInput('key', config.field.key);\n if (config.value !== undefined) {\n fixture.componentRef.setInput('value', config.value);\n }\n if (config.pageIndex !== undefined) {\n fixture.componentRef.setInput('pageIndex', config.pageIndex);\n }\n if (config.isVisible !== undefined) {\n fixture.componentRef.setInput('isVisible', config.isVisible);\n }\n\n // Set any additional inputs provided in config\n Object.keys(config).forEach((key) => {\n if (!['field', 'value', 'pageIndex', 'isVisible'].includes(key) && config[key] !== undefined) {\n fixture.componentRef.setInput(key, config[key]);\n }\n });\n\n fixture.detectChanges();\n\n return { component, fixture };\n}\n\n/**\n * Creates a simple test field definition\n */\nexport function createSimpleTestField(key: string, label: string): FieldDef<unknown> {\n return {\n key,\n type: 'test',\n label,\n };\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { FormField, FieldTree } from '@angular/forms/signals';\nimport { ValidationMessages } from '@ng-forge/dynamic-forms';\n\n@Component({\n selector: 'df-test-input',\n template: `<input [type]=\"type()\" [formField]=\"field()\" />`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FormField],\n})\nexport default class TestInputHarness {\n readonly field = input.required<FieldTree<string>>();\n readonly key = input.required<string>();\n\n // Field-specific properties\n readonly label = input<string>('');\n readonly placeholder = input<string>('');\n readonly type = input<string>('text');\n readonly props = input<Record<string, unknown>>({});\n readonly className = input<string>('');\n readonly validationMessages = input<ValidationMessages>();\n readonly defaultValidationMessages = input<ValidationMessages>();\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { FormField, FieldTree } from '@angular/forms/signals';\nimport { ValidationMessages } from '@ng-forge/dynamic-forms';\n\n@Component({\n selector: 'df-test-checkbox',\n template: ` <input type=\"checkbox\" [formField]=\"field()\" /> `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FormField],\n})\nexport default class TestCheckboxHarness {\n readonly field = input.required<FieldTree<boolean>>();\n readonly key = input.required<string>();\n\n // Field-specific properties\n readonly label = input<string>('');\n readonly props = input<Record<string, unknown>>({});\n readonly className = input<string>('');\n readonly validationMessages = input<ValidationMessages>();\n readonly defaultValidationMessages = input<ValidationMessages>();\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { FormField, FieldTree } from '@angular/forms/signals';\n\n/**\n * Test harness component for select fields\n */\n@Component({\n selector: 'df-test-select',\n template: `\n @let f = field();\n <select [formField]=\"f\">\n <option value=\"\">Select...</option>\n @for (option of options(); track option.value) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </select>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FormField],\n})\nexport default class TestSelectHarness {\n readonly field = input.required<FieldTree<string>>();\n readonly key = input.required<string>();\n\n // Field-specific properties\n readonly label = input<string>('');\n readonly options = input<Array<{ value: string; label: string }>>([]);\n readonly className = input<string>('');\n readonly tabIndex = input<number | undefined>(undefined);\n readonly hidden = input<boolean>(false);\n readonly readonly = input<boolean>(false);\n readonly props = input<Record<string, unknown>>({});\n}\n","import { Injectable, signal } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\n/**\n * Fake translation service for testing dynamic text functionality.\n * Provides Observable-based translation methods with language switching simulation.\n *\n * @example\n * ```typescript\n * TestBed.configureTestingModule({\n * providers: [\n * { provide: TranslationService, useClass: FakeTranslationService }\n * ]\n * });\n *\n * const service = TestBed.inject(FakeTranslationService);\n * service.setTranslations({\n * 'form.username.label': 'Username',\n * 'validation.required': 'This field is required'\n * });\n * ```\n *\n * @public\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class FakeTranslationService {\n private readonly translations = new BehaviorSubject<Record<string, string>>({});\n private readonly currentLanguage = signal('en');\n\n /**\n * Set the translation dictionary\n */\n setTranslations(translations: Record<string, string>): void {\n this.translations.next(translations);\n }\n\n /**\n * Add translations to the existing dictionary\n */\n addTranslations(translations: Record<string, string>): void {\n const current = this.translations.value;\n this.translations.next({ ...current, ...translations });\n }\n\n /**\n * Simulate language change\n */\n setLanguage(language: string): void {\n this.currentLanguage.set(language);\n // Trigger translation updates by emitting current translations\n this.translations.next(this.translations.value);\n }\n\n /**\n * Get current language as signal\n */\n getLanguage() {\n return this.currentLanguage;\n }\n\n /**\n * Translate a key and return an Observable\n * Supports parameter interpolation using {{param}} syntax\n */\n translate(key: string, params?: Record<string, unknown>): Observable<string> {\n return this.translations.pipe(\n map((translations) => {\n const translatedValue = translations[key] || key;\n return this.interpolateParams(translatedValue, params);\n }),\n );\n }\n\n /**\n * Get instant translation (synchronous)\n * Supports parameter interpolation using {{param}} syntax\n */\n instant(key: string, params?: Record<string, unknown>): string {\n const translations = this.translations.value;\n const translatedValue = translations[key] || key;\n return this.interpolateParams(translatedValue, params);\n }\n\n /**\n * Simulate translation for validation errors\n * Uses validation.${errorKind} pattern\n */\n translateValidationError(errorKind: string, params?: Record<string, unknown>): Observable<string> {\n const key = `validation.${errorKind}`;\n return this.translate(key, params);\n }\n\n /**\n * Get all current translations\n */\n getTranslations(): Record<string, string> {\n return this.translations.value;\n }\n\n /**\n * Clear all translations\n */\n clearTranslations(): void {\n this.translations.next({});\n }\n\n private interpolateParams(template: string, params?: Record<string, unknown>): string {\n if (!params) {\n return template;\n }\n\n let result = template;\n Object.entries(params).forEach(([key, value]) => {\n const placeholder = new RegExp(`{{\\\\s*${key}\\\\s*}}`, 'g');\n result = result.replace(placeholder, String(value));\n });\n\n return result;\n }\n}\n\n/**\n * Default translations for common form fields and validation messages\n * Useful for quick testing setup\n */\nexport const DEFAULT_TEST_TRANSLATIONS = {\n // Form field labels\n 'form.username.label': 'Username',\n 'form.email.label': 'Email Address',\n 'form.password.label': 'Password',\n 'form.firstName.label': 'First Name',\n 'form.lastName.label': 'Last Name',\n 'form.phone.label': 'Phone Number',\n 'form.address.label': 'Address',\n\n // Form field placeholders\n 'form.username.placeholder': 'Enter your username',\n 'form.email.placeholder': 'Enter your email address',\n 'form.password.placeholder': 'Enter your password',\n\n // Validation messages\n 'validation.required': 'This field is required',\n 'validation.email': 'Please enter a valid email address',\n 'validation.min': 'Value must be at least {{min}}',\n 'validation.max': 'Value must be at most {{max}}',\n 'validation.minLength': 'Must be at least {{requiredLength}} characters',\n 'validation.maxLength': 'Must be at most {{requiredLength}} characters',\n 'validation.pattern': 'Invalid format',\n\n // Button labels\n 'buttons.submit': 'Submit',\n 'buttons.cancel': 'Cancel',\n 'buttons.save': 'Save',\n 'buttons.delete': 'Delete',\n 'buttons.edit': 'Edit',\n\n // Multi-language examples for testing language switching\n greeting: 'Hello',\n goodbye: 'Goodbye',\n};\n\n/**\n * Alternative translations for testing language switching\n */\nexport const SPANISH_TEST_TRANSLATIONS = {\n 'form.username.label': 'Nombre de usuario',\n 'form.email.label': 'Dirección de correo electrónico',\n 'form.password.label': 'Contraseña',\n 'validation.required': 'Este campo es obligatorio',\n 'validation.email': 'Por favor ingrese una dirección de correo válida',\n greeting: 'Hola',\n goodbye: 'Adiós',\n};\n\n/**\n * Test utility to create a configured FakeTranslationService with default translations\n */\nexport function createTestTranslationService(\n initialTranslations: Record<string, string> = DEFAULT_TEST_TRANSLATIONS,\n): FakeTranslationService {\n const service = new FakeTranslationService();\n service.setTranslations(initialTranslations);\n return service;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { input, computed, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
3
|
import { AsyncPipe } from '@angular/common';
|
|
4
|
-
import { a as DynamicTextPipe } from './ng-forge-dynamic-forms-ng-forge-dynamic-forms-
|
|
4
|
+
import { a as DynamicTextPipe } from './ng-forge-dynamic-forms-ng-forge-dynamic-forms-DHxoGouT.mjs';
|
|
5
5
|
|
|
6
6
|
class TextFieldComponent {
|
|
7
7
|
key = input.required(...(ngDevMode ? [{ debugName: "key" }] : []));
|
|
@@ -11,8 +11,8 @@ class TextFieldComponent {
|
|
|
11
11
|
hidden = input(...(ngDevMode ? [undefined, { debugName: "hidden" }] : []));
|
|
12
12
|
props = input(...(ngDevMode ? [undefined, { debugName: "props" }] : []));
|
|
13
13
|
elementType = computed(() => this.props()?.elementType || 'p', ...(ngDevMode ? [{ debugName: "elementType" }] : []));
|
|
14
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0
|
|
15
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0
|
|
14
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: TextFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
15
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: TextFieldComponent, isStandalone: true, selector: "df-text", inputs: { key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, hidden: { classPropertyName: "hidden", publicName: "hidden", isSignal: true, isRequired: false, transformFunction: null }, props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "id": "`${key()}`", "attr.data-testid": "key()", "attr.hidden": "hidden() || null" } }, ngImport: i0, template: `
|
|
16
16
|
@switch (elementType()) {
|
|
17
17
|
@case ('p') {
|
|
18
18
|
<p class="df-text df-text-p" [class]="className() || ''">
|
|
@@ -57,7 +57,7 @@ class TextFieldComponent {
|
|
|
57
57
|
}
|
|
58
58
|
`, isInline: true, styles: [":host([hidden]){display:none!important}.df-text{font-size:var(--df-text-font-size, 1rem);font-family:var(--df-text-font-family, inherit);font-weight:var(--df-text-font-weight, normal);color:var(--df-text-color, inherit);line-height:var(--df-text-line-height, 1.5);text-align:var(--df-text-text-align, inherit);letter-spacing:var(--df-text-letter-spacing, normal);text-decoration:var(--df-text-text-decoration, none);text-transform:var(--df-text-text-transform, none);margin:var(--df-text-margin, 0);padding:var(--df-text-padding, 0)}.df-text-h1{font-size:var(--df-text-h1-font-size, 2rem);font-weight:var(--df-text-h1-font-weight, bold);margin:var(--df-text-h1-margin, 0)}.df-text-h2{font-size:var(--df-text-h2-font-size, 1.75rem);font-weight:var(--df-text-h2-font-weight, bold);margin:var(--df-text-h2-margin, 0)}.df-text-h3{font-size:var(--df-text-h3-font-size, 1.5rem);font-weight:var(--df-text-h3-font-weight, bold);margin:var(--df-text-h3-margin, 0)}.df-text-h4{font-size:var(--df-text-h4-font-size, 1.25rem);font-weight:var(--df-text-h4-font-weight, bold);margin:var(--df-text-h4-margin, 0)}.df-text-h5{font-size:var(--df-text-h5-font-size, 1.125rem);font-weight:var(--df-text-h5-font-weight, bold);margin:var(--df-text-h5-margin, 0)}.df-text-h6{font-size:var(--df-text-h6-font-size, 1rem);font-weight:var(--df-text-h6-font-weight, bold);margin:var(--df-text-h6-margin, 0)}.df-text-p{font-size:var(--df-text-p-font-size, 1rem);margin:var(--df-text-p-margin, 0)}.df-text-span{display:var(--df-text-span-display, inline)}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: DynamicTextPipe, name: "dynamicText" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
59
59
|
}
|
|
60
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0
|
|
60
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: TextFieldComponent, decorators: [{
|
|
61
61
|
type: Component,
|
|
62
62
|
args: [{ selector: 'df-text', template: `
|
|
63
63
|
@switch (elementType()) {
|
|
@@ -110,4 +110,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImpor
|
|
|
110
110
|
}], propDecorators: { key: [{ type: i0.Input, args: [{ isSignal: true, alias: "key", required: true }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], tabIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabIndex", required: false }] }], hidden: [{ type: i0.Input, args: [{ isSignal: true, alias: "hidden", required: false }] }], props: [{ type: i0.Input, args: [{ isSignal: true, alias: "props", required: false }] }] } });
|
|
111
111
|
|
|
112
112
|
export { TextFieldComponent as default };
|
|
113
|
-
//# sourceMappingURL=ng-forge-dynamic-forms-text-field.component-
|
|
113
|
+
//# sourceMappingURL=ng-forge-dynamic-forms-text-field.component-DKCx7Z_U.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-forge-dynamic-forms-text-field.component-
|
|
1
|
+
{"version":3,"file":"ng-forge-dynamic-forms-text-field.component-DKCx7Z_U.mjs","sources":["../../../../packages/dynamic-forms/src/lib/fields/text/text-field.component.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { AsyncPipe } from '@angular/common';\nimport { DynamicTextPipe } from '../../pipes/dynamic-text/dynamic-text.pipe';\nimport { TextProps } from '../../definitions/default/text-field';\nimport { DynamicText } from '../../models/types/dynamic-text';\n\n@Component({\n selector: 'df-text',\n template: `\n @switch (elementType()) {\n @case ('p') {\n <p class=\"df-text df-text-p\" [class]=\"className() || ''\">\n {{ label() | dynamicText | async }}\n </p>\n }\n @case ('h1') {\n <h1 class=\"df-text df-text-h1\" [class]=\"className() || ''\">\n {{ label() | dynamicText | async }}\n </h1>\n }\n @case ('h2') {\n <h2 class=\"df-text df-text-h2\" [class]=\"className() || ''\">\n {{ label() | dynamicText | async }}\n </h2>\n }\n @case ('h3') {\n <h3 class=\"df-text df-text-h3\" [class]=\"className() || ''\">\n {{ label() | dynamicText | async }}\n </h3>\n }\n @case ('h4') {\n <h4 class=\"df-text df-text-h4\" [class]=\"className() || ''\">\n {{ label() | dynamicText | async }}\n </h4>\n }\n @case ('h5') {\n <h5 class=\"df-text df-text-h5\" [class]=\"className() || ''\">\n {{ label() | dynamicText | async }}\n </h5>\n }\n @case ('h6') {\n <h6 class=\"df-text df-text-h6\" [class]=\"className() || ''\">\n {{ label() | dynamicText | async }}\n </h6>\n }\n @case ('span') {\n <span class=\"df-text df-text-span\" [class]=\"className() || ''\">\n {{ label() | dynamicText | async }}\n </span>\n }\n }\n `,\n styleUrl: './text-field.component.scss',\n imports: [AsyncPipe, DynamicTextPipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[id]': '`${key()}`',\n '[attr.data-testid]': 'key()',\n '[attr.hidden]': 'hidden() || null',\n },\n})\nexport default class TextFieldComponent {\n readonly key = input.required<string>();\n readonly label = input.required<DynamicText>();\n readonly className = input<string>();\n readonly tabIndex = input<number>();\n readonly hidden = input<boolean>();\n readonly props = input<TextProps>();\n\n readonly elementType = computed(() => this.props()?.elementType || 'p');\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { O as ARRAY_CONTEXT, A as AddArrayItemEvent,
|
|
1
|
+
export { O as ARRAY_CONTEXT, A as AddArrayItemEvent, X as ArrayFieldComponent, a2 as BUILT_IN_FIELDS, C as ConsoleLogger, Q as DEFAULT_PROPS, T as DEFAULT_VALIDATION_MESSAGES, b as DynamicForm, z as DynamicFormError, D as DynamicFormLogger, a as DynamicTextPipe, E as EventBus, M as FIELD_REGISTRY, U as FIELD_SIGNAL_CONTEXT, V as FORM_OPTIONS, F as FormClearEvent, u as FormResetEvent, Y as GroupFieldComponent, x as NextPageEvent, N as NoopLogger, P as PageChangeEvent, y as PreviousPageEvent, R as RemoveArrayItemEvent, a6 as RootFormRegistryService, Z as RowFieldComponent, S as SubmitEvent, a5 as applyMetaToElement, _ as applyValidator, $ as applyValidators, H as arrayFieldMapper, B as baseFieldMapper, G as buildBaseInputs, W as dynamicTextToObservable, a0 as getArrayLength, I as groupFieldMapper, a4 as interpolateParams, l as isArrayField, h as isCheckedField, m as isContainerField, n as isDisplayOnlyField, f as isFormStateCondition, o as isGroupField, q as isLeafField, s as isPageField, k as isRowField, t as isValueBearingField, j as isValueField, a3 as omit, J as pageFieldMapper, p as provideDynamicForm, g as resolveNextButtonDisabled, r as resolveSubmitButtonDisabled, a1 as resolveTokens, K as rowFieldMapper, L as textFieldMapper, w as withLoggerConfig } from './ng-forge-dynamic-forms-ng-forge-dynamic-forms-DHxoGouT.mjs';
|
|
2
2
|
//# sourceMappingURL=ng-forge-dynamic-forms.mjs.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ng-forge/dynamic-forms",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Type-safe, signal-powered dynamic forms for Angular. Build complex forms from configuration with full TypeScript inference.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -31,15 +31,18 @@
|
|
|
31
31
|
],
|
|
32
32
|
"sideEffects": false,
|
|
33
33
|
"engines": {
|
|
34
|
-
"node": ">=
|
|
34
|
+
"node": ">=20"
|
|
35
35
|
},
|
|
36
36
|
"peerDependencies": {
|
|
37
|
-
"@angular/common": "
|
|
38
|
-
"@angular/core": "
|
|
39
|
-
"@angular/forms": "
|
|
40
|
-
"ngxtension": ">=4.0.0",
|
|
37
|
+
"@angular/common": "~21.1.0",
|
|
38
|
+
"@angular/core": "~21.1.0",
|
|
39
|
+
"@angular/forms": "~21.1.0",
|
|
41
40
|
"rxjs": ">=7.0.0"
|
|
42
41
|
},
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"ngxtension": ">=4.0.0",
|
|
44
|
+
"tslib": "^2.3.0"
|
|
45
|
+
},
|
|
43
46
|
"module": "fesm2022/ng-forge-dynamic-forms.mjs",
|
|
44
47
|
"typings": "types/ng-forge-dynamic-forms.d.ts",
|
|
45
48
|
"exports": {
|
|
@@ -58,8 +61,5 @@
|
|
|
58
61
|
"types": "./types/ng-forge-dynamic-forms-testing.d.ts",
|
|
59
62
|
"default": "./fesm2022/ng-forge-dynamic-forms-testing.mjs"
|
|
60
63
|
}
|
|
61
|
-
},
|
|
62
|
-
"dependencies": {
|
|
63
|
-
"tslib": "^2.3.0"
|
|
64
64
|
}
|
|
65
65
|
}
|
|
@@ -132,30 +132,69 @@ interface InputMeta extends FieldMeta {
|
|
|
132
132
|
}
|
|
133
133
|
|
|
134
134
|
/**
|
|
135
|
-
* HTML input types
|
|
135
|
+
* All valid HTML input types per MDN specification.
|
|
136
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#input_types
|
|
136
137
|
*/
|
|
137
|
-
type
|
|
138
|
+
type HtmlInputType = 'text' | 'email' | 'password' | 'number' | 'tel' | 'url' | 'search' | 'date' | 'datetime-local' | 'month' | 'week' | 'time' | 'color' | 'range' | 'checkbox' | 'radio' | 'file' | 'hidden' | 'button' | 'submit' | 'reset' | 'image';
|
|
138
139
|
/**
|
|
139
|
-
*
|
|
140
|
+
* Input types supported by InputField.
|
|
141
|
+
* Other HTML input types have dedicated field implementations:
|
|
142
|
+
* - checkbox → CheckboxField
|
|
143
|
+
* - radio → RadioField
|
|
144
|
+
* - range → SliderField
|
|
145
|
+
* - date/time → DatepickerField
|
|
146
|
+
* - file, hidden, button, etc. → dedicated fields
|
|
140
147
|
*/
|
|
141
|
-
type
|
|
148
|
+
type InputType = Extract<HtmlInputType, 'text' | 'email' | 'password' | 'number' | 'tel' | 'url' | 'search'>;
|
|
142
149
|
/**
|
|
143
|
-
*
|
|
144
|
-
*
|
|
150
|
+
* Infers the TypeScript value type for a given input type.
|
|
151
|
+
*
|
|
152
|
+
* @example
|
|
153
|
+
* type NumberValue = InferInputValue<'number'>; // number
|
|
154
|
+
* type TextValue = InferInputValue<'text'>; // string
|
|
155
|
+
* type DateValue = InferInputValue<'date'>; // string (extended types)
|
|
156
|
+
*/
|
|
157
|
+
type InferInputValue<T extends HtmlInputType> = T extends 'number' ? number : string;
|
|
158
|
+
/**
|
|
159
|
+
* @deprecated Use `InferInputValue` instead. Will be removed in v1.0.0.
|
|
145
160
|
*/
|
|
146
|
-
|
|
161
|
+
type InputTypeToValueType<T extends InputType> = InferInputValue<T>;
|
|
162
|
+
/**
|
|
163
|
+
* Props for input fields with optional type specification.
|
|
164
|
+
* Generic parameter allows extending InputType with additional HtmlInputType values.
|
|
165
|
+
*
|
|
166
|
+
* @example
|
|
167
|
+
* // Default usage
|
|
168
|
+
* interface MyProps extends InputProps { ... }
|
|
169
|
+
*
|
|
170
|
+
* // Extended input types (e.g., supporting date inputs)
|
|
171
|
+
* type ExtendedType = InputType | 'date' | 'time';
|
|
172
|
+
* interface ExtendedProps extends InputProps<ExtendedType> { ... }
|
|
173
|
+
*/
|
|
174
|
+
interface InputProps<T extends HtmlInputType = InputType> {
|
|
147
175
|
/**
|
|
148
176
|
* The HTML input type. Determines the value type:
|
|
149
177
|
* - 'number': value will be number
|
|
150
|
-
* -
|
|
178
|
+
* - All other types: value will be string
|
|
151
179
|
*/
|
|
152
180
|
type?: T;
|
|
153
181
|
placeholder?: DynamicText;
|
|
154
182
|
}
|
|
155
183
|
/**
|
|
156
|
-
* Input types that produce
|
|
184
|
+
* Input types that produce numeric values.
|
|
185
|
+
* Currently only 'number' produces a numeric value in HTML inputs.
|
|
186
|
+
*
|
|
187
|
+
* @example
|
|
188
|
+
* type Numeric = NumericInputType; // 'number'
|
|
189
|
+
*/
|
|
190
|
+
type NumericInputType<T extends HtmlInputType = InputType> = Extract<T, 'number'>;
|
|
191
|
+
/**
|
|
192
|
+
* Input types that produce string values.
|
|
193
|
+
*
|
|
194
|
+
* @example
|
|
195
|
+
* type Strings = StringInputType; // Exclude<InputType, 'number'>
|
|
157
196
|
*/
|
|
158
|
-
type StringInputType = Exclude<
|
|
197
|
+
type StringInputType<T extends HtmlInputType = InputType> = Exclude<T, 'number'>;
|
|
159
198
|
/**
|
|
160
199
|
* Number input field with strict number value type.
|
|
161
200
|
* When props.type is 'number', value must be number.
|
|
@@ -179,11 +218,11 @@ interface NumberInputField<TProps extends {
|
|
|
179
218
|
interface StringInputField<TProps extends {
|
|
180
219
|
type?: string;
|
|
181
220
|
} = InputProps> extends BaseValueField<TProps & {
|
|
182
|
-
type?:
|
|
221
|
+
type?: Exclude<TProps['type'], 'number'>;
|
|
183
222
|
}, string, InputMeta> {
|
|
184
223
|
type: 'input';
|
|
185
224
|
props?: TProps & {
|
|
186
|
-
type?:
|
|
225
|
+
type?: Exclude<TProps['type'], 'number'>;
|
|
187
226
|
};
|
|
188
227
|
}
|
|
189
228
|
/**
|
|
@@ -345,21 +384,20 @@ interface ToggleField<TProps> extends BaseCheckedField<TProps> {
|
|
|
345
384
|
}
|
|
346
385
|
|
|
347
386
|
/**
|
|
348
|
-
* Context for value field mapping, containing resolved field tree
|
|
387
|
+
* Context for value field mapping, containing resolved field tree.
|
|
349
388
|
* Used by specialized mappers to avoid duplicate context resolution.
|
|
350
389
|
*/
|
|
351
390
|
interface ValueFieldContext {
|
|
352
391
|
fieldTree: FieldTree<unknown> | undefined;
|
|
353
|
-
defaultValidationMessages: ValidationMessages | undefined;
|
|
354
392
|
}
|
|
355
393
|
/**
|
|
356
|
-
* Resolves the field tree
|
|
394
|
+
* Resolves the field tree from the form context.
|
|
357
395
|
* Must be called within an injection context.
|
|
358
396
|
*
|
|
359
397
|
* Uses type-safe field tree utilities to access child FieldTrees from the parent form.
|
|
360
398
|
*
|
|
361
399
|
* @param fieldKey The key of the field to resolve
|
|
362
|
-
* @returns The resolved context with field tree
|
|
400
|
+
* @returns The resolved context with field tree
|
|
363
401
|
*/
|
|
364
402
|
declare function resolveValueFieldContext(fieldKey: string): ValueFieldContext;
|
|
365
403
|
/**
|
|
@@ -368,9 +406,11 @@ declare function resolveValueFieldContext(fieldKey: string): ValueFieldContext;
|
|
|
368
406
|
*
|
|
369
407
|
* @param fieldDef The value field definition
|
|
370
408
|
* @param ctx The resolved value field context
|
|
409
|
+
* @param defaultProps Default props from the form configuration (may be undefined if not configured)
|
|
410
|
+
* @param defaultValidationMessages Default validation messages from the form configuration (may be undefined if not configured)
|
|
371
411
|
* @returns Record of input names to values
|
|
372
412
|
*/
|
|
373
|
-
declare function buildValueFieldInputs<TProps, TValue = unknown>(fieldDef: BaseValueField<TProps, TValue>, ctx: ValueFieldContext): Record<string, unknown>;
|
|
413
|
+
declare function buildValueFieldInputs<TProps, TValue = unknown>(fieldDef: BaseValueField<TProps, TValue>, ctx: ValueFieldContext, defaultProps?: Record<string, unknown>, defaultValidationMessages?: ValidationMessages): Record<string, unknown>;
|
|
374
414
|
/**
|
|
375
415
|
* Maps a value field definition to component inputs.
|
|
376
416
|
*
|
|
@@ -540,4 +580,4 @@ declare class ValueInArrayPipe implements PipeTransform {
|
|
|
540
580
|
}
|
|
541
581
|
|
|
542
582
|
export { ValueInArrayPipe, buildValueFieldInputs, checkboxFieldMapper, createResolvedErrorsSignal, datepickerFieldMapper, isEqual, optionsFieldMapper, resolveValueFieldContext, setupMetaTracking, shouldShowErrors, valueFieldMapper };
|
|
543
|
-
export type { Autocapitalize, AutocompleteValue, ButtonField, CheckboxField, DatepickerField, DatepickerProps, EnterKeyHint, EventArgs, FieldWithOptions, InputField, InputMeta, InputMode, InputProps, InputType, InputTypeToValueType, MetaTrackingOptions, MultiCheckboxField, RadioField, ResolvedError, SelectField, SelectProps, SliderField, StringInputType, TextareaField, TextareaMeta, TextareaProps, TextareaWrap, ToggleField, ValueFieldContext };
|
|
583
|
+
export type { Autocapitalize, AutocompleteValue, ButtonField, CheckboxField, DatepickerField, DatepickerProps, EnterKeyHint, EventArgs, FieldWithOptions, HtmlInputType, InferInputValue, InputField, InputMeta, InputMode, InputProps, InputType, InputTypeToValueType, MetaTrackingOptions, MultiCheckboxField, NumericInputType, RadioField, ResolvedError, SelectField, SelectProps, SliderField, StringInputType, TextareaField, TextareaMeta, TextareaProps, TextareaWrap, ToggleField, ValueFieldContext };
|