@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
@@ -1,382 +1,419 @@
1
+ import { describe, expect, it } from "vitest";
1
2
  import { BindingsResolver } from "./BindingsResolver.js";
2
3
  import { createSlotInput, createTextInput } from "./createInput.js";
3
4
  import { ComponentManifestToAstConverter } from "./ComponentManifestToAstConverter.js";
4
- describe("BindingsResolver", () => {
5
- const baseElement = {
6
- id: "test1",
7
- type: "Webiny/Element",
8
- component: {
9
- name: "Webiny/Text"
10
- }
11
- };
12
- const rootElement = {
13
- id: "root",
14
- type: "Webiny/Element",
15
- component: {
16
- name: "Webiny/Root"
17
- }
18
- };
19
- it("resolves input with expression binding", () => {
20
- const state = {
21
- user: {
22
- name: "Alice"
23
- }
24
- };
25
- const bindings = {
26
- inputs: {
27
- text: {
28
- id: "text",
29
- type: "text",
30
- expression: "$state.user.name",
31
- static: "Static fallback"
32
- }
33
- },
34
- styles: {
35
- paddingTop: {
36
- static: "10px"
37
- }
38
- }
39
- };
40
- const inputs = [createTextInput({
41
- name: "text"
42
- })];
43
- const inputAst = ComponentManifestToAstConverter.convert(inputs);
44
- const resolver = new BindingsResolver(state);
45
- const [resolved] = resolver.resolveElement({
46
- element: baseElement,
47
- inputAst,
48
- elementBindings: bindings
49
- });
50
- expect(resolved.inputs.text).toBe("Alice");
51
- expect(resolved.styles).toEqual({
52
- paddingTop: "10px"
53
- });
54
- });
55
- it("resolves nested objects", () => {
56
- const state = {};
57
- const bindings = {
58
- root: {
59
- inputs: {
60
- children: {
61
- id: "children",
62
- type: "slot",
63
- list: true,
64
- static: ["qizw1hgqjvj8g5a43szzc"]
65
- }
66
- }
67
- },
68
- qizw1hgqjvj8g5a43szzc: {
69
- inputs: {
70
- title: {
71
- id: "title",
72
- static: "Default Columns Title",
73
- type: "text"
74
- },
75
- "leftColumn/0": {
76
- id: "slot",
77
- static: ["7znyr9z2cpizegnrk2rhu"],
78
- type: "slot",
79
- list: true
80
- },
81
- "rightColumn/0": {
82
- id: "slot",
83
- static: ["cwld8kxy0qhhtaql42lr5"],
84
- type: "slot",
85
- list: true
86
- }
87
- },
88
- styles: {
89
- paddingTop: {
90
- static: "20px"
91
- },
92
- backgroundColor: {
93
- static: "#5c9a12"
94
- }
95
- }
96
- },
97
- "7znyr9z2cpizegnrk2rhu": {
98
- inputs: {
99
- title: {
100
- id: "title",
101
- static: "Left Column Title",
102
- type: "text"
103
- },
104
- children: {
105
- id: "slot",
106
- static: [],
107
- type: "slot",
108
- list: true
109
- }
110
- },
111
- styles: {
112
- backgroundColor: {
113
- static: "red"
114
- },
115
- marginTop: {
116
- static: "20px"
117
- }
118
- }
119
- },
120
- cwld8kxy0qhhtaql42lr5: {
121
- inputs: {
122
- title: {
123
- id: "title",
124
- static: "Right Column Title",
125
- type: "text"
126
- },
127
- children: {
128
- id: "slot",
129
- static: [],
130
- type: "slot",
131
- list: true
132
- }
133
- },
134
- styles: {
135
- backgroundColor: {
136
- static: "blue"
137
- },
138
- marginTop: {
139
- static: "20px"
140
- }
141
- }
142
- }
143
- };
144
- const elements = {
145
- root: {
146
- type: "Webiny/Element",
147
- id: "root",
148
- component: {
149
- name: "Webiny/Root"
150
- }
151
- },
152
- qizw1hgqjvj8g5a43szzc: {
153
- type: "Webiny/Element",
154
- id: "qizw1hgqjvj8g5a43szzc",
155
- parent: {
156
- id: "root",
157
- slot: "children"
158
- },
159
- component: {
160
- name: "Webiny/TwoColumns"
161
- }
162
- },
163
- "7znyr9z2cpizegnrk2rhu": {
5
+ describe("BindingsResolver", ()=>{
6
+ const baseElement = {
7
+ id: "test1",
164
8
  type: "Webiny/Element",
165
- id: "7znyr9z2cpizegnrk2rhu",
166
- parent: {
167
- id: "qizw1hgqjvj8g5a43szzc",
168
- slot: "leftColumn/0"
169
- },
170
9
  component: {
171
- name: "Webiny/TextWithDropzone"
10
+ name: "Webiny/Text"
172
11
  }
173
- },
174
- cwld8kxy0qhhtaql42lr5: {
12
+ };
13
+ const rootElement = {
14
+ id: "root",
175
15
  type: "Webiny/Element",
176
- id: "cwld8kxy0qhhtaql42lr5",
177
- parent: {
178
- id: "qizw1hgqjvj8g5a43szzc",
179
- slot: "rightColumn/0"
180
- },
181
16
  component: {
182
- name: "Webiny/TextWithDropzone"
17
+ name: "Webiny/Root"
183
18
  }
184
- }
185
19
  };
186
- const inputs = [{
187
- type: "text",
188
- renderer: "Webiny/Input",
189
- name: "title",
190
- label: "Title",
191
- fields: []
192
- }, {
193
- type: "slot",
194
- list: true,
195
- renderer: "Webiny/Slot",
196
- name: "leftColumn",
197
- fields: []
198
- }, {
199
- type: "slot",
200
- list: true,
201
- renderer: "Webiny/Slot",
202
- name: "rightColumn",
203
- fields: []
204
- }];
205
- const inputAst = ComponentManifestToAstConverter.convert(inputs);
206
- const resolver = new BindingsResolver(state);
207
- const [resolved] = resolver.resolveElement({
208
- element: elements["qizw1hgqjvj8g5a43szzc"],
209
- inputAst,
210
- elementBindings: bindings["qizw1hgqjvj8g5a43szzc"]
20
+ it("resolves input with expression binding", ()=>{
21
+ const state = {
22
+ user: {
23
+ name: "Alice"
24
+ }
25
+ };
26
+ const bindings = {
27
+ inputs: {
28
+ text: {
29
+ id: "text",
30
+ type: "text",
31
+ expression: "$state.user.name",
32
+ static: "Static fallback"
33
+ }
34
+ },
35
+ styles: {
36
+ paddingTop: {
37
+ static: "10px"
38
+ }
39
+ }
40
+ };
41
+ const inputs = [
42
+ createTextInput({
43
+ name: "text"
44
+ })
45
+ ];
46
+ const inputAst = ComponentManifestToAstConverter.convert(inputs);
47
+ const resolver = new BindingsResolver(state);
48
+ const [resolved] = resolver.resolveElement({
49
+ element: baseElement,
50
+ inputAst,
51
+ elementBindings: bindings
52
+ });
53
+ expect(resolved.inputs.text).toBe("Alice");
54
+ expect(resolved.styles).toEqual({
55
+ paddingTop: "10px"
56
+ });
211
57
  });
212
- expect(resolved.inputs.title).toBe("Default Columns Title");
213
- expect(resolved.inputs.leftColumn).toEqual([["7znyr9z2cpizegnrk2rhu"]]);
214
- expect(resolved.inputs.rightColumn).toEqual([["cwld8kxy0qhhtaql42lr5"]]);
215
- });
216
- it("falls back to static if no expression is provided", () => {
217
- const state = {};
218
- const bindings = {
219
- inputs: {
220
- text: {
221
- id: "text",
222
- type: "text",
223
- static: "Static only"
224
- }
225
- }
226
- };
227
- const inputs = [createTextInput({
228
- name: "text"
229
- })];
230
- const inputAst = ComponentManifestToAstConverter.convert(inputs);
231
- const resolver = new BindingsResolver(state);
232
- const [resolved] = resolver.resolveElement({
233
- element: baseElement,
234
- inputAst,
235
- elementBindings: bindings
58
+ it("resolves nested objects", ()=>{
59
+ const state = {};
60
+ const bindings = {
61
+ root: {
62
+ inputs: {
63
+ children: {
64
+ id: "children",
65
+ type: "slot",
66
+ list: true,
67
+ static: [
68
+ "qizw1hgqjvj8g5a43szzc"
69
+ ]
70
+ }
71
+ }
72
+ },
73
+ qizw1hgqjvj8g5a43szzc: {
74
+ inputs: {
75
+ title: {
76
+ id: "title",
77
+ static: "Default Columns Title",
78
+ type: "text"
79
+ },
80
+ "leftColumn/0": {
81
+ id: "slot",
82
+ static: [
83
+ "7znyr9z2cpizegnrk2rhu"
84
+ ],
85
+ type: "slot",
86
+ list: true
87
+ },
88
+ "rightColumn/0": {
89
+ id: "slot",
90
+ static: [
91
+ "cwld8kxy0qhhtaql42lr5"
92
+ ],
93
+ type: "slot",
94
+ list: true
95
+ }
96
+ },
97
+ styles: {
98
+ paddingTop: {
99
+ static: "20px"
100
+ },
101
+ backgroundColor: {
102
+ static: "#5c9a12"
103
+ }
104
+ }
105
+ },
106
+ "7znyr9z2cpizegnrk2rhu": {
107
+ inputs: {
108
+ title: {
109
+ id: "title",
110
+ static: "Left Column Title",
111
+ type: "text"
112
+ },
113
+ children: {
114
+ id: "slot",
115
+ static: [],
116
+ type: "slot",
117
+ list: true
118
+ }
119
+ },
120
+ styles: {
121
+ backgroundColor: {
122
+ static: "red"
123
+ },
124
+ marginTop: {
125
+ static: "20px"
126
+ }
127
+ }
128
+ },
129
+ cwld8kxy0qhhtaql42lr5: {
130
+ inputs: {
131
+ title: {
132
+ id: "title",
133
+ static: "Right Column Title",
134
+ type: "text"
135
+ },
136
+ children: {
137
+ id: "slot",
138
+ static: [],
139
+ type: "slot",
140
+ list: true
141
+ }
142
+ },
143
+ styles: {
144
+ backgroundColor: {
145
+ static: "blue"
146
+ },
147
+ marginTop: {
148
+ static: "20px"
149
+ }
150
+ }
151
+ }
152
+ };
153
+ const elements = {
154
+ root: {
155
+ type: "Webiny/Element",
156
+ id: "root",
157
+ component: {
158
+ name: "Webiny/Root"
159
+ }
160
+ },
161
+ qizw1hgqjvj8g5a43szzc: {
162
+ type: "Webiny/Element",
163
+ id: "qizw1hgqjvj8g5a43szzc",
164
+ parent: {
165
+ id: "root",
166
+ slot: "children"
167
+ },
168
+ component: {
169
+ name: "Webiny/TwoColumns"
170
+ }
171
+ },
172
+ "7znyr9z2cpizegnrk2rhu": {
173
+ type: "Webiny/Element",
174
+ id: "7znyr9z2cpizegnrk2rhu",
175
+ parent: {
176
+ id: "qizw1hgqjvj8g5a43szzc",
177
+ slot: "leftColumn/0"
178
+ },
179
+ component: {
180
+ name: "Webiny/TextWithDropzone"
181
+ }
182
+ },
183
+ cwld8kxy0qhhtaql42lr5: {
184
+ type: "Webiny/Element",
185
+ id: "cwld8kxy0qhhtaql42lr5",
186
+ parent: {
187
+ id: "qizw1hgqjvj8g5a43szzc",
188
+ slot: "rightColumn/0"
189
+ },
190
+ component: {
191
+ name: "Webiny/TextWithDropzone"
192
+ }
193
+ }
194
+ };
195
+ const inputs = [
196
+ {
197
+ type: "text",
198
+ renderer: "Webiny/Input",
199
+ name: "title",
200
+ label: "Title",
201
+ fields: []
202
+ },
203
+ {
204
+ type: "slot",
205
+ list: true,
206
+ renderer: "Webiny/Slot",
207
+ name: "leftColumn",
208
+ fields: []
209
+ },
210
+ {
211
+ type: "slot",
212
+ list: true,
213
+ renderer: "Webiny/Slot",
214
+ name: "rightColumn",
215
+ fields: []
216
+ }
217
+ ];
218
+ const inputAst = ComponentManifestToAstConverter.convert(inputs);
219
+ const resolver = new BindingsResolver(state);
220
+ const [resolved] = resolver.resolveElement({
221
+ element: elements["qizw1hgqjvj8g5a43szzc"],
222
+ inputAst,
223
+ elementBindings: bindings["qizw1hgqjvj8g5a43szzc"]
224
+ });
225
+ expect(resolved.inputs.title).toBe("Default Columns Title");
226
+ expect(resolved.inputs.leftColumn).toEqual([
227
+ [
228
+ "7znyr9z2cpizegnrk2rhu"
229
+ ]
230
+ ]);
231
+ expect(resolved.inputs.rightColumn).toEqual([
232
+ [
233
+ "cwld8kxy0qhhtaql42lr5"
234
+ ]
235
+ ]);
236
236
  });
237
- expect(resolved.inputs.text).toBe("Static only");
238
- });
239
- it("uses undefined if expression fails and no static exists", () => {
240
- const state = {};
241
- const bindings = {
242
- inputs: {
243
- text: {
244
- id: "text",
245
- type: "text",
246
- static: "Fallback",
247
- expression: "$.unknown.value"
248
- }
249
- }
250
- };
251
- const inputs = [createTextInput({
252
- name: "text"
253
- })];
254
- const inputAst = ComponentManifestToAstConverter.convert(inputs);
255
- const resolver = new BindingsResolver(state);
256
- const [resolved] = resolver.resolveElement({
257
- element: baseElement,
258
- inputAst,
259
- elementBindings: bindings
237
+ it("falls back to static if no expression is provided", ()=>{
238
+ const state = {};
239
+ const bindings = {
240
+ inputs: {
241
+ text: {
242
+ id: "text",
243
+ type: "text",
244
+ static: "Static only"
245
+ }
246
+ }
247
+ };
248
+ const inputs = [
249
+ createTextInput({
250
+ name: "text"
251
+ })
252
+ ];
253
+ const inputAst = ComponentManifestToAstConverter.convert(inputs);
254
+ const resolver = new BindingsResolver(state);
255
+ const [resolved] = resolver.resolveElement({
256
+ element: baseElement,
257
+ inputAst,
258
+ elementBindings: bindings
259
+ });
260
+ expect(resolved.inputs.text).toBe("Static only");
260
261
  });
261
- expect(resolved.inputs.text).toBeUndefined();
262
- });
263
- it("uses input's `defaultValue` if binding doesn't exist", () => {
264
- const state = {};
265
- const bindings = {
266
- inputs: {}
267
- };
268
- const inputs = [createSlotInput({
269
- name: "children",
270
- defaultValue: []
271
- })];
272
- const inputAst = ComponentManifestToAstConverter.convert(inputs);
273
- const resolver = new BindingsResolver(state);
274
- const [resolved] = resolver.resolveElement({
275
- element: rootElement,
276
- inputAst,
277
- elementBindings: bindings,
278
- onResolved(value, input) {
279
- if (input.type === "slot") {
280
- return "slot";
281
- }
282
- return value;
283
- }
262
+ it("uses undefined if expression fails and no static exists", ()=>{
263
+ const state = {};
264
+ const bindings = {
265
+ inputs: {
266
+ text: {
267
+ id: "text",
268
+ type: "text",
269
+ static: "Fallback",
270
+ expression: "$.unknown.value"
271
+ }
272
+ }
273
+ };
274
+ const inputs = [
275
+ createTextInput({
276
+ name: "text"
277
+ })
278
+ ];
279
+ const inputAst = ComponentManifestToAstConverter.convert(inputs);
280
+ const resolver = new BindingsResolver(state);
281
+ const [resolved] = resolver.resolveElement({
282
+ element: baseElement,
283
+ inputAst,
284
+ elementBindings: bindings
285
+ });
286
+ expect(resolved.inputs.text).toBeUndefined();
284
287
  });
285
- expect(resolved.inputs.children).toEqual("slot");
286
- });
287
- it("handles $repeat using expression and maps items", () => {
288
- const state = {
289
- products: [{
290
- title: "Shirt"
291
- }, {
292
- title: "Hat"
293
- }]
294
- };
295
- const bindings = {
296
- $repeat: {
297
- expression: "$state.products"
298
- },
299
- inputs: {
300
- text: {
301
- id: "text",
302
- type: "text",
303
- expression: "$.title",
304
- static: "Unnamed"
305
- }
306
- }
307
- };
308
- const inputs = [createTextInput({
309
- name: "text"
310
- })];
311
- const inputAst = ComponentManifestToAstConverter.convert(inputs);
312
- const resolver = new BindingsResolver(state);
313
- const resolved = resolver.resolveElement({
314
- element: baseElement,
315
- inputAst,
316
- elementBindings: bindings
288
+ it("uses input's `defaultValue` if binding doesn't exist", ()=>{
289
+ const state = {};
290
+ const bindings = {
291
+ inputs: {}
292
+ };
293
+ const inputs = [
294
+ createSlotInput({
295
+ name: "children",
296
+ defaultValue: []
297
+ })
298
+ ];
299
+ const inputAst = ComponentManifestToAstConverter.convert(inputs);
300
+ const resolver = new BindingsResolver(state);
301
+ const [resolved] = resolver.resolveElement({
302
+ element: rootElement,
303
+ inputAst,
304
+ elementBindings: bindings,
305
+ onResolved (value, input) {
306
+ if ("slot" === input.type) return "slot";
307
+ return value;
308
+ }
309
+ });
310
+ expect(resolved.inputs.children).toEqual("slot");
317
311
  });
318
- expect(resolved).toHaveLength(2);
319
- expect(resolved[0].inputs.text).toBe("Shirt");
320
- expect(resolved[1].inputs.text).toBe("Hat");
321
- });
322
- it("returns empty array if $repeat doesn't resolve to an array", () => {
323
- const state = {
324
- invalid: 42
325
- };
326
- const bindings = {
327
- $repeat: {
328
- expression: "$state.invalid"
329
- },
330
- inputs: {
331
- text: {
332
- id: "text",
333
- type: "text",
334
- static: "Should not be used"
335
- }
336
- }
337
- };
338
- const inputs = [createTextInput({
339
- name: "text"
340
- })];
341
- const inputAst = ComponentManifestToAstConverter.convert(inputs);
342
- const resolver = new BindingsResolver(state);
343
- const resolved = resolver.resolveElement({
344
- element: baseElement,
345
- inputAst,
346
- elementBindings: bindings
312
+ it("handles $repeat using expression and maps items", ()=>{
313
+ const state = {
314
+ products: [
315
+ {
316
+ title: "Shirt"
317
+ },
318
+ {
319
+ title: "Hat"
320
+ }
321
+ ]
322
+ };
323
+ const bindings = {
324
+ $repeat: {
325
+ expression: "$state.products"
326
+ },
327
+ inputs: {
328
+ text: {
329
+ id: "text",
330
+ type: "text",
331
+ expression: "$.title",
332
+ static: "Unnamed"
333
+ }
334
+ }
335
+ };
336
+ const inputs = [
337
+ createTextInput({
338
+ name: "text"
339
+ })
340
+ ];
341
+ const inputAst = ComponentManifestToAstConverter.convert(inputs);
342
+ const resolver = new BindingsResolver(state);
343
+ const resolved = resolver.resolveElement({
344
+ element: baseElement,
345
+ inputAst,
346
+ elementBindings: bindings
347
+ });
348
+ expect(resolved).toHaveLength(2);
349
+ expect(resolved[0].inputs.text).toBe("Shirt");
350
+ expect(resolved[1].inputs.text).toBe("Hat");
347
351
  });
348
- expect(resolved).toEqual([]);
349
- });
350
- it("resolves binding that refers to a specific array index", () => {
351
- const state = {
352
- list: [{
353
- text: "First item text"
354
- }, {
355
- text: "Second item text"
356
- }]
357
- };
358
- const bindings = {
359
- inputs: {
360
- text: {
361
- id: "text",
362
- type: "text",
363
- static: "Static fallback",
364
- expression: "$state.list.0.text"
365
- }
366
- }
367
- };
368
- const inputs = [createTextInput({
369
- name: "text"
370
- })];
371
- const inputAst = ComponentManifestToAstConverter.convert(inputs);
372
- const resolver = new BindingsResolver(state);
373
- const [resolved] = resolver.resolveElement({
374
- element: baseElement,
375
- inputAst,
376
- elementBindings: bindings
352
+ it("returns empty array if $repeat doesn't resolve to an array", ()=>{
353
+ const state = {
354
+ invalid: 42
355
+ };
356
+ const bindings = {
357
+ $repeat: {
358
+ expression: "$state.invalid"
359
+ },
360
+ inputs: {
361
+ text: {
362
+ id: "text",
363
+ type: "text",
364
+ static: "Should not be used"
365
+ }
366
+ }
367
+ };
368
+ const inputs = [
369
+ createTextInput({
370
+ name: "text"
371
+ })
372
+ ];
373
+ const inputAst = ComponentManifestToAstConverter.convert(inputs);
374
+ const resolver = new BindingsResolver(state);
375
+ const resolved = resolver.resolveElement({
376
+ element: baseElement,
377
+ inputAst,
378
+ elementBindings: bindings
379
+ });
380
+ expect(resolved).toEqual([]);
381
+ });
382
+ it("resolves binding that refers to a specific array index", ()=>{
383
+ const state = {
384
+ list: [
385
+ {
386
+ text: "First item text"
387
+ },
388
+ {
389
+ text: "Second item text"
390
+ }
391
+ ]
392
+ };
393
+ const bindings = {
394
+ inputs: {
395
+ text: {
396
+ id: "text",
397
+ type: "text",
398
+ static: "Static fallback",
399
+ expression: "$state.list.0.text"
400
+ }
401
+ }
402
+ };
403
+ const inputs = [
404
+ createTextInput({
405
+ name: "text"
406
+ })
407
+ ];
408
+ const inputAst = ComponentManifestToAstConverter.convert(inputs);
409
+ const resolver = new BindingsResolver(state);
410
+ const [resolved] = resolver.resolveElement({
411
+ element: baseElement,
412
+ inputAst,
413
+ elementBindings: bindings
414
+ });
415
+ expect(resolved.inputs.text).toBe("First item text");
377
416
  });
378
- expect(resolved.inputs.text).toBe("First item text");
379
- });
380
417
  });
381
418
 
382
419
  //# sourceMappingURL=BindingsResolver.test.js.map