ngx-dynamic-entity 0.0.1 → 1.0.0

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 (84) hide show
  1. package/README.md +139 -0
  2. package/esm2022/lib/field-types/array-field.component.mjs +160 -0
  3. package/esm2022/lib/field-types/boolean-field.component.mjs +100 -0
  4. package/esm2022/lib/field-types/checkbox-field.component.mjs +49 -41
  5. package/esm2022/lib/field-types/currency-field.component.mjs +101 -0
  6. package/esm2022/lib/field-types/date-field.component.mjs +47 -39
  7. package/esm2022/lib/field-types/dropdown-field.component.mjs +145 -54
  8. package/esm2022/lib/field-types/email-field.component.mjs +101 -0
  9. package/esm2022/lib/field-types/entity-ref-field.component.mjs +134 -70
  10. package/esm2022/lib/field-types/file-field.component.mjs +156 -0
  11. package/esm2022/lib/field-types/group-field.component.mjs +89 -0
  12. package/esm2022/lib/field-types/image-field.component.mjs +168 -0
  13. package/esm2022/lib/field-types/month-year-field.component.mjs +151 -0
  14. package/esm2022/lib/field-types/multi-select-field.component.mjs +110 -56
  15. package/esm2022/lib/field-types/number-field.component.mjs +84 -41
  16. package/esm2022/lib/field-types/password-field.component.mjs +109 -0
  17. package/esm2022/lib/field-types/radio-field.component.mjs +152 -0
  18. package/esm2022/lib/field-types/text-field.component.mjs +82 -42
  19. package/esm2022/lib/field-types/textarea-field.component.mjs +52 -41
  20. package/esm2022/lib/form/dynamic-field/dynamic-field.component.mjs +44 -26
  21. package/esm2022/lib/form/dynamic-form.component.mjs +501 -67
  22. package/esm2022/lib/form/dynamic-record-form.component.mjs +469 -0
  23. package/esm2022/lib/providers/provide-field-types.mjs +72 -0
  24. package/esm2022/lib/providers/provide-ngx-dynamic-entity.mjs +3 -5
  25. package/esm2022/lib/services/cascade-data.service.mjs +129 -0
  26. package/esm2022/lib/services/config-source.service.mjs +67 -0
  27. package/esm2022/lib/services/entity-ref-cache.mjs +20 -0
  28. package/esm2022/lib/services/entity-ref-registry.service.mjs +3 -3
  29. package/esm2022/lib/services/entity-ref-selection.service.mjs +27 -0
  30. package/esm2022/lib/services/entity-reference.service.mjs +168 -0
  31. package/esm2022/lib/services/field-registry.service.mjs +35 -30
  32. package/esm2022/lib/services/file-upload.service.mjs +89 -0
  33. package/esm2022/lib/services/lookup-registry.service.mjs +246 -0
  34. package/esm2022/lib/services/rbac.service.mjs +5 -11
  35. package/esm2022/lib/services/rules-evaluation.service.mjs +27 -0
  36. package/esm2022/lib/services/validator-registry.service.mjs +24 -7
  37. package/esm2022/lib/tokens/injection-tokens.mjs +88 -7
  38. package/esm2022/public-api.mjs +14 -5
  39. package/fesm2022/ngx-dynamic-entity.mjs +3985 -876
  40. package/fesm2022/ngx-dynamic-entity.mjs.map +1 -1
  41. package/lib/field-types/array-field.component.d.ts +22 -0
  42. package/lib/field-types/boolean-field.component.d.ts +18 -0
  43. package/lib/field-types/checkbox-field.component.d.ts +3 -2
  44. package/lib/field-types/currency-field.component.d.ts +17 -0
  45. package/lib/field-types/date-field.component.d.ts +3 -2
  46. package/lib/field-types/dropdown-field.component.d.ts +24 -4
  47. package/lib/field-types/email-field.component.d.ts +15 -0
  48. package/lib/field-types/entity-ref-field.component.d.ts +24 -11
  49. package/lib/field-types/file-field.component.d.ts +25 -0
  50. package/lib/field-types/group-field.component.d.ts +17 -0
  51. package/lib/field-types/image-field.component.d.ts +30 -0
  52. package/lib/field-types/month-year-field.component.d.ts +28 -0
  53. package/lib/field-types/multi-select-field.component.d.ts +18 -4
  54. package/lib/field-types/number-field.component.d.ts +5 -2
  55. package/lib/field-types/password-field.component.d.ts +17 -0
  56. package/lib/field-types/radio-field.component.d.ts +33 -0
  57. package/lib/field-types/text-field.component.d.ts +5 -3
  58. package/lib/field-types/textarea-field.component.d.ts +4 -2
  59. package/lib/form/dynamic-field/dynamic-field.component.d.ts +20 -7
  60. package/lib/form/dynamic-form.component.d.ts +111 -19
  61. package/lib/form/dynamic-record-form.component.d.ts +169 -0
  62. package/lib/providers/provide-field-types.d.ts +24 -0
  63. package/lib/providers/provide-ngx-dynamic-entity.d.ts +12 -7
  64. package/lib/services/cascade-data.service.d.ts +45 -0
  65. package/lib/services/config-source.service.d.ts +14 -0
  66. package/lib/services/entity-ref-cache.d.ts +27 -0
  67. package/lib/services/entity-ref-registry.service.d.ts +4 -3
  68. package/lib/services/entity-ref-selection.service.d.ts +24 -0
  69. package/lib/services/entity-reference.service.d.ts +49 -0
  70. package/lib/services/field-registry.service.d.ts +17 -7
  71. package/lib/services/file-upload.service.d.ts +27 -0
  72. package/lib/services/lookup-registry.service.d.ts +94 -0
  73. package/lib/services/rbac.service.d.ts +4 -9
  74. package/lib/services/rules-evaluation.service.d.ts +17 -0
  75. package/lib/services/validator-registry.service.d.ts +5 -4
  76. package/lib/tokens/injection-tokens.d.ts +90 -7
  77. package/package.json +14 -3
  78. package/public-api.d.ts +11 -4
  79. package/esm2022/lib/services/config.service.mjs +0 -58
  80. package/esm2022/lib/services/version.service.mjs +0 -40
  81. package/esm2022/lib/table/dynamic-table.component.mjs +0 -160
  82. package/lib/services/config.service.d.ts +0 -25
  83. package/lib/services/version.service.d.ts +0 -26
  84. package/lib/table/dynamic-table.component.d.ts +0 -56
@@ -0,0 +1,72 @@
1
+ import { makeEnvironmentProviders } from '@angular/core';
2
+ import { FIELD_TYPE_SETS } from '../tokens/injection-tokens';
3
+ import { TextFieldComponent } from '../field-types/text-field.component';
4
+ import { TextareaFieldComponent } from '../field-types/textarea-field.component';
5
+ import { NumberFieldComponent } from '../field-types/number-field.component';
6
+ import { CurrencyFieldComponent } from '../field-types/currency-field.component';
7
+ import { EmailFieldComponent } from '../field-types/email-field.component';
8
+ import { PasswordFieldComponent } from '../field-types/password-field.component';
9
+ import { CheckboxFieldComponent } from '../field-types/checkbox-field.component';
10
+ import { BooleanFieldComponent } from '../field-types/boolean-field.component';
11
+ import { DateFieldComponent } from '../field-types/date-field.component';
12
+ import { MonthYearFieldComponent } from '../field-types/month-year-field.component';
13
+ import { DropdownFieldComponent } from '../field-types/dropdown-field.component';
14
+ import { RadioFieldComponent } from '../field-types/radio-field.component';
15
+ import { MultiSelectFieldComponent } from '../field-types/multi-select-field.component';
16
+ import { EntityRefFieldComponent } from '../field-types/entity-ref-field.component';
17
+ import { GroupFieldComponent } from '../field-types/group-field.component';
18
+ import { ArrayFieldComponent } from '../field-types/array-field.component';
19
+ import { ImageFieldComponent } from '../field-types/image-field.component';
20
+ import { FileFieldComponent } from '../field-types/file-field.component';
21
+ /**
22
+ * Field-type registration — the tree-shaking seam.
23
+ *
24
+ * `FieldRegistryService` imports no components. Whatever you register here is what gets
25
+ * bundled, so an app that only uses text/number/dropdown pays for three components and
26
+ * their imports, not nineteen.
27
+ *
28
+ * ```ts
29
+ * // Everything (convenient; bundles all built-ins):
30
+ * provideNgxDynamicEntity(), provideBuiltInFieldTypes()
31
+ *
32
+ * // Only what this app renders:
33
+ * provideFieldTypes({ text: TextFieldComponent, number: NumberFieldComponent })
34
+ * ```
35
+ *
36
+ * Both merge into `FIELD_TYPE_REGISTRY`; later registrations win on key collision.
37
+ */
38
+ /** Map of every built-in field type key → component. Referencing this pulls in all of them. */
39
+ export function builtInFieldTypes() {
40
+ return {
41
+ text: TextFieldComponent,
42
+ textarea: TextareaFieldComponent,
43
+ number: NumberFieldComponent,
44
+ currency: CurrencyFieldComponent,
45
+ email: EmailFieldComponent,
46
+ password: PasswordFieldComponent,
47
+ checkbox: CheckboxFieldComponent,
48
+ boolean: BooleanFieldComponent,
49
+ date: DateFieldComponent,
50
+ datetime: DateFieldComponent,
51
+ monthYear: MonthYearFieldComponent,
52
+ dropdown: DropdownFieldComponent,
53
+ radio: RadioFieldComponent,
54
+ multiSelect: MultiSelectFieldComponent,
55
+ 'entity-ref': EntityRefFieldComponent,
56
+ group: GroupFieldComponent,
57
+ array: ArrayFieldComponent,
58
+ image: ImageFieldComponent,
59
+ file: FileFieldComponent,
60
+ };
61
+ }
62
+ /** Register a specific set of field types. Only the components you name are bundled. */
63
+ export function provideFieldTypes(types) {
64
+ return makeEnvironmentProviders([
65
+ { provide: FIELD_TYPE_SETS, useValue: types, multi: true },
66
+ ]);
67
+ }
68
+ /** Register all 19 built-in field type keys. Convenience for apps that use most of them. */
69
+ export function provideBuiltInFieldTypes() {
70
+ return provideFieldTypes(builtInFieldTypes());
71
+ }
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZS1maWVsZC10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcHJvdmlkZXJzL3Byb3ZpZGUtZmllbGQtdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUE4Qix3QkFBd0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDekUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDN0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDekUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDcEYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDeEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDcEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFekU7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSCwrRkFBK0Y7QUFDL0YsTUFBTSxVQUFVLGlCQUFpQjtJQUMvQixPQUFPO1FBQ0wsSUFBSSxFQUFFLGtCQUFrQjtRQUN4QixRQUFRLEVBQUUsc0JBQXNCO1FBQ2hDLE1BQU0sRUFBRSxvQkFBb0I7UUFDNUIsUUFBUSxFQUFFLHNCQUFzQjtRQUNoQyxLQUFLLEVBQUUsbUJBQW1CO1FBQzFCLFFBQVEsRUFBRSxzQkFBc0I7UUFDaEMsUUFBUSxFQUFFLHNCQUFzQjtRQUNoQyxPQUFPLEVBQUUscUJBQXFCO1FBQzlCLElBQUksRUFBRSxrQkFBa0I7UUFDeEIsUUFBUSxFQUFFLGtCQUFrQjtRQUM1QixTQUFTLEVBQUUsdUJBQXVCO1FBQ2xDLFFBQVEsRUFBRSxzQkFBc0I7UUFDaEMsS0FBSyxFQUFFLG1CQUFtQjtRQUMxQixXQUFXLEVBQUUseUJBQXlCO1FBQ3RDLFlBQVksRUFBRSx1QkFBdUI7UUFDckMsS0FBSyxFQUFFLG1CQUFtQjtRQUMxQixLQUFLLEVBQUUsbUJBQW1CO1FBQzFCLEtBQUssRUFBRSxtQkFBbUI7UUFDMUIsSUFBSSxFQUFFLGtCQUFrQjtLQUN6QixDQUFDO0FBQ0osQ0FBQztBQUVELHdGQUF3RjtBQUN4RixNQUFNLFVBQVUsaUJBQWlCLENBQUMsS0FBZ0M7SUFDaEUsT0FBTyx3QkFBd0IsQ0FBQztRQUM5QixFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0tBQzNELENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCw0RkFBNEY7QUFDNUYsTUFBTSxVQUFVLHdCQUF3QjtJQUN0QyxPQUFPLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztBQUNoRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW52aXJvbm1lbnRQcm92aWRlcnMsIFR5cGUsIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGSUVMRF9UWVBFX1NFVFMgfSBmcm9tICcuLi90b2tlbnMvaW5qZWN0aW9uLXRva2Vucyc7XHJcblxyXG5pbXBvcnQgeyBUZXh0RmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9maWVsZC10eXBlcy90ZXh0LWZpZWxkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRleHRhcmVhRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9maWVsZC10eXBlcy90ZXh0YXJlYS1maWVsZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBOdW1iZXJGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2ZpZWxkLXR5cGVzL251bWJlci1maWVsZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDdXJyZW5jeUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvY3VycmVuY3ktZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRW1haWxGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2ZpZWxkLXR5cGVzL2VtYWlsLWZpZWxkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFBhc3N3b3JkRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9maWVsZC10eXBlcy9wYXNzd29yZC1maWVsZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDaGVja2JveEZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvY2hlY2tib3gtZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQm9vbGVhbkZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvYm9vbGVhbi1maWVsZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBEYXRlRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9maWVsZC10eXBlcy9kYXRlLWZpZWxkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE1vbnRoWWVhckZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvbW9udGgteWVhci1maWVsZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBEcm9wZG93bkZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvZHJvcGRvd24tZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgUmFkaW9GaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2ZpZWxkLXR5cGVzL3JhZGlvLWZpZWxkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE11bHRpU2VsZWN0RmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9maWVsZC10eXBlcy9tdWx0aS1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRW50aXR5UmVmRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9maWVsZC10eXBlcy9lbnRpdHktcmVmLWZpZWxkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEdyb3VwRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9maWVsZC10eXBlcy9ncm91cC1maWVsZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBBcnJheUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmllbGQtdHlwZXMvYXJyYXktZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgSW1hZ2VGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2ZpZWxkLXR5cGVzL2ltYWdlLWZpZWxkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZpbGVGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2ZpZWxkLXR5cGVzL2ZpbGUtZmllbGQuY29tcG9uZW50JztcclxuXHJcbi8qKlxyXG4gKiBGaWVsZC10eXBlIHJlZ2lzdHJhdGlvbiDigJQgdGhlIHRyZWUtc2hha2luZyBzZWFtLlxyXG4gKlxyXG4gKiBgRmllbGRSZWdpc3RyeVNlcnZpY2VgIGltcG9ydHMgbm8gY29tcG9uZW50cy4gV2hhdGV2ZXIgeW91IHJlZ2lzdGVyIGhlcmUgaXMgd2hhdCBnZXRzXHJcbiAqIGJ1bmRsZWQsIHNvIGFuIGFwcCB0aGF0IG9ubHkgdXNlcyB0ZXh0L251bWJlci9kcm9wZG93biBwYXlzIGZvciB0aHJlZSBjb21wb25lbnRzIGFuZFxyXG4gKiB0aGVpciBpbXBvcnRzLCBub3QgbmluZXRlZW4uXHJcbiAqXHJcbiAqIGBgYHRzXHJcbiAqIC8vIEV2ZXJ5dGhpbmcgKGNvbnZlbmllbnQ7IGJ1bmRsZXMgYWxsIGJ1aWx0LWlucyk6XHJcbiAqIHByb3ZpZGVOZ3hEeW5hbWljRW50aXR5KCksIHByb3ZpZGVCdWlsdEluRmllbGRUeXBlcygpXHJcbiAqXHJcbiAqIC8vIE9ubHkgd2hhdCB0aGlzIGFwcCByZW5kZXJzOlxyXG4gKiBwcm92aWRlRmllbGRUeXBlcyh7IHRleHQ6IFRleHRGaWVsZENvbXBvbmVudCwgbnVtYmVyOiBOdW1iZXJGaWVsZENvbXBvbmVudCB9KVxyXG4gKiBgYGBcclxuICpcclxuICogQm90aCBtZXJnZSBpbnRvIGBGSUVMRF9UWVBFX1JFR0lTVFJZYDsgbGF0ZXIgcmVnaXN0cmF0aW9ucyB3aW4gb24ga2V5IGNvbGxpc2lvbi5cclxuICovXHJcblxyXG4vKiogTWFwIG9mIGV2ZXJ5IGJ1aWx0LWluIGZpZWxkIHR5cGUga2V5IOKGkiBjb21wb25lbnQuIFJlZmVyZW5jaW5nIHRoaXMgcHVsbHMgaW4gYWxsIG9mIHRoZW0uICovXHJcbmV4cG9ydCBmdW5jdGlvbiBidWlsdEluRmllbGRUeXBlcygpOiBSZWNvcmQ8c3RyaW5nLCBUeXBlPGFueT4+IHtcclxuICByZXR1cm4ge1xyXG4gICAgdGV4dDogVGV4dEZpZWxkQ29tcG9uZW50LFxyXG4gICAgdGV4dGFyZWE6IFRleHRhcmVhRmllbGRDb21wb25lbnQsXHJcbiAgICBudW1iZXI6IE51bWJlckZpZWxkQ29tcG9uZW50LFxyXG4gICAgY3VycmVuY3k6IEN1cnJlbmN5RmllbGRDb21wb25lbnQsXHJcbiAgICBlbWFpbDogRW1haWxGaWVsZENvbXBvbmVudCxcclxuICAgIHBhc3N3b3JkOiBQYXNzd29yZEZpZWxkQ29tcG9uZW50LFxyXG4gICAgY2hlY2tib3g6IENoZWNrYm94RmllbGRDb21wb25lbnQsXHJcbiAgICBib29sZWFuOiBCb29sZWFuRmllbGRDb21wb25lbnQsXHJcbiAgICBkYXRlOiBEYXRlRmllbGRDb21wb25lbnQsXHJcbiAgICBkYXRldGltZTogRGF0ZUZpZWxkQ29tcG9uZW50LFxyXG4gICAgbW9udGhZZWFyOiBNb250aFllYXJGaWVsZENvbXBvbmVudCxcclxuICAgIGRyb3Bkb3duOiBEcm9wZG93bkZpZWxkQ29tcG9uZW50LFxyXG4gICAgcmFkaW86IFJhZGlvRmllbGRDb21wb25lbnQsXHJcbiAgICBtdWx0aVNlbGVjdDogTXVsdGlTZWxlY3RGaWVsZENvbXBvbmVudCxcclxuICAgICdlbnRpdHktcmVmJzogRW50aXR5UmVmRmllbGRDb21wb25lbnQsXHJcbiAgICBncm91cDogR3JvdXBGaWVsZENvbXBvbmVudCxcclxuICAgIGFycmF5OiBBcnJheUZpZWxkQ29tcG9uZW50LFxyXG4gICAgaW1hZ2U6IEltYWdlRmllbGRDb21wb25lbnQsXHJcbiAgICBmaWxlOiBGaWxlRmllbGRDb21wb25lbnQsXHJcbiAgfTtcclxufVxyXG5cclxuLyoqIFJlZ2lzdGVyIGEgc3BlY2lmaWMgc2V0IG9mIGZpZWxkIHR5cGVzLiBPbmx5IHRoZSBjb21wb25lbnRzIHlvdSBuYW1lIGFyZSBidW5kbGVkLiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZUZpZWxkVHlwZXModHlwZXM6IFJlY29yZDxzdHJpbmcsIFR5cGU8YW55Pj4pOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XHJcbiAgcmV0dXJuIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyhbXHJcbiAgICB7IHByb3ZpZGU6IEZJRUxEX1RZUEVfU0VUUywgdXNlVmFsdWU6IHR5cGVzLCBtdWx0aTogdHJ1ZSB9LFxyXG4gIF0pO1xyXG59XHJcblxyXG4vKiogUmVnaXN0ZXIgYWxsIDE5IGJ1aWx0LWluIGZpZWxkIHR5cGUga2V5cy4gQ29udmVuaWVuY2UgZm9yIGFwcHMgdGhhdCB1c2UgbW9zdCBvZiB0aGVtLiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZUJ1aWx0SW5GaWVsZFR5cGVzKCk6IEVudmlyb25tZW50UHJvdmlkZXJzIHtcclxuICByZXR1cm4gcHJvdmlkZUZpZWxkVHlwZXMoYnVpbHRJbkZpZWxkVHlwZXMoKSk7XHJcbn1cclxuIl19
@@ -1,23 +1,21 @@
1
1
  import { makeEnvironmentProviders } from '@angular/core';
2
- import { DYNAMIC_ENTITY_API_URL, ENTITY_REF_REGISTRY, FIELD_TYPE_REGISTRY, HOOK_REGISTRY, MASKED_ROLES, MIGRATION_STRATEGY, VALIDATOR_REGISTRY, } from '../tokens/injection-tokens';
2
+ import { ENTITY_REF_REGISTRY, FIELD_TYPE_REGISTRY, HOOK_REGISTRY, LOOKUP_REGISTRY, MASKED_ROLES, VALIDATOR_REGISTRY, } from '../tokens/injection-tokens';
3
3
  /**
4
4
  * Provider function for ngx-dynamic-entity.
5
5
  * All options are optional — consumers provide only what they use (ISP).
6
6
  *
7
7
  * Usage in app.config.ts:
8
8
  * provideNgxDynamicEntity({
9
- * apiUrl: 'http://localhost:3000/api/entities',
10
9
  * maskedRoles: ['IT_SUPPORT'],
11
10
  * entityRefs: { clients: () => clientService.getOptions() },
12
11
  * })
13
12
  */
14
13
  export const provideNgxDynamicEntity = (config = {}) => makeEnvironmentProviders([
15
- { provide: DYNAMIC_ENTITY_API_URL, useValue: config.apiUrl ?? '' },
16
14
  { provide: MASKED_ROLES, useValue: config.maskedRoles ?? [] },
17
- { provide: MIGRATION_STRATEGY, useValue: config.migrationStrategy ?? 'graceful' },
18
15
  { provide: FIELD_TYPE_REGISTRY, useValue: new Map(Object.entries(config.fieldTypes ?? {})) },
19
16
  { provide: ENTITY_REF_REGISTRY, useValue: new Map(Object.entries(config.entityRefs ?? {})) },
17
+ { provide: LOOKUP_REGISTRY, useValue: new Map(Object.entries(config.lookups ?? {})) },
20
18
  { provide: VALIDATOR_REGISTRY, useValue: new Map(Object.entries(config.validators ?? {})) },
21
19
  { provide: HOOK_REGISTRY, useValue: new Map(Object.entries(config.hooks ?? {})) },
22
20
  ]);
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZS1uZ3gtZHluYW1pYy1lbnRpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3Byb3ZpZGVycy9wcm92aWRlLW5neC1keW5hbWljLWVudGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXdCLHdCQUF3QixFQUFRLE1BQU0sZUFBZSxDQUFDO0FBQ3JGLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IsWUFBWSxFQUNaLGtCQUFrQixFQUNsQixrQkFBa0IsR0FDbkIsTUFBTSw0QkFBNEIsQ0FBQztBQW1CcEM7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLENBQUMsU0FBaUMsRUFBRSxFQUF3QixFQUFFLENBQ25HLHdCQUF3QixDQUFDO0lBQ3ZCLEVBQUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTSxJQUFJLEVBQUUsRUFBRTtJQUNsRSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxXQUFXLElBQUksRUFBRSxFQUFFO0lBQzdELEVBQUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsaUJBQWlCLElBQUksVUFBVSxFQUFFO0lBQ2pGLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRTtJQUM1RixFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDNUYsRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQzNGLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Q0FDbEYsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW52aXJvbm1lbnRQcm92aWRlcnMsIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycywgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgRFlOQU1JQ19FTlRJVFlfQVBJX1VSTCxcbiAgRU5USVRZX1JFRl9SRUdJU1RSWSxcbiAgRklFTERfVFlQRV9SRUdJU1RSWSxcbiAgSE9PS19SRUdJU1RSWSxcbiAgTUFTS0VEX1JPTEVTLFxuICBNSUdSQVRJT05fU1RSQVRFR1ksXG4gIFZBTElEQVRPUl9SRUdJU1RSWSxcbn0gZnJvbSAnLi4vdG9rZW5zL2luamVjdGlvbi10b2tlbnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5neER5bmFtaWNFbnRpdHlDb25maWcge1xuICAvKiogQmFzZSBVUkwgb2YgdGhlIGR5bmFtaWMtZW50aXR5LXNlcnZlciBBUEkuIEV4YW1wbGU6ICdodHRwOi8vbG9jYWxob3N0OjMwMDAvYXBpL2VudGl0aWVzJyAqL1xuICBhcGlVcmw/OiBzdHJpbmc7XG4gIC8qKiBSb2xlcyB0aGF0IHNlZSBtYXNrZWQgZmllbGQgdmFsdWVzIGFzIFhYWFhYWFhYWCAqL1xuICBtYXNrZWRSb2xlcz86IHN0cmluZ1tdO1xuICAvKiogTWlncmF0aW9uIHN0cmF0ZWd5OiAnc3RyaWN0JyByZWplY3RzIHN0YWxlIHJlY29yZHMsICdncmFjZWZ1bCcgZmxhZ3MgdGhlbS4gTmV2ZXIgJ2F1dG8nIChBRFItMDA1KS4gKi9cbiAgbWlncmF0aW9uU3RyYXRlZ3k/OiAnc3RyaWN0JyB8ICdncmFjZWZ1bCc7XG4gIC8qKiBDdXN0b20gZmllbGQgdHlwZSBjb21wb25lbnRzIGtleWVkIGJ5IHR5cGUgc3RyaW5nICovXG4gIGZpZWxkVHlwZXM/OiBSZWNvcmQ8c3RyaW5nLCBUeXBlPGFueT4+O1xuICAvKiogRW50aXR5LXJlZiBvcHRpb24gbG9hZGVycyBrZXllZCBieSBlbnRpdHkga2V5IChBRFItMDA2KSAqL1xuICBlbnRpdHlSZWZzPzogUmVjb3JkPHN0cmluZywgKCkgPT4gUHJvbWlzZTxhbnlbXT4+O1xuICAvKiogQ3VzdG9tIHZhbGlkYXRvciBmdW5jdGlvbnMga2V5ZWQgYnkgdmFsaWRhdG9yIG5hbWUgKi9cbiAgdmFsaWRhdG9ycz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIC8qKiBIb29rIGZ1bmN0aW9ucyBrZXllZCBieSBob29rIG5hbWUgKi9cbiAgaG9va3M/OiBSZWNvcmQ8c3RyaW5nLCBGdW5jdGlvbj47XG59XG5cbi8qKlxuICogUHJvdmlkZXIgZnVuY3Rpb24gZm9yIG5neC1keW5hbWljLWVudGl0eS5cbiAqIEFsbCBvcHRpb25zIGFyZSBvcHRpb25hbCDigJQgY29uc3VtZXJzIHByb3ZpZGUgb25seSB3aGF0IHRoZXkgdXNlIChJU1ApLlxuICpcbiAqIFVzYWdlIGluIGFwcC5jb25maWcudHM6XG4gKiAgIHByb3ZpZGVOZ3hEeW5hbWljRW50aXR5KHtcbiAqICAgICBhcGlVcmw6ICdodHRwOi8vbG9jYWxob3N0OjMwMDAvYXBpL2VudGl0aWVzJyxcbiAqICAgICBtYXNrZWRSb2xlczogWydJVF9TVVBQT1JUJ10sXG4gKiAgICAgZW50aXR5UmVmczogeyBjbGllbnRzOiAoKSA9PiBjbGllbnRTZXJ2aWNlLmdldE9wdGlvbnMoKSB9LFxuICogICB9KVxuICovXG5leHBvcnQgY29uc3QgcHJvdmlkZU5neER5bmFtaWNFbnRpdHkgPSAoY29uZmlnOiBOZ3hEeW5hbWljRW50aXR5Q29uZmlnID0ge30pOiBFbnZpcm9ubWVudFByb3ZpZGVycyA9PlxuICBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW1xuICAgIHsgcHJvdmlkZTogRFlOQU1JQ19FTlRJVFlfQVBJX1VSTCwgdXNlVmFsdWU6IGNvbmZpZy5hcGlVcmwgPz8gJycgfSxcbiAgICB7IHByb3ZpZGU6IE1BU0tFRF9ST0xFUywgdXNlVmFsdWU6IGNvbmZpZy5tYXNrZWRSb2xlcyA/PyBbXSB9LFxuICAgIHsgcHJvdmlkZTogTUlHUkFUSU9OX1NUUkFURUdZLCB1c2VWYWx1ZTogY29uZmlnLm1pZ3JhdGlvblN0cmF0ZWd5ID8/ICdncmFjZWZ1bCcgfSxcbiAgICB7IHByb3ZpZGU6IEZJRUxEX1RZUEVfUkVHSVNUUlksIHVzZVZhbHVlOiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKGNvbmZpZy5maWVsZFR5cGVzID8/IHt9KSkgfSxcbiAgICB7IHByb3ZpZGU6IEVOVElUWV9SRUZfUkVHSVNUUlksIHVzZVZhbHVlOiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKGNvbmZpZy5lbnRpdHlSZWZzID8/IHt9KSkgfSxcbiAgICB7IHByb3ZpZGU6IFZBTElEQVRPUl9SRUdJU1RSWSwgdXNlVmFsdWU6IG5ldyBNYXAoT2JqZWN0LmVudHJpZXMoY29uZmlnLnZhbGlkYXRvcnMgPz8ge30pKSB9LFxuICAgIHsgcHJvdmlkZTogSE9PS19SRUdJU1RSWSwgdXNlVmFsdWU6IG5ldyBNYXAoT2JqZWN0LmVudHJpZXMoY29uZmlnLmhvb2tzID8/IHt9KSkgfSxcbiAgXSk7XG4iXX0=
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZS1uZ3gtZHluYW1pYy1lbnRpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3Byb3ZpZGVycy9wcm92aWRlLW5neC1keW5hbWljLWVudGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXdCLHdCQUF3QixFQUFRLE1BQU0sZUFBZSxDQUFDO0FBRXJGLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLGFBQWEsRUFDYixlQUFlLEVBQ2YsWUFBWSxFQUNaLGtCQUFrQixHQUNuQixNQUFNLDRCQUE0QixDQUFDO0FBd0JwQzs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLFNBQWlDLEVBQUUsRUFBd0IsRUFBRSxDQUNuRyx3QkFBd0IsQ0FBQztJQUN2QixFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxXQUFXLElBQUksRUFBRSxFQUFFO0lBQzdELEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRTtJQUM1RixFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDNUYsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRTtJQUNyRixFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxRQUFRLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDM0YsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRTtDQUNsRixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnZpcm9ubWVudFByb3ZpZGVycywgbWFrZUVudmlyb25tZW50UHJvdmlkZXJzLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB0eXBlIHsgRW50aXR5UmVmZXJlbmNlTG9hZGVyLCBMb29rdXBMaXN0U291cmNlIH0gZnJvbSAnQGR5bmFtaWMtZW50aXR5L2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEVOVElUWV9SRUZfUkVHSVNUUlksXHJcbiAgRklFTERfVFlQRV9SRUdJU1RSWSxcclxuICBIT09LX1JFR0lTVFJZLFxyXG4gIExPT0tVUF9SRUdJU1RSWSxcclxuICBNQVNLRURfUk9MRVMsXHJcbiAgVkFMSURBVE9SX1JFR0lTVFJZLFxyXG59IGZyb20gJy4uL3Rva2Vucy9pbmplY3Rpb24tdG9rZW5zJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTmd4RHluYW1pY0VudGl0eUNvbmZpZyB7XHJcbiAgLyoqIFJvbGVzIHRoYXQgc2VlIG1hc2tlZCBmaWVsZCB2YWx1ZXMgYXMgWFhYWFhYWFhYICovXHJcbiAgbWFza2VkUm9sZXM/OiBzdHJpbmdbXTtcclxuICAvKiogQ3VzdG9tIGZpZWxkIHR5cGUgY29tcG9uZW50cyBrZXllZCBieSB0eXBlIHN0cmluZyAqL1xyXG4gIGZpZWxkVHlwZXM/OiBSZWNvcmQ8c3RyaW5nLCBUeXBlPGFueT4+O1xyXG4gIC8qKlxyXG4gICAqIEVudGl0eS1yZWYgb3B0aW9uIGxvYWRlcnMga2V5ZWQgYnkgZW50aXR5IGtleSAoQURSLTAwNikuXHJcbiAgICogRWFjaCByZWNlaXZlcyBgeyBwYXJlbnRWYWx1ZSwgZmlsdGVycywgbGFuZyB9YCBhbmQgbWF5IHJldHVybiBhbiBhcnJheSwgUHJvbWlzZSwgb3IgT2JzZXJ2YWJsZS5cclxuICAgKi9cclxuICBlbnRpdHlSZWZzPzogUmVjb3JkPHN0cmluZywgRW50aXR5UmVmZXJlbmNlTG9hZGVyPjtcclxuICAvKipcclxuICAgKiBOYW1lZCBtYXN0ZXIgbGlzdHMga2V5ZWQgYnkgbGlzdCBuYW1lLCBmb3IgZmllbGRzIHRoYXQgc2V0IGBsaXN0TmFtZWAuXHJcbiAgICogRWFjaCBtYXkgYmUgdGhlIHZhbHVlcyB0aGVtc2VsdmVzIChhcnJheS9Qcm9taXNlL09ic2VydmFibGUpIG9yIGEgbG9hZGVyIGZ1bmN0aW9uIOKAlCBwcmVmZXJcclxuICAgKiBhIGxvYWRlciBmb3IgYW55dGhpbmcgZmV0Y2hlZCwgc28gYW4gdW51c2VkIGxpc3QgaXMgbmV2ZXIgbG9hZGVkLlxyXG4gICAqL1xyXG4gIGxvb2t1cHM/OiBSZWNvcmQ8c3RyaW5nLCBMb29rdXBMaXN0U291cmNlPjtcclxuICAvKiogQ3VzdG9tIHZhbGlkYXRvciBmdW5jdGlvbnMga2V5ZWQgYnkgdmFsaWRhdG9yIG5hbWUgKi9cclxuICB2YWxpZGF0b3JzPzogUmVjb3JkPHN0cmluZywgYW55PjtcclxuICAvKiogSG9vayBmdW5jdGlvbnMga2V5ZWQgYnkgaG9vayBuYW1lICovXHJcbiAgaG9va3M/OiBSZWNvcmQ8c3RyaW5nLCBGdW5jdGlvbj47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQcm92aWRlciBmdW5jdGlvbiBmb3Igbmd4LWR5bmFtaWMtZW50aXR5LlxyXG4gKiBBbGwgb3B0aW9ucyBhcmUgb3B0aW9uYWwg4oCUIGNvbnN1bWVycyBwcm92aWRlIG9ubHkgd2hhdCB0aGV5IHVzZSAoSVNQKS5cclxuICpcclxuICogVXNhZ2UgaW4gYXBwLmNvbmZpZy50czpcclxuICogICBwcm92aWRlTmd4RHluYW1pY0VudGl0eSh7XHJcbiAqICAgICBtYXNrZWRSb2xlczogWydJVF9TVVBQT1JUJ10sXHJcbiAqICAgICBlbnRpdHlSZWZzOiB7IGNsaWVudHM6ICgpID0+IGNsaWVudFNlcnZpY2UuZ2V0T3B0aW9ucygpIH0sXHJcbiAqICAgfSlcclxuICovXHJcbmV4cG9ydCBjb25zdCBwcm92aWRlTmd4RHluYW1pY0VudGl0eSA9IChjb25maWc6IE5neER5bmFtaWNFbnRpdHlDb25maWcgPSB7fSk6IEVudmlyb25tZW50UHJvdmlkZXJzID0+XHJcbiAgbWFrZUVudmlyb25tZW50UHJvdmlkZXJzKFtcclxuICAgIHsgcHJvdmlkZTogTUFTS0VEX1JPTEVTLCB1c2VWYWx1ZTogY29uZmlnLm1hc2tlZFJvbGVzID8/IFtdIH0sXHJcbiAgICB7IHByb3ZpZGU6IEZJRUxEX1RZUEVfUkVHSVNUUlksIHVzZVZhbHVlOiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKGNvbmZpZy5maWVsZFR5cGVzID8/IHt9KSkgfSxcclxuICAgIHsgcHJvdmlkZTogRU5USVRZX1JFRl9SRUdJU1RSWSwgdXNlVmFsdWU6IG5ldyBNYXAoT2JqZWN0LmVudHJpZXMoY29uZmlnLmVudGl0eVJlZnMgPz8ge30pKSB9LFxyXG4gICAgeyBwcm92aWRlOiBMT09LVVBfUkVHSVNUUlksIHVzZVZhbHVlOiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKGNvbmZpZy5sb29rdXBzID8/IHt9KSkgfSxcclxuICAgIHsgcHJvdmlkZTogVkFMSURBVE9SX1JFR0lTVFJZLCB1c2VWYWx1ZTogbmV3IE1hcChPYmplY3QuZW50cmllcyhjb25maWcudmFsaWRhdG9ycyA/PyB7fSkpIH0sXHJcbiAgICB7IHByb3ZpZGU6IEhPT0tfUkVHSVNUUlksIHVzZVZhbHVlOiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKGNvbmZpZy5ob29rcyA/PyB7fSkpIH0sXHJcbiAgXSk7XHJcbiJdfQ==
@@ -0,0 +1,129 @@
1
+ import { Injectable, inject } from '@angular/core';
2
+ import { applyCascadeFilter } from '@dynamic-entity/core';
3
+ import { EntityRefRegistryService } from './entity-ref-registry.service';
4
+ import { EntityReferenceService } from './entity-reference.service';
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * CascadeDataService — loads entity-reference options and applies parent→child cascades.
8
+ *
9
+ * Loaders come from the registry only (ADR-006). This service owns the three things a
10
+ * field component should not: resolving the loader, coercing whatever it returned
11
+ * (array | Promise | Observable) into a Promise, and filtering by the parent's value.
12
+ */
13
+ export class CascadeDataService {
14
+ registry = inject(EntityRefRegistryService);
15
+ references = inject(EntityReferenceService);
16
+ /** Preload runs by formConfigId, so a second call joins the first rather than re-fetching. */
17
+ preloads = new Map();
18
+ /** Registry key for a field: explicit `linkedEntityKey`, else the field id. */
19
+ entityKeyFor(field) {
20
+ return field.entityReference?.linkedEntityKey ?? field.id;
21
+ }
22
+ /** Whether a loader is registered for this field. */
23
+ canLoad(field) {
24
+ return this.registry.has(this.entityKeyFor(field));
25
+ }
26
+ /**
27
+ * Load the options for a field, cascade-filtered against `parentValue`.
28
+ * Returns `[]` when no loader is registered, or when a cascade child has no parent value yet.
29
+ */
30
+ async load(field, ctx = {}) {
31
+ const cfg = field.entityReference;
32
+ if (!this.canLoad(field))
33
+ return [];
34
+ // A cascade child with no parent selection must offer nothing.
35
+ const hasParentValue = ctx.parentValue !== null && ctx.parentValue !== undefined && ctx.parentValue !== '';
36
+ if (cfg?.parentField && !hasParentValue)
37
+ return [];
38
+ const lang = ctx.lang ?? 'en';
39
+ // When the cascade can be resolved locally (`lookupFilter`/`lookupPath`), fetch the
40
+ // unfiltered set once and filter per parent below — switching parent then costs nothing.
41
+ // Otherwise the loader is the only thing that can narrow the list, so `parentValue` is
42
+ // passed through and becomes part of the cache identity (one entry per parent).
43
+ const filtersLocally = !!(cfg?.lookupFilter || cfg?.lookupPath);
44
+ const options = await this.references.load(this.entityKeyFor(field), {
45
+ ...ctx,
46
+ parentValue: filtersLocally ? undefined : ctx.parentValue,
47
+ filters: { ...(cfg?.filters ?? {}), ...(ctx.filters ?? {}) },
48
+ displayFields: cfg?.displayFields,
49
+ lang,
50
+ });
51
+ return applyCascadeFilter(options, ctx.parentValue, cfg, lang);
52
+ }
53
+ // ─── Preload ────────────────────────────────────────────────────────────────
54
+ /**
55
+ * Warm the cache for every entity a config's cascades depend on, so changing a parent
56
+ * resolves from memory instead of a round-trip.
57
+ *
58
+ * Idempotent per `formConfigId`: calling it again returns the in-flight or completed run
59
+ * rather than re-fetching.
60
+ */
61
+ initializeCascadeData(formConfigId, config, lang = 'en') {
62
+ const existing = this.preloads.get(formConfigId);
63
+ if (existing)
64
+ return existing;
65
+ const fields = this.cascadeFields(config);
66
+ const run = Promise.all(fields.map(field => this.references.load(this.entityKeyFor(field), {
67
+ filters: field.entityReference?.filters,
68
+ displayFields: field.entityReference?.displayFields,
69
+ lang,
70
+ }))).then(() => undefined);
71
+ this.preloads.set(formConfigId, run);
72
+ return run;
73
+ }
74
+ /** Resolves true once `initializeCascadeData` for this config has finished. */
75
+ async waitForData(formConfigId) {
76
+ const run = this.preloads.get(formConfigId);
77
+ if (!run)
78
+ return false;
79
+ await run;
80
+ return true;
81
+ }
82
+ /**
83
+ * Child options for a parent selection, from cache only — no load is triggered.
84
+ * Returns `[]` when the entity has not been preloaded.
85
+ */
86
+ getCachedChildOptions(field, parentValue, lang = 'en') {
87
+ const cfg = field.entityReference;
88
+ const cached = this.references.peek(this.entityKeyFor(field), {
89
+ filters: cfg?.filters,
90
+ displayFields: cfg?.displayFields,
91
+ lang,
92
+ });
93
+ if (!cached)
94
+ return [];
95
+ return applyCascadeFilter(cached, parentValue, cfg, lang);
96
+ }
97
+ /** Forget the preload for one config. The option cache itself is untouched. */
98
+ clearCache(formConfigId) {
99
+ this.preloads.delete(formConfigId);
100
+ }
101
+ /** Every entity-ref field in the config that participates in a cascade. */
102
+ cascadeFields(config) {
103
+ const found = [];
104
+ const walkFields = (fields) => {
105
+ for (const field of fields ?? []) {
106
+ const cfg = field.entityReference;
107
+ if (cfg?.enabled && (cfg.parentField || cfg.lookupPath || cfg.lookupFilter)) {
108
+ found.push(field);
109
+ }
110
+ walkFields(field.children);
111
+ }
112
+ };
113
+ const walkTabs = (tabs) => {
114
+ for (const tab of tabs ?? []) {
115
+ walkFields(tab.fields);
116
+ walkTabs(tab.children);
117
+ }
118
+ };
119
+ walkTabs(config?.tabs);
120
+ return found;
121
+ }
122
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CascadeDataService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
123
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CascadeDataService, providedIn: 'root' });
124
+ }
125
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CascadeDataService, decorators: [{
126
+ type: Injectable,
127
+ args: [{ providedIn: 'root' }]
128
+ }] });
129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzY2FkZS1kYXRhLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2Nhc2NhZGUtZGF0YS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBUW5ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzFELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQUVwRTs7Ozs7O0dBTUc7QUFFSCxNQUFNLE9BQU8sa0JBQWtCO0lBQ1osUUFBUSxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzVDLFVBQVUsR0FBRyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUU3RCw4RkFBOEY7SUFDN0UsUUFBUSxHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO0lBRTdELCtFQUErRTtJQUMvRSxZQUFZLENBQUMsS0FBd0I7UUFDbkMsT0FBTyxLQUFLLENBQUMsZUFBZSxFQUFFLGVBQWUsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO0lBQzVELENBQUM7SUFFRCxxREFBcUQ7SUFDckQsT0FBTyxDQUFDLEtBQXdCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUNSLEtBQXdCLEVBQ3hCLE1BQThCLEVBQUU7UUFFaEMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQztRQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFP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TUFBTSxDQUFDLENBQUM7Z0JBQ3ZCLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekIsQ0FBQztRQUNILENBQUMsQ0FBQztRQUNGLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO3dHQXBJVSxrQkFBa0I7NEdBQWxCLGtCQUFrQixjQURMLE1BQU07OzRGQUNuQixrQkFBa0I7a0JBRDlCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB0eXBlIHtcclxuICBFbnRpdHlGb3JtQ29uZmlnLFxyXG4gIE5lc3RlZEZpZWxkQ29uZmlnLFxyXG4gIE5lc3RlZFRhYkNvbmZpZyxcclxuICBSZWZlcmVuY2VMb2FkZXJDb250ZXh0LFxyXG4gIFJlZmVyZW5jZU9wdGlvbixcclxufSBmcm9tICdAZHluYW1pYy1lbnRpdHkvY29yZSc7XHJcbmltcG9ydCB7IGFwcGx5Q2FzY2FkZUZpbHRlciB9IGZyb20gJ0BkeW5hbWljLWVudGl0eS9jb3JlJztcclxuaW1wb3J0IHsgRW50aXR5UmVmUmVnaXN0cnlTZXJ2aWNlIH0gZnJvbSAnLi9lbnRpdHktcmVmLXJlZ2lzdHJ5LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnRpdHlSZWZlcmVuY2VTZXJ2aWNlIH0gZnJvbSAnLi9lbnRpdHktcmVmZXJlbmNlLnNlcnZpY2UnO1xyXG5cclxuLyoqXHJcbiAqIENhc2NhZGVEYXRhU2VydmljZSDigJQgbG9hZHMgZW50aXR5LXJlZmVyZW5jZSBvcHRpb25zIGFuZCBhcHBsaWVzIHBhcmVudOKGkmNoaWxkIGNhc2NhZGVzLlxyXG4gKlxyXG4gKiBMb2FkZXJzIGNvbWUgZnJvbSB0aGUgcmVnaXN0cnkgb25seSAoQURSLTAwNikuIFRoaXMgc2VydmljZSBvd25zIHRoZSB0aHJlZSB0aGluZ3MgYVxyXG4gKiBmaWVsZCBjb21wb25lbnQgc2hvdWxkIG5vdDogcmVzb2x2aW5nIHRoZSBsb2FkZXIsIGNvZXJjaW5nIHdoYXRldmVyIGl0IHJldHVybmVkXHJcbiAqIChhcnJheSB8IFByb21pc2UgfCBPYnNlcnZhYmxlKSBpbnRvIGEgUHJvbWlzZSwgYW5kIGZpbHRlcmluZyBieSB0aGUgcGFyZW50J3MgdmFsdWUuXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxyXG5leHBvcnQgY2xhc3MgQ2FzY2FkZURhdGFTZXJ2aWNlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdHJ5ID0gaW5qZWN0KEVudGl0eVJlZlJlZ2lzdHJ5U2VydmljZSk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZWZlcmVuY2VzID0gaW5qZWN0KEVudGl0eVJlZmVyZW5jZVNlcnZpY2UpO1xyXG5cclxuICAvKiogUHJlbG9hZCBydW5zIGJ5IGZvcm1Db25maWdJZCwgc28gYSBzZWNvbmQgY2FsbCBqb2lucyB0aGUgZmlyc3QgcmF0aGVyIHRoYW4gcmUtZmV0Y2hpbmcuICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBwcmVsb2FkcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xyXG5cclxuICAvKiogUmVnaXN0cnkga2V5IGZvciBhIGZpZWxkOiBleHBsaWNpdCBgbGlua2VkRW50aXR5S2V5YCwgZWxzZSB0aGUgZmllbGQgaWQuICovXHJcbiAgZW50aXR5S2V5Rm9yKGZpZWxkOiBOZXN0ZWRGaWVsZENvbmZpZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gZmllbGQuZW50aXR5UmVmZXJlbmNlPy5saW5rZWRFbnRpdHlLZXkgPz8gZmllbGQuaWQ7XHJcbiAgfVxyXG5cclxuICAvKiogV2hldGhlciBhIGxvYWRlciBpcyByZWdpc3RlcmVkIGZvciB0aGlzIGZpZWxkLiAqL1xyXG4gIGNhbkxvYWQoZmllbGQ6IE5lc3RlZEZpZWxkQ29uZmlnKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5oYXModGhpcy5lbnRpdHlLZXlGb3IoZmllbGQpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWQgdGhlIG9wdGlvbnMgZm9yIGEgZmllbGQsIGNhc2NhZGUtZmlsdGVyZWQgYWdhaW5zdCBgcGFyZW50VmFsdWVgLlxyXG4gICAqIFJldHVybnMgYFtdYCB3aGVuIG5vIGxvYWRlciBpcyByZWdpc3RlcmVkLCBvciB3aGVuIGEgY2FzY2FkZSBjaGlsZCBoYXMgbm8gcGFyZW50IHZhbHVlIHlldC5cclxuICAgKi9cclxuICBhc3luYyBsb2FkKFxyXG4gICAgZmllbGQ6IE5lc3RlZEZpZWxkQ29uZmlnLFxyXG4gICAgY3R4OiBSZWZlcmVuY2VMb2FkZXJDb250ZXh0ID0ge30sXHJcbiAgKTogUHJvbWlzZTxSZWZlcmVuY2VPcHRpb25bXT4ge1xyXG4gICAgY29uc3QgY2ZnID0gZmllbGQuZW50aXR5UmVmZXJlbmNlO1xyXG4gICAgaWYgKCF0aGlzLmNhbkxvYWQoZmllbGQpKSByZXR1cm4gW107XHJcblxyXG4gICAgLy8gQSBjYXNjYWRlIGNoaWxkIHdpdGggbm8gcGFyZW50IHNlbGVjdGlvbiBtdXN0IG9mZmVyIG5vdGhpbmcuXHJcbiAgICBjb25zdCBoYXNQYXJlbnRWYWx1ZSA9XHJcbiAgICAgIGN0eC5wYXJlbnRWYWx1ZSAhPT0gbnVsbCAmJiBjdHgucGFyZW50VmFsdWUgIT09IHVuZGVmaW5lZCAmJiBjdHgucGFyZW50VmFsdWUgIT09ICcnO1xyXG4gICAgaWYgKGNmZz8ucGFyZW50RmllbGQgJiYgIWhhc1BhcmVudFZhbHVlKSByZXR1cm4gW107XHJcblxyXG4gICAgY29uc3QgbGFuZyA9IGN0eC5sYW5nID8/ICdlbic7XHJcblxyXG4gICAgLy8gV2hlbiB0aGUgY2FzY2FkZSBjYW4gYmUgcmVzb2x2ZWQgbG9jYWxseSAoYGxvb2t1cEZpbHRlcmAvYGxvb2t1cFBhdGhgKSwgZmV0Y2ggdGhlXHJcbiAgICAvLyB1bmZpbHRlcmVkIHNldCBvbmNlIGFuZCBmaWx0ZXIgcGVyIHBhcmVudCBiZWxvdyDigJQgc3dpdGNoaW5nIHBhcmVudCB0aGVuIGNvc3RzIG5vdGhpbmcuXHJcbiAgICAvLyBPdGhlcndpc2UgdGhlIGxvYWRlciBpcyB0aGUgb25seSB0aGluZyB0aGF0IGNhbiBuYXJyb3cgdGhlIGxpc3QsIHNvIGBwYXJlbnRWYWx1ZWAgaXNcclxuICAgIC8vIHBhc3NlZCB0aHJvdWdoIGFuZCBiZWNvbWVzIHBhcnQgb2YgdGhlIGNhY2hlIGlkZW50aXR5IChvbmUgZW50cnkgcGVyIHBhcmVudCkuXHJcbiAgICBjb25zdCBmaWx0ZXJzTG9jYWxseSA9ICEhKGNmZz8ubG9va3VwRmlsdGVyIHx8IGNmZz8ubG9va3VwUGF0aCk7XHJcblxyXG4gICAgY29uc3Qgb3B0aW9ucyA9IGF3YWl0IHRoaXMucmVmZXJlbmNlcy5sb2FkKHRoaXMuZW50aXR5S2V5Rm9yKGZpZWxkKSwge1xyXG4gICAgICAuLi5jdHgsXHJcbiAgICAgIHBhcmVudFZhbHVlOiBmaWx0ZXJzTG9jYWxseSA/IHVuZGVmaW5lZCA6IGN0eC5wYXJlbnRWYWx1ZSxcclxuICAgICAgZmlsdGVyczogeyAuLi4oY2ZnPy5maWx0ZXJzID8/IHt9KSwgLi4uKGN0eC5maWx0ZXJzID8/IHt9KSB9LFxyXG4gICAgICBkaXNwbGF5RmllbGRzOiBjZmc/LmRpc3BsYXlGaWVsZHMsXHJcbiAgICAgIGxhbmcsXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gYXBwbHlDYXNjYWRlRmlsdGVyKG9wdGlvbnMsIGN0eC5wYXJlbnRWYWx1ZSwgY2ZnLCBsYW5nKTtcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBQcmVsb2FkIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKipcclxuICAgKiBXYXJtIHRoZSBjYWNoZSBmb3IgZXZlcnkgZW50aXR5IGEgY29uZmlnJ3MgY2FzY2FkZXMgZGVwZW5kIG9uLCBzbyBjaGFuZ2luZyBhIHBhcmVudFxyXG4gICAqIHJlc29sdmVzIGZyb20gbWVtb3J5IGluc3RlYWQgb2YgYSByb3VuZC10cmlwLlxyXG4gICAqXHJcbiAgICogSWRlbXBvdGVudCBwZXIgYGZvcm1Db25maWdJZGA6IGNhbGxpbmcgaXQgYWdhaW4gcmV0dXJucyB0aGUgaW4tZmxpZ2h0IG9yIGNvbXBsZXRlZCBydW5cclxuICAgKiByYXRoZXIgdGhhbiByZS1mZXRjaGluZy5cclxuICAgKi9cclxuICBpbml0aWFsaXplQ2FzY2FkZURhdGEoZm9ybUNvbmZpZ0lkOiBzdHJpbmcsIGNvbmZpZzogRW50aXR5Rm9ybUNvbmZpZywgbGFuZyA9ICdlbicpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5wcmVsb2Fkcy5nZXQoZm9ybUNvbmZpZ0lkKTtcclxuICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xyXG5cclxuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuY2FzY2FkZUZpZWxkcyhjb25maWcpO1xyXG4gICAgY29uc3QgcnVuID0gUHJvbWlzZS5hbGwoXHJcbiAgICAgIGZpZWxkcy5tYXAoZmllbGQgPT5cclxuICAgICAgICB0aGlzLnJlZmVyZW5jZXMubG9hZCh0aGlzLmVudGl0eUtleUZvcihmaWVsZCksIHtcclxuICAgICAgICAgIGZpbHRlcnM6IGZpZWxkLmVudGl0eVJlZmVyZW5jZT8uZmlsdGVycyxcclxuICAgICAgICAgIGRpc3BsYXlGaWVsZHM6IGZpZWxkLmVudGl0eVJlZmVyZW5jZT8uZGlzcGxheUZpZWxkcyxcclxuICAgICAgICAgIGxhbmcsXHJcbiAgICAgICAgfSksXHJcbiAgICAgICksXHJcbiAgICApLnRoZW4oKCkgPT4gdW5kZWZpbmVkKTtcclxuXHJcbiAgICB0aGlzLnByZWxvYWRzLnNldChmb3JtQ29uZmlnSWQsIHJ1bik7XHJcbiAgICByZXR1cm4gcnVuO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJlc29sdmVzIHRydWUgb25jZSBgaW5pdGlhbGl6ZUNhc2NhZGVEYXRhYCBmb3IgdGhpcyBjb25maWcgaGFzIGZpbmlzaGVkLiAqL1xyXG4gIGFzeW5jIHdhaXRGb3JEYXRhKGZvcm1Db25maWdJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBydW4gPSB0aGlzLnByZWxvYWRzLmdldChmb3JtQ29uZmlnSWQpO1xyXG4gICAgaWYgKCFydW4pIHJldHVybiBmYWxzZTtcclxuICAgIGF3YWl0IHJ1bjtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hpbGQgb3B0aW9ucyBmb3IgYSBwYXJlbnQgc2VsZWN0aW9uLCBmcm9tIGNhY2hlIG9ubHkg4oCUIG5vIGxvYWQgaXMgdHJpZ2dlcmVkLlxyXG4gICAqIFJldHVybnMgYFtdYCB3aGVuIHRoZSBlbnRpdHkgaGFzIG5vdCBiZWVuIHByZWxvYWRlZC5cclxuICAgKi9cclxuICBnZXRDYWNoZWRDaGlsZE9wdGlvbnMoXHJcbiAgICBmaWVsZDogTmVzdGVkRmllbGRDb25maWcsXHJcbiAgICBwYXJlbnRWYWx1ZTogdW5rbm93bixcclxuICAgIGxhbmcgPSAnZW4nLFxyXG4gICk6IFJlZmVyZW5jZU9wdGlvbltdIHtcclxuICAgIGNvbnN0IGNmZyA9IGZpZWxkLmVudGl0eVJlZmVyZW5jZTtcclxuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMucmVmZXJlbmNlcy5wZWVrKHRoaXMuZW50aXR5S2V5Rm9yKGZpZWxkKSwge1xyXG4gICAgICBmaWx0ZXJzOiBjZmc/LmZpbHRlcnMsXHJcbiAgICAgIGRpc3BsYXlGaWVsZHM6IGNmZz8uZGlzcGxheUZpZWxkcyxcclxuICAgICAgbGFuZyxcclxuICAgIH0pO1xyXG4gICAgaWYgKCFjYWNoZWQpIHJldHVybiBbXTtcclxuICAgIHJldHVybiBhcHBseUNhc2NhZGVGaWx0ZXIoY2FjaGVkLCBwYXJlbnRWYWx1ZSwgY2ZnLCBsYW5nKTtcclxuICB9XHJcblxyXG4gIC8qKiBGb3JnZXQgdGhlIHByZWxvYWQgZm9yIG9uZSBjb25maWcuIFRoZSBvcHRpb24gY2FjaGUgaXRzZWxmIGlzIHVudG91Y2hlZC4gKi9cclxuICBjbGVhckNhY2hlKGZvcm1Db25maWdJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnByZWxvYWRzLmRlbGV0ZShmb3JtQ29uZmlnSWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEV2ZXJ5IGVudGl0eS1yZWYgZmllbGQgaW4gdGhlIGNvbmZpZyB0aGF0IHBhcnRpY2lwYXRlcyBpbiBhIGNhc2NhZGUuICovXHJcbiAgcHJpdmF0ZSBjYXNjYWRlRmllbGRzKGNvbmZpZzogRW50aXR5Rm9ybUNvbmZpZyk6IE5lc3RlZEZpZWxkQ29uZmlnW10ge1xyXG4gICAgY29uc3QgZm91bmQ6IE5lc3RlZEZpZWxkQ29uZmlnW10gPSBbXTtcclxuICAgIGNvbnN0IHdhbGtGaWVsZHMgPSAoZmllbGRzOiBOZXN0ZWRGaWVsZENvbmZpZ1tdIHwgdW5kZWZpbmVkKSA9PiB7XHJcbiAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzID8/IFtdKSB7XHJcbiAgICAgICAgY29uc3QgY2ZnID0gZmllbGQuZW50aXR5UmVmZXJlbmNlO1xyXG4gICAgICAgIGlmIChjZmc/LmVuYWJsZWQgJiYgKGNmZy5wYXJlbnRGaWVsZCB8fCBjZmcubG9va3VwUGF0aCB8fCBjZmcubG9va3VwRmlsdGVyKSkge1xyXG4gICAgICAgICAgZm91bmQucHVzaChmaWVsZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHdhbGtGaWVsZHMoZmllbGQuY2hpbGRyZW4pO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgY29uc3Qgd2Fsa1RhYnMgPSAodGFiczogTmVzdGVkVGFiQ29uZmlnW10gfCB1bmRlZmluZWQpID0+IHtcclxuICAgICAgZm9yIChjb25zdCB0YWIgb2YgdGFicyA/PyBbXSkge1xyXG4gICAgICAgIHdhbGtGaWVsZHModGFiLmZpZWxkcyk7XHJcbiAgICAgICAgd2Fsa1RhYnModGFiLmNoaWxkcmVuKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHdhbGtUYWJzKGNvbmZpZz8udGFicyk7XHJcbiAgICByZXR1cm4gZm91bmQ7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,67 @@
1
+ import { Injectable, Inject, Optional } from '@angular/core';
2
+ import { isObservable, firstValueFrom } from 'rxjs';
3
+ import { CONFIG_SOURCE } from '../tokens/injection-tokens';
4
+ import * as i0 from "@angular/core";
5
+ export class ConfigSourceService {
6
+ cache = new Map();
7
+ inFlight = new Map();
8
+ handler;
9
+ constructor(handler) {
10
+ this.handler = handler;
11
+ }
12
+ /** Retrieve an entity config by key, with caching and in-flight deduplication. */
13
+ async getConfig(entityKey) {
14
+ if (!entityKey || !this.handler)
15
+ return undefined;
16
+ if (this.cache.has(entityKey))
17
+ return this.cache.get(entityKey);
18
+ if (this.inFlight.has(entityKey))
19
+ return this.inFlight.get(entityKey);
20
+ const promise = (async () => {
21
+ try {
22
+ const raw = this.handler(entityKey);
23
+ let resolved;
24
+ if (isObservable(raw)) {
25
+ resolved = await firstValueFrom(raw);
26
+ }
27
+ else {
28
+ resolved = await Promise.resolve(raw);
29
+ }
30
+ if (resolved) {
31
+ this.cache.set(entityKey, resolved);
32
+ }
33
+ return resolved;
34
+ }
35
+ catch (err) {
36
+ console.warn(`ConfigSourceService failed to load config for entity "${entityKey}"`, err);
37
+ return undefined;
38
+ }
39
+ finally {
40
+ this.inFlight.delete(entityKey);
41
+ }
42
+ })();
43
+ this.inFlight.set(entityKey, promise);
44
+ return promise;
45
+ }
46
+ /** Clear cached configs (e.g. after a config edit in the builder). */
47
+ clearCache(entityKey) {
48
+ if (entityKey) {
49
+ this.cache.delete(entityKey);
50
+ }
51
+ else {
52
+ this.cache.clear();
53
+ }
54
+ }
55
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ConfigSourceService, deps: [{ token: CONFIG_SOURCE, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
56
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ConfigSourceService, providedIn: 'root' });
57
+ }
58
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ConfigSourceService, decorators: [{
59
+ type: Injectable,
60
+ args: [{ providedIn: 'root' }]
61
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
62
+ type: Optional
63
+ }, {
64
+ type: Inject,
65
+ args: [CONFIG_SOURCE]
66
+ }] }] });
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLXNvdXJjZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9jb25maWctc291cmNlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdELE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxhQUFhLEVBQTRCLE1BQU0sNEJBQTRCLENBQUM7O0FBR3JGLE1BQU0sT0FBTyxtQkFBbUI7SUFDYixLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7SUFDNUMsUUFBUSxHQUFHLElBQUksR0FBRyxFQUFpRCxDQUFDO0lBRXBFLE9BQU8sQ0FBdUI7SUFFL0MsWUFBK0MsT0FBYTtRQUMxRCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUN6QixDQUFDO0lBRUQsa0ZBQWtGO0lBQ2xGLEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBaUI7UUFDL0IsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDbEQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hFLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV0RSxNQUFNLE9BQU8sR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQzFCLElBQUksQ0FBQztnQkFDSCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLFFBQXNDLENBQUM7Z0JBRTNDLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3RCLFFBQVEsR0FBRyxNQUFNLGNBQWMsQ0FBQyxHQUFVLENBQUMsQ0FBQztnQkFDOUMsQ0FBQztxQkFBTSxDQUFDO29CQUNOLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBVSxDQUFDLENBQUM7Z0JBQy9DLENBQUM7Z0JBRUQsSUFBSSxRQUFRLEVBQUUsQ0FBQztvQkFDYixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ3RDLENBQUM7Z0JBQ0QsT0FBTyxRQUFRLENBQUM7WUFDbEIsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsT0FBTyxDQUFDLElBQUksQ0FBQyx5REFBeUQsU0FBUyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3pGLE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUM7b0JBQVMsQ0FBQztnQkFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNsQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUVMLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN0QyxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsc0VBQXNFO0lBQ3RFLFVBQVUsQ0FBQyxTQUFrQjtRQUMzQixJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0IsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3JCLENBQUM7SUFDSCxDQUFDO3dHQWxEVSxtQkFBbUIsa0JBTUUsYUFBYTs0R0FObEMsbUJBQW1CLGNBRE4sTUFBTTs7NEZBQ25CLG1CQUFtQjtrQkFEL0IsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQU9uQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7IEVudGl0eUZvcm1Db25maWcgfSBmcm9tICdAZHluYW1pYy1lbnRpdHkvY29yZSc7XG5pbXBvcnQgeyBpc09ic2VydmFibGUsIGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDT05GSUdfU09VUkNFLCB0eXBlIENvbmZpZ1NvdXJjZUhhbmRsZXIgfSBmcm9tICcuLi90b2tlbnMvaW5qZWN0aW9uLXRva2Vucyc7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgQ29uZmlnU291cmNlU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgRW50aXR5Rm9ybUNvbmZpZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbkZsaWdodCA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPEVudGl0eUZvcm1Db25maWcgfCB1bmRlZmluZWQ+PigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlcj86IENvbmZpZ1NvdXJjZUhhbmRsZXI7XG5cbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQEluamVjdChDT05GSUdfU09VUkNFKSBoYW5kbGVyPzogYW55KSB7XG4gICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIC8qKiBSZXRyaWV2ZSBhbiBlbnRpdHkgY29uZmlnIGJ5IGtleSwgd2l0aCBjYWNoaW5nIGFuZCBpbi1mbGlnaHQgZGVkdXBsaWNhdGlvbi4gKi9cbiAgYXN5bmMgZ2V0Q29uZmlnKGVudGl0eUtleTogc3RyaW5nKTogUHJvbWlzZTxFbnRpdHlGb3JtQ29uZmlnIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKCFlbnRpdHlLZXkgfHwgIXRoaXMuaGFuZGxlcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5jYWNoZS5oYXMoZW50aXR5S2V5KSkgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KGVudGl0eUtleSk7XG4gICAgaWYgKHRoaXMuaW5GbGlnaHQuaGFzKGVudGl0eUtleSkpIHJldHVybiB0aGlzLmluRmxpZ2h0LmdldChlbnRpdHlLZXkpO1xuXG4gICAgY29uc3QgcHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByYXcgPSB0aGlzLmhhbmRsZXIhKGVudGl0eUtleSk7XG4gICAgICAgIGxldCByZXNvbHZlZDogRW50aXR5Rm9ybUNvbmZpZyB8IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoaXNPYnNlcnZhYmxlKHJhdykpIHtcbiAgICAgICAgICByZXNvbHZlZCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHJhdyBhcyBhbnkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmVkID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKHJhdyBhcyBhbnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc29sdmVkKSB7XG4gICAgICAgICAgdGhpcy5jYWNoZS5zZXQoZW50aXR5S2V5LCByZXNvbHZlZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgQ29uZmlnU291cmNlU2VydmljZSBmYWlsZWQgdG8gbG9hZCBjb25maWcgZm9yIGVudGl0eSBcIiR7ZW50aXR5S2V5fVwiYCwgZXJyKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuaW5GbGlnaHQuZGVsZXRlKGVudGl0eUtleSk7XG4gICAgICB9XG4gICAgfSkoKTtcblxuICAgIHRoaXMuaW5GbGlnaHQuc2V0KGVudGl0eUtleSwgcHJvbWlzZSk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICAvKiogQ2xlYXIgY2FjaGVkIGNvbmZpZ3MgKGUuZy4gYWZ0ZXIgYSBjb25maWcgZWRpdCBpbiB0aGUgYnVpbGRlcikuICovXG4gIGNsZWFyQ2FjaGUoZW50aXR5S2V5Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGVudGl0eUtleSkge1xuICAgICAgdGhpcy5jYWNoZS5kZWxldGUoZW50aXR5S2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYWNoZS5jbGVhcigpO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,20 @@
1
+ /** Default in-memory store. Lives as long as the injector that created it. */
2
+ export class InMemoryEntityRefCacheStore {
3
+ map = new Map();
4
+ get(key) {
5
+ return this.map.get(key);
6
+ }
7
+ set(key, value) {
8
+ this.map.set(key, value);
9
+ }
10
+ delete(key) {
11
+ this.map.delete(key);
12
+ }
13
+ keys() {
14
+ return [...this.map.keys()];
15
+ }
16
+ clear() {
17
+ this.map.clear();
18
+ }
19
+ }
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXJlZi1jYWNoZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvZW50aXR5LXJlZi1jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFvQkEsOEVBQThFO0FBQzlFLE1BQU0sT0FBTywyQkFBMkI7SUFDckIsR0FBRyxHQUFHLElBQUksR0FBRyxFQUE2QixDQUFDO0lBRTVELEdBQUcsQ0FBQyxHQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsR0FBRyxDQUFDLEdBQVcsRUFBRSxLQUF3QjtRQUN2QyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELE1BQU0sQ0FBQyxHQUFXO1FBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFJO1FBQ0YsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNuQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJlZmVyZW5jZU9wdGlvbiB9IGZyb20gJ0BkeW5hbWljLWVudGl0eS9jb3JlJztcclxuXHJcbi8qKlxyXG4gKiBCYWNraW5nIHN0b3JlIGZvciBjYWNoZWQgcmVmZXJlbmNlIG9wdGlvbnMuXHJcbiAqXHJcbiAqIFBsdWdnYWJsZSBvbiBwdXJwb3NlLiBUaGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGtlcHQgaXRzIGNhY2hlIGluIGEgc2VydmljZSBpbnN0YW5jZSxcclxuICogc28gZXZlcnkgZW50aXR5IGxhYmVsIHdhcyByZS1mZXRjaGVkIG9uIGEgYnJvd3NlciByZWZyZXNoIChpc3N1ZSAjMjIgaW4gdGhlIGFyY2hpdGVjdHVyZVxyXG4gKiBkb2MpLiBBIGNvbnN1bWVyIHRoYXQgd2FudHMgdGhlIGNhY2hlIHRvIHN1cnZpdmUgYSByZWxvYWQgY2FuIGJhY2sgdGhpcyB3aXRoXHJcbiAqIHNlc3Npb25TdG9yYWdlOyB0aGUgZGVmYXVsdCBrZWVwcyBpdCBpbiBtZW1vcnksIHdoaWNoIGlzIHRoZSByaWdodCBjYWxsIGZvciBhIGxpYnJhcnlcclxuICogdGhhdCBtdXN0IG5vdCBzaWxlbnRseSBwZXJzaXN0IGEgdGVuYW50J3MgZGF0YS5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5UmVmQ2FjaGVTdG9yZSB7XHJcbiAgZ2V0KGtleTogc3RyaW5nKTogUmVmZXJlbmNlT3B0aW9uW10gfCB1bmRlZmluZWQ7XHJcbiAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogUmVmZXJlbmNlT3B0aW9uW10pOiB2b2lkO1xyXG4gIGRlbGV0ZShrZXk6IHN0cmluZyk6IHZvaWQ7XHJcbiAgLyoqIEV2ZXJ5IGtleSBjdXJyZW50bHkgaGVsZCDigJQgdXNlZCBmb3IgcHJlZml4IGludmFsaWRhdGlvbiBvZiBvbmUgZW50aXR5LiAqL1xyXG4gIGtleXMoKTogc3RyaW5nW107XHJcbiAgY2xlYXIoKTogdm9pZDtcclxufVxyXG5cclxuLyoqIERlZmF1bHQgaW4tbWVtb3J5IHN0b3JlLiBMaXZlcyBhcyBsb25nIGFzIHRoZSBpbmplY3RvciB0aGF0IGNyZWF0ZWQgaXQuICovXHJcbmV4cG9ydCBjbGFzcyBJbk1lbW9yeUVudGl0eVJlZkNhY2hlU3RvcmUgaW1wbGVtZW50cyBFbnRpdHlSZWZDYWNoZVN0b3JlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBSZWZlcmVuY2VPcHRpb25bXT4oKTtcclxuXHJcbiAgZ2V0KGtleTogc3RyaW5nKTogUmVmZXJlbmNlT3B0aW9uW10gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMubWFwLmdldChrZXkpO1xyXG4gIH1cclxuXHJcbiAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogUmVmZXJlbmNlT3B0aW9uW10pOiB2b2lkIHtcclxuICAgIHRoaXMubWFwLnNldChrZXksIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGRlbGV0ZShrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5tYXAuZGVsZXRlKGtleSk7XHJcbiAgfVxyXG5cclxuICBrZXlzKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBbLi4udGhpcy5tYXAua2V5cygpXTtcclxuICB9XHJcblxyXG4gIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5tYXAuY2xlYXIoKTtcclxuICB9XHJcbn1cclxuIl19
@@ -12,8 +12,8 @@ import * as i0 from "@angular/core";
12
12
  export class EntityRefRegistryService {
13
13
  registry = inject(ENTITY_REF_REGISTRY, { optional: true }) ?? new Map();
14
14
  /**
15
- * Get the option loader function for an entity key.
16
- * @returns Async function that returns options array, or null if not registered.
15
+ * Get the option loader for an entity key.
16
+ * @returns The loader, or null if none is registered.
17
17
  */
18
18
  resolve(entityKey) {
19
19
  return this.registry.get(entityKey) ?? null;
@@ -28,4 +28,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
28
28
  type: Injectable,
29
29
  args: [{ providedIn: 'root' }]
30
30
  }] });
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXJlZi1yZWdpc3RyeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9lbnRpdHktcmVmLXJlZ2lzdHJ5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBRWpFOzs7Ozs7O0dBT0c7QUFFSCxNQUFNLE9BQU8sd0JBQXdCO0lBQ2xCLFFBQVEsR0FBRyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRXpGOzs7T0FHRztJQUNILE9BQU8sQ0FBQyxTQUFpQjtRQUN2QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUM5QyxDQUFDO0lBRUQsR0FBRyxDQUFDLFNBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdEMsQ0FBQzt3R0FiVSx3QkFBd0I7NEdBQXhCLHdCQUF3QixjQURYLE1BQU07OzRGQUNuQix3QkFBd0I7a0JBRHBDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFTlRJVFlfUkVGX1JFR0lTVFJZIH0gZnJvbSAnLi4vdG9rZW5zL2luamVjdGlvbi10b2tlbnMnO1xuXG4vKipcbiAqIEVudGl0eVJlZlJlZ2lzdHJ5U2VydmljZSDigJQgcmVzb2x2ZXMgZW50aXR5LXJlZiBvcHRpb24gbG9hZGVyIGZ1bmN0aW9ucy5cbiAqIEFEUi0wMDY6IEVudGl0eS1yZWYgb3B0aW9ucyBjb21lIE9OTFkgZnJvbSB0aGlzIHJlZ2lzdHJ5LlxuICogTmV2ZXIgcGFzcyBsb2FkZXJzIHZpYSBASW5wdXQoKSBvbiBmaWVsZCBjb21wb25lbnRzLlxuICpcbiAqIENvbnN1bWVycyByZWdpc3RlciBsb2FkZXJzIHZpYSBwcm92aWRlTmd4RHluYW1pY0VudGl0eSh7IGVudGl0eVJlZnM6IHsgY2xpZW50czogKCkgPT4gWy4uLl0gfSB9KS5cbiAqIEVudGl0eVJlZkZpZWxkQ29tcG9uZW50IGluamVjdHMgdGhpcyBzZXJ2aWNlIGFuZCBjYWxscyByZXNvbHZlKGZpZWxkLmNvbXBvbmVudCA/PyBmaWVsZC5pZCkuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgRW50aXR5UmVmUmVnaXN0cnlTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpc3RyeSA9IGluamVjdChFTlRJVFlfUkVGX1JFR0lTVFJZLCB7IG9wdGlvbmFsOiB0cnVlIH0pID8/IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogR2V0IHRoZSBvcHRpb24gbG9hZGVyIGZ1bmN0aW9uIGZvciBhbiBlbnRpdHkga2V5LlxuICAgKiBAcmV0dXJucyBBc3luYyBmdW5jdGlvbiB0aGF0IHJldHVybnMgb3B0aW9ucyBhcnJheSwgb3IgbnVsbCBpZiBub3QgcmVnaXN0ZXJlZC5cbiAgICovXG4gIHJlc29sdmUoZW50aXR5S2V5OiBzdHJpbmcpOiAoKCkgPT4gUHJvbWlzZTxhbnlbXT4pIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnkuZ2V0KGVudGl0eUtleSkgPz8gbnVsbDtcbiAgfVxuXG4gIGhhcyhlbnRpdHlLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LmhhcyhlbnRpdHlLZXkpO1xuICB9XG59XG4iXX0=
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXJlZi1yZWdpc3RyeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9lbnRpdHktcmVmLXJlZ2lzdHJ5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBRWpFOzs7Ozs7O0dBT0c7QUFFSCxNQUFNLE9BQU8sd0JBQXdCO0lBQ2xCLFFBQVEsR0FDdkIsTUFBTSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxHQUFHLEVBQWlDLENBQUM7SUFFOUY7OztPQUdHO0lBQ0gsT0FBTyxDQUFDLFNBQWlCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQzlDLENBQUM7SUFFRCxHQUFHLENBQUMsU0FBaUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0QyxDQUFDO3dHQWRVLHdCQUF3Qjs0R0FBeEIsd0JBQXdCLGNBRFgsTUFBTTs7NEZBQ25CLHdCQUF3QjtrQkFEcEMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHR5cGUgeyBFbnRpdHlSZWZlcmVuY2VMb2FkZXIgfSBmcm9tICdAZHluYW1pYy1lbnRpdHkvY29yZSc7XHJcbmltcG9ydCB7IEVOVElUWV9SRUZfUkVHSVNUUlkgfSBmcm9tICcuLi90b2tlbnMvaW5qZWN0aW9uLXRva2Vucyc7XHJcblxyXG4vKipcclxuICogRW50aXR5UmVmUmVnaXN0cnlTZXJ2aWNlIOKAlCByZXNvbHZlcyBlbnRpdHktcmVmIG9wdGlvbiBsb2FkZXIgZnVuY3Rpb25zLlxyXG4gKiBBRFItMDA2OiBFbnRpdHktcmVmIG9wdGlvbnMgY29tZSBPTkxZIGZyb20gdGhpcyByZWdpc3RyeS5cclxuICogTmV2ZXIgcGFzcyBsb2FkZXJzIHZpYSBASW5wdXQoKSBvbiBmaWVsZCBjb21wb25lbnRzLlxyXG4gKlxyXG4gKiBDb25zdW1lcnMgcmVnaXN0ZXIgbG9hZGVycyB2aWEgcHJvdmlkZU5neER5bmFtaWNFbnRpdHkoeyBlbnRpdHlSZWZzOiB7IGNsaWVudHM6ICgpID0+IFsuLi5dIH0gfSkuXHJcbiAqIEVudGl0eVJlZkZpZWxkQ29tcG9uZW50IGluamVjdHMgdGhpcyBzZXJ2aWNlIGFuZCBjYWxscyByZXNvbHZlKGZpZWxkLmNvbXBvbmVudCA/PyBmaWVsZC5pZCkuXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxyXG5leHBvcnQgY2xhc3MgRW50aXR5UmVmUmVnaXN0cnlTZXJ2aWNlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdHJ5ID1cclxuICAgIGluamVjdChFTlRJVFlfUkVGX1JFR0lTVFJZLCB7IG9wdGlvbmFsOiB0cnVlIH0pID8/IG5ldyBNYXA8c3RyaW5nLCBFbnRpdHlSZWZlcmVuY2VMb2FkZXI+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgb3B0aW9uIGxvYWRlciBmb3IgYW4gZW50aXR5IGtleS5cclxuICAgKiBAcmV0dXJucyBUaGUgbG9hZGVyLCBvciBudWxsIGlmIG5vbmUgaXMgcmVnaXN0ZXJlZC5cclxuICAgKi9cclxuICByZXNvbHZlKGVudGl0eUtleTogc3RyaW5nKTogRW50aXR5UmVmZXJlbmNlTG9hZGVyIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5nZXQoZW50aXR5S2V5KSA/PyBudWxsO1xyXG4gIH1cclxuXHJcbiAgaGFzKGVudGl0eUtleTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5oYXMoZW50aXR5S2V5KTtcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,27 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * EntityRefSelectionService — the channel an entity-ref field uses to publish *which record*
6
+ * the user picked, so the owning form can run `autoPatch` against it.
7
+ *
8
+ * The control value alone is not enough: `autoPatch` copies fields out of the selected
9
+ * record, which only the field component has after loading its options.
10
+ *
11
+ * Provided at `DynamicFormComponent` level so each form instance gets its own channel;
12
+ * the `root` fallback keeps standalone field components injectable in isolation.
13
+ */
14
+ export class EntityRefSelectionService {
15
+ subject = new Subject();
16
+ selection$ = this.subject.asObservable();
17
+ emit(fieldId, option) {
18
+ this.subject.next({ fieldId, option });
19
+ }
20
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EntityRefSelectionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
21
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EntityRefSelectionService, providedIn: 'root' });
22
+ }
23
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EntityRefSelectionService, decorators: [{
24
+ type: Injectable,
25
+ args: [{ providedIn: 'root' }]
26
+ }] });
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXJlZi1zZWxlY3Rpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvZW50aXR5LXJlZi1zZWxlY3Rpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBUy9COzs7Ozs7Ozs7R0FTRztBQUVILE1BQU0sT0FBTyx5QkFBeUI7SUFDbkIsT0FBTyxHQUFHLElBQUksT0FBTyxFQUFzQixDQUFDO0lBRXBELFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBRWxELElBQUksQ0FBQyxPQUFlLEVBQUUsTUFBOEI7UUFDbEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN6QyxDQUFDO3dHQVBVLHlCQUF5Qjs0R0FBekIseUJBQXlCLGNBRFosTUFBTTs7NEZBQ25CLHlCQUF5QjtrQkFEckMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHR5cGUgeyBSZWZlcmVuY2VPcHRpb24gfSBmcm9tICdAZHluYW1pYy1lbnRpdHkvY29yZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVJlZlNlbGVjdGlvbiB7XHJcbiAgZmllbGRJZDogc3RyaW5nO1xyXG4gIC8qKiBUaGUgY2hvc2VuIG9wdGlvbiwgb3IgYG51bGxgIHdoZW4gdGhlIHNlbGVjdGlvbiB3YXMgY2xlYXJlZC4gKi9cclxuICBvcHRpb246IFJlZmVyZW5jZU9wdGlvbiB8IG51bGw7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFbnRpdHlSZWZTZWxlY3Rpb25TZXJ2aWNlIOKAlCB0aGUgY2hhbm5lbCBhbiBlbnRpdHktcmVmIGZpZWxkIHVzZXMgdG8gcHVibGlzaCAqd2hpY2ggcmVjb3JkKlxyXG4gKiB0aGUgdXNlciBwaWNrZWQsIHNvIHRoZSBvd25pbmcgZm9ybSBjYW4gcnVuIGBhdXRvUGF0Y2hgIGFnYWluc3QgaXQuXHJcbiAqXHJcbiAqIFRoZSBjb250cm9sIHZhbHVlIGFsb25lIGlzIG5vdCBlbm91Z2g6IGBhdXRvUGF0Y2hgIGNvcGllcyBmaWVsZHMgb3V0IG9mIHRoZSBzZWxlY3RlZFxyXG4gKiByZWNvcmQsIHdoaWNoIG9ubHkgdGhlIGZpZWxkIGNvbXBvbmVudCBoYXMgYWZ0ZXIgbG9hZGluZyBpdHMgb3B0aW9ucy5cclxuICpcclxuICogUHJvdmlkZWQgYXQgYER5bmFtaWNGb3JtQ29tcG9uZW50YCBsZXZlbCBzbyBlYWNoIGZvcm0gaW5zdGFuY2UgZ2V0cyBpdHMgb3duIGNoYW5uZWw7XHJcbiAqIHRoZSBgcm9vdGAgZmFsbGJhY2sga2VlcHMgc3RhbmRhbG9uZSBmaWVsZCBjb21wb25lbnRzIGluamVjdGFibGUgaW4gaXNvbGF0aW9uLlxyXG4gKi9cclxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcclxuZXhwb3J0IGNsYXNzIEVudGl0eVJlZlNlbGVjdGlvblNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc3ViamVjdCA9IG5ldyBTdWJqZWN0PEVudGl0eVJlZlNlbGVjdGlvbj4oKTtcclxuXHJcbiAgcmVhZG9ubHkgc2VsZWN0aW9uJCA9IHRoaXMuc3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgZW1pdChmaWVsZElkOiBzdHJpbmcsIG9wdGlvbjogUmVmZXJlbmNlT3B0aW9uIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdWJqZWN0Lm5leHQoeyBmaWVsZElkLCBvcHRpb24gfSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==