@ng-forge/dynamic-forms 1.2.0-next.1 → 1.2.0-next.10

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.
Files changed (50) hide show
  1. package/README.md +11 -11
  2. package/fesm2022/{ng-forge-dynamic-forms-array-field.component-BVnXnaNw.mjs → ng-forge-dynamic-forms-array-field.component-CSCKq_1K.mjs} +9 -13
  3. package/fesm2022/ng-forge-dynamic-forms-array-field.component-CSCKq_1K.mjs.map +1 -0
  4. package/fesm2022/{ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-CkqvXXs_.mjs → ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-CTOTwzzw.mjs} +29 -7
  5. package/fesm2022/ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-CTOTwzzw.mjs.map +1 -0
  6. package/fesm2022/ng-forge-dynamic-forms-bootstrap-web-mcp-BtjqeJOj.mjs +1054 -0
  7. package/fesm2022/ng-forge-dynamic-forms-bootstrap-web-mcp-BtjqeJOj.mjs.map +1 -0
  8. package/fesm2022/{ng-forge-dynamic-forms-container-field.component-CM1pY9v5.mjs → ng-forge-dynamic-forms-container-field.component-Dc3ROhHL.mjs} +14 -17
  9. package/fesm2022/ng-forge-dynamic-forms-container-field.component-Dc3ROhHL.mjs.map +1 -0
  10. package/fesm2022/{ng-forge-dynamic-forms-css-wrapper.component-D_yRuLpu.mjs → ng-forge-dynamic-forms-css-wrapper.component-BzgX8lAD.mjs} +5 -5
  11. package/fesm2022/ng-forge-dynamic-forms-css-wrapper.component-BzgX8lAD.mjs.map +1 -0
  12. package/fesm2022/ng-forge-dynamic-forms-debounce-C9F4v1Ke.mjs +17 -0
  13. package/fesm2022/ng-forge-dynamic-forms-debounce-C9F4v1Ke.mjs.map +1 -0
  14. package/fesm2022/ng-forge-dynamic-forms-field-errors-wrapper.component-CIKbWqYA.mjs +25 -0
  15. package/fesm2022/ng-forge-dynamic-forms-field-errors-wrapper.component-CIKbWqYA.mjs.map +1 -0
  16. package/fesm2022/ng-forge-dynamic-forms-form-schema.service-Dx5Dlb15.mjs +24 -0
  17. package/fesm2022/ng-forge-dynamic-forms-form-schema.service-Dx5Dlb15.mjs.map +1 -0
  18. package/fesm2022/{ng-forge-dynamic-forms-group-field.component-D4JhDffB.mjs → ng-forge-dynamic-forms-group-field.component-DAC3P9DC.mjs} +9 -13
  19. package/fesm2022/ng-forge-dynamic-forms-group-field.component-DAC3P9DC.mjs.map +1 -0
  20. package/fesm2022/ng-forge-dynamic-forms-integration.mjs +43 -105
  21. package/fesm2022/ng-forge-dynamic-forms-integration.mjs.map +1 -1
  22. package/fesm2022/ng-forge-dynamic-forms-internal.mjs +290 -116
  23. package/fesm2022/ng-forge-dynamic-forms-internal.mjs.map +1 -1
  24. package/fesm2022/{ng-forge-dynamic-forms-ng-forge-dynamic-forms-ZiNaCWHl.mjs → ng-forge-dynamic-forms-ng-forge-dynamic-forms-CXQe_5td.mjs} +1871 -1632
  25. package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-CXQe_5td.mjs.map +1 -0
  26. package/fesm2022/{ng-forge-dynamic-forms-page-field.component-Wbz6S8iH.mjs → ng-forge-dynamic-forms-page-field.component-DPKJcwUO.mjs} +57 -16
  27. package/fesm2022/ng-forge-dynamic-forms-page-field.component-DPKJcwUO.mjs.map +1 -0
  28. package/fesm2022/{ng-forge-dynamic-forms-row-wrapper.component-BBWmqQA_.mjs → ng-forge-dynamic-forms-row-wrapper.component-DMEeKZny.mjs} +5 -5
  29. package/fesm2022/ng-forge-dynamic-forms-row-wrapper.component-DMEeKZny.mjs.map +1 -0
  30. package/fesm2022/ng-forge-dynamic-forms-schema-builder-BvDTzfdM.mjs +570 -0
  31. package/fesm2022/ng-forge-dynamic-forms-schema-builder-BvDTzfdM.mjs.map +1 -0
  32. package/fesm2022/{ng-forge-dynamic-forms-text-field.component-C-f80sbk.mjs → ng-forge-dynamic-forms-text-field.component-BB-jutBq.mjs} +4 -4
  33. package/fesm2022/{ng-forge-dynamic-forms-text-field.component-C-f80sbk.mjs.map → ng-forge-dynamic-forms-text-field.component-BB-jutBq.mjs.map} +1 -1
  34. package/fesm2022/ng-forge-dynamic-forms.mjs +2 -2
  35. package/package.json +2 -2
  36. package/types/ng-forge-dynamic-forms-integration.d.ts +7 -31
  37. package/types/ng-forge-dynamic-forms-internal.d.ts +669 -308
  38. package/types/ng-forge-dynamic-forms.d.ts +287 -33
  39. package/fesm2022/ng-forge-dynamic-forms-array-field.component-BVnXnaNw.mjs.map +0 -1
  40. package/fesm2022/ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-CkqvXXs_.mjs.map +0 -1
  41. package/fesm2022/ng-forge-dynamic-forms-container-field.component-CM1pY9v5.mjs.map +0 -1
  42. package/fesm2022/ng-forge-dynamic-forms-container-utils-BZFz6ztF.mjs +0 -24
  43. package/fesm2022/ng-forge-dynamic-forms-container-utils-BZFz6ztF.mjs.map +0 -1
  44. package/fesm2022/ng-forge-dynamic-forms-css-wrapper.component-D_yRuLpu.mjs.map +0 -1
  45. package/fesm2022/ng-forge-dynamic-forms-emit-initialization-DhHwU6FJ.mjs +0 -17
  46. package/fesm2022/ng-forge-dynamic-forms-emit-initialization-DhHwU6FJ.mjs.map +0 -1
  47. package/fesm2022/ng-forge-dynamic-forms-group-field.component-D4JhDffB.mjs.map +0 -1
  48. package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-ZiNaCWHl.mjs.map +0 -1
  49. package/fesm2022/ng-forge-dynamic-forms-page-field.component-Wbz6S8iH.mjs.map +0 -1
  50. package/fesm2022/ng-forge-dynamic-forms-row-wrapper.component-BBWmqQA_.mjs.map +0 -1
@@ -1,12 +1,12 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, computed, isSignal, inject, Injector, input, signal, ChangeDetectionStrategy, Component, untracked, Injectable, linkedSignal, resourceFromSnapshots, Pipe } from '@angular/core';
2
+ import { InjectionToken, computed, isSignal, inject, Injector, input, signal, ChangeDetectionStrategy, Component, untracked, Injectable, linkedSignal, resourceFromSnapshots, Pipe, viewChild, ViewContainerRef, Directive, forwardRef } from '@angular/core';
3
3
  import { NgComponentOutlet } from '@angular/common';
4
4
  import { explicitEffect } from 'ngxtension/explicit-effect';
5
5
  import { toSignal, toObservable, rxResource } from '@angular/core/rxjs-interop';
6
6
  import { isObservable, defer, combineLatest, pipe, debounceTime, distinctUntilChanged, map, tap, catchError, of, from, startWith, Subject, filter, TimeoutError, throwError } from 'rxjs';
7
7
  import { HttpClient } from '@angular/common/http';
8
- import { email, min, max, minLength, maxLength, pattern, required, validate, validateAsync, validateHttp } from '@angular/forms/signals';
9
- import { scan, map as map$1, filter as filter$1, take, switchMap, timeout, catchError as catchError$1, shareReplay } from 'rxjs/operators';
8
+ import { switchMap, map as map$1, scan, filter as filter$1, take, timeout, catchError as catchError$1, shareReplay } from 'rxjs/operators';
9
+ import { email, min, max, minLength, maxLength, pattern, required, validateTree, validate, validateAsync, validateHttp } from '@angular/forms/signals';
10
10
 
11
11
  const ADDON_TYPE_DEFINITIONS = new InjectionToken('ADDON_TYPE_DEFINITIONS');
12
12
 
@@ -155,14 +155,14 @@ class DfAddonSlot {
155
155
  });
156
156
  });
157
157
  }
158
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: DfAddonSlot, deps: [], target: i0.ɵɵFactoryTarget.Component });
159
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.1", type: DfAddonSlot, isStandalone: true, selector: "df-addon-slot", inputs: { addon: { classPropertyName: "addon", publicName: "addon", isSignal: true, isRequired: true, transformFunction: null }, fieldInputs: { classPropertyName: "fieldInputs", publicName: "fieldInputs", isSignal: true, isRequired: false, transformFunction: null }, hidden: { classPropertyName: "hidden", publicName: "hidden", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.slot": "slotAttr()", "class": "className()", "style.display": "isHidden() ? \"none\" : null" } }, ngImport: i0, template: `
158
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DfAddonSlot, deps: [], target: i0.ɵɵFactoryTarget.Component });
159
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: DfAddonSlot, isStandalone: true, selector: "df-addon-slot", inputs: { addon: { classPropertyName: "addon", publicName: "addon", isSignal: true, isRequired: true, transformFunction: null }, fieldInputs: { classPropertyName: "fieldInputs", publicName: "fieldInputs", isSignal: true, isRequired: false, transformFunction: null }, hidden: { classPropertyName: "hidden", publicName: "hidden", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.slot": "slotAttr()", "class": "className()", "style.display": "isHidden() ? \"none\" : null" } }, ngImport: i0, template: `
160
160
  @if (resolvedComponent(); as cmp) {
161
161
  <ng-container *ngComponentOutlet="cmp; inputs: typeInputs()" />
162
162
  }
163
163
  `, isInline: true, dependencies: [{ kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
164
164
  }
165
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: DfAddonSlot, decorators: [{
165
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DfAddonSlot, decorators: [{
166
166
  type: Component,
167
167
  args: [{
168
168
  selector: 'df-addon-slot',
@@ -295,7 +295,11 @@ function hasTargetProperty(config) {
295
295
  }
296
296
 
297
297
  const FORM_VALUE_ACCESS_PATTERN = /\bformValue\s*(?:\.|\[)/;
298
- const FORM_VALUE_PATTERN = /\bformValue\s*(?:\.([\w.]+)|\[\s*'([\w.-]+)'\s*\]|\[\s*"([\w.-]+)"\s*\])/g;
298
+ const ID_START = String.raw `[\p{ID_Start}$_]`;
299
+ const ID_PART = String.raw `[\p{ID_Continue}$]`;
300
+ const DOTTED_PATH = String.raw `${ID_START}${ID_PART}*(?:\.${ID_START}${ID_PART}*)*`;
301
+ const BRACKET_KEY = String.raw `[\p{ID_Continue}$.\-]+`;
302
+ const FORM_VALUE_PATTERN = new RegExp(String.raw `\bformValue\s*(?:\.(${DOTTED_PATH})|\[\s*'(${BRACKET_KEY})'\s*\]|\[\s*"(${BRACKET_KEY})"\s*\])`, 'gu');
299
303
  function isCrossFieldExpression(expr, context) {
300
304
  if (expr === undefined || typeof expr === 'boolean' || isFormStateCondition(expr)) {
301
305
  return false;
@@ -576,6 +580,8 @@ class ExpressionParserError extends DynamicFormError {
576
580
  }
577
581
  }
578
582
 
583
+ const IDENTIFIER_START = /[\p{ID_Start}$_]/u;
584
+ const IDENTIFIER_PART = /[\p{ID_Continue}$]/u;
579
585
  class Tokenizer {
580
586
  position = 0;
581
587
  expression;
@@ -608,7 +614,7 @@ class Tokenizer {
608
614
  if (/[0-9]/.test(char)) {
609
615
  return this.readNumber();
610
616
  }
611
- if (/[a-zA-Z_$]/.test(char)) {
617
+ if (IDENTIFIER_START.test(this.codePointAt(this.position))) {
612
618
  return this.readIdentifierOrKeyword();
613
619
  }
614
620
  return this.readOperatorOrPunctuation();
@@ -667,12 +673,20 @@ class Tokenizer {
667
673
  readIdentifierOrKeyword() {
668
674
  const start = this.position;
669
675
  let value = '';
670
- while (this.position < this.expression.length && /[a-zA-Z0-9_$]/.test(this.expression[this.position])) {
671
- value += this.expression[this.position];
672
- this.position++;
676
+ while (this.position < this.expression.length) {
677
+ const char = this.codePointAt(this.position);
678
+ if (!IDENTIFIER_PART.test(char)) {
679
+ break;
680
+ }
681
+ value += char;
682
+ this.position += char.length;
673
683
  }
674
684
  const type = this.getKeywordType(value);
675
685
  return { type, value, position: start };
686
+ }
687
+ codePointAt(position) {
688
+ const codePoint = this.expression.codePointAt(position);
689
+ return codePoint === undefined ? '' : String.fromCodePoint(codePoint);
676
690
  }
677
691
  getKeywordType(value) {
678
692
  switch (value) {
@@ -1562,10 +1576,14 @@ function safeReadPathKeys(fieldContext) {
1562
1576
  }
1563
1577
 
1564
1578
  function createFieldValueProxy(getRootForm, getRootFormValue) {
1565
- const readField = (key) => {
1579
+ const resolveAccessor = (key) => {
1566
1580
  const root = getRootForm();
1567
1581
  const accessor = root?.[key];
1568
- if (typeof accessor === 'function') {
1582
+ return typeof accessor === 'function' ? accessor : undefined;
1583
+ };
1584
+ const readField = (key) => {
1585
+ const accessor = resolveAccessor(key);
1586
+ if (accessor) {
1569
1587
  const state = untracked(() => accessor());
1570
1588
  const valueSig = state && state.value;
1571
1589
  if (typeof valueSig === 'function') {
@@ -1584,8 +1602,7 @@ function createFieldValueProxy(getRootForm, getRootFormValue) {
1584
1602
  has(_target, prop) {
1585
1603
  if (typeof prop === 'symbol')
1586
1604
  return false;
1587
- const root = getRootForm();
1588
- if (root && prop in root)
1605
+ if (resolveAccessor(prop))
1589
1606
  return true;
1590
1607
  return prop in getRootFormValue();
1591
1608
  },
@@ -1887,10 +1904,10 @@ class FieldContextRegistryService {
1887
1904
  },
1888
1905
  };
1889
1906
  }
1890
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: FieldContextRegistryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1891
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: FieldContextRegistryService });
1907
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: FieldContextRegistryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1908
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: FieldContextRegistryService });
1892
1909
  }
1893
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: FieldContextRegistryService, decorators: [{
1910
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: FieldContextRegistryService, decorators: [{
1894
1911
  type: Injectable
1895
1912
  }] });
1896
1913
 
@@ -2019,10 +2036,10 @@ class FunctionRegistryService {
2019
2036
  this.clearAsyncValidators();
2020
2037
  this.clearHttpValidators();
2021
2038
  }
2022
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: FunctionRegistryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2023
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: FunctionRegistryService });
2039
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: FunctionRegistryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2040
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: FunctionRegistryService });
2024
2041
  }
2025
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: FunctionRegistryService, decorators: [{
2042
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: FunctionRegistryService, decorators: [{
2026
2043
  type: Injectable
2027
2044
  }] });
2028
2045
 
@@ -2648,6 +2665,187 @@ function injectNonFieldEvaluationContext(fieldDef, options = {}) {
2648
2665
  };
2649
2666
  }
2650
2667
 
2668
+ function dynamicTextToObservable(value, injector) {
2669
+ if (value === undefined) {
2670
+ return of('');
2671
+ }
2672
+ if (isObservable(value)) {
2673
+ return value;
2674
+ }
2675
+ if (isSignal(value)) {
2676
+ return untracked(() => toObservable(value, { injector }));
2677
+ }
2678
+ return of(String(value));
2679
+ }
2680
+
2681
+ const PLACEHOLDER_PATTERN = /\{\{([^{}]*)\}\}/g;
2682
+ function interpolateParams(message, error) {
2683
+ const params = extractErrorParams(error);
2684
+ return message.replace(PLACEHOLDER_PATTERN, (placeholder, rawKey) => {
2685
+ const key = rawKey.trim();
2686
+ return Object.hasOwn(params, key) ? safeToString(params[key]) : placeholder;
2687
+ });
2688
+ }
2689
+ function safeToString(value) {
2690
+ if (value === null || value === undefined) {
2691
+ return '';
2692
+ }
2693
+ if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
2694
+ return String(value);
2695
+ }
2696
+ if (value instanceof RegExp) {
2697
+ return value.toString();
2698
+ }
2699
+ if (value instanceof Date) {
2700
+ return value.toISOString();
2701
+ }
2702
+ if (Array.isArray(value)) {
2703
+ return value.join(', ');
2704
+ }
2705
+ try {
2706
+ if (typeof value === 'object' && value.toString !== Object.prototype.toString) {
2707
+ return value.toString();
2708
+ }
2709
+ return JSON.stringify(value);
2710
+ }
2711
+ catch {
2712
+ return '[object]';
2713
+ }
2714
+ }
2715
+ function extractErrorParams(error) {
2716
+ const params = {};
2717
+ if ('min' in error)
2718
+ params.min = error.min;
2719
+ if ('max' in error)
2720
+ params.max = error.max;
2721
+ if ('pattern' in error)
2722
+ params.pattern = error.pattern;
2723
+ if ('actual' in error)
2724
+ params.actual = error.actual;
2725
+ if ('expected' in error)
2726
+ params.expected = error.expected;
2727
+ if ('requiredLength' in error) {
2728
+ params.requiredLength = error.requiredLength;
2729
+ }
2730
+ else if ('minLength' in error) {
2731
+ params.requiredLength = error.minLength;
2732
+ params.minLength = error.minLength;
2733
+ }
2734
+ else if ('maxLength' in error) {
2735
+ params.requiredLength = error.maxLength;
2736
+ params.maxLength = error.maxLength;
2737
+ }
2738
+ if ('actualLength' in error)
2739
+ params.actualLength = error.actualLength;
2740
+ Object.keys(error).forEach((key) => {
2741
+ if (key !== 'kind' && !(key in params)) {
2742
+ params[key] = error[key];
2743
+ }
2744
+ });
2745
+ return params;
2746
+ }
2747
+
2748
+ function createResolvedErrorsSignal(field, validationMessages, defaultValidationMessages = signal(undefined), injector = inject(Injector)) {
2749
+ const logger = injector.get(DynamicFormLogger);
2750
+ const messages = computed(() => validationMessages() ?? {}, /* @ts-ignore */
2751
+ ...(ngDevMode ? [{ debugName: "messages" }] : /* istanbul ignore next */ []));
2752
+ const defaultMessages = computed(() => defaultValidationMessages() ?? {}, /* @ts-ignore */
2753
+ ...(ngDevMode ? [{ debugName: "defaultMessages" }] : /* istanbul ignore next */ []));
2754
+ const errors = computed(() => field()?.().errors() ?? [], /* @ts-ignore */
2755
+ ...(ngDevMode ? [{ debugName: "errors" }] : /* istanbul ignore next */ []));
2756
+ const errors$ = toObservable(errors, { injector });
2757
+ const messages$ = toObservable(messages, { injector });
2758
+ const defaultMessages$ = toObservable(defaultMessages, { injector });
2759
+ const resolvedErrors$ = combineLatest([errors$, messages$, defaultMessages$]).pipe(switchMap(([currentErrors, msgs, defaultMsgs]) => {
2760
+ if (!currentErrors || currentErrors.length === 0) {
2761
+ return of([]);
2762
+ }
2763
+ const errorResolvers = currentErrors.map((error) => resolveErrorMessage(error, msgs, defaultMsgs, injector, logger));
2764
+ return errorResolvers.length > 0
2765
+ ? combineLatest(errorResolvers).pipe(map$1((errors) => errors.filter((e) => e !== null)))
2766
+ : of([]);
2767
+ }));
2768
+ return toSignal(resolvedErrors$, { initialValue: [], injector });
2769
+ }
2770
+ function isMessageResolver(message) {
2771
+ return typeof message === 'function' && !isSignal(message);
2772
+ }
2773
+ function resolveMessageFunction(resolver, error, logger) {
2774
+ try {
2775
+ return resolver(error) ?? error.message ?? '';
2776
+ }
2777
+ catch (err) {
2778
+ logger.error(`Validation message resolver for error kind "${error.kind}" threw; falling back to error.message.`, err);
2779
+ return error.message ?? '';
2780
+ }
2781
+ }
2782
+ function resolveErrorMessage(error, fieldMessages, defaultMessages, injector, logger) {
2783
+ const fieldMessage = fieldMessages[error.kind];
2784
+ const defaultMessage = defaultMessages[error.kind];
2785
+ const messageToUse = fieldMessage ?? defaultMessage ?? error.message;
2786
+ if (!messageToUse) {
2787
+ logger.warn(`No validation message found for error kind "${error.kind}". ` +
2788
+ `Please provide a message via field-level validationMessages or form-level defaultValidationMessages.`);
2789
+ return of(null);
2790
+ }
2791
+ const isSchemaMessage = fieldMessage === undefined && defaultMessage === undefined;
2792
+ const messageText = isMessageResolver(messageToUse) ? resolveMessageFunction(messageToUse, error, logger) : messageToUse;
2793
+ const messageObservable = isSchemaMessage
2794
+ ? of(messageToUse) : dynamicTextToObservable(messageText, injector);
2795
+ return messageObservable.pipe(map$1((msg) => ({
2796
+ kind: error.kind,
2797
+ message: interpolateParams(msg, error),
2798
+ })));
2799
+ }
2800
+
2801
+ function shouldShowErrors(field) {
2802
+ return computed(() => {
2803
+ const control = field()?.();
2804
+ if (!control)
2805
+ return false;
2806
+ return control.invalid() && control.touched() && control.errors().length > 0;
2807
+ });
2808
+ }
2809
+
2810
+ const FIELD_ERROR_DISPLAY = new InjectionToken('FIELD_ERROR_DISPLAY');
2811
+ function injectFieldErrors(options) {
2812
+ const injector = options.injector ?? inject(Injector);
2813
+ const defaultValidationMessages = inject(DEFAULT_VALIDATION_MESSAGES, { optional: true });
2814
+ const fieldSignalContext = inject(FIELD_SIGNAL_CONTEXT, { optional: true });
2815
+ const fieldState = computed(() => {
2816
+ const inputs = options.fieldInputs();
2817
+ if (!inputs)
2818
+ return undefined;
2819
+ if (inputs.field)
2820
+ return inputs.field;
2821
+ const parentTree = fieldSignalContext?.form;
2822
+ const node = inputs.key ? parentTree?.[inputs.key] : undefined;
2823
+ return node ? node() : undefined;
2824
+ }, /* @ts-ignore */
2825
+ ...(ngDevMode ? [{ debugName: "fieldState" }] : /* istanbul ignore next */ []));
2826
+ const fieldTree = computed(() => {
2827
+ const state = fieldState();
2828
+ return state ? (() => state) : undefined;
2829
+ }, /* @ts-ignore */
2830
+ ...(ngDevMode ? [{ debugName: "fieldTree" }] : /* istanbul ignore next */ []));
2831
+ const messages = computed(() => options.validationMessages?.() ?? options.fieldInputs()?.validationMessages, /* @ts-ignore */
2832
+ ...(ngDevMode ? [{ debugName: "messages" }] : /* istanbul ignore next */ []));
2833
+ const errors = createResolvedErrorsSignal(fieldTree, messages, computed(() => defaultValidationMessages?.()), injector);
2834
+ const showErrors = shouldShowErrors(fieldTree);
2835
+ return {
2836
+ errors,
2837
+ showErrors,
2838
+ errorsToDisplay: computed(() => (showErrors() ? errors() : [])),
2839
+ errorId: computed(() => `${options.fieldInputs()?.key ?? ''}-error`),
2840
+ };
2841
+ }
2842
+
2843
+ function rowError(ctx, index, key, error) {
2844
+ const rows = ctx.fieldTree;
2845
+ const fieldTree = rows?.[index]?.[key];
2846
+ return fieldTree ? { ...error, fieldTree } : error;
2847
+ }
2848
+
2651
2849
  function isFunctionHttpValidator(config) {
2652
2850
  const c = config;
2653
2851
  return typeof c.functionName === 'string' || (c.fn !== null && typeof c.fn === 'object');
@@ -2759,7 +2957,8 @@ function applyPatternValidator(path, value, expression, when) {
2759
2957
  function createConditionalLogic(when) {
2760
2958
  return when ? createLogicFunction(when) : undefined;
2761
2959
  }
2762
- function applyValidator(config, fieldPath) {
2960
+ function applyValidator(config,
2961
+ fieldPath, attachment = 'field') {
2763
2962
  const path = fieldPath;
2764
2963
  switch (config.type) {
2765
2964
  case 'required':
@@ -2806,7 +3005,7 @@ function applyValidator(config, fieldPath) {
2806
3005
  }
2807
3006
  break;
2808
3007
  case 'custom':
2809
- applyCustomValidator(config, path);
3008
+ applyCustomValidator(config, path, attachment);
2810
3009
  break;
2811
3010
  case 'async':
2812
3011
  applyAsyncValidator(config, path);
@@ -2816,7 +3015,7 @@ function applyValidator(config, fieldPath) {
2816
3015
  break;
2817
3016
  }
2818
3017
  }
2819
- function applyCustomValidator(config, fieldPath) {
3018
+ function applyCustomValidator(config, fieldPath, attachment = 'field') {
2820
3019
  let validatorFn;
2821
3020
  if (config.expression) {
2822
3021
  validatorFn = createExpressionValidator(config);
@@ -2828,11 +3027,16 @@ function applyCustomValidator(config, fieldPath) {
2828
3027
  throw new DynamicFormError('Custom validator requires one of "expression", "functionName", or "fn".');
2829
3028
  }
2830
3029
  const whenLogic = createConditionalLogic(config.when);
2831
- validate(fieldPath, (ctx) => {
3030
+ const run = (ctx) => {
2832
3031
  if (whenLogic && !whenLogic(ctx))
2833
3032
  return null;
2834
3033
  return validatorFn(ctx);
2835
- });
3034
+ };
3035
+ if (attachment === 'tree') {
3036
+ validateTree(fieldPath, run);
3037
+ return;
3038
+ }
3039
+ validate(fieldPath, run);
2836
3040
  }
2837
3041
  function createFunctionValidator(config) {
2838
3042
  const logger = inject(DynamicFormLogger);
@@ -2984,8 +3188,9 @@ function applyDeclarativeHttpValidator(config, fieldPath) {
2984
3188
  },
2985
3189
  });
2986
3190
  }
2987
- function applyValidators(configs, fieldPath) {
2988
- configs.forEach((config) => applyValidator(config, fieldPath));
3191
+ function applyValidators(configs,
3192
+ fieldPath, attachment = 'field') {
3193
+ configs.forEach((config) => applyValidator(config, fieldPath, attachment));
2989
3194
  }
2990
3195
 
2991
3196
  function isCheckedField(field) {
@@ -3141,10 +3346,10 @@ class EventBus {
3141
3346
  }
3142
3347
  return this.pipeline$.pipe(filter((event) => event.type === eventType));
3143
3348
  }
3144
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: EventBus, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
3145
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: EventBus });
3349
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EventBus, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
3350
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EventBus });
3146
3351
  }
3147
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: EventBus, decorators: [{
3352
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EventBus, decorators: [{
3148
3353
  type: Injectable
3149
3354
  }] });
3150
3355
 
@@ -3358,6 +3563,10 @@ const WRAPPER_COMPONENT_CACHE = new InjectionToken('WRAPPER_COMPONENT_CACHE', {
3358
3563
  providedIn: 'root',
3359
3564
  factory: () => new Map(),
3360
3565
  });
3566
+ const WRAPPER_COMPONENT_LOAD_CACHE = new InjectionToken('WRAPPER_COMPONENT_LOAD_CACHE', {
3567
+ providedIn: 'root',
3568
+ factory: () => new Map(),
3569
+ });
3361
3570
  const WRAPPER_AUTO_ASSOCIATIONS = new InjectionToken('WRAPPER_AUTO_ASSOCIATIONS', {
3362
3571
  providedIn: 'root',
3363
3572
  factory: () => new Map(),
@@ -3471,28 +3680,15 @@ function isDisplayOnlyField(field) {
3471
3680
  }
3472
3681
 
3473
3682
 
3474
- function dynamicTextToObservable(value, injector) {
3475
- if (value === undefined) {
3476
- return of('');
3477
- }
3478
- if (isObservable(value)) {
3479
- return value;
3480
- }
3481
- if (isSignal(value)) {
3482
- return untracked(() => toObservable(value, { injector }));
3483
- }
3484
- return of(String(value));
3485
- }
3486
-
3487
3683
  class DynamicTextPipe {
3488
3684
  injector = inject(Injector);
3489
3685
  transform(value) {
3490
3686
  return dynamicTextToObservable(value ?? undefined, this.injector);
3491
3687
  }
3492
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: DynamicTextPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
3493
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "22.0.1", ngImport: i0, type: DynamicTextPipe, isStandalone: true, name: "dynamicText" });
3688
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DynamicTextPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
3689
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "22.1.5", ngImport: i0, type: DynamicTextPipe, isStandalone: true, name: "dynamicText" });
3494
3690
  }
3495
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: DynamicTextPipe, decorators: [{
3691
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DynamicTextPipe, decorators: [{
3496
3692
  type: Pipe,
3497
3693
  args: [{
3498
3694
  name: 'dynamicText',
@@ -3545,75 +3741,15 @@ function setupInitializationTracking(options) {
3545
3741
  }), shareReplay({ bufferSize: 1, refCount: false }));
3546
3742
  }
3547
3743
 
3548
- function interpolateParams(message, error) {
3549
- let result = message;
3550
- const params = extractErrorParams(error);
3551
- Object.entries(params).forEach(([key, value]) => {
3552
- const placeholder = new RegExp(`{{\\s*${key}\\s*}}`, 'g');
3553
- result = result.replace(placeholder, safeToString(value));
3554
- });
3555
- return result;
3556
- }
3557
- function safeToString(value) {
3558
- if (value === null || value === undefined) {
3559
- return '';
3560
- }
3561
- if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
3562
- return String(value);
3563
- }
3564
- if (value instanceof RegExp) {
3565
- return value.toString();
3566
- }
3567
- if (value instanceof Date) {
3568
- return value.toISOString();
3569
- }
3570
- if (Array.isArray(value)) {
3571
- return value.join(', ');
3572
- }
3573
- try {
3574
- if (typeof value === 'object' && value.toString !== Object.prototype.toString) {
3575
- return value.toString();
3576
- }
3577
- return JSON.stringify(value);
3578
- }
3579
- catch {
3580
- return '[object]';
3581
- }
3582
- }
3583
- function extractErrorParams(error) {
3584
- const params = {};
3585
- if ('min' in error)
3586
- params.min = error.min;
3587
- if ('max' in error)
3588
- params.max = error.max;
3589
- if ('pattern' in error)
3590
- params.pattern = error.pattern;
3591
- if ('actual' in error)
3592
- params.actual = error.actual;
3593
- if ('expected' in error)
3594
- params.expected = error.expected;
3595
- if ('requiredLength' in error) {
3596
- params.requiredLength = error.requiredLength;
3597
- }
3598
- else if ('minLength' in error) {
3599
- params.requiredLength = error.minLength;
3600
- params.minLength = error.minLength;
3601
- }
3602
- else if ('maxLength' in error) {
3603
- params.requiredLength = error.maxLength;
3604
- params.maxLength = error.maxLength;
3605
- }
3606
- if ('actualLength' in error)
3607
- params.actualLength = error.actualLength;
3608
- Object.keys(error).forEach((key) => {
3609
- if (key !== 'kind' && !(key in params)) {
3610
- params[key] = error[key];
3611
- }
3612
- });
3613
- return params;
3614
- }
3615
-
3616
3744
  function isEqual(a, b) {
3745
+ if (a === b)
3746
+ return true;
3747
+ if (typeof a === 'number' && typeof b === 'number')
3748
+ return Object.is(a, b);
3749
+ if (a == null || b == null)
3750
+ return false;
3751
+ if (typeof a !== 'object' || typeof b !== 'object')
3752
+ return Object.is(a, b);
3617
3753
  return isEqualInternal(a, b, new WeakMap(), new WeakMap());
3618
3754
  }
3619
3755
  function isEqualInternal(a, b, seenA, seenB) {
@@ -3775,6 +3911,22 @@ function memoize(fn, resolverOrOptions) {
3775
3911
  function normalizeFieldsArray(fields) {
3776
3912
  return Array.isArray(fields) ? [...fields] : Object.values(fields);
3777
3913
  }
3914
+ function getChangedKeysWithin(previous, current, keys) {
3915
+ const changed = new Set();
3916
+ if (keys.size === 0)
3917
+ return changed;
3918
+ const before = previous ?? {};
3919
+ const after = current ?? {};
3920
+ for (const key of keys) {
3921
+ const inBefore = key in before;
3922
+ const inAfter = key in after;
3923
+ if (!inBefore && !inAfter)
3924
+ continue;
3925
+ if (inBefore !== inAfter || !isEqual(before[key], after[key]))
3926
+ changed.add(key);
3927
+ }
3928
+ return changed;
3929
+ }
3778
3930
  function getChangedKeys(previous, current) {
3779
3931
  const changedKeys = new Set();
3780
3932
  if (!previous && !current)
@@ -3807,7 +3959,29 @@ function createWarningTracker() {
3807
3959
  return { warnedKeys: new Set() };
3808
3960
  }
3809
3961
 
3962
+ class FieldErrorsWrapperBase {
3963
+ fieldComponent = viewChild.required('fieldComponent', { ...(ngDevMode ? { debugName: "fieldComponent" } : /* istanbul ignore next */ {}), read: ViewContainerRef });
3964
+ validationMessages = input(/* @ts-ignore */
3965
+ ...(ngDevMode ? [undefined, { debugName: "validationMessages" }] : /* istanbul ignore next */ []));
3966
+ fieldInputs = input(/* @ts-ignore */
3967
+ ...(ngDevMode ? [undefined, { debugName: "fieldInputs" }] : /* istanbul ignore next */ []));
3968
+ claimedKey = computed(() => this.fieldInputs()?.key, /* @ts-ignore */
3969
+ ...(ngDevMode ? [{ debugName: "claimedKey" }] : /* istanbul ignore next */ []));
3970
+ ngf = injectFieldErrors({
3971
+ fieldInputs: this.fieldInputs,
3972
+ validationMessages: this.validationMessages,
3973
+ });
3974
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: FieldErrorsWrapperBase, deps: [], target: i0.ɵɵFactoryTarget.Directive });
3975
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "22.1.5", type: FieldErrorsWrapperBase, isStandalone: true, inputs: { validationMessages: { classPropertyName: "validationMessages", publicName: "validationMessages", isSignal: true, isRequired: false, transformFunction: null }, fieldInputs: { classPropertyName: "fieldInputs", publicName: "fieldInputs", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "fieldComponent", first: true, predicate: ["fieldComponent"], descendants: true, read: ViewContainerRef, isSignal: true }], ngImport: i0 });
3976
+ }
3977
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: FieldErrorsWrapperBase, decorators: [{
3978
+ type: Directive
3979
+ }], propDecorators: { fieldComponent: [{ type: i0.ViewChild, args: ['fieldComponent', { ...{ read: ViewContainerRef }, isSignal: true }] }], validationMessages: [{ type: i0.Input, args: [{ isSignal: true, alias: "validationMessages", required: false }] }], fieldInputs: [{ type: i0.Input, args: [{ isSignal: true, alias: "fieldInputs", required: false }] }] } });
3980
+ function provideFieldErrorDisplay(wrapper) {
3981
+ return { provide: FIELD_ERROR_DISPLAY, useExisting: forwardRef(wrapper) };
3982
+ }
3983
+
3810
3984
 
3811
3985
 
3812
- export { ADDON_ACTION_HANDLERS, ADDON_ACTION_REGISTRY, ADDON_TYPE_COMPONENT_CACHE, ADDON_TYPE_DEFINITIONS, ADDON_TYPE_REGISTRY, ARRAY_CONTEXT, AsyncConditionFunctionCacheService, ComponentInitializedEvent, DEFAULT_PROPS, DEFAULT_VALIDATION_MESSAGES, DEFAULT_WRAPPERS, DEPRECATION_WARNING_TRACKER, DF_FIELD_TEMPLATES, DfAddonSlot, DynamicFormError, DynamicFormLogger, DynamicTextPipe, DynamicValueFunctionCacheService, EMIT_FORM_VALUE_ON_EVENTS, EXTERNAL_DATA, EventBus, ExpressionParser, ExpressionParserError, FIELD_REGISTRY, FIELD_SIGNAL_CONTEXT, FORM_ID_PREFIX, FORM_OPTIONS, FieldContextRegistryService, FunctionRegistryService, GROUP_CONTEXT, HTTP_CONDITION_CACHE, HttpConditionCache, HttpConditionFunctionCacheService, INITIALIZATION_TIMEOUT_MS, LogicFunctionCacheService, NoopLogger, READONLY_FIELD_TREE_CACHE, RootFormRegistryService, TokenType, WRAPPER_AUTO_ASSOCIATIONS, WRAPPER_COMPONENT_CACHE, WRAPPER_REGISTRY, applyMetaToElement, applyValidator, applyValidators, arrayFieldMapper, assertNever, baseFieldMapper, buildBaseInputs, buildClassName, compareValues, containerFieldMapper, createAddonActionRegistry, createDebouncedLogicFunction, createDefaultDerivationLogConfig, createDynamicValueFunction, createFieldValueProxy, createFormFieldStateMap, createFormStateLogicFunction, createInitializationTracker, createLogicFunction, createWarningTracker, deepMergeDefaults, derivedFromDeferred, detectFormMode, dynamicTextToObservable, evaluateCondition, evaluateNonFieldDisabled, evaluateNonFieldHidden, extractExpressionDependencies, extractStringDependencies, getArrayLength, getChangedKeys, getFieldValueHandling, getGridClassString, getNestedValue, groupFieldMapper, hasChildFields, hasCrossFieldWhenCondition, hasFormValue, hasNestedProperty, hasTargetProperty, injectAddonTypeRegistry, injectFieldSignalContext, injectFieldsSupportingAddons, injectNonFieldEvaluationContext, interpolateParams, isArrayField, isCheckedField, isContainerField, isCrossFieldBuiltInValidator, isCrossFieldExpression, isCrossFieldSchema, isCrossFieldStateLogic, isCrossFieldValidator, isDerivationLogicConfig, isDisplayOnlyField, isEqual, isFieldBoundContext, isFormStateCondition, isFunctionHttpValidator, isGenericContainerField, isGroupField, isHiddenField, isLeafField, isNonPagedForm, isPageField, isPagedForm, isResourceBasedValidator, isRowField, isSimplifiedArrayField, isStateLogicConfig, isValidNonPagedForm, isValidPagedForm, isValueBearingField, isValueField, isWrapperTypeDefinition, keyBy, mapValues, memoize, normalizeFieldsArray, omit, pageFieldMapper, readFieldStateInfo, resolveDynamicValue, resolveHttpRequest, resolveNextButtonDisabled, resolveNonFieldDisabled, resolveNonFieldHidden, resolveSubmitButtonDisabled, resolveTokens, rowFieldMapper, runPresetAction, setupInitializationTracking, shouldLog, textFieldMapper, toReadonlyFieldTree, toReadonlyFieldTreeCached, validatePageNesting, withPreviousValue, writeToFieldValue };
3986
+ export { ADDON_ACTION_HANDLERS, ADDON_ACTION_REGISTRY, ADDON_TYPE_COMPONENT_CACHE, ADDON_TYPE_DEFINITIONS, ADDON_TYPE_REGISTRY, ARRAY_CONTEXT, AsyncConditionFunctionCacheService, ComponentInitializedEvent, DEFAULT_PROPS, DEFAULT_VALIDATION_MESSAGES, DEFAULT_WRAPPERS, DEPRECATION_WARNING_TRACKER, DF_FIELD_TEMPLATES, DfAddonSlot, DynamicFormError, DynamicFormLogger, DynamicTextPipe, DynamicValueFunctionCacheService, EMIT_FORM_VALUE_ON_EVENTS, EXTERNAL_DATA, EventBus, ExpressionParser, ExpressionParserError, FIELD_ERROR_DISPLAY, FIELD_REGISTRY, FIELD_SIGNAL_CONTEXT, FORM_ID_PREFIX, FORM_OPTIONS, FieldContextRegistryService, FieldErrorsWrapperBase, FunctionRegistryService, GROUP_CONTEXT, HTTP_CONDITION_CACHE, HttpConditionCache, HttpConditionFunctionCacheService, INITIALIZATION_TIMEOUT_MS, LogicFunctionCacheService, NoopLogger, READONLY_FIELD_TREE_CACHE, RootFormRegistryService, TokenType, WRAPPER_AUTO_ASSOCIATIONS, WRAPPER_COMPONENT_CACHE, WRAPPER_COMPONENT_LOAD_CACHE, WRAPPER_REGISTRY, applyMetaToElement, applyValidator, applyValidators, arrayFieldMapper, assertNever, baseFieldMapper, buildBaseInputs, buildClassName, compareValues, containerFieldMapper, createAddonActionRegistry, createDebouncedLogicFunction, createDefaultDerivationLogConfig, createDynamicValueFunction, createFieldValueProxy, createFormFieldStateMap, createFormStateLogicFunction, createInitializationTracker, createLogicFunction, createResolvedErrorsSignal, createWarningTracker, deepMergeDefaults, derivedFromDeferred, detectFormMode, dynamicTextToObservable, evaluateCondition, evaluateNonFieldDisabled, evaluateNonFieldHidden, extractExpressionDependencies, extractStringDependencies, getArrayLength, getChangedKeys, getChangedKeysWithin, getFieldValueHandling, getGridClassString, getNestedValue, groupFieldMapper, hasChildFields, hasCrossFieldWhenCondition, hasFormValue, hasNestedProperty, hasTargetProperty, injectAddonTypeRegistry, injectFieldErrors, injectFieldSignalContext, injectFieldsSupportingAddons, injectNonFieldEvaluationContext, interpolateParams, isArrayField, isCheckedField, isContainerField, isCrossFieldBuiltInValidator, isCrossFieldExpression, isCrossFieldSchema, isCrossFieldStateLogic, isCrossFieldValidator, isDerivationLogicConfig, isDisplayOnlyField, isEqual, isFieldBoundContext, isFormStateCondition, isFunctionHttpValidator, isGenericContainerField, isGroupField, isHiddenField, isLeafField, isNonPagedForm, isPageField, isPagedForm, isResourceBasedValidator, isRowField, isSimplifiedArrayField, isStateLogicConfig, isValidNonPagedForm, isValidPagedForm, isValueBearingField, isValueField, isWrapperTypeDefinition, keyBy, mapValues, memoize, normalizeFieldsArray, omit, pageFieldMapper, provideFieldErrorDisplay, readFieldStateInfo, resolveDynamicValue, resolveHttpRequest, resolveNextButtonDisabled, resolveNonFieldDisabled, resolveNonFieldHidden, resolveSubmitButtonDisabled, resolveTokens, rowError, rowFieldMapper, runPresetAction, setupInitializationTracking, shouldLog, shouldShowErrors, textFieldMapper, toReadonlyFieldTree, toReadonlyFieldTreeCached, validatePageNesting, withPreviousValue, writeToFieldValue };
3813
3987
  //# sourceMappingURL=ng-forge-dynamic-forms-internal.mjs.map