@webiny/website-builder-sdk 0.0.0-unstable.6844005670 → 0.0.0-unstable.7be00a75a9

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 (169) 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 -122
  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 +33 -22
  16. package/ComponentRegistry.js.map +1 -1
  17. package/ComponentResolver.js +25 -29
  18. package/ComponentResolver.js.map +1 -1
  19. package/ConstraintEvaluator.d.ts +36 -0
  20. package/ConstraintEvaluator.js +288 -0
  21. package/ConstraintEvaluator.js.map +1 -0
  22. package/ConstraintEvaluator.test.d.ts +1 -0
  23. package/ConstraintEvaluator.test.js +1634 -0
  24. package/ConstraintEvaluator.test.js.map +1 -0
  25. package/ContentSdk.js +83 -90
  26. package/ContentSdk.js.map +1 -1
  27. package/DocumentStore.js +47 -59
  28. package/DocumentStore.js.map +1 -1
  29. package/DocumentStoreManager.js +17 -16
  30. package/DocumentStoreManager.js.map +1 -1
  31. package/EditingSdk.js +87 -121
  32. package/EditingSdk.js.map +1 -1
  33. package/ElementFactory.d.ts +2 -3
  34. package/ElementFactory.js +125 -164
  35. package/ElementFactory.js.map +1 -1
  36. package/ElementFactory.test.d.ts +1 -0
  37. package/ElementFactory.test.js +251 -0
  38. package/ElementFactory.test.js.map +1 -0
  39. package/Environment.js +18 -19
  40. package/Environment.js.map +1 -1
  41. package/FunctionConverter.js +8 -7
  42. package/FunctionConverter.js.map +1 -1
  43. package/HashObject.js +11 -12
  44. package/HashObject.js.map +1 -1
  45. package/HotkeyManager.js +40 -47
  46. package/HotkeyManager.js.map +1 -1
  47. package/IBindingsUpdater.js +0 -3
  48. package/IRedirects.js +0 -3
  49. package/InheritanceProcessor.js +99 -139
  50. package/InheritanceProcessor.js.map +1 -1
  51. package/InheritanceProcessor.test.js +178 -179
  52. package/InheritanceProcessor.test.js.map +1 -1
  53. package/InheritedValueResolver.js +15 -20
  54. package/InheritedValueResolver.js.map +1 -1
  55. package/InputBindingsProcessor.js +187 -289
  56. package/InputBindingsProcessor.js.map +1 -1
  57. package/InputsBindingsProcessor.test.js +334 -314
  58. package/InputsBindingsProcessor.test.js.map +1 -1
  59. package/InputsUpdater.d.ts +1 -1
  60. package/InputsUpdater.js +23 -26
  61. package/InputsUpdater.js.map +1 -1
  62. package/LiveSdk.js +12 -13
  63. package/LiveSdk.js.map +1 -1
  64. package/Logger.js +9 -8
  65. package/Logger.js.map +1 -1
  66. package/MouseTracker.js +77 -83
  67. package/MouseTracker.js.map +1 -1
  68. package/NullSdk.d.ts +3 -2
  69. package/NullSdk.js +22 -21
  70. package/NullSdk.js.map +1 -1
  71. package/PreviewDocument.js +27 -30
  72. package/PreviewDocument.js.map +1 -1
  73. package/PreviewSdk.js +16 -17
  74. package/PreviewSdk.js.map +1 -1
  75. package/PreviewViewport.js +51 -63
  76. package/PreviewViewport.js.map +1 -1
  77. package/ResizeObserver.js +24 -31
  78. package/ResizeObserver.js.map +1 -1
  79. package/StylesBindingsProcessor.js +40 -79
  80. package/StylesBindingsProcessor.js.map +1 -1
  81. package/StylesUpdater.d.ts +1 -1
  82. package/StylesUpdater.js +20 -25
  83. package/StylesUpdater.js.map +1 -1
  84. package/Theme.js +29 -25
  85. package/Theme.js.map +1 -1
  86. package/ViewportManager.js +89 -101
  87. package/ViewportManager.js.map +1 -1
  88. package/constants.d.ts +1 -0
  89. package/constants.js +7 -5
  90. package/constants.js.map +1 -1
  91. package/createElement.js +5 -6
  92. package/createElement.js.map +1 -1
  93. package/createInput.js +85 -143
  94. package/createInput.js.map +1 -1
  95. package/createTheme.js +2 -3
  96. package/createTheme.js.map +1 -1
  97. package/dataProviders/ApiClient.js +40 -49
  98. package/dataProviders/ApiClient.js.map +1 -1
  99. package/dataProviders/DefaultDataProvider.js +56 -58
  100. package/dataProviders/DefaultDataProvider.js.map +1 -1
  101. package/dataProviders/GET_PAGE_BY_ID.d.ts +1 -1
  102. package/dataProviders/GET_PAGE_BY_ID.js +3 -1
  103. package/dataProviders/GET_PAGE_BY_ID.js.map +1 -1
  104. package/dataProviders/GET_PAGE_BY_PATH.d.ts +1 -1
  105. package/dataProviders/GET_PAGE_BY_PATH.js +3 -1
  106. package/dataProviders/GET_PAGE_BY_PATH.js.map +1 -1
  107. package/dataProviders/LIST_PUBLISHED_PAGES.js +2 -1
  108. package/dataProviders/LIST_PUBLISHED_PAGES.js.map +1 -1
  109. package/dataProviders/NullDataProvider.d.ts +4 -3
  110. package/dataProviders/NullDataProvider.js +21 -20
  111. package/dataProviders/NullDataProvider.js.map +1 -1
  112. package/dataProviders/RedirectsProvider.js +24 -27
  113. package/dataProviders/RedirectsProvider.js.map +1 -1
  114. package/defaultBreakpoints.js +23 -22
  115. package/defaultBreakpoints.js.map +1 -1
  116. package/documentOperations/$addElementReferenceToParent.d.ts +1 -1
  117. package/documentOperations/$addElementReferenceToParent.js +30 -26
  118. package/documentOperations/$addElementReferenceToParent.js.map +1 -1
  119. package/documentOperations/AddElement.js +8 -7
  120. package/documentOperations/AddElement.js.map +1 -1
  121. package/documentOperations/AddToParent.d.ts +2 -2
  122. package/documentOperations/AddToParent.js +14 -13
  123. package/documentOperations/AddToParent.js.map +1 -1
  124. package/documentOperations/IDocumentOperation.js +0 -3
  125. package/documentOperations/RemoveElement.js +10 -7
  126. package/documentOperations/RemoveElement.js.map +1 -1
  127. package/documentOperations/SetGlobalInputBinding.js +23 -22
  128. package/documentOperations/SetGlobalInputBinding.js.map +1 -1
  129. package/documentOperations/SetGlobalStyleBinding.js +23 -23
  130. package/documentOperations/SetGlobalStyleBinding.js.map +1 -1
  131. package/documentOperations/SetInputBindingOverride.js +30 -29
  132. package/documentOperations/SetInputBindingOverride.js.map +1 -1
  133. package/documentOperations/SetStyleBindingOverride.js +30 -31
  134. package/documentOperations/SetStyleBindingOverride.js.map +1 -1
  135. package/documentOperations/index.js +9 -8
  136. package/documentOperations/index.js.map +1 -1
  137. package/findMatchingAstNode.js +11 -13
  138. package/findMatchingAstNode.js.map +1 -1
  139. package/generateElementId.js +2 -1
  140. package/generateElementId.js.map +1 -1
  141. package/headersProvider.js +4 -3
  142. package/headersProvider.js.map +1 -1
  143. package/index.d.ts +1 -0
  144. package/index.js +1 -2
  145. package/jsonPatch.js +5 -9
  146. package/jsonPatch.js.map +1 -1
  147. package/messages.js +12 -11
  148. package/messages.js.map +1 -1
  149. package/messenger/MessageOrigin.js +12 -11
  150. package/messenger/MessageOrigin.js.map +1 -1
  151. package/messenger/Messenger.js +58 -71
  152. package/messenger/Messenger.js.map +1 -1
  153. package/messenger/index.js +0 -2
  154. package/package.json +14 -14
  155. package/registerComponentGroup.js +5 -6
  156. package/registerComponentGroup.js.map +1 -1
  157. package/types/ShorthandCssProperties.js +0 -3
  158. package/types/WebsiteBuilderTheme.d.ts +7 -0
  159. package/types/WebsiteBuilderTheme.js +0 -3
  160. package/types.d.ts +153 -9
  161. package/types.js +0 -3
  162. package/IBindingsUpdater.js.map +0 -1
  163. package/IRedirects.js.map +0 -1
  164. package/documentOperations/IDocumentOperation.js.map +0 -1
  165. package/index.js.map +0 -1
  166. package/messenger/index.js.map +0 -1
  167. package/types/ShorthandCssProperties.js.map +0 -1
  168. package/types/WebsiteBuilderTheme.js.map +0 -1
  169. 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