@webiny/website-builder-sdk 6.3.0 → 6.4.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) 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.js +92 -119
  8. package/BindingsResolver.js.map +1 -1
  9. package/BindingsResolver.test.js +399 -363
  10. package/BindingsResolver.test.js.map +1 -1
  11. package/ComponentInputTraverser.js +28 -49
  12. package/ComponentInputTraverser.js.map +1 -1
  13. package/ComponentManifestToAstConverter.js +20 -21
  14. package/ComponentManifestToAstConverter.js.map +1 -1
  15. package/ComponentRegistry.js +26 -45
  16. package/ComponentRegistry.js.map +1 -1
  17. package/ComponentResolver.js +25 -29
  18. package/ComponentResolver.js.map +1 -1
  19. package/ConstraintEvaluator.js +246 -353
  20. package/ConstraintEvaluator.js.map +1 -1
  21. package/ConstraintEvaluator.test.js +1616 -1438
  22. package/ConstraintEvaluator.test.js.map +1 -1
  23. package/ContentSdk.js +83 -90
  24. package/ContentSdk.js.map +1 -1
  25. package/DocumentStore.js +47 -59
  26. package/DocumentStore.js.map +1 -1
  27. package/DocumentStoreManager.js +17 -16
  28. package/DocumentStoreManager.js.map +1 -1
  29. package/EditingSdk.js +87 -121
  30. package/EditingSdk.js.map +1 -1
  31. package/ElementFactory.js +126 -174
  32. package/ElementFactory.js.map +1 -1
  33. package/ElementFactory.test.js +234 -263
  34. package/ElementFactory.test.js.map +1 -1
  35. package/Environment.js +18 -19
  36. package/Environment.js.map +1 -1
  37. package/FunctionConverter.js +8 -7
  38. package/FunctionConverter.js.map +1 -1
  39. package/HashObject.js +11 -26
  40. package/HashObject.js.map +1 -1
  41. package/HotkeyManager.js +40 -47
  42. package/HotkeyManager.js.map +1 -1
  43. package/IBindingsUpdater.js +0 -3
  44. package/IRedirects.js +0 -3
  45. package/InheritanceProcessor.js +99 -139
  46. package/InheritanceProcessor.js.map +1 -1
  47. package/InheritanceProcessor.test.js +178 -179
  48. package/InheritanceProcessor.test.js.map +1 -1
  49. package/InheritedValueResolver.js +15 -20
  50. package/InheritedValueResolver.js.map +1 -1
  51. package/InputBindingsProcessor.js +187 -307
  52. package/InputBindingsProcessor.js.map +1 -1
  53. package/InputsBindingsProcessor.test.js +334 -315
  54. package/InputsBindingsProcessor.test.js.map +1 -1
  55. package/InputsUpdater.js +23 -26
  56. package/InputsUpdater.js.map +1 -1
  57. package/LiveSdk.js +12 -13
  58. package/LiveSdk.js.map +1 -1
  59. package/Logger.js +9 -8
  60. package/Logger.js.map +1 -1
  61. package/MouseTracker.js +77 -83
  62. package/MouseTracker.js.map +1 -1
  63. package/NullSdk.js +22 -21
  64. package/NullSdk.js.map +1 -1
  65. package/PreviewDocument.js +27 -30
  66. package/PreviewDocument.js.map +1 -1
  67. package/PreviewSdk.js +16 -17
  68. package/PreviewSdk.js.map +1 -1
  69. package/PreviewViewport.js +51 -63
  70. package/PreviewViewport.js.map +1 -1
  71. package/ResizeObserver.js +24 -31
  72. package/ResizeObserver.js.map +1 -1
  73. package/StylesBindingsProcessor.js +40 -79
  74. package/StylesBindingsProcessor.js.map +1 -1
  75. package/StylesUpdater.js +20 -25
  76. package/StylesUpdater.js.map +1 -1
  77. package/Theme.js +28 -25
  78. package/Theme.js.map +1 -1
  79. package/ViewportManager.js +89 -101
  80. package/ViewportManager.js.map +1 -1
  81. package/constants.js +7 -6
  82. package/constants.js.map +1 -1
  83. package/createElement.js +5 -6
  84. package/createElement.js.map +1 -1
  85. package/createInput.js +85 -143
  86. package/createInput.js.map +1 -1
  87. package/createTheme.js +2 -3
  88. package/createTheme.js.map +1 -1
  89. package/dataProviders/ApiClient.js +40 -49
  90. package/dataProviders/ApiClient.js.map +1 -1
  91. package/dataProviders/DefaultDataProvider.js +56 -58
  92. package/dataProviders/DefaultDataProvider.js.map +1 -1
  93. package/dataProviders/GET_PAGE_BY_ID.js +2 -1
  94. package/dataProviders/GET_PAGE_BY_ID.js.map +1 -1
  95. package/dataProviders/GET_PAGE_BY_PATH.js +2 -1
  96. package/dataProviders/GET_PAGE_BY_PATH.js.map +1 -1
  97. package/dataProviders/LIST_PUBLISHED_PAGES.js +2 -1
  98. package/dataProviders/LIST_PUBLISHED_PAGES.js.map +1 -1
  99. package/dataProviders/NullDataProvider.js +21 -20
  100. package/dataProviders/NullDataProvider.js.map +1 -1
  101. package/dataProviders/RedirectsProvider.js +24 -27
  102. package/dataProviders/RedirectsProvider.js.map +1 -1
  103. package/defaultBreakpoints.js +23 -22
  104. package/defaultBreakpoints.js.map +1 -1
  105. package/documentOperations/$addElementReferenceToParent.js +29 -32
  106. package/documentOperations/$addElementReferenceToParent.js.map +1 -1
  107. package/documentOperations/AddElement.js +8 -7
  108. package/documentOperations/AddElement.js.map +1 -1
  109. package/documentOperations/AddToParent.js +14 -13
  110. package/documentOperations/AddToParent.js.map +1 -1
  111. package/documentOperations/IDocumentOperation.js +0 -3
  112. package/documentOperations/RemoveElement.js +9 -15
  113. package/documentOperations/RemoveElement.js.map +1 -1
  114. package/documentOperations/SetGlobalInputBinding.js +23 -22
  115. package/documentOperations/SetGlobalInputBinding.js.map +1 -1
  116. package/documentOperations/SetGlobalStyleBinding.js +23 -23
  117. package/documentOperations/SetGlobalStyleBinding.js.map +1 -1
  118. package/documentOperations/SetInputBindingOverride.js +30 -29
  119. package/documentOperations/SetInputBindingOverride.js.map +1 -1
  120. package/documentOperations/SetStyleBindingOverride.js +30 -31
  121. package/documentOperations/SetStyleBindingOverride.js.map +1 -1
  122. package/documentOperations/index.js +9 -8
  123. package/documentOperations/index.js.map +1 -1
  124. package/findMatchingAstNode.js +11 -13
  125. package/findMatchingAstNode.js.map +1 -1
  126. package/generateElementId.js +2 -1
  127. package/generateElementId.js.map +1 -1
  128. package/headersProvider.js +4 -3
  129. package/headersProvider.js.map +1 -1
  130. package/index.js +0 -2
  131. package/jsonPatch.js +5 -9
  132. package/jsonPatch.js.map +1 -1
  133. package/messages.js +12 -11
  134. package/messages.js.map +1 -1
  135. package/messenger/MessageOrigin.js +12 -11
  136. package/messenger/MessageOrigin.js.map +1 -1
  137. package/messenger/Messenger.js +58 -69
  138. package/messenger/Messenger.js.map +1 -1
  139. package/messenger/index.js +0 -2
  140. package/package.json +5 -5
  141. package/registerComponentGroup.js +5 -6
  142. package/registerComponentGroup.js.map +1 -1
  143. package/types/ShorthandCssProperties.js +0 -3
  144. package/types/WebsiteBuilderTheme.js +0 -3
  145. package/types.d.ts +3 -0
  146. package/types.js +0 -3
  147. package/IBindingsUpdater.js.map +0 -1
  148. package/IRedirects.js.map +0 -1
  149. package/documentOperations/IDocumentOperation.js.map +0 -1
  150. package/index.js.map +0 -1
  151. package/messenger/index.js.map +0 -1
  152. package/types/ShorthandCssProperties.js.map +0 -1
  153. package/types/WebsiteBuilderTheme.js.map +0 -1
  154. package/types.js.map +0 -1
@@ -1,383 +1,419 @@
1
- import { describe, it, expect } from "vitest";
1
+ import { describe, expect, it } from "vitest";
2
2
  import { BindingsResolver } from "./BindingsResolver.js";
3
3
  import { createSlotInput, createTextInput } from "./createInput.js";
4
4
  import { ComponentManifestToAstConverter } from "./ComponentManifestToAstConverter.js";
5
- describe("BindingsResolver", () => {
6
- const baseElement = {
7
- id: "test1",
8
- type: "Webiny/Element",
9
- component: {
10
- name: "Webiny/Text"
11
- }
12
- };
13
- const rootElement = {
14
- id: "root",
15
- type: "Webiny/Element",
16
- component: {
17
- name: "Webiny/Root"
18
- }
19
- };
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 = [createTextInput({
42
- name: "text"
43
- })];
44
- const inputAst = ComponentManifestToAstConverter.convert(inputs);
45
- const resolver = new BindingsResolver(state);
46
- const [resolved] = resolver.resolveElement({
47
- element: baseElement,
48
- inputAst,
49
- elementBindings: bindings
50
- });
51
- expect(resolved.inputs.text).toBe("Alice");
52
- expect(resolved.styles).toEqual({
53
- paddingTop: "10px"
54
- });
55
- });
56
- it("resolves nested objects", () => {
57
- const state = {};
58
- const bindings = {
59
- root: {
60
- inputs: {
61
- children: {
62
- id: "children",
63
- type: "slot",
64
- list: true,
65
- static: ["qizw1hgqjvj8g5a43szzc"]
66
- }
67
- }
68
- },
69
- qizw1hgqjvj8g5a43szzc: {
70
- inputs: {
71
- title: {
72
- id: "title",
73
- static: "Default Columns Title",
74
- type: "text"
75
- },
76
- "leftColumn/0": {
77
- id: "slot",
78
- static: ["7znyr9z2cpizegnrk2rhu"],
79
- type: "slot",
80
- list: true
81
- },
82
- "rightColumn/0": {
83
- id: "slot",
84
- static: ["cwld8kxy0qhhtaql42lr5"],
85
- type: "slot",
86
- list: true
87
- }
88
- },
89
- styles: {
90
- paddingTop: {
91
- static: "20px"
92
- },
93
- backgroundColor: {
94
- static: "#5c9a12"
95
- }
96
- }
97
- },
98
- "7znyr9z2cpizegnrk2rhu": {
99
- inputs: {
100
- title: {
101
- id: "title",
102
- static: "Left Column Title",
103
- type: "text"
104
- },
105
- children: {
106
- id: "slot",
107
- static: [],
108
- type: "slot",
109
- list: true
110
- }
111
- },
112
- styles: {
113
- backgroundColor: {
114
- static: "red"
115
- },
116
- marginTop: {
117
- static: "20px"
118
- }
119
- }
120
- },
121
- cwld8kxy0qhhtaql42lr5: {
122
- inputs: {
123
- title: {
124
- id: "title",
125
- static: "Right Column Title",
126
- type: "text"
127
- },
128
- children: {
129
- id: "slot",
130
- static: [],
131
- type: "slot",
132
- list: true
133
- }
134
- },
135
- styles: {
136
- backgroundColor: {
137
- static: "blue"
138
- },
139
- marginTop: {
140
- static: "20px"
141
- }
142
- }
143
- }
144
- };
145
- const elements = {
146
- root: {
147
- type: "Webiny/Element",
148
- id: "root",
149
- component: {
150
- name: "Webiny/Root"
151
- }
152
- },
153
- qizw1hgqjvj8g5a43szzc: {
154
- type: "Webiny/Element",
155
- id: "qizw1hgqjvj8g5a43szzc",
156
- parent: {
157
- id: "root",
158
- slot: "children"
159
- },
160
- component: {
161
- name: "Webiny/TwoColumns"
162
- }
163
- },
164
- "7znyr9z2cpizegnrk2rhu": {
5
+ describe("BindingsResolver", ()=>{
6
+ const baseElement = {
7
+ id: "test1",
165
8
  type: "Webiny/Element",
166
- id: "7znyr9z2cpizegnrk2rhu",
167
- parent: {
168
- id: "qizw1hgqjvj8g5a43szzc",
169
- slot: "leftColumn/0"
170
- },
171
9
  component: {
172
- name: "Webiny/TextWithDropzone"
10
+ name: "Webiny/Text"
173
11
  }
174
- },
175
- cwld8kxy0qhhtaql42lr5: {
12
+ };
13
+ const rootElement = {
14
+ id: "root",
176
15
  type: "Webiny/Element",
177
- id: "cwld8kxy0qhhtaql42lr5",
178
- parent: {
179
- id: "qizw1hgqjvj8g5a43szzc",
180
- slot: "rightColumn/0"
181
- },
182
16
  component: {
183
- name: "Webiny/TextWithDropzone"
17
+ name: "Webiny/Root"
184
18
  }
185
- }
186
19
  };
187
- const inputs = [{
188
- type: "text",
189
- renderer: "Webiny/Input",
190
- name: "title",
191
- label: "Title",
192
- fields: []
193
- }, {
194
- type: "slot",
195
- list: true,
196
- renderer: "Webiny/Slot",
197
- name: "leftColumn",
198
- fields: []
199
- }, {
200
- type: "slot",
201
- list: true,
202
- renderer: "Webiny/Slot",
203
- name: "rightColumn",
204
- fields: []
205
- }];
206
- const inputAst = ComponentManifestToAstConverter.convert(inputs);
207
- const resolver = new BindingsResolver(state);
208
- const [resolved] = resolver.resolveElement({
209
- element: elements["qizw1hgqjvj8g5a43szzc"],
210
- inputAst,
211
- 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
+ });
212
57
  });
213
- expect(resolved.inputs.title).toBe("Default Columns Title");
214
- expect(resolved.inputs.leftColumn).toEqual([["7znyr9z2cpizegnrk2rhu"]]);
215
- expect(resolved.inputs.rightColumn).toEqual([["cwld8kxy0qhhtaql42lr5"]]);
216
- });
217
- it("falls back to static if no expression is provided", () => {
218
- const state = {};
219
- const bindings = {
220
- inputs: {
221
- text: {
222
- id: "text",
223
- type: "text",
224
- static: "Static only"
225
- }
226
- }
227
- };
228
- const inputs = [createTextInput({
229
- name: "text"
230
- })];
231
- const inputAst = ComponentManifestToAstConverter.convert(inputs);
232
- const resolver = new BindingsResolver(state);
233
- const [resolved] = resolver.resolveElement({
234
- element: baseElement,
235
- inputAst,
236
- 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
+ ]);
237
236
  });
238
- expect(resolved.inputs.text).toBe("Static only");
239
- });
240
- it("uses undefined if expression fails and no static exists", () => {
241
- const state = {};
242
- const bindings = {
243
- inputs: {
244
- text: {
245
- id: "text",
246
- type: "text",
247
- static: "Fallback",
248
- expression: "$.unknown.value"
249
- }
250
- }
251
- };
252
- const inputs = [createTextInput({
253
- name: "text"
254
- })];
255
- const inputAst = ComponentManifestToAstConverter.convert(inputs);
256
- const resolver = new BindingsResolver(state);
257
- const [resolved] = resolver.resolveElement({
258
- element: baseElement,
259
- inputAst,
260
- 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");
261
261
  });
262
- expect(resolved.inputs.text).toBeUndefined();
263
- });
264
- it("uses input's `defaultValue` if binding doesn't exist", () => {
265
- const state = {};
266
- const bindings = {
267
- inputs: {}
268
- };
269
- const inputs = [createSlotInput({
270
- name: "children",
271
- defaultValue: []
272
- })];
273
- const inputAst = ComponentManifestToAstConverter.convert(inputs);
274
- const resolver = new BindingsResolver(state);
275
- const [resolved] = resolver.resolveElement({
276
- element: rootElement,
277
- inputAst,
278
- elementBindings: bindings,
279
- onResolved(value, input) {
280
- if (input.type === "slot") {
281
- return "slot";
282
- }
283
- return value;
284
- }
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();
285
287
  });
286
- expect(resolved.inputs.children).toEqual("slot");
287
- });
288
- it("handles $repeat using expression and maps items", () => {
289
- const state = {
290
- products: [{
291
- title: "Shirt"
292
- }, {
293
- title: "Hat"
294
- }]
295
- };
296
- const bindings = {
297
- $repeat: {
298
- expression: "$state.products"
299
- },
300
- inputs: {
301
- text: {
302
- id: "text",
303
- type: "text",
304
- expression: "$.title",
305
- static: "Unnamed"
306
- }
307
- }
308
- };
309
- const inputs = [createTextInput({
310
- name: "text"
311
- })];
312
- const inputAst = ComponentManifestToAstConverter.convert(inputs);
313
- const resolver = new BindingsResolver(state);
314
- const resolved = resolver.resolveElement({
315
- element: baseElement,
316
- inputAst,
317
- 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");
318
311
  });
319
- expect(resolved).toHaveLength(2);
320
- expect(resolved[0].inputs.text).toBe("Shirt");
321
- expect(resolved[1].inputs.text).toBe("Hat");
322
- });
323
- it("returns empty array if $repeat doesn't resolve to an array", () => {
324
- const state = {
325
- invalid: 42
326
- };
327
- const bindings = {
328
- $repeat: {
329
- expression: "$state.invalid"
330
- },
331
- inputs: {
332
- text: {
333
- id: "text",
334
- type: "text",
335
- static: "Should not be used"
336
- }
337
- }
338
- };
339
- const inputs = [createTextInput({
340
- name: "text"
341
- })];
342
- const inputAst = ComponentManifestToAstConverter.convert(inputs);
343
- const resolver = new BindingsResolver(state);
344
- const resolved = resolver.resolveElement({
345
- element: baseElement,
346
- inputAst,
347
- 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");
348
351
  });
349
- expect(resolved).toEqual([]);
350
- });
351
- it("resolves binding that refers to a specific array index", () => {
352
- const state = {
353
- list: [{
354
- text: "First item text"
355
- }, {
356
- text: "Second item text"
357
- }]
358
- };
359
- const bindings = {
360
- inputs: {
361
- text: {
362
- id: "text",
363
- type: "text",
364
- static: "Static fallback",
365
- expression: "$state.list.0.text"
366
- }
367
- }
368
- };
369
- const inputs = [createTextInput({
370
- name: "text"
371
- })];
372
- const inputAst = ComponentManifestToAstConverter.convert(inputs);
373
- const resolver = new BindingsResolver(state);
374
- const [resolved] = resolver.resolveElement({
375
- element: baseElement,
376
- inputAst,
377
- 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");
378
416
  });
379
- expect(resolved.inputs.text).toBe("First item text");
380
- });
381
417
  });
382
418
 
383
419
  //# sourceMappingURL=BindingsResolver.test.js.map