@webiny/website-builder-sdk 0.0.0-unstable.eb196ccd2f → 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 (307) 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 -77
  6. package/BindingsProcessor.test.js.map +1 -1
  7. package/BindingsResolver.d.ts +5 -2
  8. package/BindingsResolver.js +99 -122
  9. package/BindingsResolver.js.map +1 -1
  10. package/BindingsResolver.test.js +399 -362
  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 +38 -22
  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.d.ts +36 -0
  26. package/ConstraintEvaluator.js +288 -0
  27. package/ConstraintEvaluator.js.map +1 -0
  28. package/ConstraintEvaluator.test.d.ts +1 -0
  29. package/ConstraintEvaluator.test.js +1634 -0
  30. package/ConstraintEvaluator.test.js.map +1 -0
  31. package/ContentSdk.d.ts +17 -3
  32. package/ContentSdk.js +113 -90
  33. package/ContentSdk.js.map +1 -1
  34. package/DocumentStore.d.ts +1 -1
  35. package/DocumentStore.js +47 -59
  36. package/DocumentStore.js.map +1 -1
  37. package/DocumentStoreManager.js +17 -16
  38. package/DocumentStoreManager.js.map +1 -1
  39. package/EditingSdk.d.ts +2 -2
  40. package/EditingSdk.js +92 -124
  41. package/EditingSdk.js.map +1 -1
  42. package/ElementFactory.d.ts +2 -3
  43. package/ElementFactory.js +164 -163
  44. package/ElementFactory.js.map +1 -1
  45. package/ElementFactory.objectListDefaults.test.d.ts +1 -0
  46. package/ElementFactory.objectListDefaults.test.js +423 -0
  47. package/ElementFactory.objectListDefaults.test.js.map +1 -0
  48. package/ElementFactory.test.d.ts +1 -0
  49. package/ElementFactory.test.js +353 -0
  50. package/ElementFactory.test.js.map +1 -0
  51. package/Environment.js +18 -19
  52. package/Environment.js.map +1 -1
  53. package/FunctionConverter.js +8 -7
  54. package/FunctionConverter.js.map +1 -1
  55. package/HashObject.js +11 -12
  56. package/HashObject.js.map +1 -1
  57. package/HotkeyManager.js +41 -48
  58. package/HotkeyManager.js.map +1 -1
  59. package/IBindingsUpdater.js +0 -3
  60. package/IRedirects.js +0 -3
  61. package/InheritanceProcessor.d.ts +2 -2
  62. package/InheritanceProcessor.js +99 -139
  63. package/InheritanceProcessor.js.map +1 -1
  64. package/InheritanceProcessor.test.js +178 -178
  65. package/InheritanceProcessor.test.js.map +1 -1
  66. package/InheritedValueResolver.d.ts +18 -1
  67. package/InheritedValueResolver.js +18 -20
  68. package/InheritedValueResolver.js.map +1 -1
  69. package/InputBindingsProcessor.d.ts +23 -2
  70. package/InputBindingsProcessor.js +200 -289
  71. package/InputBindingsProcessor.js.map +1 -1
  72. package/InputBindingsProcessorTokens.test.d.ts +1 -0
  73. package/InputBindingsProcessorTokens.test.js +400 -0
  74. package/InputBindingsProcessorTokens.test.js.map +1 -0
  75. package/InputsBindingsProcessor.test.js +334 -313
  76. package/InputsBindingsProcessor.test.js.map +1 -1
  77. package/InputsUpdater.d.ts +1 -1
  78. package/InputsUpdater.js +23 -26
  79. package/InputsUpdater.js.map +1 -1
  80. package/LiveSdk.d.ts +2 -2
  81. package/LiveSdk.js +12 -13
  82. package/LiveSdk.js.map +1 -1
  83. package/Logger.d.ts +2 -1
  84. package/Logger.js +9 -8
  85. package/Logger.js.map +1 -1
  86. package/MouseTracker.js +77 -83
  87. package/MouseTracker.js.map +1 -1
  88. package/NullSdk.d.ts +4 -3
  89. package/NullSdk.js +22 -14
  90. package/NullSdk.js.map +1 -1
  91. package/PreviewDocument.d.ts +1 -0
  92. package/PreviewDocument.js +30 -30
  93. package/PreviewDocument.js.map +1 -1
  94. package/PreviewSdk.d.ts +4 -3
  95. package/PreviewSdk.js +19 -17
  96. package/PreviewSdk.js.map +1 -1
  97. package/PreviewViewport.d.ts +0 -1
  98. package/PreviewViewport.js +50 -82
  99. package/PreviewViewport.js.map +1 -1
  100. package/README.md +10 -2
  101. package/ResizeObserver.js +24 -31
  102. package/ResizeObserver.js.map +1 -1
  103. package/StylesBindingsProcessor.d.ts +12 -2
  104. package/StylesBindingsProcessor.js +62 -79
  105. package/StylesBindingsProcessor.js.map +1 -1
  106. package/StylesUpdater.d.ts +1 -1
  107. package/StylesUpdater.js +20 -25
  108. package/StylesUpdater.js.map +1 -1
  109. package/Theme.js +30 -32
  110. package/Theme.js.map +1 -1
  111. package/ViewportManager.d.ts +2 -0
  112. package/ViewportManager.js +89 -97
  113. package/ViewportManager.js.map +1 -1
  114. package/assertBindingShapes.d.ts +31 -0
  115. package/assertBindingShapes.js +64 -0
  116. package/assertBindingShapes.js.map +1 -0
  117. package/assertBindingShapes.test.d.ts +1 -0
  118. package/assertBindingShapes.test.js +131 -0
  119. package/assertBindingShapes.test.js.map +1 -0
  120. package/asset/deliveryUrl.d.ts +41 -0
  121. package/asset/deliveryUrl.js +34 -0
  122. package/asset/deliveryUrl.js.map +1 -0
  123. package/asset/deliveryUrl.test.d.ts +1 -0
  124. package/asset/deliveryUrl.test.js +127 -0
  125. package/asset/deliveryUrl.test.js.map +1 -0
  126. package/asset/geometry.d.ts +7 -0
  127. package/asset/geometry.js +10 -0
  128. package/asset/geometry.js.map +1 -0
  129. package/asset/imageSrcSet.d.ts +63 -0
  130. package/asset/imageSrcSet.js +98 -0
  131. package/asset/imageSrcSet.js.map +1 -0
  132. package/asset/imageSrcSet.test.d.ts +1 -0
  133. package/asset/imageSrcSet.test.js +103 -0
  134. package/asset/imageSrcSet.test.js.map +1 -0
  135. package/asset/index.d.ts +5 -0
  136. package/asset/index.js +5 -0
  137. package/asset/normalize.d.ts +24 -0
  138. package/asset/normalize.js +106 -0
  139. package/asset/normalize.js.map +1 -0
  140. package/asset/normalize.test.d.ts +1 -0
  141. package/asset/normalize.test.js +263 -0
  142. package/asset/normalize.test.js.map +1 -0
  143. package/asset/types.d.ts +2 -0
  144. package/asset/types.js +0 -0
  145. package/constants.d.ts +1 -0
  146. package/constants.js +7 -5
  147. package/constants.js.map +1 -1
  148. package/contentEntry/ContentEntryBindingsResolver.d.ts +30 -0
  149. package/contentEntry/ContentEntryBindingsResolver.js +45 -0
  150. package/contentEntry/ContentEntryBindingsResolver.js.map +1 -0
  151. package/contentEntry/ContentEntryCache.d.ts +46 -0
  152. package/contentEntry/ContentEntryCache.js +50 -0
  153. package/contentEntry/ContentEntryCache.js.map +1 -0
  154. package/contentEntry/resolveContentEntry.d.ts +74 -0
  155. package/contentEntry/resolveContentEntry.js +53 -0
  156. package/contentEntry/resolveContentEntry.js.map +1 -0
  157. package/contentEntry/resolveContentEntry.test.d.ts +1 -0
  158. package/contentEntry/resolveContentEntry.test.js +213 -0
  159. package/contentEntry/resolveContentEntry.test.js.map +1 -0
  160. package/createComponent.d.ts +5 -0
  161. package/createComponent.js +32 -0
  162. package/createComponent.js.map +1 -0
  163. package/createElement.js +5 -6
  164. package/createElement.js.map +1 -1
  165. package/createInput.d.ts +132 -16
  166. package/createInput.js +92 -111
  167. package/createInput.js.map +1 -1
  168. package/createTheme.js +2 -3
  169. package/createTheme.js.map +1 -1
  170. package/dataProviders/ApiClient.d.ts +10 -5
  171. package/dataProviders/ApiClient.js +40 -49
  172. package/dataProviders/ApiClient.js.map +1 -1
  173. package/dataProviders/DefaultDataProvider.d.ts +7 -3
  174. package/dataProviders/DefaultDataProvider.js +91 -45
  175. package/dataProviders/DefaultDataProvider.js.map +1 -1
  176. package/dataProviders/GET_EXPERIMENT_PAUSED.d.ts +1 -0
  177. package/dataProviders/GET_EXPERIMENT_PAUSED.js +17 -0
  178. package/dataProviders/GET_EXPERIMENT_PAUSED.js.map +1 -0
  179. package/dataProviders/GET_PAGE_BY_ID.d.ts +1 -1
  180. package/dataProviders/GET_PAGE_BY_ID.js +4 -1
  181. package/dataProviders/GET_PAGE_BY_ID.js.map +1 -1
  182. package/dataProviders/GET_PAGE_BY_PATH.d.ts +1 -1
  183. package/dataProviders/GET_PAGE_BY_PATH.js +4 -1
  184. package/dataProviders/GET_PAGE_BY_PATH.js.map +1 -1
  185. package/dataProviders/GET_PAGE_EXPERIMENT.d.ts +1 -0
  186. package/dataProviders/GET_PAGE_EXPERIMENT.js +32 -0
  187. package/dataProviders/GET_PAGE_EXPERIMENT.js.map +1 -0
  188. package/dataProviders/GET_VARIANT_CONTENT.d.ts +1 -0
  189. package/dataProviders/GET_VARIANT_CONTENT.js +24 -0
  190. package/dataProviders/GET_VARIANT_CONTENT.js.map +1 -0
  191. package/dataProviders/LIST_PUBLISHED_PAGES.d.ts +1 -1
  192. package/dataProviders/LIST_PUBLISHED_PAGES.js +17 -5
  193. package/dataProviders/LIST_PUBLISHED_PAGES.js.map +1 -1
  194. package/dataProviders/NullDataProvider.d.ts +16 -4
  195. package/dataProviders/NullDataProvider.js +30 -13
  196. package/dataProviders/NullDataProvider.js.map +1 -1
  197. package/dataProviders/RedirectsProvider.js +24 -27
  198. package/dataProviders/RedirectsProvider.js.map +1 -1
  199. package/defaultBreakpoints.js +43 -22
  200. package/defaultBreakpoints.js.map +1 -1
  201. package/documentOperations/$addElementReferenceToParent.d.ts +1 -1
  202. package/documentOperations/$addElementReferenceToParent.js +30 -26
  203. package/documentOperations/$addElementReferenceToParent.js.map +1 -1
  204. package/documentOperations/AddElement.js +8 -7
  205. package/documentOperations/AddElement.js.map +1 -1
  206. package/documentOperations/AddToParent.d.ts +2 -2
  207. package/documentOperations/AddToParent.js +14 -13
  208. package/documentOperations/AddToParent.js.map +1 -1
  209. package/documentOperations/IDocumentOperation.js +0 -3
  210. package/documentOperations/RemoveElement.js +10 -7
  211. package/documentOperations/RemoveElement.js.map +1 -1
  212. package/documentOperations/SetGlobalInputBinding.js +23 -22
  213. package/documentOperations/SetGlobalInputBinding.js.map +1 -1
  214. package/documentOperations/SetGlobalStyleBinding.js +23 -23
  215. package/documentOperations/SetGlobalStyleBinding.js.map +1 -1
  216. package/documentOperations/SetInputBindingOverride.js +30 -29
  217. package/documentOperations/SetInputBindingOverride.js.map +1 -1
  218. package/documentOperations/SetStyleBindingOverride.js +30 -31
  219. package/documentOperations/SetStyleBindingOverride.js.map +1 -1
  220. package/documentOperations/index.js +9 -8
  221. package/documentOperations/index.js.map +1 -1
  222. package/experiments/PostHogAnalyticsProvider.d.ts +31 -0
  223. package/experiments/PostHogAnalyticsProvider.js +28 -0
  224. package/experiments/PostHogAnalyticsProvider.js.map +1 -0
  225. package/experiments/analyticsProvider.d.ts +4 -0
  226. package/experiments/analyticsProvider.js +11 -0
  227. package/experiments/analyticsProvider.js.map +1 -0
  228. package/experiments/bucketing.d.ts +27 -0
  229. package/experiments/bucketing.js +91 -0
  230. package/experiments/bucketing.js.map +1 -0
  231. package/experiments/bucketing.test.d.ts +1 -0
  232. package/experiments/bucketing.test.js +183 -0
  233. package/experiments/bucketing.test.js.map +1 -0
  234. package/experiments/index.d.ts +5 -0
  235. package/experiments/index.js +5 -0
  236. package/experiments/render.d.ts +79 -0
  237. package/experiments/render.js +149 -0
  238. package/experiments/render.js.map +1 -0
  239. package/experiments/types.d.ts +108 -0
  240. package/experiments/types.js +4 -0
  241. package/experiments/types.js.map +1 -0
  242. package/findMatchingAstNode.js +11 -13
  243. package/findMatchingAstNode.js.map +1 -1
  244. package/generateElementId.d.ts +1 -1
  245. package/generateElementId.js +2 -2
  246. package/generateElementId.js.map +1 -1
  247. package/headersProvider.js +4 -3
  248. package/headersProvider.js.map +1 -1
  249. package/image/geometry.d.ts +54 -0
  250. package/image/geometry.js +112 -0
  251. package/image/geometry.js.map +1 -0
  252. package/image/geometry.test.d.ts +1 -0
  253. package/image/geometry.test.js +190 -0
  254. package/image/geometry.test.js.map +1 -0
  255. package/image/index.d.ts +3 -0
  256. package/image/index.js +3 -0
  257. package/image/presets.d.ts +6 -0
  258. package/image/presets.js +20 -0
  259. package/image/presets.js.map +1 -0
  260. package/image/types.d.ts +10 -0
  261. package/image/types.js +0 -0
  262. package/index.d.ts +12 -1
  263. package/index.js +11 -3
  264. package/jsonPatch.d.ts +1 -1
  265. package/jsonPatch.js +5 -9
  266. package/jsonPatch.js.map +1 -1
  267. package/messages.js +12 -11
  268. package/messages.js.map +1 -1
  269. package/messenger/MessageOrigin.js +12 -11
  270. package/messenger/MessageOrigin.js.map +1 -1
  271. package/messenger/Messenger.js +59 -70
  272. package/messenger/Messenger.js.map +1 -1
  273. package/messenger/index.js +0 -2
  274. package/package.json +19 -22
  275. package/registerComponentGroup.js +5 -6
  276. package/registerComponentGroup.js.map +1 -1
  277. package/tokenBinding.d.ts +26 -0
  278. package/tokenBinding.js +15 -0
  279. package/tokenBinding.js.map +1 -0
  280. package/tokenBinding.test.d.ts +1 -0
  281. package/tokenBinding.test.js +165 -0
  282. package/tokenBinding.test.js.map +1 -0
  283. package/types/ShorthandCssProperties.js +0 -3
  284. package/types/WebsiteBuilderTheme.d.ts +54 -45
  285. package/types/WebsiteBuilderTheme.js +0 -3
  286. package/types.d.ts +294 -13
  287. package/types.js +0 -3
  288. package/IBindingsUpdater.js.map +0 -1
  289. package/IRedirects.js.map +0 -1
  290. package/documentOperations/IDocumentOperation.js.map +0 -1
  291. package/index.js.map +0 -1
  292. package/lexical/createDefaultLexicalTheme.d.ts +0 -2
  293. package/lexical/createDefaultLexicalTheme.js +0 -84
  294. package/lexical/createDefaultLexicalTheme.js.map +0 -1
  295. package/lexical/createLexicalTheme.d.ts +0 -2
  296. package/lexical/createLexicalTheme.js +0 -7
  297. package/lexical/createLexicalTheme.js.map +0 -1
  298. package/lexical/deepMerge.d.ts +0 -1
  299. package/lexical/deepMerge.js +0 -23
  300. package/lexical/deepMerge.js.map +0 -1
  301. package/messenger/index.js.map +0 -1
  302. package/types/LexicalEditorTheme.d.ts +0 -2
  303. package/types/LexicalEditorTheme.js +0 -3
  304. package/types/LexicalEditorTheme.js.map +0 -1
  305. package/types/ShorthandCssProperties.js.map +0 -1
  306. package/types/WebsiteBuilderTheme.js.map +0 -1
  307. package/types.js.map +0 -1
package/ElementFactory.js CHANGED
@@ -2,182 +2,183 @@ import { generateElementId } from "./generateElementId.js";
2
2
  import { DocumentOperations } from "./documentOperations/index.js";
3
3
  import { ComponentManifestToAstConverter } from "./ComponentManifestToAstConverter.js";
4
4
  import { ComponentInputTraverser } from "./ComponentInputTraverser.js";
5
+ import { assertBindingShapes } from "./assertBindingShapes.js";
6
+ import { logger } from "./Logger.js";
5
7
  const defaultStyles = {
6
- display: "flex",
7
- flexDirection: "column"
8
+ display: "flex",
9
+ flexDirection: "column"
8
10
  };
9
- const withDefaultStyles = styles => {
10
- return {
11
- ...defaultStyles,
12
- ...styles
13
- };
11
+ const withDefaultStyles = (styles)=>({
12
+ ...defaultStyles,
13
+ ...styles
14
+ });
15
+ const hasValueAtPath = (data, path)=>{
16
+ let current = data;
17
+ for (const segment of path.split("/")){
18
+ if (null == current) return false;
19
+ current = current[segment];
20
+ }
21
+ return null != current;
14
22
  };
15
23
  const defaultOperations = {
16
- addElement: element => {
17
- return new DocumentOperations.AddElement(element);
18
- },
19
- addToParent: (element, index) => {
20
- return new DocumentOperations.AddToParent(element, index);
21
- },
22
- setInputBinding: (elementId, bindingPath, binding) => {
23
- return new DocumentOperations.SetGlobalInputBinding(elementId, bindingPath, binding);
24
- },
25
- setStyleBinding: (elementId, bindingPath, binding) => {
26
- return new DocumentOperations.SetGlobalStyleBinding(elementId, bindingPath, binding);
27
- }
24
+ addElement: (element)=>new DocumentOperations.AddElement(element),
25
+ addToParent: (element, index)=>new DocumentOperations.AddToParent(element, index),
26
+ setInputBinding: (elementId, bindingPath, binding)=>new DocumentOperations.SetGlobalInputBinding(elementId, bindingPath, binding),
27
+ setStyleBinding: (elementId, bindingPath, binding)=>new DocumentOperations.SetGlobalStyleBinding(elementId, bindingPath, binding)
28
28
  };
29
- export class ElementFactory {
30
- constructor(components) {
31
- this.components = components;
32
- }
33
- createElementFromComponent({
34
- componentName,
35
- parentId,
36
- slot,
37
- index,
38
- bindings
39
- }) {
40
- const {
41
- element,
42
- componentManifest,
43
- inputsAst
44
- } = this.createElement(componentName, parentId, slot);
45
- const documentOps = [defaultOperations.addElement(element), defaultOperations.addToParent(element, index)];
46
- documentOps.push(...this.generateOperations({
47
- element,
48
- inputsAst,
49
- bindings: {
50
- inputs: bindings?.inputs ?? componentManifest.defaults?.inputs ?? {},
51
- styles: withDefaultStyles(bindings?.styles ?? componentManifest.defaults?.styles ?? {}),
52
- overrides: bindings?.overrides ?? {}
53
- },
54
- operations: defaultOperations
55
- }));
56
- return {
57
- element,
58
- operations: documentOps
59
- };
60
- }
61
- generateOperations({
62
- element,
63
- inputsAst,
64
- bindings,
65
- operations
66
- }) {
67
- const ops = this.generateOperationsFromBindings({
68
- elementId: element.id,
69
- inputsAst,
70
- bindings,
71
- operations,
72
- ignoreDefaultValues: false
73
- });
74
- if (bindings.overrides) {
75
- for (const [breakpoint, overrides] of Object.entries(bindings.overrides)) {
76
- ops.push(...this.generateOperationsFromBindings({
77
- elementId: element.id,
78
- inputsAst,
79
- bindings: {
80
- inputs: overrides.inputs ?? {},
81
- styles: overrides.styles ?? {}
82
- },
83
- operations: {
84
- ...operations,
85
- setInputBinding: (elementId, bindingPath, binding) => {
86
- return new DocumentOperations.SetInputBindingOverride(elementId, bindingPath, binding, breakpoint);
29
+ class ElementFactory {
30
+ constructor(components){
31
+ this.components = components;
32
+ }
33
+ createElementFromComponent({ componentName, parentId, slot, index, bindings }) {
34
+ const { element, componentManifest, inputsAst } = this.createElement(componentName, parentId, slot);
35
+ const documentOps = [
36
+ defaultOperations.addElement(element),
37
+ defaultOperations.addToParent(element, index)
38
+ ];
39
+ const baseStyles = bindings?.styles ?? componentManifest.defaults?.styles ?? {};
40
+ const resolvedStyles = false === componentManifest.applyDefaultStyles ? baseStyles : withDefaultStyles(baseStyles);
41
+ documentOps.push(...this.generateOperations({
42
+ element,
43
+ inputsAst,
44
+ bindings: {
45
+ inputs: bindings?.inputs ?? componentManifest.defaults?.inputs ?? {},
46
+ styles: resolvedStyles,
47
+ overrides: bindings?.overrides ?? {}
87
48
  },
88
- setStyleBinding: (elementId, bindingPath, binding) => {
89
- return new DocumentOperations.SetStyleBindingOverride(elementId, bindingPath, binding, breakpoint);
90
- }
91
- },
92
- ignoreDefaultValues: true
49
+ operations: defaultOperations
93
50
  }));
94
- }
51
+ return {
52
+ element,
53
+ operations: documentOps
54
+ };
95
55
  }
96
- return ops;
97
- }
98
- generateOperationsFromBindings({
99
- elementId,
100
- inputsAst,
101
- bindings,
102
- operations,
103
- ignoreDefaultValues
104
- }) {
105
- const inputData = bindings.inputs;
106
- const traverser = new ComponentInputTraverser(inputsAst);
107
- const ops = [];
108
- traverser.traverse(inputData, (node, path, value) => {
109
- const isCreateElement = value?.action === "CreateElement";
110
- const isList = node.list;
111
- const isObject = node.type === "object";
112
- if (isCreateElement) {
113
- const factory = new ElementFactory(this.components);
114
- const newElement = factory.createElementFromComponent({
115
- componentName: value.params.component,
116
- index: isList ? this.extractIndex(path) : 0,
117
- slot: path,
118
- parentId: elementId,
119
- bindings: value.params
56
+ generateOperations({ element, inputsAst, bindings, operations }) {
57
+ const ops = this.generateOperationsFromBindings({
58
+ elementId: element.id,
59
+ inputsAst,
60
+ bindings,
61
+ operations,
62
+ ignoreDefaultValues: false
120
63
  });
121
- const newElementId = newElement.element.id;
122
- ops.push(...newElement.operations, operations.setInputBinding(elementId, path, {
123
- id: generateElementId(),
124
- static: node.list ? [newElementId] : newElementId,
125
- type: node.type,
126
- translatable: node.input.translatable,
127
- list: node.list
64
+ if (bindings.overrides) for (const [breakpoint, overrides] of Object.entries(bindings.overrides))ops.push(...this.generateOperationsFromBindings({
65
+ elementId: element.id,
66
+ inputsAst,
67
+ bindings: {
68
+ inputs: overrides.inputs ?? {},
69
+ styles: overrides.styles ?? {}
70
+ },
71
+ operations: {
72
+ ...operations,
73
+ setInputBinding: (elementId, bindingPath, binding)=>new DocumentOperations.SetInputBindingOverride(elementId, bindingPath, binding, breakpoint),
74
+ setStyleBinding: (elementId, bindingPath, binding)=>new DocumentOperations.SetStyleBindingOverride(elementId, bindingPath, binding, breakpoint)
75
+ },
76
+ ignoreDefaultValues: true
128
77
  }));
129
- } else if (isObject && isList) {
130
- return;
131
- } else {
132
- ops.push(operations.setInputBinding(elementId, path, {
133
- id: generateElementId(),
134
- static: ignoreDefaultValues ? undefined : value ?? node.input.defaultValue,
135
- type: node.type,
136
- list: node.list,
137
- translatable: node.input.translatable
78
+ return ops;
79
+ }
80
+ generateOperationsFromBindings({ elementId, inputsAst, bindings, operations, ignoreDefaultValues }) {
81
+ const inputData = bindings.inputs;
82
+ const traverser = new ComponentInputTraverser(inputsAst);
83
+ const ops = [];
84
+ traverser.traverse(inputData, (node, path, value)=>{
85
+ const isCreateElement = value?.action === "CreateElement";
86
+ const isList = node.list;
87
+ const isObject = "object" === node.type;
88
+ if (isCreateElement) {
89
+ const factory = new ElementFactory(this.components);
90
+ const newElement = factory.createElementFromComponent({
91
+ componentName: value.params.component,
92
+ index: isList ? void 0 : 0,
93
+ slot: path,
94
+ parentId: elementId,
95
+ bindings: value.params
96
+ });
97
+ const newElementId = newElement.element.id;
98
+ ops.push(...newElement.operations);
99
+ if (isList) ops.push(operations.setInputBinding(elementId, path, {
100
+ id: generateElementId(),
101
+ type: node.type,
102
+ translatable: node.input.translatable,
103
+ list: node.list
104
+ }));
105
+ else ops.push(operations.setInputBinding(elementId, path, {
106
+ id: generateElementId(),
107
+ static: newElementId,
108
+ type: node.type,
109
+ translatable: node.input.translatable,
110
+ list: node.list
111
+ }));
112
+ } else if (isObject && isList && Array.isArray(value)) {
113
+ const defaults = node.input.defaultValue;
114
+ if (!ignoreDefaultValues && !hasValueAtPath(inputData, path) && Array.isArray(defaults) && defaults.length > 0) ops.push(...this.generateOperationsFromBindings({
115
+ elementId,
116
+ inputsAst: [
117
+ {
118
+ ...node,
119
+ name: path
120
+ }
121
+ ],
122
+ bindings: {
123
+ inputs: {
124
+ [path]: defaults
125
+ },
126
+ styles: {}
127
+ },
128
+ operations,
129
+ ignoreDefaultValues
130
+ }));
131
+ return;
132
+ } else ops.push(operations.setInputBinding(elementId, path, {
133
+ id: generateElementId(),
134
+ static: ignoreDefaultValues ? void 0 : value ?? node.input.defaultValue,
135
+ type: node.type,
136
+ list: node.list,
137
+ translatable: node.input.translatable
138
+ }));
139
+ });
140
+ const written = {};
141
+ for (const op of ops){
142
+ const record = op;
143
+ if (record.elementId === elementId && "string" == typeof record.path && record.binding) written[record.path] = record.binding;
144
+ }
145
+ for (const violation of assertBindingShapes({
146
+ inputs: written
147
+ }, inputsAst))logger.warn(`Binding "${violation.path}" declares a ${violation.declared} and holds a ${violation.found}.`);
148
+ for(const key in bindings.styles)ops.push(operations.setStyleBinding(elementId, key, {
149
+ static: bindings.styles[key]
138
150
  }));
139
- }
140
- });
141
-
142
- // Process styles
143
- for (const key in bindings.styles) {
144
- ops.push(operations.setStyleBinding(elementId, key, {
145
- static: bindings.styles[key]
146
- }));
151
+ return ops;
147
152
  }
148
- return ops;
149
- }
150
- getComponentManifest(componentName) {
151
- const manifest = this.components[componentName];
152
- if (!manifest) {
153
- throw new Error(`Component "${componentName}" not registered.`);
153
+ getComponentManifest(componentName) {
154
+ const manifest = this.components[componentName];
155
+ if (!manifest) {
156
+ const registered = Object.keys(this.components).join(", ");
157
+ throw new Error(`Component "${componentName}" not registered. Registered components: ${registered}`);
158
+ }
159
+ return manifest;
160
+ }
161
+ createElement(componentName, parentId, slot) {
162
+ const element = {
163
+ type: "Webiny/Element",
164
+ id: generateElementId(),
165
+ parent: {
166
+ id: parentId,
167
+ slot
168
+ },
169
+ component: {
170
+ name: componentName
171
+ }
172
+ };
173
+ const componentManifest = this.getComponentManifest(componentName);
174
+ const inputsAst = ComponentManifestToAstConverter.convert(componentManifest.inputs ?? []);
175
+ return {
176
+ element,
177
+ inputsAst,
178
+ componentManifest
179
+ };
154
180
  }
155
- return manifest;
156
- }
157
- extractIndex(path) {
158
- const match = path.match(/\/(\d+)\//);
159
- return match ? parseInt(match[1], 10) : 0;
160
- }
161
- createElement(componentName, parentId, slot) {
162
- const element = {
163
- type: "Webiny/Element",
164
- id: generateElementId(),
165
- parent: {
166
- id: parentId,
167
- slot
168
- },
169
- component: {
170
- name: componentName
171
- }
172
- };
173
- const componentManifest = this.getComponentManifest(componentName);
174
- const inputsAst = ComponentManifestToAstConverter.convert(componentManifest.inputs ?? []);
175
- return {
176
- element,
177
- inputsAst,
178
- componentManifest
179
- };
180
- }
181
181
  }
182
+ export { ElementFactory };
182
183
 
183
184
  //# sourceMappingURL=ElementFactory.js.map
@@ -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","extractIndex","newElementId","static","translatable","input","undefined","defaultValue","key","getComponentManifest","manifest","Error","match","parseInt","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 index: isList ? this.extractIndex(path) : 0,\n slot: path,\n parentId: elementId,\n bindings: value.params\n });\n\n const newElementId = newElement.element.id;\n\n ops.push(\n ...newElement.operations,\n operations.setInputBinding(elementId, path, {\n id: generateElementId(),\n static: node.list ? [newElementId] : newElementId,\n type: node.type,\n translatable: node.input.translatable,\n list: node.list\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 ? undefined : 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 extractIndex(path: string): number {\n const match = path.match(/\\/(\\d+)\\//);\n return match ? parseInt(match[1], 10) : 0;\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 {};