@webiny/website-builder-sdk 0.0.0-unstable.e6f0dc8ca7 → 0.0.0-unstable.eb81deee7e

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 (272) hide show
  1. package/BindingsApi.js +29 -36
  2. package/BindingsApi.js.map +1 -1
  3. package/BindingsProcessor.js +34 -43
  4. package/BindingsProcessor.js.map +1 -1
  5. package/BindingsProcessor.test.js +82 -78
  6. package/BindingsProcessor.test.js.map +1 -1
  7. package/BindingsResolver.d.ts +4 -1
  8. package/BindingsResolver.js +99 -119
  9. package/BindingsResolver.js.map +1 -1
  10. package/BindingsResolver.test.js +399 -363
  11. package/BindingsResolver.test.js.map +1 -1
  12. package/ComponentInputTraverser.js +32 -49
  13. package/ComponentInputTraverser.js.map +1 -1
  14. package/ComponentManifestToAstConverter.js +20 -21
  15. package/ComponentManifestToAstConverter.js.map +1 -1
  16. package/ComponentRegistry.d.ts +9 -0
  17. package/ComponentRegistry.js +30 -44
  18. package/ComponentRegistry.js.map +1 -1
  19. package/ComponentResolver.d.ts +3 -2
  20. package/ComponentResolver.js +39 -29
  21. package/ComponentResolver.js.map +1 -1
  22. package/ComponentResolver.test.d.ts +1 -0
  23. package/ComponentResolver.test.js +81 -0
  24. package/ComponentResolver.test.js.map +1 -0
  25. package/ConstraintEvaluator.js +246 -353
  26. package/ConstraintEvaluator.js.map +1 -1
  27. package/ConstraintEvaluator.test.js +1616 -1438
  28. package/ConstraintEvaluator.test.js.map +1 -1
  29. package/ContentSdk.d.ts +14 -0
  30. package/ContentSdk.js +113 -90
  31. package/ContentSdk.js.map +1 -1
  32. package/DocumentStore.js +47 -59
  33. package/DocumentStore.js.map +1 -1
  34. package/DocumentStoreManager.js +17 -16
  35. package/DocumentStoreManager.js.map +1 -1
  36. package/EditingSdk.js +92 -121
  37. package/EditingSdk.js.map +1 -1
  38. package/ElementFactory.js +164 -172
  39. package/ElementFactory.js.map +1 -1
  40. package/ElementFactory.objectListDefaults.test.d.ts +1 -0
  41. package/ElementFactory.objectListDefaults.test.js +423 -0
  42. package/ElementFactory.objectListDefaults.test.js.map +1 -0
  43. package/ElementFactory.test.js +335 -262
  44. package/ElementFactory.test.js.map +1 -1
  45. package/Environment.js +18 -19
  46. package/Environment.js.map +1 -1
  47. package/FunctionConverter.js +8 -7
  48. package/FunctionConverter.js.map +1 -1
  49. package/HashObject.js +11 -26
  50. package/HashObject.js.map +1 -1
  51. package/HotkeyManager.js +40 -47
  52. package/HotkeyManager.js.map +1 -1
  53. package/IBindingsUpdater.js +0 -3
  54. package/IRedirects.js +0 -3
  55. package/InheritanceProcessor.js +99 -139
  56. package/InheritanceProcessor.js.map +1 -1
  57. package/InheritanceProcessor.test.js +178 -179
  58. package/InheritanceProcessor.test.js.map +1 -1
  59. package/InheritedValueResolver.d.ts +18 -1
  60. package/InheritedValueResolver.js +18 -20
  61. package/InheritedValueResolver.js.map +1 -1
  62. package/InputBindingsProcessor.d.ts +23 -2
  63. package/InputBindingsProcessor.js +200 -307
  64. package/InputBindingsProcessor.js.map +1 -1
  65. package/InputBindingsProcessorTokens.test.d.ts +1 -0
  66. package/InputBindingsProcessorTokens.test.js +400 -0
  67. package/InputBindingsProcessorTokens.test.js.map +1 -0
  68. package/InputsBindingsProcessor.test.js +334 -315
  69. package/InputsBindingsProcessor.test.js.map +1 -1
  70. package/InputsUpdater.js +23 -26
  71. package/InputsUpdater.js.map +1 -1
  72. package/LiveSdk.js +12 -13
  73. package/LiveSdk.js.map +1 -1
  74. package/Logger.js +9 -8
  75. package/Logger.js.map +1 -1
  76. package/MouseTracker.js +77 -83
  77. package/MouseTracker.js.map +1 -1
  78. package/NullSdk.js +22 -21
  79. package/NullSdk.js.map +1 -1
  80. package/PreviewDocument.d.ts +1 -0
  81. package/PreviewDocument.js +30 -30
  82. package/PreviewDocument.js.map +1 -1
  83. package/PreviewSdk.d.ts +2 -1
  84. package/PreviewSdk.js +19 -17
  85. package/PreviewSdk.js.map +1 -1
  86. package/PreviewViewport.js +51 -63
  87. package/PreviewViewport.js.map +1 -1
  88. package/ResizeObserver.js +24 -31
  89. package/ResizeObserver.js.map +1 -1
  90. package/StylesBindingsProcessor.d.ts +12 -2
  91. package/StylesBindingsProcessor.js +62 -79
  92. package/StylesBindingsProcessor.js.map +1 -1
  93. package/StylesUpdater.js +20 -25
  94. package/StylesUpdater.js.map +1 -1
  95. package/Theme.js +30 -25
  96. package/Theme.js.map +1 -1
  97. package/ViewportManager.js +89 -101
  98. package/ViewportManager.js.map +1 -1
  99. package/assertBindingShapes.d.ts +31 -0
  100. package/assertBindingShapes.js +64 -0
  101. package/assertBindingShapes.js.map +1 -0
  102. package/assertBindingShapes.test.d.ts +1 -0
  103. package/assertBindingShapes.test.js +131 -0
  104. package/assertBindingShapes.test.js.map +1 -0
  105. package/asset/deliveryUrl.d.ts +41 -0
  106. package/asset/deliveryUrl.js +34 -0
  107. package/asset/deliveryUrl.js.map +1 -0
  108. package/asset/deliveryUrl.test.d.ts +1 -0
  109. package/asset/deliveryUrl.test.js +127 -0
  110. package/asset/deliveryUrl.test.js.map +1 -0
  111. package/asset/geometry.d.ts +7 -0
  112. package/asset/geometry.js +10 -0
  113. package/asset/geometry.js.map +1 -0
  114. package/asset/imageSrcSet.d.ts +63 -0
  115. package/asset/imageSrcSet.js +98 -0
  116. package/asset/imageSrcSet.js.map +1 -0
  117. package/asset/imageSrcSet.test.d.ts +1 -0
  118. package/asset/imageSrcSet.test.js +103 -0
  119. package/asset/imageSrcSet.test.js.map +1 -0
  120. package/asset/index.d.ts +5 -0
  121. package/asset/index.js +5 -0
  122. package/asset/normalize.d.ts +24 -0
  123. package/asset/normalize.js +106 -0
  124. package/asset/normalize.js.map +1 -0
  125. package/asset/normalize.test.d.ts +1 -0
  126. package/asset/normalize.test.js +263 -0
  127. package/asset/normalize.test.js.map +1 -0
  128. package/asset/types.d.ts +2 -0
  129. package/asset/types.js +0 -0
  130. package/constants.js +7 -6
  131. package/constants.js.map +1 -1
  132. package/contentEntry/ContentEntryBindingsResolver.d.ts +30 -0
  133. package/contentEntry/ContentEntryBindingsResolver.js +45 -0
  134. package/contentEntry/ContentEntryBindingsResolver.js.map +1 -0
  135. package/contentEntry/ContentEntryCache.d.ts +46 -0
  136. package/contentEntry/ContentEntryCache.js +50 -0
  137. package/contentEntry/ContentEntryCache.js.map +1 -0
  138. package/contentEntry/resolveContentEntry.d.ts +74 -0
  139. package/contentEntry/resolveContentEntry.js +53 -0
  140. package/contentEntry/resolveContentEntry.js.map +1 -0
  141. package/contentEntry/resolveContentEntry.test.d.ts +1 -0
  142. package/contentEntry/resolveContentEntry.test.js +213 -0
  143. package/contentEntry/resolveContentEntry.test.js.map +1 -0
  144. package/createComponent.d.ts +5 -0
  145. package/createComponent.js +32 -0
  146. package/createComponent.js.map +1 -0
  147. package/createElement.js +5 -6
  148. package/createElement.js.map +1 -1
  149. package/createInput.d.ts +10 -2
  150. package/createInput.js +92 -143
  151. package/createInput.js.map +1 -1
  152. package/createTheme.js +2 -3
  153. package/createTheme.js.map +1 -1
  154. package/dataProviders/ApiClient.d.ts +10 -5
  155. package/dataProviders/ApiClient.js +40 -49
  156. package/dataProviders/ApiClient.js.map +1 -1
  157. package/dataProviders/DefaultDataProvider.d.ts +4 -0
  158. package/dataProviders/DefaultDataProvider.js +91 -58
  159. package/dataProviders/DefaultDataProvider.js.map +1 -1
  160. package/dataProviders/GET_EXPERIMENT_PAUSED.d.ts +1 -0
  161. package/dataProviders/GET_EXPERIMENT_PAUSED.js +17 -0
  162. package/dataProviders/GET_EXPERIMENT_PAUSED.js.map +1 -0
  163. package/dataProviders/GET_PAGE_BY_ID.js +2 -1
  164. package/dataProviders/GET_PAGE_BY_ID.js.map +1 -1
  165. package/dataProviders/GET_PAGE_BY_PATH.js +2 -1
  166. package/dataProviders/GET_PAGE_BY_PATH.js.map +1 -1
  167. package/dataProviders/GET_PAGE_EXPERIMENT.d.ts +1 -0
  168. package/dataProviders/GET_PAGE_EXPERIMENT.js +32 -0
  169. package/dataProviders/GET_PAGE_EXPERIMENT.js.map +1 -0
  170. package/dataProviders/GET_VARIANT_CONTENT.d.ts +1 -0
  171. package/dataProviders/GET_VARIANT_CONTENT.js +24 -0
  172. package/dataProviders/GET_VARIANT_CONTENT.js.map +1 -0
  173. package/dataProviders/LIST_PUBLISHED_PAGES.js +2 -1
  174. package/dataProviders/LIST_PUBLISHED_PAGES.js.map +1 -1
  175. package/dataProviders/NullDataProvider.d.ts +4 -0
  176. package/dataProviders/NullDataProvider.js +30 -20
  177. package/dataProviders/NullDataProvider.js.map +1 -1
  178. package/dataProviders/RedirectsProvider.js +24 -27
  179. package/dataProviders/RedirectsProvider.js.map +1 -1
  180. package/defaultBreakpoints.js +43 -22
  181. package/defaultBreakpoints.js.map +1 -1
  182. package/documentOperations/$addElementReferenceToParent.js +29 -32
  183. package/documentOperations/$addElementReferenceToParent.js.map +1 -1
  184. package/documentOperations/AddElement.js +8 -7
  185. package/documentOperations/AddElement.js.map +1 -1
  186. package/documentOperations/AddToParent.js +14 -13
  187. package/documentOperations/AddToParent.js.map +1 -1
  188. package/documentOperations/IDocumentOperation.js +0 -3
  189. package/documentOperations/RemoveElement.js +9 -15
  190. package/documentOperations/RemoveElement.js.map +1 -1
  191. package/documentOperations/SetGlobalInputBinding.js +23 -22
  192. package/documentOperations/SetGlobalInputBinding.js.map +1 -1
  193. package/documentOperations/SetGlobalStyleBinding.js +23 -23
  194. package/documentOperations/SetGlobalStyleBinding.js.map +1 -1
  195. package/documentOperations/SetInputBindingOverride.js +30 -29
  196. package/documentOperations/SetInputBindingOverride.js.map +1 -1
  197. package/documentOperations/SetStyleBindingOverride.js +30 -31
  198. package/documentOperations/SetStyleBindingOverride.js.map +1 -1
  199. package/documentOperations/index.js +9 -8
  200. package/documentOperations/index.js.map +1 -1
  201. package/experiments/PostHogAnalyticsProvider.d.ts +31 -0
  202. package/experiments/PostHogAnalyticsProvider.js +28 -0
  203. package/experiments/PostHogAnalyticsProvider.js.map +1 -0
  204. package/experiments/analyticsProvider.d.ts +4 -0
  205. package/experiments/analyticsProvider.js +11 -0
  206. package/experiments/analyticsProvider.js.map +1 -0
  207. package/experiments/bucketing.d.ts +27 -0
  208. package/experiments/bucketing.js +91 -0
  209. package/experiments/bucketing.js.map +1 -0
  210. package/experiments/bucketing.test.d.ts +1 -0
  211. package/experiments/bucketing.test.js +183 -0
  212. package/experiments/bucketing.test.js.map +1 -0
  213. package/experiments/index.d.ts +5 -0
  214. package/experiments/index.js +5 -0
  215. package/experiments/render.d.ts +79 -0
  216. package/experiments/render.js +149 -0
  217. package/experiments/render.js.map +1 -0
  218. package/experiments/types.d.ts +108 -0
  219. package/experiments/types.js +4 -0
  220. package/experiments/types.js.map +1 -0
  221. package/findMatchingAstNode.js +11 -13
  222. package/findMatchingAstNode.js.map +1 -1
  223. package/generateElementId.js +2 -1
  224. package/generateElementId.js.map +1 -1
  225. package/headersProvider.js +4 -3
  226. package/headersProvider.js.map +1 -1
  227. package/image/geometry.d.ts +54 -0
  228. package/image/geometry.js +112 -0
  229. package/image/geometry.js.map +1 -0
  230. package/image/geometry.test.d.ts +1 -0
  231. package/image/geometry.test.js +190 -0
  232. package/image/geometry.test.js.map +1 -0
  233. package/image/index.d.ts +3 -0
  234. package/image/index.js +3 -0
  235. package/image/presets.d.ts +6 -0
  236. package/image/presets.js +20 -0
  237. package/image/presets.js.map +1 -0
  238. package/image/types.d.ts +10 -0
  239. package/image/types.js +0 -0
  240. package/index.d.ts +10 -0
  241. package/index.js +10 -2
  242. package/jsonPatch.js +5 -9
  243. package/jsonPatch.js.map +1 -1
  244. package/messages.js +12 -11
  245. package/messages.js.map +1 -1
  246. package/messenger/MessageOrigin.js +12 -11
  247. package/messenger/MessageOrigin.js.map +1 -1
  248. package/messenger/Messenger.js +58 -69
  249. package/messenger/Messenger.js.map +1 -1
  250. package/messenger/index.js +0 -2
  251. package/package.json +12 -9
  252. package/registerComponentGroup.js +5 -6
  253. package/registerComponentGroup.js.map +1 -1
  254. package/tokenBinding.d.ts +26 -0
  255. package/tokenBinding.js +15 -0
  256. package/tokenBinding.js.map +1 -0
  257. package/tokenBinding.test.d.ts +1 -0
  258. package/tokenBinding.test.js +165 -0
  259. package/tokenBinding.test.js.map +1 -0
  260. package/types/ShorthandCssProperties.js +0 -3
  261. package/types/WebsiteBuilderTheme.d.ts +12 -0
  262. package/types/WebsiteBuilderTheme.js +0 -3
  263. package/types.d.ts +96 -1
  264. package/types.js +0 -3
  265. package/IBindingsUpdater.js.map +0 -1
  266. package/IRedirects.js.map +0 -1
  267. package/documentOperations/IDocumentOperation.js.map +0 -1
  268. package/index.js.map +0 -1
  269. package/messenger/index.js.map +0 -1
  270. package/types/ShorthandCssProperties.js.map +0 -1
  271. package/types/WebsiteBuilderTheme.js.map +0 -1
  272. package/types.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"names":["generateElementId","DocumentOperations","ComponentManifestToAstConverter","ComponentInputTraverser","defaultStyles","display","flexDirection","withDefaultStyles","styles","defaultOperations","addElement","element","AddElement","addToParent","index","AddToParent","setInputBinding","elementId","bindingPath","binding","SetGlobalInputBinding","setStyleBinding","SetGlobalStyleBinding","ElementFactory","constructor","components","createElementFromComponent","componentName","parentId","slot","bindings","componentManifest","inputsAst","createElement","documentOps","push","generateOperations","inputs","defaults","overrides","operations","ops","generateOperationsFromBindings","id","ignoreDefaultValues","breakpoint","Object","entries","SetInputBindingOverride","SetStyleBindingOverride","inputData","traverser","traverse","node","path","value","isCreateElement","action","isList","list","isObject","type","factory","newElement","params","component","undefined","newElementId","translatable","input","static","defaultValue","key","getComponentManifest","manifest","Error","parent","name","convert"],"sources":["ElementFactory.ts"],"sourcesContent":["import { generateElementId } from \"./generateElementId.js\";\nimport type {\n DocumentElement,\n ComponentManifest,\n InputValueBinding,\n StyleValueBinding,\n CssProperties\n} from \"~/types.js\";\nimport { type IDocumentOperation, DocumentOperations } from \"./documentOperations/index.js\";\nimport {\n ComponentManifestToAstConverter,\n type InputAstNode\n} from \"./ComponentManifestToAstConverter.js\";\nimport { ComponentInputTraverser } from \"./ComponentInputTraverser.js\";\n\nconst defaultStyles = {\n display: \"flex\",\n flexDirection: \"column\"\n};\n\nconst withDefaultStyles = (styles: CssProperties) => {\n return { ...defaultStyles, ...styles };\n};\n\nexport interface ElementFactoryCreateElementParams {\n componentName: string;\n parentId: string;\n slot: string;\n index?: number;\n bindings?: {\n inputs?: Record<string, any>;\n styles?: Record<string, any>;\n overrides?: {\n [breakpoint: string]: {\n inputs?: Record<string, any>;\n styles?: Record<string, any>;\n };\n };\n };\n}\n\ninterface GenerateOperationsParams {\n element: DocumentElement;\n inputsAst: InputAstNode[];\n operations: ElementFactoryOperations;\n bindings: {\n inputs: Record<string, any>;\n styles: Record<string, any>;\n overrides: {\n [breakpoint: string]: {\n inputs?: Record<string, any>;\n styles?: Record<string, any>;\n };\n };\n };\n}\n\ninterface GenerateOperationsFromBindingsParams {\n elementId: string;\n inputsAst: InputAstNode[];\n bindings: {\n inputs: Record<string, any>;\n styles: Record<string, any>;\n };\n operations: ElementFactoryOperations;\n ignoreDefaultValues: boolean;\n}\n\ntype ElementFactoryOperations = {\n addElement: (element: DocumentElement) => IDocumentOperation;\n addToParent: (element: DocumentElement, index?: number) => IDocumentOperation;\n setInputBinding: (\n elementId: string,\n bindingPath: string,\n binding: InputValueBinding\n ) => IDocumentOperation;\n setStyleBinding: (\n elementId: string,\n bindingPath: string,\n binding: StyleValueBinding\n ) => IDocumentOperation;\n};\n\nconst defaultOperations: ElementFactoryOperations = {\n addElement: (element: DocumentElement) => {\n return new DocumentOperations.AddElement(element);\n },\n addToParent: (element: DocumentElement, index?: number) => {\n return new DocumentOperations.AddToParent(element, index);\n },\n setInputBinding: (elementId, bindingPath, binding) => {\n return new DocumentOperations.SetGlobalInputBinding(elementId, bindingPath, binding);\n },\n setStyleBinding: (elementId, bindingPath, binding) => {\n return new DocumentOperations.SetGlobalStyleBinding(elementId, bindingPath, binding);\n }\n};\n\nexport class ElementFactory {\n constructor(private components: Record<string, ComponentManifest>) {}\n\n public createElementFromComponent({\n componentName,\n parentId,\n slot,\n index,\n bindings\n }: ElementFactoryCreateElementParams) {\n const { element, componentManifest, inputsAst } = this.createElement(\n componentName,\n parentId,\n slot\n );\n\n const documentOps: IDocumentOperation[] = [\n defaultOperations.addElement(element),\n defaultOperations.addToParent(element, index)\n ];\n\n documentOps.push(\n ...this.generateOperations({\n element,\n inputsAst,\n bindings: {\n inputs: bindings?.inputs ?? componentManifest.defaults?.inputs ?? {},\n styles: withDefaultStyles(\n bindings?.styles ?? componentManifest.defaults?.styles ?? {}\n ),\n overrides: bindings?.overrides ?? {}\n },\n operations: defaultOperations\n })\n );\n\n return { element, operations: documentOps };\n }\n\n public generateOperations({\n element,\n inputsAst,\n bindings,\n operations\n }: GenerateOperationsParams): IDocumentOperation[] {\n const ops = this.generateOperationsFromBindings({\n elementId: element.id,\n inputsAst,\n bindings,\n operations,\n ignoreDefaultValues: false\n });\n\n if (bindings.overrides) {\n for (const [breakpoint, overrides] of Object.entries(bindings.overrides)) {\n ops.push(\n ...this.generateOperationsFromBindings({\n elementId: element.id,\n inputsAst,\n bindings: {\n inputs: overrides.inputs ?? {},\n styles: overrides.styles ?? {}\n },\n operations: {\n ...operations,\n setInputBinding: (elementId, bindingPath, binding) => {\n return new DocumentOperations.SetInputBindingOverride(\n elementId,\n bindingPath,\n binding,\n breakpoint\n );\n },\n setStyleBinding: (elementId, bindingPath, binding) => {\n return new DocumentOperations.SetStyleBindingOverride(\n elementId,\n bindingPath,\n binding,\n breakpoint\n );\n }\n },\n ignoreDefaultValues: true\n })\n );\n }\n }\n\n return ops;\n }\n\n private generateOperationsFromBindings({\n elementId,\n inputsAst,\n bindings,\n operations,\n ignoreDefaultValues\n }: GenerateOperationsFromBindingsParams): IDocumentOperation[] {\n const inputData = bindings.inputs;\n const traverser = new ComponentInputTraverser(inputsAst);\n\n const ops: IDocumentOperation[] = [];\n\n traverser.traverse(inputData, (node, path, value) => {\n const isCreateElement = value?.action === \"CreateElement\";\n const isList = node.list;\n const isObject = node.type === \"object\";\n\n if (isCreateElement) {\n const factory = new ElementFactory(this.components);\n const newElement = factory.createElementFromComponent({\n componentName: value.params.component,\n // undefined index = append to end of the slot array\n index: isList ? undefined : 0,\n slot: path,\n parentId: elementId,\n bindings: value.params\n });\n\n const newElementId = newElement.element.id;\n\n ops.push(...newElement.operations);\n\n if (isList) {\n // For list slots, AddToParent already manages the static array.\n // We only set metadata here.\n ops.push(\n operations.setInputBinding(elementId, path, {\n id: generateElementId(),\n type: node.type,\n translatable: node.input.translatable,\n list: node.list\n })\n );\n } else {\n ops.push(\n operations.setInputBinding(elementId, path, {\n id: generateElementId(),\n static: newElementId,\n type: node.type,\n translatable: node.input.translatable,\n list: node.list\n })\n );\n }\n } else if (isObject && isList) {\n return;\n } else {\n ops.push(\n operations.setInputBinding(elementId, path, {\n id: generateElementId(),\n static: ignoreDefaultValues\n ? undefined\n : (value ?? node.input.defaultValue),\n type: node.type,\n list: node.list,\n translatable: node.input.translatable\n })\n );\n }\n });\n\n // Process styles\n for (const key in bindings.styles) {\n ops.push(\n operations.setStyleBinding(elementId, key, {\n static: bindings.styles[key]\n })\n );\n }\n\n return ops;\n }\n\n private getComponentManifest(componentName: string): ComponentManifest {\n const manifest = this.components[componentName];\n if (!manifest) {\n throw new Error(`Component \"${componentName}\" not registered.`);\n }\n\n return manifest;\n }\n\n private createElement(componentName: string, parentId: string, slot: string) {\n const element: DocumentElement = {\n type: \"Webiny/Element\",\n id: generateElementId(),\n parent: { id: parentId, slot },\n component: { name: componentName }\n };\n\n const componentManifest = this.getComponentManifest(componentName);\n const inputsAst = ComponentManifestToAstConverter.convert(componentManifest.inputs ?? []);\n\n return {\n element,\n inputsAst,\n componentManifest\n };\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"ElementFactory.js","sources":["../src/ElementFactory.ts"],"sourcesContent":["import { generateElementId } from \"./generateElementId.js\";\nimport type {\n DocumentElement,\n ComponentManifest,\n InputValueBinding,\n StyleValueBinding,\n CssProperties\n} from \"~/types.js\";\nimport { type IDocumentOperation, DocumentOperations } from \"./documentOperations/index.js\";\nimport {\n ComponentManifestToAstConverter,\n type InputAstNode\n} from \"./ComponentManifestToAstConverter.js\";\nimport { ComponentInputTraverser } from \"./ComponentInputTraverser.js\";\nimport { assertBindingShapes } from \"./assertBindingShapes.js\";\nimport { logger } from \"./Logger.js\";\n\nconst defaultStyles = {\n display: \"flex\",\n flexDirection: \"column\"\n};\n\nconst withDefaultStyles = (styles: CssProperties) => {\n return { ...defaultStyles, ...styles };\n};\n\n/**\n * Whether the caller's input data holds a value at a traverser path such as `columns/0/links`. An\n * explicit empty list is a value; a missing one is not.\n */\nconst hasValueAtPath = (data: Record<string, any>, path: string): boolean => {\n let current: any = data;\n for (const segment of path.split(\"/\")) {\n if (current === null || current === undefined) {\n return false;\n }\n current = current[segment];\n }\n return current !== null && current !== undefined;\n};\n\nexport interface ElementFactoryCreateElementParams {\n componentName: string;\n parentId: string;\n slot: string;\n index?: number;\n bindings?: {\n inputs?: Record<string, any>;\n styles?: Record<string, any>;\n overrides?: {\n [breakpoint: string]: {\n inputs?: Record<string, any>;\n styles?: Record<string, any>;\n };\n };\n };\n}\n\ninterface GenerateOperationsParams {\n element: DocumentElement;\n inputsAst: InputAstNode[];\n operations: ElementFactoryOperations;\n bindings: {\n inputs: Record<string, any>;\n styles: Record<string, any>;\n overrides: {\n [breakpoint: string]: {\n inputs?: Record<string, any>;\n styles?: Record<string, any>;\n };\n };\n };\n}\n\ninterface GenerateOperationsFromBindingsParams {\n elementId: string;\n inputsAst: InputAstNode[];\n bindings: {\n inputs: Record<string, any>;\n styles: Record<string, any>;\n };\n operations: ElementFactoryOperations;\n ignoreDefaultValues: boolean;\n}\n\ntype ElementFactoryOperations = {\n addElement: (element: DocumentElement) => IDocumentOperation;\n addToParent: (element: DocumentElement, index?: number) => IDocumentOperation;\n setInputBinding: (\n elementId: string,\n bindingPath: string,\n binding: InputValueBinding\n ) => IDocumentOperation;\n setStyleBinding: (\n elementId: string,\n bindingPath: string,\n binding: StyleValueBinding\n ) => IDocumentOperation;\n};\n\nconst defaultOperations: ElementFactoryOperations = {\n addElement: (element: DocumentElement) => {\n return new DocumentOperations.AddElement(element);\n },\n addToParent: (element: DocumentElement, index?: number) => {\n return new DocumentOperations.AddToParent(element, index);\n },\n setInputBinding: (elementId, bindingPath, binding) => {\n return new DocumentOperations.SetGlobalInputBinding(elementId, bindingPath, binding);\n },\n setStyleBinding: (elementId, bindingPath, binding) => {\n return new DocumentOperations.SetGlobalStyleBinding(elementId, bindingPath, binding);\n }\n};\n\nexport class ElementFactory {\n constructor(private components: Record<string, ComponentManifest>) {}\n\n public createElementFromComponent({\n componentName,\n parentId,\n slot,\n index,\n bindings\n }: ElementFactoryCreateElementParams) {\n const { element, componentManifest, inputsAst } = this.createElement(\n componentName,\n parentId,\n slot\n );\n\n const documentOps: IDocumentOperation[] = [\n defaultOperations.addElement(element),\n defaultOperations.addToParent(element, index)\n ];\n\n const baseStyles = bindings?.styles ?? componentManifest.defaults?.styles ?? {};\n const resolvedStyles =\n componentManifest.applyDefaultStyles === false\n ? baseStyles\n : withDefaultStyles(baseStyles);\n\n documentOps.push(\n ...this.generateOperations({\n element,\n inputsAst,\n bindings: {\n inputs: bindings?.inputs ?? componentManifest.defaults?.inputs ?? {},\n styles: resolvedStyles,\n overrides: bindings?.overrides ?? {}\n },\n operations: defaultOperations\n })\n );\n\n return { element, operations: documentOps };\n }\n\n public generateOperations({\n element,\n inputsAst,\n bindings,\n operations\n }: GenerateOperationsParams): IDocumentOperation[] {\n const ops = this.generateOperationsFromBindings({\n elementId: element.id,\n inputsAst,\n bindings,\n operations,\n ignoreDefaultValues: false\n });\n\n if (bindings.overrides) {\n for (const [breakpoint, overrides] of Object.entries(bindings.overrides)) {\n ops.push(\n ...this.generateOperationsFromBindings({\n elementId: element.id,\n inputsAst,\n bindings: {\n inputs: overrides.inputs ?? {},\n styles: overrides.styles ?? {}\n },\n operations: {\n ...operations,\n setInputBinding: (elementId, bindingPath, binding) => {\n return new DocumentOperations.SetInputBindingOverride(\n elementId,\n bindingPath,\n binding,\n breakpoint\n );\n },\n setStyleBinding: (elementId, bindingPath, binding) => {\n return new DocumentOperations.SetStyleBindingOverride(\n elementId,\n bindingPath,\n binding,\n breakpoint\n );\n }\n },\n ignoreDefaultValues: true\n })\n );\n }\n }\n\n return ops;\n }\n\n private generateOperationsFromBindings({\n elementId,\n inputsAst,\n bindings,\n operations,\n ignoreDefaultValues\n }: GenerateOperationsFromBindingsParams): IDocumentOperation[] {\n const inputData = bindings.inputs;\n const traverser = new ComponentInputTraverser(inputsAst);\n\n const ops: IDocumentOperation[] = [];\n\n traverser.traverse(inputData, (node, path, value) => {\n const isCreateElement = value?.action === \"CreateElement\";\n const isList = node.list;\n const isObject = node.type === \"object\";\n\n if (isCreateElement) {\n const factory = new ElementFactory(this.components);\n const newElement = factory.createElementFromComponent({\n componentName: value.params.component,\n // undefined index = append to end of the slot array\n index: isList ? undefined : 0,\n slot: path,\n parentId: elementId,\n bindings: value.params\n });\n\n const newElementId = newElement.element.id;\n\n ops.push(...newElement.operations);\n\n if (isList) {\n // For list slots, AddToParent already manages the static array.\n // We only set metadata here.\n ops.push(\n operations.setInputBinding(elementId, path, {\n id: generateElementId(),\n type: node.type,\n translatable: node.input.translatable,\n list: node.list\n })\n );\n } else {\n ops.push(\n operations.setInputBinding(elementId, path, {\n id: generateElementId(),\n static: newElementId,\n type: node.type,\n translatable: node.input.translatable,\n list: node.list\n })\n );\n }\n } else if (isObject && isList && Array.isArray(value)) {\n /*\n * The traverser hands an object list to the visitor as a whole only when it holds no\n * items: items are visited through their fields, or one by one when the list\n * declares none. Nothing to write for an empty list, unless the caller gave no value\n * at all and the input declares default items — then those items are bound exactly\n * as given ones would be.\n */\n const defaults = node.input.defaultValue;\n if (\n !ignoreDefaultValues &&\n !hasValueAtPath(inputData, path) &&\n Array.isArray(defaults) &&\n defaults.length > 0\n ) {\n ops.push(\n ...this.generateOperationsFromBindings({\n elementId,\n inputsAst: [{ ...node, name: path }],\n bindings: { inputs: { [path]: defaults }, styles: {} },\n operations,\n ignoreDefaultValues\n })\n );\n }\n return;\n } else {\n ops.push(\n operations.setInputBinding(elementId, path, {\n id: generateElementId(),\n static: ignoreDefaultValues\n ? undefined\n : (value ?? node.input.defaultValue),\n type: node.type,\n list: node.list,\n translatable: node.input.translatable\n })\n );\n }\n });\n\n /*\n * The bindings just written, checked against the shapes the inputs declare.\n *\n * Here rather than on `bindings.inputs`, because the defect this catches lived between the\n * two: a correct array arrived and the traverser collapsed it while writing. A check on the\n * inputs passed while every page built from them failed to render.\n *\n * Warns rather than throws: a page that renders most of itself beats a page that refuses to\n * build, and the composition pipeline turns these into discard-log entries. See\n * `assertBindingShapes` for why this and the list tolerance in `BindingsResolver` belong\n * together.\n */\n const written: Record<string, unknown> = {};\n for (const op of ops) {\n const record = op as unknown as {\n path?: string;\n binding?: unknown;\n elementId?: string;\n };\n if (\n record.elementId === elementId &&\n typeof record.path === \"string\" &&\n record.binding\n ) {\n written[record.path] = record.binding;\n }\n }\n for (const violation of assertBindingShapes({ inputs: written as never }, inputsAst)) {\n logger.warn(\n `Binding \"${violation.path}\" declares a ${violation.declared} and holds a ${violation.found}.`\n );\n }\n\n // Process styles\n for (const key in bindings.styles) {\n ops.push(\n operations.setStyleBinding(elementId, key, {\n static: bindings.styles[key]\n })\n );\n }\n\n return ops;\n }\n\n private getComponentManifest(componentName: string): ComponentManifest {\n const manifest = this.components[componentName];\n if (!manifest) {\n const registered = Object.keys(this.components).join(\", \");\n throw new Error(\n `Component \"${componentName}\" not registered. Registered components: ${registered}`\n );\n }\n\n return manifest;\n }\n\n private createElement(componentName: string, parentId: string, slot: string) {\n const element: DocumentElement = {\n type: \"Webiny/Element\",\n id: generateElementId(),\n parent: { id: parentId, slot },\n component: { name: componentName }\n };\n\n const componentManifest = this.getComponentManifest(componentName);\n const inputsAst = ComponentManifestToAstConverter.convert(componentManifest.inputs ?? []);\n\n return {\n element,\n inputsAst,\n componentManifest\n };\n }\n}\n"],"names":["defaultStyles","withDefaultStyles","styles","hasValueAtPath","data","path","current","segment","defaultOperations","element","DocumentOperations","index","elementId","bindingPath","binding","ElementFactory","components","componentName","parentId","slot","bindings","componentManifest","inputsAst","documentOps","baseStyles","resolvedStyles","operations","ops","breakpoint","overrides","Object","ignoreDefaultValues","inputData","traverser","ComponentInputTraverser","node","value","isCreateElement","isList","isObject","factory","newElement","undefined","newElementId","generateElementId","Array","defaults","written","op","record","violation","assertBindingShapes","logger","key","manifest","registered","Error","ComponentManifestToAstConverter"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,423 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { ElementFactory } from "./ElementFactory.js";
3
+ import { BindingsResolver } from "./BindingsResolver.js";
4
+ import { ComponentManifestToAstConverter } from "./ComponentManifestToAstConverter.js";
5
+ import { createFileInput, createLongTextInput, createObjectInput, createTextInput } from "./createInput.js";
6
+ const ElementFactory_objectListDefaults_test_text = (name, defaultValue)=>({
7
+ type: "text",
8
+ renderer: "Webiny/Input",
9
+ name,
10
+ label: name,
11
+ defaultValue
12
+ });
13
+ const cardFields = [
14
+ ElementFactory_objectListDefaults_test_text("title", "New card"),
15
+ ElementFactory_objectListDefaults_test_text("body")
16
+ ];
17
+ const root = {
18
+ name: "Webiny/Root",
19
+ label: "Root",
20
+ tags: [],
21
+ inputs: [
22
+ {
23
+ type: "slot",
24
+ list: true,
25
+ renderer: "Webiny/Slot",
26
+ defaultValue: [],
27
+ name: "children"
28
+ }
29
+ ]
30
+ };
31
+ const place = (manifest, inputs)=>{
32
+ const components = {
33
+ [root.name]: root,
34
+ [manifest.name]: manifest
35
+ };
36
+ const result = new ElementFactory(components).createElementFromComponent({
37
+ componentName: manifest.name,
38
+ parentId: "root",
39
+ slot: "children",
40
+ bindings: inputs ? {
41
+ inputs
42
+ } : void 0
43
+ });
44
+ const document = {
45
+ state: {},
46
+ elements: {
47
+ root: {
48
+ type: "Webiny/Element",
49
+ id: "root",
50
+ component: {
51
+ name: "Webiny/Root"
52
+ }
53
+ }
54
+ },
55
+ bindings: {}
56
+ };
57
+ for (const op of result.operations)op.apply(document);
58
+ const [resolved] = new BindingsResolver(document.state).resolveElement({
59
+ element: document.elements[result.element.id],
60
+ elementBindings: document.bindings[result.element.id],
61
+ inputAst: ComponentManifestToAstConverter.convert(manifest.inputs ?? [])
62
+ });
63
+ return resolved.inputs;
64
+ };
65
+ describe("ElementFactory — object-list defaults", ()=>{
66
+ it("binds items from the manifest's defaults.inputs", ()=>{
67
+ const manifest = {
68
+ name: "Test/Cards",
69
+ label: "Cards",
70
+ tags: [],
71
+ inputs: [
72
+ {
73
+ type: "object",
74
+ renderer: "Webiny/Object",
75
+ name: "cards",
76
+ list: true,
77
+ fields: cardFields
78
+ }
79
+ ],
80
+ defaults: {
81
+ inputs: {
82
+ cards: [
83
+ {
84
+ title: "One",
85
+ body: "First"
86
+ },
87
+ {
88
+ title: "Two",
89
+ body: "Second"
90
+ }
91
+ ]
92
+ }
93
+ }
94
+ };
95
+ expect(place(manifest).cards).toEqual([
96
+ {
97
+ title: "One",
98
+ body: "First"
99
+ },
100
+ {
101
+ title: "Two",
102
+ body: "Second"
103
+ }
104
+ ]);
105
+ });
106
+ it("binds items from the input's own defaultValue when the manifest has no defaults", ()=>{
107
+ const manifest = {
108
+ name: "Test/Cards",
109
+ label: "Cards",
110
+ tags: [],
111
+ inputs: [
112
+ {
113
+ type: "object",
114
+ renderer: "Webiny/Object",
115
+ name: "cards",
116
+ list: true,
117
+ fields: cardFields,
118
+ defaultValue: [
119
+ {
120
+ title: "Default",
121
+ body: "From the input"
122
+ }
123
+ ]
124
+ }
125
+ ]
126
+ };
127
+ expect(place(manifest).cards).toEqual([
128
+ {
129
+ title: "Default",
130
+ body: "From the input"
131
+ }
132
+ ]);
133
+ });
134
+ it("binds nested object lists inside list items", ()=>{
135
+ const manifest = {
136
+ name: "Test/Columns",
137
+ label: "Columns",
138
+ tags: [],
139
+ inputs: [
140
+ {
141
+ type: "object",
142
+ renderer: "Webiny/Object",
143
+ name: "columns",
144
+ list: true,
145
+ fields: [
146
+ ElementFactory_objectListDefaults_test_text("heading"),
147
+ {
148
+ type: "object",
149
+ renderer: "Webiny/Object",
150
+ name: "links",
151
+ list: true,
152
+ fields: [
153
+ ElementFactory_objectListDefaults_test_text("label"),
154
+ ElementFactory_objectListDefaults_test_text("url")
155
+ ]
156
+ }
157
+ ]
158
+ }
159
+ ],
160
+ defaults: {
161
+ inputs: {
162
+ columns: [
163
+ {
164
+ heading: "Product",
165
+ links: [
166
+ {
167
+ label: "Pricing",
168
+ url: "/pricing"
169
+ },
170
+ {
171
+ label: "Docs",
172
+ url: "/docs"
173
+ }
174
+ ]
175
+ },
176
+ {
177
+ heading: "Legal",
178
+ links: [
179
+ {
180
+ label: "Terms",
181
+ url: "/terms"
182
+ }
183
+ ]
184
+ }
185
+ ]
186
+ }
187
+ }
188
+ };
189
+ expect(place(manifest).columns).toEqual([
190
+ {
191
+ heading: "Product",
192
+ links: [
193
+ {
194
+ label: "Pricing",
195
+ url: "/pricing"
196
+ },
197
+ {
198
+ label: "Docs",
199
+ url: "/docs"
200
+ }
201
+ ]
202
+ },
203
+ {
204
+ heading: "Legal",
205
+ links: [
206
+ {
207
+ label: "Terms",
208
+ url: "/terms"
209
+ }
210
+ ]
211
+ }
212
+ ]);
213
+ });
214
+ it("resolves an empty object-list default to an empty list, not undefined", ()=>{
215
+ const manifest = {
216
+ name: "Test/Cards",
217
+ label: "Cards",
218
+ tags: [],
219
+ inputs: [
220
+ {
221
+ type: "object",
222
+ renderer: "Webiny/Object",
223
+ name: "cards",
224
+ list: true,
225
+ fields: cardFields,
226
+ defaultValue: []
227
+ }
228
+ ]
229
+ };
230
+ expect(place(manifest).cards).toEqual([]);
231
+ });
232
+ it("binds an object list declared without fields", ()=>{
233
+ const manifest = {
234
+ name: "Test/Points",
235
+ label: "Points",
236
+ tags: [],
237
+ inputs: [
238
+ {
239
+ type: "object",
240
+ renderer: "Webiny/Object",
241
+ name: "points",
242
+ list: true,
243
+ fields: []
244
+ }
245
+ ],
246
+ defaults: {
247
+ inputs: {
248
+ points: [
249
+ {
250
+ x: 1,
251
+ y: 2
252
+ },
253
+ {
254
+ x: 3,
255
+ y: 4
256
+ }
257
+ ]
258
+ }
259
+ }
260
+ };
261
+ expect(place(manifest).points).toEqual([
262
+ {
263
+ x: 1,
264
+ y: 2
265
+ },
266
+ {
267
+ x: 3,
268
+ y: 4
269
+ }
270
+ ]);
271
+ });
272
+ it("still prefers explicit bindings over every default", ()=>{
273
+ const manifest = {
274
+ name: "Test/Cards",
275
+ label: "Cards",
276
+ tags: [],
277
+ inputs: [
278
+ {
279
+ type: "object",
280
+ renderer: "Webiny/Object",
281
+ name: "cards",
282
+ list: true,
283
+ fields: cardFields,
284
+ defaultValue: [
285
+ {
286
+ title: "Default",
287
+ body: "From the input"
288
+ }
289
+ ]
290
+ }
291
+ ],
292
+ defaults: {
293
+ inputs: {
294
+ cards: [
295
+ {
296
+ title: "Manifest",
297
+ body: "From defaults"
298
+ }
299
+ ]
300
+ }
301
+ }
302
+ };
303
+ expect(place(manifest, {
304
+ cards: [
305
+ {
306
+ title: "Given",
307
+ body: "Explicit"
308
+ }
309
+ ]
310
+ }).cards).toEqual([
311
+ {
312
+ title: "Given",
313
+ body: "Explicit"
314
+ }
315
+ ]);
316
+ });
317
+ it("binds a generated component's list items from defaults.inputs, file and nested fields included", ()=>{
318
+ const image = {
319
+ id: "img-1",
320
+ name: "pool.jpg",
321
+ size: 1024,
322
+ mimeType: "image/jpeg",
323
+ src: "https://cdn.example.com/pool.jpg",
324
+ width: 1200,
325
+ height: 800
326
+ };
327
+ const manifest = {
328
+ name: "Custom/AmenitiesGrid",
329
+ label: "Amenities Grid",
330
+ tags: [],
331
+ inputs: [
332
+ createTextInput({
333
+ name: "heading",
334
+ label: "Heading",
335
+ defaultValue: "Amenities"
336
+ }),
337
+ createObjectInput({
338
+ name: "amenities",
339
+ label: "Amenities",
340
+ list: true,
341
+ fields: [
342
+ createTextInput({
343
+ name: "title",
344
+ label: "Title",
345
+ defaultValue: "Amenity"
346
+ }),
347
+ createLongTextInput({
348
+ name: "description",
349
+ label: "Description"
350
+ }),
351
+ createFileInput({
352
+ name: "image",
353
+ label: "Image",
354
+ allowedFileTypes: [
355
+ "image/*"
356
+ ]
357
+ }),
358
+ createObjectInput({
359
+ name: "link",
360
+ label: "Link",
361
+ fields: [
362
+ createTextInput({
363
+ name: "label",
364
+ label: "Label"
365
+ }),
366
+ createTextInput({
367
+ name: "url",
368
+ label: "URL"
369
+ })
370
+ ]
371
+ })
372
+ ]
373
+ })
374
+ ],
375
+ defaults: {
376
+ inputs: {
377
+ amenities: [
378
+ {
379
+ title: "Resort-style pool",
380
+ description: "Heated, open year-round.",
381
+ image,
382
+ link: {
383
+ label: "See the pool",
384
+ url: "/amenities#pool"
385
+ }
386
+ },
387
+ {
388
+ title: "Fitness center",
389
+ description: "Open 24/7.",
390
+ image: {
391
+ ...image,
392
+ id: "img-2",
393
+ src: "https://cdn.example.com/gym.jpg"
394
+ },
395
+ link: {
396
+ label: "See the gym",
397
+ url: "/amenities#gym"
398
+ }
399
+ },
400
+ {
401
+ title: "Pet spa",
402
+ description: "Wash and groom.",
403
+ image: {
404
+ ...image,
405
+ id: "img-3",
406
+ src: "https://cdn.example.com/spa.jpg"
407
+ },
408
+ link: {
409
+ label: "See the spa",
410
+ url: "/amenities#spa"
411
+ }
412
+ }
413
+ ]
414
+ }
415
+ }
416
+ };
417
+ const inputs = place(manifest);
418
+ expect(inputs.amenities).toEqual(manifest.defaults.inputs.amenities);
419
+ expect(inputs.heading).toBe("Amenities");
420
+ });
421
+ });
422
+
423
+ //# sourceMappingURL=ElementFactory.objectListDefaults.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ElementFactory.objectListDefaults.test.js","sources":["../src/ElementFactory.objectListDefaults.test.ts"],"sourcesContent":["import { describe, it, expect } from \"vitest\";\nimport { ElementFactory } from \"./ElementFactory.js\";\nimport { BindingsResolver } from \"./BindingsResolver.js\";\nimport { ComponentManifestToAstConverter } from \"./ComponentManifestToAstConverter.js\";\nimport {\n createFileInput,\n createLongTextInput,\n createObjectInput,\n createTextInput\n} from \"./createInput.js\";\nimport type { ComponentInput, ComponentManifest, Document } from \"~/types.js\";\n\n/**\n * Object-list inputs placed from a manifest, checked on what a page renders rather than on the\n * operations written: every case applies the factory's operations to a document and resolves the\n * element the way the renderer does.\n */\n\nconst text = (name: string, defaultValue?: string): ComponentInput =>\n ({ type: \"text\", renderer: \"Webiny/Input\", name, label: name, defaultValue }) as ComponentInput;\n\nconst cardFields: ComponentInput[] = [text(\"title\", \"New card\"), text(\"body\")];\n\nconst root: ComponentManifest = {\n name: \"Webiny/Root\",\n label: \"Root\",\n tags: [],\n inputs: [\n {\n type: \"slot\",\n list: true,\n renderer: \"Webiny/Slot\",\n defaultValue: [],\n name: \"children\"\n } as ComponentInput\n ]\n};\n\nconst place = (manifest: ComponentManifest, inputs?: Record<string, any>) => {\n const components = { [root.name]: root, [manifest.name]: manifest };\n const result = new ElementFactory(components).createElementFromComponent({\n componentName: manifest.name,\n parentId: \"root\",\n slot: \"children\",\n bindings: inputs ? { inputs } : undefined\n });\n\n const document = {\n state: {},\n elements: {\n root: { type: \"Webiny/Element\", id: \"root\", component: { name: \"Webiny/Root\" } }\n },\n bindings: {}\n } as unknown as Document;\n\n for (const op of result.operations) {\n op.apply(document);\n }\n\n const [resolved] = new BindingsResolver(document.state).resolveElement({\n element: document.elements[result.element.id],\n elementBindings: document.bindings[result.element.id],\n inputAst: ComponentManifestToAstConverter.convert(manifest.inputs ?? [])\n });\n\n return resolved.inputs;\n};\n\ndescribe(\"ElementFactory — object-list defaults\", () => {\n it(\"binds items from the manifest's defaults.inputs\", () => {\n const manifest: ComponentManifest = {\n name: \"Test/Cards\",\n label: \"Cards\",\n tags: [],\n inputs: [\n {\n type: \"object\",\n renderer: \"Webiny/Object\",\n name: \"cards\",\n list: true,\n fields: cardFields\n } as ComponentInput\n ],\n defaults: {\n inputs: {\n cards: [\n { title: \"One\", body: \"First\" },\n { title: \"Two\", body: \"Second\" }\n ]\n }\n }\n };\n\n expect(place(manifest).cards).toEqual([\n { title: \"One\", body: \"First\" },\n { title: \"Two\", body: \"Second\" }\n ]);\n });\n\n it(\"binds items from the input's own defaultValue when the manifest has no defaults\", () => {\n const manifest: ComponentManifest = {\n name: \"Test/Cards\",\n label: \"Cards\",\n tags: [],\n inputs: [\n {\n type: \"object\",\n renderer: \"Webiny/Object\",\n name: \"cards\",\n list: true,\n fields: cardFields,\n defaultValue: [{ title: \"Default\", body: \"From the input\" }]\n } as ComponentInput\n ]\n };\n\n expect(place(manifest).cards).toEqual([{ title: \"Default\", body: \"From the input\" }]);\n });\n\n it(\"binds nested object lists inside list items\", () => {\n const manifest: ComponentManifest = {\n name: \"Test/Columns\",\n label: \"Columns\",\n tags: [],\n inputs: [\n {\n type: \"object\",\n renderer: \"Webiny/Object\",\n name: \"columns\",\n list: true,\n fields: [\n text(\"heading\"),\n {\n type: \"object\",\n renderer: \"Webiny/Object\",\n name: \"links\",\n list: true,\n fields: [text(\"label\"), text(\"url\")]\n } as ComponentInput\n ]\n } as ComponentInput\n ],\n defaults: {\n inputs: {\n columns: [\n {\n heading: \"Product\",\n links: [\n { label: \"Pricing\", url: \"/pricing\" },\n { label: \"Docs\", url: \"/docs\" }\n ]\n },\n { heading: \"Legal\", links: [{ label: \"Terms\", url: \"/terms\" }] }\n ]\n }\n }\n };\n\n expect(place(manifest).columns).toEqual([\n {\n heading: \"Product\",\n links: [\n { label: \"Pricing\", url: \"/pricing\" },\n { label: \"Docs\", url: \"/docs\" }\n ]\n },\n { heading: \"Legal\", links: [{ label: \"Terms\", url: \"/terms\" }] }\n ]);\n });\n\n it(\"resolves an empty object-list default to an empty list, not undefined\", () => {\n const manifest: ComponentManifest = {\n name: \"Test/Cards\",\n label: \"Cards\",\n tags: [],\n inputs: [\n {\n type: \"object\",\n renderer: \"Webiny/Object\",\n name: \"cards\",\n list: true,\n fields: cardFields,\n defaultValue: []\n } as ComponentInput\n ]\n };\n\n expect(place(manifest).cards).toEqual([]);\n });\n\n it(\"binds an object list declared without fields\", () => {\n const manifest: ComponentManifest = {\n name: \"Test/Points\",\n label: \"Points\",\n tags: [],\n inputs: [\n {\n type: \"object\",\n renderer: \"Webiny/Object\",\n name: \"points\",\n list: true,\n fields: []\n } as ComponentInput\n ],\n defaults: {\n inputs: {\n points: [\n { x: 1, y: 2 },\n { x: 3, y: 4 }\n ]\n }\n }\n };\n\n expect(place(manifest).points).toEqual([\n { x: 1, y: 2 },\n { x: 3, y: 4 }\n ]);\n });\n\n it(\"still prefers explicit bindings over every default\", () => {\n const manifest: ComponentManifest = {\n name: \"Test/Cards\",\n label: \"Cards\",\n tags: [],\n inputs: [\n {\n type: \"object\",\n renderer: \"Webiny/Object\",\n name: \"cards\",\n list: true,\n fields: cardFields,\n defaultValue: [{ title: \"Default\", body: \"From the input\" }]\n } as ComponentInput\n ],\n defaults: { inputs: { cards: [{ title: \"Manifest\", body: \"From defaults\" }] } }\n };\n\n expect(place(manifest, { cards: [{ title: \"Given\", body: \"Explicit\" }] }).cards).toEqual([\n { title: \"Given\", body: \"Explicit\" }\n ]);\n });\n\n /*\n * The shape the migration pipeline's generated components use: inputs built by the SDK's own\n * factories (the bundler evaluates `createObjectInput({ list: true, fields: [...] })` descriptors),\n * a file input and a nested object inside each item, and the list items given in the manifest's\n * `defaults.inputs` as the generation prompt instructs.\n */\n it(\"binds a generated component's list items from defaults.inputs, file and nested fields included\", () => {\n const image = {\n id: \"img-1\",\n name: \"pool.jpg\",\n size: 1024,\n mimeType: \"image/jpeg\",\n src: \"https://cdn.example.com/pool.jpg\",\n width: 1200,\n height: 800\n };\n const manifest: ComponentManifest = {\n name: \"Custom/AmenitiesGrid\",\n label: \"Amenities Grid\",\n tags: [],\n inputs: [\n createTextInput({ name: \"heading\", label: \"Heading\", defaultValue: \"Amenities\" }),\n createObjectInput({\n name: \"amenities\",\n label: \"Amenities\",\n list: true,\n fields: [\n createTextInput({ name: \"title\", label: \"Title\", defaultValue: \"Amenity\" }),\n createLongTextInput({ name: \"description\", label: \"Description\" }),\n createFileInput({\n name: \"image\",\n label: \"Image\",\n allowedFileTypes: [\"image/*\"]\n }),\n createObjectInput({\n name: \"link\",\n label: \"Link\",\n fields: [\n createTextInput({ name: \"label\", label: \"Label\" }),\n createTextInput({ name: \"url\", label: \"URL\" })\n ]\n })\n ]\n })\n ] as ComponentInput[],\n defaults: {\n inputs: {\n amenities: [\n {\n title: \"Resort-style pool\",\n description: \"Heated, open year-round.\",\n image,\n link: { label: \"See the pool\", url: \"/amenities#pool\" }\n },\n {\n title: \"Fitness center\",\n description: \"Open 24/7.\",\n image: {\n ...image,\n id: \"img-2\",\n src: \"https://cdn.example.com/gym.jpg\"\n },\n link: { label: \"See the gym\", url: \"/amenities#gym\" }\n },\n {\n title: \"Pet spa\",\n description: \"Wash and groom.\",\n image: {\n ...image,\n id: \"img-3\",\n src: \"https://cdn.example.com/spa.jpg\"\n },\n link: { label: \"See the spa\", url: \"/amenities#spa\" }\n }\n ]\n }\n }\n };\n\n const inputs = place(manifest);\n\n expect(inputs.amenities).toEqual(manifest.defaults!.inputs!.amenities);\n // Scalar inputs not in defaults.inputs fall back to their own defaultValue.\n expect(inputs.heading).toBe(\"Amenities\");\n });\n});\n"],"names":["text","name","defaultValue","cardFields","root","place","manifest","inputs","components","result","ElementFactory","undefined","document","op","resolved","BindingsResolver","ComponentManifestToAstConverter","describe","it","expect","image","createTextInput","createObjectInput","createLongTextInput","createFileInput"],"mappings":"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"}