@angular/forms 22.0.0-next.3 → 22.0.0-next.4

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@angular/forms",
3
- "version": "22.0.0-next.3",
3
+ "version": "22.0.0-next.4",
4
4
  "description": "Angular - directives and services for creating forms",
5
5
  "author": "angular",
6
6
  "license": "MIT",
@@ -12,9 +12,9 @@
12
12
  "@standard-schema/spec": "^1.0.0"
13
13
  },
14
14
  "peerDependencies": {
15
- "@angular/core": "22.0.0-next.3",
16
- "@angular/common": "22.0.0-next.3",
17
- "@angular/platform-browser": "22.0.0-next.3",
15
+ "@angular/core": "22.0.0-next.4",
16
+ "@angular/common": "22.0.0-next.4",
17
+ "@angular/platform-browser": "22.0.0-next.4",
18
18
  "rxjs": "^6.5.3 || ^7.4.0"
19
19
  },
20
20
  "repository": {
Binary file
@@ -1,11 +1,11 @@
1
1
  /**
2
- * @license Angular v22.0.0-next.3
2
+ * @license Angular v22.0.0-next.4
3
3
  * (c) 2010-2026 Google LLC. https://angular.dev/
4
4
  * License: MIT
5
5
  */
6
6
 
7
7
  import * as i0 from '@angular/core';
8
- import { Signal, WritableSignal, Injector, InjectionToken, Provider } from '@angular/core';
8
+ import { Signal, Injector, WritableSignal, InjectionToken, Provider } from '@angular/core';
9
9
  import { AbstractControl, ValidationErrors, FormControlStatus, ControlValueAccessor, ValidatorFn } from '@angular/forms';
10
10
  import { StandardSchemaV1 } from '@standard-schema/spec';
11
11
 
@@ -53,6 +53,18 @@ interface FormSubmitOptions<TRootModel, TSubmittedModel> {
53
53
  */
54
54
  ignoreValidators?: 'pending' | 'none' | 'all';
55
55
  }
56
+ /**
57
+ * Options for the `markAsTouched` method.
58
+ *
59
+ * @experimental 21.2.0
60
+ */
61
+ interface MarkAsTouchedOptions {
62
+ /**
63
+ * If `true`, only marks the current field as touched.
64
+ * If `false` or not provided, marks the field and all its descendants as touched.
65
+ */
66
+ skipDescendants?: boolean;
67
+ }
56
68
  /**
57
69
  * A type that represents either a single value of type `T` or a readonly array of `T`.
58
70
  * @template T The type of the value(s).
@@ -177,7 +189,7 @@ type Field<TValue, TKey extends string | number = string | number> = () => Field
177
189
  * @category types
178
190
  * @experimental 21.0
179
191
  */
180
- type FieldTree<TModel, TKey extends string | number = string | number, TMode extends 'writable' | 'readonly' = 'writable'> = (() => [TModel] extends [AbstractControl] ? CompatFieldState<TModel, TKey, TMode> : FieldStateByMode<TModel, TKey, TMode>) & ([TModel] extends [AbstractControl] ? object : [TModel] extends [ReadonlyArray<infer U>] ? ReadonlyArrayLike<MaybeFieldTree<U, number, TMode>> : TModel extends Record<string, any> ? Subfields<TModel, TMode> : object);
192
+ type FieldTree<TModel, TKey extends string | number = string | number, TMode extends 'writable' | 'readonly' = 'writable'> = (() => [TModel] extends [AbstractControl] ? CompatFieldState<TModel, TKey, TMode> : FieldStateByMode<TModel, TKey, TMode>) & (TModel extends AbstractControl ? object : TModel extends ReadonlyArray<infer U> ? ReadonlyArrayLike<MaybeFieldTree<U, number, TMode>> : TModel extends Record<string, any> ? Subfields<TModel, TMode> : object);
181
193
  /**
182
194
  * A readonly {@link FieldTree}.
183
195
  *
@@ -205,7 +217,11 @@ type Subfields<TModel, TMode extends 'writable' | 'readonly' = 'writable'> = {
205
217
  *
206
218
  * @experimental 21.0
207
219
  */
208
- type ReadonlyArrayLike<T> = Pick<ReadonlyArray<T>, number | 'length' | typeof Symbol.iterator>;
220
+ interface ReadonlyArrayLike<T> {
221
+ readonly [n: number]: T;
222
+ readonly length: number;
223
+ [Symbol.iterator](): IterableIterator<T>;
224
+ }
209
225
  /**
210
226
  * Helper type for defining `FieldTree`. Given a type `TValue` that may include `undefined`,
211
227
  * it extracts the `undefined` outside the `FieldTree` type.
@@ -416,9 +432,11 @@ interface FieldState<TValue, TKey extends string | number = string | number> ext
416
432
  */
417
433
  markAsDirty(): void;
418
434
  /**
419
- * Sets the touched status of the field to `true`.
435
+ * Sets the touched status of the field and its descendants to `true`.
436
+ *
437
+ * @param options Options for marking the field as touched.
420
438
  */
421
- markAsTouched(): void;
439
+ markAsTouched(options?: MarkAsTouchedOptions): void;
422
440
  /**
423
441
  * Resets the {@link touched} and {@link dirty} state of the field and its descendants.
424
442
  *
@@ -532,7 +550,9 @@ type CompatSchemaPath<TControl extends AbstractControl, TPathKind extends PathKi
532
550
  *
533
551
  * @experimental 21.0
534
552
  */
535
- type SchemaPathTree<TModel, TPathKind extends PathKind = PathKind.Root> = ([TModel] extends [AbstractControl] ? CompatSchemaPath<TModel, TPathKind> : SchemaPath<TModel, SchemaPathRules.Supported, TPathKind>) & (TModel extends AbstractControl ? unknown : TModel extends ReadonlyArray<any> ? unknown : TModel extends Record<string, any> ? {
553
+ type SchemaPathTree<TModel, TPathKind extends PathKind = PathKind.Root> = ([TModel] extends [AbstractControl] ? CompatSchemaPath<TModel, TPathKind> : SchemaPath<TModel, SchemaPathRules.Supported, TPathKind>) & ([TModel] extends [AbstractControl] ? unknown : [
554
+ TModel
555
+ ] extends [ReadonlyArray<any>] ? unknown : TModel extends Record<string, any> ? {
536
556
  [K in keyof TModel]: MaybeSchemaPathTree<TModel[K], PathKind.Child>;
537
557
  } : unknown);
538
558
  /**
@@ -693,10 +713,10 @@ interface RootFieldContext<TValue> {
693
713
  /** Gets the value of the field represented by the given path. */
694
714
  valueOf<PValue>(p: SchemaPath<PValue, SchemaPathRules>): PValue;
695
715
  /** Gets the state of the field represented by the given path. */
696
- stateOf<PControl extends AbstractControl>(p: CompatSchemaPath<PControl>): ReadonlyCompatFieldState<PControl>;
697
- stateOf<PValue>(p: SchemaPath<PValue, SchemaPathRules>): ReadonlyFieldState<PValue>;
716
+ stateOf<PControl extends AbstractControl>(p: CompatSchemaPath<PControl>): [PControl] extends [any] ? ReadonlyCompatFieldState<PControl> : never;
717
+ stateOf<PValue>(p: SchemaPath<PValue, SchemaPathRules>): [PValue] extends [any] ? ReadonlyFieldState<PValue> : never;
698
718
  /** Gets the field represented by the given path. */
699
- fieldTreeOf<PModel>(p: SchemaPathTree<PModel>): ReadonlyFieldTree<PModel>;
719
+ fieldTreeOf<PModel>(p: SchemaPathTree<PModel>): [PModel] extends [any] ? ReadonlyFieldTree<PModel> : never;
700
720
  /** The list of keys that lead from the root field to the current field. */
701
721
  readonly pathKeys: Signal<readonly string[]>;
702
722
  }
@@ -1138,8 +1158,6 @@ interface ValidationErrorOptions {
1138
1158
  type WithFieldTree<T> = T & {
1139
1159
  fieldTree: ReadonlyFieldTree<unknown>;
1140
1160
  };
1141
- /** @deprecated Use `WithFieldTree` instead */
1142
- type WithField<T> = WithFieldTree<T>;
1143
1161
  /**
1144
1162
  * A type that allows the given type `T` to optionally have a `field` property.
1145
1163
  * @template T The type to optionally add a `field` to.
@@ -1149,8 +1167,6 @@ type WithField<T> = WithFieldTree<T>;
1149
1167
  type WithOptionalFieldTree<T> = Omit<T, 'fieldTree'> & {
1150
1168
  fieldTree?: ReadonlyFieldTree<unknown>;
1151
1169
  };
1152
- /** @deprecated Use `WithOptionalFieldTree` instead */
1153
- type WithOptionalField<T> = WithOptionalFieldTree<T>;
1154
1170
  /**
1155
1171
  * A type that ensures the given type `T` does not have a `field` property.
1156
1172
  * @template T The type to remove the `field` from.
@@ -1160,8 +1176,6 @@ type WithOptionalField<T> = WithOptionalFieldTree<T>;
1160
1176
  type WithoutFieldTree<T> = T & {
1161
1177
  fieldTree: never;
1162
1178
  };
1163
- /** @deprecated Use `WithoutFieldTree` instead */
1164
- type WithoutField<T> = WithoutFieldTree<T>;
1165
1179
  /**
1166
1180
  * Create a required error associated with the target field
1167
1181
  * @param options The validation error options
@@ -1762,4 +1776,4 @@ declare function submit<TModel>(form: FieldTree<TModel>, action: NoInfer<FormSub
1762
1776
  declare function schema<TValue>(fn: SchemaFn<TValue>): Schema<TValue>;
1763
1777
 
1764
1778
  export { BaseNgValidationError, EmailValidationError, FORM_FIELD, FormField, MAX, MAX_LENGTH, MIN, MIN_LENGTH, MaxLengthValidationError, MaxValidationError, MetadataKey, MetadataReducer, MinLengthValidationError, MinValidationError, NativeInputParseError, NgValidationError, PATTERN, PathKind, PatternValidationError, REQUIRED, RequiredValidationError, SchemaPathRules, StandardSchemaValidationError, ValidationError, apply, applyEach, applyWhen, applyWhenValue, createManagedMetadataKey, createMetadataKey, emailError, form, maxError, maxLengthError, metadata, minError, minLengthError, patternError, provideSignalFormsConfig, requiredError, schema, standardSchemaError, submit, validateStandardSchema, ɵNgFieldDirective };
1765
- export type { AsyncValidationResult, ChildFieldContext, CompatFieldState, CompatSchemaPath, Debouncer, DisabledReason, Field, FieldContext, FieldState, FieldStateByMode, FieldTree, FieldValidator, FormFieldBinding, FormFieldBindingOptions, FormOptions, FormSubmitOptions, IgnoreUnknownProperties, ItemFieldContext, ItemType, LogicFn, MaybeFieldTree, MaybeSchemaPathTree, MetadataSetterType, OneOrMany, ReadonlyArrayLike, ReadonlyCompatFieldState, ReadonlyFieldState, ReadonlyFieldTree, RemoveStringIndexUnknownKey, RootFieldContext, Schema, SchemaFn, SchemaOrSchemaFn, SchemaPath, SchemaPathTree, SignalFormsConfig, Subfields, TreeValidationResult, TreeValidator, ValidationErrorOptions, ValidationResult, ValidationSuccess, Validator, WithField, WithFieldTree, WithOptionalField, WithOptionalFieldTree, WithoutField, WithoutFieldTree };
1779
+ export type { AsyncValidationResult, ChildFieldContext, CompatFieldState, CompatSchemaPath, Debouncer, DisabledReason, Field, FieldContext, FieldState, FieldStateByMode, FieldTree, FieldValidator, FormFieldBinding, FormFieldBindingOptions, FormOptions, FormSubmitOptions, IgnoreUnknownProperties, ItemFieldContext, ItemType, LogicFn, MarkAsTouchedOptions, MaybeFieldTree, MaybeSchemaPathTree, MetadataSetterType, OneOrMany, ReadonlyArrayLike, ReadonlyCompatFieldState, ReadonlyFieldState, ReadonlyFieldTree, RemoveStringIndexUnknownKey, RootFieldContext, Schema, SchemaFn, SchemaOrSchemaFn, SchemaPath, SchemaPathTree, SignalFormsConfig, Subfields, TreeValidationResult, TreeValidator, ValidationErrorOptions, ValidationResult, ValidationSuccess, Validator, WithFieldTree, WithOptionalFieldTree, WithoutFieldTree };
package/types/forms.d.ts CHANGED
@@ -1,11 +1,11 @@
1
1
  /**
2
- * @license Angular v22.0.0-next.3
2
+ * @license Angular v22.0.0-next.4
3
3
  * (c) 2010-2026 Google LLC. https://angular.dev/
4
4
  * License: MIT
5
5
  */
6
6
 
7
7
  import * as i0 from '@angular/core';
8
- import { InjectionToken, Renderer2, ElementRef, OnDestroy, OnChanges, SimpleChanges, OnInit, Injector, EventEmitter, ChangeDetectorRef, AfterViewInit, Version, ModuleWithProviders } from '@angular/core';
8
+ import { Renderer2, ElementRef, InjectionToken, OnDestroy, OnChanges, SimpleChanges, Injector, ɵControlDirectiveHost as _ControlDirectiveHost, OnInit, EventEmitter, Signal, ChangeDetectorRef, AfterViewInit, Version, ModuleWithProviders } from '@angular/core';
9
9
  import { Observable } from 'rxjs';
10
10
 
11
11
  /**
@@ -298,7 +298,7 @@ declare class SelectControlValueAccessor extends BuiltInControlValueAccessor imp
298
298
  */
299
299
  registerOnChange(fn: (value: any) => any): void;
300
300
  static ɵfac: i0.ɵɵFactoryDeclaration<SelectControlValueAccessor, never>;
301
- static ɵdir: i0.ɵɵDirectiveDeclaration<SelectControlValueAccessor, "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", never, { "compareWith": { "alias": "compareWith"; "required": false; }; }, {}, never, never, false, never>;
301
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SelectControlValueAccessor, "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]", never, { "compareWith": { "alias": "compareWith"; "required": false; }; }, {}, never, never, false, never>;
302
302
  }
303
303
  /**
304
304
  * @description
@@ -398,7 +398,7 @@ declare class SelectMultipleControlValueAccessor extends BuiltInControlValueAcce
398
398
  */
399
399
  registerOnChange(fn: (value: any) => any): void;
400
400
  static ɵfac: i0.ɵɵFactoryDeclaration<SelectMultipleControlValueAccessor, never>;
401
- static ɵdir: i0.ɵɵDirectiveDeclaration<SelectMultipleControlValueAccessor, "select[multiple][formControlName],select[multiple][formControl],select[multiple][ngModel]", never, { "compareWith": { "alias": "compareWith"; "required": false; }; }, {}, never, never, false, never>;
401
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SelectMultipleControlValueAccessor, "select[multiple]:not([ngNoCva])[formControlName],select[multiple]:not([ngNoCva])[formControl],select[multiple]:not([ngNoCva])[ngModel]", never, { "compareWith": { "alias": "compareWith"; "required": false; }; }, {}, never, never, false, never>;
402
402
  }
403
403
  /**
404
404
  * @description
@@ -486,7 +486,7 @@ declare class DefaultValueAccessor extends BaseControlValueAccessor implements C
486
486
  */
487
487
  writeValue(value: any): void;
488
488
  static ɵfac: i0.ɵɵFactoryDeclaration<DefaultValueAccessor, [null, null, { optional: true; }]>;
489
- static ɵdir: i0.ɵɵDirectiveDeclaration<DefaultValueAccessor, "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]", never, {}, {}, never, never, false, never>;
489
+ static ɵdir: i0.ɵɵDirectiveDeclaration<DefaultValueAccessor, "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]", never, {}, {}, never, never, false, never>;
490
490
  }
491
491
 
492
492
  /**
@@ -525,7 +525,7 @@ declare class NumberValueAccessor extends BuiltInControlValueAccessor implements
525
525
  */
526
526
  registerOnChange(fn: (_: number | null) => void): void;
527
527
  static ɵfac: i0.ɵɵFactoryDeclaration<NumberValueAccessor, never>;
528
- static ɵdir: i0.ɵɵDirectiveDeclaration<NumberValueAccessor, "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]", never, {}, {}, never, never, false, never>;
528
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NumberValueAccessor, "input[type=number]:not([ngNoCva])[formControlName],input[type=number]:not([ngNoCva])[formControl],input[type=number]:not([ngNoCva])[ngModel]", never, {}, {}, never, never, false, never>;
529
529
  }
530
530
 
531
531
  /**
@@ -564,7 +564,7 @@ declare class RangeValueAccessor extends BuiltInControlValueAccessor implements
564
564
  */
565
565
  registerOnChange(fn: (_: number | null) => void): void;
566
566
  static ɵfac: i0.ɵɵFactoryDeclaration<RangeValueAccessor, never>;
567
- static ɵdir: i0.ɵɵDirectiveDeclaration<RangeValueAccessor, "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]", never, {}, {}, never, never, false, never>;
567
+ static ɵdir: i0.ɵɵDirectiveDeclaration<RangeValueAccessor, "input[type=range]:not([ngNoCva])[formControlName],input[type=range]:not([ngNoCva])[formControl],input[type=range]:not([ngNoCva])[ngModel]", never, {}, {}, never, never, false, never>;
568
568
  }
569
569
 
570
570
  /**
@@ -597,7 +597,7 @@ declare class CheckboxControlValueAccessor extends BuiltInControlValueAccessor i
597
597
  */
598
598
  writeValue(value: any): void;
599
599
  static ɵfac: i0.ɵɵFactoryDeclaration<CheckboxControlValueAccessor, never>;
600
- static ɵdir: i0.ɵɵDirectiveDeclaration<CheckboxControlValueAccessor, "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]", never, {}, {}, never, never, false, never>;
600
+ static ɵdir: i0.ɵɵDirectiveDeclaration<CheckboxControlValueAccessor, "input[type=checkbox]:not([ngNoCva])[formControlName],input[type=checkbox]:not([ngNoCva])[formControl],input[type=checkbox]:not([ngNoCva])[ngModel]", never, {}, {}, never, never, false, never>;
601
601
  }
602
602
 
603
603
  /**
@@ -3212,6 +3212,7 @@ declare abstract class AbstractControl<TValue = any, TRawValue extends TValue =
3212
3212
  * a control is extended.
3213
3213
  */
3214
3214
  private _assignAsyncValidators;
3215
+ private _updateHasRequiredValidator;
3215
3216
  }
3216
3217
 
3217
3218
  /**
@@ -3430,6 +3431,14 @@ declare abstract class NgControl extends AbstractControlDirective {
3430
3431
  * The value accessor for the control
3431
3432
  */
3432
3433
  valueAccessor: ControlValueAccessor | null;
3434
+ protected isCustomControlBased: boolean;
3435
+ private isNativeFormElement;
3436
+ /**
3437
+ * Raw `ControlValueAccessor`s retrieved from DI.
3438
+ */
3439
+ private readonly rawValueAccessors;
3440
+ private _selectedValueAccessor;
3441
+ protected get selectedValueAccessor(): ControlValueAccessor | null;
3433
3442
  /**
3434
3443
  * @description
3435
3444
  * The callback method to update the model from the view when requested
@@ -3437,6 +3446,63 @@ declare abstract class NgControl extends AbstractControlDirective {
3437
3446
  * @param newValue The new value for the view
3438
3447
  */
3439
3448
  abstract viewToModelUpdate(newValue: any): void;
3449
+ /**
3450
+ * Validator function that returns current parse errors.
3451
+ */
3452
+ protected parseErrorsValidator: ValidatorFn | null;
3453
+ /**
3454
+ * Renderer for setting native DOM properties. Set by subclass constructor.
3455
+ */
3456
+ private renderer;
3457
+ /**
3458
+ * Injector for creating effects. Set by subclass constructor.
3459
+ */
3460
+ private readonly injector;
3461
+ private requiredValidatorViaDi;
3462
+ /**
3463
+ * Container for any RxJS subscriptions related to the current control.
3464
+ *
3465
+ * This gets cleaned up and recreated when the control changes.
3466
+ */
3467
+ private subscription;
3468
+ /**
3469
+ * Tracks last bound values to avoid unnecessary FVC updates.
3470
+ */
3471
+ protected customControlBindings: {
3472
+ value?: unknown;
3473
+ disabled?: boolean;
3474
+ touched?: boolean;
3475
+ dirty?: boolean;
3476
+ valid?: boolean;
3477
+ invalid?: boolean;
3478
+ pending?: boolean;
3479
+ required?: boolean;
3480
+ errors?: ValidationErrors | null;
3481
+ } | null;
3482
+ constructor(injector?: Injector, renderer?: Renderer2, rawValueAccessors?: ControlValueAccessor[]);
3483
+ protected setupCustomControl(): void;
3484
+ protected ngControlUpdate(host: _ControlDirectiveHost, bindRequired: boolean): void;
3485
+ /**
3486
+ * Returns true if the control is currently considered required, false otherwise.
3487
+ *
3488
+ * A control can be required either via `NG_VALIDATORS` including the `RequiredValidator`.
3489
+ */
3490
+ private get isRequired();
3491
+ /**
3492
+ * Whether the control should bind the `required` property (in custom control mode).
3493
+ *
3494
+ * Can be overridden by subclasses that handle `required` in a different way.
3495
+ */
3496
+ protected get shouldBindRequired(): boolean;
3497
+ /**
3498
+ * Binds a status property to FVC, falling back to native DOM if FVC lacks the input.
3499
+ */
3500
+ private bindControlProperty;
3501
+ /**
3502
+ * Converts Reactive Forms errors to Signal Forms error format.
3503
+ */
3504
+ private _convertErrors;
3505
+ protected removeParseErrorsValidator(control: AbstractControl | null | undefined): void;
3440
3506
  }
3441
3507
 
3442
3508
  /**
@@ -3538,7 +3604,7 @@ declare class RadioControlValueAccessor extends BuiltInControlValueAccessor impl
3538
3604
  fireUncheck(value: any): void;
3539
3605
  private _checkName;
3540
3606
  static ɵfac: i0.ɵɵFactoryDeclaration<RadioControlValueAccessor, never>;
3541
- static ɵdir: i0.ɵɵDirectiveDeclaration<RadioControlValueAccessor, "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", never, { "name": { "alias": "name"; "required": false; }; "formControlName": { "alias": "formControlName"; "required": false; }; "value": { "alias": "value"; "required": false; }; }, {}, never, never, false, never>;
3607
+ static ɵdir: i0.ɵɵDirectiveDeclaration<RadioControlValueAccessor, "input[type=radio]:not([ngNoCva])[formControlName],input[type=radio]:not([ngNoCva])[formControl],input[type=radio]:not([ngNoCva])[ngModel]", never, { "name": { "alias": "name"; "required": false; }; "formControlName": { "alias": "formControlName"; "required": false; }; "value": { "alias": "value"; "required": false; }; }, {}, never, never, false, never>;
3542
3608
  }
3543
3609
 
3544
3610
  /**
@@ -3774,7 +3840,7 @@ declare class FormControlName extends NgControl implements OnChanges, OnDestroy
3774
3840
  model: any;
3775
3841
  /** @deprecated as of v6 */
3776
3842
  update: EventEmitter<any>;
3777
- constructor(parent: ControlContainer, validators: (Validator | ValidatorFn)[], asyncValidators: (AsyncValidator | AsyncValidatorFn)[], valueAccessors: ControlValueAccessor[], _ngModelWarningConfig: string | null);
3843
+ constructor(parent: ControlContainer, validators: (Validator | ValidatorFn)[], asyncValidators: (AsyncValidator | AsyncValidatorFn)[], valueAccessors: ControlValueAccessor[], _ngModelWarningConfig: string | null, renderer?: Renderer2, injector?: Injector);
3778
3844
  /** @docs-private */
3779
3845
  ngOnChanges(changes: SimpleChanges): void;
3780
3846
  /** @docs-private */
@@ -3798,7 +3864,7 @@ declare class FormControlName extends NgControl implements OnChanges, OnDestroy
3798
3864
  */
3799
3865
  get formDirective(): any;
3800
3866
  private _setUpControl;
3801
- static ɵfac: i0.ɵɵFactoryDeclaration<FormControlName, [{ optional: true; host: true; skipSelf: true; }, { optional: true; self: true; }, { optional: true; self: true; }, { optional: true; self: true; }, { optional: true; }]>;
3867
+ static ɵfac: i0.ɵɵFactoryDeclaration<FormControlName, [{ optional: true; host: true; skipSelf: true; }, { optional: true; self: true; }, { optional: true; self: true; }, { optional: true; self: true; }, { optional: true; }, { optional: true; }, { optional: true; }]>;
3802
3868
  static ɵdir: i0.ɵɵDirectiveDeclaration<FormControlName, "[formControlName]", never, { "name": { "alias": "formControlName"; "required": false; }; "isDisabled": { "alias": "disabled"; "required": false; }; "model": { "alias": "ngModel"; "required": false; }; }, { "update": "ngModelChange"; }, never, never, false, never>;
3803
3869
  }
3804
3870
 
@@ -4099,6 +4165,15 @@ declare class FormArrayName extends ControlContainer implements OnInit, OnDestro
4099
4165
  static ɵdir: i0.ɵɵDirectiveDeclaration<FormArrayName, "[formArrayName]", never, { "name": { "alias": "formArrayName"; "required": false; }; }, {}, never, never, false, never>;
4100
4166
  }
4101
4167
 
4168
+ /**
4169
+ * DI token that provides a writable signal that controls can use to set the signal of parse errors
4170
+ * for the `FormField` directive or reactive directives. Used internally by `transformedValue`.
4171
+ */
4172
+ declare const ɵFORM_FIELD_PARSE_ERRORS: InjectionToken<{
4173
+ readonly set: (value: Signal<ReadonlyArray<{
4174
+ readonly kind: string;
4175
+ }>> | undefined) => void;
4176
+ }>;
4102
4177
  /**
4103
4178
  * The type for CALL_SET_DISABLED_STATE. If `always`, then ControlValueAccessor will always call
4104
4179
  * `setDisabledState` when attached, which is the most correct behavior. Otherwise, it will only be
@@ -4248,11 +4323,18 @@ declare class NgModel extends NgControl implements OnChanges, OnDestroy {
4248
4323
  * the view model updates.
4249
4324
  */
4250
4325
  update: EventEmitter<any>;
4251
- constructor(parent: ControlContainer, validators: (Validator | ValidatorFn)[], asyncValidators: (AsyncValidator | AsyncValidatorFn)[], valueAccessors: ControlValueAccessor[], _changeDetectorRef?: (ChangeDetectorRef | null) | undefined, callSetDisabledState?: SetDisabledStateOption | undefined);
4326
+ constructor(parent: ControlContainer, validators: (Validator | ValidatorFn)[], asyncValidators: (AsyncValidator | AsyncValidatorFn)[], valueAccessors: ControlValueAccessor[], _changeDetectorRef?: (ChangeDetectorRef | null) | undefined, callSetDisabledState?: SetDisabledStateOption | undefined, injector?: Injector, renderer?: Renderer2);
4252
4327
  /** @docs-private */
4253
4328
  ngOnChanges(changes: SimpleChanges): void;
4254
4329
  /** @docs-private */
4255
4330
  ngOnDestroy(): void;
4331
+ /**
4332
+ * Template-driven forms handle `required` via the `RequiredValidator` directive.
4333
+ *
4334
+ * This directive has a `required` input and a host binding to `[attr.required]`. It defines the
4335
+ * source of truth for required-ness, so disable the normal control binding for it.
4336
+ */
4337
+ protected get shouldBindRequired(): boolean;
4256
4338
  /**
4257
4339
  * @description
4258
4340
  * Returns an array that represents the path from the top-level form to this control.
@@ -4280,7 +4362,7 @@ declare class NgModel extends NgControl implements OnChanges, OnDestroy {
4280
4362
  private _updateValue;
4281
4363
  private _updateDisabled;
4282
4364
  private _getPath;
4283
- static ɵfac: i0.ɵɵFactoryDeclaration<NgModel, [{ optional: true; host: true; }, { optional: true; self: true; }, { optional: true; self: true; }, { optional: true; self: true; }, { optional: true; }, { optional: true; }]>;
4365
+ static ɵfac: i0.ɵɵFactoryDeclaration<NgModel, [{ optional: true; host: true; }, { optional: true; self: true; }, { optional: true; self: true; }, { optional: true; self: true; }, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }]>;
4284
4366
  static ɵdir: i0.ɵɵDirectiveDeclaration<NgModel, "[ngModel]:not([formControlName]):not([formControl])", ["ngModel"], { "name": { "alias": "name"; "required": false; }; "isDisabled": { "alias": "disabled"; "required": false; }; "model": { "alias": "ngModel"; "required": false; }; "options": { "alias": "ngModelOptions"; "required": false; }; }, { "update": "ngModelChange"; }, never, never, false, never>;
4285
4367
  }
4286
4368
 
@@ -4613,7 +4695,7 @@ declare class FormControlDirective extends NgControl implements OnChanges, OnDes
4613
4695
  model: any;
4614
4696
  /** @deprecated as of v6 */
4615
4697
  update: EventEmitter<any>;
4616
- constructor(validators: (Validator | ValidatorFn)[], asyncValidators: (AsyncValidator | AsyncValidatorFn)[], valueAccessors: ControlValueAccessor[], _ngModelWarningConfig: string | null, callSetDisabledState?: SetDisabledStateOption | undefined);
4698
+ constructor(validators: (Validator | ValidatorFn)[], asyncValidators: (AsyncValidator | AsyncValidatorFn)[], valueAccessors: ControlValueAccessor[], _ngModelWarningConfig: string | null, callSetDisabledState?: SetDisabledStateOption | undefined, renderer?: Renderer2, injector?: Injector);
4617
4699
  /** @docs-private */
4618
4700
  ngOnChanges(changes: SimpleChanges): void;
4619
4701
  /** @docs-private */
@@ -4637,7 +4719,7 @@ declare class FormControlDirective extends NgControl implements OnChanges, OnDes
4637
4719
  */
4638
4720
  viewToModelUpdate(newValue: any): void;
4639
4721
  private _isControlChanged;
4640
- static ɵfac: i0.ɵɵFactoryDeclaration<FormControlDirective, [{ optional: true; self: true; }, { optional: true; self: true; }, { optional: true; self: true; }, { optional: true; }, { optional: true; }]>;
4722
+ static ɵfac: i0.ɵɵFactoryDeclaration<FormControlDirective, [{ optional: true; self: true; }, { optional: true; self: true; }, { optional: true; self: true; }, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }]>;
4641
4723
  static ɵdir: i0.ɵɵDirectiveDeclaration<FormControlDirective, "[formControl]", ["ngForm"], { "form": { "alias": "formControl"; "required": false; }; "isDisabled": { "alias": "disabled"; "required": false; }; "model": { "alias": "ngModel"; "required": false; }; }, { "update": "ngModelChange"; }, never, never, false, never>;
4642
4724
  }
4643
4725
 
@@ -5335,6 +5417,30 @@ declare class Validators {
5335
5417
  */
5336
5418
  declare const VERSION: Version;
5337
5419
 
5420
+ /**
5421
+ * Supported native control element types.
5422
+ *
5423
+ * The `type` property of a {@link HTMLTextAreaElement} should always be 'textarea', but the
5424
+ * TypeScript DOM API type definition lacks this detail, so we include it here.
5425
+ *
5426
+ * https://developer.mozilla.org/en-US/docs/Web/API/HTMLTextAreaElement/type
5427
+ */
5428
+ type NativeFormControl = HTMLInputElement | HTMLSelectElement | (HTMLTextAreaElement & {
5429
+ type: 'textarea';
5430
+ });
5431
+ declare function isNativeFormElement(element: HTMLElement): element is NativeFormControl;
5432
+ declare function isNumericFormElement(element: HTMLElement): boolean;
5433
+ declare function isTextualFormElement(element: HTMLElement): boolean;
5434
+ /**
5435
+ * Updates the native DOM property on the given node.
5436
+ *
5437
+ * @param renderer The renderer to use for DOM operations.
5438
+ * @param element The native form control element.
5439
+ * @param name The DOM attribute/property name.
5440
+ * @param value The new value for the property.
5441
+ */
5442
+ declare function setNativeDomProperty(renderer: Renderer2, element: NativeFormControl, name: 'name' | 'disabled' | 'required' | 'readonly' | 'min' | 'max' | 'minLength' | 'maxLength', value: string | number | boolean | undefined): void;
5443
+
5338
5444
  /**
5339
5445
  * Exports the required providers and directives for template-driven forms,
5340
5446
  * making them available for import by NgModules that import this module.
@@ -5389,5 +5495,5 @@ declare class ReactiveFormsModule {
5389
5495
  static ɵinj: i0.ɵɵInjectorDeclaration<ReactiveFormsModule>;
5390
5496
  }
5391
5497
 
5392
- export { AbstractControl, AbstractControlDirective, AbstractFormDirective, AbstractFormGroupDirective, COMPOSITION_BUFFER_MODE, CheckboxControlValueAccessor, CheckboxRequiredValidator, ControlContainer, ControlEvent, DefaultValueAccessor, EmailValidator, FormArray, FormArrayDirective, FormArrayName, FormBuilder, FormControl, FormControlDirective, FormControlName, FormGroup, FormGroupDirective, FormGroupName, FormRecord, FormResetEvent, FormSubmittedEvent, FormsModule, MaxLengthValidator, MaxValidator, MinLengthValidator, MinValidator, NG_ASYNC_VALIDATORS, NG_VALIDATORS, NG_VALUE_ACCESSOR, NgControl, NgControlStatus, NgControlStatusGroup, NgForm, NgModel, NgModelGroup, NgSelectOption, NonNullableFormBuilder, NumberValueAccessor, PatternValidator, PristineChangeEvent, RadioControlValueAccessor, RangeValueAccessor, ReactiveFormsModule, RequiredValidator, SelectControlValueAccessor, SelectMultipleControlValueAccessor, StatusChangeEvent, TouchedChangeEvent, UntypedFormArray, UntypedFormBuilder, UntypedFormControl, UntypedFormGroup, VERSION, Validators, ValueChangeEvent, isFormArray, isFormControl, isFormGroup, isFormRecord, ɵInternalFormsSharedModule, ɵNgNoValidate, ɵNgSelectMultipleOption };
5393
- export type { AbstractControlOptions, AsyncValidator, AsyncValidatorFn, ControlConfig, ControlValueAccessor, Form, FormControlOptions, FormControlState, FormControlStatus, SetDisabledStateOption, ValidationErrors, Validator, ValidatorFn, ɵCoerceStrArrToNumArr, ɵElement, ɵFormArrayRawValue, ɵFormArrayValue, ɵFormControlCtor, ɵFormGroupRawValue, ɵFormGroupValue, ɵGetProperty, ɵNavigate, ɵOptionalKeys, ɵRawValue, ɵTokenize, ɵTypedOrUntyped, ɵValue, ɵWriteable };
5498
+ export { AbstractControl, AbstractControlDirective, AbstractFormDirective, AbstractFormGroupDirective, COMPOSITION_BUFFER_MODE, CheckboxControlValueAccessor, CheckboxRequiredValidator, ControlContainer, ControlEvent, DefaultValueAccessor, EmailValidator, FormArray, FormArrayDirective, FormArrayName, FormBuilder, FormControl, FormControlDirective, FormControlName, FormGroup, FormGroupDirective, FormGroupName, FormRecord, FormResetEvent, FormSubmittedEvent, FormsModule, MaxLengthValidator, MaxValidator, MinLengthValidator, MinValidator, NG_ASYNC_VALIDATORS, NG_VALIDATORS, NG_VALUE_ACCESSOR, NgControl, NgControlStatus, NgControlStatusGroup, NgForm, NgModel, NgModelGroup, NgSelectOption, NonNullableFormBuilder, NumberValueAccessor, PatternValidator, PristineChangeEvent, RadioControlValueAccessor, RangeValueAccessor, ReactiveFormsModule, RequiredValidator, SelectControlValueAccessor, SelectMultipleControlValueAccessor, StatusChangeEvent, TouchedChangeEvent, UntypedFormArray, UntypedFormBuilder, UntypedFormControl, UntypedFormGroup, VERSION, Validators, ValueChangeEvent, isFormArray, isFormControl, isFormGroup, isFormRecord, ɵFORM_FIELD_PARSE_ERRORS, ɵInternalFormsSharedModule, ɵNgNoValidate, ɵNgSelectMultipleOption, isNativeFormElement as ɵisNativeFormElement, isNumericFormElement as ɵisNumericFormElement, isTextualFormElement as ɵisTextualFormElement, setNativeDomProperty as ɵsetNativeDomProperty };
5499
+ export type { AbstractControlOptions, AsyncValidator, AsyncValidatorFn, ControlConfig, ControlValueAccessor, Form, FormControlOptions, FormControlState, FormControlStatus, SetDisabledStateOption, ValidationErrors, Validator, ValidatorFn, ɵCoerceStrArrToNumArr, ɵElement, ɵFormArrayRawValue, ɵFormArrayValue, ɵFormControlCtor, ɵFormGroupRawValue, ɵFormGroupValue, ɵGetProperty, NativeFormControl as ɵNativeFormControl, ɵNavigate, ɵOptionalKeys, ɵRawValue, ɵTokenize, ɵTypedOrUntyped, ɵValue, ɵWriteable };
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Angular v22.0.0-next.3
2
+ * @license Angular v22.0.0-next.4
3
3
  * (c) 2010-2026 Google LLC. https://angular.dev/
4
4
  * License: MIT
5
5
  */
@@ -112,6 +112,64 @@ declare function compatForm<TModel>(model: WritableSignal<TModel>, schemaOrOptio
112
112
  */
113
113
  declare function compatForm<TModel>(model: WritableSignal<TModel>, schema: SchemaOrSchemaFn<TModel>, options: CompatFormOptions<TModel>): FieldTree<TModel>;
114
114
 
115
+ /**
116
+ * Type utility that recursively unwraps the value type of a `FieldTree`.
117
+ *
118
+ * If the value type contains `AbstractControl` instances (common in compat mode),
119
+ * they are replaced with their underlying value types.
120
+ */
121
+ type RawValue<T> = T extends AbstractControl<infer TValue, any> ? TValue : T extends (infer U)[] ? RawValue<U>[] : T extends object ? {
122
+ [K in keyof T]: RawValue<T[K]>;
123
+ } : T;
124
+ /**
125
+ * A type that recursively makes all properties of T optional.
126
+ * Used for the result of `extractValue` when filtering is applied.
127
+ * @experimental 21.2.0
128
+ */
129
+ type DeepPartial<T> = (T extends (infer U)[] ? DeepPartial<U>[] : T extends object ? {
130
+ [K in keyof T]?: DeepPartial<T[K]>;
131
+ } : T) | undefined;
132
+ /**
133
+ * Criteria that determine whether a field should be included in the extraction.
134
+ *
135
+ * Each property is optional; when provided, the field must match the specified state.
136
+ *
137
+ * @category interop
138
+ * @experimental 21.2.0
139
+ */
140
+ interface ExtractFilter {
141
+ readonly dirty?: boolean;
142
+ readonly touched?: boolean;
143
+ readonly enabled?: boolean;
144
+ }
145
+ /**
146
+ * Utility to unwrap a {@link FieldTree} into its underlying raw value.
147
+ *
148
+ * This function is recursive, so if the field tree represents an object or an array,
149
+ * the result will be an object or an array of the raw values of its children.
150
+ *
151
+ * @param field The field tree to extract the value from.
152
+ * @returns The raw value of the field tree.
153
+ *
154
+ * @category interop
155
+ * @experimental 21.2.0
156
+ */
157
+ declare function extractValue<T>(field: FieldTree<T>): RawValue<T>;
158
+ /**
159
+ * Utility to unwrap a {@link FieldTree} into its underlying raw value.
160
+ *
161
+ * This function is recursive, so if the field tree represents an object or an array,
162
+ * the result will be an object or an array of the raw values of its children.
163
+ *
164
+ * @param field The field tree to extract the value from.
165
+ * @param filter Criteria to include only fields matching certain state (dirty, touched, enabled).
166
+ * @returns A partial value containing only the fields matching the filter, or `undefined` if none match.
167
+ *
168
+ * @category interop
169
+ * @experimental 21.2.0
170
+ */
171
+ declare function extractValue<T>(field: FieldTree<T>, filter: ExtractFilter): DeepPartial<RawValue<T>>;
172
+
115
173
  /**
116
174
  * An error used for compat errors.
117
175
  *
@@ -262,5 +320,5 @@ declare class SignalFormControl<T> extends AbstractControl {
262
320
  }): void;
263
321
  }
264
322
 
265
- export { CompatValidationError, NG_STATUS_CLASSES, SignalFormControl, compatForm };
323
+ export { CompatValidationError, NG_STATUS_CLASSES, SignalFormControl, compatForm, extractValue };
266
324
  export type { CompatFormOptions };
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Angular v22.0.0-next.3
2
+ * @license Angular v22.0.0-next.4
3
3
  * (c) 2010-2026 Google LLC. https://angular.dev/
4
4
  * License: MIT
5
5
  */
@@ -7,7 +7,7 @@
7
7
  import * as i0 from '@angular/core';
8
8
  import { Signal, ResourceRef, InputSignal, InputSignalWithTransform, OutputRef, ModelSignal, WritableSignal } from '@angular/core';
9
9
  import { PathKind, SchemaPath, SchemaPathRules, LogicFn, OneOrMany, ValidationError, FieldValidator, FieldContext, TreeValidationResult, TreeValidator, WithOptionalFieldTree, DisabledReason, Debouncer, FieldTree } from './_structure-chunk.js';
10
- export { AsyncValidationResult, BaseNgValidationError, ChildFieldContext, CompatFieldState, CompatSchemaPath, EmailValidationError, FORM_FIELD, Field, FieldState, FieldStateByMode, FormField, FormFieldBinding, FormFieldBindingOptions, FormOptions, FormSubmitOptions, IgnoreUnknownProperties, ItemFieldContext, ItemType, MAX, MAX_LENGTH, MIN, MIN_LENGTH, MaxLengthValidationError, MaxValidationError, MaybeFieldTree, MaybeSchemaPathTree, MetadataKey, MetadataReducer, MetadataSetterType, MinLengthValidationError, MinValidationError, NativeInputParseError, NgValidationError, PATTERN, PatternValidationError, REQUIRED, ReadonlyArrayLike, ReadonlyCompatFieldState, ReadonlyFieldState, ReadonlyFieldTree, RemoveStringIndexUnknownKey, RequiredValidationError, RootFieldContext, Schema, SchemaFn, SchemaOrSchemaFn, SchemaPathTree, SignalFormsConfig, StandardSchemaValidationError, Subfields, ValidationErrorOptions, ValidationResult, ValidationSuccess, Validator, WithField, WithFieldTree, WithOptionalField, WithoutField, WithoutFieldTree, apply, applyEach, applyWhen, applyWhenValue, createManagedMetadataKey, createMetadataKey, emailError, form, maxError, maxLengthError, metadata, minError, minLengthError, patternError, provideSignalFormsConfig, requiredError, schema, standardSchemaError, submit, validateStandardSchema, ɵNgFieldDirective } from './_structure-chunk.js';
10
+ export { AsyncValidationResult, BaseNgValidationError, ChildFieldContext, CompatFieldState, CompatSchemaPath, EmailValidationError, FORM_FIELD, Field, FieldState, FieldStateByMode, FormField, FormFieldBinding, FormFieldBindingOptions, FormOptions, FormSubmitOptions, IgnoreUnknownProperties, ItemFieldContext, ItemType, MAX, MAX_LENGTH, MIN, MIN_LENGTH, MarkAsTouchedOptions, MaxLengthValidationError, MaxValidationError, MaybeFieldTree, MaybeSchemaPathTree, MetadataKey, MetadataReducer, MetadataSetterType, MinLengthValidationError, MinValidationError, NativeInputParseError, NgValidationError, PATTERN, PatternValidationError, REQUIRED, ReadonlyArrayLike, ReadonlyCompatFieldState, ReadonlyFieldState, ReadonlyFieldTree, RemoveStringIndexUnknownKey, RequiredValidationError, RootFieldContext, Schema, SchemaFn, SchemaOrSchemaFn, SchemaPathTree, SignalFormsConfig, StandardSchemaValidationError, Subfields, ValidationErrorOptions, ValidationResult, ValidationSuccess, Validator, WithFieldTree, WithoutFieldTree, apply, applyEach, applyWhen, applyWhenValue, createManagedMetadataKey, createMetadataKey, emailError, form, maxError, maxLengthError, metadata, minError, minLengthError, patternError, provideSignalFormsConfig, requiredError, schema, standardSchemaError, submit, validateStandardSchema, ɵNgFieldDirective } from './_structure-chunk.js';
11
11
  import { HttpResourceRequest, HttpResourceOptions } from '@angular/common/http';
12
12
  import '@angular/forms';
13
13
  import '@standard-schema/spec';