@webiny/app-admin 6.3.0-beta.1 → 6.3.0-beta.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 (234) hide show
  1. package/base/Base/DefaultFieldRenderers.js +69 -5
  2. package/base/Base/DefaultFieldRenderers.js.map +1 -1
  3. package/base/Base/DefaultLayoutRenderers.js +5 -1
  4. package/base/Base/DefaultLayoutRenderers.js.map +1 -1
  5. package/base/Base/FieldRenderers/CheckboxesRenderer.d.ts +13 -0
  6. package/base/Base/FieldRenderers/CheckboxesRenderer.js +28 -0
  7. package/base/Base/FieldRenderers/CheckboxesRenderer.js.map +1 -0
  8. package/base/Base/FieldRenderers/CodeEditorRenderer.d.ts +15 -0
  9. package/base/Base/FieldRenderers/CodeEditorRenderer.js +17 -0
  10. package/base/Base/FieldRenderers/CodeEditorRenderer.js.map +1 -0
  11. package/base/Base/FieldRenderers/DateTimeInputsRenderer.d.ts +17 -0
  12. package/base/Base/FieldRenderers/DateTimeInputsRenderer.js +66 -0
  13. package/base/Base/FieldRenderers/DateTimeInputsRenderer.js.map +1 -0
  14. package/base/Base/FieldRenderers/DateTimeRenderer.d.ts +21 -0
  15. package/base/Base/FieldRenderers/DateTimeRenderer.js +46 -0
  16. package/base/Base/FieldRenderers/DateTimeRenderer.js.map +1 -0
  17. package/base/Base/FieldRenderers/FilePickerRenderer.d.ts +12 -0
  18. package/base/Base/FieldRenderers/FilePickerRenderer.js +47 -0
  19. package/base/Base/FieldRenderers/FilePickerRenderer.js.map +1 -0
  20. package/base/Base/FieldRenderers/FileUrlPickerRenderer.d.ts +12 -0
  21. package/base/Base/FieldRenderers/FileUrlPickerRenderer.js +25 -0
  22. package/base/Base/FieldRenderers/FileUrlPickerRenderer.js.map +1 -0
  23. package/base/Base/FieldRenderers/HiddenRenderer.d.ts +12 -0
  24. package/base/Base/FieldRenderers/HiddenRenderer.js +5 -0
  25. package/base/Base/FieldRenderers/HiddenRenderer.js.map +1 -0
  26. package/base/Base/FieldRenderers/HorizontalTabsRenderer.d.ts +5 -0
  27. package/base/Base/FieldRenderers/HorizontalTabsRenderer.js +27 -0
  28. package/base/Base/FieldRenderers/HorizontalTabsRenderer.js.map +1 -0
  29. package/base/Base/FieldRenderers/InputRenderer.d.ts +4 -7
  30. package/base/Base/FieldRenderers/InputRenderer.js +2 -2
  31. package/base/Base/FieldRenderers/InputRenderer.js.map +1 -1
  32. package/base/Base/FieldRenderers/NumberInputRenderer.d.ts +12 -0
  33. package/base/Base/FieldRenderers/NumberInputRenderer.js +23 -0
  34. package/base/Base/FieldRenderers/NumberInputRenderer.js.map +1 -0
  35. package/base/Base/FieldRenderers/NumberInputsRenderer.d.ts +14 -0
  36. package/base/Base/FieldRenderers/NumberInputsRenderer.js +49 -0
  37. package/base/Base/FieldRenderers/NumberInputsRenderer.js.map +1 -0
  38. package/base/Base/FieldRenderers/ObjectRenderer/DynamicZoneRenderer.d.ts +14 -0
  39. package/base/Base/FieldRenderers/ObjectRenderer/DynamicZoneRenderer.js +20 -0
  40. package/base/Base/FieldRenderers/ObjectRenderer/DynamicZoneRenderer.js.map +1 -0
  41. package/base/Base/FieldRenderers/ObjectRenderer/KeyValueTagsRenderer.d.ts +14 -0
  42. package/base/Base/FieldRenderers/ObjectRenderer/KeyValueTagsRenderer.js +65 -0
  43. package/base/Base/FieldRenderers/ObjectRenderer/KeyValueTagsRenderer.js.map +1 -0
  44. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone.d.ts +10 -0
  45. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone.js +109 -0
  46. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone.js.map +1 -0
  47. package/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.d.ts +17 -0
  48. package/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.js +55 -0
  49. package/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.js.map +1 -0
  50. package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.d.ts +7 -3
  51. package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.js +15 -19
  52. package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.js.map +1 -1
  53. package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.d.ts +5 -8
  54. package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js +7 -50
  55. package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js.map +1 -1
  56. package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.d.ts +10 -0
  57. package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js +64 -0
  58. package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js.map +1 -0
  59. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.d.ts +10 -0
  60. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.js +85 -0
  61. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.js.map +1 -0
  62. package/base/Base/FieldRenderers/PassthroughRenderer.d.ts +3 -6
  63. package/base/Base/FieldRenderers/PassthroughRenderer.js +9 -23
  64. package/base/Base/FieldRenderers/PassthroughRenderer.js.map +1 -1
  65. package/base/Base/FieldRenderers/RadioButtonsRenderer.d.ts +13 -0
  66. package/base/Base/FieldRenderers/RadioButtonsRenderer.js +27 -0
  67. package/base/Base/FieldRenderers/RadioButtonsRenderer.js.map +1 -0
  68. package/base/Base/FieldRenderers/SelectRenderer.d.ts +6 -8
  69. package/base/Base/FieldRenderers/SelectRenderer.js +8 -5
  70. package/base/Base/FieldRenderers/SelectRenderer.js.map +1 -1
  71. package/base/Base/FieldRenderers/SwitchRenderer.d.ts +12 -0
  72. package/base/Base/FieldRenderers/SwitchRenderer.js +19 -0
  73. package/base/Base/FieldRenderers/SwitchRenderer.js.map +1 -0
  74. package/base/Base/FieldRenderers/TagsRenderer.d.ts +12 -0
  75. package/base/Base/FieldRenderers/TagsRenderer.js +21 -0
  76. package/base/Base/FieldRenderers/TagsRenderer.js.map +1 -0
  77. package/base/Base/FieldRenderers/TextInputsRenderer.d.ts +14 -0
  78. package/base/Base/FieldRenderers/TextInputsRenderer.js +48 -0
  79. package/base/Base/FieldRenderers/TextInputsRenderer.js.map +1 -0
  80. package/base/Base/FieldRenderers/TextareaRenderer.d.ts +3 -6
  81. package/base/Base/FieldRenderers/TextareaRenderer.js +3 -4
  82. package/base/Base/FieldRenderers/TextareaRenderer.js.map +1 -1
  83. package/base/Base/FieldRenderers/TextareasRenderer.d.ts +14 -0
  84. package/base/Base/FieldRenderers/TextareasRenderer.js +51 -0
  85. package/base/Base/FieldRenderers/TextareasRenderer.js.map +1 -0
  86. package/base/Base/FieldRenderers/VerticalTabsRenderer.js +2 -2
  87. package/base/Base/FieldRenderers/VerticalTabsRenderer.js.map +1 -1
  88. package/base/Base/Menus.js +5 -64
  89. package/base/Base/Menus.js.map +1 -1
  90. package/base/Base/RoutesConfig.js +6 -0
  91. package/base/Base/RoutesConfig.js.map +1 -1
  92. package/exports/admin/build-params.d.ts +2 -0
  93. package/exports/admin/build-params.js +3 -0
  94. package/exports/admin/build-params.js.map +1 -1
  95. package/exports/admin/form.d.ts +5 -0
  96. package/exports/admin/form.js +8 -0
  97. package/exports/admin/form.js.map +1 -1
  98. package/exports/admin/ui.d.ts +1 -0
  99. package/exports/admin/ui.js +1 -0
  100. package/exports/admin/ui.js.map +1 -1
  101. package/exports/admin.d.ts +3 -1
  102. package/exports/admin.js +3 -1
  103. package/exports/admin.js.map +1 -1
  104. package/features/formModel/ConditionRuleEvaluator.d.ts +9 -0
  105. package/features/formModel/ConditionRuleEvaluator.js +56 -0
  106. package/features/formModel/ConditionRuleEvaluator.js.map +1 -0
  107. package/features/formModel/Field.d.ts +50 -4
  108. package/features/formModel/Field.js +254 -35
  109. package/features/formModel/Field.js.map +1 -1
  110. package/features/formModel/FieldBuilder.d.ts +17 -35
  111. package/features/formModel/FieldBuilder.js +63 -100
  112. package/features/formModel/FieldBuilder.js.map +1 -1
  113. package/features/formModel/FieldBuilder.test.js +127 -13
  114. package/features/formModel/FieldBuilder.test.js.map +1 -1
  115. package/features/formModel/FieldBuilderRegistry.d.ts +4 -0
  116. package/features/formModel/FieldBuilderRegistry.js +31 -0
  117. package/features/formModel/FieldBuilderRegistry.js.map +1 -0
  118. package/features/formModel/FocusManager.d.ts +14 -0
  119. package/features/formModel/FocusManager.js +109 -0
  120. package/features/formModel/FocusManager.js.map +1 -0
  121. package/features/formModel/FormModel.d.ts +27 -31
  122. package/features/formModel/FormModel.js +210 -403
  123. package/features/formModel/FormModel.js.map +1 -1
  124. package/features/formModel/FormModel.test.js +2044 -193
  125. package/features/formModel/FormModel.test.js.map +1 -1
  126. package/features/formModel/FormModelFactory.d.ts +4 -2
  127. package/features/formModel/FormModelFactory.js +13 -3
  128. package/features/formModel/FormModelFactory.js.map +1 -1
  129. package/features/formModel/FormView.d.ts +2 -0
  130. package/features/formModel/FormView.js +44 -37
  131. package/features/formModel/FormView.js.map +1 -1
  132. package/features/formModel/LayoutBuilderFactory.d.ts +61 -0
  133. package/features/formModel/LayoutBuilderFactory.js +386 -0
  134. package/features/formModel/LayoutBuilderFactory.js.map +1 -0
  135. package/features/formModel/LayoutMutator.d.ts +11 -0
  136. package/features/formModel/LayoutMutator.js +136 -0
  137. package/features/formModel/LayoutMutator.js.map +1 -0
  138. package/features/formModel/LayoutResolver.d.ts +26 -0
  139. package/features/formModel/LayoutResolver.js +239 -0
  140. package/features/formModel/LayoutResolver.js.map +1 -0
  141. package/features/formModel/ObjectField.d.ts +55 -4
  142. package/features/formModel/ObjectField.js +499 -82
  143. package/features/formModel/ObjectField.js.map +1 -1
  144. package/features/formModel/Rules.test.d.ts +1 -0
  145. package/features/formModel/Rules.test.js +289 -0
  146. package/features/formModel/Rules.test.js.map +1 -0
  147. package/features/formModel/abstractions.d.ts +402 -52
  148. package/features/formModel/abstractions.js +55 -0
  149. package/features/formModel/abstractions.js.map +1 -1
  150. package/features/formModel/createFieldRenderer.d.ts +20 -0
  151. package/features/formModel/createFieldRenderer.js +15 -0
  152. package/features/formModel/createFieldRenderer.js.map +1 -0
  153. package/features/formModel/demo/FieldRenderersDemoPresenter.d.ts +18 -0
  154. package/features/formModel/demo/FieldRenderersDemoPresenter.js +225 -0
  155. package/features/formModel/demo/FieldRenderersDemoPresenter.js.map +1 -0
  156. package/features/formModel/demo/FormModelDemo.d.ts +4 -0
  157. package/features/formModel/demo/FormModelDemo.js +230 -0
  158. package/features/formModel/demo/FormModelDemo.js.map +1 -0
  159. package/features/formModel/demo/FormModelDemoPresenter.d.ts +22 -0
  160. package/features/formModel/demo/FormModelDemoPresenter.js +121 -0
  161. package/features/formModel/demo/FormModelDemoPresenter.js.map +1 -0
  162. package/features/formModel/demo/FormModelPhase11Presenter.d.ts +25 -0
  163. package/features/formModel/demo/FormModelPhase11Presenter.js +104 -0
  164. package/features/formModel/demo/FormModelPhase11Presenter.js.map +1 -0
  165. package/features/formModel/demo/FormModelPhase8c1Presenter.d.ts +23 -0
  166. package/features/formModel/demo/FormModelPhase8c1Presenter.js +62 -0
  167. package/features/formModel/demo/FormModelPhase8c1Presenter.js.map +1 -0
  168. package/features/formModel/feature.js +12 -0
  169. package/features/formModel/feature.js.map +1 -1
  170. package/features/formModel/fieldTypes/BooleanFieldType.d.ts +19 -0
  171. package/features/formModel/fieldTypes/BooleanFieldType.js +23 -0
  172. package/features/formModel/fieldTypes/BooleanFieldType.js.map +1 -0
  173. package/features/formModel/fieldTypes/DateTimeFieldType.d.ts +173 -0
  174. package/features/formModel/fieldTypes/DateTimeFieldType.js +369 -0
  175. package/features/formModel/fieldTypes/DateTimeFieldType.js.map +1 -0
  176. package/features/formModel/fieldTypes/FileFieldType.d.ts +18 -0
  177. package/features/formModel/fieldTypes/FileFieldType.js +20 -0
  178. package/features/formModel/fieldTypes/FileFieldType.js.map +1 -0
  179. package/features/formModel/fieldTypes/FileUrlFieldType.d.ts +18 -0
  180. package/features/formModel/fieldTypes/FileUrlFieldType.js +20 -0
  181. package/features/formModel/fieldTypes/FileUrlFieldType.js.map +1 -0
  182. package/features/formModel/fieldTypes/NumberFieldType.d.ts +19 -0
  183. package/features/formModel/fieldTypes/NumberFieldType.js +27 -0
  184. package/features/formModel/fieldTypes/NumberFieldType.js.map +1 -0
  185. package/features/formModel/fieldTypes/ObjectFieldType.d.ts +34 -0
  186. package/features/formModel/fieldTypes/ObjectFieldType.js +109 -0
  187. package/features/formModel/fieldTypes/ObjectFieldType.js.map +1 -0
  188. package/features/formModel/fieldTypes/TextFieldType.d.ts +18 -0
  189. package/features/formModel/fieldTypes/TextFieldType.js +20 -0
  190. package/features/formModel/fieldTypes/TextFieldType.js.map +1 -0
  191. package/features/formModel/fieldTypes/index.d.ts +7 -0
  192. package/features/formModel/fieldTypes/index.js +9 -0
  193. package/features/formModel/fieldTypes/index.js.map +1 -0
  194. package/features/formModel/index.d.ts +13 -4
  195. package/features/formModel/index.js +21 -2
  196. package/features/formModel/index.js.map +1 -1
  197. package/features/formModel/renderers.d.ts +15 -1
  198. package/features/formModel/renderers.js +15 -1
  199. package/features/formModel/renderers.js.map +1 -1
  200. package/features/tools/LexicalContext/LexicalContext.d.ts +14 -0
  201. package/features/tools/LexicalContext/LexicalContext.js +22 -0
  202. package/features/tools/LexicalContext/LexicalContext.js.map +1 -0
  203. package/features/tools/LexicalContext/abstractions.d.ts +11 -0
  204. package/features/tools/LexicalContext/abstractions.js +4 -0
  205. package/features/tools/LexicalContext/abstractions.js.map +1 -0
  206. package/features/tools/LexicalContext/index.d.ts +2 -0
  207. package/features/tools/LexicalContext/index.js +3 -0
  208. package/features/tools/LexicalContext/index.js.map +1 -0
  209. package/features/tools/feature.js +2 -0
  210. package/features/tools/feature.js.map +1 -1
  211. package/features/tools/index.d.ts +1 -0
  212. package/features/tools/index.js +1 -0
  213. package/features/tools/index.js.map +1 -1
  214. package/index.d.ts +8 -1
  215. package/index.js +7 -0
  216. package/index.js.map +1 -1
  217. package/package.json +31 -25
  218. package/presentation/installation/components/SystemInstaller/steps/AdminUserStep/createPasswordValidator.js +1 -1
  219. package/presentation/installation/components/SystemInstaller/steps/AdminUserStep/createPasswordValidator.js.map +1 -1
  220. package/presentation/lexicalContext/useLexicalContext.d.ts +3 -0
  221. package/presentation/lexicalContext/useLexicalContext.js +14 -0
  222. package/presentation/lexicalContext/useLexicalContext.js.map +1 -0
  223. package/presentation/textToLexicalTool/TextToLexicalTool.d.ts +3 -0
  224. package/presentation/textToLexicalTool/TextToLexicalTool.js +6 -2
  225. package/presentation/textToLexicalTool/TextToLexicalTool.js.map +1 -1
  226. package/presentation/textToLexicalTool/textToLexicalState.d.ts +2 -1
  227. package/presentation/textToLexicalTool/textToLexicalState.js +15 -3
  228. package/presentation/textToLexicalTool/textToLexicalState.js.map +1 -1
  229. package/routes.d.ts +1 -0
  230. package/routes.js +4 -0
  231. package/routes.js.map +1 -1
  232. package/base/Base/FieldRenderers/ObjectRenderer/ObjectListFlatRenderer.d.ts +0 -21
  233. package/base/Base/FieldRenderers/ObjectRenderer/ObjectListFlatRenderer.js +0 -28
  234. package/base/Base/FieldRenderers/ObjectRenderer/ObjectListFlatRenderer.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import type { z } from "zod";
2
- import type { IFieldConfig, IObjectFieldConfig, IValueOption, IFormModel, IFieldBuilder, ISelectFieldBuilder, IObjectFieldBuilder, IFieldBuilderRegistry, BeforeChangeCallback, AfterChangeCallback, AfterSetValueCallback, OnBlurCallback } from "./abstractions.js";
2
+ import type { IFieldConfig, IValueOption, IFormModel, IFieldBuilder, IFieldBuilderRegistry, IFieldTypeFactory, IRule, BeforeChangeCallback, AfterChangeCallback, AfterSetValueCallback, ComputedFieldCallback, OnBlurCallback, CloneValueCallback } from "./abstractions.js";
3
3
  /**
4
4
  * Base FieldBuilder with fluent API.
5
5
  * Each method mutates `this` and returns `this` for chaining.
@@ -16,46 +16,28 @@ export declare class FieldBuilder<TType extends string = string> implements IFie
16
16
  schema(zodSchema: z.ZodTypeAny): this;
17
17
  defaultValue(value: unknown): this;
18
18
  renderer(name: string, settings?: Record<string, unknown>): this;
19
+ list(): this;
19
20
  hidden(): this;
20
21
  required(message?: string): this;
22
+ requiredWhen(fn: (form: IFormModel) => boolean, message?: string): this;
23
+ computed(fn: ComputedFieldCallback): this;
24
+ computedUntilDirty(fn: ComputedFieldCallback): this;
21
25
  disabled(value?: boolean): this;
26
+ rules(rules: IRule[]): this;
22
27
  beforeChange(fn: BeforeChangeCallback): this;
23
28
  afterChange(fn: AfterChangeCallback): this;
24
29
  afterSetValue(fn: AfterSetValueCallback): this;
25
30
  onBlur(fn: OnBlurCallback): this;
26
- build(name: string): IFieldConfig;
27
- }
28
- /**
29
- * Text field builder.
30
- */
31
- export declare class TextFieldBuilder extends FieldBuilder<"text"> {
32
- constructor();
33
- }
34
- /**
35
- * Select field builder with .options() support.
36
- */
37
- export declare class SelectFieldBuilder extends FieldBuilder<"select"> implements ISelectFieldBuilder {
38
- constructor();
31
+ cloneValue(fn: CloneValueCallback): this;
32
+ getTags(): string[];
33
+ tags(tags: string[]): this;
39
34
  options(opts: IValueOption[] | ((form: IFormModel) => IValueOption[])): this;
35
+ /**
36
+ * Normalize value before it's set. If field value is an array, this method runs on each individual value in the array.
37
+ * Useful for converting strings to numbers, ensuring specific date format, etc.
38
+ * @param value
39
+ */
40
+ normalizeValue(value: unknown): unknown;
41
+ build(name: string): IFieldConfig;
40
42
  }
41
- /**
42
- * Object field builder with .fields(), .list(), .listSchema() support.
43
- */
44
- export declare class ObjectFieldBuilder extends FieldBuilder<"object"> implements IObjectFieldBuilder {
45
- private _childBuilders;
46
- private _isList;
47
- private _listSchema?;
48
- constructor();
49
- fields(fn: (registry: IFieldBuilderRegistry) => Record<string, IFieldBuilder>): this;
50
- list(): this;
51
- listSchema(schema: z.ZodTypeAny): this;
52
- build(name: string): IObjectFieldConfig;
53
- }
54
- /**
55
- * Factory interface for creating field builders.
56
- */
57
- export interface IFieldTypeFactory {
58
- readonly type: string;
59
- create(): FieldBuilder;
60
- }
61
- export declare function createFieldBuilderRegistry(factories?: IFieldTypeFactory[]): IFieldBuilderRegistry;
43
+ export declare function createFieldBuilderRegistry(factories: IFieldTypeFactory[]): IFieldBuilderRegistry;
@@ -48,6 +48,10 @@ export class FieldBuilder {
48
48
  this._config.rendererSettings = settings;
49
49
  return this;
50
50
  }
51
+ list() {
52
+ this._config.isList = true;
53
+ return this;
54
+ }
51
55
  hidden() {
52
56
  this._config.hidden = true;
53
57
  return this;
@@ -57,10 +61,37 @@ export class FieldBuilder {
57
61
  this._config.requiredMessage = message;
58
62
  return this;
59
63
  }
64
+ requiredWhen(fn, message) {
65
+ if (!this._config.requiredWhenCallbacks) {
66
+ this._config.requiredWhenCallbacks = [];
67
+ }
68
+ this._config.requiredWhenCallbacks.push({
69
+ fn,
70
+ message
71
+ });
72
+ return this;
73
+ }
74
+ computed(fn) {
75
+ this._config.computed = fn;
76
+ this._config.computedUntilDirty = undefined;
77
+ return this;
78
+ }
79
+ computedUntilDirty(fn) {
80
+ this._config.computedUntilDirty = fn;
81
+ this._config.computed = undefined;
82
+ return this;
83
+ }
60
84
  disabled(value = true) {
61
85
  this._config.disabled = value;
62
86
  return this;
63
87
  }
88
+ rules(rules) {
89
+ if (!this._config.rules) {
90
+ this._config.rules = [];
91
+ }
92
+ this._config.rules.push(...rules);
93
+ return this;
94
+ }
64
95
  beforeChange(fn) {
65
96
  if (!this._config.beforeChangeCallbacks) {
66
97
  this._config.beforeChangeCallbacks = [];
@@ -89,124 +120,56 @@ export class FieldBuilder {
89
120
  this._config.onBlurCallbacks.push(fn);
90
121
  return this;
91
122
  }
92
- build(name) {
93
- return {
94
- ...this._config,
95
- name
96
- };
123
+ cloneValue(fn) {
124
+ this._config.cloneValue = fn;
125
+ return this;
97
126
  }
98
- }
99
-
100
- /**
101
- * Text field builder.
102
- */
103
- export class TextFieldBuilder extends FieldBuilder {
104
- constructor() {
105
- super("text");
106
- this._config.renderer = "input";
127
+ getTags() {
128
+ return this._config.tags ?? [];
107
129
  }
108
- }
109
-
110
- /**
111
- * Select field builder with .options() support.
112
- */
113
- export class SelectFieldBuilder extends FieldBuilder {
114
- constructor() {
115
- super("select");
116
- this._config.renderer = "dropdown";
130
+ tags(tags) {
131
+ this._config.tags = tags;
132
+ return this;
117
133
  }
118
134
  options(opts) {
119
135
  this._config.options = opts;
136
+ if (this._config.renderer === "textInput" || this._config.renderer === "numberInput") {
137
+ this._config.renderer = "dropdown";
138
+ }
120
139
  return this;
121
140
  }
122
- }
123
141
 
124
- /**
125
- * Object field builder with .fields(), .list(), .listSchema() support.
126
- */
127
- export class ObjectFieldBuilder extends FieldBuilder {
128
- _childBuilders = {};
129
- _isList = false;
130
- constructor() {
131
- super("object");
132
- this._config.renderer = "object";
133
- }
134
- fields(fn) {
135
- const registry = createFieldBuilderRegistry();
136
- this._childBuilders = fn(registry);
137
- return this;
138
- }
139
- list() {
140
- this._isList = true;
141
- return this;
142
- }
143
- listSchema(schema) {
144
- this._listSchema = schema;
145
- return this;
142
+ /**
143
+ * Normalize value before it's set. If field value is an array, this method runs on each individual value in the array.
144
+ * Useful for converting strings to numbers, ensuring specific date format, etc.
145
+ * @param value
146
+ */
147
+ normalizeValue(value) {
148
+ return value;
146
149
  }
147
150
  build(name) {
148
151
  return {
149
152
  ...this._config,
150
153
  name,
151
- childBuilders: this._childBuilders,
152
- isList: this._isList,
153
- listSchema: this._listSchema
154
+ normalizeValue: v => this.normalizeValue(v)
154
155
  };
155
156
  }
156
157
  }
157
-
158
- /**
159
- * Factory interface for creating field builders.
160
- */
161
-
162
- /**
163
- * Proxy-based FieldBuilderRegistry.
164
- */
165
- class FieldBuilderRegistryImpl {
166
- fieldTypes = new Map();
167
- constructor(factories) {
168
- this.fieldTypes.set("text", {
169
- type: "text",
170
- create: () => new TextFieldBuilder()
171
- });
172
- this.fieldTypes.set("select", {
173
- type: "select",
174
- create: () => new SelectFieldBuilder()
175
- });
176
- this.fieldTypes.set("object", {
177
- type: "object",
178
- create: () => new ObjectFieldBuilder()
179
- });
180
- if (factories) {
181
- for (const factory of factories) {
182
- this.fieldTypes.set(factory.type, factory);
158
+ export function createFieldBuilderRegistry(factories) {
159
+ const fieldTypes = new Map();
160
+ for (const factory of factories) {
161
+ fieldTypes.set(factory.type, factory);
162
+ }
163
+ const proxy = new Proxy({}, {
164
+ get(_target, prop) {
165
+ const factory = fieldTypes.get(prop);
166
+ if (factory) {
167
+ return () => factory.create(proxy);
183
168
  }
169
+ return undefined;
184
170
  }
185
- const proxy = new Proxy(this, {
186
- get(target, prop) {
187
- const factory = target.fieldTypes.get(prop);
188
- if (factory) {
189
- return () => factory.create();
190
- }
191
- return target[prop];
192
- }
193
- });
194
- return proxy;
195
- }
196
-
197
- // These exist for TypeScript but are intercepted by the Proxy
198
- text() {
199
- throw new Error("Should be intercepted by Proxy");
200
- }
201
- select() {
202
- throw new Error("Should be intercepted by Proxy");
203
- }
204
- object() {
205
- throw new Error("Should be intercepted by Proxy");
206
- }
207
- }
208
- export function createFieldBuilderRegistry(factories) {
209
- return new FieldBuilderRegistryImpl(factories);
171
+ });
172
+ return proxy;
210
173
  }
211
174
 
212
175
  //# sourceMappingURL=FieldBuilder.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["FieldBuilder","constructor","type","_config","name","hidden","required","disabled","fieldType","label","text","help","description","note","placeholder","schema","zodSchema","defaultValue","value","renderer","settings","rendererSettings","message","requiredMessage","beforeChange","fn","beforeChangeCallbacks","push","afterChange","afterChangeCallbacks","afterSetValue","afterSetValueCallbacks","onBlur","onBlurCallbacks","build","TextFieldBuilder","SelectFieldBuilder","options","opts","ObjectFieldBuilder","_childBuilders","_isList","fields","registry","createFieldBuilderRegistry","list","listSchema","_listSchema","childBuilders","isList","FieldBuilderRegistryImpl","fieldTypes","Map","factories","set","create","factory","proxy","Proxy","get","target","prop","Error","select","object"],"sources":["FieldBuilder.ts"],"sourcesContent":["import type { z } from \"zod\";\nimport type {\n IFieldConfig,\n IObjectFieldConfig,\n IValueOption,\n IFormModel,\n IFieldBuilder,\n ISelectFieldBuilder,\n IObjectFieldBuilder,\n IFieldBuilderRegistry,\n BeforeChangeCallback,\n AfterChangeCallback,\n AfterSetValueCallback,\n OnBlurCallback\n} from \"./abstractions.js\";\n\n/**\n * Base FieldBuilder with fluent API.\n * Each method mutates `this` and returns `this` for chaining.\n */\nexport class FieldBuilder<TType extends string = string> implements IFieldBuilder {\n protected _config: IFieldConfig;\n\n constructor(type: TType) {\n this._config = {\n name: \"\",\n type,\n hidden: false,\n required: false,\n disabled: false\n };\n }\n\n get fieldType(): string {\n return this._config.type;\n }\n\n label(text: string): this {\n this._config.label = text;\n return this;\n }\n\n help(text: string): this {\n this._config.help = text;\n return this;\n }\n\n description(text: string): this {\n this._config.description = text;\n return this;\n }\n\n note(text: string): this {\n this._config.note = text;\n return this;\n }\n\n placeholder(text: string): this {\n this._config.placeholder = text;\n return this;\n }\n\n schema(zodSchema: z.ZodTypeAny): this {\n this._config.schema = zodSchema;\n return this;\n }\n\n defaultValue(value: unknown): this {\n this._config.defaultValue = value;\n return this;\n }\n\n renderer(name: string, settings?: Record<string, unknown>): this {\n this._config.renderer = name;\n this._config.rendererSettings = settings;\n return this;\n }\n\n hidden(): this {\n this._config.hidden = true;\n return this;\n }\n\n required(message?: string): this {\n this._config.required = true;\n this._config.requiredMessage = message;\n return this;\n }\n\n disabled(value = true): this {\n this._config.disabled = value;\n return this;\n }\n\n beforeChange(fn: BeforeChangeCallback): this {\n if (!this._config.beforeChangeCallbacks) {\n this._config.beforeChangeCallbacks = [];\n }\n this._config.beforeChangeCallbacks.push(fn);\n return this;\n }\n\n afterChange(fn: AfterChangeCallback): this {\n if (!this._config.afterChangeCallbacks) {\n this._config.afterChangeCallbacks = [];\n }\n this._config.afterChangeCallbacks.push(fn);\n return this;\n }\n\n afterSetValue(fn: AfterSetValueCallback): this {\n if (!this._config.afterSetValueCallbacks) {\n this._config.afterSetValueCallbacks = [];\n }\n this._config.afterSetValueCallbacks.push(fn);\n return this;\n }\n\n onBlur(fn: OnBlurCallback): this {\n if (!this._config.onBlurCallbacks) {\n this._config.onBlurCallbacks = [];\n }\n this._config.onBlurCallbacks.push(fn);\n return this;\n }\n\n build(name: string): IFieldConfig {\n return { ...this._config, name };\n }\n}\n\n/**\n * Text field builder.\n */\nexport class TextFieldBuilder extends FieldBuilder<\"text\"> {\n constructor() {\n super(\"text\");\n this._config.renderer = \"input\";\n }\n}\n\n/**\n * Select field builder with .options() support.\n */\nexport class SelectFieldBuilder extends FieldBuilder<\"select\"> implements ISelectFieldBuilder {\n constructor() {\n super(\"select\");\n this._config.renderer = \"dropdown\";\n }\n\n options(opts: IValueOption[] | ((form: IFormModel) => IValueOption[])): this {\n this._config.options = opts;\n return this;\n }\n}\n\n/**\n * Object field builder with .fields(), .list(), .listSchema() support.\n */\nexport class ObjectFieldBuilder extends FieldBuilder<\"object\"> implements IObjectFieldBuilder {\n private _childBuilders: Record<string, IFieldBuilder> = {};\n private _isList = false;\n private _listSchema?: z.ZodTypeAny;\n\n constructor() {\n super(\"object\");\n this._config.renderer = \"object\";\n }\n\n fields(fn: (registry: IFieldBuilderRegistry) => Record<string, IFieldBuilder>): this {\n const registry = createFieldBuilderRegistry();\n this._childBuilders = fn(registry);\n return this;\n }\n\n list(): this {\n this._isList = true;\n return this;\n }\n\n listSchema(schema: z.ZodTypeAny): this {\n this._listSchema = schema;\n return this;\n }\n\n override build(name: string): IObjectFieldConfig {\n return {\n ...this._config,\n name,\n childBuilders: this._childBuilders,\n isList: this._isList,\n listSchema: this._listSchema\n };\n }\n}\n\n/**\n * Factory interface for creating field builders.\n */\nexport interface IFieldTypeFactory {\n readonly type: string;\n create(): FieldBuilder;\n}\n\n/**\n * Proxy-based FieldBuilderRegistry.\n */\nclass FieldBuilderRegistryImpl implements IFieldBuilderRegistry {\n private fieldTypes = new Map<string, IFieldTypeFactory>();\n\n constructor(factories?: IFieldTypeFactory[]) {\n this.fieldTypes.set(\"text\", { type: \"text\", create: () => new TextFieldBuilder() });\n this.fieldTypes.set(\"select\", { type: \"select\", create: () => new SelectFieldBuilder() });\n this.fieldTypes.set(\"object\", { type: \"object\", create: () => new ObjectFieldBuilder() });\n\n if (factories) {\n for (const factory of factories) {\n this.fieldTypes.set(factory.type, factory);\n }\n }\n\n const proxy = new Proxy(this, {\n get(target, prop: string) {\n const factory = target.fieldTypes.get(prop);\n if (factory) {\n return () => factory.create();\n }\n return target[prop as keyof typeof target];\n }\n }) as any;\n\n return proxy;\n }\n\n // These exist for TypeScript but are intercepted by the Proxy\n text(): TextFieldBuilder {\n throw new Error(\"Should be intercepted by Proxy\");\n }\n select(): SelectFieldBuilder {\n throw new Error(\"Should be intercepted by Proxy\");\n }\n object(): ObjectFieldBuilder {\n throw new Error(\"Should be intercepted by Proxy\");\n }\n}\n\nexport function createFieldBuilderRegistry(factories?: IFieldTypeFactory[]): IFieldBuilderRegistry {\n return new FieldBuilderRegistryImpl(factories);\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["FieldBuilder","constructor","type","_config","name","hidden","required","disabled","fieldType","label","text","help","description","note","placeholder","schema","zodSchema","defaultValue","value","renderer","settings","rendererSettings","list","isList","message","requiredMessage","requiredWhen","fn","requiredWhenCallbacks","push","computed","computedUntilDirty","undefined","rules","beforeChange","beforeChangeCallbacks","afterChange","afterChangeCallbacks","afterSetValue","afterSetValueCallbacks","onBlur","onBlurCallbacks","cloneValue","getTags","tags","options","opts","normalizeValue","build","v","createFieldBuilderRegistry","factories","fieldTypes","Map","factory","set","proxy","Proxy","get","_target","prop","create"],"sources":["FieldBuilder.ts"],"sourcesContent":["import type { z } from \"zod\";\nimport type {\n IFieldConfig,\n IValueOption,\n IFormModel,\n IFieldBuilder,\n IFieldBuilderRegistry,\n IFieldTypeFactory,\n IRule,\n BeforeChangeCallback,\n AfterChangeCallback,\n AfterSetValueCallback,\n ComputedFieldCallback,\n OnBlurCallback,\n CloneValueCallback\n} from \"./abstractions.js\";\n\n/**\n * Base FieldBuilder with fluent API.\n * Each method mutates `this` and returns `this` for chaining.\n */\nexport class FieldBuilder<TType extends string = string> implements IFieldBuilder {\n protected _config: IFieldConfig;\n\n constructor(type: TType) {\n this._config = {\n name: \"\",\n type,\n hidden: false,\n required: false,\n disabled: false\n };\n }\n\n get fieldType(): string {\n return this._config.type;\n }\n\n label(text: string): this {\n this._config.label = text;\n return this;\n }\n\n help(text: string): this {\n this._config.help = text;\n return this;\n }\n\n description(text: string): this {\n this._config.description = text;\n return this;\n }\n\n note(text: string): this {\n this._config.note = text;\n return this;\n }\n\n placeholder(text: string): this {\n this._config.placeholder = text;\n return this;\n }\n\n schema(zodSchema: z.ZodTypeAny): this {\n this._config.schema = zodSchema;\n return this;\n }\n\n defaultValue(value: unknown): this {\n this._config.defaultValue = value;\n return this;\n }\n\n renderer(name: string, settings?: Record<string, unknown>): this {\n this._config.renderer = name;\n this._config.rendererSettings = settings;\n return this;\n }\n\n list(): this {\n this._config.isList = true;\n return this;\n }\n\n hidden(): this {\n this._config.hidden = true;\n return this;\n }\n\n required(message?: string): this {\n this._config.required = true;\n this._config.requiredMessage = message;\n return this;\n }\n\n requiredWhen(fn: (form: IFormModel) => boolean, message?: string): this {\n if (!this._config.requiredWhenCallbacks) {\n this._config.requiredWhenCallbacks = [];\n }\n this._config.requiredWhenCallbacks.push({ fn, message });\n return this;\n }\n\n computed(fn: ComputedFieldCallback): this {\n this._config.computed = fn;\n this._config.computedUntilDirty = undefined;\n return this;\n }\n\n computedUntilDirty(fn: ComputedFieldCallback): this {\n this._config.computedUntilDirty = fn;\n this._config.computed = undefined;\n return this;\n }\n\n disabled(value = true): this {\n this._config.disabled = value;\n return this;\n }\n\n rules(rules: IRule[]): this {\n if (!this._config.rules) {\n this._config.rules = [];\n }\n this._config.rules.push(...rules);\n return this;\n }\n\n beforeChange(fn: BeforeChangeCallback): this {\n if (!this._config.beforeChangeCallbacks) {\n this._config.beforeChangeCallbacks = [];\n }\n this._config.beforeChangeCallbacks.push(fn);\n return this;\n }\n\n afterChange(fn: AfterChangeCallback): this {\n if (!this._config.afterChangeCallbacks) {\n this._config.afterChangeCallbacks = [];\n }\n this._config.afterChangeCallbacks.push(fn);\n return this;\n }\n\n afterSetValue(fn: AfterSetValueCallback): this {\n if (!this._config.afterSetValueCallbacks) {\n this._config.afterSetValueCallbacks = [];\n }\n this._config.afterSetValueCallbacks.push(fn);\n return this;\n }\n\n onBlur(fn: OnBlurCallback): this {\n if (!this._config.onBlurCallbacks) {\n this._config.onBlurCallbacks = [];\n }\n this._config.onBlurCallbacks.push(fn);\n return this;\n }\n\n cloneValue(fn: CloneValueCallback): this {\n this._config.cloneValue = fn;\n return this;\n }\n\n getTags(): string[] {\n return this._config.tags ?? [];\n }\n\n tags(tags: string[]): this {\n this._config.tags = tags;\n return this;\n }\n\n options(opts: IValueOption[] | ((form: IFormModel) => IValueOption[])): this {\n this._config.options = opts;\n if (this._config.renderer === \"textInput\" || this._config.renderer === \"numberInput\") {\n this._config.renderer = \"dropdown\";\n }\n return this;\n }\n\n /**\n * Normalize value before it's set. If field value is an array, this method runs on each individual value in the array.\n * Useful for converting strings to numbers, ensuring specific date format, etc.\n * @param value\n */\n normalizeValue(value: unknown): unknown {\n return value;\n }\n\n build(name: string): IFieldConfig {\n return { ...this._config, name, normalizeValue: (v: unknown) => this.normalizeValue(v) };\n }\n}\n\nexport function createFieldBuilderRegistry(factories: IFieldTypeFactory[]): IFieldBuilderRegistry {\n const fieldTypes = new Map<string, IFieldTypeFactory>();\n for (const factory of factories) {\n fieldTypes.set(factory.type, factory);\n }\n\n const proxy: IFieldBuilderRegistry = new Proxy({} as IFieldBuilderRegistry, {\n get(_target, prop: string) {\n const factory = fieldTypes.get(prop);\n if (factory) {\n return () => factory.create(proxy);\n }\n return undefined;\n }\n });\n return proxy;\n}\n"],"mappings":"AAiBA;AACA;AACA;AACA;AACA,OAAO,MAAMA,YAAY,CAAyD;EAG9EC,WAAWA,CAACC,IAAW,EAAE;IACrB,IAAI,CAACC,OAAO,GAAG;MACXC,IAAI,EAAE,EAAE;MACRF,IAAI;MACJG,MAAM,EAAE,KAAK;MACbC,QAAQ,EAAE,KAAK;MACfC,QAAQ,EAAE;IACd,CAAC;EACL;EAEA,IAAIC,SAASA,CAAA,EAAW;IACpB,OAAO,IAAI,CAACL,OAAO,CAACD,IAAI;EAC5B;EAEAO,KAAKA,CAACC,IAAY,EAAQ;IACtB,IAAI,CAACP,OAAO,CAACM,KAAK,GAAGC,IAAI;IACzB,OAAO,IAAI;EACf;EAEAC,IAAIA,CAACD,IAAY,EAAQ;IACrB,IAAI,CAACP,OAAO,CAACQ,IAAI,GAAGD,IAAI;IACxB,OAAO,IAAI;EACf;EAEAE,WAAWA,CAACF,IAAY,EAAQ;IAC5B,IAAI,CAACP,OAAO,CAACS,WAAW,GAAGF,IAAI;IAC/B,OAAO,IAAI;EACf;EAEAG,IAAIA,CAACH,IAAY,EAAQ;IACrB,IAAI,CAACP,OAAO,CAACU,IAAI,GAAGH,IAAI;IACxB,OAAO,IAAI;EACf;EAEAI,WAAWA,CAACJ,IAAY,EAAQ;IAC5B,IAAI,CAACP,OAAO,CAACW,WAAW,GAAGJ,IAAI;IAC/B,OAAO,IAAI;EACf;EAEAK,MAAMA,CAACC,SAAuB,EAAQ;IAClC,IAAI,CAACb,OAAO,CAACY,MAAM,GAAGC,SAAS;IAC/B,OAAO,IAAI;EACf;EAEAC,YAAYA,CAACC,KAAc,EAAQ;IAC/B,IAAI,CAACf,OAAO,CAACc,YAAY,GAAGC,KAAK;IACjC,OAAO,IAAI;EACf;EAEAC,QAAQA,CAACf,IAAY,EAAEgB,QAAkC,EAAQ;IAC7D,IAAI,CAACjB,OAAO,CAACgB,QAAQ,GAAGf,IAAI;IAC5B,IAAI,CAACD,OAAO,CAACkB,gBAAgB,GAAGD,QAAQ;IACxC,OAAO,IAAI;EACf;EAEAE,IAAIA,CAAA,EAAS;IACT,IAAI,CAACnB,OAAO,CAACoB,MAAM,GAAG,IAAI;IAC1B,OAAO,IAAI;EACf;EAEAlB,MAAMA,CAAA,EAAS;IACX,IAAI,CAACF,OAAO,CAACE,MAAM,GAAG,IAAI;IAC1B,OAAO,IAAI;EACf;EAEAC,QAAQA,CAACkB,OAAgB,EAAQ;IAC7B,IAAI,CAACrB,OAAO,CAACG,QAAQ,GAAG,IAAI;IAC5B,IAAI,CAACH,OAAO,CAACsB,eAAe,GAAGD,OAAO;IACtC,OAAO,IAAI;EACf;EAEAE,YAAYA,CAACC,EAAiC,EAAEH,OAAgB,EAAQ;IACpE,IAAI,CAAC,IAAI,CAACrB,OAAO,CAACyB,qBAAqB,EAAE;MACrC,IAAI,CAACzB,OAAO,CAACyB,qBAAqB,GAAG,EAAE;IAC3C;IACA,IAAI,CAACzB,OAAO,CAACyB,qBAAqB,CAACC,IAAI,CAAC;MAAEF,EAAE;MAAEH;IAAQ,CAAC,CAAC;IACxD,OAAO,IAAI;EACf;EAEAM,QAAQA,CAACH,EAAyB,EAAQ;IACtC,IAAI,CAACxB,OAAO,CAAC2B,QAAQ,GAAGH,EAAE;IAC1B,IAAI,CAACxB,OAAO,CAAC4B,kBAAkB,GAAGC,SAAS;IAC3C,OAAO,IAAI;EACf;EAEAD,kBAAkBA,CAACJ,EAAyB,EAAQ;IAChD,IAAI,CAACxB,OAAO,CAAC4B,kBAAkB,GAAGJ,EAAE;IACpC,IAAI,CAACxB,OAAO,CAAC2B,QAAQ,GAAGE,SAAS;IACjC,OAAO,IAAI;EACf;EAEAzB,QAAQA,CAACW,KAAK,GAAG,IAAI,EAAQ;IACzB,IAAI,CAACf,OAAO,CAACI,QAAQ,GAAGW,KAAK;IAC7B,OAAO,IAAI;EACf;EAEAe,KAAKA,CAACA,KAAc,EAAQ;IACxB,IAAI,CAAC,IAAI,CAAC9B,OAAO,CAAC8B,KAAK,EAAE;MACrB,IAAI,CAAC9B,OAAO,CAAC8B,KAAK,GAAG,EAAE;IAC3B;IACA,IAAI,CAAC9B,OAAO,CAAC8B,KAAK,CAACJ,IAAI,CAAC,GAAGI,KAAK,CAAC;IACjC,OAAO,IAAI;EACf;EAEAC,YAAYA,CAACP,EAAwB,EAAQ;IACzC,IAAI,CAAC,IAAI,CAACxB,OAAO,CAACgC,qBAAqB,EAAE;MACrC,IAAI,CAAChC,OAAO,CAACgC,qBAAqB,GAAG,EAAE;IAC3C;IACA,IAAI,CAAChC,OAAO,CAACgC,qBAAqB,CAACN,IAAI,CAACF,EAAE,CAAC;IAC3C,OAAO,IAAI;EACf;EAEAS,WAAWA,CAACT,EAAuB,EAAQ;IACvC,IAAI,CAAC,IAAI,CAACxB,OAAO,CAACkC,oBAAoB,EAAE;MACpC,IAAI,CAAClC,OAAO,CAACkC,oBAAoB,GAAG,EAAE;IAC1C;IACA,IAAI,CAAClC,OAAO,CAACkC,oBAAoB,CAACR,IAAI,CAACF,EAAE,CAAC;IAC1C,OAAO,IAAI;EACf;EAEAW,aAAaA,CAACX,EAAyB,EAAQ;IAC3C,IAAI,CAAC,IAAI,CAACxB,OAAO,CAACoC,sBAAsB,EAAE;MACtC,IAAI,CAACpC,OAAO,CAACoC,sBAAsB,GAAG,EAAE;IAC5C;IACA,IAAI,CAACpC,OAAO,CAACoC,sBAAsB,CAACV,IAAI,CAACF,EAAE,CAAC;IAC5C,OAAO,IAAI;EACf;EAEAa,MAAMA,CAACb,EAAkB,EAAQ;IAC7B,IAAI,CAAC,IAAI,CAACxB,OAAO,CAACsC,eAAe,EAAE;MAC/B,IAAI,CAACtC,OAAO,CAACsC,eAAe,GAAG,EAAE;IACrC;IACA,IAAI,CAACtC,OAAO,CAACsC,eAAe,CAACZ,IAAI,CAACF,EAAE,CAAC;IACrC,OAAO,IAAI;EACf;EAEAe,UAAUA,CAACf,EAAsB,EAAQ;IACrC,IAAI,CAACxB,OAAO,CAACuC,UAAU,GAAGf,EAAE;IAC5B,OAAO,IAAI;EACf;EAEAgB,OAAOA,CAAA,EAAa;IAChB,OAAO,IAAI,CAACxC,OAAO,CAACyC,IAAI,IAAI,EAAE;EAClC;EAEAA,IAAIA,CAACA,IAAc,EAAQ;IACvB,IAAI,CAACzC,OAAO,CAACyC,IAAI,GAAGA,IAAI;IACxB,OAAO,IAAI;EACf;EAEAC,OAAOA,CAACC,IAA6D,EAAQ;IACzE,IAAI,CAAC3C,OAAO,CAAC0C,OAAO,GAAGC,IAAI;IAC3B,IAAI,IAAI,CAAC3C,OAAO,CAACgB,QAAQ,KAAK,WAAW,IAAI,IAAI,CAAChB,OAAO,CAACgB,QAAQ,KAAK,aAAa,EAAE;MAClF,IAAI,CAAChB,OAAO,CAACgB,QAAQ,GAAG,UAAU;IACtC;IACA,OAAO,IAAI;EACf;;EAEA;AACJ;AACA;AACA;AACA;EACI4B,cAAcA,CAAC7B,KAAc,EAAW;IACpC,OAAOA,KAAK;EAChB;EAEA8B,KAAKA,CAAC5C,IAAY,EAAgB;IAC9B,OAAO;MAAE,GAAG,IAAI,CAACD,OAAO;MAAEC,IAAI;MAAE2C,cAAc,EAAGE,CAAU,IAAK,IAAI,CAACF,cAAc,CAACE,CAAC;IAAE,CAAC;EAC5F;AACJ;AAEA,OAAO,SAASC,0BAA0BA,CAACC,SAA8B,EAAyB;EAC9F,MAAMC,UAAU,GAAG,IAAIC,GAAG,CAA4B,CAAC;EACvD,KAAK,MAAMC,OAAO,IAAIH,SAAS,EAAE;IAC7BC,UAAU,CAACG,GAAG,CAACD,OAAO,CAACpD,IAAI,EAAEoD,OAAO,CAAC;EACzC;EAEA,MAAME,KAA4B,GAAG,IAAIC,KAAK,CAAC,CAAC,CAAC,EAA2B;IACxEC,GAAGA,CAACC,OAAO,EAAEC,IAAY,EAAE;MACvB,MAAMN,OAAO,GAAGF,UAAU,CAACM,GAAG,CAACE,IAAI,CAAC;MACpC,IAAIN,OAAO,EAAE;QACT,OAAO,MAAMA,OAAO,CAACO,MAAM,CAACL,KAAK,CAAC;MACtC;MACA,OAAOxB,SAAS;IACpB;EACJ,CAAC,CAAC;EACF,OAAOwB,KAAK;AAChB","ignoreList":[]}
@@ -1,6 +1,17 @@
1
1
  import { describe, it, expect } from "vitest";
2
2
  import { z } from "zod";
3
- import { TextFieldBuilder, SelectFieldBuilder, createFieldBuilderRegistry } from "./FieldBuilder.js";
3
+ import { Container } from "@webiny/di";
4
+ import { FormModelFeature } from "./feature.js";
5
+ import { FieldBuilderRegistry } from "./abstractions.js";
6
+ import { TextFieldBuilder } from "./fieldTypes/TextFieldType.js";
7
+ import { NumberFieldBuilder } from "./fieldTypes/NumberFieldType.js";
8
+ import { BooleanFieldBuilder } from "./fieldTypes/BooleanFieldType.js";
9
+ import { DateTimeFieldBuilder } from "./fieldTypes/DateTimeFieldType.js";
10
+ function createRegistry() {
11
+ const container = new Container();
12
+ FormModelFeature.register(container);
13
+ return container.resolve(FieldBuilderRegistry);
14
+ }
4
15
  describe("TextFieldBuilder", () => {
5
16
  it("should build a text field config with all fluent methods", () => {
6
17
  const builder = new TextFieldBuilder().label("Title").placeholder("Enter title").required("Title is required").defaultValue("Untitled").renderer("custom-text").schema(z.string().min(1));
@@ -58,8 +69,8 @@ describe("TextFieldBuilder - beforeChange / afterChange", () => {
58
69
  expect(config.afterChangeCallbacks).toHaveLength(1);
59
70
  });
60
71
  });
61
- describe("SelectFieldBuilder", () => {
62
- it("should build a select field config with static options", () => {
72
+ describe("TextFieldBuilder - options", () => {
73
+ it("should build a text field config with static options", () => {
63
74
  const options = [{
64
75
  label: "English",
65
76
  value: "en"
@@ -67,40 +78,143 @@ describe("SelectFieldBuilder", () => {
67
78
  label: "German",
68
79
  value: "de"
69
80
  }];
70
- const builder = new SelectFieldBuilder().label("Language").options(options).required();
71
- const config = builder.build("language");
81
+ const config = new TextFieldBuilder().label("Language").options(options).required().build("language");
72
82
  expect(config.name).toBe("language");
73
- expect(config.type).toBe("select");
83
+ expect(config.type).toBe("text");
74
84
  expect(config.label).toBe("Language");
75
85
  expect(config.required).toBe(true);
76
86
  expect(config.options).toEqual(options);
87
+ expect(config.renderer).toBe("dropdown");
77
88
  });
78
89
  it("should support reactive options function", () => {
79
90
  const optionsFn = () => [{
80
91
  label: "A",
81
92
  value: "a"
82
93
  }];
83
- const config = new SelectFieldBuilder().options(optionsFn).build("dynamic");
94
+ const config = new TextFieldBuilder().options(optionsFn).build("dynamic");
84
95
  expect(typeof config.options).toBe("function");
85
96
  });
97
+ it("should auto-switch renderer to dropdown when options are set", () => {
98
+ const config = new TextFieldBuilder().options([{
99
+ label: "A",
100
+ value: "a"
101
+ }]).build("field");
102
+ expect(config.renderer).toBe("dropdown");
103
+ });
104
+ it("should not override an explicitly set renderer", () => {
105
+ const config = new TextFieldBuilder().renderer("radioButtons").options([{
106
+ label: "A",
107
+ value: "a"
108
+ }]).build("field");
109
+ expect(config.renderer).toBe("radioButtons");
110
+ });
111
+ });
112
+ describe("NumberFieldBuilder - options", () => {
113
+ it("should build a number field config with options", () => {
114
+ const options = [{
115
+ label: "One",
116
+ value: "1"
117
+ }, {
118
+ label: "Two",
119
+ value: "2"
120
+ }];
121
+ const config = new NumberFieldBuilder().label("Count").options(options).build("count");
122
+ expect(config.type).toBe("number");
123
+ expect(config.options).toEqual(options);
124
+ expect(config.renderer).toBe("dropdown");
125
+ });
126
+ it("should not override an explicitly set renderer", () => {
127
+ const config = new NumberFieldBuilder().renderer("radioButtons").options([{
128
+ label: "1",
129
+ value: "1"
130
+ }]).build("field");
131
+ expect(config.renderer).toBe("radioButtons");
132
+ });
133
+ });
134
+ describe("DateTimeFieldBuilder", () => {
135
+ it("should build a datetime field with default renderer", () => {
136
+ const config = new DateTimeFieldBuilder().label("Created").build("created");
137
+ expect(config.type).toBe("datetime");
138
+ expect(config.renderer).toBe("dateTimeInput");
139
+ expect(config.label).toBe("Created");
140
+ });
86
141
  });
87
142
  describe("FieldBuilderRegistry", () => {
88
143
  it("should create text builders via registry.text()", () => {
89
- const registry = createFieldBuilderRegistry();
144
+ const registry = createRegistry();
90
145
  const builder = registry.text();
91
146
  expect(builder).toBeInstanceOf(TextFieldBuilder);
92
147
  });
93
- it("should create select builders via registry.select()", () => {
94
- const registry = createFieldBuilderRegistry();
95
- const builder = registry.select();
96
- expect(builder).toBeInstanceOf(SelectFieldBuilder);
148
+ it("should create number builders via registry.number()", () => {
149
+ const registry = createRegistry();
150
+ const builder = registry.number();
151
+ expect(builder).toBeInstanceOf(NumberFieldBuilder);
152
+ });
153
+ it("should create boolean builders via registry.boolean()", () => {
154
+ const registry = createRegistry();
155
+ const builder = registry.boolean();
156
+ expect(builder).toBeInstanceOf(BooleanFieldBuilder);
157
+ });
158
+ it("should create datetime builders via registry.datetime()", () => {
159
+ const registry = createRegistry();
160
+ const builder = registry.datetime();
161
+ expect(builder).toBeInstanceOf(DateTimeFieldBuilder);
97
162
  });
98
163
  it("should support chaining on registry-created builders", () => {
99
- const registry = createFieldBuilderRegistry();
164
+ const registry = createRegistry();
100
165
  const config = registry.text().label("Name").required().build("name");
101
166
  expect(config.label).toBe("Name");
102
167
  expect(config.required).toBe(true);
103
168
  });
169
+ it("should support options on text builders from registry", () => {
170
+ const registry = createRegistry();
171
+ const config = registry.text().options([{
172
+ label: "A",
173
+ value: "a"
174
+ }]).build("field");
175
+ expect(config.options).toHaveLength(1);
176
+ expect(config.renderer).toBe("dropdown");
177
+ });
178
+ });
179
+ describe("normalizeValue", () => {
180
+ it("should be identity for TextFieldBuilder", () => {
181
+ const builder = new TextFieldBuilder();
182
+ expect(builder.normalizeValue("hello")).toBe("hello");
183
+ expect(builder.normalizeValue(42)).toBe(42);
184
+ expect(builder.normalizeValue(null)).toBe(null);
185
+ });
186
+ it("should coerce string to number for NumberFieldBuilder", () => {
187
+ const builder = new NumberFieldBuilder();
188
+ expect(builder.normalizeValue("42")).toBe(42);
189
+ expect(builder.normalizeValue("3.14")).toBe(3.14);
190
+ expect(builder.normalizeValue("0")).toBe(0);
191
+ });
192
+ it("should return null for non-numeric values in NumberFieldBuilder", () => {
193
+ const builder = new NumberFieldBuilder();
194
+ expect(builder.normalizeValue(null)).toBe(null);
195
+ expect(builder.normalizeValue(undefined)).toBe(null);
196
+ expect(builder.normalizeValue("")).toBe(null);
197
+ expect(builder.normalizeValue("abc")).toBe(null);
198
+ });
199
+ it("should coerce to boolean for BooleanFieldBuilder", () => {
200
+ const builder = new BooleanFieldBuilder();
201
+ expect(builder.normalizeValue(1)).toBe(true);
202
+ expect(builder.normalizeValue(0)).toBe(false);
203
+ expect(builder.normalizeValue("")).toBe(false);
204
+ expect(builder.normalizeValue("yes")).toBe(true);
205
+ expect(builder.normalizeValue(null)).toBe(false);
206
+ });
207
+ it("should be identity for DateTimeFieldBuilder", () => {
208
+ const builder = new DateTimeFieldBuilder();
209
+ expect(builder.normalizeValue("2024-01-01")).toBe("2024-01-01");
210
+ expect(builder.normalizeValue(null)).toBe(null);
211
+ });
212
+ it("should capture normalizeValue into config at build time", () => {
213
+ const config = new NumberFieldBuilder().label("Count").build("count");
214
+ expect(config.normalizeValue).toBeDefined();
215
+ expect(config.normalizeValue("42")).toBe(42);
216
+ expect(config.normalizeValue(null)).toBe(null);
217
+ });
104
218
  });
105
219
 
106
220
  //# sourceMappingURL=FieldBuilder.test.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["describe","it","expect","z","TextFieldBuilder","SelectFieldBuilder","createFieldBuilderRegistry","builder","label","placeholder","required","defaultValue","renderer","schema","string","min","config","build","name","toBe","type","requiredMessage","hidden","disabled","toBeDefined","cb1","value","cb2","beforeChange","beforeChangeCallbacks","toHaveLength","cb","afterChange","afterChangeCallbacks","toBeUndefined","options","toEqual","optionsFn","registry","text","toBeInstanceOf","select"],"sources":["FieldBuilder.test.ts"],"sourcesContent":["import { describe, it, expect } from \"vitest\";\nimport { z } from \"zod\";\nimport {\n TextFieldBuilder,\n SelectFieldBuilder,\n createFieldBuilderRegistry\n} from \"./FieldBuilder.js\";\n\ndescribe(\"TextFieldBuilder\", () => {\n it(\"should build a text field config with all fluent methods\", () => {\n const builder = new TextFieldBuilder()\n .label(\"Title\")\n .placeholder(\"Enter title\")\n .required(\"Title is required\")\n .defaultValue(\"Untitled\")\n .renderer(\"custom-text\")\n .schema(z.string().min(1));\n\n const config = builder.build(\"title\");\n\n expect(config.name).toBe(\"title\");\n expect(config.type).toBe(\"text\");\n expect(config.label).toBe(\"Title\");\n expect(config.placeholder).toBe(\"Enter title\");\n expect(config.required).toBe(true);\n expect(config.requiredMessage).toBe(\"Title is required\");\n expect(config.defaultValue).toBe(\"Untitled\");\n expect(config.renderer).toBe(\"custom-text\");\n expect(config.hidden).toBe(false);\n expect(config.disabled).toBe(false);\n expect(config.schema).toBeDefined();\n });\n\n it(\"should support hidden() method\", () => {\n const config = new TextFieldBuilder().hidden().build(\"secret\");\n expect(config.hidden).toBe(true);\n });\n\n it(\"should support disabled() method\", () => {\n const config = new TextFieldBuilder().disabled().build(\"readonly\");\n expect(config.disabled).toBe(true);\n });\n\n it(\"should default disabled to false\", () => {\n const config = new TextFieldBuilder().build(\"field\");\n expect(config.disabled).toBe(false);\n });\n});\n\ndescribe(\"TextFieldBuilder - beforeChange / afterChange\", () => {\n it(\"should store beforeChange callbacks in config\", () => {\n const cb1 = (value: unknown) => value;\n const cb2 = (value: unknown) => value;\n\n const config = new TextFieldBuilder().beforeChange(cb1).beforeChange(cb2).build(\"field\");\n\n expect(config.beforeChangeCallbacks).toHaveLength(2);\n expect(config.beforeChangeCallbacks![0]).toBe(cb1);\n expect(config.beforeChangeCallbacks![1]).toBe(cb2);\n });\n\n it(\"should store afterChange callbacks in config\", () => {\n const cb = () => {};\n const config = new TextFieldBuilder().afterChange(cb).build(\"field\");\n\n expect(config.afterChangeCallbacks).toHaveLength(1);\n expect(config.afterChangeCallbacks![0]).toBe(cb);\n });\n\n it(\"should not have callback arrays when none are added\", () => {\n const config = new TextFieldBuilder().build(\"field\");\n expect(config.beforeChangeCallbacks).toBeUndefined();\n expect(config.afterChangeCallbacks).toBeUndefined();\n });\n\n it(\"should support chaining callbacks with other builder methods\", () => {\n const config = new TextFieldBuilder()\n .label(\"Title\")\n .beforeChange(value => value)\n .required(\"Required\")\n .afterChange(() => {})\n .build(\"title\");\n\n expect(config.label).toBe(\"Title\");\n expect(config.required).toBe(true);\n expect(config.beforeChangeCallbacks).toHaveLength(1);\n expect(config.afterChangeCallbacks).toHaveLength(1);\n });\n});\n\ndescribe(\"SelectFieldBuilder\", () => {\n it(\"should build a select field config with static options\", () => {\n const options = [\n { label: \"English\", value: \"en\" },\n { label: \"German\", value: \"de\" }\n ];\n\n const builder = new SelectFieldBuilder().label(\"Language\").options(options).required();\n\n const config = builder.build(\"language\");\n\n expect(config.name).toBe(\"language\");\n expect(config.type).toBe(\"select\");\n expect(config.label).toBe(\"Language\");\n expect(config.required).toBe(true);\n expect(config.options).toEqual(options);\n });\n\n it(\"should support reactive options function\", () => {\n const optionsFn = () => [{ label: \"A\", value: \"a\" }];\n const config = new SelectFieldBuilder().options(optionsFn).build(\"dynamic\");\n expect(typeof config.options).toBe(\"function\");\n });\n});\n\ndescribe(\"FieldBuilderRegistry\", () => {\n it(\"should create text builders via registry.text()\", () => {\n const registry = createFieldBuilderRegistry();\n const builder = registry.text();\n expect(builder).toBeInstanceOf(TextFieldBuilder);\n });\n\n it(\"should create select builders via registry.select()\", () => {\n const registry = createFieldBuilderRegistry();\n const builder = registry.select();\n expect(builder).toBeInstanceOf(SelectFieldBuilder);\n });\n\n it(\"should support chaining on registry-created builders\", () => {\n const registry = createFieldBuilderRegistry();\n const config = registry.text().label(\"Name\").required().build(\"name\");\n expect(config.label).toBe(\"Name\");\n expect(config.required).toBe(true);\n });\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["describe","it","expect","z","Container","FormModelFeature","FieldBuilderRegistry","TextFieldBuilder","NumberFieldBuilder","BooleanFieldBuilder","DateTimeFieldBuilder","createRegistry","container","register","resolve","builder","label","placeholder","required","defaultValue","renderer","schema","string","min","config","build","name","toBe","type","requiredMessage","hidden","disabled","toBeDefined","cb1","value","cb2","beforeChange","beforeChangeCallbacks","toHaveLength","cb","afterChange","afterChangeCallbacks","toBeUndefined","options","toEqual","optionsFn","registry","text","toBeInstanceOf","number","boolean","datetime","normalizeValue","undefined"],"sources":["FieldBuilder.test.ts"],"sourcesContent":["import { describe, it, expect } from \"vitest\";\nimport { z } from \"zod\";\nimport { Container } from \"@webiny/di\";\nimport { FormModelFeature } from \"./feature.js\";\nimport { FieldBuilderRegistry, type IFieldBuilderRegistry } from \"./abstractions.js\";\nimport { TextFieldBuilder } from \"./fieldTypes/TextFieldType.js\";\nimport { NumberFieldBuilder } from \"./fieldTypes/NumberFieldType.js\";\nimport { BooleanFieldBuilder } from \"./fieldTypes/BooleanFieldType.js\";\nimport { DateTimeFieldBuilder } from \"./fieldTypes/DateTimeFieldType.js\";\n\nfunction createRegistry(): IFieldBuilderRegistry {\n const container = new Container();\n FormModelFeature.register(container);\n return container.resolve(FieldBuilderRegistry);\n}\n\ndescribe(\"TextFieldBuilder\", () => {\n it(\"should build a text field config with all fluent methods\", () => {\n const builder = new TextFieldBuilder()\n .label(\"Title\")\n .placeholder(\"Enter title\")\n .required(\"Title is required\")\n .defaultValue(\"Untitled\")\n .renderer(\"custom-text\")\n .schema(z.string().min(1));\n\n const config = builder.build(\"title\");\n\n expect(config.name).toBe(\"title\");\n expect(config.type).toBe(\"text\");\n expect(config.label).toBe(\"Title\");\n expect(config.placeholder).toBe(\"Enter title\");\n expect(config.required).toBe(true);\n expect(config.requiredMessage).toBe(\"Title is required\");\n expect(config.defaultValue).toBe(\"Untitled\");\n expect(config.renderer).toBe(\"custom-text\");\n expect(config.hidden).toBe(false);\n expect(config.disabled).toBe(false);\n expect(config.schema).toBeDefined();\n });\n\n it(\"should support hidden() method\", () => {\n const config = new TextFieldBuilder().hidden().build(\"secret\");\n expect(config.hidden).toBe(true);\n });\n\n it(\"should support disabled() method\", () => {\n const config = new TextFieldBuilder().disabled().build(\"readonly\");\n expect(config.disabled).toBe(true);\n });\n\n it(\"should default disabled to false\", () => {\n const config = new TextFieldBuilder().build(\"field\");\n expect(config.disabled).toBe(false);\n });\n});\n\ndescribe(\"TextFieldBuilder - beforeChange / afterChange\", () => {\n it(\"should store beforeChange callbacks in config\", () => {\n const cb1 = (value: unknown) => value;\n const cb2 = (value: unknown) => value;\n\n const config = new TextFieldBuilder().beforeChange(cb1).beforeChange(cb2).build(\"field\");\n\n expect(config.beforeChangeCallbacks).toHaveLength(2);\n expect(config.beforeChangeCallbacks![0]).toBe(cb1);\n expect(config.beforeChangeCallbacks![1]).toBe(cb2);\n });\n\n it(\"should store afterChange callbacks in config\", () => {\n const cb = () => {};\n const config = new TextFieldBuilder().afterChange(cb).build(\"field\");\n\n expect(config.afterChangeCallbacks).toHaveLength(1);\n expect(config.afterChangeCallbacks![0]).toBe(cb);\n });\n\n it(\"should not have callback arrays when none are added\", () => {\n const config = new TextFieldBuilder().build(\"field\");\n expect(config.beforeChangeCallbacks).toBeUndefined();\n expect(config.afterChangeCallbacks).toBeUndefined();\n });\n\n it(\"should support chaining callbacks with other builder methods\", () => {\n const config = new TextFieldBuilder()\n .label(\"Title\")\n .beforeChange(value => value)\n .required(\"Required\")\n .afterChange(() => {})\n .build(\"title\");\n\n expect(config.label).toBe(\"Title\");\n expect(config.required).toBe(true);\n expect(config.beforeChangeCallbacks).toHaveLength(1);\n expect(config.afterChangeCallbacks).toHaveLength(1);\n });\n});\n\ndescribe(\"TextFieldBuilder - options\", () => {\n it(\"should build a text field config with static options\", () => {\n const options = [\n { label: \"English\", value: \"en\" },\n { label: \"German\", value: \"de\" }\n ];\n\n const config = new TextFieldBuilder()\n .label(\"Language\")\n .options(options)\n .required()\n .build(\"language\");\n\n expect(config.name).toBe(\"language\");\n expect(config.type).toBe(\"text\");\n expect(config.label).toBe(\"Language\");\n expect(config.required).toBe(true);\n expect(config.options).toEqual(options);\n expect(config.renderer).toBe(\"dropdown\");\n });\n\n it(\"should support reactive options function\", () => {\n const optionsFn = () => [{ label: \"A\", value: \"a\" }];\n const config = new TextFieldBuilder().options(optionsFn).build(\"dynamic\");\n expect(typeof config.options).toBe(\"function\");\n });\n\n it(\"should auto-switch renderer to dropdown when options are set\", () => {\n const config = new TextFieldBuilder().options([{ label: \"A\", value: \"a\" }]).build(\"field\");\n expect(config.renderer).toBe(\"dropdown\");\n });\n\n it(\"should not override an explicitly set renderer\", () => {\n const config = new TextFieldBuilder()\n .renderer(\"radioButtons\")\n .options([{ label: \"A\", value: \"a\" }])\n .build(\"field\");\n expect(config.renderer).toBe(\"radioButtons\");\n });\n});\n\ndescribe(\"NumberFieldBuilder - options\", () => {\n it(\"should build a number field config with options\", () => {\n const options = [\n { label: \"One\", value: \"1\" },\n { label: \"Two\", value: \"2\" }\n ];\n\n const config = new NumberFieldBuilder().label(\"Count\").options(options).build(\"count\");\n\n expect(config.type).toBe(\"number\");\n expect(config.options).toEqual(options);\n expect(config.renderer).toBe(\"dropdown\");\n });\n\n it(\"should not override an explicitly set renderer\", () => {\n const config = new NumberFieldBuilder()\n .renderer(\"radioButtons\")\n .options([{ label: \"1\", value: \"1\" }])\n .build(\"field\");\n expect(config.renderer).toBe(\"radioButtons\");\n });\n});\n\ndescribe(\"DateTimeFieldBuilder\", () => {\n it(\"should build a datetime field with default renderer\", () => {\n const config = new DateTimeFieldBuilder().label(\"Created\").build(\"created\");\n expect(config.type).toBe(\"datetime\");\n expect(config.renderer).toBe(\"dateTimeInput\");\n expect(config.label).toBe(\"Created\");\n });\n});\n\ndescribe(\"FieldBuilderRegistry\", () => {\n it(\"should create text builders via registry.text()\", () => {\n const registry = createRegistry();\n const builder = registry.text();\n expect(builder).toBeInstanceOf(TextFieldBuilder);\n });\n\n it(\"should create number builders via registry.number()\", () => {\n const registry = createRegistry();\n const builder = registry.number();\n expect(builder).toBeInstanceOf(NumberFieldBuilder);\n });\n\n it(\"should create boolean builders via registry.boolean()\", () => {\n const registry = createRegistry();\n const builder = registry.boolean();\n expect(builder).toBeInstanceOf(BooleanFieldBuilder);\n });\n\n it(\"should create datetime builders via registry.datetime()\", () => {\n const registry = createRegistry();\n const builder = registry.datetime();\n expect(builder).toBeInstanceOf(DateTimeFieldBuilder);\n });\n\n it(\"should support chaining on registry-created builders\", () => {\n const registry = createRegistry();\n const config = registry.text().label(\"Name\").required().build(\"name\");\n expect(config.label).toBe(\"Name\");\n expect(config.required).toBe(true);\n });\n\n it(\"should support options on text builders from registry\", () => {\n const registry = createRegistry();\n const config = registry\n .text()\n .options([{ label: \"A\", value: \"a\" }])\n .build(\"field\");\n expect(config.options).toHaveLength(1);\n expect(config.renderer).toBe(\"dropdown\");\n });\n});\n\ndescribe(\"normalizeValue\", () => {\n it(\"should be identity for TextFieldBuilder\", () => {\n const builder = new TextFieldBuilder();\n expect(builder.normalizeValue(\"hello\")).toBe(\"hello\");\n expect(builder.normalizeValue(42)).toBe(42);\n expect(builder.normalizeValue(null)).toBe(null);\n });\n\n it(\"should coerce string to number for NumberFieldBuilder\", () => {\n const builder = new NumberFieldBuilder();\n expect(builder.normalizeValue(\"42\")).toBe(42);\n expect(builder.normalizeValue(\"3.14\")).toBe(3.14);\n expect(builder.normalizeValue(\"0\")).toBe(0);\n });\n\n it(\"should return null for non-numeric values in NumberFieldBuilder\", () => {\n const builder = new NumberFieldBuilder();\n expect(builder.normalizeValue(null)).toBe(null);\n expect(builder.normalizeValue(undefined)).toBe(null);\n expect(builder.normalizeValue(\"\")).toBe(null);\n expect(builder.normalizeValue(\"abc\")).toBe(null);\n });\n\n it(\"should coerce to boolean for BooleanFieldBuilder\", () => {\n const builder = new BooleanFieldBuilder();\n expect(builder.normalizeValue(1)).toBe(true);\n expect(builder.normalizeValue(0)).toBe(false);\n expect(builder.normalizeValue(\"\")).toBe(false);\n expect(builder.normalizeValue(\"yes\")).toBe(true);\n expect(builder.normalizeValue(null)).toBe(false);\n });\n\n it(\"should be identity for DateTimeFieldBuilder\", () => {\n const builder = new DateTimeFieldBuilder();\n expect(builder.normalizeValue(\"2024-01-01\")).toBe(\"2024-01-01\");\n expect(builder.normalizeValue(null)).toBe(null);\n });\n\n it(\"should capture normalizeValue into config at build time\", () => {\n const config = new NumberFieldBuilder().label(\"Count\").build(\"count\");\n expect(config.normalizeValue).toBeDefined();\n expect(config.normalizeValue!(\"42\")).toBe(42);\n expect(config.normalizeValue!(null)).toBe(null);\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ import { type IFieldBuilderRegistry } from "./abstractions.js";
2
+ export declare const FieldBuilderRegistry: import("@webiny/di").Constructor<IFieldBuilderRegistry> & {
3
+ __abstraction: import("@webiny/di").Abstraction<IFieldBuilderRegistry>;
4
+ };
@@ -0,0 +1,31 @@
1
+ import { FieldBuilderRegistry as Abstraction, FieldType } from "./abstractions.js";
2
+
3
+ // @ts-expect-error The interface is augmented dynamically, and TS complains about those dynamic methods.
4
+ class FieldBuilderRegistryImpl {
5
+ fieldTypes = new Map();
6
+ constructor(factories) {
7
+ for (const factory of factories) {
8
+ this.fieldTypes.set(factory.type, factory);
9
+ }
10
+ const proxy = new Proxy(this, {
11
+ get(target, prop) {
12
+ const factory = target.fieldTypes.get(prop);
13
+ if (factory) {
14
+ return () => factory.create(proxy);
15
+ }
16
+ return target[prop];
17
+ }
18
+ });
19
+ return proxy;
20
+ }
21
+ }
22
+ export const FieldBuilderRegistry = Abstraction.createImplementation({
23
+ // @ts-expect-error
24
+ implementation: FieldBuilderRegistryImpl,
25
+ // @ts-expect-error
26
+ dependencies: [[FieldType, {
27
+ multiple: true
28
+ }]]
29
+ });
30
+
31
+ //# sourceMappingURL=FieldBuilderRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["FieldBuilderRegistry","Abstraction","FieldType","FieldBuilderRegistryImpl","fieldTypes","Map","constructor","factories","factory","set","type","proxy","Proxy","get","target","prop","create","createImplementation","implementation","dependencies","multiple"],"sources":["FieldBuilderRegistry.ts"],"sourcesContent":["import {\n FieldBuilderRegistry as Abstraction,\n FieldType,\n type IFieldBuilderRegistry\n} from \"./abstractions.js\";\n\n// @ts-expect-error The interface is augmented dynamically, and TS complains about those dynamic methods.\nclass FieldBuilderRegistryImpl implements Abstraction.Interface {\n private fieldTypes = new Map<string, FieldType.Interface>();\n\n constructor(factories: FieldType.Interface[]) {\n for (const factory of factories) {\n this.fieldTypes.set(factory.type, factory);\n }\n\n const proxy = new Proxy(this, {\n get(target, prop: string) {\n const factory = target.fieldTypes.get(prop);\n if (factory) {\n return () => factory.create(proxy as unknown as IFieldBuilderRegistry);\n }\n return target[prop as keyof typeof target];\n }\n }) as any;\n\n return proxy;\n }\n}\n\nexport const FieldBuilderRegistry = Abstraction.createImplementation({\n // @ts-expect-error\n implementation: FieldBuilderRegistryImpl,\n // @ts-expect-error\n dependencies: [[FieldType, { multiple: true }]]\n});\n"],"mappings":"AAAA,SACIA,oBAAoB,IAAIC,WAAW,EACnCC,SAAS;;AAIb;AACA,MAAMC,wBAAwB,CAAkC;EACpDC,UAAU,GAAG,IAAIC,GAAG,CAA8B,CAAC;EAE3DC,WAAWA,CAACC,SAAgC,EAAE;IAC1C,KAAK,MAAMC,OAAO,IAAID,SAAS,EAAE;MAC7B,IAAI,CAACH,UAAU,CAACK,GAAG,CAACD,OAAO,CAACE,IAAI,EAAEF,OAAO,CAAC;IAC9C;IAEA,MAAMG,KAAK,GAAG,IAAIC,KAAK,CAAC,IAAI,EAAE;MAC1BC,GAAGA,CAACC,MAAM,EAAEC,IAAY,EAAE;QACtB,MAAMP,OAAO,GAAGM,MAAM,CAACV,UAAU,CAACS,GAAG,CAACE,IAAI,CAAC;QAC3C,IAAIP,OAAO,EAAE;UACT,OAAO,MAAMA,OAAO,CAACQ,MAAM,CAACL,KAAyC,CAAC;QAC1E;QACA,OAAOG,MAAM,CAACC,IAAI,CAAwB;MAC9C;IACJ,CAAC,CAAQ;IAET,OAAOJ,KAAK;EAChB;AACJ;AAEA,OAAO,MAAMX,oBAAoB,GAAGC,WAAW,CAACgB,oBAAoB,CAAC;EACjE;EACAC,cAAc,EAAEf,wBAAwB;EACxC;EACAgB,YAAY,EAAE,CAAC,CAACjB,SAAS,EAAE;IAAEkB,QAAQ,EAAE;EAAK,CAAC,CAAC;AAClD,CAAC,CAAC","ignoreList":[]}