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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. package/BindingsApi.js +29 -36
  2. package/BindingsApi.js.map +1 -1
  3. package/BindingsProcessor.js +34 -43
  4. package/BindingsProcessor.js.map +1 -1
  5. package/BindingsProcessor.test.js +82 -78
  6. package/BindingsProcessor.test.js.map +1 -1
  7. package/BindingsResolver.d.ts +4 -1
  8. package/BindingsResolver.js +99 -119
  9. package/BindingsResolver.js.map +1 -1
  10. package/BindingsResolver.test.js +399 -363
  11. package/BindingsResolver.test.js.map +1 -1
  12. package/ComponentInputTraverser.js +32 -49
  13. package/ComponentInputTraverser.js.map +1 -1
  14. package/ComponentManifestToAstConverter.js +20 -21
  15. package/ComponentManifestToAstConverter.js.map +1 -1
  16. package/ComponentRegistry.d.ts +9 -0
  17. package/ComponentRegistry.js +30 -44
  18. package/ComponentRegistry.js.map +1 -1
  19. package/ComponentResolver.d.ts +3 -2
  20. package/ComponentResolver.js +39 -29
  21. package/ComponentResolver.js.map +1 -1
  22. package/ComponentResolver.test.d.ts +1 -0
  23. package/ComponentResolver.test.js +81 -0
  24. package/ComponentResolver.test.js.map +1 -0
  25. package/ConstraintEvaluator.js +246 -353
  26. package/ConstraintEvaluator.js.map +1 -1
  27. package/ConstraintEvaluator.test.js +1616 -1438
  28. package/ConstraintEvaluator.test.js.map +1 -1
  29. package/ContentSdk.d.ts +14 -0
  30. package/ContentSdk.js +113 -90
  31. package/ContentSdk.js.map +1 -1
  32. package/DocumentStore.js +47 -59
  33. package/DocumentStore.js.map +1 -1
  34. package/DocumentStoreManager.js +17 -16
  35. package/DocumentStoreManager.js.map +1 -1
  36. package/EditingSdk.js +92 -121
  37. package/EditingSdk.js.map +1 -1
  38. package/ElementFactory.js +164 -172
  39. package/ElementFactory.js.map +1 -1
  40. package/ElementFactory.objectListDefaults.test.d.ts +1 -0
  41. package/ElementFactory.objectListDefaults.test.js +423 -0
  42. package/ElementFactory.objectListDefaults.test.js.map +1 -0
  43. package/ElementFactory.test.js +335 -262
  44. package/ElementFactory.test.js.map +1 -1
  45. package/Environment.js +18 -19
  46. package/Environment.js.map +1 -1
  47. package/FunctionConverter.js +8 -7
  48. package/FunctionConverter.js.map +1 -1
  49. package/HashObject.js +11 -26
  50. package/HashObject.js.map +1 -1
  51. package/HotkeyManager.js +40 -47
  52. package/HotkeyManager.js.map +1 -1
  53. package/IBindingsUpdater.js +0 -3
  54. package/IRedirects.js +0 -3
  55. package/InheritanceProcessor.js +99 -139
  56. package/InheritanceProcessor.js.map +1 -1
  57. package/InheritanceProcessor.test.js +178 -179
  58. package/InheritanceProcessor.test.js.map +1 -1
  59. package/InheritedValueResolver.d.ts +18 -1
  60. package/InheritedValueResolver.js +18 -20
  61. package/InheritedValueResolver.js.map +1 -1
  62. package/InputBindingsProcessor.d.ts +23 -2
  63. package/InputBindingsProcessor.js +200 -307
  64. package/InputBindingsProcessor.js.map +1 -1
  65. package/InputBindingsProcessorTokens.test.d.ts +1 -0
  66. package/InputBindingsProcessorTokens.test.js +400 -0
  67. package/InputBindingsProcessorTokens.test.js.map +1 -0
  68. package/InputsBindingsProcessor.test.js +334 -315
  69. package/InputsBindingsProcessor.test.js.map +1 -1
  70. package/InputsUpdater.js +23 -26
  71. package/InputsUpdater.js.map +1 -1
  72. package/LiveSdk.js +12 -13
  73. package/LiveSdk.js.map +1 -1
  74. package/Logger.js +9 -8
  75. package/Logger.js.map +1 -1
  76. package/MouseTracker.js +77 -83
  77. package/MouseTracker.js.map +1 -1
  78. package/NullSdk.js +22 -21
  79. package/NullSdk.js.map +1 -1
  80. package/PreviewDocument.d.ts +1 -0
  81. package/PreviewDocument.js +30 -30
  82. package/PreviewDocument.js.map +1 -1
  83. package/PreviewSdk.d.ts +2 -1
  84. package/PreviewSdk.js +19 -17
  85. package/PreviewSdk.js.map +1 -1
  86. package/PreviewViewport.js +51 -63
  87. package/PreviewViewport.js.map +1 -1
  88. package/ResizeObserver.js +24 -31
  89. package/ResizeObserver.js.map +1 -1
  90. package/StylesBindingsProcessor.d.ts +12 -2
  91. package/StylesBindingsProcessor.js +62 -79
  92. package/StylesBindingsProcessor.js.map +1 -1
  93. package/StylesUpdater.js +20 -25
  94. package/StylesUpdater.js.map +1 -1
  95. package/Theme.js +30 -25
  96. package/Theme.js.map +1 -1
  97. package/ViewportManager.js +89 -101
  98. package/ViewportManager.js.map +1 -1
  99. package/assertBindingShapes.d.ts +31 -0
  100. package/assertBindingShapes.js +64 -0
  101. package/assertBindingShapes.js.map +1 -0
  102. package/assertBindingShapes.test.d.ts +1 -0
  103. package/assertBindingShapes.test.js +131 -0
  104. package/assertBindingShapes.test.js.map +1 -0
  105. package/asset/deliveryUrl.d.ts +41 -0
  106. package/asset/deliveryUrl.js +34 -0
  107. package/asset/deliveryUrl.js.map +1 -0
  108. package/asset/deliveryUrl.test.d.ts +1 -0
  109. package/asset/deliveryUrl.test.js +127 -0
  110. package/asset/deliveryUrl.test.js.map +1 -0
  111. package/asset/geometry.d.ts +7 -0
  112. package/asset/geometry.js +10 -0
  113. package/asset/geometry.js.map +1 -0
  114. package/asset/imageSrcSet.d.ts +63 -0
  115. package/asset/imageSrcSet.js +98 -0
  116. package/asset/imageSrcSet.js.map +1 -0
  117. package/asset/imageSrcSet.test.d.ts +1 -0
  118. package/asset/imageSrcSet.test.js +103 -0
  119. package/asset/imageSrcSet.test.js.map +1 -0
  120. package/asset/index.d.ts +5 -0
  121. package/asset/index.js +5 -0
  122. package/asset/normalize.d.ts +24 -0
  123. package/asset/normalize.js +106 -0
  124. package/asset/normalize.js.map +1 -0
  125. package/asset/normalize.test.d.ts +1 -0
  126. package/asset/normalize.test.js +263 -0
  127. package/asset/normalize.test.js.map +1 -0
  128. package/asset/types.d.ts +2 -0
  129. package/asset/types.js +0 -0
  130. package/constants.js +7 -6
  131. package/constants.js.map +1 -1
  132. package/contentEntry/ContentEntryBindingsResolver.d.ts +30 -0
  133. package/contentEntry/ContentEntryBindingsResolver.js +45 -0
  134. package/contentEntry/ContentEntryBindingsResolver.js.map +1 -0
  135. package/contentEntry/ContentEntryCache.d.ts +46 -0
  136. package/contentEntry/ContentEntryCache.js +50 -0
  137. package/contentEntry/ContentEntryCache.js.map +1 -0
  138. package/contentEntry/resolveContentEntry.d.ts +74 -0
  139. package/contentEntry/resolveContentEntry.js +53 -0
  140. package/contentEntry/resolveContentEntry.js.map +1 -0
  141. package/contentEntry/resolveContentEntry.test.d.ts +1 -0
  142. package/contentEntry/resolveContentEntry.test.js +213 -0
  143. package/contentEntry/resolveContentEntry.test.js.map +1 -0
  144. package/createComponent.d.ts +5 -0
  145. package/createComponent.js +32 -0
  146. package/createComponent.js.map +1 -0
  147. package/createElement.js +5 -6
  148. package/createElement.js.map +1 -1
  149. package/createInput.d.ts +10 -2
  150. package/createInput.js +92 -143
  151. package/createInput.js.map +1 -1
  152. package/createTheme.js +2 -3
  153. package/createTheme.js.map +1 -1
  154. package/dataProviders/ApiClient.d.ts +10 -5
  155. package/dataProviders/ApiClient.js +40 -49
  156. package/dataProviders/ApiClient.js.map +1 -1
  157. package/dataProviders/DefaultDataProvider.d.ts +4 -0
  158. package/dataProviders/DefaultDataProvider.js +91 -58
  159. package/dataProviders/DefaultDataProvider.js.map +1 -1
  160. package/dataProviders/GET_EXPERIMENT_PAUSED.d.ts +1 -0
  161. package/dataProviders/GET_EXPERIMENT_PAUSED.js +17 -0
  162. package/dataProviders/GET_EXPERIMENT_PAUSED.js.map +1 -0
  163. package/dataProviders/GET_PAGE_BY_ID.js +2 -1
  164. package/dataProviders/GET_PAGE_BY_ID.js.map +1 -1
  165. package/dataProviders/GET_PAGE_BY_PATH.js +2 -1
  166. package/dataProviders/GET_PAGE_BY_PATH.js.map +1 -1
  167. package/dataProviders/GET_PAGE_EXPERIMENT.d.ts +1 -0
  168. package/dataProviders/GET_PAGE_EXPERIMENT.js +32 -0
  169. package/dataProviders/GET_PAGE_EXPERIMENT.js.map +1 -0
  170. package/dataProviders/GET_VARIANT_CONTENT.d.ts +1 -0
  171. package/dataProviders/GET_VARIANT_CONTENT.js +24 -0
  172. package/dataProviders/GET_VARIANT_CONTENT.js.map +1 -0
  173. package/dataProviders/LIST_PUBLISHED_PAGES.js +2 -1
  174. package/dataProviders/LIST_PUBLISHED_PAGES.js.map +1 -1
  175. package/dataProviders/NullDataProvider.d.ts +4 -0
  176. package/dataProviders/NullDataProvider.js +30 -20
  177. package/dataProviders/NullDataProvider.js.map +1 -1
  178. package/dataProviders/RedirectsProvider.js +24 -27
  179. package/dataProviders/RedirectsProvider.js.map +1 -1
  180. package/defaultBreakpoints.js +43 -22
  181. package/defaultBreakpoints.js.map +1 -1
  182. package/documentOperations/$addElementReferenceToParent.js +29 -32
  183. package/documentOperations/$addElementReferenceToParent.js.map +1 -1
  184. package/documentOperations/AddElement.js +8 -7
  185. package/documentOperations/AddElement.js.map +1 -1
  186. package/documentOperations/AddToParent.js +14 -13
  187. package/documentOperations/AddToParent.js.map +1 -1
  188. package/documentOperations/IDocumentOperation.js +0 -3
  189. package/documentOperations/RemoveElement.js +9 -15
  190. package/documentOperations/RemoveElement.js.map +1 -1
  191. package/documentOperations/SetGlobalInputBinding.js +23 -22
  192. package/documentOperations/SetGlobalInputBinding.js.map +1 -1
  193. package/documentOperations/SetGlobalStyleBinding.js +23 -23
  194. package/documentOperations/SetGlobalStyleBinding.js.map +1 -1
  195. package/documentOperations/SetInputBindingOverride.js +30 -29
  196. package/documentOperations/SetInputBindingOverride.js.map +1 -1
  197. package/documentOperations/SetStyleBindingOverride.js +30 -31
  198. package/documentOperations/SetStyleBindingOverride.js.map +1 -1
  199. package/documentOperations/index.js +9 -8
  200. package/documentOperations/index.js.map +1 -1
  201. package/experiments/PostHogAnalyticsProvider.d.ts +31 -0
  202. package/experiments/PostHogAnalyticsProvider.js +28 -0
  203. package/experiments/PostHogAnalyticsProvider.js.map +1 -0
  204. package/experiments/analyticsProvider.d.ts +4 -0
  205. package/experiments/analyticsProvider.js +11 -0
  206. package/experiments/analyticsProvider.js.map +1 -0
  207. package/experiments/bucketing.d.ts +27 -0
  208. package/experiments/bucketing.js +91 -0
  209. package/experiments/bucketing.js.map +1 -0
  210. package/experiments/bucketing.test.d.ts +1 -0
  211. package/experiments/bucketing.test.js +183 -0
  212. package/experiments/bucketing.test.js.map +1 -0
  213. package/experiments/index.d.ts +5 -0
  214. package/experiments/index.js +5 -0
  215. package/experiments/render.d.ts +79 -0
  216. package/experiments/render.js +149 -0
  217. package/experiments/render.js.map +1 -0
  218. package/experiments/types.d.ts +108 -0
  219. package/experiments/types.js +4 -0
  220. package/experiments/types.js.map +1 -0
  221. package/findMatchingAstNode.js +11 -13
  222. package/findMatchingAstNode.js.map +1 -1
  223. package/generateElementId.js +2 -1
  224. package/generateElementId.js.map +1 -1
  225. package/headersProvider.js +4 -3
  226. package/headersProvider.js.map +1 -1
  227. package/image/geometry.d.ts +54 -0
  228. package/image/geometry.js +112 -0
  229. package/image/geometry.js.map +1 -0
  230. package/image/geometry.test.d.ts +1 -0
  231. package/image/geometry.test.js +190 -0
  232. package/image/geometry.test.js.map +1 -0
  233. package/image/index.d.ts +3 -0
  234. package/image/index.js +3 -0
  235. package/image/presets.d.ts +6 -0
  236. package/image/presets.js +20 -0
  237. package/image/presets.js.map +1 -0
  238. package/image/types.d.ts +10 -0
  239. package/image/types.js +0 -0
  240. package/index.d.ts +10 -0
  241. package/index.js +10 -2
  242. package/jsonPatch.js +5 -9
  243. package/jsonPatch.js.map +1 -1
  244. package/messages.js +12 -11
  245. package/messages.js.map +1 -1
  246. package/messenger/MessageOrigin.js +12 -11
  247. package/messenger/MessageOrigin.js.map +1 -1
  248. package/messenger/Messenger.js +58 -69
  249. package/messenger/Messenger.js.map +1 -1
  250. package/messenger/index.js +0 -2
  251. package/package.json +12 -9
  252. package/registerComponentGroup.js +5 -6
  253. package/registerComponentGroup.js.map +1 -1
  254. package/tokenBinding.d.ts +26 -0
  255. package/tokenBinding.js +15 -0
  256. package/tokenBinding.js.map +1 -0
  257. package/tokenBinding.test.d.ts +1 -0
  258. package/tokenBinding.test.js +165 -0
  259. package/tokenBinding.test.js.map +1 -0
  260. package/types/ShorthandCssProperties.js +0 -3
  261. package/types/WebsiteBuilderTheme.d.ts +12 -0
  262. package/types/WebsiteBuilderTheme.js +0 -3
  263. package/types.d.ts +96 -1
  264. package/types.js +0 -3
  265. package/IBindingsUpdater.js.map +0 -1
  266. package/IRedirects.js.map +0 -1
  267. package/documentOperations/IDocumentOperation.js.map +0 -1
  268. package/index.js.map +0 -1
  269. package/messenger/index.js.map +0 -1
  270. package/types/ShorthandCssProperties.js.map +0 -1
  271. package/types/WebsiteBuilderTheme.js.map +0 -1
  272. package/types.js.map +0 -1
package/EditingSdk.js CHANGED
@@ -1,6 +1,5 @@
1
1
  "use client";
2
-
3
- import { Messenger, MessageOrigin } from "./messenger/index.js";
2
+ import { MessageOrigin, Messenger } from "./messenger/index.js";
4
3
  import { logger } from "./Logger.js";
5
4
  import { PreviewViewport } from "./PreviewViewport.js";
6
5
  import { viewportManager } from "./ViewportManager.js";
@@ -9,132 +8,104 @@ import { functionConverter } from "./FunctionConverter.js";
9
8
  import { documentStoreManager } from "./DocumentStoreManager.js";
10
9
  import { PreviewDocument } from "./PreviewDocument.js";
11
10
  import { hashObject } from "./HashObject.js";
12
- export class EditingSdk {
13
- positionReportingEnabled = false;
14
- previewViewport = null;
15
- lastBoxesHash = 0;
16
- constructor(liveSdk, theme) {
17
- this.liveSdk = liveSdk;
18
- const source = new MessageOrigin(() => window, window.location.origin);
19
- const target = new MessageOrigin(() => window.parent, this.getReferrerOrigin());
20
- this.previewDocument = PreviewDocument.createFromWindow();
21
- this.documentStore = documentStoreManager.getStore(this.previewDocument.getId());
22
- this.messenger = new Messenger(source, target, "wb.editor.*");
23
- componentRegistry.onRegister(reg => {
24
- this.messenger.send("preview.component.register", reg.component.manifest);
25
- });
26
- this.setupListeners();
27
- this.messenger.send("preview.ready", true);
28
- if (theme) {
29
- this.messenger.send("preview.theme", {
30
- theme
31
- });
11
+ class EditingSdk {
12
+ constructor(liveSdk, theme){
13
+ this.positionReportingEnabled = false;
14
+ this.previewViewport = null;
15
+ this.lastBoxesHash = 0;
16
+ this.liveSdk = liveSdk;
17
+ const source = new MessageOrigin(()=>window, window.location.origin);
18
+ const target = new MessageOrigin(()=>window.parent, this.getReferrerOrigin());
19
+ this.previewDocument = PreviewDocument.createFromWindow();
20
+ this.documentStore = documentStoreManager.getStore(this.previewDocument.getId());
21
+ this.messenger = new Messenger(source, target, "wb.editor.*");
22
+ componentRegistry.onRegister((reg)=>{
23
+ this.messenger.send("preview.component.register", reg.component.manifest);
24
+ });
25
+ this.setupListeners();
26
+ this.messenger.send("preview.ready", true);
27
+ if (theme) this.messenger.send("preview.theme", {
28
+ theme
29
+ });
30
+ this.disableLinks();
32
31
  }
33
- this.disableLinks();
34
- }
35
- async getPage(path) {
36
- if (!this.previewDocument.matches({
37
- type: "page",
38
- path
39
- })) {
40
- return this.liveSdk.getPage(path);
32
+ async getPage(path) {
33
+ if (!this.previewDocument.matches({
34
+ type: "page",
35
+ path
36
+ })) return this.liveSdk.getPage(path);
37
+ await this.documentStore.waitForDocument();
38
+ return this.documentStore.getDocument();
41
39
  }
42
- await this.documentStore.waitForDocument();
43
- return this.documentStore.getDocument();
44
- }
45
- async listPages(options) {
46
- return this.liveSdk.listPages(options);
47
- }
48
- registerComponentGroup(group) {
49
- this.messenger.send("preview.componentGroup.register", {
50
- ...group,
51
- filter: group.filter ? functionConverter.serialize(group.filter) : undefined
52
- });
53
- }
54
- getReferrerOrigin() {
55
- try {
56
- const searchParams = new URLSearchParams(window.location.search);
57
- return searchParams.get("wb.referrer");
58
- } catch {
59
- return "";
40
+ async listPages(options) {
41
+ return this.liveSdk.listPages(options);
60
42
  }
61
- }
62
- setupListeners() {
63
- if (!this.messenger) {
64
- return;
43
+ registerComponentGroup(group) {
44
+ this.messenger.send("preview.componentGroup.register", {
45
+ ...group,
46
+ filter: group.filter ? functionConverter.serialize(group.filter) : void 0
47
+ });
65
48
  }
66
- this.messenger.on("document.set", data => {
67
- this.documentStore.setDocument(data);
68
- if (!this.positionReportingEnabled) {
69
- // Initialize position reporting
70
- this.initPositionReporting();
71
- }
72
- });
73
- this.messenger.on("element.set", data => {
74
- this.documentStore.updateElement(data.id, data.patch);
75
- });
76
- this.messenger.on("document.patch", patch => {
77
- this.documentStore.applyPatch(patch);
78
- });
79
- }
80
- initPositionReporting() {
81
- if (this.positionReportingEnabled) {
82
- return;
49
+ getReferrerOrigin() {
50
+ try {
51
+ const searchParams = new URLSearchParams(window.location.search);
52
+ return searchParams.get("wb.referrer");
53
+ } catch {
54
+ return "";
55
+ }
83
56
  }
84
-
85
- // Initialize element positions tracker
86
- this.previewViewport = new PreviewViewport();
87
-
88
- // Add event listeners
89
- viewportManager.onViewportChangeStart(() => {
90
- if (this.messenger) {
91
- this.messenger.send("preview.viewport.change.start");
92
- }
93
- });
94
- viewportManager.onViewportChangeEnd(() => {
95
- if (this.messenger) {
96
- this.messenger.send("preview.viewport.change.end");
97
- }
98
- });
99
-
100
- // Enable position reporting by default
101
- this.positionReportingEnabled = true;
102
-
103
- // Report positions periodically
104
- setInterval(() => this.reportBoxes(), 300);
105
- }
106
- reportBoxes() {
107
- if (!this.messenger || !this.previewViewport) {
108
- logger.warn("No messenger or preview viewport. Skipping position reporting.");
109
- return;
57
+ setupListeners() {
58
+ if (!this.messenger) return;
59
+ this.messenger.on("document.set", (data)=>{
60
+ this.documentStore.setDocument(data);
61
+ if (!this.positionReportingEnabled) this.initPositionReporting();
62
+ });
63
+ this.messenger.on("element.set", (data)=>{
64
+ this.documentStore.updateElement(data.id, data.patch);
65
+ });
66
+ this.messenger.on("document.patch", (patch)=>{
67
+ this.documentStore.applyPatch(patch);
68
+ });
69
+ this.messenger.on("theme.mode", ({ mode })=>{
70
+ const root = document.documentElement;
71
+ if ("light" === mode || "dark" === mode) root.setAttribute("data-wby-theme-mode", mode);
72
+ else root.removeAttribute("data-wby-theme-mode");
73
+ });
110
74
  }
111
- const newBoxes = this.previewViewport.getBoxes();
112
- const hash = hashObject.hash(newBoxes);
113
- if (hash === this.lastBoxesHash) {
114
- return;
75
+ initPositionReporting() {
76
+ if (this.positionReportingEnabled) return;
77
+ this.previewViewport = new PreviewViewport();
78
+ viewportManager.onViewportChangeStart(()=>{
79
+ if (this.messenger) this.messenger.send("preview.viewport.change.start");
80
+ });
81
+ viewportManager.onViewportChangeEnd(()=>{
82
+ if (this.messenger) this.messenger.send("preview.viewport.change.end");
83
+ });
84
+ this.positionReportingEnabled = true;
85
+ setInterval(()=>this.reportBoxes(), 300);
86
+ }
87
+ reportBoxes() {
88
+ if (!this.messenger || !this.previewViewport) return void logger.warn("No messenger or preview viewport. Skipping position reporting.");
89
+ const newBoxes = this.previewViewport.getBoxes();
90
+ const hash = hashObject.hash(newBoxes);
91
+ if (hash === this.lastBoxesHash) return;
92
+ this.lastBoxesHash = hash;
93
+ this.messenger.send("preview.viewport", {
94
+ boxes: this.previewViewport.getBoxes(),
95
+ viewport: this.previewViewport.getViewport()
96
+ });
97
+ }
98
+ disableLinks() {
99
+ document.addEventListener("click", (event)=>{
100
+ const target = event.target;
101
+ const anchor = target.closest("a");
102
+ if (anchor && anchor.href) {
103
+ event.preventDefault();
104
+ event.stopPropagation();
105
+ }
106
+ }, true);
115
107
  }
116
- this.lastBoxesHash = hash;
117
- // Send positions to the editor
118
- this.messenger.send("preview.viewport", {
119
- boxes: this.previewViewport.getBoxes(),
120
- viewport: this.previewViewport.getViewport()
121
- });
122
- }
123
- disableLinks() {
124
- // Intercept link clicks when we're in the editing mode (loaded via iframe from the editor).
125
- document.addEventListener("click", event => {
126
- const target = event.target;
127
-
128
- // Check if the clicked element or any of its ancestors is a link
129
- const anchor = target.closest("a");
130
- if (anchor && anchor.href) {
131
- event.preventDefault();
132
- event.stopPropagation();
133
- }
134
- },
135
- // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#usecapture
136
- true);
137
- }
138
108
  }
109
+ export { EditingSdk };
139
110
 
140
111
  //# sourceMappingURL=EditingSdk.js.map
package/EditingSdk.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["Messenger","MessageOrigin","logger","PreviewViewport","viewportManager","componentRegistry","functionConverter","documentStoreManager","PreviewDocument","hashObject","EditingSdk","positionReportingEnabled","previewViewport","lastBoxesHash","constructor","liveSdk","theme","source","window","location","origin","target","parent","getReferrerOrigin","previewDocument","createFromWindow","documentStore","getStore","getId","messenger","onRegister","reg","send","component","manifest","setupListeners","disableLinks","getPage","path","matches","type","waitForDocument","getDocument","listPages","options","registerComponentGroup","group","filter","serialize","undefined","searchParams","URLSearchParams","search","get","on","data","setDocument","initPositionReporting","updateElement","id","patch","applyPatch","onViewportChangeStart","onViewportChangeEnd","setInterval","reportBoxes","warn","newBoxes","getBoxes","hash","boxes","viewport","getViewport","document","addEventListener","event","anchor","closest","href","preventDefault","stopPropagation"],"sources":["EditingSdk.ts"],"sourcesContent":["\"use client\";\nimport type {\n ComponentGroup,\n IContentSdk,\n ListPagesOptions,\n ListPagesResult,\n PublicPage\n} from \"./types.js\";\nimport { Messenger, MessageOrigin } from \"./messenger/index.js\";\nimport { logger } from \"./Logger.js\";\nimport { PreviewViewport } from \"./PreviewViewport.js\";\nimport { viewportManager } from \"./ViewportManager.js\";\nimport { componentRegistry } from \"./ComponentRegistry.js\";\nimport { functionConverter } from \"./FunctionConverter.js\";\nimport { documentStoreManager } from \"~/DocumentStoreManager.js\";\nimport type { DocumentStore } from \"~/DocumentStore.js\";\nimport { PreviewDocument } from \"./PreviewDocument.js\";\nimport { hashObject } from \"~/HashObject.js\";\nimport type { WebsiteBuilderTheme } from \"~/types/WebsiteBuilderTheme.js\";\n\nexport class EditingSdk implements IContentSdk {\n public readonly messenger: Messenger;\n private positionReportingEnabled = false;\n private previewViewport: PreviewViewport | null = null;\n private liveSdk: IContentSdk;\n private documentStore: DocumentStore<PublicPage>;\n private previewDocument: PreviewDocument;\n private lastBoxesHash = 0;\n\n constructor(liveSdk: IContentSdk, theme: WebsiteBuilderTheme) {\n this.liveSdk = liveSdk;\n\n const source = new MessageOrigin(() => window, window.location.origin);\n const target = new MessageOrigin(() => window.parent, this.getReferrerOrigin());\n\n this.previewDocument = PreviewDocument.createFromWindow();\n\n this.documentStore = documentStoreManager.getStore<PublicPage>(\n this.previewDocument.getId()\n );\n\n this.messenger = new Messenger(source, target, \"wb.editor.*\");\n\n componentRegistry.onRegister(reg => {\n this.messenger.send(\"preview.component.register\", reg.component.manifest);\n });\n\n this.setupListeners();\n\n this.messenger.send(\"preview.ready\", true);\n\n if (theme) {\n this.messenger.send(\"preview.theme\", { theme });\n }\n\n this.disableLinks();\n }\n\n public async getPage(path: string): Promise<PublicPage | null> {\n if (!this.previewDocument.matches({ type: \"page\", path })) {\n return this.liveSdk.getPage(path);\n }\n\n await this.documentStore.waitForDocument();\n return this.documentStore.getDocument();\n }\n\n public async listPages(options?: ListPagesOptions): Promise<ListPagesResult> {\n return this.liveSdk.listPages(options);\n }\n\n registerComponentGroup(group: ComponentGroup) {\n this.messenger.send(\"preview.componentGroup.register\", {\n ...group,\n filter: group.filter ? functionConverter.serialize(group.filter) : undefined\n });\n }\n\n private getReferrerOrigin(): string {\n try {\n const searchParams = new URLSearchParams(window.location.search);\n return searchParams.get(\"wb.referrer\")!;\n } catch {\n return \"\";\n }\n }\n\n private setupListeners() {\n if (!this.messenger) {\n return;\n }\n\n this.messenger.on(\"document.set\", data => {\n this.documentStore.setDocument(data);\n\n if (!this.positionReportingEnabled) {\n // Initialize position reporting\n this.initPositionReporting();\n }\n });\n\n this.messenger.on(\"element.set\", data => {\n this.documentStore.updateElement(data.id, data.patch);\n });\n\n this.messenger.on(\"document.patch\", patch => {\n this.documentStore.applyPatch(patch);\n });\n }\n\n private initPositionReporting(): void {\n if (this.positionReportingEnabled) {\n return;\n }\n\n // Initialize element positions tracker\n this.previewViewport = new PreviewViewport();\n\n // Add event listeners\n viewportManager.onViewportChangeStart(() => {\n if (this.messenger) {\n this.messenger.send(\"preview.viewport.change.start\");\n }\n });\n\n viewportManager.onViewportChangeEnd(() => {\n if (this.messenger) {\n this.messenger.send(\"preview.viewport.change.end\");\n }\n });\n\n // Enable position reporting by default\n this.positionReportingEnabled = true;\n\n // Report positions periodically\n setInterval(() => this.reportBoxes(), 300);\n }\n\n private reportBoxes(): void {\n if (!this.messenger || !this.previewViewport) {\n logger.warn(\"No messenger or preview viewport. Skipping position reporting.\");\n return;\n }\n\n const newBoxes = this.previewViewport.getBoxes();\n const hash = hashObject.hash(newBoxes);\n if (hash === this.lastBoxesHash) {\n return;\n }\n\n this.lastBoxesHash = hash;\n // Send positions to the editor\n this.messenger.send(\"preview.viewport\", {\n boxes: this.previewViewport.getBoxes(),\n viewport: this.previewViewport.getViewport()\n });\n }\n\n private disableLinks() {\n // Intercept link clicks when we're in the editing mode (loaded via iframe from the editor).\n document.addEventListener(\n \"click\",\n event => {\n const target = event.target as HTMLElement;\n\n // Check if the clicked element or any of its ancestors is a link\n const anchor = target.closest(\"a\");\n\n if (anchor && anchor.href) {\n event.preventDefault();\n event.stopPropagation();\n }\n },\n // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#usecapture\n true\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"EditingSdk.js","sources":["../src/EditingSdk.ts"],"sourcesContent":["\"use client\";\nimport type {\n ComponentGroup,\n IContentSdk,\n ListPagesOptions,\n ListPagesResult,\n PublicPage\n} from \"./types.js\";\nimport { Messenger, MessageOrigin } from \"./messenger/index.js\";\nimport { logger } from \"./Logger.js\";\nimport { PreviewViewport } from \"./PreviewViewport.js\";\nimport { viewportManager } from \"./ViewportManager.js\";\nimport { componentRegistry } from \"./ComponentRegistry.js\";\nimport { functionConverter } from \"./FunctionConverter.js\";\nimport { documentStoreManager } from \"~/DocumentStoreManager.js\";\nimport type { DocumentStore } from \"~/DocumentStore.js\";\nimport { PreviewDocument } from \"./PreviewDocument.js\";\nimport { hashObject } from \"~/HashObject.js\";\nimport type { WebsiteBuilderTheme } from \"~/types/WebsiteBuilderTheme.js\";\n\nexport class EditingSdk implements IContentSdk {\n public readonly messenger: Messenger;\n private positionReportingEnabled = false;\n private previewViewport: PreviewViewport | null = null;\n private liveSdk: IContentSdk;\n private documentStore: DocumentStore<PublicPage>;\n private previewDocument: PreviewDocument;\n private lastBoxesHash = 0;\n\n constructor(liveSdk: IContentSdk, theme: WebsiteBuilderTheme) {\n this.liveSdk = liveSdk;\n\n const source = new MessageOrigin(() => window, window.location.origin);\n const target = new MessageOrigin(() => window.parent, this.getReferrerOrigin());\n\n this.previewDocument = PreviewDocument.createFromWindow();\n\n this.documentStore = documentStoreManager.getStore<PublicPage>(\n this.previewDocument.getId()\n );\n\n this.messenger = new Messenger(source, target, \"wb.editor.*\");\n\n componentRegistry.onRegister(reg => {\n this.messenger.send(\"preview.component.register\", reg.component.manifest);\n });\n\n this.setupListeners();\n\n this.messenger.send(\"preview.ready\", true);\n\n if (theme) {\n this.messenger.send(\"preview.theme\", { theme });\n }\n\n this.disableLinks();\n }\n\n public async getPage(path: string): Promise<PublicPage | null> {\n if (!this.previewDocument.matches({ type: \"page\", path })) {\n return this.liveSdk.getPage(path);\n }\n\n await this.documentStore.waitForDocument();\n return this.documentStore.getDocument();\n }\n\n public async listPages(options?: ListPagesOptions): Promise<ListPagesResult> {\n return this.liveSdk.listPages(options);\n }\n\n registerComponentGroup(group: ComponentGroup) {\n this.messenger.send(\"preview.componentGroup.register\", {\n ...group,\n filter: group.filter ? functionConverter.serialize(group.filter) : undefined\n });\n }\n\n private getReferrerOrigin(): string {\n try {\n const searchParams = new URLSearchParams(window.location.search);\n return searchParams.get(\"wb.referrer\")!;\n } catch {\n return \"\";\n }\n }\n\n private setupListeners() {\n if (!this.messenger) {\n return;\n }\n\n this.messenger.on(\"document.set\", data => {\n this.documentStore.setDocument(data);\n\n if (!this.positionReportingEnabled) {\n // Initialize position reporting\n this.initPositionReporting();\n }\n });\n\n this.messenger.on(\"element.set\", data => {\n this.documentStore.updateElement(data.id, data.patch);\n });\n\n this.messenger.on(\"document.patch\", patch => {\n this.documentStore.applyPatch(patch);\n });\n\n // Light/dark preview: the theme's dark values are declared under this attribute on the page's\n // own `:root`, so the editor's mode toggle drives it here, inside the iframe document.\n this.messenger.on(\"theme.mode\", ({ mode }: { mode?: string }) => {\n const root = document.documentElement;\n if (mode === \"light\" || mode === \"dark\") {\n root.setAttribute(\"data-wby-theme-mode\", mode);\n } else {\n root.removeAttribute(\"data-wby-theme-mode\");\n }\n });\n }\n\n private initPositionReporting(): void {\n if (this.positionReportingEnabled) {\n return;\n }\n\n // Initialize element positions tracker\n this.previewViewport = new PreviewViewport();\n\n // Add event listeners\n viewportManager.onViewportChangeStart(() => {\n if (this.messenger) {\n this.messenger.send(\"preview.viewport.change.start\");\n }\n });\n\n viewportManager.onViewportChangeEnd(() => {\n if (this.messenger) {\n this.messenger.send(\"preview.viewport.change.end\");\n }\n });\n\n // Enable position reporting by default\n this.positionReportingEnabled = true;\n\n // Report positions periodically\n setInterval(() => this.reportBoxes(), 300);\n }\n\n private reportBoxes(): void {\n if (!this.messenger || !this.previewViewport) {\n logger.warn(\"No messenger or preview viewport. Skipping position reporting.\");\n return;\n }\n\n const newBoxes = this.previewViewport.getBoxes();\n const hash = hashObject.hash(newBoxes);\n if (hash === this.lastBoxesHash) {\n return;\n }\n\n this.lastBoxesHash = hash;\n // Send positions to the editor\n this.messenger.send(\"preview.viewport\", {\n boxes: this.previewViewport.getBoxes(),\n viewport: this.previewViewport.getViewport()\n });\n }\n\n private disableLinks() {\n // Intercept link clicks when we're in the editing mode (loaded via iframe from the editor).\n document.addEventListener(\n \"click\",\n event => {\n const target = event.target as HTMLElement;\n\n // Check if the clicked element or any of its ancestors is a link\n const anchor = target.closest(\"a\");\n\n if (anchor && anchor.href) {\n event.preventDefault();\n event.stopPropagation();\n }\n },\n // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#usecapture\n true\n );\n }\n}\n"],"names":["EditingSdk","liveSdk","theme","source","MessageOrigin","window","target","PreviewDocument","documentStoreManager","Messenger","componentRegistry","reg","path","options","group","functionConverter","undefined","searchParams","URLSearchParams","data","patch","mode","root","document","PreviewViewport","viewportManager","setInterval","logger","newBoxes","hash","hashObject","event","anchor"],"mappings":";;;;;;;;;;AAoBO,MAAMA;IAST,YAAYC,OAAoB,EAAEC,KAA0B,CAAE;aAPtD,wBAAwB,GAAG;aAC3B,eAAe,GAA2B;aAI1C,aAAa,GAAG;QAGpB,IAAI,CAAC,OAAO,GAAGD;QAEf,MAAME,SAAS,IAAIC,cAAc,IAAMC,QAAQA,OAAO,QAAQ,CAAC,MAAM;QACrE,MAAMC,SAAS,IAAIF,cAAc,IAAMC,OAAO,MAAM,EAAE,IAAI,CAAC,iBAAiB;QAE5E,IAAI,CAAC,eAAe,GAAGE,gBAAgB,gBAAgB;QAEvD,IAAI,CAAC,aAAa,GAAGC,qBAAqB,QAAQ,CAC9C,IAAI,CAAC,eAAe,CAAC,KAAK;QAG9B,IAAI,CAAC,SAAS,GAAG,IAAIC,UAAUN,QAAQG,QAAQ;QAE/CI,kBAAkB,UAAU,CAACC,CAAAA;YACzB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,8BAA8BA,IAAI,SAAS,CAAC,QAAQ;QAC5E;QAEA,IAAI,CAAC,cAAc;QAEnB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB;QAErC,IAAIT,OACA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB;YAAEA;QAAM;QAGjD,IAAI,CAAC,YAAY;IACrB;IAEA,MAAa,QAAQU,IAAY,EAA8B;QAC3D,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;YAAE,MAAM;YAAQA;QAAK,IACnD,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAACA;QAGhC,MAAM,IAAI,CAAC,aAAa,CAAC,eAAe;QACxC,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW;IACzC;IAEA,MAAa,UAAUC,OAA0B,EAA4B;QACzE,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAACA;IAClC;IAEA,uBAAuBC,KAAqB,EAAE;QAC1C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,mCAAmC;YACnD,GAAGA,KAAK;YACR,QAAQA,MAAM,MAAM,GAAGC,kBAAkB,SAAS,CAACD,MAAM,MAAM,IAAIE;QACvE;IACJ;IAEQ,oBAA4B;QAChC,IAAI;YACA,MAAMC,eAAe,IAAIC,gBAAgBb,OAAO,QAAQ,CAAC,MAAM;YAC/D,OAAOY,aAAa,GAAG,CAAC;QAC5B,EAAE,OAAM;YACJ,OAAO;QACX;IACJ;IAEQ,iBAAiB;QACrB,IAAI,CAAC,IAAI,CAAC,SAAS,EACf;QAGJ,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,gBAAgBE,CAAAA;YAC9B,IAAI,CAAC,aAAa,CAAC,WAAW,CAACA;YAE/B,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAE9B,IAAI,CAAC,qBAAqB;QAElC;QAEA,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,eAAeA,CAAAA;YAC7B,IAAI,CAAC,aAAa,CAAC,aAAa,CAACA,KAAK,EAAE,EAAEA,KAAK,KAAK;QACxD;QAEA,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkBC,CAAAA;YAChC,IAAI,CAAC,aAAa,CAAC,UAAU,CAACA;QAClC;QAIA,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,cAAc,CAAC,EAAEC,IAAI,EAAqB;YACxD,MAAMC,OAAOC,SAAS,eAAe;YACrC,IAAIF,AAAS,YAATA,QAAoBA,AAAS,WAATA,MACpBC,KAAK,YAAY,CAAC,uBAAuBD;iBAEzCC,KAAK,eAAe,CAAC;QAE7B;IACJ;IAEQ,wBAA8B;QAClC,IAAI,IAAI,CAAC,wBAAwB,EAC7B;QAIJ,IAAI,CAAC,eAAe,GAAG,IAAIE;QAG3BC,gBAAgB,qBAAqB,CAAC;YAClC,IAAI,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QAE5B;QAEAA,gBAAgB,mBAAmB,CAAC;YAChC,IAAI,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QAE5B;QAGA,IAAI,CAAC,wBAAwB,GAAG;QAGhCC,YAAY,IAAM,IAAI,CAAC,WAAW,IAAI;IAC1C;IAEQ,cAAoB;QACxB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,YAC1CC,OAAO,IAAI,CAAC;QAIhB,MAAMC,WAAW,IAAI,CAAC,eAAe,CAAC,QAAQ;QAC9C,MAAMC,OAAOC,WAAW,IAAI,CAACF;QAC7B,IAAIC,SAAS,IAAI,CAAC,aAAa,EAC3B;QAGJ,IAAI,CAAC,aAAa,GAAGA;QAErB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,oBAAoB;YACpC,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ;YACpC,UAAU,IAAI,CAAC,eAAe,CAAC,WAAW;QAC9C;IACJ;IAEQ,eAAe;QAEnBN,SAAS,gBAAgB,CACrB,SACAQ,CAAAA;YACI,MAAMzB,SAASyB,MAAM,MAAM;YAG3B,MAAMC,SAAS1B,OAAO,OAAO,CAAC;YAE9B,IAAI0B,UAAUA,OAAO,IAAI,EAAE;gBACvBD,MAAM,cAAc;gBACpBA,MAAM,eAAe;YACzB;QACJ,GAEA;IAER;AACJ"}
package/ElementFactory.js CHANGED
@@ -2,191 +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
- // undefined index = append to end of the slot array
117
- index: isList ? undefined : 0,
118
- slot: path,
119
- parentId: elementId,
120
- 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
121
63
  });
122
- const newElementId = newElement.element.id;
123
- ops.push(...newElement.operations);
124
- if (isList) {
125
- // For list slots, AddToParent already manages the static array.
126
- // We only set metadata here.
127
- ops.push(operations.setInputBinding(elementId, path, {
128
- id: generateElementId(),
129
- type: node.type,
130
- translatable: node.input.translatable,
131
- list: node.list
132
- }));
133
- } else {
134
- ops.push(operations.setInputBinding(elementId, path, {
135
- id: generateElementId(),
136
- static: newElementId,
137
- type: node.type,
138
- translatable: node.input.translatable,
139
- list: node.list
140
- }));
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
77
+ }));
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;
141
144
  }
142
- } else if (isObject && isList) {
143
- return;
144
- } else {
145
- ops.push(operations.setInputBinding(elementId, path, {
146
- id: generateElementId(),
147
- static: ignoreDefaultValues ? undefined : value ?? node.input.defaultValue,
148
- type: node.type,
149
- list: node.list,
150
- translatable: node.input.translatable
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]
151
150
  }));
152
- }
153
- });
154
-
155
- // Process styles
156
- for (const key in bindings.styles) {
157
- ops.push(operations.setStyleBinding(elementId, key, {
158
- static: bindings.styles[key]
159
- }));
151
+ return ops;
160
152
  }
161
- return ops;
162
- }
163
- getComponentManifest(componentName) {
164
- const manifest = this.components[componentName];
165
- if (!manifest) {
166
- 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
+ };
167
180
  }
168
- return manifest;
169
- }
170
- createElement(componentName, parentId, slot) {
171
- const element = {
172
- type: "Webiny/Element",
173
- id: generateElementId(),
174
- parent: {
175
- id: parentId,
176
- slot
177
- },
178
- component: {
179
- name: componentName
180
- }
181
- };
182
- const componentManifest = this.getComponentManifest(componentName);
183
- const inputsAst = ComponentManifestToAstConverter.convert(componentManifest.inputs ?? []);
184
- return {
185
- element,
186
- inputsAst,
187
- componentManifest
188
- };
189
- }
190
181
  }
182
+ export { ElementFactory };
191
183
 
192
184
  //# sourceMappingURL=ElementFactory.js.map