@angular/forms
Advanced tools
| /** | ||
| * @license Angular v22.0.0-next.4 | ||
| * @license Angular v22.0.0-next.5 | ||
| * (c) 2010-2026 Google LLC. https://angular.dev/ | ||
@@ -61,2 +61,5 @@ * License: MIT | ||
| } | ||
| hasRules() { | ||
| return this.fns.length > 0; | ||
| } | ||
| } | ||
@@ -166,5 +169,11 @@ class BooleanOrLogic extends AbstractLogic { | ||
| } | ||
| hasAnyLogic() { | ||
| return this.hidden.hasRules() || this.disabledReasons.hasRules() || this.readonly.hasRules() || this.syncErrors.hasRules() || this.syncTreeErrors.hasRules() || this.asyncErrors.hasRules() || this.metadata.size > 0; | ||
| } | ||
| hasMetadata(key) { | ||
| return this.metadata.has(key); | ||
| } | ||
| hasMetadataKeys() { | ||
| return this.metadata.size > 0; | ||
| } | ||
| getMetadataKeys() { | ||
@@ -246,2 +255,10 @@ return this.metadata.keys(); | ||
| } | ||
| hasRules() { | ||
| return this.all.length > 0; | ||
| } | ||
| anyChildHasLogic() { | ||
| return this.all.some(({ | ||
| builder | ||
| }) => builder.anyChildHasLogic()); | ||
| } | ||
| mergeIn(other, predicate) { | ||
@@ -312,2 +329,13 @@ if (predicate) { | ||
| } | ||
| hasRules() { | ||
| return this.logic.hasAnyLogic() || this.children.size > 0; | ||
| } | ||
| anyChildHasLogic() { | ||
| for (const child of this.children.values()) { | ||
| if (child.hasRules()) { | ||
| return true; | ||
| } | ||
| } | ||
| return false; | ||
| } | ||
| } | ||
@@ -344,4 +372,13 @@ class LeafLogicNode { | ||
| hasLogic(builder) { | ||
| return this.builder?.hasLogic(builder) ?? false; | ||
| if (!this.builder) { | ||
| return false; | ||
| } | ||
| return this.builder.hasLogic(builder); | ||
| } | ||
| hasRules() { | ||
| return this.builder ? this.builder.hasRules() : false; | ||
| } | ||
| anyChildHasLogic() { | ||
| return this.builder ? this.builder.anyChildHasLogic() : false; | ||
| } | ||
| } | ||
@@ -364,2 +401,8 @@ class CompositeLogicNode { | ||
| } | ||
| hasRules() { | ||
| return this.all.some(node => node.hasRules()); | ||
| } | ||
| anyChildHasLogic() { | ||
| return this.all.some(child => child.anyChildHasLogic()); | ||
| } | ||
| } | ||
@@ -577,2 +620,3 @@ function getAllChildBuilders(builder, key) { | ||
| } | ||
| const IS_ASYNC_VALIDATION_RESOURCE = Symbol('IS_ASYNC_VALIDATION_RESOURCE'); | ||
| class MetadataKey { | ||
@@ -582,2 +626,3 @@ reducer; | ||
| brand; | ||
| [IS_ASYNC_VALIDATION_RESOURCE]; | ||
| constructor(reducer, create) { | ||
@@ -817,9 +862,16 @@ this.reducer = reducer; | ||
| this.node = node; | ||
| for (const key of this.node.logicNode.logic.getMetadataKeys()) { | ||
| if (key.create) { | ||
| const logic = this.node.logicNode.logic.getMetadata(key); | ||
| const result = untracked(() => runInInjectionContext(this.node.structure.injector, () => key.create(computed(() => logic.compute(this.node.context))))); | ||
| this.metadata.set(key, result); | ||
| } | ||
| runMetadataCreateLifecycle() { | ||
| if (!this.node.logicNode.logic.hasMetadataKeys()) { | ||
| return; | ||
| } | ||
| untracked(() => runInInjectionContext(this.node.structure.injector, () => { | ||
| for (const key of this.node.logicNode.logic.getMetadataKeys()) { | ||
| if (key.create) { | ||
| const logic = this.node.logicNode.logic.getMetadata(key); | ||
| const result = key.create(this.node, computed(() => logic.compute(this.node.context))); | ||
| this.metadata.set(key, result); | ||
| } | ||
| } | ||
| } | ||
| })); | ||
| } | ||
@@ -918,2 +970,3 @@ get(key) { | ||
| _injector = undefined; | ||
| _anyChildHasLogic; | ||
| get injector() { | ||
@@ -932,2 +985,3 @@ this._injector ??= Injector.create({ | ||
| children() { | ||
| this.ensureChildrenMap(); | ||
| const map = this.childrenMap(); | ||
@@ -939,3 +993,15 @@ if (map === undefined) { | ||
| } | ||
| _areChildrenMaterialized() { | ||
| return untracked(this.childrenMap) !== undefined; | ||
| } | ||
| ensureChildrenMap() { | ||
| if (this._areChildrenMaterialized()) { | ||
| return; | ||
| } | ||
| untracked(() => { | ||
| this.childrenMap.update(current => this.computeChildrenMap(this.value(), current, true)); | ||
| }); | ||
| } | ||
| getChild(key) { | ||
| this.ensureChildrenMap(); | ||
| const strKey = key.toString(); | ||
@@ -1001,63 +1067,69 @@ let reader = untracked(this.childrenMap)?.byPropertyKey.get(strKey)?.reader; | ||
| source: this.value, | ||
| computation: (value, previous) => { | ||
| if (!isObject(value)) { | ||
| return undefined; | ||
| computation: (value, previous) => this.computeChildrenMap(value, previous?.value, false) | ||
| }); | ||
| } | ||
| computeChildrenMap(value, prevData, forceMaterialize) { | ||
| if (!isObject(value)) { | ||
| return undefined; | ||
| } | ||
| if (!forceMaterialize && prevData === undefined) { | ||
| if (!(this._anyChildHasLogic ??= this.logic.anyChildHasLogic())) { | ||
| return undefined; | ||
| } | ||
| } | ||
| prevData ??= { | ||
| byPropertyKey: new Map() | ||
| }; | ||
| let materializedChildren; | ||
| const parentIsArray = isArray(value); | ||
| if (prevData !== undefined) { | ||
| if (parentIsArray) { | ||
| materializedChildren = maybeRemoveStaleArrayFields(prevData, value, this.identitySymbol); | ||
| } else { | ||
| materializedChildren = maybeRemoveStaleObjectFields(prevData, value); | ||
| } | ||
| } | ||
| for (const key of Object.keys(value)) { | ||
| let trackingKey = undefined; | ||
| const childValue = value[key]; | ||
| if (childValue === undefined) { | ||
| if (prevData.byPropertyKey.has(key)) { | ||
| materializedChildren ??= { | ||
| ...prevData | ||
| }; | ||
| materializedChildren.byPropertyKey.delete(key); | ||
| } | ||
| const prevData = previous?.value ?? { | ||
| byPropertyKey: new Map() | ||
| }; | ||
| let data; | ||
| const parentIsArray = isArray(value); | ||
| if (prevData !== undefined) { | ||
| if (parentIsArray) { | ||
| data = maybeRemoveStaleArrayFields(prevData, value, this.identitySymbol); | ||
| } else { | ||
| data = maybeRemoveStaleObjectFields(prevData, value); | ||
| } | ||
| continue; | ||
| } | ||
| if (parentIsArray && isObject(childValue) && !isArray(childValue)) { | ||
| trackingKey = childValue[this.identitySymbol] ??= Symbol(ngDevMode ? `id:${globalId++}` : ''); | ||
| } | ||
| let childNode; | ||
| if (trackingKey) { | ||
| if (!prevData.byTrackingKey?.has(trackingKey)) { | ||
| materializedChildren ??= { | ||
| ...prevData | ||
| }; | ||
| materializedChildren.byTrackingKey ??= new Map(); | ||
| materializedChildren.byTrackingKey.set(trackingKey, this.createChildNode(key, trackingKey, parentIsArray)); | ||
| } | ||
| for (const key of Object.keys(value)) { | ||
| let trackingKey = undefined; | ||
| const childValue = value[key]; | ||
| if (childValue === undefined) { | ||
| if (prevData.byPropertyKey.has(key)) { | ||
| data ??= { | ||
| ...prevData | ||
| }; | ||
| data.byPropertyKey.delete(key); | ||
| } | ||
| continue; | ||
| } | ||
| if (parentIsArray && isObject(childValue) && !isArray(childValue)) { | ||
| trackingKey = childValue[this.identitySymbol] ??= Symbol(ngDevMode ? `id:${globalId++}` : ''); | ||
| } | ||
| let childNode; | ||
| if (trackingKey) { | ||
| if (!prevData.byTrackingKey?.has(trackingKey)) { | ||
| data ??= { | ||
| ...prevData | ||
| }; | ||
| data.byTrackingKey ??= new Map(); | ||
| data.byTrackingKey.set(trackingKey, this.createChildNode(key, trackingKey, parentIsArray)); | ||
| } | ||
| childNode = (data ?? prevData).byTrackingKey.get(trackingKey); | ||
| } | ||
| const child = prevData.byPropertyKey.get(key); | ||
| if (child === undefined) { | ||
| data ??= { | ||
| ...prevData | ||
| }; | ||
| data.byPropertyKey.set(key, { | ||
| reader: this.createReader(key), | ||
| node: childNode ?? this.createChildNode(key, trackingKey, parentIsArray) | ||
| }); | ||
| } else if (childNode && childNode !== child.node) { | ||
| data ??= { | ||
| ...prevData | ||
| }; | ||
| child.node = childNode; | ||
| } | ||
| } | ||
| return data ?? prevData; | ||
| childNode = (materializedChildren ?? prevData).byTrackingKey.get(trackingKey); | ||
| } | ||
| }); | ||
| const child = prevData.byPropertyKey.get(key); | ||
| if (child === undefined) { | ||
| materializedChildren ??= { | ||
| ...prevData | ||
| }; | ||
| materializedChildren.byPropertyKey.set(key, { | ||
| reader: this.createReader(key), | ||
| node: childNode ?? this.createChildNode(key, trackingKey, parentIsArray) | ||
| }); | ||
| } else if (childNode && childNode !== child.node) { | ||
| materializedChildren ??= { | ||
| ...prevData | ||
| }; | ||
| child.node = childNode; | ||
| } | ||
| } | ||
| return materializedChildren ?? prevData; | ||
| } | ||
@@ -1224,2 +1296,3 @@ createReader(key) { | ||
| this.controlValue = this.controlValueSignal(); | ||
| this.metadataState.runMetadataCreateLifecycle(); | ||
| } | ||
@@ -1322,2 +1395,5 @@ focusBoundControl(options) { | ||
| } | ||
| getError(kind) { | ||
| return this.errors().find(e => e.kind === kind); | ||
| } | ||
| hasMetadata(key) { | ||
@@ -1366,2 +1442,17 @@ return this.metadataState.has(key); | ||
| } | ||
| reloadValidation() { | ||
| untracked(() => this._reloadValidation()); | ||
| } | ||
| _reloadValidation() { | ||
| const keys = this.logicNode.logic.getMetadataKeys(); | ||
| for (const key of keys) { | ||
| if (key[IS_ASYNC_VALIDATION_RESOURCE]) { | ||
| const resource = this.metadata(key); | ||
| resource.reload?.(); | ||
| } | ||
| } | ||
| for (const child of this.structure.children()) { | ||
| child._reloadValidation(); | ||
| } | ||
| } | ||
| controlValueSignal() { | ||
@@ -1755,3 +1846,3 @@ const controlValue = linkedSignal(this.value, ...(ngDevMode ? [{ | ||
| export { BasicFieldAdapter, CompatValidationError, DEBOUNCER, FieldNode, FieldNodeState, FieldNodeStructure, FieldPathNode, MAX, MAX_LENGTH, MIN, MIN_LENGTH, MetadataKey, MetadataReducer, PATTERN, REQUIRED, addDefaultField, apply, applyEach, applyWhen, applyWhenValue, assertPathIsCurrent, calculateValidationSelfStatus, createManagedMetadataKey, createMetadataKey, extractNestedReactiveErrors, form, getInjectorFromOptions, isArray, isObject, metadata, normalizeFormArgs, schema, signalErrorsToValidationErrors, submit }; | ||
| export { BasicFieldAdapter, CompatValidationError, DEBOUNCER, FieldNode, FieldNodeState, FieldNodeStructure, FieldPathNode, IS_ASYNC_VALIDATION_RESOURCE, MAX, MAX_LENGTH, MIN, MIN_LENGTH, MetadataKey, MetadataReducer, PATTERN, REQUIRED, addDefaultField, apply, applyEach, applyWhen, applyWhenValue, assertPathIsCurrent, calculateValidationSelfStatus, createManagedMetadataKey, createMetadataKey, extractNestedReactiveErrors, form, getInjectorFromOptions, isArray, isObject, metadata, normalizeFormArgs, schema, signalErrorsToValidationErrors, submit }; | ||
| //# sourceMappingURL=_validation_errors-chunk.mjs.map |
| /** | ||
| * @license Angular v22.0.0-next.4 | ||
| * @license Angular v22.0.0-next.5 | ||
| * (c) 2010-2026 Google LLC. https://angular.dev/ | ||
@@ -4,0 +4,0 @@ * License: MIT |
+177
-17
| /** | ||
| * @license Angular v22.0.0-next.4 | ||
| * @license Angular v22.0.0-next.5 | ||
| * (c) 2010-2026 Google LLC. https://angular.dev/ | ||
@@ -8,6 +8,7 @@ * License: MIT | ||
| import * as i0 from '@angular/core'; | ||
| import { InjectionToken, resource, ɵisPromise as _isPromise, linkedSignal, inject, ɵRuntimeError as _RuntimeError, untracked, input, computed, Renderer2, DestroyRef, Injector, ElementRef, signal, afterRenderEffect, effect, ɵformatRuntimeError as _formatRuntimeError, Directive } from '@angular/core'; | ||
| import { InjectionToken, debounced, resource, ɵisPromise as _isPromise, linkedSignal, inject, ɵRuntimeError as _RuntimeError, untracked, CSP_NONCE, PLATFORM_ID, Injectable, forwardRef, input, computed, Renderer2, DestroyRef, Injector, ElementRef, signal, afterRenderEffect, effect, ɵformatRuntimeError as _formatRuntimeError, Directive } from '@angular/core'; | ||
| import { ɵFORM_FIELD_PARSE_ERRORS as _FORM_FIELD_PARSE_ERRORS, Validators, ɵsetNativeDomProperty as _setNativeDomProperty, ɵisNativeFormElement as _isNativeFormElement, ɵisNumericFormElement as _isNumericFormElement, ɵisTextualFormElement as _isTextualFormElement, NG_VALUE_ACCESSOR, NgControl } from '@angular/forms'; | ||
| import { assertPathIsCurrent, FieldPathNode, addDefaultField, metadata, createMetadataKey, MAX, MAX_LENGTH, MIN, MIN_LENGTH, PATTERN, REQUIRED, createManagedMetadataKey, DEBOUNCER, signalErrorsToValidationErrors, submit } from './_validation_errors-chunk.mjs'; | ||
| import { assertPathIsCurrent, FieldPathNode, addDefaultField, metadata, createMetadataKey, MAX, MAX_LENGTH, MIN, MIN_LENGTH, PATTERN, REQUIRED, createManagedMetadataKey, IS_ASYNC_VALIDATION_RESOURCE, DEBOUNCER, signalErrorsToValidationErrors, submit } from './_validation_errors-chunk.mjs'; | ||
| export { MetadataKey, MetadataReducer, apply, applyEach, applyWhen, applyWhenValue, form, schema } from './_validation_errors-chunk.mjs'; | ||
| import { DOCUMENT, isPlatformBrowser } from '@angular/common'; | ||
| import { httpResource } from '@angular/common/http'; | ||
@@ -348,3 +349,10 @@ import '@angular/core/primitives/signals'; | ||
| const pathNode = FieldPathNode.unwrapFieldPath(path); | ||
| const RESOURCE = createManagedMetadataKey(opts.factory); | ||
| const RESOURCE = createManagedMetadataKey((_state, params) => { | ||
| if (opts.debounce !== undefined) { | ||
| const debouncedResource = debounced(() => params(), opts.debounce); | ||
| return opts.factory(debouncedResource.value); | ||
| } | ||
| return opts.factory(params); | ||
| }); | ||
| RESOURCE[IS_ASYNC_VALIDATION_RESOURCE] = true; | ||
| metadata(path, RESOURCE, ctx => { | ||
@@ -450,2 +458,3 @@ const node = ctx.stateOf(path); | ||
| params: opts.request, | ||
| debounce: opts.debounce, | ||
| factory: request => httpResource(request, opts.options), | ||
@@ -660,5 +669,5 @@ onSuccess: opts.onSuccess, | ||
| function getNativeControlValue(element, currentValue) { | ||
| function getNativeControlValue(element, currentValue, validityMonitor) { | ||
| let modelValue; | ||
| if (element.validity.badInput) { | ||
| if (isInput(element) && validityMonitor.isBadInput(element)) { | ||
| return { | ||
@@ -699,2 +708,21 @@ error: new NativeInputParseError() | ||
| } | ||
| if (element.tagName === 'INPUT' && element.type === 'text') { | ||
| modelValue ??= untracked(currentValue); | ||
| if (typeof modelValue === 'number' || modelValue === null) { | ||
| if (element.value === '') { | ||
| return { | ||
| value: null | ||
| }; | ||
| } | ||
| const parsed = Number(element.value); | ||
| if (Number.isNaN(parsed)) { | ||
| return { | ||
| error: new NativeInputParseError() | ||
| }; | ||
| } | ||
| return { | ||
| value: parsed | ||
| }; | ||
| } | ||
| } | ||
| return { | ||
@@ -735,2 +763,12 @@ value: element.value | ||
| } | ||
| if (element.tagName === 'INPUT' && element.type === 'text') { | ||
| if (typeof value === 'number') { | ||
| element.value = isNaN(value) ? '' : String(value); | ||
| return; | ||
| } | ||
| if (value === null) { | ||
| element.value = ''; | ||
| return; | ||
| } | ||
| } | ||
| element.value = value; | ||
@@ -745,2 +783,8 @@ } | ||
| } | ||
| function isInput(element) { | ||
| return element.tagName === 'INPUT'; | ||
| } | ||
| function inputRequiresValidityTracking(input) { | ||
| return input.type === 'date' || input.type === 'datetime-local' || input.type === 'month' || input.type === 'time' || input.type === 'week'; | ||
| } | ||
@@ -841,9 +885,12 @@ function customControlCreate(host, parent) { | ||
| function nativeControlCreate(host, parent, parseErrorsSource) { | ||
| function nativeControlCreate(host, parent, parseErrorsSource, validityMonitor) { | ||
| let updateMode = false; | ||
| const input = parent.nativeFormElement; | ||
| const parser = createParser(() => parent.state().value(), rawValue => parent.state().controlValue.set(rawValue), () => getNativeControlValue(input, parent.state().value)); | ||
| const parser = createParser(() => parent.state().value(), rawValue => parent.state().controlValue.set(rawValue), _rawValue => getNativeControlValue(input, parent.state().value, validityMonitor)); | ||
| parseErrorsSource.set(parser.errors); | ||
| host.listenToDom('input', () => parser.setRawValue(undefined)); | ||
| host.listenToDom('blur', () => parent.state().markAsTouched()); | ||
| if (isInput(input) && inputRequiresValidityTracking(input)) { | ||
| validityMonitor.watchValidity(input, () => parser.setRawValue(undefined)); | ||
| } | ||
| parent.registerAsBinding(); | ||
@@ -878,2 +925,108 @@ if (input.tagName === 'SELECT') { | ||
| class InputValidityMonitor { | ||
| static ɵfac = i0.ɵɵngDeclareFactory({ | ||
| minVersion: "12.0.0", | ||
| version: "22.0.0-next.5", | ||
| ngImport: i0, | ||
| type: InputValidityMonitor, | ||
| deps: [], | ||
| target: i0.ɵɵFactoryTarget.Injectable | ||
| }); | ||
| static ɵprov = i0.ɵɵngDeclareInjectable({ | ||
| minVersion: "12.0.0", | ||
| version: "22.0.0-next.5", | ||
| ngImport: i0, | ||
| type: InputValidityMonitor, | ||
| providedIn: 'root', | ||
| useClass: i0.forwardRef(() => AnimationInputValidityMonitor) | ||
| }); | ||
| } | ||
| i0.ɵɵngDeclareClassMetadata({ | ||
| minVersion: "12.0.0", | ||
| version: "22.0.0-next.5", | ||
| ngImport: i0, | ||
| type: InputValidityMonitor, | ||
| decorators: [{ | ||
| type: Injectable, | ||
| args: [{ | ||
| providedIn: 'root', | ||
| useClass: forwardRef(() => AnimationInputValidityMonitor) | ||
| }] | ||
| }] | ||
| }); | ||
| class AnimationInputValidityMonitor extends InputValidityMonitor { | ||
| document = inject(DOCUMENT); | ||
| cspNonce = inject(CSP_NONCE, { | ||
| optional: true | ||
| }); | ||
| isBrowser = isPlatformBrowser(inject(PLATFORM_ID)); | ||
| injectedStyles = new WeakMap(); | ||
| watchValidity(element, callback) { | ||
| if (!this.isBrowser) { | ||
| return; | ||
| } | ||
| const rootNode = element.getRootNode(); | ||
| if (!this.injectedStyles.has(rootNode)) { | ||
| this.injectedStyles.set(rootNode, this.createTransitionStyle(rootNode)); | ||
| } | ||
| element.addEventListener('animationstart', event => { | ||
| const animationEvent = event; | ||
| if (animationEvent.animationName === 'ng-valid' || animationEvent.animationName === 'ng-invalid') { | ||
| callback(); | ||
| } | ||
| }); | ||
| } | ||
| isBadInput(element) { | ||
| return element.validity?.badInput ?? false; | ||
| } | ||
| createTransitionStyle(rootNode) { | ||
| const element = this.document.createElement('style'); | ||
| if (this.cspNonce) { | ||
| element.nonce = this.cspNonce; | ||
| } | ||
| element.textContent = ` | ||
| @keyframes ng-valid {} | ||
| @keyframes ng-invalid {} | ||
| input:valid, textarea:valid { | ||
| animation: ng-valid 0.001s; | ||
| } | ||
| input:invalid, textarea:invalid { | ||
| animation: ng-invalid 0.001s; | ||
| } | ||
| `; | ||
| if (rootNode.nodeType === 9) { | ||
| rootNode.head?.appendChild(element); | ||
| } else { | ||
| rootNode.appendChild(element); | ||
| } | ||
| return element; | ||
| } | ||
| ngOnDestroy() { | ||
| this.injectedStyles.get(this.document)?.remove(); | ||
| } | ||
| static ɵfac = i0.ɵɵngDeclareFactory({ | ||
| minVersion: "12.0.0", | ||
| version: "22.0.0-next.5", | ||
| ngImport: i0, | ||
| type: AnimationInputValidityMonitor, | ||
| deps: null, | ||
| target: i0.ɵɵFactoryTarget.Injectable | ||
| }); | ||
| static ɵprov = i0.ɵɵngDeclareInjectable({ | ||
| minVersion: "12.0.0", | ||
| version: "22.0.0-next.5", | ||
| ngImport: i0, | ||
| type: AnimationInputValidityMonitor | ||
| }); | ||
| } | ||
| i0.ɵɵngDeclareClassMetadata({ | ||
| minVersion: "12.0.0", | ||
| version: "22.0.0-next.5", | ||
| ngImport: i0, | ||
| type: AnimationInputValidityMonitor, | ||
| decorators: [{ | ||
| type: Injectable | ||
| }] | ||
| }); | ||
| const ɵNgFieldDirective = Symbol(); | ||
@@ -907,2 +1060,3 @@ const FORM_FIELD = new InjectionToken(typeof ngDevMode !== 'undefined' && ngDevMode ? 'FORM_FIELD' : ''); | ||
| }); | ||
| validityMonitor = inject(InputValidityMonitor); | ||
| parseErrorsSource = signal(undefined, ...(ngDevMode ? [{ | ||
@@ -995,3 +1149,3 @@ debugName: "parseErrorsSource" | ||
| } else if (this.elementIsNativeFormElement) { | ||
| this.ɵngControlUpdate = nativeControlCreate(host, this, this.parseErrorsSource); | ||
| this.ɵngControlUpdate = nativeControlCreate(host, this, this.parseErrorsSource, this.validityMonitor); | ||
| } else { | ||
@@ -1024,3 +1178,3 @@ throw new _RuntimeError(1914, typeof ngDevMode !== 'undefined' && ngDevMode && `${host.descriptor} is an invalid [formField] directive host. The host must be a native form control ` + `(such as <input>', '<select>', or '<textarea>') or a custom form control with a 'value' or ` + `'checked' model.`); | ||
| minVersion: "12.0.0", | ||
| version: "22.0.0-next.4", | ||
| version: "22.0.0-next.5", | ||
| ngImport: i0, | ||
@@ -1033,3 +1187,3 @@ type: FormField, | ||
| minVersion: "17.1.0", | ||
| version: "22.0.0-next.4", | ||
| version: "22.0.0-next.5", | ||
| type: FormField, | ||
@@ -1066,3 +1220,3 @@ isStandalone: true, | ||
| minVersion: "12.0.0", | ||
| version: "22.0.0-next.4", | ||
| version: "22.0.0-next.5", | ||
| ngImport: i0, | ||
@@ -1108,7 +1262,13 @@ type: FormField, | ||
| event.preventDefault(); | ||
| submit(this.fieldTree()); | ||
| untracked(() => { | ||
| const fieldTree = this.fieldTree(); | ||
| const node = fieldTree(); | ||
| if (node.structure.fieldManager.submitOptions) { | ||
| submit(fieldTree); | ||
| } | ||
| }); | ||
| } | ||
| static ɵfac = i0.ɵɵngDeclareFactory({ | ||
| minVersion: "12.0.0", | ||
| version: "22.0.0-next.4", | ||
| version: "22.0.0-next.5", | ||
| ngImport: i0, | ||
@@ -1121,3 +1281,3 @@ type: FormRoot, | ||
| minVersion: "17.1.0", | ||
| version: "22.0.0-next.4", | ||
| version: "22.0.0-next.5", | ||
| type: FormRoot, | ||
@@ -1148,3 +1308,3 @@ isStandalone: true, | ||
| minVersion: "12.0.0", | ||
| version: "22.0.0-next.4", | ||
| version: "22.0.0-next.5", | ||
| ngImport: i0, | ||
@@ -1174,3 +1334,3 @@ type: FormRoot, | ||
| export { BaseNgValidationError, EmailValidationError, FORM_FIELD, FormField, FormRoot, MAX, MAX_LENGTH, MIN, MIN_LENGTH, MaxLengthValidationError, MaxValidationError, MinLengthValidationError, MinValidationError, NativeInputParseError, NgValidationError, PATTERN, PatternValidationError, REQUIRED, RequiredValidationError, StandardSchemaValidationError, createManagedMetadataKey, createMetadataKey, debounce, disabled, email, emailError, hidden, max, maxError, maxLength, maxLengthError, metadata, min, minError, minLength, minLengthError, pattern, patternError, provideSignalFormsConfig, readonly, required, requiredError, standardSchemaError, submit, transformedValue, validate, validateAsync, validateHttp, validateStandardSchema, validateTree, ɵNgFieldDirective }; | ||
| export { BaseNgValidationError, EmailValidationError, FORM_FIELD, FormField, FormRoot, IS_ASYNC_VALIDATION_RESOURCE, MAX, MAX_LENGTH, MIN, MIN_LENGTH, MaxLengthValidationError, MaxValidationError, MinLengthValidationError, MinValidationError, NativeInputParseError, NgValidationError, PATTERN, PatternValidationError, REQUIRED, RequiredValidationError, StandardSchemaValidationError, createManagedMetadataKey, createMetadataKey, debounce, disabled, email, emailError, hidden, max, maxError, maxLength, maxLengthError, metadata, min, minError, minLength, minLengthError, pattern, patternError, provideSignalFormsConfig, readonly, required, requiredError, standardSchemaError, submit, transformedValue, validate, validateAsync, validateHttp, validateStandardSchema, validateTree, ɵNgFieldDirective }; | ||
| //# sourceMappingURL=signals.mjs.map |
+4
-4
| { | ||
| "name": "@angular/forms", | ||
| "version": "22.0.0-next.4", | ||
| "version": "22.0.0-next.5", | ||
| "description": "Angular - directives and services for creating forms", | ||
@@ -15,5 +15,5 @@ "author": "angular", | ||
| "peerDependencies": { | ||
| "@angular/core": "22.0.0-next.4", | ||
| "@angular/common": "22.0.0-next.4", | ||
| "@angular/platform-browser": "22.0.0-next.4", | ||
| "@angular/core": "22.0.0-next.5", | ||
| "@angular/common": "22.0.0-next.5", | ||
| "@angular/platform-browser": "22.0.0-next.5", | ||
| "rxjs": "^6.5.3 || ^7.4.0" | ||
@@ -20,0 +20,0 @@ }, |
| /** | ||
| * @license Angular v22.0.0-next.4 | ||
| * @license Angular v22.0.0-next.5 | ||
| * (c) 2010-2026 Google LLC. https://angular.dev/ | ||
@@ -4,0 +4,0 @@ * License: MIT |
+14
-4
| /** | ||
| * @license Angular v22.0.0-next.4 | ||
| * @license Angular v22.0.0-next.5 | ||
| * (c) 2010-2026 Google LLC. https://angular.dev/ | ||
@@ -8,5 +8,5 @@ * License: MIT | ||
| import * as i0 from '@angular/core'; | ||
| import { Signal, ResourceRef, InputSignal, InputSignalWithTransform, OutputRef, ModelSignal, WritableSignal } from '@angular/core'; | ||
| import { DebounceTimer, Signal, ResourceRef, InputSignal, InputSignalWithTransform, OutputRef, ModelSignal, WritableSignal } from '@angular/core'; | ||
| import { PathKind, SchemaPath, SchemaPathRules, LogicFn, OneOrMany, ValidationError, FieldValidator, FieldContext, TreeValidationResult, TreeValidator, WithOptionalFieldTree, DisabledReason, Debouncer, FieldTree } from './_structure-chunk.js'; | ||
| 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'; | ||
| export { AsyncValidationResult, BaseNgValidationError, ChildFieldContext, CompatFieldState, CompatSchemaPath, EmailValidationError, FORM_FIELD, Field, FieldState, FieldStateByMode, FormField, FormFieldBinding, FormFieldBindingOptions, FormOptions, FormSubmitOptions, IS_ASYNC_VALIDATION_RESOURCE, 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'; | ||
| import { HttpResourceRequest, HttpResourceOptions } from '@angular/common/http'; | ||
@@ -272,2 +272,7 @@ import '@angular/forms'; | ||
| /** | ||
| * Duration in milliseconds to wait before triggering the async operation, or a function that | ||
| * returns a promise that resolves when the update should proceed. | ||
| */ | ||
| readonly debounce?: DebounceTimer<TParams | undefined>; | ||
| /** | ||
| * A function that receives the resource params and returns a resource of the given params. | ||
@@ -357,2 +362,7 @@ * The given params should be used as is to create the resource. | ||
| readonly options?: HttpResourceOptions<TResult, unknown>; | ||
| /** | ||
| * Duration in milliseconds to wait before triggering the async operation, or a function that | ||
| * returns a promise that resolves when the update should proceed. | ||
| */ | ||
| readonly debounce?: DebounceTimer<string | HttpResourceRequest | undefined>; | ||
| } | ||
@@ -650,3 +660,3 @@ /** | ||
| * 2. Listens for the `submit` event, prevents the default behavior, and calls `submit()` on the | ||
| * `FieldTree`. | ||
| * `FieldTree` if it defines its own submission options. | ||
| * | ||
@@ -653,0 +663,0 @@ * @usageNotes |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
1674620
1.82%17716
1.64%89
-1.11%