@ng-forge/dynamic-forms 1.3.0-next.1 → 1.3.0-next.3

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 (92) hide show
  1. package/fesm2022/ng-forge-dynamic-forms-active-page-initialized.event-CiKN-mcc.mjs +12 -0
  2. package/fesm2022/ng-forge-dynamic-forms-active-page-initialized.event-CiKN-mcc.mjs.map +1 -0
  3. package/fesm2022/ng-forge-dynamic-forms-array-field.component-Dv9mPnJ3.mjs +770 -0
  4. package/fesm2022/ng-forge-dynamic-forms-array-field.component-Dv9mPnJ3.mjs.map +1 -0
  5. package/fesm2022/ng-forge-dynamic-forms-array-item-registry.service-D-AxVLdk.mjs +83 -0
  6. package/fesm2022/ng-forge-dynamic-forms-array-item-registry.service-D-AxVLdk.mjs.map +1 -0
  7. package/fesm2022/ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-EuYCbquo.mjs +1887 -0
  8. package/fesm2022/ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-EuYCbquo.mjs.map +1 -0
  9. package/fesm2022/ng-forge-dynamic-forms-bootstrap-web-mcp-2wQK_wPp.mjs +954 -0
  10. package/fesm2022/ng-forge-dynamic-forms-bootstrap-web-mcp-2wQK_wPp.mjs.map +1 -0
  11. package/fesm2022/ng-forge-dynamic-forms-container-field-processors-C_JRvaVt.mjs +117 -0
  12. package/fesm2022/ng-forge-dynamic-forms-container-field-processors-C_JRvaVt.mjs.map +1 -0
  13. package/fesm2022/ng-forge-dynamic-forms-container-field.component-Bg7Win9n.mjs +228 -0
  14. package/fesm2022/ng-forge-dynamic-forms-container-field.component-Bg7Win9n.mjs.map +1 -0
  15. package/fesm2022/ng-forge-dynamic-forms-css-wrapper.component-R2yc-H0T.mjs +102 -0
  16. package/fesm2022/ng-forge-dynamic-forms-css-wrapper.component-R2yc-H0T.mjs.map +1 -0
  17. package/fesm2022/ng-forge-dynamic-forms-debounce-CG3uP5B-.mjs +4 -0
  18. package/fesm2022/{ng-forge-dynamic-forms-debounce-C9F4v1Ke.mjs.map → ng-forge-dynamic-forms-debounce-CG3uP5B-.mjs.map} +1 -1
  19. package/fesm2022/ng-forge-dynamic-forms-default-value-D5M4MNE-.mjs +77 -0
  20. package/fesm2022/ng-forge-dynamic-forms-default-value-D5M4MNE-.mjs.map +1 -0
  21. package/fesm2022/ng-forge-dynamic-forms-dev-mode-4rbYBBo_.mjs +4 -0
  22. package/fesm2022/ng-forge-dynamic-forms-dev-mode-4rbYBBo_.mjs.map +1 -0
  23. package/fesm2022/ng-forge-dynamic-forms-df-field-outlet.directive-CQsDMV-s.mjs +644 -0
  24. package/fesm2022/ng-forge-dynamic-forms-df-field-outlet.directive-CQsDMV-s.mjs.map +1 -0
  25. package/fesm2022/ng-forge-dynamic-forms-field-errors-wrapper.component-DKgkpIpG.mjs +56 -0
  26. package/fesm2022/ng-forge-dynamic-forms-field-errors-wrapper.component-DKgkpIpG.mjs.map +1 -0
  27. package/fesm2022/ng-forge-dynamic-forms-form-schema.service-Dd-gHJ_7.mjs +38 -0
  28. package/fesm2022/{ng-forge-dynamic-forms-form-schema.service-Dx5Dlb15.mjs.map → ng-forge-dynamic-forms-form-schema.service-Dd-gHJ_7.mjs.map} +1 -1
  29. package/fesm2022/ng-forge-dynamic-forms-form-state-manager-DcOXRFRL.mjs +1522 -0
  30. package/fesm2022/ng-forge-dynamic-forms-form-state-manager-DcOXRFRL.mjs.map +1 -0
  31. package/fesm2022/ng-forge-dynamic-forms-group-field.component-BjZi0bhq.mjs +292 -0
  32. package/fesm2022/ng-forge-dynamic-forms-group-field.component-BjZi0bhq.mjs.map +1 -0
  33. package/fesm2022/ng-forge-dynamic-forms-integration.mjs +1318 -843
  34. package/fesm2022/ng-forge-dynamic-forms-integration.mjs.map +1 -1
  35. package/fesm2022/ng-forge-dynamic-forms-internal.mjs +3326 -3641
  36. package/fesm2022/ng-forge-dynamic-forms-internal.mjs.map +1 -1
  37. package/fesm2022/ng-forge-dynamic-forms-page-field.component-BRjQmWC9.mjs +295 -0
  38. package/fesm2022/ng-forge-dynamic-forms-page-field.component-BRjQmWC9.mjs.map +1 -0
  39. package/fesm2022/ng-forge-dynamic-forms-resolve-field-ByGa5cpo.mjs +329 -0
  40. package/fesm2022/ng-forge-dynamic-forms-resolve-field-ByGa5cpo.mjs.map +1 -0
  41. package/fesm2022/ng-forge-dynamic-forms-row-wrapper.component-CuFycQb-.mjs +81 -0
  42. package/fesm2022/ng-forge-dynamic-forms-row-wrapper.component-CuFycQb-.mjs.map +1 -0
  43. package/fesm2022/ng-forge-dynamic-forms-schema-builder-C62afItJ.mjs +400 -0
  44. package/fesm2022/ng-forge-dynamic-forms-schema-builder-C62afItJ.mjs.map +1 -0
  45. package/fesm2022/ng-forge-dynamic-forms-schema-registry.service-axBV9FBH.mjs +45 -0
  46. package/fesm2022/ng-forge-dynamic-forms-schema-registry.service-axBV9FBH.mjs.map +1 -0
  47. package/fesm2022/ng-forge-dynamic-forms-schema.mjs +8 -14
  48. package/fesm2022/ng-forge-dynamic-forms-schema.mjs.map +1 -1
  49. package/fesm2022/ng-forge-dynamic-forms-testing.mjs +68 -73
  50. package/fesm2022/ng-forge-dynamic-forms-testing.mjs.map +1 -1
  51. package/fesm2022/ng-forge-dynamic-forms-text-field.component--MAh_h4Q.mjs +257 -0
  52. package/fesm2022/ng-forge-dynamic-forms-text-field.component--MAh_h4Q.mjs.map +1 -0
  53. package/fesm2022/ng-forge-dynamic-forms-validation-execution.token-BFyySKtp.mjs +8 -0
  54. package/fesm2022/ng-forge-dynamic-forms-validation-execution.token-BFyySKtp.mjs.map +1 -0
  55. package/fesm2022/ng-forge-dynamic-forms-with-logger-config-BAATqYY0.mjs +94 -0
  56. package/fesm2022/ng-forge-dynamic-forms-with-logger-config-BAATqYY0.mjs.map +1 -0
  57. package/fesm2022/ng-forge-dynamic-forms-wrapper-chain-BnntfNU1.mjs +115 -0
  58. package/fesm2022/ng-forge-dynamic-forms-wrapper-chain-BnntfNU1.mjs.map +1 -0
  59. package/fesm2022/ng-forge-dynamic-forms.mjs +2136 -3
  60. package/fesm2022/ng-forge-dynamic-forms.mjs.map +1 -1
  61. package/package.json +1 -1
  62. package/types/ng-forge-dynamic-forms-integration.d.ts +543 -415
  63. package/types/ng-forge-dynamic-forms-internal.d.ts +2319 -2436
  64. package/types/ng-forge-dynamic-forms-schema.d.ts +13 -16
  65. package/types/ng-forge-dynamic-forms-testing.d.ts +34 -37
  66. package/types/ng-forge-dynamic-forms.d.ts +735 -722
  67. package/fesm2022/ng-forge-dynamic-forms-array-field.component-CSCKq_1K.mjs +0 -750
  68. package/fesm2022/ng-forge-dynamic-forms-array-field.component-CSCKq_1K.mjs.map +0 -1
  69. package/fesm2022/ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-CTOTwzzw.mjs +0 -2394
  70. package/fesm2022/ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-CTOTwzzw.mjs.map +0 -1
  71. package/fesm2022/ng-forge-dynamic-forms-bootstrap-web-mcp-BtjqeJOj.mjs +0 -1054
  72. package/fesm2022/ng-forge-dynamic-forms-bootstrap-web-mcp-BtjqeJOj.mjs.map +0 -1
  73. package/fesm2022/ng-forge-dynamic-forms-container-field.component-Dc3ROhHL.mjs +0 -86
  74. package/fesm2022/ng-forge-dynamic-forms-container-field.component-Dc3ROhHL.mjs.map +0 -1
  75. package/fesm2022/ng-forge-dynamic-forms-css-wrapper.component-BzgX8lAD.mjs +0 -33
  76. package/fesm2022/ng-forge-dynamic-forms-css-wrapper.component-BzgX8lAD.mjs.map +0 -1
  77. package/fesm2022/ng-forge-dynamic-forms-debounce-C9F4v1Ke.mjs +0 -17
  78. package/fesm2022/ng-forge-dynamic-forms-field-errors-wrapper.component-CIKbWqYA.mjs +0 -25
  79. package/fesm2022/ng-forge-dynamic-forms-field-errors-wrapper.component-CIKbWqYA.mjs.map +0 -1
  80. package/fesm2022/ng-forge-dynamic-forms-form-schema.service-Dx5Dlb15.mjs +0 -24
  81. package/fesm2022/ng-forge-dynamic-forms-group-field.component-DAC3P9DC.mjs +0 -177
  82. package/fesm2022/ng-forge-dynamic-forms-group-field.component-DAC3P9DC.mjs.map +0 -1
  83. package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-CXQe_5td.mjs +0 -5133
  84. package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-CXQe_5td.mjs.map +0 -1
  85. package/fesm2022/ng-forge-dynamic-forms-page-field.component-DPKJcwUO.mjs +0 -176
  86. package/fesm2022/ng-forge-dynamic-forms-page-field.component-DPKJcwUO.mjs.map +0 -1
  87. package/fesm2022/ng-forge-dynamic-forms-row-wrapper.component-DMEeKZny.mjs +0 -19
  88. package/fesm2022/ng-forge-dynamic-forms-row-wrapper.component-DMEeKZny.mjs.map +0 -1
  89. package/fesm2022/ng-forge-dynamic-forms-schema-builder-BvDTzfdM.mjs +0 -570
  90. package/fesm2022/ng-forge-dynamic-forms-schema-builder-BvDTzfdM.mjs.map +0 -1
  91. package/fesm2022/ng-forge-dynamic-forms-text-field.component-BB-jutBq.mjs +0 -126
  92. package/fesm2022/ng-forge-dynamic-forms-text-field.component-BB-jutBq.mjs.map +0 -1
@@ -0,0 +1,228 @@
1
+ import { a as initializationComponentPath, c as createWrapperChainController, l as isSameWrapperChain, o as setupContainerInitEffect, r as computeContainerHostClasses, t as DfFieldOutlet, u as resolveWrappers } from "./ng-forge-dynamic-forms-df-field-outlet.directive-CQsDMV-s.mjs";
2
+ import { t as createFieldResolutionPipe, u as injectFieldRegistry } from "./ng-forge-dynamic-forms-resolve-field-ByGa5cpo.mjs";
3
+ import * as i0 from "@angular/core";
4
+ import { ChangeDetectionStrategy, Component, DestroyRef, EnvironmentInjector, Injector, TemplateRef, ViewContainerRef, computed, inject, input, viewChild } from "@angular/core";
5
+ import { DEFAULT_WRAPPERS, DynamicFormLogger, EventBus, GROUP_CONTEXT, WRAPPER_AUTO_ASSOCIATIONS, WRAPPER_REGISTRY, derivedFromDeferred } from "@ng-forge/dynamic-forms/internal";
6
+ var ContainerFieldComponent = class ContainerFieldComponent {
7
+ destroyRef = inject(DestroyRef);
8
+ fieldRegistry = injectFieldRegistry();
9
+ injector = inject(Injector);
10
+ environmentInjector = inject(EnvironmentInjector);
11
+ eventBus = inject(EventBus);
12
+ logger = inject(DynamicFormLogger);
13
+ wrapperAutoAssociations = inject(WRAPPER_AUTO_ASSOCIATIONS);
14
+ wrapperRegistry = inject(WRAPPER_REGISTRY);
15
+ defaultWrappersSignal = inject(DEFAULT_WRAPPERS, { optional: true });
16
+ groupContext = inject(GROUP_CONTEXT, { optional: true });
17
+ childrenTpl = viewChild.required("childrenTpl", {
18
+ ...ngDevMode ? { debugName: "childrenTpl" } : /* istanbul ignore next */ {},
19
+ read: TemplateRef
20
+ });
21
+ wrapperContainer = viewChild.required("wrapperContainer", {
22
+ ...ngDevMode ? { debugName: "wrapperContainer" } : /* istanbul ignore next */ {},
23
+ read: ViewContainerRef
24
+ });
25
+ field = input.required(...ngDevMode ? [{ debugName: "field" }] : /* istanbul ignore next */ []);
26
+ key = input.required(...ngDevMode ? [{ debugName: "key" }] : /* istanbul ignore next */ []);
27
+ className = input(...ngDevMode ? [void 0, { debugName: "className" }] : /* istanbul ignore next */ []);
28
+ hidden = input(false, ...ngDevMode ? [{ debugName: "hidden" }] : /* istanbul ignore next */ []);
29
+ hostClasses = computed(() => computeContainerHostClasses("container", this.className()), ...ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []);
30
+ disabled = computed(() => this.field().disabled || false, ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
31
+ rawFieldRegistry = computed(() => this.fieldRegistry.raw, ...ngDevMode ? [{ debugName: "rawFieldRegistry" }] : /* istanbul ignore next */ []);
32
+ fieldsSource = computed(() => this.field().fields || [], ...ngDevMode ? [{ debugName: "fieldsSource" }] : /* istanbul ignore next */ []);
33
+ resolvedFields = derivedFromDeferred(this.fieldsSource, createFieldResolutionPipe(() => ({
34
+ loadTypeComponent: (type) => this.fieldRegistry.loadTypeComponent(type),
35
+ registry: this.rawFieldRegistry(),
36
+ injector: this.injector,
37
+ destroyRef: this.destroyRef,
38
+ onError: (fieldDef, error) => {
39
+ const fieldKey = fieldDef.key || "<no key>";
40
+ const containerKey = this.field().key || "<no key>";
41
+ this.logger.error(`Failed to load component for field type '${fieldDef.type}' (key: ${fieldKey}) within container '${containerKey}'. Ensure the field type is registered in your field registry.`, error);
42
+ }
43
+ })), {
44
+ initialValue: [],
45
+ injector: this.injector
46
+ });
47
+ wrappers = computed(() => resolveWrappers(this.field(), this.defaultWrappersSignal?.(), this.wrapperAutoAssociations, this.wrapperRegistry), {
48
+ ...ngDevMode ? { debugName: "wrappers" } : /* istanbul ignore next */ {},
49
+ equal: isSameWrapperChain
50
+ });
51
+ constructor() {
52
+ setupContainerInitEffect(this.resolvedFields, this.eventBus, "container", () => initializationComponentPath(this.field().key, this.groupContext?.groupPath()), this.injector);
53
+ createWrapperChainController({
54
+ vcr: this.wrapperContainer,
55
+ wrappers: this.wrappers,
56
+ renderInnermost: (slot) => slot.createEmbeddedView(this.childrenTpl())
57
+ });
58
+ }
59
+ static ɵfac = i0.ɵɵngDeclareFactory({
60
+ minVersion: "12.0.0",
61
+ version: "22.2.5",
62
+ ngImport: i0,
63
+ type: ContainerFieldComponent,
64
+ deps: [],
65
+ target: i0.ɵɵFactoryTarget.Component
66
+ });
67
+ static ɵcmp = i0.ɵɵngDeclareComponent({
68
+ minVersion: "17.0.0",
69
+ version: "22.2.5",
70
+ type: ContainerFieldComponent,
71
+ isStandalone: true,
72
+ selector: "div[container-field]",
73
+ inputs: {
74
+ field: {
75
+ classPropertyName: "field",
76
+ publicName: "field",
77
+ isSignal: true,
78
+ isRequired: true,
79
+ transformFunction: null
80
+ },
81
+ key: {
82
+ classPropertyName: "key",
83
+ publicName: "key",
84
+ isSignal: true,
85
+ isRequired: true,
86
+ transformFunction: null
87
+ },
88
+ className: {
89
+ classPropertyName: "className",
90
+ publicName: "className",
91
+ isSignal: true,
92
+ isRequired: false,
93
+ transformFunction: null
94
+ },
95
+ hidden: {
96
+ classPropertyName: "hidden",
97
+ publicName: "hidden",
98
+ isSignal: true,
99
+ isRequired: false,
100
+ transformFunction: null
101
+ }
102
+ },
103
+ host: { properties: {
104
+ "class": "hostClasses()",
105
+ "class.disabled": "disabled()",
106
+ "class.df-container-hidden": "hidden()",
107
+ "attr.aria-hidden": "hidden() || null",
108
+ "id": "`${key()}`",
109
+ "attr.data-testid": "key()"
110
+ } },
111
+ viewQueries: [{
112
+ propertyName: "childrenTpl",
113
+ first: true,
114
+ predicate: ["childrenTpl"],
115
+ descendants: true,
116
+ read: TemplateRef,
117
+ isSignal: true
118
+ }, {
119
+ propertyName: "wrapperContainer",
120
+ first: true,
121
+ predicate: ["wrapperContainer"],
122
+ descendants: true,
123
+ read: ViewContainerRef,
124
+ isSignal: true
125
+ }],
126
+ ngImport: i0,
127
+ template: `
128
+ <ng-template #childrenTpl>
129
+ @for (field of resolvedFields(); track field.key) {
130
+ <ng-container *dfFieldOutlet="field; environmentInjector: environmentInjector" />
131
+ }
132
+ </ng-template>
133
+ <ng-container #wrapperContainer></ng-container>
134
+ `,
135
+ isInline: true,
136
+ styles: [":host{display:block;width:100%}:host.df-container-hidden{display:none}\n"],
137
+ dependencies: [{
138
+ kind: "directive",
139
+ type: DfFieldOutlet,
140
+ selector: "[dfFieldOutlet]",
141
+ inputs: ["dfFieldOutlet", "dfFieldOutletEnvironmentInjector"]
142
+ }],
143
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
144
+ });
145
+ };
146
+ i0.ɵɵngDeclareClassMetadata({
147
+ minVersion: "12.0.0",
148
+ version: "22.2.5",
149
+ ngImport: i0,
150
+ type: ContainerFieldComponent,
151
+ decorators: [{
152
+ type: Component,
153
+ args: [{
154
+ selector: "div[container-field]",
155
+ imports: [DfFieldOutlet],
156
+ template: `
157
+ <ng-template #childrenTpl>
158
+ @for (field of resolvedFields(); track field.key) {
159
+ <ng-container *dfFieldOutlet="field; environmentInjector: environmentInjector" />
160
+ }
161
+ </ng-template>
162
+ <ng-container #wrapperContainer></ng-container>
163
+ `,
164
+ host: {
165
+ "[class]": "hostClasses()",
166
+ "[class.disabled]": "disabled()",
167
+ "[class.df-container-hidden]": "hidden()",
168
+ "[attr.aria-hidden]": "hidden() || null",
169
+ "[id]": "`${key()}`",
170
+ "[attr.data-testid]": "key()"
171
+ },
172
+ changeDetection: ChangeDetectionStrategy.OnPush,
173
+ styles: [":host{display:block;width:100%}:host.df-container-hidden{display:none}\n"]
174
+ }]
175
+ }],
176
+ ctorParameters: () => [],
177
+ propDecorators: {
178
+ childrenTpl: [{
179
+ type: i0.ViewChild,
180
+ args: ["childrenTpl", {
181
+ read: TemplateRef,
182
+ isSignal: true
183
+ }]
184
+ }],
185
+ wrapperContainer: [{
186
+ type: i0.ViewChild,
187
+ args: ["wrapperContainer", {
188
+ read: ViewContainerRef,
189
+ isSignal: true
190
+ }]
191
+ }],
192
+ field: [{
193
+ type: i0.Input,
194
+ args: [{
195
+ isSignal: true,
196
+ alias: "field",
197
+ required: true
198
+ }]
199
+ }],
200
+ key: [{
201
+ type: i0.Input,
202
+ args: [{
203
+ isSignal: true,
204
+ alias: "key",
205
+ required: true
206
+ }]
207
+ }],
208
+ className: [{
209
+ type: i0.Input,
210
+ args: [{
211
+ isSignal: true,
212
+ alias: "className",
213
+ required: false
214
+ }]
215
+ }],
216
+ hidden: [{
217
+ type: i0.Input,
218
+ args: [{
219
+ isSignal: true,
220
+ alias: "hidden",
221
+ required: false
222
+ }]
223
+ }]
224
+ }
225
+ });
226
+ export { ContainerFieldComponent, ContainerFieldComponent as default };
227
+
228
+ //# sourceMappingURL=ng-forge-dynamic-forms-container-field.component-Bg7Win9n.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ng-forge-dynamic-forms-container-field.component-Bg7Win9n.mjs","names":[],"sources":["../../../../packages/dynamic-forms/src/lib/fields/container/container-field.component.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n EnvironmentInjector,\n inject,\n Injector,\n input,\n TemplateRef,\n viewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { DfFieldOutlet } from '../../directives/df-field-outlet/df-field-outlet.directive';\nimport { derivedFromDeferred } from '@ng-forge/dynamic-forms/internal';\nimport { createFieldResolutionPipe, ResolvedField } from '../../utils/resolve-field/resolve-field';\nimport {\n computeContainerHostClasses,\n initializationComponentPath,\n setupContainerInitEffect,\n} from '../../utils/container-utils/container-utils';\nimport { ContainerField } from '@ng-forge/dynamic-forms/internal';\nimport { injectFieldRegistry } from '../../utils/inject-field-registry/inject-field-registry';\nimport { EventBus } from '@ng-forge/dynamic-forms/internal';\nimport { FieldDef } from '@ng-forge/dynamic-forms/internal';\nimport { DynamicFormLogger } from '@ng-forge/dynamic-forms/internal';\nimport { WRAPPER_AUTO_ASSOCIATIONS, WRAPPER_REGISTRY } from '@ng-forge/dynamic-forms/internal';\nimport { DEFAULT_WRAPPERS } from '@ng-forge/dynamic-forms/internal';\nimport { isSameWrapperChain, resolveWrappers } from '../../utils/resolve-wrappers/resolve-wrappers';\nimport { createWrapperChainController } from '../../utils/wrapper-chain/wrapper-chain-controller';\nimport { GROUP_CONTEXT } from '@ng-forge/dynamic-forms/internal';\n\n/** Layout container that wraps child fields with UI chrome. */\n@Component({\n selector: 'div[container-field]',\n imports: [DfFieldOutlet],\n template: `\n <ng-template #childrenTpl>\n @for (field of resolvedFields(); track field.key) {\n <ng-container *dfFieldOutlet=\"field; environmentInjector: environmentInjector\" />\n }\n </ng-template>\n <ng-container #wrapperContainer></ng-container>\n `,\n styleUrl: './container-field.component.scss',\n host: {\n '[class]': 'hostClasses()',\n '[class.disabled]': 'disabled()',\n '[class.df-container-hidden]': 'hidden()',\n '[attr.aria-hidden]': 'hidden() || null',\n '[id]': '`${key()}`',\n '[attr.data-testid]': 'key()',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport default class ContainerFieldComponent {\n private readonly destroyRef = inject(DestroyRef);\n private readonly fieldRegistry = injectFieldRegistry();\n private readonly injector = inject(Injector);\n protected readonly environmentInjector = inject(EnvironmentInjector);\n private readonly eventBus = inject(EventBus);\n private readonly logger = inject(DynamicFormLogger);\n private readonly wrapperAutoAssociations = inject(WRAPPER_AUTO_ASSOCIATIONS);\n private readonly wrapperRegistry = inject(WRAPPER_REGISTRY);\n private readonly defaultWrappersSignal = inject(DEFAULT_WRAPPERS, { optional: true });\n private readonly groupContext = inject(GROUP_CONTEXT, { optional: true });\n\n private readonly childrenTpl = viewChild.required('childrenTpl', { read: TemplateRef });\n private readonly wrapperContainer = viewChild.required('wrapperContainer', { read: ViewContainerRef });\n\n field = input.required<ContainerField>();\n key = input.required<string>();\n className = input<string>();\n hidden = input(false);\n\n readonly hostClasses = computed(() => computeContainerHostClasses('container', this.className()));\n readonly disabled = computed(() => this.field().disabled || false);\n\n private readonly rawFieldRegistry = computed(() => this.fieldRegistry.raw);\n private readonly fieldsSource = computed(() => (this.field().fields || []) as FieldDef<unknown>[]);\n\n protected readonly resolvedFields = derivedFromDeferred(\n this.fieldsSource,\n createFieldResolutionPipe(() => ({\n loadTypeComponent: (type: string) => this.fieldRegistry.loadTypeComponent(type),\n registry: this.rawFieldRegistry(),\n injector: this.injector,\n destroyRef: this.destroyRef,\n onError: (fieldDef: FieldDef<unknown>, error: unknown) => {\n const fieldKey = fieldDef.key || '<no key>';\n\n const containerKey = this.field().key || '<no key>';\n this.logger.error(\n `Failed to load component for field type '${fieldDef.type}' (key: ${fieldKey}) ` +\n `within container '${containerKey}'. Ensure the field type is registered in your field registry.`,\n error,\n );\n },\n })),\n { initialValue: [] as ResolvedField[], injector: this.injector },\n );\n\n private readonly wrappers = computed(\n () => resolveWrappers(this.field(), this.defaultWrappersSignal?.(), this.wrapperAutoAssociations, this.wrapperRegistry),\n {\n equal: isSameWrapperChain,\n },\n );\n\n constructor() {\n setupContainerInitEffect(\n this.resolvedFields,\n this.eventBus,\n 'container',\n () => initializationComponentPath(this.field().key, this.groupContext?.groupPath()),\n this.injector,\n );\n\n createWrapperChainController({\n vcr: this.wrapperContainer,\n wrappers: this.wrappers,\n renderInnermost: (slot) => slot.createEmbeddedView(this.childrenTpl()),\n });\n }\n}\n\nexport { ContainerFieldComponent };\n"],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, Injector, ViewContainerRef, inject, input, viewChild } from "@angular/core";
3
+ import { derivedFrom } from "ngxtension/derived-from";
4
+ import { pipe, switchMap } from "rxjs";
5
+ import { dynamicTextToObservable } from "@ng-forge/dynamic-forms/internal";
6
+ var CssWrapperComponent = class CssWrapperComponent {
7
+ injector = inject(Injector);
8
+ fieldComponent = viewChild.required("fieldComponent", {
9
+ ...ngDevMode ? { debugName: "fieldComponent" } : /* istanbul ignore next */ {},
10
+ read: ViewContainerRef
11
+ });
12
+ cssClasses = input(...ngDevMode ? [void 0, { debugName: "cssClasses" }] : /* istanbul ignore next */ []);
13
+ fieldInputs = input(...ngDevMode ? [void 0, { debugName: "fieldInputs" }] : /* istanbul ignore next */ []);
14
+ resolvedClasses = derivedFrom([this.cssClasses], pipe(switchMap(([value]) => dynamicTextToObservable(value, this.injector))), { initialValue: "" });
15
+ static ɵfac = i0.ɵɵngDeclareFactory({
16
+ minVersion: "12.0.0",
17
+ version: "22.2.5",
18
+ ngImport: i0,
19
+ type: CssWrapperComponent,
20
+ deps: [],
21
+ target: i0.ɵɵFactoryTarget.Component
22
+ });
23
+ static ɵcmp = i0.ɵɵngDeclareComponent({
24
+ minVersion: "17.2.0",
25
+ version: "22.2.5",
26
+ type: CssWrapperComponent,
27
+ isStandalone: true,
28
+ selector: "df-css-wrapper",
29
+ inputs: {
30
+ cssClasses: {
31
+ classPropertyName: "cssClasses",
32
+ publicName: "cssClasses",
33
+ isSignal: true,
34
+ isRequired: false,
35
+ transformFunction: null
36
+ },
37
+ fieldInputs: {
38
+ classPropertyName: "fieldInputs",
39
+ publicName: "fieldInputs",
40
+ isSignal: true,
41
+ isRequired: false,
42
+ transformFunction: null
43
+ }
44
+ },
45
+ host: { properties: { "class": "resolvedClasses()" } },
46
+ viewQueries: [{
47
+ propertyName: "fieldComponent",
48
+ first: true,
49
+ predicate: ["fieldComponent"],
50
+ descendants: true,
51
+ read: ViewContainerRef,
52
+ isSignal: true
53
+ }],
54
+ ngImport: i0,
55
+ template: `<ng-container #fieldComponent></ng-container>`,
56
+ isInline: true,
57
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
58
+ });
59
+ };
60
+ i0.ɵɵngDeclareClassMetadata({
61
+ minVersion: "12.0.0",
62
+ version: "22.2.5",
63
+ ngImport: i0,
64
+ type: CssWrapperComponent,
65
+ decorators: [{
66
+ type: Component,
67
+ args: [{
68
+ selector: "df-css-wrapper",
69
+ template: `<ng-container #fieldComponent></ng-container>`,
70
+ changeDetection: ChangeDetectionStrategy.OnPush,
71
+ host: { "[class]": "resolvedClasses()" }
72
+ }]
73
+ }],
74
+ propDecorators: {
75
+ fieldComponent: [{
76
+ type: i0.ViewChild,
77
+ args: ["fieldComponent", {
78
+ read: ViewContainerRef,
79
+ isSignal: true
80
+ }]
81
+ }],
82
+ cssClasses: [{
83
+ type: i0.Input,
84
+ args: [{
85
+ isSignal: true,
86
+ alias: "cssClasses",
87
+ required: false
88
+ }]
89
+ }],
90
+ fieldInputs: [{
91
+ type: i0.Input,
92
+ args: [{
93
+ isSignal: true,
94
+ alias: "fieldInputs",
95
+ required: false
96
+ }]
97
+ }]
98
+ }
99
+ });
100
+ export { CssWrapperComponent, CssWrapperComponent as default };
101
+
102
+ //# sourceMappingURL=ng-forge-dynamic-forms-css-wrapper.component-R2yc-H0T.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ng-forge-dynamic-forms-css-wrapper.component-R2yc-H0T.mjs","names":[],"sources":["../../../../packages/dynamic-forms/src/lib/wrappers/css/css-wrapper.component.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, inject, Injector, input, Signal, ViewContainerRef, viewChild } from '@angular/core';\nimport { pipe, switchMap } from 'rxjs';\nimport { derivedFrom } from 'ngxtension/derived-from';\nimport { FieldWrapper } from '@ng-forge/dynamic-forms/internal';\nimport { DynamicText } from '@ng-forge/dynamic-forms/internal';\nimport { dynamicTextToObservable } from '@ng-forge/dynamic-forms/internal';\nimport { WrapperFieldInputs } from '@ng-forge/dynamic-forms/internal';\n\n/** Built-in CSS wrapper component. */\n@Component({\n selector: 'df-css-wrapper',\n template: `<ng-container #fieldComponent></ng-container>`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'resolvedClasses()',\n },\n})\nexport default class CssWrapperComponent implements FieldWrapper {\n private readonly injector = inject(Injector);\n\n readonly fieldComponent = viewChild.required('fieldComponent', { read: ViewContainerRef });\n\n readonly cssClasses = input<DynamicText>();\n readonly fieldInputs = input<WrapperFieldInputs>();\n\n readonly resolvedClasses: Signal<string> = derivedFrom(\n [this.cssClasses],\n pipe(switchMap(([value]) => dynamicTextToObservable(value, this.injector))),\n {\n initialValue: '',\n },\n );\n}\n\nexport { CssWrapperComponent };\n"],"mappings":";;;;;AAiBA,IAAqB,sBAArB,MAAqB,oBAAmB;CACrB,WAAW,OAAO,QAAQ;CAElC,iBAAiB,UAAU,SAAS,kBAAgB;EAAA,GAAA,YAAA,EAAA,WAAA,iBAAA,+BAAA,CAAA;EAAI,MAAM;CAAgB,CAAA;CAE9E,aAAa,MAAoB,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CACjC,cAAc,MAA2B,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAEzC,kBAAkC,YACzC,CAAC,KAAK,UAAU,GAChB,KAAK,WAAW,CAAC,WAAW,wBAAwB,OAAO,KAAK,QAAQ,CAAC,CAAC,GAC1E,EACE,cAAc,GACf,CAAA;CAbgB,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAmB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAnB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAmB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,aAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA,EAAA,YAAA,EAAA,SAAA,oBAAA,EAAA;EAAA,aAAA,CAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,gBAAA;GAAA,aAAA;GAAA,MAGiC;GAAgB,UAAA;EAAA,CAAA;EAAA,UAAA;EAAA,UAT7E;EAA+C,UAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AAMtC,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAmB,YAAA,CAAA;EARvC,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,UAAU;GACV,iBAAiB,wBAAwB;GACzC,MAAM,EACJ,WAAW,oBACZ;EACF,CAAA;CAI8C,CAAA;CAAA,gBAAA;EAAA,gBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,kBAAgB;IAAI,MAAM;IAAkB,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,YAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,aAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA"}
@@ -0,0 +1,4 @@
1
+ import "rxjs";
2
+ import "@angular/core/rxjs-interop";
3
+
4
+ //# sourceMappingURL=ng-forge-dynamic-forms-debounce-CG3uP5B-.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ng-forge-dynamic-forms-debounce-C9F4v1Ke.mjs","mappings":";;;AAKO;;;AAoBL;;AAOF;AAYM;;;;AAMN","names":[],"ignoreList":[],"sources":["../../../../packages/dynamic-forms/src/lib/utils/debounce/debounce.ts"],"sourcesContent":["import { Injector, Signal } from '@angular/core';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { debounceTime, distinctUntilChanged, tap } from 'rxjs';\n\n/** Default debounce duration in milliseconds. */\nexport const DEFAULT_DEBOUNCE_MS = 500;\n\n/**\n * Creates a debounced effect that triggers a callback after a signal's value\n * has stabilized for the specified duration.\n *\n * @param source - The source signal to watch for changes\n * @param callback - Function to call with the debounced value\n * @param options - Configuration options\n * @param options.ms - Debounce duration in milliseconds (default: 500)\n * @param options.injector - Angular injector for the effect context\n * @returns A signal that emits the debounced value (can be ignored if only side effects are needed)\n */\nexport function createDebouncedEffect<T>(\n source: Signal<T>,\n callback: (value: T) => void,\n options: { ms?: number; injector: Injector },\n): Signal<T | undefined> {\n const { ms = DEFAULT_DEBOUNCE_MS, injector } = options;\n\n const source$ = toObservable(source, { injector }).pipe(\n debounceTime(ms),\n distinctUntilChanged(),\n tap((value) => callback(value)),\n );\n\n return toSignal(source$, { injector });\n}\n\n/**\n * Creates a debounced signal that emits values from the source signal\n * only after the value has stabilized for the specified duration.\n *\n * @param source - The source signal to debounce\n * @param options - Configuration options\n * @param options.ms - Debounce duration in milliseconds (default: 500)\n * @param options.injector - Angular injector for the effect context\n * @returns A signal that emits the debounced value\n */\nexport function createDebouncedSignal<T>(source: Signal<T>, options: { ms?: number; injector: Injector }): Signal<T | undefined> {\n const { ms = DEFAULT_DEBOUNCE_MS, injector } = options;\n\n const source$ = toObservable(source, { injector }).pipe(debounceTime(ms), distinctUntilChanged());\n\n return toSignal(source$, { injector });\n}\n"]}
1
+ {"version":3,"file":"ng-forge-dynamic-forms-debounce-CG3uP5B-.mjs","names":[],"sources":["../../../../packages/dynamic-forms/src/lib/utils/debounce/debounce.ts"],"sourcesContent":["import { Injector, Signal } from '@angular/core';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { debounceTime, distinctUntilChanged, tap } from 'rxjs';\n\n/** Default debounce duration in milliseconds. */\nexport const DEFAULT_DEBOUNCE_MS = 500;\n\n/**\n * Creates a debounced effect that triggers a callback after a signal's value\n * has stabilized for the specified duration.\n *\n * @param source - The source signal to watch for changes\n * @param callback - Function to call with the debounced value\n * @param options - Configuration options\n * @param options.ms - Debounce duration in milliseconds (default: 500)\n * @param options.injector - Angular injector for the effect context\n * @returns A signal that emits the debounced value (can be ignored if only side effects are needed)\n */\nexport function createDebouncedEffect<T>(\n source: Signal<T>,\n callback: (value: T) => void,\n options: { ms?: number; injector: Injector },\n): Signal<T | undefined> {\n const { ms = DEFAULT_DEBOUNCE_MS, injector } = options;\n\n const source$ = toObservable(source, { injector }).pipe(\n debounceTime(ms),\n distinctUntilChanged(),\n tap((value) => callback(value)),\n );\n\n return toSignal(source$, { injector });\n}\n\n/**\n * Creates a debounced signal that emits values from the source signal\n * only after the value has stabilized for the specified duration.\n *\n * @param source - The source signal to debounce\n * @param options - Configuration options\n * @param options.ms - Debounce duration in milliseconds (default: 500)\n * @param options.injector - Angular injector for the effect context\n * @returns A signal that emits the debounced value\n */\nexport function createDebouncedSignal<T>(source: Signal<T>, options: { ms?: number; injector: Injector }): Signal<T | undefined> {\n const { ms = DEFAULT_DEBOUNCE_MS, injector } = options;\n\n const source$ = toObservable(source, { injector }).pipe(debounceTime(ms), distinctUntilChanged());\n\n return toSignal(source$, { injector });\n}\n"],"mappings":""}
@@ -0,0 +1,77 @@
1
+ import { getFieldValueHandling } from "@ng-forge/dynamic-forms/internal";
2
+ const NORMALIZED_ARRAY_METADATA = Symbol("normalizedArrayMetadata");
3
+ function setNormalizedArrayMetadata(arrayField, metadata) {
4
+ arrayField[NORMALIZED_ARRAY_METADATA] = metadata;
5
+ }
6
+ function getNormalizedArrayMetadata(arrayField) {
7
+ return arrayField[NORMALIZED_ARRAY_METADATA];
8
+ }
9
+ function getFieldDefaultValue(field, registry) {
10
+ const valueHandling = getFieldValueHandling(field.type, registry);
11
+ if (valueHandling === "exclude") return;
12
+ if (valueHandling === "flatten" && "fields" in field && field.fields) {
13
+ const childFields = field.fields;
14
+ const flattenedValues = {};
15
+ for (const childField of childFields) {
16
+ const childValueHandling = getFieldValueHandling(childField.type, registry);
17
+ if (childValueHandling === "exclude") continue;
18
+ const childValue = getFieldDefaultValue(childField, registry);
19
+ if (childValue === void 0) continue;
20
+ if (childValueHandling === "flatten" && childValue && typeof childValue === "object" && !Array.isArray(childValue)) Object.assign(flattenedValues, childValue);
21
+ else if ("key" in childField && childField.key) flattenedValues[childField.key] = childValue;
22
+ }
23
+ return Object.keys(flattenedValues).length > 0 ? flattenedValues : void 0;
24
+ }
25
+ if (field.type === "group" && "fields" in field) {
26
+ const fields = field.fields;
27
+ if (!fields || fields.length === 0) return;
28
+ const groupDefaults = {};
29
+ for (const childField of fields) {
30
+ const childValueHandling = getFieldValueHandling(childField.type, registry);
31
+ if (childValueHandling === "exclude") continue;
32
+ const childValue = getFieldDefaultValue(childField, registry);
33
+ if (childValueHandling === "flatten") {
34
+ if (childValue && typeof childValue === "object" && !Array.isArray(childValue)) Object.assign(groupDefaults, childValue);
35
+ } else if ("key" in childField && childField.key) {
36
+ if (childValue !== void 0) groupDefaults[childField.key] = childValue;
37
+ }
38
+ }
39
+ return groupDefaults;
40
+ }
41
+ const valueField = field;
42
+ const isNullable = valueField.nullable === true;
43
+ if ("value" in field) {
44
+ if (valueField.value !== null && valueField.value !== void 0) return valueField.value;
45
+ if (valueField.value === null && isNullable) return null;
46
+ }
47
+ if (isNullable) return null;
48
+ if (field.type === "checkbox") return false;
49
+ if (field.type === "array") {
50
+ const itemDefinitions = field.fields;
51
+ if (!itemDefinitions || itemDefinitions.length === 0) return [];
52
+ return itemDefinitions.map((itemDef) => {
53
+ if (!Array.isArray(itemDef)) return getFieldDefaultValue(itemDef, registry);
54
+ const itemFields = itemDef;
55
+ let itemValue = {};
56
+ for (const templateField of itemFields) {
57
+ const fieldValue = getFieldDefaultValue(templateField, registry);
58
+ const fieldValueHandling = getFieldValueHandling(templateField.type, registry);
59
+ if (templateField.type === "group" && "key" in templateField && templateField.key) itemValue[templateField.key] = fieldValue;
60
+ else if (templateField.type === "row" || templateField.type === "container") {
61
+ if (fieldValue && typeof fieldValue === "object") itemValue = {
62
+ ...itemValue,
63
+ ...fieldValue
64
+ };
65
+ } else if (fieldValueHandling === "include" && "key" in templateField && templateField.key) itemValue[templateField.key] = fieldValue;
66
+ }
67
+ return itemValue;
68
+ });
69
+ }
70
+ if (field.type === "input" && "props" in field) {
71
+ if (field.props?.type === "number") return NaN;
72
+ }
73
+ return "";
74
+ }
75
+ export { getNormalizedArrayMetadata as n, setNormalizedArrayMetadata as r, getFieldDefaultValue as t };
76
+
77
+ //# sourceMappingURL=ng-forge-dynamic-forms-default-value-D5M4MNE-.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ng-forge-dynamic-forms-default-value-D5M4MNE-.mjs","names":["arrayField"],"sources":["../../../../packages/dynamic-forms/src/lib/utils/array-field/normalized-array-metadata.ts","../../../../packages/dynamic-forms/src/lib/utils/default-value/default-value.ts"],"sourcesContent":["import { FieldDef } from '@ng-forge/dynamic-forms/internal';\nimport { ArrayAllowedChildren } from '@ng-forge/dynamic-forms/internal';\n\n/** Metadata attached to normalized array fields during simplified array expansion. */\nexport interface NormalizedArrayMetadata {\n /**\n * Remove button FieldDef for primitive simplified arrays.\n * The array component renders this alongside each item without\n * wrapping in a row, preserving flat primitive form values.\n */\n readonly autoRemoveButton?: FieldDef<unknown>;\n /**\n * For primitive simplified arrays, the key of the value field template (e.g., 'value').\n * Stored during normalization so the array component doesn't need dynamic discovery.\n */\n readonly primitiveFieldKey?: string;\n /**\n * Copied from `SimplifiedArrayField.template` during normalization. Used as the\n * fallback template for any array item present in the form value that was not\n * added through the event handlers and is not covered by a positional entry in\n * `fields` — e.g., items introduced by external form-value updates.\n */\n readonly template?: ArrayAllowedChildren | readonly ArrayAllowedChildren[];\n}\n\n/**\n * Symbol key for storing normalization metadata on array field objects.\n * Using a Symbol ensures no collision with user-defined properties and\n * the property is excluded from JSON serialization and enumeration.\n */\nexport const NORMALIZED_ARRAY_METADATA = Symbol('normalizedArrayMetadata');\n\n/**\n * Associates normalization metadata with an array field object.\n * Called during simplified array expansion.\n */\nexport function setNormalizedArrayMetadata(arrayField: Record<string | symbol, unknown>, metadata: NormalizedArrayMetadata): void {\n arrayField[NORMALIZED_ARRAY_METADATA] = metadata;\n}\n\n/**\n * Retrieves normalization metadata for an array field, if any.\n * Returns undefined for full-API arrays that were not normalized from a simplified definition.\n */\nexport function getNormalizedArrayMetadata(arrayField: object): NormalizedArrayMetadata | undefined {\n return (arrayField as Record<symbol, unknown>)[NORMALIZED_ARRAY_METADATA] as NormalizedArrayMetadata | undefined;\n}\n","import { FieldDef } from '@ng-forge/dynamic-forms/internal';\nimport { FieldTypeDefinition, getFieldValueHandling } from '@ng-forge/dynamic-forms/internal';\n\n/**\n * Generates appropriate default values for different field types in dynamic forms.\n *\n * @param field - Field definition to generate default value for\n * @param registry - Field type registry for value handling configuration\n * @returns Appropriate default value based on field type and configuration\n */\nexport function getFieldDefaultValue(field: FieldDef<unknown>, registry: Map<string, FieldTypeDefinition>): unknown {\n const valueHandling = getFieldValueHandling(field.type, registry);\n\n // Fields with 'exclude' handling don't contribute values\n if (valueHandling === 'exclude') {\n return undefined;\n }\n\n // Flatten fields (row/page/container) return flattened object of children's values\n // This is used by array fields to get the template structure\n // Note: fieldsToDefaultValues will skip these at top-level since they have keys and return objects\n if (valueHandling === 'flatten' && 'fields' in field && field.fields) {\n const childFields = field.fields as readonly FieldDef<unknown>[];\n\n // Collect only fields that contribute values (exclude buttons, text, etc.)\n const flattenedValues: Record<string, unknown> = {};\n for (const childField of childFields) {\n const childValueHandling = getFieldValueHandling(childField.type, registry);\n if (childValueHandling === 'exclude') continue;\n\n const childValue = getFieldDefaultValue(childField, registry);\n if (childValue === undefined) continue;\n\n if (childValueHandling === 'flatten' && childValue && typeof childValue === 'object' && !Array.isArray(childValue)) {\n // Nested flatten field — its value is already flat; spread it up.\n Object.assign(flattenedValues, childValue as Record<string, unknown>);\n } else if ('key' in childField && childField.key) {\n flattenedValues[childField.key] = childValue;\n }\n }\n\n // Return flattened object if there are any values, otherwise undefined\n return Object.keys(flattenedValues).length > 0 ? flattenedValues : undefined;\n }\n\n // Group fields with 'include' handling create nested objects\n if (field.type === 'group' && 'fields' in field) {\n const fields = field.fields as readonly FieldDef<unknown>[];\n if (!fields || fields.length === 0) {\n return undefined;\n }\n\n const groupDefaults: Record<string, unknown> = {};\n for (const childField of fields) {\n const childValueHandling = getFieldValueHandling(childField.type, registry);\n if (childValueHandling === 'exclude') continue;\n\n const childValue = getFieldDefaultValue(childField, registry);\n\n if (childValueHandling === 'flatten') {\n // Flatten container/row/page values into the group (they are presentational containers).\n // The recursive call already returns a flat object — spread it directly.\n if (childValue && typeof childValue === 'object' && !Array.isArray(childValue)) {\n Object.assign(groupDefaults, childValue as Record<string, unknown>);\n }\n } else if ('key' in childField && childField.key) {\n if (childValue !== undefined) {\n groupDefaults[childField.key] = childValue;\n }\n }\n }\n return groupDefaults;\n }\n\n // Narrow once: `field` is FieldDef<unknown>, but value/nullable are defined on BaseValueField.\n // This cast avoids per-access `as` and documents what we're reading.\n const valueField = field as FieldDef<unknown> & { value?: unknown; nullable?: boolean };\n const isNullable = valueField.nullable === true;\n\n // Use explicit value if provided (including null when nullable)\n if ('value' in field) {\n if (valueField.value !== null && valueField.value !== undefined) {\n return valueField.value;\n }\n\n // Preserve explicit null for nullable fields\n if (valueField.value === null && isNullable) {\n return null;\n }\n\n // Non-nullable null and undefined both fall through to type-specific defaults below\n }\n\n // Nullable fields with no explicit value default to null\n if (isNullable) {\n return null;\n }\n\n // Type-specific defaults when no value is specified\n if (field.type === 'checkbox') {\n return false;\n }\n\n if (field.type === 'array') {\n // Array field supports two item formats:\n // - Primitive items: single FieldDef (not wrapped in array) → extracts field value directly\n // - Object items: FieldDef[] (array of fields) → merges fields into object\n const arrayField = field as { fields?: readonly (FieldDef<unknown> | readonly FieldDef<unknown>[])[] };\n const itemDefinitions = arrayField.fields;\n\n if (!itemDefinitions || itemDefinitions.length === 0) {\n return [];\n }\n\n // Process each item definition\n return itemDefinitions.map((itemDef) => {\n // Primitive item: single FieldDef (not wrapped in array)\n // Extract field value directly - key is for internal tracking only\n if (!Array.isArray(itemDef)) {\n return getFieldDefaultValue(itemDef as FieldDef<unknown>, registry);\n }\n\n // Object item: FieldDef[] - merge fields into object\n const itemFields = itemDef as readonly FieldDef<unknown>[];\n let itemValue: Record<string, unknown> = {};\n\n for (const templateField of itemFields) {\n const fieldValue = getFieldDefaultValue(templateField, registry);\n const fieldValueHandling = getFieldValueHandling(templateField.type, registry);\n\n if (templateField.type === 'group' && 'key' in templateField && templateField.key) {\n // Groups wrap their value under the group key\n itemValue[templateField.key] = fieldValue;\n } else if (templateField.type === 'row' || templateField.type === 'container') {\n // Rows and containers flatten their fields directly\n if (fieldValue && typeof fieldValue === 'object') {\n itemValue = { ...itemValue, ...(fieldValue as Record<string, unknown>) };\n }\n } else if (fieldValueHandling === 'include' && 'key' in templateField && templateField.key) {\n itemValue[templateField.key] = fieldValue;\n }\n }\n\n return itemValue;\n });\n }\n\n // Number inputs need a number type default for Angular signal forms\n // to use valueAsNumber for coercion. NaN is ideal because:\n // - typeof NaN === 'number' (triggers Angular's valueAsNumber path)\n // - NaN displays as empty in number inputs\n // - valueAsNumber returns NaN when input is cleared\n if (field.type === 'input' && 'props' in field) {\n const props = field.props as { type?: string } | undefined;\n if (props?.type === 'number') {\n return NaN;\n }\n }\n\n return '';\n}\n"],"mappings":";AA8BA,MAAa,4BAA4B,OAAO,yBAAyB;AAMzE,SAAgB,2BAA2B,YAA8C,UAAiC;CACxH,WAAW,6BAA6B;AAC1C;AAMA,SAAgB,2BAA2B,YAAkB;CAC3D,OAAQ,WAAuC;AACjD;ACpCA,SAAgB,qBAAqB,OAA0B,UAA0C;CACvG,MAAM,gBAAgB,sBAAsB,MAAM,MAAM,QAAQ;CAGhE,IAAI,kBAAkB,WACpB;CAMF,IAAI,kBAAkB,aAAa,YAAY,SAAS,MAAM,QAAQ;EACpE,MAAM,cAAc,MAAM;EAG1B,MAAM,kBAA2C,CAAA;EACjD,KAAK,MAAM,cAAc,aAAa;GACpC,MAAM,qBAAqB,sBAAsB,WAAW,MAAM,QAAQ;GAC1E,IAAI,uBAAuB,WAAW;GAEtC,MAAM,aAAa,qBAAqB,YAAY,QAAQ;GAC5D,IAAI,eAAe,QAAW;GAE9B,IAAI,uBAAuB,aAAa,cAAc,OAAO,eAAe,YAAY,CAAC,MAAM,QAAQ,UAAU,GAE/G,OAAO,OAAO,iBAAiB,UAAqC;QAC/D,IAAI,SAAS,cAAc,WAAW,KAC3C,gBAAgB,WAAW,OAAO;EAEtC;EAGA,OAAO,OAAO,KAAK,eAAe,CAAC,CAAC,SAAS,IAAI,kBAAkB;CACrE;CAGA,IAAI,MAAM,SAAS,WAAW,YAAY,OAAO;EAC/C,MAAM,SAAS,MAAM;EACrB,IAAI,CAAC,UAAU,OAAO,WAAW,GAC/B;EAGF,MAAM,gBAAyC,CAAA;EAC/C,KAAK,MAAM,cAAc,QAAQ;GAC/B,MAAM,qBAAqB,sBAAsB,WAAW,MAAM,QAAQ;GAC1E,IAAI,uBAAuB,WAAW;GAEtC,MAAM,aAAa,qBAAqB,YAAY,QAAQ;GAE5D,IAAI,uBAAuB,WAGzB;QAAI,cAAc,OAAO,eAAe,YAAY,CAAC,MAAM,QAAQ,UAAU,GAC3E,OAAO,OAAO,eAAe,UAAqC;GACpE,OACK,IAAI,SAAS,cAAc,WAAW,KAC3C;QAAI,eAAe,QACjB,cAAc,WAAW,OAAO;GAClC;EAEJ;EACA,OAAO;CACT;CAIA,MAAM,aAAa;CACnB,MAAM,aAAa,WAAW,aAAa;CAG3C,IAAI,WAAW,OAAO;EACpB,IAAI,WAAW,UAAU,QAAQ,WAAW,UAAU,QACpD,OAAO,WAAW;EAIpB,IAAI,WAAW,UAAU,QAAQ,YAC/B,OAAO;CAIX;CAGA,IAAI,YACF,OAAO;CAIT,IAAI,MAAM,SAAS,YACjB,OAAO;CAGT,IAAI,MAAM,SAAS,SAAS;EAK1B,MAAM,kBAAkBA,MAAW;EAEnC,IAAI,CAAC,mBAAmB,gBAAgB,WAAW,GACjD,OAAO,CAAA;EAIT,OAAO,gBAAgB,KAAK,YAAW;GAGrC,IAAI,CAAC,MAAM,QAAQ,OAAO,GACxB,OAAO,qBAAqB,SAA8B,QAAQ;GAIpE,MAAM,aAAa;GACnB,IAAI,YAAqC,CAAA;GAEzC,KAAK,MAAM,iBAAiB,YAAY;IACtC,MAAM,aAAa,qBAAqB,eAAe,QAAQ;IAC/D,MAAM,qBAAqB,sBAAsB,cAAc,MAAM,QAAQ;IAE7E,IAAI,cAAc,SAAS,WAAW,SAAS,iBAAiB,cAAc,KAE5E,UAAU,cAAc,OAAO;SAC1B,IAAI,cAAc,SAAS,SAAS,cAAc,SAAS,aAEhE;SAAI,cAAc,OAAO,eAAe,UACtC,YAAY;MAAE,GAAG;MAAW,GAAI;KAAsC;IACxE,OACK,IAAI,uBAAuB,aAAa,SAAS,iBAAiB,cAAc,KACrF,UAAU,cAAc,OAAO;GAEnC;GAEA,OAAO;EACT,CAAC;CACH;CAOA,IAAI,MAAM,SAAS,WAAW,WAAW,OAEvC;MADc,MAAM,OACT,SAAS,UAClB,OAAO;CACT;CAGF,OAAO;AACT"}
@@ -0,0 +1,4 @@
1
+ const DEV_MODE = typeof ngDevMode === "undefined" || !!ngDevMode;
2
+ export { DEV_MODE as t };
3
+
4
+ //# sourceMappingURL=ng-forge-dynamic-forms-dev-mode-4rbYBBo_.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ng-forge-dynamic-forms-dev-mode-4rbYBBo_.mjs","names":[],"sources":["../../../../packages/dynamic-forms/src/lib/utils/dev-mode.ts"],"sourcesContent":["declare const ngDevMode: boolean | undefined;\n\n/** Dev-mode guard for tree-shakeable diagnostics. */\nexport const DEV_MODE: boolean = typeof ngDevMode === 'undefined' || !!ngDevMode;\n"],"mappings":"AAGA,MAAa,WAAoB,OAAO,cAAc,eAAe,CAAC,CAAC"}