@ng-forge/dynamic-forms 1.2.0-next.5 → 1.2.0-next.6

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 (25) hide show
  1. package/fesm2022/{ng-forge-dynamic-forms-array-field.component-D-VWBM-t.mjs → ng-forge-dynamic-forms-array-field.component-NTHLPjau.mjs} +2 -2
  2. package/fesm2022/{ng-forge-dynamic-forms-array-field.component-D-VWBM-t.mjs.map → ng-forge-dynamic-forms-array-field.component-NTHLPjau.mjs.map} +1 -1
  3. package/fesm2022/{ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-OBDy6qd9.mjs → ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-CNCeWAeJ.mjs} +2 -2
  4. package/fesm2022/{ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-OBDy6qd9.mjs.map → ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-CNCeWAeJ.mjs.map} +1 -1
  5. package/fesm2022/{ng-forge-dynamic-forms-container-field.component-BpeFyhAt.mjs → ng-forge-dynamic-forms-container-field.component-ByGdzAsk.mjs} +5 -4
  6. package/fesm2022/ng-forge-dynamic-forms-container-field.component-ByGdzAsk.mjs.map +1 -0
  7. package/fesm2022/ng-forge-dynamic-forms-field-errors-wrapper.component-ZdaC4Bit.mjs +25 -0
  8. package/fesm2022/ng-forge-dynamic-forms-field-errors-wrapper.component-ZdaC4Bit.mjs.map +1 -0
  9. package/fesm2022/{ng-forge-dynamic-forms-group-field.component-BNjYMTqT.mjs → ng-forge-dynamic-forms-group-field.component-DnLZdj8v.mjs} +2 -2
  10. package/fesm2022/{ng-forge-dynamic-forms-group-field.component-BNjYMTqT.mjs.map → ng-forge-dynamic-forms-group-field.component-DnLZdj8v.mjs.map} +1 -1
  11. package/fesm2022/ng-forge-dynamic-forms-integration.mjs +10 -72
  12. package/fesm2022/ng-forge-dynamic-forms-integration.mjs.map +1 -1
  13. package/fesm2022/ng-forge-dynamic-forms-internal.mjs +221 -91
  14. package/fesm2022/ng-forge-dynamic-forms-internal.mjs.map +1 -1
  15. package/fesm2022/{ng-forge-dynamic-forms-ng-forge-dynamic-forms-DSXZJHcu.mjs → ng-forge-dynamic-forms-ng-forge-dynamic-forms-B2C_WAMP.mjs} +91 -34
  16. package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-B2C_WAMP.mjs.map +1 -0
  17. package/fesm2022/{ng-forge-dynamic-forms-page-field.component-B92kLZkH.mjs → ng-forge-dynamic-forms-page-field.component-CwH22lRl.mjs} +2 -2
  18. package/fesm2022/{ng-forge-dynamic-forms-page-field.component-B92kLZkH.mjs.map → ng-forge-dynamic-forms-page-field.component-CwH22lRl.mjs.map} +1 -1
  19. package/fesm2022/ng-forge-dynamic-forms.mjs +2 -2
  20. package/package.json +2 -2
  21. package/types/ng-forge-dynamic-forms-integration.d.ts +7 -31
  22. package/types/ng-forge-dynamic-forms-internal.d.ts +420 -218
  23. package/types/ng-forge-dynamic-forms.d.ts +1 -1
  24. package/fesm2022/ng-forge-dynamic-forms-container-field.component-BpeFyhAt.mjs.map +0 -1
  25. package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-DSXZJHcu.mjs.map +0 -1
@@ -10,6 +10,8 @@ import { isPlatformBrowser, AsyncPipe, NgTemplateOutlet, NgComponentOutlet } fro
10
10
  import { NG_STATUS_CLASSES } from '@angular/forms/signals/compat';
11
11
 
12
12
  const EMPTY_WRAPPERS = Object.freeze([]);
13
+ const FIELD_ERRORS_WRAPPER = 'field-errors';
14
+ const FIELD_ERRORS_CONFIG = Object.freeze({ type: FIELD_ERRORS_WRAPPER });
13
15
  function isSameWrapperChain(a, b) {
14
16
  if (a === b)
15
17
  return true;
@@ -21,17 +23,26 @@ function isSameWrapperChain(a, b) {
21
23
  }
22
24
  return true;
23
25
  }
24
- function resolveWrappers(field, defaultWrappers, autoAssociations) {
25
- if (field.wrappers === null) {
26
+ function resolveWrappers(field, defaultWrappers, autoAssociations, wrapperRegistry) {
27
+ if (field.wrappers === null) {
26
28
  return EMPTY_WRAPPERS;
27
29
  }
28
30
  const autoWrappers = field.skipAutoWrappers ? EMPTY_WRAPPERS : (autoAssociations.get(field.type) ?? EMPTY_WRAPPERS);
29
31
  const defaults = field.skipDefaultWrappers ? EMPTY_WRAPPERS : (defaultWrappers ?? EMPTY_WRAPPERS);
30
32
  const fieldLevel = field.wrappers ?? EMPTY_WRAPPERS;
31
- if (autoWrappers.length === 0 && defaults.length === 0 && fieldLevel.length === 0) {
32
- return EMPTY_WRAPPERS;
33
+ const composed = [...autoWrappers, ...defaults, ...fieldLevel];
34
+ if (needsErrorWrapper(field, composed, wrapperRegistry)) {
35
+ composed.push(FIELD_ERRORS_CONFIG);
33
36
  }
34
- return [...autoWrappers, ...defaults, ...fieldLevel];
37
+ return composed.length === 0 ? EMPTY_WRAPPERS : composed;
38
+ }
39
+ const VALIDATABLE_CONTAINERS = new Set(['group', 'array']);
40
+ function needsErrorWrapper(field, composed, wrapperRegistry) {
41
+ if (!VALIDATABLE_CONTAINERS.has(field.type))
42
+ return false;
43
+ if (!field.validators || field.validators.length === 0)
44
+ return false;
45
+ return !composed.some((w) => w.type === FIELD_ERRORS_WRAPPER || wrapperRegistry.get(w.type)?.rendersFieldErrors);
35
46
  }
36
47
 
37
48
  const inputNamesCache = new WeakMap();
@@ -246,7 +257,7 @@ function pushFieldInputsOnChange(opts, getRefs) {
246
257
  });
247
258
  }
248
259
 
249
- function buildFieldInputs(rawInputs, cache, fieldType) {
260
+ function buildFieldInputs(rawInputs, cache, fieldType, validationMessages) {
250
261
  const fieldTreeCandidate = rawInputs['field'];
251
262
  const hasFieldTree = fieldTreeCandidate !== undefined && typeof fieldTreeCandidate === 'function';
252
263
  const readonlyField = hasFieldTree ? toReadonlyFieldTreeCached(cache, fieldTreeCandidate) : undefined;
@@ -258,6 +269,7 @@ function buildFieldInputs(rawInputs, cache, fieldType) {
258
269
  type: fieldType,
259
270
  field: readonlyField,
260
271
  setValue,
272
+ ...(validationMessages !== undefined && { validationMessages }),
261
273
  };
262
274
  }
263
275
 
@@ -356,6 +368,7 @@ class DfFieldOutlet {
356
368
  vcr = signal(this.vcrRef).asReadonly();
357
369
  destroyRef = inject(DestroyRef);
358
370
  wrapperAutoAssociations = inject(WRAPPER_AUTO_ASSOCIATIONS);
371
+ wrapperRegistry = inject(WRAPPER_REGISTRY);
359
372
  defaultWrappersSignal = inject(DEFAULT_WRAPPERS, { optional: true });
360
373
  readonlyFieldCache = inject(READONLY_FIELD_TREE_CACHE);
361
374
  fieldComponent = new FieldComponentSlot();
@@ -365,8 +378,8 @@ class DfFieldOutlet {
365
378
  ...(ngDevMode ? [{ debugName: "renderReady" }] : /* istanbul ignore next */ []));
366
379
  rawInputs = computed(() => this.dfFieldOutlet().inputs(), /* @ts-ignore */
367
380
  ...(ngDevMode ? [{ debugName: "rawInputs" }] : /* istanbul ignore next */ []));
368
- wrappers = computed(() => resolveWrappers(this.dfFieldOutlet().fieldDef, this.defaultWrappersSignal?.(), this.wrapperAutoAssociations), { ...(ngDevMode ? { debugName: "wrappers" } : /* istanbul ignore next */ {}), equal: isSameWrapperChain });
369
- fieldInputs = computed(() => buildFieldInputs(this.rawInputs(), this.readonlyFieldCache, this.dfFieldOutlet().fieldDef.type), /* @ts-ignore */
381
+ wrappers = computed(() => resolveWrappers(this.dfFieldOutlet().fieldDef, this.defaultWrappersSignal?.(), this.wrapperAutoAssociations, this.wrapperRegistry), { ...(ngDevMode ? { debugName: "wrappers" } : /* istanbul ignore next */ {}), equal: isSameWrapperChain });
382
+ fieldInputs = computed(() => buildFieldInputs(this.rawInputs(), this.readonlyFieldCache, this.dfFieldOutlet().fieldDef.type, this.dfFieldOutlet().fieldDef.validationMessages), /* @ts-ignore */
370
383
  ...(ngDevMode ? [{ debugName: "fieldInputs" }] : /* istanbul ignore next */ []));
371
384
  defaultEnvInjector = inject(EnvironmentInjector);
372
385
  fieldEnvInjector = computed(() => this.dfFieldOutletEnvironmentInjector() ?? this.defaultEnvInjector, /* @ts-ignore */
@@ -801,10 +814,10 @@ class PageOrchestratorComponent {
801
814
  }
802
815
  }
803
816
  `, isInline: true, styles: [":host{display:block;position:relative;width:100%}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, deferBlockDependencies: [() => [/* @ts-ignore */
804
- import('./ng-forge-dynamic-forms-page-field.component-B92kLZkH.mjs').then(m => m.default)]] });
817
+ import('./ng-forge-dynamic-forms-page-field.component-CwH22lRl.mjs').then(m => m.default)]] });
805
818
  }
806
819
  i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "22.0.1", ngImport: i0, type: PageOrchestratorComponent, resolveDeferredDeps: () => [/* @ts-ignore */
807
- import('./ng-forge-dynamic-forms-page-field.component-B92kLZkH.mjs').then(m => m.default)], resolveMetadata: PageFieldComponent => ({ decorators: [{
820
+ import('./ng-forge-dynamic-forms-page-field.component-CwH22lRl.mjs').then(m => m.default)], resolveMetadata: PageFieldComponent => ({ decorators: [{
808
821
  type: Component,
809
822
  args: [{ selector: 'div[page-orchestrator]', imports: [PageFieldComponent], template: `
810
823
  @for (pageField of pageFields(); track pageField.key; let i = $index) {
@@ -920,7 +933,7 @@ function validateSimplifiedTemplate(field) {
920
933
  }
921
934
  }
922
935
  function expandSimplifiedArray(field) {
923
- const { template, value = [], addButton, removeButton, key, logic, minLength, maxLength, wrappers, skipAutoWrappers, skipDefaultWrappers, } = field;
936
+ const { template, value = [], addButton, removeButton, key, logic, minLength, maxLength, wrappers, skipAutoWrappers, skipDefaultWrappers, validators, validationMessages, required, validateWhenHidden, } = field;
924
937
  const isObjectTemplate = Array.isArray(template);
925
938
  const values = value;
926
939
  validateSimplifiedTemplate(field);
@@ -956,6 +969,18 @@ function expandSimplifiedArray(field) {
956
969
  }
957
970
  if (skipDefaultWrappers !== undefined) {
958
971
  arrayFieldObj['skipDefaultWrappers'] = skipDefaultWrappers;
972
+ }
973
+ if (validators !== undefined) {
974
+ arrayFieldObj['validators'] = validators;
975
+ }
976
+ if (validationMessages !== undefined) {
977
+ arrayFieldObj['validationMessages'] = validationMessages;
978
+ }
979
+ if (required !== undefined) {
980
+ arrayFieldObj['required'] = required;
981
+ }
982
+ if (validateWhenHidden !== undefined) {
983
+ arrayFieldObj['validateWhenHidden'] = validateWhenHidden;
959
984
  }
960
985
  const arrayField = arrayFieldObj;
961
986
  const primitiveFieldKey = !isObjectTemplate ? template.key : undefined;
@@ -1272,6 +1297,11 @@ function resolveDescendantContext(fieldDef, ownContext) {
1272
1297
  let ancestorAlwaysHidden = ownContext.ancestorAlwaysHidden;
1273
1298
  let ancestorHiddenLogics = ownContext.ancestorHiddenLogics;
1274
1299
  let mutated = false;
1300
+ let ancestorRequired = ownContext.ancestorRequired;
1301
+ if (fieldDef.required !== undefined && fieldDef.required !== ancestorRequired) {
1302
+ ancestorRequired = fieldDef.required;
1303
+ mutated = true;
1304
+ }
1275
1305
  if (fieldDef.hidden === true && !ancestorAlwaysHidden) {
1276
1306
  ancestorAlwaysHidden = true;
1277
1307
  mutated = true;
@@ -1303,6 +1333,7 @@ function resolveDescendantContext(fieldDef, ownContext) {
1303
1333
  validateWhenHidden: ownContext.validateWhenHidden,
1304
1334
  ancestorAlwaysHidden,
1305
1335
  ancestorHiddenLogics,
1336
+ ancestorRequired,
1306
1337
  };
1307
1338
  }
1308
1339
 
@@ -1373,6 +1404,7 @@ function mapFieldToForm(fieldDef, fieldPath, inheritedContext = DEFAULT_FIELD_TR
1373
1404
  }
1374
1405
  if (isGroupField(fieldDef)) {
1375
1406
  const descendantContext = resolveDescendantContext(fieldDef, ownContext);
1407
+ applyContainerValidators(fieldDef, fieldPath, descendantContext);
1376
1408
  mapContainerChildren(fieldDef.fields, fieldPath, descendantContext);
1377
1409
  return;
1378
1410
  }
@@ -1422,7 +1454,7 @@ function mapLeafField(fieldDef, fieldPath, context) {
1422
1454
  }
1423
1455
  }
1424
1456
  const applyValidation = (validationPath) => {
1425
- applySimpleValidationRules(validationField, validationPath);
1457
+ applySimpleValidationRules(validationField, validationPath, context);
1426
1458
  if (validationField.validators) {
1427
1459
  for (const config of validationField.validators) {
1428
1460
  applyValidator(config, validationPath);
@@ -1436,8 +1468,11 @@ function mapLeafField(fieldDef, fieldPath, context) {
1436
1468
  }
1437
1469
  }
1438
1470
  };
1471
+ applyHiddenGatedValidation(path, context, applyValidation);
1472
+ }
1473
+ function applyHiddenGatedValidation(path, context, apply) {
1439
1474
  if (context.validateWhenHidden) {
1440
- applyValidation(path);
1475
+ apply(path);
1441
1476
  return;
1442
1477
  }
1443
1478
  if (context.ancestorAlwaysHidden) {
@@ -1450,10 +1485,21 @@ function mapLeafField(fieldDef, fieldPath, context) {
1450
1485
  if (ancestorHiddenLogic && ancestorHiddenLogic(ctx))
1451
1486
  return false;
1452
1487
  return true;
1453
- }, schema((subPath) => applyValidation(subPath)));
1488
+ }, schema((subPath) => apply(subPath)));
1489
+ }
1490
+ function applyContainerValidators(fieldDef, fieldPath, context) {
1491
+ const validators = fieldDef.validators;
1492
+ if (!validators || validators.length === 0)
1493
+ return;
1494
+ applyHiddenGatedValidation(fieldPath, context, (validationPath) => {
1495
+ for (const config of validators) {
1496
+ applyValidator(config, validationPath, 'tree');
1497
+ }
1498
+ });
1454
1499
  }
1455
- function applySimpleValidationRules(fieldDef, path) {
1456
- if (fieldDef.required) {
1500
+ function applySimpleValidationRules(fieldDef, path, context) {
1501
+ const declaresRequiredLogic = fieldDef.logic?.some(isValidationStateLogic) ?? false;
1502
+ if (fieldDef.required ?? (declaresRequiredLogic ? false : context.ancestorRequired)) {
1457
1503
  required(path);
1458
1504
  }
1459
1505
  const stringConfig = getStringValidationConfig(fieldDef);
@@ -1486,6 +1532,7 @@ function mapArrayFieldToForm(arrayField, fieldPath, context) {
1486
1532
  if (arrayField.maxLength !== undefined) {
1487
1533
  maxLength(fieldPath, arrayField.maxLength);
1488
1534
  }
1535
+ applyContainerValidators(arrayField, fieldPath, context);
1489
1536
  let itemDefinitions = arrayField.fields;
1490
1537
  if (!itemDefinitions || itemDefinitions.length === 0) {
1491
1538
  const metadataTemplate = getNormalizedArrayMetadata(arrayField)?.template;
@@ -1531,17 +1578,16 @@ function mapArrayFieldToForm(arrayField, fieldPath, context) {
1531
1578
  mapContainerChildren(templateField.fields, itemPath, layoutDescendant);
1532
1579
  }
1533
1580
  else if (isGroupField(templateField)) {
1534
- const groupKey = templateField.key;
1535
- const groupOwn = resolveFieldOwnContext(templateField, context);
1536
- const groupDescendant = resolveDescendantContext(templateField, groupOwn);
1581
+ const groupKey = templateField.key;
1537
1582
  if (groupKey) {
1538
- const groupPath = pathRecord[groupKey];
1583
+ const groupPath = pathRecord[groupKey];
1539
1584
  if (groupPath) {
1540
- mapContainerChildren(templateField.fields, groupPath, groupDescendant);
1585
+ mapFieldToForm(templateField, groupPath, context);
1541
1586
  }
1542
1587
  }
1543
1588
  else {
1544
- mapContainerChildren(templateField.fields, itemPath, groupDescendant);
1589
+ const groupOwn = resolveFieldOwnContext(templateField, context);
1590
+ mapContainerChildren(templateField.fields, itemPath, resolveDescendantContext(templateField, groupOwn));
1545
1591
  }
1546
1592
  }
1547
1593
  else {
@@ -3818,7 +3864,7 @@ function createDerivationRenderGate() {
3818
3864
  if (!has || engine() !== 'idle')
3819
3865
  return;
3820
3866
  engine.set('loading');
3821
- pendingTasks.run(() => import('./ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-OBDy6qd9.mjs')
3867
+ pendingTasks.run(() => import('./ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-CNCeWAeJ.mjs')
3822
3868
  .then(({ bootstrapDerivationOrchestrator }) => {
3823
3869
  runInInjectionContext(injector, () => bootstrapDerivationOrchestrator());
3824
3870
  engine.set('wired');
@@ -4373,28 +4419,28 @@ const DISPLAY_FIELD_TYPES_BASE = {
4373
4419
  const BUILT_IN_FIELDS = [
4374
4420
  {
4375
4421
  name: 'row',
4376
- loadComponent: () => import('./ng-forge-dynamic-forms-container-field.component-BpeFyhAt.mjs'),
4422
+ loadComponent: () => import('./ng-forge-dynamic-forms-container-field.component-ByGdzAsk.mjs'),
4377
4423
  mapper: rowFieldMapper,
4378
4424
  valueHandling: 'flatten',
4379
4425
  ...CONTAINER_FIELD_TYPES_BASE,
4380
4426
  },
4381
4427
  {
4382
4428
  name: 'group',
4383
- loadComponent: () => import('./ng-forge-dynamic-forms-group-field.component-BNjYMTqT.mjs'),
4429
+ loadComponent: () => import('./ng-forge-dynamic-forms-group-field.component-DnLZdj8v.mjs'),
4384
4430
  mapper: groupFieldMapper,
4385
4431
  valueHandling: 'include',
4386
4432
  ...CONTAINER_FIELD_TYPES_BASE,
4387
4433
  },
4388
4434
  {
4389
4435
  name: 'array',
4390
- loadComponent: () => import('./ng-forge-dynamic-forms-array-field.component-D-VWBM-t.mjs'),
4436
+ loadComponent: () => import('./ng-forge-dynamic-forms-array-field.component-NTHLPjau.mjs'),
4391
4437
  mapper: arrayFieldMapper,
4392
4438
  valueHandling: 'include',
4393
4439
  ...CONTAINER_FIELD_TYPES_BASE,
4394
4440
  },
4395
4441
  {
4396
4442
  name: 'page',
4397
- loadComponent: () => import('./ng-forge-dynamic-forms-page-field.component-B92kLZkH.mjs'),
4443
+ loadComponent: () => import('./ng-forge-dynamic-forms-page-field.component-CwH22lRl.mjs'),
4398
4444
  mapper: pageFieldMapper,
4399
4445
  valueHandling: 'flatten',
4400
4446
  ...CONTAINER_FIELD_TYPES_BASE,
@@ -4412,7 +4458,7 @@ const BUILT_IN_FIELDS = [
4412
4458
  },
4413
4459
  {
4414
4460
  name: 'container',
4415
- loadComponent: () => import('./ng-forge-dynamic-forms-container-field.component-BpeFyhAt.mjs'),
4461
+ loadComponent: () => import('./ng-forge-dynamic-forms-container-field.component-ByGdzAsk.mjs'),
4416
4462
  mapper: containerFieldMapper,
4417
4463
  valueHandling: 'flatten',
4418
4464
  ...CONTAINER_FIELD_TYPES_BASE,
@@ -4427,6 +4473,11 @@ const BUILT_IN_WRAPPERS = [
4427
4473
  wrapperName: 'row',
4428
4474
  loadComponent: () => import('./ng-forge-dynamic-forms-row-wrapper.component-BBWmqQA_.mjs'),
4429
4475
  },
4476
+ {
4477
+ wrapperName: 'field-errors',
4478
+ loadComponent: () => import('./ng-forge-dynamic-forms-field-errors-wrapper.component-ZdaC4Bit.mjs'),
4479
+ rendersFieldErrors: true,
4480
+ },
4430
4481
  ];
4431
4482
 
4432
4483
  function isDynamicFormFeature(value) {
@@ -4486,7 +4537,8 @@ function provideDynamicForm(...items) {
4486
4537
  const wrapperBundles = items.filter(isWrappersBundle);
4487
4538
  const features = items.filter(isDynamicFormFeature);
4488
4539
  const fields = [...BUILT_IN_FIELDS, ...fieldTypes];
4489
- const wrappers = [...BUILT_IN_WRAPPERS, ...wrapperTypes, ...wrapperBundles.flatMap((bundle) => bundle.ɵdefinitions)];
4540
+ const customWrappers = [...wrapperTypes, ...wrapperBundles.flatMap((bundle) => bundle.ɵdefinitions)];
4541
+ const wrappers = [...BUILT_IN_WRAPPERS, ...customWrappers];
4490
4542
  const featureProviders = [];
4491
4543
  const hasLoggerFeature = features.some((feature) => feature.ɵkind === 'logger');
4492
4544
  features.forEach((feature) => {
@@ -4527,11 +4579,16 @@ function provideDynamicForm(...items) {
4527
4579
  useFactory: () => {
4528
4580
  const logger = inject(DynamicFormLogger);
4529
4581
  const registry = new Map();
4530
- wrappers.forEach((wrapperType) => {
4531
- if (registry.has(wrapperType.wrapperName)) {
4532
- logger.warn(`Wrapper type "${wrapperType.wrapperName}" is already registered. Overwriting.`);
4582
+ const builtInNames = new Set(BUILT_IN_WRAPPERS.map((w) => w.wrapperName));
4583
+ BUILT_IN_WRAPPERS.forEach((wrapperType) => registry.set(wrapperType.wrapperName, wrapperType));
4584
+ const seenCustom = new Set();
4585
+ customWrappers.forEach((wrapperType) => {
4586
+ const name = wrapperType.wrapperName;
4587
+ if (seenCustom.has(name) && !builtInNames.has(name)) {
4588
+ logger.warn(`Wrapper type "${name}" is already registered. Overwriting.`);
4533
4589
  }
4534
- registry.set(wrapperType.wrapperName, wrapperType);
4590
+ seenCustom.add(name);
4591
+ registry.set(name, wrapperType);
4535
4592
  });
4536
4593
  return registry;
4537
4594
  },
@@ -4942,4 +4999,4 @@ function arrayEvent(arrayKey) {
4942
4999
 
4943
5000
 
4944
5001
  export { withEventFormValue as $, ArrayItemRegistryService as A, BUILT_IN_FIELDS as B, CONTAINER_FIELD_PROCESSORS as C, DfFieldOutlet as D, EventDispatcher as E, FIELD_WINDOWING as F, GoToPageEvent as G, PageChangeEvent as H, InsertArrayItemEvent as I, PagerStateEvent as J, PopArrayItemEvent as K, PrependArrayItemEvent as L, MoveArrayItemEvent as M, NextPageEvent as N, PreviousPageEvent as O, PROPERTY_OVERRIDE_STORE as P, TextAddonComponent as Q, RemoveAtIndexEvent as R, ShiftArrayItemEvent as S, TemplateAddonComponent as T, arrayEvent as U, createWrappers as V, isWrappersBundle as W, provideDynamicForm as X, sanitizeFormConfig as Y, withAddonActions as Z, withCustomAddon as _, isSameWrapperChain as a, withFieldWindowing as a0, withLegacyStatusClasses as a1, withLoggerConfig as a2, withPagePreload as a3, withValidationExecutionDefaults as a4, withValueExclusionDefaults as a5, wrapperProps as a6, createWrapperChainController as b, createFieldResolutionPipe as c, createSchemaFromFields as d, createHiddenSignal as e, createRenderReadySignal as f, getNormalizedArrayMetadata as g, getFieldDefaultValue as h, injectFieldRegistry as i, resolveFieldWindowing as j, DEV_MODE as k, DEFAULT_DEBOUNCE_MS as l, mapFieldToInputs as m, DERIVATION_WARNING_TRACKER as n, FormStateManager as o, DERIVATION_LOG_CONFIG as p, AppendArrayItemEvent as q, resolveWrappers as r, ComponentAddonComponent as s, traverseFieldsWithContext as t, ConsoleLogger as u, DfTemplate as v, DynamicForm as w, FormClearEvent as x, FormResetEvent as y, FormSubmitEvent as z };
4945
- //# sourceMappingURL=ng-forge-dynamic-forms-ng-forge-dynamic-forms-DSXZJHcu.mjs.map
5002
+ //# sourceMappingURL=ng-forge-dynamic-forms-ng-forge-dynamic-forms-B2C_WAMP.mjs.map