@webiny/app-admin 6.2.0 → 6.3.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/base/Admin.js +2 -0
  2. package/base/Admin.js.map +1 -1
  3. package/base/Base/DefaultFieldRenderers.js +20 -4
  4. package/base/Base/DefaultFieldRenderers.js.map +1 -1
  5. package/base/Base/DefaultLayoutRenderers.d.ts +2 -0
  6. package/base/Base/DefaultLayoutRenderers.js +11 -0
  7. package/base/Base/DefaultLayoutRenderers.js.map +1 -0
  8. package/base/Base/FieldRenderers/InputRenderer.d.ts +15 -0
  9. package/base/Base/FieldRenderers/{TextRenderer.js → InputRenderer.js} +5 -3
  10. package/base/Base/FieldRenderers/InputRenderer.js.map +1 -0
  11. package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.d.ts +25 -0
  12. package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.js +89 -0
  13. package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.js.map +1 -0
  14. package/base/Base/FieldRenderers/ObjectRenderer/ObjectListFlatRenderer.d.ts +21 -0
  15. package/base/Base/FieldRenderers/ObjectRenderer/ObjectListFlatRenderer.js +28 -0
  16. package/base/Base/FieldRenderers/ObjectRenderer/ObjectListFlatRenderer.js.map +1 -0
  17. package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.d.ts +17 -0
  18. package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js +63 -0
  19. package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js.map +1 -0
  20. package/base/Base/FieldRenderers/ObjectRenderer/resolveItemTitle.d.ts +4 -0
  21. package/base/Base/FieldRenderers/ObjectRenderer/resolveItemTitle.js +22 -0
  22. package/base/Base/FieldRenderers/ObjectRenderer/resolveItemTitle.js.map +1 -0
  23. package/base/Base/FieldRenderers/PassthroughRenderer.d.ts +15 -0
  24. package/base/Base/FieldRenderers/PassthroughRenderer.js +29 -0
  25. package/base/Base/FieldRenderers/PassthroughRenderer.js.map +1 -0
  26. package/base/Base/FieldRenderers/SelectRenderer.d.ts +12 -2
  27. package/base/Base/FieldRenderers/SelectRenderer.js +4 -2
  28. package/base/Base/FieldRenderers/SelectRenderer.js.map +1 -1
  29. package/base/Base/FieldRenderers/TextareaRenderer.d.ts +17 -0
  30. package/base/Base/FieldRenderers/TextareaRenderer.js +25 -0
  31. package/base/Base/FieldRenderers/TextareaRenderer.js.map +1 -0
  32. package/base/Base/FieldRenderers/VerticalTabsRenderer.d.ts +5 -0
  33. package/base/Base/FieldRenderers/VerticalTabsRenderer.js +41 -0
  34. package/base/Base/FieldRenderers/VerticalTabsRenderer.js.map +1 -0
  35. package/base/Base.js +2 -1
  36. package/base/Base.js.map +1 -1
  37. package/base/createRootContainer.js +4 -0
  38. package/base/createRootContainer.js.map +1 -1
  39. package/base/providers/UiProviders.js +0 -1
  40. package/base/providers/UiProviders.js.map +1 -1
  41. package/components/Filters/Filters.js.map +1 -1
  42. package/components/IconPicker/components/IconPickerCell.d.ts +1 -1
  43. package/components/IconPicker/components/IconPickerTrigger.d.ts +1 -1
  44. package/components/IconPicker/components/IconPickerTrigger.js.map +1 -1
  45. package/components/LexicalEditor/LexicalEditor.js +7 -1
  46. package/components/LexicalEditor/LexicalEditor.js.map +1 -1
  47. package/components/LexicalEditor/lexicalValueFromHtml.d.ts +7 -0
  48. package/components/LexicalEditor/lexicalValueFromHtml.js +35 -0
  49. package/components/LexicalEditor/lexicalValueFromHtml.js.map +1 -0
  50. package/components/OverlayLayout/components/OverlayHeader.d.ts +1 -1
  51. package/components/OverlayLayout/components/OverlayHeader.js.map +1 -1
  52. package/components/SimpleForm/SimpleForm.d.ts +2 -2
  53. package/components/SimpleForm/SimpleForm.js.map +1 -1
  54. package/config/AdminConfig/Form.d.ts +1 -0
  55. package/config/AdminConfig/Form.js +3 -1
  56. package/config/AdminConfig/Form.js.map +1 -1
  57. package/config/AdminConfig/LayoutRenderer.d.ts +10 -0
  58. package/config/AdminConfig/LayoutRenderer.js +21 -0
  59. package/config/AdminConfig/LayoutRenderer.js.map +1 -0
  60. package/config/AdminConfig/Menu/MenuLink.d.ts +2 -2
  61. package/config/AdminConfig.d.ts +4 -0
  62. package/config/AdminConfig.js +2 -1
  63. package/config/AdminConfig.js.map +1 -1
  64. package/exports/admin.d.ts +2 -0
  65. package/exports/admin.js +2 -0
  66. package/exports/admin.js.map +1 -1
  67. package/features/formModel/Field.js +4 -0
  68. package/features/formModel/Field.js.map +1 -1
  69. package/features/formModel/FieldBuilder.d.ts +18 -2
  70. package/features/formModel/FieldBuilder.js +57 -3
  71. package/features/formModel/FieldBuilder.js.map +1 -1
  72. package/features/formModel/FormModel.d.ts +3 -3
  73. package/features/formModel/FormModel.js +48 -13
  74. package/features/formModel/FormModel.js.map +1 -1
  75. package/features/formModel/FormModel.test.js +383 -0
  76. package/features/formModel/FormModel.test.js.map +1 -1
  77. package/features/formModel/FormModelFactory.d.ts +2 -2
  78. package/features/formModel/FormModelFactory.js.map +1 -1
  79. package/features/formModel/FormView.d.ts +24 -4
  80. package/features/formModel/FormView.js +57 -27
  81. package/features/formModel/FormView.js.map +1 -1
  82. package/features/formModel/ObjectField.d.ts +46 -0
  83. package/features/formModel/ObjectField.js +346 -0
  84. package/features/formModel/ObjectField.js.map +1 -0
  85. package/features/formModel/abstractions.d.ts +88 -19
  86. package/features/formModel/abstractions.js +8 -0
  87. package/features/formModel/abstractions.js.map +1 -1
  88. package/features/formModel/index.d.ts +7 -4
  89. package/features/formModel/index.js +9 -2
  90. package/features/formModel/index.js.map +1 -1
  91. package/features/formModel/renderers.d.ts +6 -0
  92. package/features/formModel/renderers.js +10 -0
  93. package/features/formModel/renderers.js.map +1 -0
  94. package/features/formModel/useLayoutRenderers.d.ts +2 -0
  95. package/features/formModel/useLayoutRenderers.js +19 -0
  96. package/features/formModel/useLayoutRenderers.js.map +1 -0
  97. package/features/tools/ToolPipelineRunner.d.ts +10 -0
  98. package/features/tools/ToolPipelineRunner.js +33 -0
  99. package/features/tools/ToolPipelineRunner.js.map +1 -0
  100. package/features/tools/ToolRegistry.d.ts +12 -0
  101. package/features/tools/ToolRegistry.js +29 -0
  102. package/features/tools/ToolRegistry.js.map +1 -0
  103. package/features/tools/abstractions.d.ts +28 -0
  104. package/features/tools/abstractions.js +6 -0
  105. package/features/tools/abstractions.js.map +1 -0
  106. package/features/tools/feature.d.ts +4 -0
  107. package/features/tools/feature.js +19 -0
  108. package/features/tools/feature.js.map +1 -0
  109. package/features/tools/index.d.ts +2 -0
  110. package/features/tools/index.js +4 -0
  111. package/features/tools/index.js.map +1 -0
  112. package/features/wcp/ReactLicense.d.ts +3 -0
  113. package/features/wcp/ReactLicense.js +9 -0
  114. package/features/wcp/ReactLicense.js.map +1 -1
  115. package/features/wcp/WcpGateway.js +4 -0
  116. package/features/wcp/WcpGateway.js.map +1 -1
  117. package/features/webinySdk/WebinySdk.d.ts +11 -0
  118. package/features/webinySdk/WebinySdk.js +27 -0
  119. package/features/webinySdk/WebinySdk.js.map +1 -0
  120. package/features/webinySdk/abstractions.d.ts +6 -0
  121. package/features/webinySdk/abstractions.js +8 -0
  122. package/features/webinySdk/abstractions.js.map +1 -0
  123. package/features/webinySdk/feature.d.ts +3 -0
  124. package/features/webinySdk/feature.js +16 -0
  125. package/features/webinySdk/feature.js.map +1 -0
  126. package/features/webinySdk/index.d.ts +2 -0
  127. package/features/webinySdk/index.js +4 -0
  128. package/features/webinySdk/index.js.map +1 -0
  129. package/index.d.ts +8 -3
  130. package/index.js +5 -2
  131. package/index.js.map +1 -1
  132. package/package.json +24 -23
  133. package/presentation/textToLexicalTool/TextToLexicalTool.d.ts +27 -0
  134. package/presentation/textToLexicalTool/TextToLexicalTool.js +25 -0
  135. package/presentation/textToLexicalTool/TextToLexicalTool.js.map +1 -0
  136. package/presentation/textToLexicalTool/feature.d.ts +1 -0
  137. package/presentation/textToLexicalTool/feature.js +10 -0
  138. package/presentation/textToLexicalTool/feature.js.map +1 -0
  139. package/presentation/textToLexicalTool/textToLexicalState.d.ts +5 -0
  140. package/presentation/textToLexicalTool/textToLexicalState.js +19 -0
  141. package/presentation/textToLexicalTool/textToLexicalState.js.map +1 -0
  142. package/base/Base/FieldRenderers/TextRenderer.d.ts +0 -5
  143. package/base/Base/FieldRenderers/TextRenderer.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"names":["makeAutoObservable","runInAction","toJS","Field","createChildFields","childBuilders","form","children","Map","name","builder","Object","entries","config","build","field","createFieldFromConfig","set","objField","ObjectField","setForm","hydrateChildren","data","setValueSilent","getChildrenData","isObjectField","getData","getValue","validateChildren","allValid","valid","validate","type","itemKeyCounter","_form","_items","constructor","_base","renderer","_children","visible","setDisabled","value","setVisible","item","setValidation","validation","addBeforeChange","cb","addAfterChange","addAfterSetValue","addOnBlur","blur","remove","isList","items","map","key","getChild","get","getListItemChild","index","setValue","Array","isArray","itemData","_addItemInternal","addItem","removeItem","splice","moveItem","fromIndex","toIndex","length","push","resetValidation","as","Error","vm","baseVm","label","help","description","note","placeholder","required","disabled","rendererSettings","onChange","onBlur","fields","from","values","filter","f","moveUp","moveDown","to","hasErrors","checkChildren","isValid","message","requiredMessage","hasAnyValue","some","v","undefined","listSchema","listData","result","safeParseAsync","success","firstIssue","error","issues","schema"],"sources":["ObjectField.ts"],"sourcesContent":["import { makeAutoObservable, runInAction, toJS } from \"mobx\";\nimport { Field } from \"./Field.js\";\nimport type {\n IObjectFieldConfig,\n IObjectField,\n IListItemField,\n IField,\n IObjectFieldVM,\n IFieldValidation,\n IFormModel,\n IFieldBuilder,\n FieldTypeMap,\n BeforeChangeCallback,\n AfterChangeCallback,\n AfterSetValueCallback,\n OnBlurCallback\n} from \"./abstractions.js\";\n\nfunction createChildFields(\n childBuilders: Record<string, IFieldBuilder>,\n form: IFormModel | null\n): Map<string, IField> {\n const children = new Map<string, IField>();\n for (const [name, builder] of Object.entries(childBuilders)) {\n const config = builder.build(name);\n const field = createFieldFromConfig(config, form);\n children.set(name, field);\n }\n return children;\n}\n\nfunction createFieldFromConfig(config: any, form: IFormModel | null): IField {\n if (config.childBuilders) {\n const objField = new ObjectField(config as IObjectFieldConfig);\n if (form) {\n objField.setForm(form);\n }\n return objField;\n }\n const field = new Field(config);\n if (form) {\n field.setForm(form);\n }\n return field;\n}\n\nfunction hydrateChildren(\n children: Map<string, IField>,\n data: Record<string, unknown> | null | undefined\n): void {\n if (!data) {\n return;\n }\n for (const [name, field] of children) {\n if (name in data) {\n field.setValueSilent(data[name]);\n }\n }\n}\n\nfunction getChildrenData(children: Map<string, IField>): Record<string, unknown> {\n const data: Record<string, unknown> = {};\n for (const [name, field] of children) {\n if (isObjectField(field)) {\n data[name] = toJS(field.getData());\n } else {\n data[name] = toJS(field.getValue());\n }\n }\n return data;\n}\n\nasync function validateChildren(children: Map<string, IField>): Promise<boolean> {\n let allValid = true;\n for (const [, field] of children) {\n const valid = await field.validate();\n if (!valid) {\n allValid = false;\n }\n }\n return allValid;\n}\n\nexport function isObjectField(field: IField): field is ObjectField {\n return field.type === \"object\";\n}\n\nlet itemKeyCounter = 0;\n\ninterface ListItem {\n key: string;\n children: Map<string, IField>;\n}\n\n/**\n * ObjectField — hierarchical field with children, using composition.\n * Holds a `_base` Field for scalar behavior (callbacks, disabled/hidden, form ref).\n * Adds its own children/items management for object and list modes.\n */\nexport class ObjectField implements IObjectField {\n readonly config: IObjectFieldConfig;\n\n private _base: Field;\n private _form: IFormModel | null = null;\n private _children: Map<string, IField>;\n private _items: ListItem[] = [];\n\n constructor(config: IObjectFieldConfig) {\n this.config = config;\n this._base = new Field({\n ...config,\n type: \"object\",\n renderer: config.renderer ?? \"object\"\n });\n this._children = createChildFields(config.childBuilders, null);\n\n makeAutoObservable(this, {\n config: false\n });\n }\n\n // --- Forwarded from _base ---\n\n get name(): string {\n return this._base.name;\n }\n\n get type(): string {\n return \"object\";\n }\n\n get visible(): boolean {\n return this._base.visible;\n }\n\n setDisabled(value: boolean): void {\n this._base.setDisabled(value);\n }\n\n setVisible(value: boolean): void {\n this._base.setVisible(value);\n }\n\n setForm(form: IFormModel): void {\n this._form = form;\n this._base.setForm(form);\n for (const [, field] of this._children) {\n field.setForm(form);\n }\n for (const item of this._items) {\n for (const [, field] of item.children) {\n field.setForm(form);\n }\n }\n }\n\n setValidation(validation: IFieldValidation): void {\n this._base.setValidation(validation);\n }\n\n addBeforeChange(cb: BeforeChangeCallback): void {\n this._base.addBeforeChange(cb);\n }\n\n addAfterChange(cb: AfterChangeCallback): void {\n this._base.addAfterChange(cb);\n }\n\n addAfterSetValue(cb: AfterSetValueCallback): void {\n this._base.addAfterSetValue(cb);\n }\n\n addOnBlur(cb: OnBlurCallback): void {\n this._base.addOnBlur(cb);\n }\n\n blur(): void {\n this._base.blur();\n }\n\n remove(): void {\n this._base.remove();\n }\n\n // --- Object-specific ---\n\n get isList(): boolean {\n return this.config.isList;\n }\n\n get children(): Map<string, IField> {\n return this._children;\n }\n\n get items(): IListItemField[] {\n return this._items.map(item => ({\n key: item.key,\n children: item.children,\n getData: () => getChildrenData(item.children)\n }));\n }\n\n getChild(name: string): IField | undefined {\n return this._children.get(name);\n }\n\n getListItemChild(index: number, name: string): IField | undefined {\n const item = this._items[index];\n return item?.children.get(name);\n }\n\n getData(): any {\n if (this.config.isList) {\n return this._items.map(item => getChildrenData(item.children));\n }\n return getChildrenData(this._children);\n }\n\n getValue<T = unknown>(): T {\n return this.getData() as T;\n }\n\n setValue(value: unknown): void {\n this.setValueSilent(value);\n }\n\n setValueSilent(value: unknown): void {\n if (this.config.isList) {\n this._items = [];\n if (Array.isArray(value)) {\n for (const itemData of value) {\n this._addItemInternal(itemData);\n }\n }\n } else {\n hydrateChildren(this._children, value as Record<string, unknown>);\n }\n }\n\n addItem(data?: Record<string, unknown>): void {\n this._addItemInternal(data);\n }\n\n removeItem(index: number): void {\n this._items.splice(index, 1);\n }\n\n moveItem(fromIndex: number, toIndex: number): void {\n if (\n fromIndex < 0 ||\n fromIndex >= this._items.length ||\n toIndex < 0 ||\n toIndex >= this._items.length ||\n fromIndex === toIndex\n ) {\n return;\n }\n const [item] = this._items.splice(fromIndex, 1);\n this._items.splice(toIndex, 0, item);\n }\n\n private _addItemInternal(data?: Record<string, unknown>): void {\n const children = createChildFields(this.config.childBuilders, this._form);\n if (data) {\n hydrateChildren(children, data);\n }\n const key = `item_${++itemKeyCounter}`;\n this._items.push({ key, children });\n }\n\n resetValidation(): void {\n this._base.resetValidation();\n for (const [, field] of this._children) {\n field.resetValidation();\n }\n for (const item of this._items) {\n for (const [, field] of item.children) {\n field.resetValidation();\n }\n }\n }\n\n as<T extends keyof FieldTypeMap>(type: T): FieldTypeMap[T] {\n if (type !== \"object\") {\n throw new Error(`Field \"${this.config.name}\" is type \"object\", not \"${type}\".`);\n }\n return this as unknown as FieldTypeMap[T];\n }\n\n get vm(): IObjectFieldVM {\n const baseVm = this._base.vm;\n return {\n name: baseVm.name,\n type: \"object\",\n label: baseVm.label,\n help: baseVm.help,\n description: baseVm.description,\n note: baseVm.note,\n placeholder: baseVm.placeholder,\n value: this.getValue(),\n validation: baseVm.validation,\n required: baseVm.required,\n disabled: baseVm.disabled,\n renderer: baseVm.renderer,\n rendererSettings: baseVm.rendererSettings,\n onChange: (value: unknown) => this.setValue(value),\n onBlur: () => this.blur(),\n isList: this.config.isList,\n fields: this.config.isList\n ? []\n : Array.from(this._children.values())\n .filter(f => f.visible)\n .map(f => f.vm),\n items: this.config.isList\n ? this._items.map((item, index) => ({\n key: item.key,\n fields: Array.from(item.children.values())\n .filter(f => f.visible)\n .map(f => f.vm),\n remove: () => this.removeItem(index),\n moveUp: () => this.moveItem(index, index - 1),\n moveDown: () => this.moveItem(index, index + 1)\n }))\n : [],\n addItem: () => this.addItem(),\n removeItem: (index: number) => this.removeItem(index),\n moveItem: (from: number, to: number) => this.moveItem(from, to)\n };\n }\n\n get hasErrors(): boolean {\n const checkChildren = (children: Map<string, IField>): boolean => {\n for (const [, field] of children) {\n if (field.vm.validation.isValid === false) {\n return true;\n }\n if (isObjectField(field) && field.hasErrors) {\n return true;\n }\n }\n return false;\n };\n\n if (this.config.isList) {\n for (const item of this._items) {\n if (checkChildren(item.children)) {\n return true;\n }\n }\n } else {\n if (checkChildren(this._children)) {\n return true;\n }\n }\n return false;\n }\n\n async validate(): Promise<boolean> {\n if (this.config.required) {\n if (this.config.isList && this._items.length === 0) {\n this.setValidation({\n isValid: false,\n message: this.config.requiredMessage || \"This field is required.\"\n });\n return false;\n }\n if (!this.config.isList) {\n const data = this.getData();\n const hasAnyValue = Object.values(data).some(\n v => v !== null && v !== undefined && v !== \"\"\n );\n if (!hasAnyValue) {\n this.setValidation({\n isValid: false,\n message: this.config.requiredMessage || \"This field is required.\"\n });\n return false;\n }\n }\n }\n\n if (this.config.isList && this.config.listSchema) {\n const listData = this.getData();\n const result = await this.config.listSchema.safeParseAsync(listData);\n if (!result.success) {\n const firstIssue = result.error.issues[0];\n runInAction(() => {\n this.setValidation({\n isValid: false,\n message: firstIssue?.message || \"Invalid value.\"\n });\n });\n return false;\n }\n }\n\n if (this.config.schema) {\n const data = this.getData();\n const result = await this.config.schema.safeParseAsync(data);\n if (!result.success) {\n const firstIssue = result.error.issues[0];\n runInAction(() => {\n this.setValidation({\n isValid: false,\n message: firstIssue?.message || \"Invalid value.\"\n });\n });\n return false;\n }\n }\n\n let allValid = true;\n\n if (this.config.isList) {\n for (const item of this._items) {\n const valid = await validateChildren(item.children);\n if (!valid) {\n allValid = false;\n }\n }\n } else {\n allValid = await validateChildren(this._children);\n }\n\n runInAction(() => {\n this.setValidation({ isValid: allValid });\n });\n\n return allValid;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,11 +1,21 @@
1
1
  import type { z } from "zod";
2
+ export interface IFieldRendererRegistry {
3
+ }
4
+ export type FieldRendererName<TType extends string = string> = string extends TType ? keyof IFieldRendererRegistry & string : {
5
+ [K in keyof IFieldRendererRegistry]: TType extends IFieldRendererRegistry[K]["fieldType"] ? K : never;
6
+ }[keyof IFieldRendererRegistry] & string;
7
+ export type FieldRendererSettings<TName extends string> = TName extends keyof IFieldRendererRegistry ? IFieldRendererRegistry[TName]["settings"] : Record<string, unknown> | undefined;
2
8
  export interface IFieldConfig {
3
9
  name: string;
4
10
  type: string;
5
11
  label?: string;
12
+ help?: string;
13
+ description?: string;
14
+ note?: string;
6
15
  placeholder?: string;
7
16
  defaultValue?: unknown;
8
17
  renderer?: string;
18
+ rendererSettings?: Record<string, unknown>;
9
19
  hidden: boolean;
10
20
  required: boolean;
11
21
  requiredMessage?: string;
@@ -30,23 +40,53 @@ export interface IFieldVM {
30
40
  name: string;
31
41
  type: string;
32
42
  label?: string;
43
+ help?: string;
44
+ description?: string;
45
+ note?: string;
33
46
  placeholder?: string;
34
47
  value: unknown;
35
48
  validation: IFieldValidation;
36
49
  required: boolean;
37
50
  disabled: boolean;
38
51
  renderer?: string;
52
+ rendererSettings?: Record<string, unknown>;
39
53
  options?: IValueOption[];
40
54
  onChange: (value: unknown) => void;
41
55
  onBlur: () => void;
42
56
  }
57
+ export interface IObjectFieldVM extends IFieldVM {
58
+ type: "object";
59
+ isList: boolean;
60
+ /** Child field VMs for non-list object fields. */
61
+ fields: IFieldVM[];
62
+ /** Items for list-mode object fields. */
63
+ items: IObjectFieldItemVM[];
64
+ addItem: () => void;
65
+ removeItem: (index: number) => void;
66
+ moveItem: (fromIndex: number, toIndex: number) => void;
67
+ }
68
+ export interface IObjectFieldItemVM {
69
+ key: string;
70
+ fields: IFieldVM[];
71
+ remove: () => void;
72
+ moveUp: () => void;
73
+ moveDown: () => void;
74
+ }
43
75
  export interface IField {
44
76
  readonly name: string;
45
77
  readonly type: string;
78
+ readonly visible: boolean;
79
+ readonly vm: IFieldVM;
80
+ readonly config: IFieldConfig;
46
81
  getValue<T = unknown>(): T;
47
82
  setValue(value: unknown): void;
83
+ setValueSilent(value: unknown): void;
48
84
  setDisabled(value: boolean): void;
49
85
  setVisible(value: boolean): void;
86
+ setForm(form: IFormModel): void;
87
+ setValidation(validation: IFieldValidation): void;
88
+ resetValidation(): void;
89
+ validate(): Promise<boolean>;
50
90
  remove(): void;
51
91
  addBeforeChange(cb: BeforeChangeCallback): void;
52
92
  addAfterChange(cb: AfterChangeCallback): void;
@@ -54,8 +94,6 @@ export interface IField {
54
94
  addOnBlur(cb: OnBlurCallback): void;
55
95
  blur(): void;
56
96
  as<T extends keyof FieldTypeMap>(type: T): FieldTypeMap[T];
57
- readonly vm: IFieldVM;
58
- readonly config: IFieldConfig;
59
97
  }
60
98
  /**
61
99
  * Maps field type strings to their typed field interfaces.
@@ -64,17 +102,37 @@ export interface IField {
64
102
  export interface FieldTypeMap {
65
103
  text: IField;
66
104
  select: ISelectField;
105
+ object: IObjectField;
67
106
  }
68
107
  export interface ISelectField extends IField {
69
108
  readonly config: IFieldConfig & {
70
109
  options?: IValueOption[] | ((form: IFormModel) => IValueOption[]);
71
110
  };
72
111
  }
112
+ export interface IObjectFieldConfig extends IFieldConfig {
113
+ childBuilders: Record<string, IFieldBuilder>;
114
+ isList: boolean;
115
+ listSchema?: z.ZodTypeAny;
116
+ }
117
+ export interface IObjectField extends IField {
118
+ readonly isList: boolean;
119
+ readonly children: Map<string, IField>;
120
+ readonly items: IListItemField[];
121
+ addItem(data?: Record<string, unknown>): void;
122
+ removeItem(index: number): void;
123
+ moveItem(fromIndex: number, toIndex: number): void;
124
+ getData(): Record<string, unknown> | Record<string, unknown>[];
125
+ }
126
+ export interface IListItemField {
127
+ readonly key: string;
128
+ readonly children: Map<string, IField>;
129
+ getData(): Record<string, unknown>;
130
+ }
73
131
  export type BeforeChangeCallback = (value: unknown, form: IFormModel) => unknown;
74
132
  export type AfterChangeCallback = (value: unknown, form: IFormModel) => void;
75
133
  export type AfterSetValueCallback = (value: unknown, form: IFormModel) => void;
76
134
  export type OnBlurCallback = (value: unknown, form: IFormModel) => void;
77
- export type LayoutNode = IRowNode | ISeparatorNode | ITabsNode | IElementNode | IObjectNode;
135
+ export type LayoutNode = IRowNode | ISeparatorNode | ITabsNode | IElementNode;
78
136
  export interface IRowNode {
79
137
  type: "row";
80
138
  fieldIds: string[];
@@ -92,6 +150,7 @@ export interface ITabDefinition {
92
150
  export interface ITabsNode {
93
151
  type: "tabs";
94
152
  id?: string;
153
+ renderer?: string;
95
154
  tabs: ITabDefinition[];
96
155
  }
97
156
  export interface IElementNode {
@@ -100,12 +159,6 @@ export interface IElementNode {
100
159
  renderer: string;
101
160
  props?: Record<string, unknown>;
102
161
  }
103
- export interface IObjectNode {
104
- type: "object";
105
- fieldId: string;
106
- layout?: LayoutNode[];
107
- templates?: Record<string, LayoutNode[]>;
108
- }
109
162
  export type LayoutNodeVM = IRowNodeVM | ISeparatorNodeVM | ITabsNodeVM | IElementNodeVM;
110
163
  export interface IRowNodeVM {
111
164
  type: "row";
@@ -125,6 +178,7 @@ export interface ITabDefinitionVM {
125
178
  export interface ITabsNodeVM {
126
179
  type: "tabs";
127
180
  id?: string;
181
+ renderer?: string;
128
182
  tabs: ITabDefinitionVM[];
129
183
  activeTabId: string;
130
184
  setActiveTab: (id: string) => void;
@@ -177,6 +231,7 @@ export interface ILayoutModifier {
177
231
  separator(): ILayoutNodeHandle;
178
232
  tabs(config: {
179
233
  id?: string;
234
+ renderer?: string;
180
235
  tabs: ITabDefinition[];
181
236
  }): ILayoutNodeHandle;
182
237
  element(renderer: string, props?: Record<string, unknown>): ILayoutNodeHandle;
@@ -193,13 +248,13 @@ export interface IFormVM {
193
248
  isDirty: boolean;
194
249
  isValid: boolean | null;
195
250
  }
196
- export interface IFormModel {
251
+ export interface IFormModel<T = Record<string, any>> {
197
252
  field(name: string): IField;
198
253
  fields(factory: (registry: IFieldBuilderRegistry) => Record<string, IFieldBuilder | undefined>): void;
199
254
  layout(factory: (layout: ILayoutModifier) => (LayoutNode | IPositionedLayoutNode)[]): void;
200
255
  layout(nodeId: string): ILayoutNodeAccessHandle;
201
- getData(): Record<string, unknown>;
202
- setData(data: Record<string, unknown>): void;
256
+ getData(): T;
257
+ setData(data: T): void;
203
258
  reset(): void;
204
259
  validate(): Promise<boolean>;
205
260
  submit<T = Record<string, unknown>>(): Promise<T | false>;
@@ -215,6 +270,8 @@ export declare namespace FormModel {
215
270
  type FieldVM = IFieldVM;
216
271
  type Field = IField;
217
272
  type SelectField = ISelectField;
273
+ type ObjectField = IObjectField;
274
+ type ObjectFieldConfig = IObjectFieldConfig;
218
275
  type BeforeChange = BeforeChangeCallback;
219
276
  type AfterChange = AfterChangeCallback;
220
277
  type AfterSetValue = AfterSetValueCallback;
@@ -229,15 +286,16 @@ export declare namespace FormModel {
229
286
  type TabDefinitionVM = ITabDefinitionVM;
230
287
  type ElementNode = IElementNode;
231
288
  type ElementNodeVM = IElementNodeVM;
232
- type ObjectNode = IObjectNode;
289
+ type ObjectFieldVM = IObjectFieldVM;
290
+ type ObjectFieldItemVM = IObjectFieldItemVM;
233
291
  type FormError = IFormError;
234
292
  type FormVM = IFormVM;
235
- type Interface = IFormModel;
293
+ type Interface<T = Record<string, any>> = IFormModel<T>;
236
294
  type Modifier = IFormModifier;
237
295
  type LayoutModifier = ILayoutModifier;
238
296
  }
239
297
  export interface IFormModelFactory {
240
- create(config: IFormModelConfig): IFormModel;
298
+ create<T = Record<string, any>>(config: IFormModelConfig): IFormModel<T>;
241
299
  }
242
300
  export interface IFormModelConfig {
243
301
  fields: (registry: IFieldBuilderRegistry) => Record<string, IFieldBuilder>;
@@ -249,16 +307,20 @@ export interface ILayoutBuilder {
249
307
  separator(): ISeparatorNode;
250
308
  tabs(config: {
251
309
  id?: string;
310
+ renderer?: string;
252
311
  tabs: ITabDefinition[];
253
312
  }): ITabsNode;
254
313
  element(renderer: string, props?: Record<string, unknown>): IElementNode;
255
314
  }
256
- export interface IFieldBuilder {
315
+ export interface IFieldBuilder<TType extends string = string> {
257
316
  label(text: string): this;
317
+ help(text: string): this;
318
+ description(text: string): this;
319
+ note(text: string): this;
258
320
  placeholder(text: string): this;
259
321
  schema(zodSchema: z.ZodTypeAny): this;
260
322
  defaultValue(value: unknown): this;
261
- renderer(name: string): this;
323
+ renderer<TName extends FieldRendererName<TType>>(name: TName, ...args: undefined extends FieldRendererSettings<TName> ? [settings?: FieldRendererSettings<TName>] : FieldRendererSettings<TName> extends undefined ? [] : [settings: FieldRendererSettings<TName>]): this;
262
324
  hidden(): this;
263
325
  required(message?: string): this;
264
326
  disabled(value?: boolean): this;
@@ -268,12 +330,18 @@ export interface IFieldBuilder {
268
330
  onBlur(fn: OnBlurCallback): this;
269
331
  build(name: string): IFieldConfig;
270
332
  }
271
- export interface ISelectFieldBuilder extends IFieldBuilder {
333
+ export interface ISelectFieldBuilder extends IFieldBuilder<"select"> {
272
334
  options(opts: IValueOption[] | ((form: IFormModel) => IValueOption[])): this;
273
335
  }
336
+ export interface IObjectFieldBuilder extends IFieldBuilder<"object"> {
337
+ fields(fn: (registry: IFieldBuilderRegistry) => Record<string, IFieldBuilder>): this;
338
+ list(): this;
339
+ listSchema(schema: z.ZodTypeAny): this;
340
+ }
274
341
  export interface IFieldBuilderRegistry {
275
- text(): IFieldBuilder;
342
+ text(): IFieldBuilder<"text">;
276
343
  select(): ISelectFieldBuilder;
344
+ object(): IObjectFieldBuilder;
277
345
  }
278
346
  export declare const FormModelFactory: import("@webiny/di").Abstraction<IFormModelFactory>;
279
347
  export declare namespace FormModelFactory {
@@ -282,5 +350,6 @@ export declare namespace FormModelFactory {
282
350
  type LayoutBuilder = ILayoutBuilder;
283
351
  type FieldBuilder = IFieldBuilder;
284
352
  type SelectFieldBuilder = ISelectFieldBuilder;
353
+ type ObjectFieldBuilder = IObjectFieldBuilder;
285
354
  type FieldBuilderRegistry = IFieldBuilderRegistry;
286
355
  }
@@ -1,5 +1,9 @@
1
1
  import { createAbstraction } from "@webiny/feature/admin";
2
2
 
3
+ // ---------------------------------------------------------------------------
4
+ // Renderer registry — augmented by each renderer via declare module
5
+ // ---------------------------------------------------------------------------
6
+
3
7
  // ---------------------------------------------------------------------------
4
8
  // Field types
5
9
  // ---------------------------------------------------------------------------
@@ -9,6 +13,10 @@ import { createAbstraction } from "@webiny/feature/admin";
9
13
  * Extended via module augmentation when new field types are registered.
10
14
  */
11
15
 
16
+ // ---------------------------------------------------------------------------
17
+ // Object / List field types
18
+ // ---------------------------------------------------------------------------
19
+
12
20
  // ---------------------------------------------------------------------------
13
21
  // Callback types
14
22
  // ---------------------------------------------------------------------------
@@ -1 +1 @@
1
- {"version":3,"names":["createAbstraction","FormModel","FormModelFactory"],"sources":["abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/admin\";\nimport type { z } from \"zod\";\n\n// ---------------------------------------------------------------------------\n// Field types\n// ---------------------------------------------------------------------------\n\nexport interface IFieldConfig {\n name: string;\n type: string;\n label?: string;\n placeholder?: string;\n defaultValue?: unknown;\n renderer?: string;\n hidden: boolean;\n required: boolean;\n requiredMessage?: string;\n disabled: boolean;\n schema?: z.ZodTypeAny;\n options?: IValueOption[] | ((form: IFormModel) => IValueOption[]);\n beforeChangeCallbacks?: BeforeChangeCallback[];\n afterChangeCallbacks?: AfterChangeCallback[];\n afterSetValueCallbacks?: AfterSetValueCallback[];\n onBlurCallbacks?: OnBlurCallback[];\n}\n\nexport interface IValueOption {\n label: string;\n value: string;\n disabled?: boolean;\n}\n\nexport interface IFieldValidation {\n isValid: boolean | null;\n message?: string;\n}\n\nexport interface IFieldVM {\n name: string;\n type: string;\n label?: string;\n placeholder?: string;\n value: unknown;\n validation: IFieldValidation;\n required: boolean;\n disabled: boolean;\n renderer?: string;\n options?: IValueOption[];\n onChange: (value: unknown) => void;\n onBlur: () => void;\n}\n\nexport interface IField {\n readonly name: string;\n readonly type: string;\n getValue<T = unknown>(): T;\n setValue(value: unknown): void;\n setDisabled(value: boolean): void;\n setVisible(value: boolean): void;\n remove(): void;\n addBeforeChange(cb: BeforeChangeCallback): void;\n addAfterChange(cb: AfterChangeCallback): void;\n addAfterSetValue(cb: AfterSetValueCallback): void;\n addOnBlur(cb: OnBlurCallback): void;\n blur(): void;\n as<T extends keyof FieldTypeMap>(type: T): FieldTypeMap[T];\n readonly vm: IFieldVM;\n readonly config: IFieldConfig;\n}\n\n/**\n * Maps field type strings to their typed field interfaces.\n * Extended via module augmentation when new field types are registered.\n */\nexport interface FieldTypeMap {\n text: IField;\n select: ISelectField;\n}\n\nexport interface ISelectField extends IField {\n readonly config: IFieldConfig & {\n options?: IValueOption[] | ((form: IFormModel) => IValueOption[]);\n };\n}\n\n// ---------------------------------------------------------------------------\n// Callback types\n// ---------------------------------------------------------------------------\n\nexport type BeforeChangeCallback = (value: unknown, form: IFormModel) => unknown;\nexport type AfterChangeCallback = (value: unknown, form: IFormModel) => void;\nexport type AfterSetValueCallback = (value: unknown, form: IFormModel) => void;\nexport type OnBlurCallback = (value: unknown, form: IFormModel) => void;\n\n// ---------------------------------------------------------------------------\n// Layout types\n// ---------------------------------------------------------------------------\n\nexport type LayoutNode = IRowNode | ISeparatorNode | ITabsNode | IElementNode | IObjectNode;\n\nexport interface IRowNode {\n type: \"row\";\n fieldIds: string[];\n}\n\nexport interface ISeparatorNode {\n type: \"separator\";\n}\n\nexport interface ITabDefinition {\n id: string;\n label: string;\n description?: string;\n icon?: string;\n layout: LayoutNode[];\n}\n\nexport interface ITabsNode {\n type: \"tabs\";\n id?: string;\n tabs: ITabDefinition[];\n}\n\nexport interface IElementNode {\n type: \"element\";\n id?: string;\n renderer: string;\n props?: Record<string, unknown>;\n}\n\nexport interface IObjectNode {\n type: \"object\";\n fieldId: string;\n layout?: LayoutNode[];\n templates?: Record<string, LayoutNode[]>;\n}\n\n// ---------------------------------------------------------------------------\n// Layout VM types\n// ---------------------------------------------------------------------------\n\nexport type LayoutNodeVM = IRowNodeVM | ISeparatorNodeVM | ITabsNodeVM | IElementNodeVM;\n\nexport interface IRowNodeVM {\n type: \"row\";\n fields: IFieldVM[];\n}\n\nexport interface ISeparatorNodeVM {\n type: \"separator\";\n}\n\nexport interface ITabDefinitionVM {\n id: string;\n label: string;\n description?: string;\n icon?: string;\n hasErrors: boolean;\n layout: LayoutNodeVM[];\n}\n\nexport interface ITabsNodeVM {\n type: \"tabs\";\n id?: string;\n tabs: ITabDefinitionVM[];\n activeTabId: string;\n setActiveTab: (id: string) => void;\n}\n\nexport interface IElementNodeVM {\n type: \"element\";\n renderer: string;\n props?: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// Layout modifier types\n// ---------------------------------------------------------------------------\n\nexport type LayoutPosition =\n | { type: \"before\"; target: string }\n | { type: \"after\"; target: string }\n | { type: \"replace\"; target: string };\n\nexport interface IPositionedLayoutNode {\n node: LayoutNode;\n position?: LayoutPosition;\n}\n\n/**\n * Chainable handle returned by modifier layout.row().\n * Can be used as-is (appended) or positioned via .before()/.after()/.replace().\n */\nexport interface ILayoutNodeHandle extends IPositionedLayoutNode {\n before(target: string): IPositionedLayoutNode;\n after(target: string): IPositionedLayoutNode;\n replace(target: string): IPositionedLayoutNode;\n}\n\n// ---------------------------------------------------------------------------\n// Named layout node access types\n// ---------------------------------------------------------------------------\n\nexport interface ITabsHandle {\n tab(definition: ITabDefinition): ITabHandle;\n tab(id: string): ITabHandle;\n}\n\nexport interface ITabHandle {\n layout(factory: (layout: ILayoutBuilder) => LayoutNode[]): void;\n before(target: string): void;\n after(target: string): void;\n}\n\nexport interface ILayoutNodeAccessHandle {\n as(type: \"tabs\"): ITabsHandle;\n}\n\n// ---------------------------------------------------------------------------\n// Modifier types\n// ---------------------------------------------------------------------------\n\nexport interface IFormModifier {\n modify(form: IFormModel): void;\n}\n\nexport interface ILayoutModifier {\n row(...fieldIds: string[]): ILayoutNodeHandle;\n separator(): ILayoutNodeHandle;\n tabs(config: { id?: string; tabs: ITabDefinition[] }): ILayoutNodeHandle;\n element(renderer: string, props?: Record<string, unknown>): ILayoutNodeHandle;\n remove(target: string): void;\n}\n\n// ---------------------------------------------------------------------------\n// Form types\n// ---------------------------------------------------------------------------\n\nexport interface IFormError {\n path: string;\n label?: string;\n message: string;\n}\n\nexport interface IFormVM {\n layout: LayoutNodeVM[];\n errors: IFormError[];\n isDirty: boolean;\n isValid: boolean | null;\n}\n\nexport interface IFormModel {\n field(name: string): IField;\n fields(\n factory: (registry: IFieldBuilderRegistry) => Record<string, IFieldBuilder | undefined>\n ): void;\n layout(factory: (layout: ILayoutModifier) => (LayoutNode | IPositionedLayoutNode)[]): void;\n layout(nodeId: string): ILayoutNodeAccessHandle;\n getData(): Record<string, unknown>;\n setData(data: Record<string, unknown>): void;\n reset(): void;\n validate(): Promise<boolean>;\n submit<T = Record<string, unknown>>(): Promise<T | false>;\n readonly isDirty: boolean;\n readonly isValid: boolean | null;\n readonly errors: IFormError[];\n readonly vm: IFormVM;\n}\n\n// ---------------------------------------------------------------------------\n// FormModel namespace — groups all public types under one import\n// ---------------------------------------------------------------------------\n\nexport namespace FormModel {\n export type FieldConfig = IFieldConfig;\n export type ValueOption = IValueOption;\n export type FieldValidation = IFieldValidation;\n export type FieldVM = IFieldVM;\n export type Field = IField;\n export type SelectField = ISelectField;\n export type BeforeChange = BeforeChangeCallback;\n export type AfterChange = AfterChangeCallback;\n export type AfterSetValue = AfterSetValueCallback;\n export type OnBlur = OnBlurCallback;\n export type RowNode = IRowNode;\n export type RowNodeVM = IRowNodeVM;\n export type SeparatorNode = ISeparatorNode;\n export type SeparatorNodeVM = ISeparatorNodeVM;\n export type TabsNode = ITabsNode;\n export type TabDefinition = ITabDefinition;\n export type TabsNodeVM = ITabsNodeVM;\n export type TabDefinitionVM = ITabDefinitionVM;\n export type ElementNode = IElementNode;\n export type ElementNodeVM = IElementNodeVM;\n export type ObjectNode = IObjectNode;\n export type FormError = IFormError;\n export type FormVM = IFormVM;\n export type Interface = IFormModel;\n export type Modifier = IFormModifier;\n export type LayoutModifier = ILayoutModifier;\n}\n\n// ---------------------------------------------------------------------------\n// FormModelFactory abstraction\n// ---------------------------------------------------------------------------\n\nexport interface IFormModelFactory {\n create(config: IFormModelConfig): IFormModel;\n}\n\nexport interface IFormModelConfig {\n fields: (registry: IFieldBuilderRegistry) => Record<string, IFieldBuilder>;\n layout?: (layout: ILayoutBuilder) => LayoutNode[];\n validateOnSubmit?: boolean;\n}\n\nexport interface ILayoutBuilder {\n row(...fieldIds: string[]): IRowNode;\n separator(): ISeparatorNode;\n tabs(config: { id?: string; tabs: ITabDefinition[] }): ITabsNode;\n element(renderer: string, props?: Record<string, unknown>): IElementNode;\n}\n\nexport interface IFieldBuilder {\n label(text: string): this;\n placeholder(text: string): this;\n schema(zodSchema: z.ZodTypeAny): this;\n defaultValue(value: unknown): this;\n renderer(name: string): this;\n hidden(): this;\n required(message?: string): this;\n disabled(value?: boolean): this;\n beforeChange(fn: BeforeChangeCallback): this;\n afterChange(fn: AfterChangeCallback): this;\n afterSetValue(fn: AfterSetValueCallback): this;\n onBlur(fn: OnBlurCallback): this;\n build(name: string): IFieldConfig;\n}\n\nexport interface ISelectFieldBuilder extends IFieldBuilder {\n options(opts: IValueOption[] | ((form: IFormModel) => IValueOption[])): this;\n}\n\nexport interface IFieldBuilderRegistry {\n text(): IFieldBuilder;\n select(): ISelectFieldBuilder;\n}\n\nexport const FormModelFactory = createAbstraction<IFormModelFactory>(\"FormModelFactory\");\n\nexport namespace FormModelFactory {\n export type Interface = IFormModelFactory;\n export type Config = IFormModelConfig;\n export type LayoutBuilder = ILayoutBuilder;\n export type FieldBuilder = IFieldBuilder;\n export type SelectFieldBuilder = ISelectFieldBuilder;\n export type FieldBuilderRegistry = IFieldBuilderRegistry;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,uBAAuB;;AAGzD;AACA;AACA;;AAiEA;AACA;AACA;AACA;;AAYA;AACA;AACA;;AAOA;AACA;AACA;;AAyCA;AACA;AACA;;AAoCA;AACA;AACA;;AAYA;AACA;AACA;AACA;;AAOA;AACA;AACA;;AAiBA;AACA;AACA;;AAcA;AACA;AACA;AAiCA;AACA;AACA;AAAA,WAEiBC,SAAS;AA6B1B;AACA;AACA;;AA4CA,OAAO,MAAMC,gBAAgB,GAAGF,iBAAiB,CAAoB,kBAAkB,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["createAbstraction","FormModel","FormModelFactory"],"sources":["abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/admin\";\nimport type { z } from \"zod\";\n\n// ---------------------------------------------------------------------------\n// Renderer registry — augmented by each renderer via declare module\n// ---------------------------------------------------------------------------\n\nexport interface IFieldRendererRegistry {}\n\nexport type FieldRendererName<TType extends string = string> = string extends TType\n ? keyof IFieldRendererRegistry & string\n : {\n [K in keyof IFieldRendererRegistry]: TType extends IFieldRendererRegistry[K][\"fieldType\"]\n ? K\n : never;\n }[keyof IFieldRendererRegistry] &\n string;\n\nexport type FieldRendererSettings<TName extends string> = TName extends keyof IFieldRendererRegistry\n ? IFieldRendererRegistry[TName][\"settings\"]\n : Record<string, unknown> | undefined;\n\n// ---------------------------------------------------------------------------\n// Field types\n// ---------------------------------------------------------------------------\n\nexport interface IFieldConfig {\n name: string;\n type: string;\n label?: string;\n help?: string;\n description?: string;\n note?: string;\n placeholder?: string;\n defaultValue?: unknown;\n renderer?: string;\n rendererSettings?: Record<string, unknown>;\n hidden: boolean;\n required: boolean;\n requiredMessage?: string;\n disabled: boolean;\n schema?: z.ZodTypeAny;\n options?: IValueOption[] | ((form: IFormModel) => IValueOption[]);\n beforeChangeCallbacks?: BeforeChangeCallback[];\n afterChangeCallbacks?: AfterChangeCallback[];\n afterSetValueCallbacks?: AfterSetValueCallback[];\n onBlurCallbacks?: OnBlurCallback[];\n}\n\nexport interface IValueOption {\n label: string;\n value: string;\n disabled?: boolean;\n}\n\nexport interface IFieldValidation {\n isValid: boolean | null;\n message?: string;\n}\n\nexport interface IFieldVM {\n name: string;\n type: string;\n label?: string;\n help?: string;\n description?: string;\n note?: string;\n placeholder?: string;\n value: unknown;\n validation: IFieldValidation;\n required: boolean;\n disabled: boolean;\n renderer?: string;\n rendererSettings?: Record<string, unknown>;\n options?: IValueOption[];\n onChange: (value: unknown) => void;\n onBlur: () => void;\n}\n\nexport interface IObjectFieldVM extends IFieldVM {\n type: \"object\";\n isList: boolean;\n /** Child field VMs for non-list object fields. */\n fields: IFieldVM[];\n /** Items for list-mode object fields. */\n items: IObjectFieldItemVM[];\n addItem: () => void;\n removeItem: (index: number) => void;\n moveItem: (fromIndex: number, toIndex: number) => void;\n}\n\nexport interface IObjectFieldItemVM {\n key: string;\n fields: IFieldVM[];\n remove: () => void;\n moveUp: () => void;\n moveDown: () => void;\n}\n\nexport interface IField {\n readonly name: string;\n readonly type: string;\n readonly visible: boolean;\n readonly vm: IFieldVM;\n readonly config: IFieldConfig;\n getValue<T = unknown>(): T;\n setValue(value: unknown): void;\n setValueSilent(value: unknown): void;\n setDisabled(value: boolean): void;\n setVisible(value: boolean): void;\n setForm(form: IFormModel): void;\n setValidation(validation: IFieldValidation): void;\n resetValidation(): void;\n validate(): Promise<boolean>;\n remove(): void;\n addBeforeChange(cb: BeforeChangeCallback): void;\n addAfterChange(cb: AfterChangeCallback): void;\n addAfterSetValue(cb: AfterSetValueCallback): void;\n addOnBlur(cb: OnBlurCallback): void;\n blur(): void;\n as<T extends keyof FieldTypeMap>(type: T): FieldTypeMap[T];\n}\n\n/**\n * Maps field type strings to their typed field interfaces.\n * Extended via module augmentation when new field types are registered.\n */\nexport interface FieldTypeMap {\n text: IField;\n select: ISelectField;\n object: IObjectField;\n}\n\nexport interface ISelectField extends IField {\n readonly config: IFieldConfig & {\n options?: IValueOption[] | ((form: IFormModel) => IValueOption[]);\n };\n}\n\n// ---------------------------------------------------------------------------\n// Object / List field types\n// ---------------------------------------------------------------------------\n\nexport interface IObjectFieldConfig extends IFieldConfig {\n childBuilders: Record<string, IFieldBuilder>;\n isList: boolean;\n listSchema?: z.ZodTypeAny;\n}\n\nexport interface IObjectField extends IField {\n readonly isList: boolean;\n readonly children: Map<string, IField>;\n readonly items: IListItemField[];\n addItem(data?: Record<string, unknown>): void;\n removeItem(index: number): void;\n moveItem(fromIndex: number, toIndex: number): void;\n getData(): Record<string, unknown> | Record<string, unknown>[];\n}\n\nexport interface IListItemField {\n readonly key: string;\n readonly children: Map<string, IField>;\n getData(): Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// Callback types\n// ---------------------------------------------------------------------------\n\nexport type BeforeChangeCallback = (value: unknown, form: IFormModel) => unknown;\nexport type AfterChangeCallback = (value: unknown, form: IFormModel) => void;\nexport type AfterSetValueCallback = (value: unknown, form: IFormModel) => void;\nexport type OnBlurCallback = (value: unknown, form: IFormModel) => void;\n\n// ---------------------------------------------------------------------------\n// Layout types\n// ---------------------------------------------------------------------------\n\nexport type LayoutNode = IRowNode | ISeparatorNode | ITabsNode | IElementNode;\n\nexport interface IRowNode {\n type: \"row\";\n fieldIds: string[];\n}\n\nexport interface ISeparatorNode {\n type: \"separator\";\n}\n\nexport interface ITabDefinition {\n id: string;\n label: string;\n description?: string;\n icon?: string;\n layout: LayoutNode[];\n}\n\nexport interface ITabsNode {\n type: \"tabs\";\n id?: string;\n renderer?: string;\n tabs: ITabDefinition[];\n}\n\nexport interface IElementNode {\n type: \"element\";\n id?: string;\n renderer: string;\n props?: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// Layout VM types\n// ---------------------------------------------------------------------------\n\nexport type LayoutNodeVM = IRowNodeVM | ISeparatorNodeVM | ITabsNodeVM | IElementNodeVM;\n\nexport interface IRowNodeVM {\n type: \"row\";\n fields: IFieldVM[];\n}\n\nexport interface ISeparatorNodeVM {\n type: \"separator\";\n}\n\nexport interface ITabDefinitionVM {\n id: string;\n label: string;\n description?: string;\n icon?: string;\n hasErrors: boolean;\n layout: LayoutNodeVM[];\n}\n\nexport interface ITabsNodeVM {\n type: \"tabs\";\n id?: string;\n renderer?: string;\n tabs: ITabDefinitionVM[];\n activeTabId: string;\n setActiveTab: (id: string) => void;\n}\n\nexport interface IElementNodeVM {\n type: \"element\";\n renderer: string;\n props?: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// Layout modifier types\n// ---------------------------------------------------------------------------\n\nexport type LayoutPosition =\n | { type: \"before\"; target: string }\n | { type: \"after\"; target: string }\n | { type: \"replace\"; target: string };\n\nexport interface IPositionedLayoutNode {\n node: LayoutNode;\n position?: LayoutPosition;\n}\n\n/**\n * Chainable handle returned by modifier layout.row().\n * Can be used as-is (appended) or positioned via .before()/.after()/.replace().\n */\nexport interface ILayoutNodeHandle extends IPositionedLayoutNode {\n before(target: string): IPositionedLayoutNode;\n after(target: string): IPositionedLayoutNode;\n replace(target: string): IPositionedLayoutNode;\n}\n\n// ---------------------------------------------------------------------------\n// Named layout node access types\n// ---------------------------------------------------------------------------\n\nexport interface ITabsHandle {\n tab(definition: ITabDefinition): ITabHandle;\n tab(id: string): ITabHandle;\n}\n\nexport interface ITabHandle {\n layout(factory: (layout: ILayoutBuilder) => LayoutNode[]): void;\n before(target: string): void;\n after(target: string): void;\n}\n\nexport interface ILayoutNodeAccessHandle {\n as(type: \"tabs\"): ITabsHandle;\n}\n\n// ---------------------------------------------------------------------------\n// Modifier types\n// ---------------------------------------------------------------------------\n\nexport interface IFormModifier {\n modify(form: IFormModel): void;\n}\n\nexport interface ILayoutModifier {\n row(...fieldIds: string[]): ILayoutNodeHandle;\n separator(): ILayoutNodeHandle;\n tabs(config: { id?: string; renderer?: string; tabs: ITabDefinition[] }): ILayoutNodeHandle;\n element(renderer: string, props?: Record<string, unknown>): ILayoutNodeHandle;\n remove(target: string): void;\n}\n\n// ---------------------------------------------------------------------------\n// Form types\n// ---------------------------------------------------------------------------\n\nexport interface IFormError {\n path: string;\n label?: string;\n message: string;\n}\n\nexport interface IFormVM {\n layout: LayoutNodeVM[];\n errors: IFormError[];\n isDirty: boolean;\n isValid: boolean | null;\n}\n\nexport interface IFormModel<T = Record<string, any>> {\n field(name: string): IField;\n fields(\n factory: (registry: IFieldBuilderRegistry) => Record<string, IFieldBuilder | undefined>\n ): void;\n layout(factory: (layout: ILayoutModifier) => (LayoutNode | IPositionedLayoutNode)[]): void;\n layout(nodeId: string): ILayoutNodeAccessHandle;\n getData(): T;\n setData(data: T): void;\n reset(): void;\n validate(): Promise<boolean>;\n submit<T = Record<string, unknown>>(): Promise<T | false>;\n readonly isDirty: boolean;\n readonly isValid: boolean | null;\n readonly errors: IFormError[];\n readonly vm: IFormVM;\n}\n\n// ---------------------------------------------------------------------------\n// FormModel namespace — groups all public types under one import\n// ---------------------------------------------------------------------------\n\nexport namespace FormModel {\n export type FieldConfig = IFieldConfig;\n export type ValueOption = IValueOption;\n export type FieldValidation = IFieldValidation;\n export type FieldVM = IFieldVM;\n export type Field = IField;\n export type SelectField = ISelectField;\n export type ObjectField = IObjectField;\n export type ObjectFieldConfig = IObjectFieldConfig;\n export type BeforeChange = BeforeChangeCallback;\n export type AfterChange = AfterChangeCallback;\n export type AfterSetValue = AfterSetValueCallback;\n export type OnBlur = OnBlurCallback;\n export type RowNode = IRowNode;\n export type RowNodeVM = IRowNodeVM;\n export type SeparatorNode = ISeparatorNode;\n export type SeparatorNodeVM = ISeparatorNodeVM;\n export type TabsNode = ITabsNode;\n export type TabDefinition = ITabDefinition;\n export type TabsNodeVM = ITabsNodeVM;\n export type TabDefinitionVM = ITabDefinitionVM;\n export type ElementNode = IElementNode;\n export type ElementNodeVM = IElementNodeVM;\n export type ObjectFieldVM = IObjectFieldVM;\n export type ObjectFieldItemVM = IObjectFieldItemVM;\n export type FormError = IFormError;\n export type FormVM = IFormVM;\n export type Interface<T = Record<string, any>> = IFormModel<T>;\n export type Modifier = IFormModifier;\n export type LayoutModifier = ILayoutModifier;\n}\n\n// ---------------------------------------------------------------------------\n// FormModelFactory abstraction\n// ---------------------------------------------------------------------------\n\nexport interface IFormModelFactory {\n create<T = Record<string, any>>(config: IFormModelConfig): IFormModel<T>;\n}\n\nexport interface IFormModelConfig {\n fields: (registry: IFieldBuilderRegistry) => Record<string, IFieldBuilder>;\n layout?: (layout: ILayoutBuilder) => LayoutNode[];\n validateOnSubmit?: boolean;\n}\n\nexport interface ILayoutBuilder {\n row(...fieldIds: string[]): IRowNode;\n separator(): ISeparatorNode;\n tabs(config: { id?: string; renderer?: string; tabs: ITabDefinition[] }): ITabsNode;\n element(renderer: string, props?: Record<string, unknown>): IElementNode;\n}\n\nexport interface IFieldBuilder<TType extends string = string> {\n label(text: string): this;\n help(text: string): this;\n description(text: string): this;\n note(text: string): this;\n placeholder(text: string): this;\n schema(zodSchema: z.ZodTypeAny): this;\n defaultValue(value: unknown): this;\n renderer<TName extends FieldRendererName<TType>>(\n name: TName,\n ...args: undefined extends FieldRendererSettings<TName>\n ? [settings?: FieldRendererSettings<TName>]\n : FieldRendererSettings<TName> extends undefined\n ? []\n : [settings: FieldRendererSettings<TName>]\n ): this;\n hidden(): this;\n required(message?: string): this;\n disabled(value?: boolean): this;\n beforeChange(fn: BeforeChangeCallback): this;\n afterChange(fn: AfterChangeCallback): this;\n afterSetValue(fn: AfterSetValueCallback): this;\n onBlur(fn: OnBlurCallback): this;\n build(name: string): IFieldConfig;\n}\n\nexport interface ISelectFieldBuilder extends IFieldBuilder<\"select\"> {\n options(opts: IValueOption[] | ((form: IFormModel) => IValueOption[])): this;\n}\n\nexport interface IObjectFieldBuilder extends IFieldBuilder<\"object\"> {\n fields(fn: (registry: IFieldBuilderRegistry) => Record<string, IFieldBuilder>): this;\n list(): this;\n listSchema(schema: z.ZodTypeAny): this;\n}\n\nexport interface IFieldBuilderRegistry {\n text(): IFieldBuilder<\"text\">;\n select(): ISelectFieldBuilder;\n object(): IObjectFieldBuilder;\n}\n\nexport const FormModelFactory = createAbstraction<IFormModelFactory>(\"FormModelFactory\");\n\nexport namespace FormModelFactory {\n export type Interface = IFormModelFactory;\n export type Config = IFormModelConfig;\n export type LayoutBuilder = ILayoutBuilder;\n export type FieldBuilder = IFieldBuilder;\n export type SelectFieldBuilder = ISelectFieldBuilder;\n export type ObjectFieldBuilder = IObjectFieldBuilder;\n export type FieldBuilderRegistry = IFieldBuilderRegistry;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,uBAAuB;;AAGzD;AACA;AACA;;AAiBA;AACA;AACA;;AAmGA;AACA;AACA;AACA;;AAaA;AACA;AACA;;AAwBA;AACA;AACA;;AAOA;AACA;AACA;;AAmCA;AACA;AACA;;AAqCA;AACA;AACA;;AAYA;AACA;AACA;AACA;;AAOA;AACA;AACA;;AAiBA;AACA;AACA;;AAcA;AACA;AACA;AAiCA;AACA;AACA;AAAA,WAEiBC,SAAS;AAgC1B;AACA;AACA;;AA6DA,OAAO,MAAMC,gBAAgB,GAAGF,iBAAiB,CAAoB,kBAAkB,CAAC","ignoreList":[]}
@@ -1,10 +1,13 @@
1
1
  export { FormModelFeature } from "./feature.js";
2
+ import "./renderers.js";
2
3
  export { FormModelFactory, FormModel } from "./abstractions.js";
3
- export type { IFormModelFactory, IFormModelConfig, ILayoutBuilder, IFieldBuilder, ISelectFieldBuilder, IFieldBuilderRegistry, IFormModel, IField, ISelectField, FieldTypeMap, IFieldConfig, IFieldVM, IFieldValidation, IFormVM, IFormError, IValueOption, IRowNode, IRowNodeVM, ISeparatorNode, ISeparatorNodeVM, ITabsNode, ITabDefinition, ITabsNodeVM, ITabDefinitionVM, IElementNode, IElementNodeVM, IObjectNode, ILayoutNodeAccessHandle, ITabsHandle, ITabHandle, LayoutNode, LayoutNodeVM, LayoutPosition, IPositionedLayoutNode, ILayoutNodeHandle, ILayoutModifier, IFormModifier, BeforeChangeCallback, AfterChangeCallback, AfterSetValueCallback, OnBlurCallback } from "./abstractions.js";
4
+ export type { IFieldRendererRegistry, FieldRendererName, FieldRendererSettings, IFormModelFactory, IFormModelConfig, ILayoutBuilder, IFieldBuilder, ISelectFieldBuilder, IObjectFieldBuilder, IFieldBuilderRegistry, IFormModel, IField, ISelectField, IObjectField, IObjectFieldConfig, IListItemField, IObjectFieldVM, IObjectFieldItemVM, FieldTypeMap, IFieldConfig, IFieldVM, IFieldValidation, IFormVM, IFormError, IValueOption, IRowNode, IRowNodeVM, ISeparatorNode, ISeparatorNodeVM, ITabsNode, ITabDefinition, ITabsNodeVM, ITabDefinitionVM, IElementNode, IElementNodeVM, ILayoutNodeAccessHandle, ITabsHandle, ITabHandle, LayoutNode, LayoutNodeVM, LayoutPosition, IPositionedLayoutNode, ILayoutNodeHandle, ILayoutModifier, IFormModifier, BeforeChangeCallback, AfterChangeCallback, AfterSetValueCallback, OnBlurCallback } from "./abstractions.js";
4
5
  export { FormModel as FormModelImpl } from "./FormModel.js";
5
6
  export { Field } from "./Field.js";
6
- export { FieldBuilder, TextFieldBuilder, SelectFieldBuilder, createFieldBuilderRegistry } from "./FieldBuilder.js";
7
+ export { FieldBuilder, TextFieldBuilder, SelectFieldBuilder, ObjectFieldBuilder, createFieldBuilderRegistry } from "./FieldBuilder.js";
7
8
  export type { IFieldTypeFactory } from "./FieldBuilder.js";
8
- export { FormView } from "./FormView.js";
9
+ export { ObjectField, isObjectField } from "./ObjectField.js";
10
+ export { FormView, LayoutNodeRenderer, useFormViewRenderers } from "./FormView.js";
9
11
  export { useFieldRenderers } from "./useFieldRenderers.js";
10
- export type { FieldRenderers, FieldRendererComponent } from "./FormView.js";
12
+ export { useLayoutRenderers } from "./useLayoutRenderers.js";
13
+ export type { FieldRenderers, FieldRendererComponent, LayoutRenderers, TabsNodeRendererProps } from "./FormView.js";
@@ -1,14 +1,21 @@
1
1
  // Feature
2
2
  export { FormModelFeature } from "./feature.js";
3
3
 
4
+ // Renderer registry augmentations
5
+ import "./renderers.js";
6
+
4
7
  // Abstractions (types + DI tokens)
5
8
  export { FormModelFactory, FormModel } from "./abstractions.js";
6
9
  // Implementations
7
10
  export { FormModel as FormModelImpl } from "./FormModel.js";
8
11
  export { Field } from "./Field.js";
9
- export { FieldBuilder, TextFieldBuilder, SelectFieldBuilder, createFieldBuilderRegistry } from "./FieldBuilder.js";
12
+ export { FieldBuilder, TextFieldBuilder, SelectFieldBuilder, ObjectFieldBuilder, createFieldBuilderRegistry } from "./FieldBuilder.js";
13
+ // Object field
14
+ export { ObjectField, isObjectField } from "./ObjectField.js";
15
+
10
16
  // View
11
- export { FormView } from "./FormView.js";
17
+ export { FormView, LayoutNodeRenderer, useFormViewRenderers } from "./FormView.js";
12
18
  export { useFieldRenderers } from "./useFieldRenderers.js";
19
+ export { useLayoutRenderers } from "./useLayoutRenderers.js";
13
20
 
14
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["FormModelFeature","FormModelFactory","FormModel","FormModelImpl","Field","FieldBuilder","TextFieldBuilder","SelectFieldBuilder","createFieldBuilderRegistry","FormView","useFieldRenderers"],"sources":["index.ts"],"sourcesContent":["// Feature\nexport { FormModelFeature } from \"./feature.js\";\n\n// Abstractions (types + DI tokens)\nexport { FormModelFactory, FormModel } from \"./abstractions.js\";\nexport type {\n IFormModelFactory,\n IFormModelConfig,\n ILayoutBuilder,\n IFieldBuilder,\n ISelectFieldBuilder,\n IFieldBuilderRegistry,\n IFormModel,\n IField,\n ISelectField,\n FieldTypeMap,\n IFieldConfig,\n IFieldVM,\n IFieldValidation,\n IFormVM,\n IFormError,\n IValueOption,\n IRowNode,\n IRowNodeVM,\n ISeparatorNode,\n ISeparatorNodeVM,\n ITabsNode,\n ITabDefinition,\n ITabsNodeVM,\n ITabDefinitionVM,\n IElementNode,\n IElementNodeVM,\n IObjectNode,\n ILayoutNodeAccessHandle,\n ITabsHandle,\n ITabHandle,\n LayoutNode,\n LayoutNodeVM,\n LayoutPosition,\n IPositionedLayoutNode,\n ILayoutNodeHandle,\n ILayoutModifier,\n IFormModifier,\n BeforeChangeCallback,\n AfterChangeCallback,\n AfterSetValueCallback,\n OnBlurCallback\n} from \"./abstractions.js\";\n\n// Implementations\nexport { FormModel as FormModelImpl } from \"./FormModel.js\";\nexport { Field } from \"./Field.js\";\nexport {\n FieldBuilder,\n TextFieldBuilder,\n SelectFieldBuilder,\n createFieldBuilderRegistry\n} from \"./FieldBuilder.js\";\nexport type { IFieldTypeFactory } from \"./FieldBuilder.js\";\n\n// View\nexport { FormView } from \"./FormView.js\";\nexport { useFieldRenderers } from \"./useFieldRenderers.js\";\nexport type { FieldRenderers, FieldRendererComponent } from \"./FormView.js\";\n"],"mappings":"AAAA;AACA,SAASA,gBAAgB;;AAEzB;AACA,SAASC,gBAAgB,EAAEC,SAAS;AA6CpC;AACA,SAASA,SAAS,IAAIC,aAAa;AACnC,SAASC,KAAK;AACd,SACIC,YAAY,EACZC,gBAAgB,EAChBC,kBAAkB,EAClBC,0BAA0B;AAI9B;AACA,SAASC,QAAQ;AACjB,SAASC,iBAAiB","ignoreList":[]}
1
+ {"version":3,"names":["FormModelFeature","FormModelFactory","FormModel","FormModelImpl","Field","FieldBuilder","TextFieldBuilder","SelectFieldBuilder","ObjectFieldBuilder","createFieldBuilderRegistry","ObjectField","isObjectField","FormView","LayoutNodeRenderer","useFormViewRenderers","useFieldRenderers","useLayoutRenderers"],"sources":["index.ts"],"sourcesContent":["// Feature\nexport { FormModelFeature } from \"./feature.js\";\n\n// Renderer registry augmentations\nimport \"./renderers.js\";\n\n// Abstractions (types + DI tokens)\nexport { FormModelFactory, FormModel } from \"./abstractions.js\";\nexport type {\n IFieldRendererRegistry,\n FieldRendererName,\n FieldRendererSettings,\n IFormModelFactory,\n IFormModelConfig,\n ILayoutBuilder,\n IFieldBuilder,\n ISelectFieldBuilder,\n IObjectFieldBuilder,\n IFieldBuilderRegistry,\n IFormModel,\n IField,\n ISelectField,\n IObjectField,\n IObjectFieldConfig,\n IListItemField,\n IObjectFieldVM,\n IObjectFieldItemVM,\n FieldTypeMap,\n IFieldConfig,\n IFieldVM,\n IFieldValidation,\n IFormVM,\n IFormError,\n IValueOption,\n IRowNode,\n IRowNodeVM,\n ISeparatorNode,\n ISeparatorNodeVM,\n ITabsNode,\n ITabDefinition,\n ITabsNodeVM,\n ITabDefinitionVM,\n IElementNode,\n IElementNodeVM,\n ILayoutNodeAccessHandle,\n ITabsHandle,\n ITabHandle,\n LayoutNode,\n LayoutNodeVM,\n LayoutPosition,\n IPositionedLayoutNode,\n ILayoutNodeHandle,\n ILayoutModifier,\n IFormModifier,\n BeforeChangeCallback,\n AfterChangeCallback,\n AfterSetValueCallback,\n OnBlurCallback\n} from \"./abstractions.js\";\n\n// Implementations\nexport { FormModel as FormModelImpl } from \"./FormModel.js\";\nexport { Field } from \"./Field.js\";\nexport {\n FieldBuilder,\n TextFieldBuilder,\n SelectFieldBuilder,\n ObjectFieldBuilder,\n createFieldBuilderRegistry\n} from \"./FieldBuilder.js\";\nexport type { IFieldTypeFactory } from \"./FieldBuilder.js\";\n\n// Object field\nexport { ObjectField, isObjectField } from \"./ObjectField.js\";\n\n// View\nexport { FormView, LayoutNodeRenderer, useFormViewRenderers } from \"./FormView.js\";\nexport { useFieldRenderers } from \"./useFieldRenderers.js\";\nexport { useLayoutRenderers } from \"./useLayoutRenderers.js\";\nexport type {\n FieldRenderers,\n FieldRendererComponent,\n LayoutRenderers,\n TabsNodeRendererProps\n} from \"./FormView.js\";\n"],"mappings":"AAAA;AACA,SAASA,gBAAgB;;AAEzB;AACA;;AAEA;AACA,SAASC,gBAAgB,EAAEC,SAAS;AAqDpC;AACA,SAASA,SAAS,IAAIC,aAAa;AACnC,SAASC,KAAK;AACd,SACIC,YAAY,EACZC,gBAAgB,EAChBC,kBAAkB,EAClBC,kBAAkB,EAClBC,0BAA0B;AAI9B;AACA,SAASC,WAAW,EAAEC,aAAa;;AAEnC;AACA,SAASC,QAAQ,EAAEC,kBAAkB,EAAEC,oBAAoB;AAC3D,SAASC,iBAAiB;AAC1B,SAASC,kBAAkB","ignoreList":[]}
@@ -0,0 +1,6 @@
1
+ import "../../base/Base/FieldRenderers/InputRenderer.js";
2
+ import "../../base/Base/FieldRenderers/SelectRenderer.js";
3
+ import "../../base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js";
4
+ import "../../base/Base/FieldRenderers/ObjectRenderer/ObjectListFlatRenderer.js";
5
+ import "../../base/Base/FieldRenderers/PassthroughRenderer.js";
6
+ import "../../base/Base/FieldRenderers/TextareaRenderer.js";
@@ -0,0 +1,10 @@
1
+ // Side-effect imports to pull in IFieldRendererRegistry augmentations.
2
+ // Each renderer file declares its registry entry via `declare module`.
3
+ import "../../base/Base/FieldRenderers/InputRenderer.js";
4
+ import "../../base/Base/FieldRenderers/SelectRenderer.js";
5
+ import "../../base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js";
6
+ import "../../base/Base/FieldRenderers/ObjectRenderer/ObjectListFlatRenderer.js";
7
+ import "../../base/Base/FieldRenderers/PassthroughRenderer.js";
8
+ import "../../base/Base/FieldRenderers/TextareaRenderer.js";
9
+
10
+ //# sourceMappingURL=renderers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["renderers.ts"],"sourcesContent":["// Side-effect imports to pull in IFieldRendererRegistry augmentations.\n// Each renderer file declares its registry entry via `declare module`.\nimport \"../../base/Base/FieldRenderers/InputRenderer.js\";\nimport \"../../base/Base/FieldRenderers/SelectRenderer.js\";\nimport \"../../base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js\";\nimport \"../../base/Base/FieldRenderers/ObjectRenderer/ObjectListFlatRenderer.js\";\nimport \"../../base/Base/FieldRenderers/PassthroughRenderer.js\";\nimport \"../../base/Base/FieldRenderers/TextareaRenderer.js\";\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ import type { LayoutRenderers } from "./FormView.js";
2
+ export declare const useLayoutRenderers: () => LayoutRenderers;
@@ -0,0 +1,19 @@
1
+ import { useMemo } from "react";
2
+ import { useAdminConfig } from "../../config/AdminConfig.js";
3
+ export const useLayoutRenderers = () => {
4
+ const {
5
+ layoutRenderers
6
+ } = useAdminConfig();
7
+ return useMemo(() => {
8
+ const map = {};
9
+ for (const {
10
+ name,
11
+ component
12
+ } of layoutRenderers) {
13
+ map[name] = component;
14
+ }
15
+ return map;
16
+ }, [layoutRenderers]);
17
+ };
18
+
19
+ //# sourceMappingURL=useLayoutRenderers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useMemo","useAdminConfig","useLayoutRenderers","layoutRenderers","map","name","component"],"sources":["useLayoutRenderers.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport { useAdminConfig } from \"../../config/AdminConfig.js\";\nimport type { LayoutRenderers } from \"./FormView.js\";\n\nexport const useLayoutRenderers = (): LayoutRenderers => {\n const { layoutRenderers } = useAdminConfig();\n\n return useMemo(() => {\n const map: LayoutRenderers = {};\n for (const { name, component } of layoutRenderers) {\n map[name] = component;\n }\n return map;\n }, [layoutRenderers]);\n};\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SAASC,cAAc;AAGvB,OAAO,MAAMC,kBAAkB,GAAGA,CAAA,KAAuB;EACrD,MAAM;IAAEC;EAAgB,CAAC,GAAGF,cAAc,CAAC,CAAC;EAE5C,OAAOD,OAAO,CAAC,MAAM;IACjB,MAAMI,GAAoB,GAAG,CAAC,CAAC;IAC/B,KAAK,MAAM;MAAEC,IAAI;MAAEC;IAAU,CAAC,IAAIH,eAAe,EAAE;MAC/CC,GAAG,CAACC,IAAI,CAAC,GAAGC,SAAS;IACzB;IACA,OAAOF,GAAG;EACd,CAAC,EAAE,CAACD,eAAe,CAAC,CAAC;AACzB,CAAC","ignoreList":[]}
@@ -0,0 +1,10 @@
1
+ import { type IToolPipelineRunner, type IToolRegistry } from "./abstractions.js";
2
+ declare class PipelineRunnerImpl implements IToolPipelineRunner {
3
+ private toolRegistry;
4
+ constructor(toolRegistry: IToolRegistry);
5
+ resolve(data: unknown): Promise<unknown>;
6
+ }
7
+ export declare const ToolPipelineRunner: typeof PipelineRunnerImpl & {
8
+ __abstraction: import("@webiny/di").Abstraction<IToolPipelineRunner>;
9
+ };
10
+ export {};
@@ -0,0 +1,33 @@
1
+ import { ToolPipelineRunner as Abstraction, ToolRegistry } from "./abstractions.js";
2
+ function isToolEnvelope(value) {
3
+ return typeof value === "object" && value !== null && "tool" in value && typeof value.tool === "string" && "params" in value && typeof value.params === "object";
4
+ }
5
+ class PipelineRunnerImpl {
6
+ constructor(toolRegistry) {
7
+ this.toolRegistry = toolRegistry;
8
+ }
9
+ async resolve(data) {
10
+ if (data === null || data === undefined) {
11
+ return data;
12
+ }
13
+ if (isToolEnvelope(data)) {
14
+ const result = await this.toolRegistry.invoke(data.tool, data.params);
15
+ return this.resolve(result);
16
+ }
17
+ if (Array.isArray(data)) {
18
+ return Promise.all(data.map(item => this.resolve(item)));
19
+ }
20
+ if (typeof data === "object") {
21
+ const entries = Object.entries(data);
22
+ const resolvedValues = await Promise.all(entries.map(([, value]) => this.resolve(value)));
23
+ return Object.fromEntries(entries.map(([key], i) => [key, resolvedValues[i]]));
24
+ }
25
+ return data;
26
+ }
27
+ }
28
+ export const ToolPipelineRunner = Abstraction.createImplementation({
29
+ implementation: PipelineRunnerImpl,
30
+ dependencies: [ToolRegistry]
31
+ });
32
+
33
+ //# sourceMappingURL=ToolPipelineRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["ToolPipelineRunner","Abstraction","ToolRegistry","isToolEnvelope","value","tool","params","PipelineRunnerImpl","constructor","toolRegistry","resolve","data","undefined","result","invoke","Array","isArray","Promise","all","map","item","entries","Object","resolvedValues","fromEntries","key","i","createImplementation","implementation","dependencies"],"sources":["ToolPipelineRunner.ts"],"sourcesContent":["import {\n ToolPipelineRunner as Abstraction,\n ToolRegistry,\n type IToolPipelineRunner,\n type IToolRegistry\n} from \"./abstractions.js\";\n\nfunction isToolEnvelope(\n value: unknown\n): value is { tool: string; params: Record<string, unknown> } {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"tool\" in value &&\n typeof (value as Record<string, unknown>).tool === \"string\" &&\n \"params\" in value &&\n typeof (value as Record<string, unknown>).params === \"object\"\n );\n}\n\nclass PipelineRunnerImpl implements IToolPipelineRunner {\n constructor(private toolRegistry: IToolRegistry) {}\n\n async resolve(data: unknown): Promise<unknown> {\n if (data === null || data === undefined) {\n return data;\n }\n\n if (isToolEnvelope(data)) {\n const result = await this.toolRegistry.invoke(data.tool, data.params);\n return this.resolve(result);\n }\n\n if (Array.isArray(data)) {\n return Promise.all(data.map(item => this.resolve(item)));\n }\n\n if (typeof data === \"object\") {\n const entries = Object.entries(data as Record<string, unknown>);\n const resolvedValues = await Promise.all(\n entries.map(([, value]) => this.resolve(value))\n );\n return Object.fromEntries(entries.map(([key], i) => [key, resolvedValues[i]]));\n }\n\n return data;\n }\n}\n\nexport const ToolPipelineRunner = Abstraction.createImplementation({\n implementation: PipelineRunnerImpl,\n dependencies: [ToolRegistry]\n});\n"],"mappings":"AAAA,SACIA,kBAAkB,IAAIC,WAAW,EACjCC,YAAY;AAKhB,SAASC,cAAcA,CACnBC,KAAc,EAC4C;EAC1D,OACI,OAAOA,KAAK,KAAK,QAAQ,IACzBA,KAAK,KAAK,IAAI,IACd,MAAM,IAAIA,KAAK,IACf,OAAQA,KAAK,CAA6BC,IAAI,KAAK,QAAQ,IAC3D,QAAQ,IAAID,KAAK,IACjB,OAAQA,KAAK,CAA6BE,MAAM,KAAK,QAAQ;AAErE;AAEA,MAAMC,kBAAkB,CAAgC;EACpDC,WAAWA,CAASC,YAA2B,EAAE;IAAA,KAA7BA,YAA2B,GAA3BA,YAA2B;EAAG;EAElD,MAAMC,OAAOA,CAACC,IAAa,EAAoB;IAC3C,IAAIA,IAAI,KAAK,IAAI,IAAIA,IAAI,KAAKC,SAAS,EAAE;MACrC,OAAOD,IAAI;IACf;IAEA,IAAIR,cAAc,CAACQ,IAAI,CAAC,EAAE;MACtB,MAAME,MAAM,GAAG,MAAM,IAAI,CAACJ,YAAY,CAACK,MAAM,CAACH,IAAI,CAACN,IAAI,EAAEM,IAAI,CAACL,MAAM,CAAC;MACrE,OAAO,IAAI,CAACI,OAAO,CAACG,MAAM,CAAC;IAC/B;IAEA,IAAIE,KAAK,CAACC,OAAO,CAACL,IAAI,CAAC,EAAE;MACrB,OAAOM,OAAO,CAACC,GAAG,CAACP,IAAI,CAACQ,GAAG,CAACC,IAAI,IAAI,IAAI,CAACV,OAAO,CAACU,IAAI,CAAC,CAAC,CAAC;IAC5D;IAEA,IAAI,OAAOT,IAAI,KAAK,QAAQ,EAAE;MAC1B,MAAMU,OAAO,GAAGC,MAAM,CAACD,OAAO,CAACV,IAA+B,CAAC;MAC/D,MAAMY,cAAc,GAAG,MAAMN,OAAO,CAACC,GAAG,CACpCG,OAAO,CAACF,GAAG,CAAC,CAAC,GAAGf,KAAK,CAAC,KAAK,IAAI,CAACM,OAAO,CAACN,KAAK,CAAC,CAClD,CAAC;MACD,OAAOkB,MAAM,CAACE,WAAW,CAACH,OAAO,CAACF,GAAG,CAAC,CAAC,CAACM,GAAG,CAAC,EAAEC,CAAC,KAAK,CAACD,GAAG,EAAEF,cAAc,CAACG,CAAC,CAAC,CAAC,CAAC,CAAC;IAClF;IAEA,OAAOf,IAAI;EACf;AACJ;AAEA,OAAO,MAAMX,kBAAkB,GAAGC,WAAW,CAAC0B,oBAAoB,CAAC;EAC/DC,cAAc,EAAErB,kBAAkB;EAClCsB,YAAY,EAAE,CAAC3B,YAAY;AAC/B,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,12 @@
1
+ import { type ITool, type IToolRegistry } from "./abstractions.js";
2
+ declare class ToolRegistryImpl implements IToolRegistry {
3
+ private toolMap;
4
+ constructor(tools: ITool[]);
5
+ getTool(name: string): ITool;
6
+ getTools(): ITool[];
7
+ invoke(name: string, params: unknown): Promise<unknown>;
8
+ }
9
+ export declare const ToolRegistry: typeof ToolRegistryImpl & {
10
+ __abstraction: import("@webiny/di").Abstraction<IToolRegistry>;
11
+ };
12
+ export {};
@@ -0,0 +1,29 @@
1
+ import { Tool, ToolRegistry as ToolRegistryAbstraction } from "./abstractions.js";
2
+ class ToolRegistryImpl {
3
+ constructor(tools) {
4
+ this.toolMap = new Map(tools.map(t => [t.name, t]));
5
+ }
6
+ getTool(name) {
7
+ const tool = this.toolMap.get(name);
8
+ if (!tool) {
9
+ throw new Error(`Tool "${name}" is not registered.`);
10
+ }
11
+ return tool;
12
+ }
13
+ getTools() {
14
+ return [...this.toolMap.values()];
15
+ }
16
+ async invoke(name, params) {
17
+ const tool = this.getTool(name);
18
+ const validated = tool.inputSchema.parse(params);
19
+ return tool.execute(validated);
20
+ }
21
+ }
22
+ export const ToolRegistry = ToolRegistryAbstraction.createImplementation({
23
+ implementation: ToolRegistryImpl,
24
+ dependencies: [[Tool, {
25
+ multiple: true
26
+ }]]
27
+ });
28
+
29
+ //# sourceMappingURL=ToolRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Tool","ToolRegistry","ToolRegistryAbstraction","ToolRegistryImpl","constructor","tools","toolMap","Map","map","t","name","getTool","tool","get","Error","getTools","values","invoke","params","validated","inputSchema","parse","execute","createImplementation","implementation","dependencies","multiple"],"sources":["ToolRegistry.ts"],"sourcesContent":["import {\n Tool,\n ToolRegistry as ToolRegistryAbstraction,\n type ITool,\n type IToolRegistry\n} from \"./abstractions.js\";\n\nclass ToolRegistryImpl implements IToolRegistry {\n private toolMap: Map<string, ITool>;\n\n constructor(tools: ITool[]) {\n this.toolMap = new Map(tools.map(t => [t.name, t]));\n }\n\n getTool(name: string): ITool {\n const tool = this.toolMap.get(name);\n if (!tool) {\n throw new Error(`Tool \"${name}\" is not registered.`);\n }\n return tool;\n }\n\n getTools(): ITool[] {\n return [...this.toolMap.values()];\n }\n\n async invoke(name: string, params: unknown): Promise<unknown> {\n const tool = this.getTool(name);\n const validated = tool.inputSchema.parse(params);\n return tool.execute(validated);\n }\n}\n\nexport const ToolRegistry = ToolRegistryAbstraction.createImplementation({\n implementation: ToolRegistryImpl,\n dependencies: [[Tool, { multiple: true }]]\n});\n"],"mappings":"AAAA,SACIA,IAAI,EACJC,YAAY,IAAIC,uBAAuB;AAK3C,MAAMC,gBAAgB,CAA0B;EAG5CC,WAAWA,CAACC,KAAc,EAAE;IACxB,IAAI,CAACC,OAAO,GAAG,IAAIC,GAAG,CAACF,KAAK,CAACG,GAAG,CAACC,CAAC,IAAI,CAACA,CAAC,CAACC,IAAI,EAAED,CAAC,CAAC,CAAC,CAAC;EACvD;EAEAE,OAAOA,CAACD,IAAY,EAAS;IACzB,MAAME,IAAI,GAAG,IAAI,CAACN,OAAO,CAACO,GAAG,CAACH,IAAI,CAAC;IACnC,IAAI,CAACE,IAAI,EAAE;MACP,MAAM,IAAIE,KAAK,CAAC,SAASJ,IAAI,sBAAsB,CAAC;IACxD;IACA,OAAOE,IAAI;EACf;EAEAG,QAAQA,CAAA,EAAY;IAChB,OAAO,CAAC,GAAG,IAAI,CAACT,OAAO,CAACU,MAAM,CAAC,CAAC,CAAC;EACrC;EAEA,MAAMC,MAAMA,CAACP,IAAY,EAAEQ,MAAe,EAAoB;IAC1D,MAAMN,IAAI,GAAG,IAAI,CAACD,OAAO,CAACD,IAAI,CAAC;IAC/B,MAAMS,SAAS,GAAGP,IAAI,CAACQ,WAAW,CAACC,KAAK,CAACH,MAAM,CAAC;IAChD,OAAON,IAAI,CAACU,OAAO,CAACH,SAAS,CAAC;EAClC;AACJ;AAEA,OAAO,MAAMlB,YAAY,GAAGC,uBAAuB,CAACqB,oBAAoB,CAAC;EACrEC,cAAc,EAAErB,gBAAgB;EAChCsB,YAAY,EAAE,CAAC,CAACzB,IAAI,EAAE;IAAE0B,QAAQ,EAAE;EAAK,CAAC,CAAC;AAC7C,CAAC,CAAC","ignoreList":[]}