@angular/forms 21.2.0-next.3 → 21.2.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/fesm2022/_validation_errors-chunk.mjs +1 -1
- package/fesm2022/forms.mjs +128 -128
- package/fesm2022/forms.mjs.map +1 -1
- package/fesm2022/signals-compat.mjs +3 -5
- package/fesm2022/signals-compat.mjs.map +1 -1
- package/fesm2022/signals.mjs +105 -47
- package/fesm2022/signals.mjs.map +1 -1
- package/package.json +4 -4
- package/resources/code-examples.db +0 -0
- package/types/_structure-chunk.d.ts +26 -8
- package/types/forms.d.ts +1 -1
- package/types/signals-compat.d.ts +1 -1
- package/types/signals.d.ts +30 -12
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @license Angular v21.2.0
|
|
2
|
+
* @license Angular v21.2.0
|
|
3
3
|
* (c) 2010-2026 Google LLC. https://angular.dev/
|
|
4
4
|
* License: MIT
|
|
5
5
|
*/
|
|
@@ -25,10 +25,8 @@ class CompatFieldNode extends FieldNode {
|
|
|
25
25
|
function makeCreateDestroySubject() {
|
|
26
26
|
let destroy$ = new ReplaySubject(1);
|
|
27
27
|
return () => {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
destroy$.complete();
|
|
31
|
-
}
|
|
28
|
+
destroy$.next();
|
|
29
|
+
destroy$.complete();
|
|
32
30
|
return destroy$ = new ReplaySubject(1);
|
|
33
31
|
};
|
|
34
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signals-compat.mjs","sources":["../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/forms/signals/compat/src/compat_field_node.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/forms/signals/compat/src/compat_node_state.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/forms/signals/compat/src/compat_structure.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/forms/signals/compat/src/compat_validation_state.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/forms/signals/compat/src/compat_field_adapter.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/forms/signals/compat/src/api/compat_form.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/forms/signals/compat/src/api/di.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/forms/signals/compat/src/signal_form_control/signal_form_control.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {computed, linkedSignal, runInInjectionContext, Signal, untracked} from '@angular/core';\nimport {toSignal} from '@angular/core/rxjs-interop';\nimport {AbstractControl} from '@angular/forms';\nimport {Observable, ReplaySubject} from 'rxjs';\nimport {map, takeUntil} from 'rxjs/operators';\nimport {FieldNode} from '../../src/field/node';\nimport {getInjectorFromOptions} from '../../src/field/util';\nimport type {CompatFieldNodeOptions} from './compat_structure';\n\n/**\n * Field node with additional control property.\n *\n * Compat node has no children.\n */\nexport class CompatFieldNode extends FieldNode {\n readonly control: Signal<AbstractControl>;\n\n constructor(public readonly options: CompatFieldNodeOptions) {\n super(options);\n this.control = this.options.control;\n }\n}\n\n/**\n * Makes a function which creates a new subject (and unsubscribes/destroys the previous one).\n *\n * This allows us to automatically unsubscribe from status changes of the previous FormControl when we go to subscribe to a new one\n */\nfunction makeCreateDestroySubject() {\n let destroy$ = new ReplaySubject<void>(1);\n return () => {\n if (destroy$) {\n destroy$.next();\n destroy$.complete();\n }\n return (destroy$ = new ReplaySubject<void>(1));\n };\n}\n\n/**\n * Helper function taking options, and a callback which takes options, and a function\n * converting reactive control to appropriate property using toSignal from rxjs compat.\n *\n * This helper keeps all complexity in one place by doing the following things:\n * - Running the callback in injection context\n * - Not tracking the callback, as it creates a new signal.\n * - Reacting to control changes, allowing to swap control dynamically.\n *\n * @param options\n * @param makeSignal\n */\nexport function extractControlPropToSignal<T, R = T>(\n options: CompatFieldNodeOptions,\n makeSignal: (c: AbstractControl<unknown, T>, destroy$: Observable<void>) => Signal<R>,\n): Signal<R> {\n const injector = getInjectorFromOptions(options);\n\n // Creates a subject that could be used in takeUntil.\n const createDestroySubject = makeCreateDestroySubject();\n\n const signalOfControlSignal = linkedSignal({\n source: options.control,\n computation: (control) => {\n return untracked(() => {\n return runInInjectionContext(injector, () => makeSignal(control, createDestroySubject()));\n });\n },\n });\n\n // We have to have computed, because we need to react to both:\n // linked signal changes as well as the inner signal changes.\n return computed(() => signalOfControlSignal()());\n}\n\n/**\n * A helper function, simplifying getting reactive control properties after status changes.\n *\n * Used to extract errors and statuses such as valid, pending.\n *\n * @param options\n * @param getValue\n */\nexport const getControlStatusSignal = <T>(\n options: CompatFieldNodeOptions,\n getValue: (c: AbstractControl<unknown>) => T,\n) => {\n return extractControlPropToSignal<unknown, T>(options, (c, destroy$) =>\n toSignal(\n c.statusChanges.pipe(\n map(() => getValue(c)),\n takeUntil(destroy$),\n ),\n {\n initialValue: getValue(c),\n },\n ),\n );\n};\n\n/**\n * A helper function, simplifying converting convert events to signals.\n *\n * Used to get dirty and touched signals from control.\n *\n * @param options\n * @param getValue A function which takes control and returns required value.\n */\nexport const getControlEventsSignal = <T>(\n options: CompatFieldNodeOptions,\n getValue: (c: AbstractControl) => T,\n) => {\n return extractControlPropToSignal<unknown, T>(options, (c, destroy$) =>\n toSignal(\n c.events.pipe(\n map(() => {\n return getValue(c);\n }),\n takeUntil(destroy$),\n ),\n {\n initialValue: getValue(c),\n },\n ),\n );\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {computed, Signal} from '@angular/core';\nimport {AbstractControl} from '@angular/forms';\nimport {FieldNodeState} from '../../src/field/state';\nimport {CompatFieldNode, getControlEventsSignal, getControlStatusSignal} from './compat_field_node';\nimport {CompatFieldNodeOptions} from './compat_structure';\n\n/**\n * A FieldNodeState class wrapping a FormControl and proxying it's state.\n */\nexport class CompatNodeState extends FieldNodeState {\n override readonly touched: Signal<boolean>;\n override readonly dirty: Signal<boolean>;\n override readonly disabled: Signal<boolean>;\n private readonly control: Signal<AbstractControl>;\n\n constructor(\n readonly compatNode: CompatFieldNode,\n options: CompatFieldNodeOptions,\n ) {\n super(compatNode);\n this.control = options.control;\n this.touched = getControlEventsSignal(options, (c) => c.touched);\n this.dirty = getControlEventsSignal(options, (c) => c.dirty);\n const controlDisabled = getControlStatusSignal(options, (c) => c.disabled);\n\n this.disabled = computed(() => {\n return controlDisabled() || this.disabledReasons().length > 0;\n });\n }\n\n override markAsDirty() {\n this.control().markAsDirty();\n }\n\n override markAsTouched() {\n this.control().markAsTouched();\n }\n\n override markAsPristine() {\n this.control().markAsPristine();\n }\n\n override markAsUntouched() {\n this.control().markAsUntouched();\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n computed,\n Signal,\n signal,\n WritableSignal,\n ɵRuntimeError as RuntimeError,\n} from '@angular/core';\nimport {RuntimeErrorCode} from '../../src/errors';\nimport {FormFieldManager} from '../../src/field/manager';\nimport {FieldNode, ParentFieldNode} from '../../src/field/node';\nimport {\n ChildFieldNodeOptions,\n FieldNodeOptions,\n FieldNodeStructure,\n RootFieldNodeOptions,\n} from '../../src/field/structure';\n\nimport {toSignal} from '@angular/core/rxjs-interop';\nimport {AbstractControl} from '@angular/forms';\nimport {map, takeUntil} from 'rxjs/operators';\nimport {extractControlPropToSignal} from './compat_field_node';\n\n/**\n * Child Field Node options also exposing control property.\n */\nexport interface CompatChildFieldNodeOptions extends ChildFieldNodeOptions {\n control: Signal<AbstractControl>;\n}\n\n/**\n * Root Field Node options also exposing control property.\n */\nexport interface CompatRootFieldNodeOptions extends RootFieldNodeOptions {\n control: Signal<AbstractControl>;\n}\n\n/**\n * Field Node options also exposing control property.\n */\nexport type CompatFieldNodeOptions = CompatRootFieldNodeOptions | CompatChildFieldNodeOptions;\n\n/**\n * A helper function allowing to get parent if it exists.\n */\nfunction getParentFromOptions(options: FieldNodeOptions) {\n if (options.kind === 'root') {\n return undefined;\n }\n\n return options.parent;\n}\n\n/**\n * A helper function allowing to get fieldManager regardless of the option type.\n */\nfunction getFieldManagerFromOptions(options: FieldNodeOptions) {\n if (options.kind === 'root') {\n return options.fieldManager;\n }\n\n return options.parent.structure.root.structure.fieldManager;\n}\n\n/**\n * A helper function that takes CompatFieldNodeOptions, and produce a writable signal synced to the\n * value of contained AbstractControl.\n *\n * This uses toSignal, which requires an injector.\n *\n * @param options\n */\nfunction getControlValueSignal<T>(options: CompatFieldNodeOptions) {\n const value = extractControlPropToSignal<T>(options, (control, destroy$) => {\n return toSignal(\n control.valueChanges.pipe(\n map(() => control.getRawValue()),\n takeUntil(destroy$),\n ),\n {\n initialValue: control.getRawValue(),\n },\n );\n }) as WritableSignal<T>;\n\n value.set = (value: T) => {\n options.control().setValue(value);\n };\n\n value.update = (fn: (current: T) => T) => {\n value.set(fn(value()));\n };\n\n return value;\n}\n\n/**\n * Compat version of FieldNodeStructure,\n * - It has no children\n * - It wraps FormControl and proxies its value.\n */\nexport class CompatStructure extends FieldNodeStructure {\n override value: WritableSignal<unknown>;\n override keyInParent: Signal<string>;\n override root: FieldNode;\n override pathKeys: Signal<readonly string[]>;\n override readonly children = signal([]);\n override readonly childrenMap = computed(() => undefined);\n override readonly parent: ParentFieldNode | undefined;\n override readonly fieldManager: FormFieldManager;\n\n constructor(node: FieldNode, options: CompatFieldNodeOptions) {\n super(options.logic, node, () => {\n throw new RuntimeError(\n RuntimeErrorCode.COMPAT_NO_CHILDREN,\n ngDevMode && `Compat nodes don't have children.`,\n );\n });\n this.value = getControlValueSignal(options);\n this.parent = getParentFromOptions(options);\n this.root = this.parent?.structure.root ?? node;\n this.fieldManager = getFieldManagerFromOptions(options);\n\n const identityInParent = options.kind === 'child' ? options.identityInParent : undefined;\n const initialKeyInParent = options.kind === 'child' ? options.initialKeyInParent : undefined;\n this.keyInParent = this.createKeyInParent(options, identityInParent, initialKeyInParent);\n\n this.pathKeys = computed(() =>\n this.parent ? [...this.parent.structure.pathKeys(), this.keyInParent()] : [],\n );\n }\n\n override getChild(): FieldNode | undefined {\n return undefined;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {computed, Signal} from '@angular/core';\nimport {AbstractControl} from '@angular/forms';\nimport {ValidationError} from '../../src/api/rules';\nimport {calculateValidationSelfStatus, ValidationState} from '../../src/field/validation';\nimport {\n extractNestedReactiveErrors,\n type CompatValidationError,\n} from '../../src/compat/validation_errors';\nimport {getControlStatusSignal} from './compat_field_node';\nimport {CompatFieldNodeOptions} from './compat_structure';\n\n// Readonly signal containing an empty array, used for optimization.\nconst EMPTY_ARRAY_SIGNAL = computed(() => []);\nconst TRUE_SIGNAL = computed(() => true);\n\n/**\n * Compat version of a validation state that wraps a FormControl, and proxies it's validation state.\n */\nexport class CompatValidationState implements ValidationState {\n readonly syncValid: Signal<boolean>;\n /**\n * All validation errors for this field.\n */\n readonly errors: Signal<CompatValidationError[]>;\n readonly pending: Signal<boolean>;\n readonly invalid: Signal<boolean>;\n readonly valid: Signal<boolean>;\n\n readonly parseErrors: Signal<ValidationError.WithFormField[]> = computed(() => []);\n\n constructor(options: CompatFieldNodeOptions) {\n this.syncValid = getControlStatusSignal(options, (c: AbstractControl) => c.status === 'VALID');\n this.errors = getControlStatusSignal(options, extractNestedReactiveErrors);\n this.pending = getControlStatusSignal(options, (c) => c.pending);\n\n this.valid = getControlStatusSignal(options, (c) => {\n return c.valid;\n });\n\n this.invalid = getControlStatusSignal(options, (c) => {\n return c.invalid;\n });\n }\n\n asyncErrors: Signal<(ValidationError.WithFieldTree | 'pending')[]> = EMPTY_ARRAY_SIGNAL;\n errorSummary: Signal<ValidationError.WithFieldTree[]> = EMPTY_ARRAY_SIGNAL;\n\n // Those are irrelevant for compat mode, as it has no children\n rawSyncTreeErrors = EMPTY_ARRAY_SIGNAL;\n syncErrors = EMPTY_ARRAY_SIGNAL;\n rawAsyncErrors = EMPTY_ARRAY_SIGNAL;\n shouldSkipValidation = TRUE_SIGNAL;\n\n /**\n * Computes status based on whether the field is valid/invalid/pending.\n */\n readonly status: Signal<'valid' | 'invalid' | 'unknown'> = computed(() => {\n return calculateValidationSelfStatus(this);\n });\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {computed, Signal, WritableSignal} from '@angular/core';\nimport {AbstractControl} from '@angular/forms';\nimport {BasicFieldAdapter, FieldAdapter} from '../../src/field/field_adapter';\nimport {FormFieldManager} from '../../src/field/manager';\nimport {FieldNode} from '../../src/field/node';\nimport {FieldNodeState} from '../../src/field/state';\nimport {\n ChildFieldNodeOptions,\n FieldNodeOptions,\n FieldNodeStructure,\n} from '../../src/field/structure';\nimport {ValidationState} from '../../src/field/validation';\nimport {FieldPathNode} from '../../src/schema/path_node';\nimport {CompatFieldNode} from './compat_field_node';\nimport {CompatNodeState} from './compat_node_state';\nimport {CompatChildFieldNodeOptions, CompatStructure} from './compat_structure';\nimport {CompatValidationState} from './compat_validation_state';\n\n/**\n * This is a tree-shakable Field adapter that can create a compat node\n * that proxies FormControl state and value to a field.\n */\nexport class CompatFieldAdapter implements FieldAdapter {\n readonly basicAdapter = new BasicFieldAdapter();\n\n /**\n * Creates a regular or compat root node state based on whether the control is present.\n * @param fieldManager\n * @param value\n * @param pathNode\n * @param adapter\n */\n newRoot<TModel>(\n fieldManager: FormFieldManager,\n value: WritableSignal<TModel>,\n pathNode: FieldPathNode,\n adapter: FieldAdapter,\n ): FieldNode {\n if (value() instanceof AbstractControl) {\n return createCompatNode({\n kind: 'root',\n fieldManager,\n value,\n pathNode,\n logic: pathNode.builder.build(),\n fieldAdapter: adapter,\n });\n }\n\n return this.basicAdapter.newRoot<TModel>(fieldManager, value, pathNode, adapter);\n }\n\n /**\n * Creates a regular or compat node state based on whether the control is present.\n * @param node\n * @param options\n */\n createNodeState(node: CompatFieldNode, options: CompatChildFieldNodeOptions): FieldNodeState {\n if (!options.control) {\n return this.basicAdapter.createNodeState(node);\n }\n return new CompatNodeState(node, options);\n }\n\n /**\n * Creates a regular or compat structure based on whether the control is present.\n * @param node\n * @param options\n */\n createStructure(node: CompatFieldNode, options: CompatChildFieldNodeOptions): FieldNodeStructure {\n if (!options.control) {\n return this.basicAdapter.createStructure(node, options);\n }\n return new CompatStructure(node, options);\n }\n\n /**\n * Creates a regular or compat validation state based on whether the control is present.\n * @param node\n * @param options\n */\n createValidationState(\n node: CompatFieldNode,\n options: CompatChildFieldNodeOptions,\n ): ValidationState {\n if (!options.control) {\n return this.basicAdapter.createValidationState(node);\n }\n return new CompatValidationState(options);\n }\n\n /**\n * Creates a regular or compat node based on whether the control is present.\n * @param options\n */\n newChild(options: ChildFieldNodeOptions): FieldNode {\n const value = options.parent.value()[options.initialKeyInParent];\n\n if (value instanceof AbstractControl) {\n return createCompatNode(options);\n }\n\n return new FieldNode(options);\n }\n}\n\n/**\n * Creates a CompatFieldNode from options.\n * @param options\n */\nexport function createCompatNode(options: FieldNodeOptions) {\n const control = (\n options.kind === 'root'\n ? options.value\n : computed(() => {\n return options.parent.value()[options.initialKeyInParent];\n })\n ) as Signal<AbstractControl>;\n\n return new CompatFieldNode({\n ...options,\n control,\n });\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {WritableSignal} from '@angular/core';\nimport {form, FormOptions} from '../../../public_api';\nimport {FieldTree, PathKind, SchemaOrSchemaFn} from '../../../src/api/types';\nimport {normalizeFormArgs} from '../../../src/util/normalize_form_args';\nimport {CompatFieldAdapter} from '../compat_field_adapter';\n\n/**\n * Options that may be specified when creating a compat form.\n *\n * @category interop\n * @experimental 21.0.0\n */\nexport type CompatFormOptions<TModel> = Omit<FormOptions<TModel>, 'adapter'>;\n\n/**\n * Creates a compatibility form wrapped around the given model data.\n *\n * `compatForm` is a version of the `form` function that is designed for backwards\n * compatibility with Reactive forms by accepting Reactive controls as a part of the data.\n *\n * @example\n * ```ts\n * const lastName = new FormControl('lastName');\n *\n * const nameModel = signal({\n * first: '',\n * last: lastName\n * });\n *\n * const nameForm = compatForm(nameModel, (name) => {\n * required(name.first);\n * });\n *\n * nameForm.last().value(); // lastName, not FormControl\n * ```\n * \n * @param model A writable signal that contains the model data for the form. The resulting field\n * structure will match the shape of the model and any changes to the form data will be written to\n * the model.\n\n * @category interop\n * @experimental 21.0.0\n */\nexport function compatForm<TModel>(model: WritableSignal<TModel>): FieldTree<TModel>;\n\n/**\n * Creates a compatibility form wrapped around the given model data.\n *\n * `compatForm` is a version of the `form` function that is designed for backwards\n * compatibility with Reactive forms by accepting Reactive controls as a part of the data.\n *\n * @example\n * ```ts\n * const lastName = new FormControl('lastName');\n *\n * const nameModel = signal({\n * first: '',\n * last: lastName\n * });\n *\n * const nameForm = compatForm(nameModel, (name) => {\n * required(name.first);\n * });\n *\n * nameForm.last().value(); // lastName, not FormControl\n *\n * @param model A writable signal that contains the model data for the form. The resulting field\n * structure will match the shape of the model and any changes to the form data will be written to\n * the model.\n * @param schemaOrOptions The second argument can be either\n * 1. A schema or a function used to specify logic for the form (e.g. validation, disabled fields, etc.).\n * When passing a schema, the form options can be passed as a third argument if needed.\n * 2. The form options (excluding adapter, since it's provided).\n *\n * @category interop\n * @experimental 21.0.0\n */\nexport function compatForm<TModel>(\n model: WritableSignal<TModel>,\n schemaOrOptions: SchemaOrSchemaFn<TModel> | CompatFormOptions<TModel>,\n): FieldTree<TModel>;\n\n/**\n * Creates a compatibility form wrapped around the given model data.\n *\n * `compatForm` is a version of the `form` function that is designed for backwards\n * compatibility with Reactive forms by accepting Reactive controls as a part of the data.\n *\n * @example\n * ```ts\n * const lastName = new FormControl('lastName');\n *\n * const nameModel = signal({\n * first: '',\n * last: lastName\n * });\n *\n * const nameForm = compatForm(nameModel, (name) => {\n * required(name.first);\n * });\n *\n * nameForm.last().value(); // lastName, not FormControl\n *\n * @param model A writable signal that contains the model data for the form. The resulting field\n * structure will match the shape of the model and any changes to the form data will be written to\n * the model.\n * @param schemaOrOptions A schema or a function used to specify logic for the form (e.g. validation, disabled fields, etc.).\n * When passing a schema, the form options can be passed as a third argument if needed.\n * @param options The form options (excluding adapter, since it's provided).\n *\n * @category interop\n * @experimental 21.0.0\n */\nexport function compatForm<TModel>(\n model: WritableSignal<TModel>,\n schema: SchemaOrSchemaFn<TModel>,\n options: CompatFormOptions<TModel>,\n): FieldTree<TModel>;\n\nexport function compatForm<TModel>(...args: any[]): FieldTree<TModel> {\n const [model, maybeSchema, maybeOptions] = normalizeFormArgs<TModel>(args);\n\n const options = {...maybeOptions, adapter: new CompatFieldAdapter()};\n const schema = maybeSchema || ((() => {}) as SchemaOrSchemaFn<TModel, PathKind>);\n return form(model, schema, options) as FieldTree<TModel>;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport type {SignalFormsConfig} from '../../../src/api/di';\n\n/**\n * A value that can be used for `SignalFormsConfig.classes` to automatically add\n * the `ng-*` status classes from reactive forms.\n *\n * @experimental 21.0.1\n */\nexport const NG_STATUS_CLASSES: SignalFormsConfig['classes'] = {\n 'ng-touched': ({state}) => state().touched(),\n 'ng-untouched': ({state}) => !state().touched(),\n 'ng-dirty': ({state}) => state().dirty(),\n 'ng-pristine': ({state}) => !state().dirty(),\n 'ng-valid': ({state}) => state().valid(),\n 'ng-invalid': ({state}) => state().invalid(),\n 'ng-pending': ({state}) => state().pending(),\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n effect,\n EventEmitter,\n inject,\n Injector,\n ɵRuntimeError as RuntimeError,\n signal,\n untracked,\n WritableSignal,\n} from '@angular/core';\nimport {\n AbstractControl,\n ControlEvent,\n FormArray,\n FormControlState,\n FormControlStatus,\n FormGroup,\n FormResetEvent,\n PristineChangeEvent,\n StatusChangeEvent,\n TouchedChangeEvent,\n ValueChangeEvent,\n} from '@angular/forms';\n\nimport {FormOptions} from '../../../src/api/structure';\nimport {FieldState, FieldTree, SchemaFn} from '../../../src/api/types';\nimport {signalErrorsToValidationErrors} from '../../../src/compat/validation_errors';\nimport {RuntimeErrorCode} from '../../../src/errors';\nimport {FieldNode} from '../../../src/field/node';\nimport {normalizeFormArgs} from '../../../src/util/normalize_form_args';\nimport {compatForm} from '../api/compat_form';\n\n/** Options used to update the control value. */\nexport type ValueUpdateOptions = {\n onlySelf?: boolean;\n emitEvent?: boolean;\n emitModelToViewChange?: boolean;\n emitViewToModelChange?: boolean;\n};\n\n/**\n * A `FormControl` that is backed by signal forms rules.\n *\n * This class provides a bridge between Signal Forms and Reactive Forms, allowing\n * signal-based controls to be used within a standard `FormGroup` or `FormArray`.\n *\n * A control could be created using signal forms, and integrated with an existing FormGroup\n * propagating all the statuses and validity.\n *\n * @usageNotes\n *\n * ### Basic usage\n *\n * ```angular-ts\n * const form = new FormGroup({\n * // You can create SignalFormControl with signal form rules, and add it to a FormGroup.\n * name: new SignalFormControl('Alice', p => {\n * required(p);\n * }),\n * age: new FormControl(25),\n * });\n * ```\n * In the template you can get the underlying `fieldTree` and bind it:\n *\n * ```angular-html\n * <form [formGroup]=\"form\">\n * <input [formField]=\"nameControl.fieldTree\" />\n * <input formControlName=\"age\" />\n * </form>\n * ```\n *\n * @experimental\n */\nexport class SignalFormControl<T> extends AbstractControl {\n /** Source FieldTree. */\n public readonly fieldTree: FieldTree<T>;\n /** The raw signal driving the control value. */\n public readonly sourceValue: WritableSignal<T>;\n\n private readonly fieldState: FieldState<T>;\n private readonly initialValue: T;\n private pendingParentNotifications = 0;\n private readonly onChangeCallbacks: Array<(value?: any, emitModelEvent?: boolean) => void> = [];\n private readonly onDisabledChangeCallbacks: Array<(isDisabled: boolean) => void> = [];\n override readonly valueChanges = new EventEmitter<T>();\n override readonly statusChanges = new EventEmitter<FormControlStatus>();\n\n constructor(value: T, schemaOrOptions?: SchemaFn<T> | FormOptions<T>, options?: FormOptions<T>) {\n super(null, null);\n\n const [model, schema, opts] = normalizeFormArgs<T>([signal(value), schemaOrOptions, options]);\n this.sourceValue = model;\n this.initialValue = value;\n const injector = opts?.injector ?? inject(Injector);\n\n const rawTree = schema\n ? compatForm(this.sourceValue, schema, {injector})\n : compatForm(this.sourceValue, {injector});\n\n this.fieldTree = wrapFieldTreeForSyncUpdates(rawTree, () =>\n this.parent?.updateValueAndValidity({sourceControl: this} as any),\n );\n this.fieldState = this.fieldTree() as FieldState<T>;\n\n this.defineCompatProperties();\n\n // Value changes effect\n effect(\n () => {\n const value = this.sourceValue();\n untracked(() => {\n this.notifyParentUnlessPending();\n this.valueChanges.emit(value);\n this.emitControlEvent(new ValueChangeEvent(value, this));\n });\n },\n {injector},\n );\n\n // Status changes effect\n effect(\n () => {\n const status = this.status;\n untracked(() => {\n this.statusChanges.emit(status);\n });\n this.emitControlEvent(new StatusChangeEvent(status, this));\n },\n {injector},\n );\n\n // Disabled changes effect\n effect(\n () => {\n const isDisabled = this.disabled;\n untracked(() => {\n for (const fn of this.onDisabledChangeCallbacks) {\n fn(isDisabled);\n }\n });\n },\n {injector},\n );\n\n // Touched changes effect\n effect(\n () => {\n const isTouched = this.fieldState.touched();\n this.emitControlEvent(new TouchedChangeEvent(isTouched, this));\n const parent = this.parent;\n if (!parent) {\n return;\n }\n if (!isTouched) {\n parent.markAsUntouched();\n } else {\n parent.markAsTouched();\n }\n },\n {injector},\n );\n\n // Dirty changes effect\n effect(\n () => {\n const isDirty = this.fieldState.dirty();\n this.emitControlEvent(new PristineChangeEvent(!isDirty, this));\n const parent = this.parent;\n if (!parent) {\n return;\n }\n if (isDirty) {\n parent.markAsDirty();\n } else {\n parent.markAsPristine();\n }\n },\n {injector},\n );\n }\n\n /**\n * Defines properties using closure-safe names to prevent issues with property renaming optimizations.\n *\n * AbstractControl have `value` and `errors` as readonly prop, which doesn't allow getters.\n **/\n private defineCompatProperties(): void {\n const valueProp = getClosureSafeProperty({value: getClosureSafeProperty});\n Object.defineProperty(this, valueProp, {\n get: () => this.sourceValue(),\n });\n const errorsProp = getClosureSafeProperty({errors: getClosureSafeProperty});\n Object.defineProperty(this, errorsProp, {\n get: () => signalErrorsToValidationErrors(this.fieldState.errors()),\n });\n }\n\n private emitControlEvent(event: ControlEvent): void {\n untracked(() => {\n (this as any)._events.next(event);\n });\n }\n\n override setValue(value: any, options?: ValueUpdateOptions): void {\n this.updateValue(value, options);\n }\n\n override patchValue(value: any, options?: ValueUpdateOptions): void {\n this.updateValue(value, options);\n }\n\n private updateValue(value: any, options?: ValueUpdateOptions): void {\n const parent = this.scheduleParentUpdate(options);\n this.sourceValue.set(value);\n if (parent) {\n this.updateParentValueAndValidity(parent, options?.emitEvent);\n }\n if (options?.emitModelToViewChange !== false) {\n for (const fn of this.onChangeCallbacks) {\n fn(value, true);\n }\n }\n }\n\n registerOnChange(fn: (value?: any, emitModelEvent?: boolean) => void): void {\n this.onChangeCallbacks.push(fn);\n }\n\n /** @internal */\n _unregisterOnChange(fn: (value?: any, emitModelEvent?: boolean) => void): void {\n removeListItem(this.onChangeCallbacks, fn);\n }\n\n registerOnDisabledChange(fn: (isDisabled: boolean) => void): void {\n this.onDisabledChangeCallbacks.push(fn);\n }\n\n /** @internal */\n _unregisterOnDisabledChange(fn: (isDisabled: boolean) => void): void {\n removeListItem(this.onDisabledChangeCallbacks, fn);\n }\n\n override getRawValue(): T {\n return this.value;\n }\n\n override reset(value?: T | FormControlState<T>, options?: ValueUpdateOptions): void {\n if (isFormControlState(value)) {\n throw unsupportedDisableEnableError();\n }\n\n const resetValue = value ?? this.initialValue;\n this.fieldState.reset(resetValue);\n\n if (value !== undefined) {\n this.updateValue(value, options);\n } else if (!options?.onlySelf) {\n const parent = this.parent;\n if (parent) {\n this.updateParentValueAndValidity(parent, options?.emitEvent);\n }\n }\n\n if (options?.emitEvent !== false) {\n this.emitControlEvent(new FormResetEvent(this));\n }\n }\n\n private scheduleParentUpdate(options?: ValueUpdateOptions): FormGroup | FormArray | null {\n const parent = options?.onlySelf ? null : this.parent;\n if (options?.onlySelf || parent) {\n this.pendingParentNotifications++;\n }\n return parent;\n }\n\n private notifyParentUnlessPending(): void {\n if (this.pendingParentNotifications > 0) {\n this.pendingParentNotifications--;\n return;\n }\n const parent = this.parent;\n if (parent) {\n this.updateParentValueAndValidity(parent);\n }\n }\n\n private updateParentValueAndValidity(parent: AbstractControl, emitEvent?: boolean): void {\n parent.updateValueAndValidity({emitEvent, sourceControl: this} as any);\n }\n\n private propagateToParent(\n opts: {onlySelf?: boolean} | undefined,\n fn: (parent: AbstractControl) => void,\n ) {\n const parent = this.parent;\n if (parent && !opts?.onlySelf) {\n fn(parent);\n }\n }\n\n override get status(): FormControlStatus {\n if (this.fieldState.disabled()) {\n return 'DISABLED';\n }\n if (this.fieldState.valid()) {\n return 'VALID';\n }\n if (this.fieldState.invalid()) {\n return 'INVALID';\n }\n return 'PENDING';\n }\n\n override get valid(): boolean {\n return this.fieldState.valid();\n }\n\n override get invalid(): boolean {\n return this.fieldState.invalid();\n }\n\n override get pending(): boolean {\n return this.fieldState.pending();\n }\n\n override get disabled(): boolean {\n return this.fieldState.disabled();\n }\n\n override get enabled(): boolean {\n return !this.disabled;\n }\n\n override get dirty(): boolean {\n return this.fieldState.dirty();\n }\n\n override set dirty(_: boolean) {\n throw unsupportedFeatureError(\n ngDevMode && 'Setting dirty directly is not supported. Instead use markAsDirty().',\n );\n }\n\n override get pristine(): boolean {\n return !this.dirty;\n }\n\n override set pristine(_: boolean) {\n throw unsupportedFeatureError(\n ngDevMode && 'Setting pristine directly is not supported. Instead use reset().',\n );\n }\n\n override get touched(): boolean {\n return this.fieldState.touched();\n }\n\n override set touched(_: boolean) {\n throw unsupportedFeatureError(\n ngDevMode &&\n 'Setting touched directly is not supported. Instead use markAsTouched() or reset().',\n );\n }\n\n override get untouched(): boolean {\n return !this.touched;\n }\n\n override set untouched(_: boolean) {\n throw unsupportedFeatureError(\n ngDevMode && 'Setting untouched directly is not supported. Instead use reset().',\n );\n }\n\n override markAsTouched(opts?: {onlySelf?: boolean}): void {\n this.fieldState.markAsTouched();\n this.propagateToParent(opts, (parent) => parent.markAsTouched(opts));\n }\n\n override markAsDirty(opts?: {onlySelf?: boolean}): void {\n this.fieldState.markAsDirty();\n this.propagateToParent(opts, (parent) => parent.markAsDirty(opts));\n }\n\n override markAsPristine(opts?: {onlySelf?: boolean}): void {\n (this.fieldState as FieldNode).markAsPristine();\n this.propagateToParent(opts, (parent) => parent.markAsPristine(opts));\n }\n\n override markAsUntouched(opts?: {onlySelf?: boolean}): void {\n (this.fieldState as FieldNode).markAsUntouched();\n this.propagateToParent(opts, (parent) => parent.markAsUntouched(opts));\n }\n\n override updateValueAndValidity(_opts?: Object): void {}\n\n /** @internal */\n // @ts-ignore\n override _updateValue(): void {}\n\n /** @internal */\n // @ts-ignore\n override _forEachChild(_cb: (c: AbstractControl) => void): void {}\n\n /** @internal */\n // @ts-ignore\n override _anyControls(_condition: (c: AbstractControl) => boolean): boolean {\n return false;\n }\n\n /** @internal */\n // @ts-ignore\n override _allControlsDisabled(): boolean {\n return this.disabled;\n }\n\n /** @internal */\n // @ts-ignore\n override _syncPendingControls(): boolean {\n return false;\n }\n\n override disable(_opts?: {onlySelf?: boolean; emitEvent?: boolean}): void {\n throw unsupportedDisableEnableError();\n }\n\n override enable(_opts?: {onlySelf?: boolean; emitEvent?: boolean}): void {\n throw unsupportedDisableEnableError();\n }\n\n override setValidators(_validators: any): void {\n throw unsupportedValidatorsError();\n }\n\n override setAsyncValidators(_validators: any): void {\n throw unsupportedValidatorsError();\n }\n\n override addValidators(_validators: any): void {\n throw unsupportedValidatorsError();\n }\n\n override addAsyncValidators(_validators: any): void {\n throw unsupportedValidatorsError();\n }\n\n override removeValidators(_validators: any): void {\n throw unsupportedValidatorsError();\n }\n\n override removeAsyncValidators(_validators: any): void {\n throw unsupportedValidatorsError();\n }\n\n override clearValidators(): void {\n throw unsupportedValidatorsError();\n }\n\n override clearAsyncValidators(): void {\n throw unsupportedValidatorsError();\n }\n\n override setErrors(_errors: any, _opts?: {emitEvent?: boolean}): void {\n throw unsupportedFeatureError(\n ngDevMode &&\n 'Imperatively setting errors is not supported in signal forms. Errors are derived from validation rules.',\n );\n }\n\n override markAsPending(_opts?: {onlySelf?: boolean; emitEvent?: boolean}): void {\n throw unsupportedFeatureError(\n ngDevMode &&\n 'Imperatively marking as pending is not supported in signal forms. Pending state is derived from async validation status.',\n );\n }\n}\n\nclass CachingWeakMap<K extends object, V> {\n private readonly map = new WeakMap<K, V>();\n\n getOrCreate(key: K, create: () => V): V {\n const cached = this.map.get(key);\n if (cached) {\n return cached;\n }\n const value = create();\n this.map.set(key, value);\n return value;\n }\n}\n\n/**\n * A FieldTree proxy that patches setters to immediately react on value changes.\n * @param tree\n * @param onUpdate\n */\nfunction wrapFieldTreeForSyncUpdates<T>(tree: FieldTree<T>, onUpdate: () => void): FieldTree<T> {\n const treeCache = new CachingWeakMap<FieldTree<unknown>, FieldTree<unknown>>();\n const stateCache = new CachingWeakMap<FieldState<unknown>, FieldState<unknown>>();\n\n // Takes a FieldState and wraps a value to instantly call onUpdate.\n const wrapState = (state: FieldState<unknown>): FieldState<unknown> => {\n const {value} = state;\n const wrappedValue = Object.assign((...a: unknown[]) => (value as Function)(...a), {\n set: (v: unknown) => {\n value.set(v);\n onUpdate();\n },\n update: (fn: (v: unknown) => unknown) => {\n value.update(fn);\n onUpdate();\n },\n }) as WritableSignal<unknown>;\n return Object.create(state, {value: {get: () => wrappedValue}});\n };\n // Takes a FieldTree and wraps it's state's value to instantly call onUpdate.\n const wrapTree = (t: FieldTree<unknown>): FieldTree<unknown> => {\n return treeCache.getOrCreate(t, () => {\n return new Proxy(t, {\n // When getting a prop, wrap FieldTree if it's a function\n get(target, prop, receiver) {\n const val = Reflect.get(target, prop, receiver);\n // Some of FieldTree children are not function, e.g. length.\n if (typeof val === 'function' && typeof prop === 'string') {\n return wrapTree(val);\n }\n return val;\n },\n // When calling the tree, wrap the returned state\n apply(target, _, args) {\n const state: FieldState<unknown> = (target as Function)(...args);\n return stateCache.getOrCreate(state, () => wrapState(state));\n },\n }) as FieldTree<unknown>;\n });\n };\n\n return wrapTree(tree) as FieldTree<T>;\n}\n\nfunction isFormControlState(formState: unknown): formState is FormControlState<unknown> {\n return (\n typeof formState === 'object' &&\n formState !== null &&\n Object.keys(formState).length === 2 &&\n 'value' in formState &&\n 'disabled' in formState\n );\n}\n\nfunction unsupportedFeatureError(message: string | null): Error {\n return new RuntimeError(RuntimeErrorCode.UNSUPPORTED_FEATURE, message ?? false);\n}\n\nfunction unsupportedDisableEnableError(): Error {\n return unsupportedFeatureError(\n ngDevMode &&\n 'Imperatively changing enabled/disabled status in form control is not supported in signal forms. Instead use a \"disabled\" rule to derive the disabled status from a signal.',\n );\n}\n\nfunction unsupportedValidatorsError(): Error {\n return unsupportedFeatureError(\n ngDevMode &&\n 'Dynamically adding and removing validators is not supported in signal forms. Instead use the \"applyWhen\" rule to conditionally apply validators based on a signal.',\n );\n}\n\nfunction removeListItem<T>(list: T[], el: T): void {\n const index = list.indexOf(el);\n if (index > -1) list.splice(index, 1);\n}\n\nfunction getClosureSafeProperty<T>(objWithPropertyToExtract: T): string {\n for (let key in objWithPropertyToExtract) {\n if (objWithPropertyToExtract[key] === (getClosureSafeProperty as any)) {\n return key;\n }\n }\n throw Error(\n typeof ngDevMode === 'undefined' || ngDevMode\n ? 'Could not find renamed property on target object.'\n : '',\n );\n}\n"],"names":["CompatFieldNode","FieldNode","options","control","constructor","makeCreateDestroySubject","destroy$","ReplaySubject","next","complete","extractControlPropToSignal","makeSignal","injector","getInjectorFromOptions","createDestroySubject","signalOfControlSignal","linkedSignal","ngDevMode","debugName","source","computation","untracked","runInInjectionContext","computed","getControlStatusSignal","getValue","c","toSignal","statusChanges","pipe","map","takeUntil","initialValue","getControlEventsSignal","events","CompatNodeState","FieldNodeState","compatNode","touched","dirty","disabled","controlDisabled","disabledReasons","length","markAsDirty","markAsTouched","markAsPristine","markAsUntouched","getParentFromOptions","kind","undefined","parent","getFieldManagerFromOptions","fieldManager","structure","root","getControlValueSignal","value","valueChanges","getRawValue","set","setValue","update","fn","CompatStructure","FieldNodeStructure","keyInParent","pathKeys","children","signal","childrenMap","node","logic","RuntimeError","identityInParent","initialKeyInParent","createKeyInParent","getChild","EMPTY_ARRAY_SIGNAL","TRUE_SIGNAL","CompatValidationState","syncValid","errors","pending","invalid","valid","parseErrors","status","extractNestedReactiveErrors","asyncErrors","errorSummary","rawSyncTreeErrors","syncErrors","rawAsyncErrors","shouldSkipValidation","calculateValidationSelfStatus","CompatFieldAdapter","basicAdapter","BasicFieldAdapter","newRoot","pathNode","adapter","AbstractControl","createCompatNode","builder","build","fieldAdapter","createNodeState","createStructure","createValidationState","newChild","compatForm","args","model","maybeSchema","maybeOptions","normalizeFormArgs","schema","form","NG_STATUS_CLASSES","ng-touched","state","ng-untouched","ng-dirty","ng-pristine","ng-valid","ng-invalid","ng-pending","SignalFormControl","fieldTree","sourceValue","fieldState","pendingParentNotifications","onChangeCallbacks","onDisabledChangeCallbacks","EventEmitter","schemaOrOptions","opts","inject","Injector","rawTree","wrapFieldTreeForSyncUpdates","updateValueAndValidity","sourceControl","defineCompatProperties","effect","notifyParentUnlessPending","emit","emitControlEvent","ValueChangeEvent","StatusChangeEvent","isDisabled","isTouched","TouchedChangeEvent","isDirty","PristineChangeEvent","valueProp","getClosureSafeProperty","Object","defineProperty","get","errorsProp","signalErrorsToValidationErrors","event","_events","updateValue","patchValue","scheduleParentUpdate","updateParentValueAndValidity","emitEvent","emitModelToViewChange","registerOnChange","push","_unregisterOnChange","removeListItem","registerOnDisabledChange","_unregisterOnDisabledChange","reset","isFormControlState","unsupportedDisableEnableError","resetValue","onlySelf","FormResetEvent","propagateToParent","enabled","_","unsupportedFeatureError","pristine","untouched","_opts","_updateValue","_forEachChild","_cb","_anyControls","_condition","_allControlsDisabled","_syncPendingControls","disable","enable","setValidators","_validators","unsupportedValidatorsError","setAsyncValidators","addValidators","addAsyncValidators","removeValidators","removeAsyncValidators","clearValidators","clearAsyncValidators","setErrors","_errors","markAsPending","CachingWeakMap","WeakMap","getOrCreate","key","create","cached","tree","onUpdate","treeCache","stateCache","wrapState","wrappedValue","assign","a","v","wrapTree","t","Proxy","target","prop","receiver","val","Reflect","apply","formState","keys","message","list","el","index","indexOf","splice","objWithPropertyToExtract","Error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"signals-compat.mjs","sources":["../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/forms/signals/compat/src/compat_field_node.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/forms/signals/compat/src/compat_node_state.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/forms/signals/compat/src/compat_structure.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/forms/signals/compat/src/compat_validation_state.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/forms/signals/compat/src/compat_field_adapter.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/forms/signals/compat/src/api/compat_form.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/forms/signals/compat/src/api/di.ts","../../../../../k8-fastbuild-ST-fdfa778d11ba/bin/packages/forms/signals/compat/src/signal_form_control/signal_form_control.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {computed, linkedSignal, runInInjectionContext, Signal, untracked} from '@angular/core';\nimport {toSignal} from '@angular/core/rxjs-interop';\nimport {AbstractControl} from '@angular/forms';\nimport {Observable, ReplaySubject} from 'rxjs';\nimport {map, takeUntil} from 'rxjs/operators';\nimport {FieldNode} from '../../src/field/node';\nimport {getInjectorFromOptions} from '../../src/field/util';\nimport type {CompatFieldNodeOptions} from './compat_structure';\n\n/**\n * Field node with additional control property.\n *\n * Compat node has no children.\n */\nexport class CompatFieldNode extends FieldNode {\n readonly control: Signal<AbstractControl>;\n\n constructor(public readonly options: CompatFieldNodeOptions) {\n super(options);\n this.control = this.options.control;\n }\n}\n\n/**\n * Makes a function which creates a new subject (and unsubscribes/destroys the previous one).\n *\n * This allows us to automatically unsubscribe from status changes of the previous FormControl when we go to subscribe to a new one\n */\nfunction makeCreateDestroySubject() {\n let destroy$ = new ReplaySubject<void>(1);\n return () => {\n destroy$.next();\n destroy$.complete();\n\n return (destroy$ = new ReplaySubject<void>(1));\n };\n}\n\n/**\n * Helper function taking options, and a callback which takes options, and a function\n * converting reactive control to appropriate property using toSignal from rxjs compat.\n *\n * This helper keeps all complexity in one place by doing the following things:\n * - Running the callback in injection context\n * - Not tracking the callback, as it creates a new signal.\n * - Reacting to control changes, allowing to swap control dynamically.\n *\n * @param options\n * @param makeSignal\n */\nexport function extractControlPropToSignal<T, R = T>(\n options: CompatFieldNodeOptions,\n makeSignal: (c: AbstractControl<unknown, T>, destroy$: Observable<void>) => Signal<R>,\n): Signal<R> {\n const injector = getInjectorFromOptions(options);\n\n // Creates a subject that could be used in takeUntil.\n const createDestroySubject = makeCreateDestroySubject();\n\n const signalOfControlSignal = linkedSignal({\n source: options.control,\n computation: (control) => {\n return untracked(() => {\n return runInInjectionContext(injector, () => makeSignal(control, createDestroySubject()));\n });\n },\n });\n\n // We have to have computed, because we need to react to both:\n // linked signal changes as well as the inner signal changes.\n return computed(() => signalOfControlSignal()());\n}\n\n/**\n * A helper function, simplifying getting reactive control properties after status changes.\n *\n * Used to extract errors and statuses such as valid, pending.\n *\n * @param options\n * @param getValue\n */\nexport const getControlStatusSignal = <T>(\n options: CompatFieldNodeOptions,\n getValue: (c: AbstractControl<unknown>) => T,\n) => {\n return extractControlPropToSignal<unknown, T>(options, (c, destroy$) =>\n toSignal(\n c.statusChanges.pipe(\n map(() => getValue(c)),\n takeUntil(destroy$),\n ),\n {\n initialValue: getValue(c),\n },\n ),\n );\n};\n\n/**\n * A helper function, simplifying converting convert events to signals.\n *\n * Used to get dirty and touched signals from control.\n *\n * @param options\n * @param getValue A function which takes control and returns required value.\n */\nexport const getControlEventsSignal = <T>(\n options: CompatFieldNodeOptions,\n getValue: (c: AbstractControl) => T,\n) => {\n return extractControlPropToSignal<unknown, T>(options, (c, destroy$) =>\n toSignal(\n c.events.pipe(\n map(() => {\n return getValue(c);\n }),\n takeUntil(destroy$),\n ),\n {\n initialValue: getValue(c),\n },\n ),\n );\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {computed, Signal} from '@angular/core';\nimport {AbstractControl} from '@angular/forms';\nimport {FieldNodeState} from '../../src/field/state';\nimport {CompatFieldNode, getControlEventsSignal, getControlStatusSignal} from './compat_field_node';\nimport {CompatFieldNodeOptions} from './compat_structure';\n\n/**\n * A FieldNodeState class wrapping a FormControl and proxying it's state.\n */\nexport class CompatNodeState extends FieldNodeState {\n override readonly touched: Signal<boolean>;\n override readonly dirty: Signal<boolean>;\n override readonly disabled: Signal<boolean>;\n private readonly control: Signal<AbstractControl>;\n\n constructor(\n readonly compatNode: CompatFieldNode,\n options: CompatFieldNodeOptions,\n ) {\n super(compatNode);\n this.control = options.control;\n this.touched = getControlEventsSignal(options, (c) => c.touched);\n this.dirty = getControlEventsSignal(options, (c) => c.dirty);\n const controlDisabled = getControlStatusSignal(options, (c) => c.disabled);\n\n this.disabled = computed(() => {\n return controlDisabled() || this.disabledReasons().length > 0;\n });\n }\n\n override markAsDirty() {\n this.control().markAsDirty();\n }\n\n override markAsTouched() {\n this.control().markAsTouched();\n }\n\n override markAsPristine() {\n this.control().markAsPristine();\n }\n\n override markAsUntouched() {\n this.control().markAsUntouched();\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n computed,\n Signal,\n signal,\n WritableSignal,\n ɵRuntimeError as RuntimeError,\n} from '@angular/core';\nimport {RuntimeErrorCode} from '../../src/errors';\nimport {FormFieldManager} from '../../src/field/manager';\nimport {FieldNode, ParentFieldNode} from '../../src/field/node';\nimport {\n ChildFieldNodeOptions,\n FieldNodeOptions,\n FieldNodeStructure,\n RootFieldNodeOptions,\n} from '../../src/field/structure';\n\nimport {toSignal} from '@angular/core/rxjs-interop';\nimport {AbstractControl} from '@angular/forms';\nimport {map, takeUntil} from 'rxjs/operators';\nimport {extractControlPropToSignal} from './compat_field_node';\n\n/**\n * Child Field Node options also exposing control property.\n */\nexport interface CompatChildFieldNodeOptions extends ChildFieldNodeOptions {\n control: Signal<AbstractControl>;\n}\n\n/**\n * Root Field Node options also exposing control property.\n */\nexport interface CompatRootFieldNodeOptions extends RootFieldNodeOptions {\n control: Signal<AbstractControl>;\n}\n\n/**\n * Field Node options also exposing control property.\n */\nexport type CompatFieldNodeOptions = CompatRootFieldNodeOptions | CompatChildFieldNodeOptions;\n\n/**\n * A helper function allowing to get parent if it exists.\n */\nfunction getParentFromOptions(options: FieldNodeOptions) {\n if (options.kind === 'root') {\n return undefined;\n }\n\n return options.parent;\n}\n\n/**\n * A helper function allowing to get fieldManager regardless of the option type.\n */\nfunction getFieldManagerFromOptions(options: FieldNodeOptions) {\n if (options.kind === 'root') {\n return options.fieldManager;\n }\n\n return options.parent.structure.root.structure.fieldManager;\n}\n\n/**\n * A helper function that takes CompatFieldNodeOptions, and produce a writable signal synced to the\n * value of contained AbstractControl.\n *\n * This uses toSignal, which requires an injector.\n *\n * @param options\n */\nfunction getControlValueSignal<T>(options: CompatFieldNodeOptions) {\n const value = extractControlPropToSignal<T>(options, (control, destroy$) => {\n return toSignal(\n control.valueChanges.pipe(\n map(() => control.getRawValue()),\n takeUntil(destroy$),\n ),\n {\n initialValue: control.getRawValue(),\n },\n );\n }) as WritableSignal<T>;\n\n value.set = (value: T) => {\n options.control().setValue(value);\n };\n\n value.update = (fn: (current: T) => T) => {\n value.set(fn(value()));\n };\n\n return value;\n}\n\n/**\n * Compat version of FieldNodeStructure,\n * - It has no children\n * - It wraps FormControl and proxies its value.\n */\nexport class CompatStructure extends FieldNodeStructure {\n override value: WritableSignal<unknown>;\n override keyInParent: Signal<string>;\n override root: FieldNode;\n override pathKeys: Signal<readonly string[]>;\n override readonly children = signal([]);\n override readonly childrenMap = computed(() => undefined);\n override readonly parent: ParentFieldNode | undefined;\n override readonly fieldManager: FormFieldManager;\n\n constructor(node: FieldNode, options: CompatFieldNodeOptions) {\n super(options.logic, node, () => {\n throw new RuntimeError(\n RuntimeErrorCode.COMPAT_NO_CHILDREN,\n ngDevMode && `Compat nodes don't have children.`,\n );\n });\n this.value = getControlValueSignal(options);\n this.parent = getParentFromOptions(options);\n this.root = this.parent?.structure.root ?? node;\n this.fieldManager = getFieldManagerFromOptions(options);\n\n const identityInParent = options.kind === 'child' ? options.identityInParent : undefined;\n const initialKeyInParent = options.kind === 'child' ? options.initialKeyInParent : undefined;\n this.keyInParent = this.createKeyInParent(options, identityInParent, initialKeyInParent);\n\n this.pathKeys = computed(() =>\n this.parent ? [...this.parent.structure.pathKeys(), this.keyInParent()] : [],\n );\n }\n\n override getChild(): FieldNode | undefined {\n return undefined;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {computed, Signal} from '@angular/core';\nimport {AbstractControl} from '@angular/forms';\nimport {ValidationError} from '../../src/api/rules';\nimport {calculateValidationSelfStatus, ValidationState} from '../../src/field/validation';\nimport {\n extractNestedReactiveErrors,\n type CompatValidationError,\n} from '../../src/compat/validation_errors';\nimport {getControlStatusSignal} from './compat_field_node';\nimport {CompatFieldNodeOptions} from './compat_structure';\n\n// Readonly signal containing an empty array, used for optimization.\nconst EMPTY_ARRAY_SIGNAL = computed(() => []);\nconst TRUE_SIGNAL = computed(() => true);\n\n/**\n * Compat version of a validation state that wraps a FormControl, and proxies it's validation state.\n */\nexport class CompatValidationState implements ValidationState {\n readonly syncValid: Signal<boolean>;\n /**\n * All validation errors for this field.\n */\n readonly errors: Signal<CompatValidationError[]>;\n readonly pending: Signal<boolean>;\n readonly invalid: Signal<boolean>;\n readonly valid: Signal<boolean>;\n\n readonly parseErrors: Signal<ValidationError.WithFormField[]> = computed(() => []);\n\n constructor(options: CompatFieldNodeOptions) {\n this.syncValid = getControlStatusSignal(options, (c: AbstractControl) => c.status === 'VALID');\n this.errors = getControlStatusSignal(options, extractNestedReactiveErrors);\n this.pending = getControlStatusSignal(options, (c) => c.pending);\n\n this.valid = getControlStatusSignal(options, (c) => {\n return c.valid;\n });\n\n this.invalid = getControlStatusSignal(options, (c) => {\n return c.invalid;\n });\n }\n\n asyncErrors: Signal<(ValidationError.WithFieldTree | 'pending')[]> = EMPTY_ARRAY_SIGNAL;\n errorSummary: Signal<ValidationError.WithFieldTree[]> = EMPTY_ARRAY_SIGNAL;\n\n // Those are irrelevant for compat mode, as it has no children\n rawSyncTreeErrors = EMPTY_ARRAY_SIGNAL;\n syncErrors = EMPTY_ARRAY_SIGNAL;\n rawAsyncErrors = EMPTY_ARRAY_SIGNAL;\n shouldSkipValidation = TRUE_SIGNAL;\n\n /**\n * Computes status based on whether the field is valid/invalid/pending.\n */\n readonly status: Signal<'valid' | 'invalid' | 'unknown'> = computed(() => {\n return calculateValidationSelfStatus(this);\n });\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {computed, Signal, WritableSignal} from '@angular/core';\nimport {AbstractControl} from '@angular/forms';\nimport {BasicFieldAdapter, FieldAdapter} from '../../src/field/field_adapter';\nimport {FormFieldManager} from '../../src/field/manager';\nimport {FieldNode} from '../../src/field/node';\nimport {FieldNodeState} from '../../src/field/state';\nimport {\n ChildFieldNodeOptions,\n FieldNodeOptions,\n FieldNodeStructure,\n} from '../../src/field/structure';\nimport {ValidationState} from '../../src/field/validation';\nimport {FieldPathNode} from '../../src/schema/path_node';\nimport {CompatFieldNode} from './compat_field_node';\nimport {CompatNodeState} from './compat_node_state';\nimport {CompatChildFieldNodeOptions, CompatStructure} from './compat_structure';\nimport {CompatValidationState} from './compat_validation_state';\n\n/**\n * This is a tree-shakable Field adapter that can create a compat node\n * that proxies FormControl state and value to a field.\n */\nexport class CompatFieldAdapter implements FieldAdapter {\n readonly basicAdapter = new BasicFieldAdapter();\n\n /**\n * Creates a regular or compat root node state based on whether the control is present.\n * @param fieldManager\n * @param value\n * @param pathNode\n * @param adapter\n */\n newRoot<TModel>(\n fieldManager: FormFieldManager,\n value: WritableSignal<TModel>,\n pathNode: FieldPathNode,\n adapter: FieldAdapter,\n ): FieldNode {\n if (value() instanceof AbstractControl) {\n return createCompatNode({\n kind: 'root',\n fieldManager,\n value,\n pathNode,\n logic: pathNode.builder.build(),\n fieldAdapter: adapter,\n });\n }\n\n return this.basicAdapter.newRoot<TModel>(fieldManager, value, pathNode, adapter);\n }\n\n /**\n * Creates a regular or compat node state based on whether the control is present.\n * @param node\n * @param options\n */\n createNodeState(node: CompatFieldNode, options: CompatChildFieldNodeOptions): FieldNodeState {\n if (!options.control) {\n return this.basicAdapter.createNodeState(node);\n }\n return new CompatNodeState(node, options);\n }\n\n /**\n * Creates a regular or compat structure based on whether the control is present.\n * @param node\n * @param options\n */\n createStructure(node: CompatFieldNode, options: CompatChildFieldNodeOptions): FieldNodeStructure {\n if (!options.control) {\n return this.basicAdapter.createStructure(node, options);\n }\n return new CompatStructure(node, options);\n }\n\n /**\n * Creates a regular or compat validation state based on whether the control is present.\n * @param node\n * @param options\n */\n createValidationState(\n node: CompatFieldNode,\n options: CompatChildFieldNodeOptions,\n ): ValidationState {\n if (!options.control) {\n return this.basicAdapter.createValidationState(node);\n }\n return new CompatValidationState(options);\n }\n\n /**\n * Creates a regular or compat node based on whether the control is present.\n * @param options\n */\n newChild(options: ChildFieldNodeOptions): FieldNode {\n const value = options.parent.value()[options.initialKeyInParent];\n\n if (value instanceof AbstractControl) {\n return createCompatNode(options);\n }\n\n return new FieldNode(options);\n }\n}\n\n/**\n * Creates a CompatFieldNode from options.\n * @param options\n */\nexport function createCompatNode(options: FieldNodeOptions) {\n const control = (\n options.kind === 'root'\n ? options.value\n : computed(() => {\n return options.parent.value()[options.initialKeyInParent];\n })\n ) as Signal<AbstractControl>;\n\n return new CompatFieldNode({\n ...options,\n control,\n });\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {WritableSignal} from '@angular/core';\nimport {form, FormOptions} from '../../../public_api';\nimport {FieldTree, PathKind, SchemaOrSchemaFn} from '../../../src/api/types';\nimport {normalizeFormArgs} from '../../../src/util/normalize_form_args';\nimport {CompatFieldAdapter} from '../compat_field_adapter';\n\n/**\n * Options that may be specified when creating a compat form.\n *\n * @category interop\n * @experimental 21.0.0\n */\nexport type CompatFormOptions<TModel> = Omit<FormOptions<TModel>, 'adapter'>;\n\n/**\n * Creates a compatibility form wrapped around the given model data.\n *\n * `compatForm` is a version of the `form` function that is designed for backwards\n * compatibility with Reactive forms by accepting Reactive controls as a part of the data.\n *\n * @example\n * ```ts\n * const lastName = new FormControl('lastName');\n *\n * const nameModel = signal({\n * first: '',\n * last: lastName\n * });\n *\n * const nameForm = compatForm(nameModel, (name) => {\n * required(name.first);\n * });\n *\n * nameForm.last().value(); // lastName, not FormControl\n * ```\n * \n * @param model A writable signal that contains the model data for the form. The resulting field\n * structure will match the shape of the model and any changes to the form data will be written to\n * the model.\n\n * @category interop\n * @experimental 21.0.0\n */\nexport function compatForm<TModel>(model: WritableSignal<TModel>): FieldTree<TModel>;\n\n/**\n * Creates a compatibility form wrapped around the given model data.\n *\n * `compatForm` is a version of the `form` function that is designed for backwards\n * compatibility with Reactive forms by accepting Reactive controls as a part of the data.\n *\n * @example\n * ```ts\n * const lastName = new FormControl('lastName');\n *\n * const nameModel = signal({\n * first: '',\n * last: lastName\n * });\n *\n * const nameForm = compatForm(nameModel, (name) => {\n * required(name.first);\n * });\n *\n * nameForm.last().value(); // lastName, not FormControl\n *\n * @param model A writable signal that contains the model data for the form. The resulting field\n * structure will match the shape of the model and any changes to the form data will be written to\n * the model.\n * @param schemaOrOptions The second argument can be either\n * 1. A schema or a function used to specify logic for the form (e.g. validation, disabled fields, etc.).\n * When passing a schema, the form options can be passed as a third argument if needed.\n * 2. The form options (excluding adapter, since it's provided).\n *\n * @category interop\n * @experimental 21.0.0\n */\nexport function compatForm<TModel>(\n model: WritableSignal<TModel>,\n schemaOrOptions: SchemaOrSchemaFn<TModel> | CompatFormOptions<TModel>,\n): FieldTree<TModel>;\n\n/**\n * Creates a compatibility form wrapped around the given model data.\n *\n * `compatForm` is a version of the `form` function that is designed for backwards\n * compatibility with Reactive forms by accepting Reactive controls as a part of the data.\n *\n * @example\n * ```ts\n * const lastName = new FormControl('lastName');\n *\n * const nameModel = signal({\n * first: '',\n * last: lastName\n * });\n *\n * const nameForm = compatForm(nameModel, (name) => {\n * required(name.first);\n * });\n *\n * nameForm.last().value(); // lastName, not FormControl\n *\n * @param model A writable signal that contains the model data for the form. The resulting field\n * structure will match the shape of the model and any changes to the form data will be written to\n * the model.\n * @param schemaOrOptions A schema or a function used to specify logic for the form (e.g. validation, disabled fields, etc.).\n * When passing a schema, the form options can be passed as a third argument if needed.\n * @param options The form options (excluding adapter, since it's provided).\n *\n * @category interop\n * @experimental 21.0.0\n */\nexport function compatForm<TModel>(\n model: WritableSignal<TModel>,\n schema: SchemaOrSchemaFn<TModel>,\n options: CompatFormOptions<TModel>,\n): FieldTree<TModel>;\n\nexport function compatForm<TModel>(...args: any[]): FieldTree<TModel> {\n const [model, maybeSchema, maybeOptions] = normalizeFormArgs<TModel>(args);\n\n const options = {...maybeOptions, adapter: new CompatFieldAdapter()};\n const schema = maybeSchema || ((() => {}) as SchemaOrSchemaFn<TModel, PathKind>);\n return form(model, schema, options) as FieldTree<TModel>;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport type {SignalFormsConfig} from '../../../src/api/di';\n\n/**\n * A value that can be used for `SignalFormsConfig.classes` to automatically add\n * the `ng-*` status classes from reactive forms.\n *\n * @experimental 21.0.1\n */\nexport const NG_STATUS_CLASSES: SignalFormsConfig['classes'] = {\n 'ng-touched': ({state}) => state().touched(),\n 'ng-untouched': ({state}) => !state().touched(),\n 'ng-dirty': ({state}) => state().dirty(),\n 'ng-pristine': ({state}) => !state().dirty(),\n 'ng-valid': ({state}) => state().valid(),\n 'ng-invalid': ({state}) => state().invalid(),\n 'ng-pending': ({state}) => state().pending(),\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n effect,\n EventEmitter,\n inject,\n Injector,\n ɵRuntimeError as RuntimeError,\n signal,\n untracked,\n WritableSignal,\n} from '@angular/core';\nimport {\n AbstractControl,\n ControlEvent,\n FormArray,\n FormControlState,\n FormControlStatus,\n FormGroup,\n FormResetEvent,\n PristineChangeEvent,\n StatusChangeEvent,\n TouchedChangeEvent,\n ValueChangeEvent,\n} from '@angular/forms';\n\nimport {FormOptions} from '../../../src/api/structure';\nimport {FieldState, FieldTree, SchemaFn} from '../../../src/api/types';\nimport {signalErrorsToValidationErrors} from '../../../src/compat/validation_errors';\nimport {RuntimeErrorCode} from '../../../src/errors';\nimport {FieldNode} from '../../../src/field/node';\nimport {normalizeFormArgs} from '../../../src/util/normalize_form_args';\nimport {compatForm} from '../api/compat_form';\n\n/** Options used to update the control value. */\nexport type ValueUpdateOptions = {\n onlySelf?: boolean;\n emitEvent?: boolean;\n emitModelToViewChange?: boolean;\n emitViewToModelChange?: boolean;\n};\n\n/**\n * A `FormControl` that is backed by signal forms rules.\n *\n * This class provides a bridge between Signal Forms and Reactive Forms, allowing\n * signal-based controls to be used within a standard `FormGroup` or `FormArray`.\n *\n * A control could be created using signal forms, and integrated with an existing FormGroup\n * propagating all the statuses and validity.\n *\n * @usageNotes\n *\n * ### Basic usage\n *\n * ```angular-ts\n * const form = new FormGroup({\n * // You can create SignalFormControl with signal form rules, and add it to a FormGroup.\n * name: new SignalFormControl('Alice', p => {\n * required(p);\n * }),\n * age: new FormControl(25),\n * });\n * ```\n * In the template you can get the underlying `fieldTree` and bind it:\n *\n * ```angular-html\n * <form [formGroup]=\"form\">\n * <input [formField]=\"nameControl.fieldTree\" />\n * <input formControlName=\"age\" />\n * </form>\n * ```\n *\n * @experimental\n */\nexport class SignalFormControl<T> extends AbstractControl {\n /** Source FieldTree. */\n public readonly fieldTree: FieldTree<T>;\n /** The raw signal driving the control value. */\n public readonly sourceValue: WritableSignal<T>;\n\n private readonly fieldState: FieldState<T>;\n private readonly initialValue: T;\n private pendingParentNotifications = 0;\n private readonly onChangeCallbacks: Array<(value?: any, emitModelEvent?: boolean) => void> = [];\n private readonly onDisabledChangeCallbacks: Array<(isDisabled: boolean) => void> = [];\n override readonly valueChanges = new EventEmitter<T>();\n override readonly statusChanges = new EventEmitter<FormControlStatus>();\n\n constructor(value: T, schemaOrOptions?: SchemaFn<T> | FormOptions<T>, options?: FormOptions<T>) {\n super(null, null);\n\n const [model, schema, opts] = normalizeFormArgs<T>([signal(value), schemaOrOptions, options]);\n this.sourceValue = model;\n this.initialValue = value;\n const injector = opts?.injector ?? inject(Injector);\n\n const rawTree = schema\n ? compatForm(this.sourceValue, schema, {injector})\n : compatForm(this.sourceValue, {injector});\n\n this.fieldTree = wrapFieldTreeForSyncUpdates(rawTree, () =>\n this.parent?.updateValueAndValidity({sourceControl: this} as any),\n );\n this.fieldState = this.fieldTree() as FieldState<T>;\n\n this.defineCompatProperties();\n\n // Value changes effect\n effect(\n () => {\n const value = this.sourceValue();\n untracked(() => {\n this.notifyParentUnlessPending();\n this.valueChanges.emit(value);\n this.emitControlEvent(new ValueChangeEvent(value, this));\n });\n },\n {injector},\n );\n\n // Status changes effect\n effect(\n () => {\n const status = this.status;\n untracked(() => {\n this.statusChanges.emit(status);\n });\n this.emitControlEvent(new StatusChangeEvent(status, this));\n },\n {injector},\n );\n\n // Disabled changes effect\n effect(\n () => {\n const isDisabled = this.disabled;\n untracked(() => {\n for (const fn of this.onDisabledChangeCallbacks) {\n fn(isDisabled);\n }\n });\n },\n {injector},\n );\n\n // Touched changes effect\n effect(\n () => {\n const isTouched = this.fieldState.touched();\n this.emitControlEvent(new TouchedChangeEvent(isTouched, this));\n const parent = this.parent;\n if (!parent) {\n return;\n }\n if (!isTouched) {\n parent.markAsUntouched();\n } else {\n parent.markAsTouched();\n }\n },\n {injector},\n );\n\n // Dirty changes effect\n effect(\n () => {\n const isDirty = this.fieldState.dirty();\n this.emitControlEvent(new PristineChangeEvent(!isDirty, this));\n const parent = this.parent;\n if (!parent) {\n return;\n }\n if (isDirty) {\n parent.markAsDirty();\n } else {\n parent.markAsPristine();\n }\n },\n {injector},\n );\n }\n\n /**\n * Defines properties using closure-safe names to prevent issues with property renaming optimizations.\n *\n * AbstractControl have `value` and `errors` as readonly prop, which doesn't allow getters.\n **/\n private defineCompatProperties(): void {\n const valueProp = getClosureSafeProperty({value: getClosureSafeProperty});\n Object.defineProperty(this, valueProp, {\n get: () => this.sourceValue(),\n });\n const errorsProp = getClosureSafeProperty({errors: getClosureSafeProperty});\n Object.defineProperty(this, errorsProp, {\n get: () => signalErrorsToValidationErrors(this.fieldState.errors()),\n });\n }\n\n private emitControlEvent(event: ControlEvent): void {\n untracked(() => {\n (this as any)._events.next(event);\n });\n }\n\n override setValue(value: any, options?: ValueUpdateOptions): void {\n this.updateValue(value, options);\n }\n\n override patchValue(value: any, options?: ValueUpdateOptions): void {\n this.updateValue(value, options);\n }\n\n private updateValue(value: any, options?: ValueUpdateOptions): void {\n const parent = this.scheduleParentUpdate(options);\n this.sourceValue.set(value);\n if (parent) {\n this.updateParentValueAndValidity(parent, options?.emitEvent);\n }\n if (options?.emitModelToViewChange !== false) {\n for (const fn of this.onChangeCallbacks) {\n fn(value, true);\n }\n }\n }\n\n registerOnChange(fn: (value?: any, emitModelEvent?: boolean) => void): void {\n this.onChangeCallbacks.push(fn);\n }\n\n /** @internal */\n _unregisterOnChange(fn: (value?: any, emitModelEvent?: boolean) => void): void {\n removeListItem(this.onChangeCallbacks, fn);\n }\n\n registerOnDisabledChange(fn: (isDisabled: boolean) => void): void {\n this.onDisabledChangeCallbacks.push(fn);\n }\n\n /** @internal */\n _unregisterOnDisabledChange(fn: (isDisabled: boolean) => void): void {\n removeListItem(this.onDisabledChangeCallbacks, fn);\n }\n\n override getRawValue(): T {\n return this.value;\n }\n\n override reset(value?: T | FormControlState<T>, options?: ValueUpdateOptions): void {\n if (isFormControlState(value)) {\n throw unsupportedDisableEnableError();\n }\n\n const resetValue = value ?? this.initialValue;\n this.fieldState.reset(resetValue);\n\n if (value !== undefined) {\n this.updateValue(value, options);\n } else if (!options?.onlySelf) {\n const parent = this.parent;\n if (parent) {\n this.updateParentValueAndValidity(parent, options?.emitEvent);\n }\n }\n\n if (options?.emitEvent !== false) {\n this.emitControlEvent(new FormResetEvent(this));\n }\n }\n\n private scheduleParentUpdate(options?: ValueUpdateOptions): FormGroup | FormArray | null {\n const parent = options?.onlySelf ? null : this.parent;\n if (options?.onlySelf || parent) {\n this.pendingParentNotifications++;\n }\n return parent;\n }\n\n private notifyParentUnlessPending(): void {\n if (this.pendingParentNotifications > 0) {\n this.pendingParentNotifications--;\n return;\n }\n const parent = this.parent;\n if (parent) {\n this.updateParentValueAndValidity(parent);\n }\n }\n\n private updateParentValueAndValidity(parent: AbstractControl, emitEvent?: boolean): void {\n parent.updateValueAndValidity({emitEvent, sourceControl: this} as any);\n }\n\n private propagateToParent(\n opts: {onlySelf?: boolean} | undefined,\n fn: (parent: AbstractControl) => void,\n ) {\n const parent = this.parent;\n if (parent && !opts?.onlySelf) {\n fn(parent);\n }\n }\n\n override get status(): FormControlStatus {\n if (this.fieldState.disabled()) {\n return 'DISABLED';\n }\n if (this.fieldState.valid()) {\n return 'VALID';\n }\n if (this.fieldState.invalid()) {\n return 'INVALID';\n }\n return 'PENDING';\n }\n\n override get valid(): boolean {\n return this.fieldState.valid();\n }\n\n override get invalid(): boolean {\n return this.fieldState.invalid();\n }\n\n override get pending(): boolean {\n return this.fieldState.pending();\n }\n\n override get disabled(): boolean {\n return this.fieldState.disabled();\n }\n\n override get enabled(): boolean {\n return !this.disabled;\n }\n\n override get dirty(): boolean {\n return this.fieldState.dirty();\n }\n\n override set dirty(_: boolean) {\n throw unsupportedFeatureError(\n ngDevMode && 'Setting dirty directly is not supported. Instead use markAsDirty().',\n );\n }\n\n override get pristine(): boolean {\n return !this.dirty;\n }\n\n override set pristine(_: boolean) {\n throw unsupportedFeatureError(\n ngDevMode && 'Setting pristine directly is not supported. Instead use reset().',\n );\n }\n\n override get touched(): boolean {\n return this.fieldState.touched();\n }\n\n override set touched(_: boolean) {\n throw unsupportedFeatureError(\n ngDevMode &&\n 'Setting touched directly is not supported. Instead use markAsTouched() or reset().',\n );\n }\n\n override get untouched(): boolean {\n return !this.touched;\n }\n\n override set untouched(_: boolean) {\n throw unsupportedFeatureError(\n ngDevMode && 'Setting untouched directly is not supported. Instead use reset().',\n );\n }\n\n override markAsTouched(opts?: {onlySelf?: boolean}): void {\n this.fieldState.markAsTouched();\n this.propagateToParent(opts, (parent) => parent.markAsTouched(opts));\n }\n\n override markAsDirty(opts?: {onlySelf?: boolean}): void {\n this.fieldState.markAsDirty();\n this.propagateToParent(opts, (parent) => parent.markAsDirty(opts));\n }\n\n override markAsPristine(opts?: {onlySelf?: boolean}): void {\n (this.fieldState as FieldNode).markAsPristine();\n this.propagateToParent(opts, (parent) => parent.markAsPristine(opts));\n }\n\n override markAsUntouched(opts?: {onlySelf?: boolean}): void {\n (this.fieldState as FieldNode).markAsUntouched();\n this.propagateToParent(opts, (parent) => parent.markAsUntouched(opts));\n }\n\n override updateValueAndValidity(_opts?: Object): void {}\n\n /** @internal */\n // @ts-ignore\n override _updateValue(): void {}\n\n /** @internal */\n // @ts-ignore\n override _forEachChild(_cb: (c: AbstractControl) => void): void {}\n\n /** @internal */\n // @ts-ignore\n override _anyControls(_condition: (c: AbstractControl) => boolean): boolean {\n return false;\n }\n\n /** @internal */\n // @ts-ignore\n override _allControlsDisabled(): boolean {\n return this.disabled;\n }\n\n /** @internal */\n // @ts-ignore\n override _syncPendingControls(): boolean {\n return false;\n }\n\n override disable(_opts?: {onlySelf?: boolean; emitEvent?: boolean}): void {\n throw unsupportedDisableEnableError();\n }\n\n override enable(_opts?: {onlySelf?: boolean; emitEvent?: boolean}): void {\n throw unsupportedDisableEnableError();\n }\n\n override setValidators(_validators: any): void {\n throw unsupportedValidatorsError();\n }\n\n override setAsyncValidators(_validators: any): void {\n throw unsupportedValidatorsError();\n }\n\n override addValidators(_validators: any): void {\n throw unsupportedValidatorsError();\n }\n\n override addAsyncValidators(_validators: any): void {\n throw unsupportedValidatorsError();\n }\n\n override removeValidators(_validators: any): void {\n throw unsupportedValidatorsError();\n }\n\n override removeAsyncValidators(_validators: any): void {\n throw unsupportedValidatorsError();\n }\n\n override clearValidators(): void {\n throw unsupportedValidatorsError();\n }\n\n override clearAsyncValidators(): void {\n throw unsupportedValidatorsError();\n }\n\n override setErrors(_errors: any, _opts?: {emitEvent?: boolean}): void {\n throw unsupportedFeatureError(\n ngDevMode &&\n 'Imperatively setting errors is not supported in signal forms. Errors are derived from validation rules.',\n );\n }\n\n override markAsPending(_opts?: {onlySelf?: boolean; emitEvent?: boolean}): void {\n throw unsupportedFeatureError(\n ngDevMode &&\n 'Imperatively marking as pending is not supported in signal forms. Pending state is derived from async validation status.',\n );\n }\n}\n\nclass CachingWeakMap<K extends object, V> {\n private readonly map = new WeakMap<K, V>();\n\n getOrCreate(key: K, create: () => V): V {\n const cached = this.map.get(key);\n if (cached) {\n return cached;\n }\n const value = create();\n this.map.set(key, value);\n return value;\n }\n}\n\n/**\n * A FieldTree proxy that patches setters to immediately react on value changes.\n * @param tree\n * @param onUpdate\n */\nfunction wrapFieldTreeForSyncUpdates<T>(tree: FieldTree<T>, onUpdate: () => void): FieldTree<T> {\n const treeCache = new CachingWeakMap<FieldTree<unknown>, FieldTree<unknown>>();\n const stateCache = new CachingWeakMap<FieldState<unknown>, FieldState<unknown>>();\n\n // Takes a FieldState and wraps a value to instantly call onUpdate.\n const wrapState = (state: FieldState<unknown>): FieldState<unknown> => {\n const {value} = state;\n const wrappedValue = Object.assign((...a: unknown[]) => (value as Function)(...a), {\n set: (v: unknown) => {\n value.set(v);\n onUpdate();\n },\n update: (fn: (v: unknown) => unknown) => {\n value.update(fn);\n onUpdate();\n },\n }) as WritableSignal<unknown>;\n return Object.create(state, {value: {get: () => wrappedValue}});\n };\n // Takes a FieldTree and wraps it's state's value to instantly call onUpdate.\n const wrapTree = (t: FieldTree<unknown>): FieldTree<unknown> => {\n return treeCache.getOrCreate(t, () => {\n return new Proxy(t, {\n // When getting a prop, wrap FieldTree if it's a function\n get(target, prop, receiver) {\n const val = Reflect.get(target, prop, receiver);\n // Some of FieldTree children are not function, e.g. length.\n if (typeof val === 'function' && typeof prop === 'string') {\n return wrapTree(val);\n }\n return val;\n },\n // When calling the tree, wrap the returned state\n apply(target, _, args) {\n const state: FieldState<unknown> = (target as Function)(...args);\n return stateCache.getOrCreate(state, () => wrapState(state));\n },\n }) as FieldTree<unknown>;\n });\n };\n\n return wrapTree(tree) as FieldTree<T>;\n}\n\nfunction isFormControlState(formState: unknown): formState is FormControlState<unknown> {\n return (\n typeof formState === 'object' &&\n formState !== null &&\n Object.keys(formState).length === 2 &&\n 'value' in formState &&\n 'disabled' in formState\n );\n}\n\nfunction unsupportedFeatureError(message: string | null): Error {\n return new RuntimeError(RuntimeErrorCode.UNSUPPORTED_FEATURE, message ?? false);\n}\n\nfunction unsupportedDisableEnableError(): Error {\n return unsupportedFeatureError(\n ngDevMode &&\n 'Imperatively changing enabled/disabled status in form control is not supported in signal forms. Instead use a \"disabled\" rule to derive the disabled status from a signal.',\n );\n}\n\nfunction unsupportedValidatorsError(): Error {\n return unsupportedFeatureError(\n ngDevMode &&\n 'Dynamically adding and removing validators is not supported in signal forms. Instead use the \"applyWhen\" rule to conditionally apply validators based on a signal.',\n );\n}\n\nfunction removeListItem<T>(list: T[], el: T): void {\n const index = list.indexOf(el);\n if (index > -1) list.splice(index, 1);\n}\n\nfunction getClosureSafeProperty<T>(objWithPropertyToExtract: T): string {\n for (let key in objWithPropertyToExtract) {\n if (objWithPropertyToExtract[key] === (getClosureSafeProperty as any)) {\n return key;\n }\n }\n throw Error(\n typeof ngDevMode === 'undefined' || ngDevMode\n ? 'Could not find renamed property on target object.'\n : '',\n );\n}\n"],"names":["CompatFieldNode","FieldNode","options","control","constructor","makeCreateDestroySubject","destroy$","ReplaySubject","next","complete","extractControlPropToSignal","makeSignal","injector","getInjectorFromOptions","createDestroySubject","signalOfControlSignal","linkedSignal","ngDevMode","debugName","source","computation","untracked","runInInjectionContext","computed","getControlStatusSignal","getValue","c","toSignal","statusChanges","pipe","map","takeUntil","initialValue","getControlEventsSignal","events","CompatNodeState","FieldNodeState","compatNode","touched","dirty","disabled","controlDisabled","disabledReasons","length","markAsDirty","markAsTouched","markAsPristine","markAsUntouched","getParentFromOptions","kind","undefined","parent","getFieldManagerFromOptions","fieldManager","structure","root","getControlValueSignal","value","valueChanges","getRawValue","set","setValue","update","fn","CompatStructure","FieldNodeStructure","keyInParent","pathKeys","children","signal","childrenMap","node","logic","RuntimeError","identityInParent","initialKeyInParent","createKeyInParent","getChild","EMPTY_ARRAY_SIGNAL","TRUE_SIGNAL","CompatValidationState","syncValid","errors","pending","invalid","valid","parseErrors","status","extractNestedReactiveErrors","asyncErrors","errorSummary","rawSyncTreeErrors","syncErrors","rawAsyncErrors","shouldSkipValidation","calculateValidationSelfStatus","CompatFieldAdapter","basicAdapter","BasicFieldAdapter","newRoot","pathNode","adapter","AbstractControl","createCompatNode","builder","build","fieldAdapter","createNodeState","createStructure","createValidationState","newChild","compatForm","args","model","maybeSchema","maybeOptions","normalizeFormArgs","schema","form","NG_STATUS_CLASSES","ng-touched","state","ng-untouched","ng-dirty","ng-pristine","ng-valid","ng-invalid","ng-pending","SignalFormControl","fieldTree","sourceValue","fieldState","pendingParentNotifications","onChangeCallbacks","onDisabledChangeCallbacks","EventEmitter","schemaOrOptions","opts","inject","Injector","rawTree","wrapFieldTreeForSyncUpdates","updateValueAndValidity","sourceControl","defineCompatProperties","effect","notifyParentUnlessPending","emit","emitControlEvent","ValueChangeEvent","StatusChangeEvent","isDisabled","isTouched","TouchedChangeEvent","isDirty","PristineChangeEvent","valueProp","getClosureSafeProperty","Object","defineProperty","get","errorsProp","signalErrorsToValidationErrors","event","_events","updateValue","patchValue","scheduleParentUpdate","updateParentValueAndValidity","emitEvent","emitModelToViewChange","registerOnChange","push","_unregisterOnChange","removeListItem","registerOnDisabledChange","_unregisterOnDisabledChange","reset","isFormControlState","unsupportedDisableEnableError","resetValue","onlySelf","FormResetEvent","propagateToParent","enabled","_","unsupportedFeatureError","pristine","untouched","_opts","_updateValue","_forEachChild","_cb","_anyControls","_condition","_allControlsDisabled","_syncPendingControls","disable","enable","setValidators","_validators","unsupportedValidatorsError","setAsyncValidators","addValidators","addAsyncValidators","removeValidators","removeAsyncValidators","clearValidators","clearAsyncValidators","setErrors","_errors","markAsPending","CachingWeakMap","WeakMap","getOrCreate","key","create","cached","tree","onUpdate","treeCache","stateCache","wrapState","wrappedValue","assign","a","v","wrapTree","t","Proxy","target","prop","receiver","val","Reflect","apply","formState","keys","message","list","el","index","indexOf","splice","objWithPropertyToExtract","Error"],"mappings":"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"}
|