@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.
- package/base/Base/DefaultFieldRenderers.js +69 -5
- package/base/Base/DefaultFieldRenderers.js.map +1 -1
- package/base/Base/DefaultLayoutRenderers.js +5 -1
- package/base/Base/DefaultLayoutRenderers.js.map +1 -1
- package/base/Base/FieldRenderers/CheckboxesRenderer.d.ts +13 -0
- package/base/Base/FieldRenderers/CheckboxesRenderer.js +28 -0
- package/base/Base/FieldRenderers/CheckboxesRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/CodeEditorRenderer.d.ts +15 -0
- package/base/Base/FieldRenderers/CodeEditorRenderer.js +17 -0
- package/base/Base/FieldRenderers/CodeEditorRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/DateTimeInputsRenderer.d.ts +17 -0
- package/base/Base/FieldRenderers/DateTimeInputsRenderer.js +66 -0
- package/base/Base/FieldRenderers/DateTimeInputsRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/DateTimeRenderer.d.ts +21 -0
- package/base/Base/FieldRenderers/DateTimeRenderer.js +46 -0
- package/base/Base/FieldRenderers/DateTimeRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/FilePickerRenderer.d.ts +12 -0
- package/base/Base/FieldRenderers/FilePickerRenderer.js +47 -0
- package/base/Base/FieldRenderers/FilePickerRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/FileUrlPickerRenderer.d.ts +12 -0
- package/base/Base/FieldRenderers/FileUrlPickerRenderer.js +25 -0
- package/base/Base/FieldRenderers/FileUrlPickerRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/HiddenRenderer.d.ts +12 -0
- package/base/Base/FieldRenderers/HiddenRenderer.js +5 -0
- package/base/Base/FieldRenderers/HiddenRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/HorizontalTabsRenderer.d.ts +5 -0
- package/base/Base/FieldRenderers/HorizontalTabsRenderer.js +27 -0
- package/base/Base/FieldRenderers/HorizontalTabsRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/InputRenderer.d.ts +4 -7
- package/base/Base/FieldRenderers/InputRenderer.js +2 -2
- package/base/Base/FieldRenderers/InputRenderer.js.map +1 -1
- package/base/Base/FieldRenderers/NumberInputRenderer.d.ts +12 -0
- package/base/Base/FieldRenderers/NumberInputRenderer.js +23 -0
- package/base/Base/FieldRenderers/NumberInputRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/NumberInputsRenderer.d.ts +14 -0
- package/base/Base/FieldRenderers/NumberInputsRenderer.js +49 -0
- package/base/Base/FieldRenderers/NumberInputsRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/DynamicZoneRenderer.d.ts +14 -0
- package/base/Base/FieldRenderers/ObjectRenderer/DynamicZoneRenderer.js +20 -0
- package/base/Base/FieldRenderers/ObjectRenderer/DynamicZoneRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/KeyValueTagsRenderer.d.ts +14 -0
- package/base/Base/FieldRenderers/ObjectRenderer/KeyValueTagsRenderer.js +65 -0
- package/base/Base/FieldRenderers/ObjectRenderer/KeyValueTagsRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone.d.ts +10 -0
- package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone.js +109 -0
- package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.d.ts +17 -0
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.js +55 -0
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.d.ts +7 -3
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.js +15 -19
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.js.map +1 -1
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.d.ts +5 -8
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js +7 -50
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js.map +1 -1
- package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.d.ts +10 -0
- package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js +64 -0
- package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.d.ts +10 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.js +85 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.js.map +1 -0
- package/base/Base/FieldRenderers/PassthroughRenderer.d.ts +3 -6
- package/base/Base/FieldRenderers/PassthroughRenderer.js +9 -23
- package/base/Base/FieldRenderers/PassthroughRenderer.js.map +1 -1
- package/base/Base/FieldRenderers/RadioButtonsRenderer.d.ts +13 -0
- package/base/Base/FieldRenderers/RadioButtonsRenderer.js +27 -0
- package/base/Base/FieldRenderers/RadioButtonsRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/SelectRenderer.d.ts +6 -8
- package/base/Base/FieldRenderers/SelectRenderer.js +8 -5
- package/base/Base/FieldRenderers/SelectRenderer.js.map +1 -1
- package/base/Base/FieldRenderers/SwitchRenderer.d.ts +12 -0
- package/base/Base/FieldRenderers/SwitchRenderer.js +19 -0
- package/base/Base/FieldRenderers/SwitchRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/TagsRenderer.d.ts +12 -0
- package/base/Base/FieldRenderers/TagsRenderer.js +21 -0
- package/base/Base/FieldRenderers/TagsRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/TextInputsRenderer.d.ts +14 -0
- package/base/Base/FieldRenderers/TextInputsRenderer.js +48 -0
- package/base/Base/FieldRenderers/TextInputsRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/TextareaRenderer.d.ts +3 -6
- package/base/Base/FieldRenderers/TextareaRenderer.js +3 -4
- package/base/Base/FieldRenderers/TextareaRenderer.js.map +1 -1
- package/base/Base/FieldRenderers/TextareasRenderer.d.ts +14 -0
- package/base/Base/FieldRenderers/TextareasRenderer.js +51 -0
- package/base/Base/FieldRenderers/TextareasRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/VerticalTabsRenderer.js +2 -2
- package/base/Base/FieldRenderers/VerticalTabsRenderer.js.map +1 -1
- package/base/Base/Menus.js +5 -64
- package/base/Base/Menus.js.map +1 -1
- package/base/Base/RoutesConfig.js +6 -0
- package/base/Base/RoutesConfig.js.map +1 -1
- package/exports/admin/build-params.d.ts +2 -0
- package/exports/admin/build-params.js +3 -0
- package/exports/admin/build-params.js.map +1 -1
- package/exports/admin/form.d.ts +5 -0
- package/exports/admin/form.js +8 -0
- package/exports/admin/form.js.map +1 -1
- package/exports/admin/ui.d.ts +1 -0
- package/exports/admin/ui.js +1 -0
- package/exports/admin/ui.js.map +1 -1
- package/exports/admin.d.ts +3 -1
- package/exports/admin.js +3 -1
- package/exports/admin.js.map +1 -1
- package/features/formModel/ConditionRuleEvaluator.d.ts +9 -0
- package/features/formModel/ConditionRuleEvaluator.js +56 -0
- package/features/formModel/ConditionRuleEvaluator.js.map +1 -0
- package/features/formModel/Field.d.ts +50 -4
- package/features/formModel/Field.js +254 -35
- package/features/formModel/Field.js.map +1 -1
- package/features/formModel/FieldBuilder.d.ts +17 -35
- package/features/formModel/FieldBuilder.js +63 -100
- package/features/formModel/FieldBuilder.js.map +1 -1
- package/features/formModel/FieldBuilder.test.js +127 -13
- package/features/formModel/FieldBuilder.test.js.map +1 -1
- package/features/formModel/FieldBuilderRegistry.d.ts +4 -0
- package/features/formModel/FieldBuilderRegistry.js +31 -0
- package/features/formModel/FieldBuilderRegistry.js.map +1 -0
- package/features/formModel/FocusManager.d.ts +14 -0
- package/features/formModel/FocusManager.js +109 -0
- package/features/formModel/FocusManager.js.map +1 -0
- package/features/formModel/FormModel.d.ts +27 -31
- package/features/formModel/FormModel.js +210 -403
- package/features/formModel/FormModel.js.map +1 -1
- package/features/formModel/FormModel.test.js +2044 -193
- package/features/formModel/FormModel.test.js.map +1 -1
- package/features/formModel/FormModelFactory.d.ts +4 -2
- package/features/formModel/FormModelFactory.js +13 -3
- package/features/formModel/FormModelFactory.js.map +1 -1
- package/features/formModel/FormView.d.ts +2 -0
- package/features/formModel/FormView.js +44 -37
- package/features/formModel/FormView.js.map +1 -1
- package/features/formModel/LayoutBuilderFactory.d.ts +61 -0
- package/features/formModel/LayoutBuilderFactory.js +386 -0
- package/features/formModel/LayoutBuilderFactory.js.map +1 -0
- package/features/formModel/LayoutMutator.d.ts +11 -0
- package/features/formModel/LayoutMutator.js +136 -0
- package/features/formModel/LayoutMutator.js.map +1 -0
- package/features/formModel/LayoutResolver.d.ts +26 -0
- package/features/formModel/LayoutResolver.js +239 -0
- package/features/formModel/LayoutResolver.js.map +1 -0
- package/features/formModel/ObjectField.d.ts +55 -4
- package/features/formModel/ObjectField.js +499 -82
- package/features/formModel/ObjectField.js.map +1 -1
- package/features/formModel/Rules.test.d.ts +1 -0
- package/features/formModel/Rules.test.js +289 -0
- package/features/formModel/Rules.test.js.map +1 -0
- package/features/formModel/abstractions.d.ts +402 -52
- package/features/formModel/abstractions.js +55 -0
- package/features/formModel/abstractions.js.map +1 -1
- package/features/formModel/createFieldRenderer.d.ts +20 -0
- package/features/formModel/createFieldRenderer.js +15 -0
- package/features/formModel/createFieldRenderer.js.map +1 -0
- package/features/formModel/demo/FieldRenderersDemoPresenter.d.ts +18 -0
- package/features/formModel/demo/FieldRenderersDemoPresenter.js +225 -0
- package/features/formModel/demo/FieldRenderersDemoPresenter.js.map +1 -0
- package/features/formModel/demo/FormModelDemo.d.ts +4 -0
- package/features/formModel/demo/FormModelDemo.js +230 -0
- package/features/formModel/demo/FormModelDemo.js.map +1 -0
- package/features/formModel/demo/FormModelDemoPresenter.d.ts +22 -0
- package/features/formModel/demo/FormModelDemoPresenter.js +121 -0
- package/features/formModel/demo/FormModelDemoPresenter.js.map +1 -0
- package/features/formModel/demo/FormModelPhase11Presenter.d.ts +25 -0
- package/features/formModel/demo/FormModelPhase11Presenter.js +104 -0
- package/features/formModel/demo/FormModelPhase11Presenter.js.map +1 -0
- package/features/formModel/demo/FormModelPhase8c1Presenter.d.ts +23 -0
- package/features/formModel/demo/FormModelPhase8c1Presenter.js +62 -0
- package/features/formModel/demo/FormModelPhase8c1Presenter.js.map +1 -0
- package/features/formModel/feature.js +12 -0
- package/features/formModel/feature.js.map +1 -1
- package/features/formModel/fieldTypes/BooleanFieldType.d.ts +19 -0
- package/features/formModel/fieldTypes/BooleanFieldType.js +23 -0
- package/features/formModel/fieldTypes/BooleanFieldType.js.map +1 -0
- package/features/formModel/fieldTypes/DateTimeFieldType.d.ts +173 -0
- package/features/formModel/fieldTypes/DateTimeFieldType.js +369 -0
- package/features/formModel/fieldTypes/DateTimeFieldType.js.map +1 -0
- package/features/formModel/fieldTypes/FileFieldType.d.ts +18 -0
- package/features/formModel/fieldTypes/FileFieldType.js +20 -0
- package/features/formModel/fieldTypes/FileFieldType.js.map +1 -0
- package/features/formModel/fieldTypes/FileUrlFieldType.d.ts +18 -0
- package/features/formModel/fieldTypes/FileUrlFieldType.js +20 -0
- package/features/formModel/fieldTypes/FileUrlFieldType.js.map +1 -0
- package/features/formModel/fieldTypes/NumberFieldType.d.ts +19 -0
- package/features/formModel/fieldTypes/NumberFieldType.js +27 -0
- package/features/formModel/fieldTypes/NumberFieldType.js.map +1 -0
- package/features/formModel/fieldTypes/ObjectFieldType.d.ts +34 -0
- package/features/formModel/fieldTypes/ObjectFieldType.js +109 -0
- package/features/formModel/fieldTypes/ObjectFieldType.js.map +1 -0
- package/features/formModel/fieldTypes/TextFieldType.d.ts +18 -0
- package/features/formModel/fieldTypes/TextFieldType.js +20 -0
- package/features/formModel/fieldTypes/TextFieldType.js.map +1 -0
- package/features/formModel/fieldTypes/index.d.ts +7 -0
- package/features/formModel/fieldTypes/index.js +9 -0
- package/features/formModel/fieldTypes/index.js.map +1 -0
- package/features/formModel/index.d.ts +13 -4
- package/features/formModel/index.js +21 -2
- package/features/formModel/index.js.map +1 -1
- package/features/formModel/renderers.d.ts +15 -1
- package/features/formModel/renderers.js +15 -1
- package/features/formModel/renderers.js.map +1 -1
- package/features/tools/LexicalContext/LexicalContext.d.ts +14 -0
- package/features/tools/LexicalContext/LexicalContext.js +22 -0
- package/features/tools/LexicalContext/LexicalContext.js.map +1 -0
- package/features/tools/LexicalContext/abstractions.d.ts +11 -0
- package/features/tools/LexicalContext/abstractions.js +4 -0
- package/features/tools/LexicalContext/abstractions.js.map +1 -0
- package/features/tools/LexicalContext/index.d.ts +2 -0
- package/features/tools/LexicalContext/index.js +3 -0
- package/features/tools/LexicalContext/index.js.map +1 -0
- package/features/tools/feature.js +2 -0
- package/features/tools/feature.js.map +1 -1
- package/features/tools/index.d.ts +1 -0
- package/features/tools/index.js +1 -0
- package/features/tools/index.js.map +1 -1
- package/index.d.ts +8 -1
- package/index.js +7 -0
- package/index.js.map +1 -1
- package/package.json +31 -25
- package/presentation/installation/components/SystemInstaller/steps/AdminUserStep/createPasswordValidator.js +1 -1
- package/presentation/installation/components/SystemInstaller/steps/AdminUserStep/createPasswordValidator.js.map +1 -1
- package/presentation/lexicalContext/useLexicalContext.d.ts +3 -0
- package/presentation/lexicalContext/useLexicalContext.js +14 -0
- package/presentation/lexicalContext/useLexicalContext.js.map +1 -0
- package/presentation/textToLexicalTool/TextToLexicalTool.d.ts +3 -0
- package/presentation/textToLexicalTool/TextToLexicalTool.js +6 -2
- package/presentation/textToLexicalTool/TextToLexicalTool.js.map +1 -1
- package/presentation/textToLexicalTool/textToLexicalState.d.ts +2 -1
- package/presentation/textToLexicalTool/textToLexicalState.js +15 -3
- package/presentation/textToLexicalTool/textToLexicalState.js.map +1 -1
- package/routes.d.ts +1 -0
- package/routes.js +4 -0
- package/routes.js.map +1 -1
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectListFlatRenderer.d.ts +0 -21
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectListFlatRenderer.js +0 -28
- 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,
|
|
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
|
-
|
|
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
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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
|
-
|
|
152
|
-
isList: this._isList,
|
|
153
|
-
listSchema: this._listSchema
|
|
154
|
+
normalizeValue: v => this.normalizeValue(v)
|
|
154
155
|
};
|
|
155
156
|
}
|
|
156
157
|
}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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
|
-
|
|
186
|
-
|
|
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":"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","ignoreList":[]}
|
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
import { describe, it, expect } from "vitest";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
import {
|
|
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("
|
|
62
|
-
it("should build a
|
|
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
|
|
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("
|
|
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
|
|
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 =
|
|
144
|
+
const registry = createRegistry();
|
|
90
145
|
const builder = registry.text();
|
|
91
146
|
expect(builder).toBeInstanceOf(TextFieldBuilder);
|
|
92
147
|
});
|
|
93
|
-
it("should create
|
|
94
|
-
const registry =
|
|
95
|
-
const builder = registry.
|
|
96
|
-
expect(builder).toBeInstanceOf(
|
|
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 =
|
|
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,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":[]}
|