@webiny/website-builder-sdk 0.0.0-unstable.6f45466a1d → 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 (175) 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.d.ts +3 -3
  26. package/ContentSdk.js +83 -90
  27. package/ContentSdk.js.map +1 -1
  28. package/DocumentStore.js +47 -59
  29. package/DocumentStore.js.map +1 -1
  30. package/DocumentStoreManager.js +17 -16
  31. package/DocumentStoreManager.js.map +1 -1
  32. package/EditingSdk.d.ts +2 -2
  33. package/EditingSdk.js +87 -121
  34. package/EditingSdk.js.map +1 -1
  35. package/ElementFactory.d.ts +2 -3
  36. package/ElementFactory.js +125 -164
  37. package/ElementFactory.js.map +1 -1
  38. package/ElementFactory.test.d.ts +1 -0
  39. package/ElementFactory.test.js +251 -0
  40. package/ElementFactory.test.js.map +1 -0
  41. package/Environment.js +18 -19
  42. package/Environment.js.map +1 -1
  43. package/FunctionConverter.js +8 -7
  44. package/FunctionConverter.js.map +1 -1
  45. package/HashObject.js +11 -12
  46. package/HashObject.js.map +1 -1
  47. package/HotkeyManager.js +41 -48
  48. package/HotkeyManager.js.map +1 -1
  49. package/IBindingsUpdater.js +0 -3
  50. package/IRedirects.js +0 -3
  51. package/InheritanceProcessor.js +99 -139
  52. package/InheritanceProcessor.js.map +1 -1
  53. package/InheritanceProcessor.test.js +178 -179
  54. package/InheritanceProcessor.test.js.map +1 -1
  55. package/InheritedValueResolver.js +15 -20
  56. package/InheritedValueResolver.js.map +1 -1
  57. package/InputBindingsProcessor.js +187 -289
  58. package/InputBindingsProcessor.js.map +1 -1
  59. package/InputsBindingsProcessor.test.js +334 -314
  60. package/InputsBindingsProcessor.test.js.map +1 -1
  61. package/InputsUpdater.d.ts +1 -1
  62. package/InputsUpdater.js +23 -26
  63. package/InputsUpdater.js.map +1 -1
  64. package/LiveSdk.d.ts +2 -2
  65. package/LiveSdk.js +12 -13
  66. package/LiveSdk.js.map +1 -1
  67. package/Logger.js +9 -8
  68. package/Logger.js.map +1 -1
  69. package/MouseTracker.js +77 -83
  70. package/MouseTracker.js.map +1 -1
  71. package/NullSdk.d.ts +4 -3
  72. package/NullSdk.js +22 -14
  73. package/NullSdk.js.map +1 -1
  74. package/PreviewDocument.js +27 -30
  75. package/PreviewDocument.js.map +1 -1
  76. package/PreviewSdk.d.ts +2 -2
  77. package/PreviewSdk.js +16 -17
  78. package/PreviewSdk.js.map +1 -1
  79. package/PreviewViewport.js +51 -63
  80. package/PreviewViewport.js.map +1 -1
  81. package/ResizeObserver.js +24 -31
  82. package/ResizeObserver.js.map +1 -1
  83. package/StylesBindingsProcessor.js +40 -79
  84. package/StylesBindingsProcessor.js.map +1 -1
  85. package/StylesUpdater.d.ts +1 -1
  86. package/StylesUpdater.js +20 -25
  87. package/StylesUpdater.js.map +1 -1
  88. package/Theme.js +29 -25
  89. package/Theme.js.map +1 -1
  90. package/ViewportManager.js +89 -101
  91. package/ViewportManager.js.map +1 -1
  92. package/constants.d.ts +1 -0
  93. package/constants.js +7 -5
  94. package/constants.js.map +1 -1
  95. package/createElement.js +5 -6
  96. package/createElement.js.map +1 -1
  97. package/createInput.js +85 -143
  98. package/createInput.js.map +1 -1
  99. package/createTheme.js +2 -3
  100. package/createTheme.js.map +1 -1
  101. package/dataProviders/ApiClient.js +40 -49
  102. package/dataProviders/ApiClient.js.map +1 -1
  103. package/dataProviders/DefaultDataProvider.d.ts +2 -2
  104. package/dataProviders/DefaultDataProvider.js +55 -44
  105. package/dataProviders/DefaultDataProvider.js.map +1 -1
  106. package/dataProviders/GET_PAGE_BY_ID.d.ts +1 -1
  107. package/dataProviders/GET_PAGE_BY_ID.js +3 -1
  108. package/dataProviders/GET_PAGE_BY_ID.js.map +1 -1
  109. package/dataProviders/GET_PAGE_BY_PATH.d.ts +1 -1
  110. package/dataProviders/GET_PAGE_BY_PATH.js +3 -1
  111. package/dataProviders/GET_PAGE_BY_PATH.js.map +1 -1
  112. package/dataProviders/LIST_PUBLISHED_PAGES.d.ts +1 -1
  113. package/dataProviders/LIST_PUBLISHED_PAGES.js +16 -5
  114. package/dataProviders/LIST_PUBLISHED_PAGES.js.map +1 -1
  115. package/dataProviders/NullDataProvider.d.ts +12 -4
  116. package/dataProviders/NullDataProvider.js +21 -13
  117. package/dataProviders/NullDataProvider.js.map +1 -1
  118. package/dataProviders/RedirectsProvider.js +24 -27
  119. package/dataProviders/RedirectsProvider.js.map +1 -1
  120. package/defaultBreakpoints.js +23 -22
  121. package/defaultBreakpoints.js.map +1 -1
  122. package/documentOperations/$addElementReferenceToParent.d.ts +1 -1
  123. package/documentOperations/$addElementReferenceToParent.js +30 -26
  124. package/documentOperations/$addElementReferenceToParent.js.map +1 -1
  125. package/documentOperations/AddElement.js +8 -7
  126. package/documentOperations/AddElement.js.map +1 -1
  127. package/documentOperations/AddToParent.d.ts +2 -2
  128. package/documentOperations/AddToParent.js +14 -13
  129. package/documentOperations/AddToParent.js.map +1 -1
  130. package/documentOperations/IDocumentOperation.js +0 -3
  131. package/documentOperations/RemoveElement.js +10 -7
  132. package/documentOperations/RemoveElement.js.map +1 -1
  133. package/documentOperations/SetGlobalInputBinding.js +23 -22
  134. package/documentOperations/SetGlobalInputBinding.js.map +1 -1
  135. package/documentOperations/SetGlobalStyleBinding.js +23 -23
  136. package/documentOperations/SetGlobalStyleBinding.js.map +1 -1
  137. package/documentOperations/SetInputBindingOverride.js +30 -29
  138. package/documentOperations/SetInputBindingOverride.js.map +1 -1
  139. package/documentOperations/SetStyleBindingOverride.js +30 -31
  140. package/documentOperations/SetStyleBindingOverride.js.map +1 -1
  141. package/documentOperations/index.js +9 -8
  142. package/documentOperations/index.js.map +1 -1
  143. package/findMatchingAstNode.js +11 -13
  144. package/findMatchingAstNode.js.map +1 -1
  145. package/generateElementId.js +2 -2
  146. package/generateElementId.js.map +1 -1
  147. package/headersProvider.js +4 -3
  148. package/headersProvider.js.map +1 -1
  149. package/index.d.ts +1 -0
  150. package/index.js +1 -2
  151. package/jsonPatch.js +5 -9
  152. package/jsonPatch.js.map +1 -1
  153. package/messages.js +12 -11
  154. package/messages.js.map +1 -1
  155. package/messenger/MessageOrigin.js +12 -11
  156. package/messenger/MessageOrigin.js.map +1 -1
  157. package/messenger/Messenger.js +58 -71
  158. package/messenger/Messenger.js.map +1 -1
  159. package/messenger/index.js +0 -2
  160. package/package.json +16 -16
  161. package/registerComponentGroup.js +5 -6
  162. package/registerComponentGroup.js.map +1 -1
  163. package/types/ShorthandCssProperties.js +0 -3
  164. package/types/WebsiteBuilderTheme.d.ts +7 -0
  165. package/types/WebsiteBuilderTheme.js +0 -3
  166. package/types.d.ts +173 -11
  167. package/types.js +0 -3
  168. package/IBindingsUpdater.js.map +0 -1
  169. package/IRedirects.js.map +0 -1
  170. package/documentOperations/IDocumentOperation.js.map +0 -1
  171. package/index.js.map +0 -1
  172. package/messenger/index.js.map +0 -1
  173. package/types/ShorthandCssProperties.js.map +0 -1
  174. package/types/WebsiteBuilderTheme.js.map +0 -1
  175. package/types.js.map +0 -1
@@ -1,134 +1,104 @@
1
1
  import { toJS } from "mobx";
2
- export class BindingsResolver {
3
- constructor(state) {
4
- this.state = state;
5
- }
6
- resolveElement({
7
- element,
8
- elementBindings,
9
- inputAst,
10
- onResolved
11
- }) {
12
- const repeatBindingArray = elementBindings.$repeat;
13
- if (repeatBindingArray) {
14
- const items = this.resolveBinding(repeatBindingArray, {
15
- state: toJS(this.state)
16
- });
17
- if (!Array.isArray(items)) {
18
- return [];
19
- }
20
- return items.map(item => {
21
- return this.resolveSingleInstance(element, elementBindings, item, inputAst, onResolved);
22
- });
2
+ class BindingsResolver {
3
+ constructor(state){
4
+ this.state = state;
23
5
  }
24
- return [this.resolveSingleInstance(element, elementBindings, undefined, inputAst, onResolved)];
25
- }
26
- resolveSingleInstance(element, elementBindings, item, inputAst, onResolved) {
27
- const resolvedElement = {
28
- id: element.id,
29
- inputs: {},
30
- styles: {}
31
- };
32
- const context = {
33
- state: this.state,
34
- $: item
35
- };
36
- const bindings = elementBindings.inputs ?? {};
37
- const resolveInputsFromAst = (nodes, prefix, target) => {
38
- for (const node of nodes) {
39
- const pathParts = [...prefix, node.name];
40
- const path = pathParts.join("/");
41
- const binding = bindings[path];
42
- const value = this.resolveBinding(binding, context) ?? node.input.defaultValue;
43
- const finalValue = onResolved ? onResolved(value, node.input) : value;
44
- if (node.children.length > 0) {
45
- if (node.list) {
46
- const uniqueIndexes = this.getUniqueIndexesFromPath(path, bindings);
47
- target[node.name] = uniqueIndexes.map(index => {
48
- const childTarget = {};
49
- resolveInputsFromAst(node.children, [...pathParts.slice(0, -1), `${node.name}/${index}`], childTarget);
50
- return childTarget;
6
+ resolveElement({ element, elementBindings, inputAst, onResolved }) {
7
+ const repeatBindingArray = elementBindings.$repeat;
8
+ if (repeatBindingArray) {
9
+ const items = this.resolveBinding(repeatBindingArray, {
10
+ state: toJS(this.state)
51
11
  });
52
- } else {
53
- const childTarget = {};
54
- resolveInputsFromAst(node.children, pathParts, childTarget);
55
- target[node.name] = childTarget;
56
- }
57
- } else if (node.list) {
58
- // List node with no children (e.g., slot or primitive list)
59
- const uniqueIndexes = this.getUniqueIndexesFromPath(path, bindings);
60
-
61
- // If binding is e.g., `leftColumn/0`, we'll have `0` in unique indexes.
62
- if (uniqueIndexes.length > 0) {
63
- target[node.name] = uniqueIndexes.map(index => {
64
- const binding = bindings[`${node.name}/${index}`];
65
- const value = this.resolveBinding(binding, context) ?? node.input.defaultValue;
66
- return onResolved ? onResolved(value, node.input) : value;
67
- });
68
- } else {
69
- // If binding is a simple `children`, we simply assign the resolved value.
70
- target[node.name] = finalValue;
71
- }
72
- } else if (finalValue !== undefined) {
73
- target[node.name] = finalValue;
12
+ if (!Array.isArray(items)) return [];
13
+ return items.map((item)=>this.resolveSingleInstance(element, elementBindings, item, inputAst, onResolved));
74
14
  }
75
- }
76
- };
77
- resolveInputsFromAst(inputAst, [], resolvedElement.inputs);
78
-
79
- // Resolve styles
80
- const styles = elementBindings.styles ? elementBindings.styles ?? {} : {};
81
- const resolvedStyles = {};
82
- for (const [path, binding] of Object.entries(styles)) {
83
- if (binding) {
84
- // @ts-expect-error We're positive this is correct.
85
- resolvedStyles[path] = this.resolveBinding(binding, context);
86
- }
15
+ return [
16
+ this.resolveSingleInstance(element, elementBindings, void 0, inputAst, onResolved)
17
+ ];
87
18
  }
88
- return {
89
- ...resolvedElement,
90
- styles: resolvedStyles
91
- };
92
- }
93
- getUniqueIndexesFromPath(flatKey, bindings) {
94
- const pattern = new RegExp(`^${flatKey}\\/(\\d+)`);
95
- const indexes = Object.keys(bindings).reduce((acc, key) => {
96
- const match = key.match(pattern);
97
- if (match) {
98
- acc.push(parseInt(match[1], 10));
99
- }
100
- return acc;
101
- }, []);
102
- return Array.from(new Set(indexes)).sort((a, b) => a - b);
103
- }
104
- resolveBinding(binding, context) {
105
- if (typeof binding === "undefined") {
106
- return undefined;
19
+ resolveSingleInstance(element, elementBindings, item, inputAst, onResolved) {
20
+ const resolvedElement = {
21
+ id: element.id,
22
+ inputs: {},
23
+ styles: {}
24
+ };
25
+ const context = {
26
+ state: this.state,
27
+ $: item
28
+ };
29
+ const bindings = elementBindings.inputs ?? {};
30
+ const resolveInputsFromAst = (nodes, prefix, target)=>{
31
+ for (const node of nodes){
32
+ const pathParts = [
33
+ ...prefix,
34
+ node.name
35
+ ];
36
+ const path = pathParts.join("/");
37
+ const binding = bindings[path];
38
+ const value = this.resolveBinding(binding, context) ?? node.input.defaultValue;
39
+ const finalValue = onResolved ? onResolved(value, node.input) : value;
40
+ if (node.children.length > 0) if (node.list) {
41
+ const uniqueIndexes = this.getUniqueIndexesFromPath(path, bindings);
42
+ target[node.name] = uniqueIndexes.map((index)=>{
43
+ const childTarget = {};
44
+ resolveInputsFromAst(node.children, [
45
+ ...pathParts.slice(0, -1),
46
+ `${node.name}/${index}`
47
+ ], childTarget);
48
+ return childTarget;
49
+ });
50
+ } else {
51
+ const childTarget = {};
52
+ resolveInputsFromAst(node.children, pathParts, childTarget);
53
+ target[node.name] = childTarget;
54
+ }
55
+ else if (node.list) {
56
+ const uniqueIndexes = this.getUniqueIndexesFromPath(path, bindings);
57
+ if (uniqueIndexes.length > 0) target[node.name] = uniqueIndexes.map((index)=>{
58
+ const binding = bindings[`${node.name}/${index}`];
59
+ const value = this.resolveBinding(binding, context) ?? node.input.defaultValue;
60
+ return onResolved ? onResolved(value, node.input) : value;
61
+ });
62
+ else target[node.name] = finalValue;
63
+ } else if (void 0 !== finalValue) target[node.name] = finalValue;
64
+ }
65
+ };
66
+ resolveInputsFromAst(inputAst, [], resolvedElement.inputs);
67
+ const styles = elementBindings.styles ? elementBindings.styles ?? {} : {};
68
+ const resolvedStyles = {};
69
+ for (const [path, binding] of Object.entries(styles))if (binding) resolvedStyles[path] = this.resolveBinding(binding, context);
70
+ return {
71
+ ...resolvedElement,
72
+ styles: resolvedStyles
73
+ };
107
74
  }
108
- if (binding.expression) {
109
- return this.evaluateExpression(binding.expression, context);
75
+ getUniqueIndexesFromPath(flatKey, bindings) {
76
+ const pattern = new RegExp(`^${flatKey}\\/(\\d+)`);
77
+ const indexes = Object.keys(bindings).reduce((acc, key)=>{
78
+ const match = key.match(pattern);
79
+ if (match) acc.push(parseInt(match[1], 10));
80
+ return acc;
81
+ }, []);
82
+ return Array.from(new Set(indexes)).sort((a, b)=>a - b);
110
83
  }
111
- if (binding.static) {
112
- return binding.static;
84
+ resolveBinding(binding, context) {
85
+ if (void 0 === binding) return;
86
+ if (binding.expression) return this.evaluateExpression(binding.expression, context);
87
+ return binding.static;
113
88
  }
114
- return undefined;
115
- }
116
- evaluateExpression(expression, context = {}) {
117
- if (!expression || expression === "$noop") {
118
- return undefined;
119
- }
120
- try {
121
- let finalExpression = expression.trim();
122
- if (finalExpression.startsWith("$state")) {
123
- finalExpression = finalExpression.replace(/^\$state/, "state");
124
- }
125
- finalExpression = finalExpression.replace(/\.([0-9]+)/g, "[$1]");
126
- const scopedFn = new Function(...Object.keys(context), `return ${finalExpression};`);
127
- return scopedFn(...Object.values(context));
128
- } catch {
129
- return undefined;
89
+ evaluateExpression(expression, context = {}) {
90
+ if (!expression || "$noop" === expression) return;
91
+ try {
92
+ let finalExpression = expression.trim();
93
+ if (finalExpression.startsWith("$state")) finalExpression = finalExpression.replace(/^\$state/, "state");
94
+ finalExpression = finalExpression.replace(/\.([0-9]+)/g, "[$1]");
95
+ const scopedFn = new Function(...Object.keys(context), `return ${finalExpression};`);
96
+ return scopedFn(...Object.values(context));
97
+ } catch {
98
+ return;
99
+ }
130
100
  }
131
- }
132
101
  }
102
+ export { BindingsResolver };
133
103
 
134
104
  //# sourceMappingURL=BindingsResolver.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["toJS","BindingsResolver","constructor","state","resolveElement","element","elementBindings","inputAst","onResolved","repeatBindingArray","$repeat","items","resolveBinding","Array","isArray","map","item","resolveSingleInstance","undefined","resolvedElement","id","inputs","styles","context","$","bindings","resolveInputsFromAst","nodes","prefix","target","node","pathParts","name","path","join","binding","value","input","defaultValue","finalValue","children","length","list","uniqueIndexes","getUniqueIndexesFromPath","index","childTarget","slice","resolvedStyles","Object","entries","flatKey","pattern","RegExp","indexes","keys","reduce","acc","key","match","push","parseInt","from","Set","sort","a","b","expression","evaluateExpression","static","finalExpression","trim","startsWith","replace","scopedFn","Function","values"],"sources":["BindingsResolver.ts"],"sourcesContent":["import { toJS } from \"mobx\";\nimport type {\n ComponentInput,\n DocumentElement,\n DocumentElementBindings,\n DocumentElementStyleBindings,\n DocumentState,\n ResolvedElement,\n SerializableCSSStyleDeclaration,\n ValueBinding\n} from \"~/types.js\";\nimport type { InputAstNode } from \"./ComponentManifestToAstConverter.js\";\n\nexport interface OnResolved {\n (value: any, input: ComponentInput): any;\n}\n\nexport type ResolveElementParams = {\n element: DocumentElement;\n elementBindings: DocumentElementBindings;\n inputAst: InputAstNode[];\n onResolved?: OnResolved;\n};\n\nexport class BindingsResolver {\n private readonly state: DocumentState;\n\n constructor(state: DocumentState) {\n this.state = state;\n }\n\n public resolveElement({\n element,\n elementBindings,\n inputAst,\n onResolved\n }: ResolveElementParams): ResolvedElement[] {\n const repeatBindingArray = elementBindings.$repeat;\n\n if (repeatBindingArray) {\n const items = this.resolveBinding(repeatBindingArray, { state: toJS(this.state) });\n\n if (!Array.isArray(items)) {\n return [];\n }\n\n return items.map(item => {\n return this.resolveSingleInstance(\n element,\n elementBindings,\n item,\n inputAst,\n onResolved\n );\n });\n }\n\n return [\n this.resolveSingleInstance(element, elementBindings, undefined, inputAst, onResolved)\n ];\n }\n\n private resolveSingleInstance(\n element: DocumentElement,\n elementBindings: DocumentElementBindings,\n item: Record<string, any> | undefined,\n inputAst: InputAstNode[],\n onResolved?: OnResolved\n ): ResolvedElement {\n const resolvedElement: ResolvedElement = {\n id: element.id,\n inputs: {},\n styles: {}\n };\n\n const context = { state: this.state, $: item };\n const bindings = elementBindings.inputs ?? {};\n\n const resolveInputsFromAst = (\n nodes: InputAstNode[],\n prefix: string[],\n target: Record<string, any>\n ) => {\n for (const node of nodes) {\n const pathParts = [...prefix, node.name];\n const path = pathParts.join(\"/\");\n const binding = bindings[path];\n const value = this.resolveBinding(binding, context) ?? node.input.defaultValue;\n\n const finalValue = onResolved ? onResolved(value, node.input) : value;\n\n if (node.children.length > 0) {\n if (node.list) {\n const uniqueIndexes = this.getUniqueIndexesFromPath(path, bindings);\n\n target[node.name] = uniqueIndexes.map(index => {\n const childTarget: Record<string, any> = {};\n resolveInputsFromAst(\n node.children,\n [...pathParts.slice(0, -1), `${node.name}/${index}`],\n childTarget\n );\n return childTarget;\n });\n } else {\n const childTarget: Record<string, any> = {};\n resolveInputsFromAst(node.children, pathParts, childTarget);\n target[node.name] = childTarget;\n }\n } else if (node.list) {\n // List node with no children (e.g., slot or primitive list)\n const uniqueIndexes = this.getUniqueIndexesFromPath(path, bindings);\n\n // If binding is e.g., `leftColumn/0`, we'll have `0` in unique indexes.\n if (uniqueIndexes.length > 0) {\n target[node.name] = uniqueIndexes.map(index => {\n const binding = bindings[`${node.name}/${index}`];\n const value =\n this.resolveBinding(binding, context) ?? node.input.defaultValue;\n return onResolved ? onResolved(value, node.input) : value;\n });\n } else {\n // If binding is a simple `children`, we simply assign the resolved value.\n target[node.name] = finalValue;\n }\n } else if (finalValue !== undefined) {\n target[node.name] = finalValue;\n }\n }\n };\n\n resolveInputsFromAst(inputAst, [], resolvedElement.inputs);\n\n // Resolve styles\n const styles: DocumentElementStyleBindings = elementBindings.styles\n ? (elementBindings.styles ?? {})\n : {};\n\n const resolvedStyles: SerializableCSSStyleDeclaration = {};\n\n for (const [path, binding] of Object.entries(styles)) {\n if (binding) {\n // @ts-expect-error We're positive this is correct.\n resolvedStyles[path] = this.resolveBinding(binding, context);\n }\n }\n\n return {\n ...resolvedElement,\n styles: resolvedStyles\n };\n }\n\n private getUniqueIndexesFromPath(flatKey: string, bindings: DocumentElementBindings) {\n const pattern = new RegExp(`^${flatKey}\\\\/(\\\\d+)`);\n\n const indexes = Object.keys(bindings).reduce((acc: number[], key) => {\n const match = key.match(pattern);\n if (match) {\n acc.push(parseInt(match[1], 10));\n }\n return acc;\n }, []);\n\n return Array.from(new Set(indexes)).sort((a, b) => a - b);\n }\n\n private resolveBinding(binding: ValueBinding | undefined, context: Record<string, any>): any {\n if (typeof binding === \"undefined\") {\n return undefined;\n }\n\n if (binding.expression) {\n return this.evaluateExpression(binding.expression, context);\n }\n\n if (binding.static) {\n return binding.static;\n }\n\n return undefined;\n }\n\n private evaluateExpression(expression: string | undefined, context: Record<string, any> = {}) {\n if (!expression || expression === \"$noop\") {\n return undefined;\n }\n\n try {\n let finalExpression = expression.trim();\n\n if (finalExpression.startsWith(\"$state\")) {\n finalExpression = finalExpression.replace(/^\\$state/, \"state\");\n }\n\n finalExpression = finalExpression.replace(/\\.([0-9]+)/g, \"[$1]\");\n\n const scopedFn = new Function(...Object.keys(context), `return ${finalExpression};`);\n return scopedFn(...Object.values(context));\n } catch {\n return undefined;\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"BindingsResolver.js","sources":["../src/BindingsResolver.ts"],"sourcesContent":["import { toJS } from \"mobx\";\nimport type {\n ComponentInput,\n DocumentElement,\n DocumentElementBindings,\n DocumentElementStyleBindings,\n DocumentState,\n ResolvedElement,\n SerializableCSSStyleDeclaration,\n ValueBinding\n} from \"~/types.js\";\nimport type { InputAstNode } from \"./ComponentManifestToAstConverter.js\";\n\nexport interface OnResolved {\n (value: any, input: ComponentInput): any;\n}\n\nexport type ResolveElementParams = {\n element: DocumentElement;\n elementBindings: DocumentElementBindings;\n inputAst: InputAstNode[];\n onResolved?: OnResolved;\n};\n\nexport class BindingsResolver {\n private readonly state: DocumentState;\n\n constructor(state: DocumentState) {\n this.state = state;\n }\n\n public resolveElement({\n element,\n elementBindings,\n inputAst,\n onResolved\n }: ResolveElementParams): ResolvedElement[] {\n const repeatBindingArray = elementBindings.$repeat;\n\n if (repeatBindingArray) {\n const items = this.resolveBinding(repeatBindingArray, { state: toJS(this.state) });\n\n if (!Array.isArray(items)) {\n return [];\n }\n\n return items.map(item => {\n return this.resolveSingleInstance(\n element,\n elementBindings,\n item,\n inputAst,\n onResolved\n );\n });\n }\n\n return [\n this.resolveSingleInstance(element, elementBindings, undefined, inputAst, onResolved)\n ];\n }\n\n private resolveSingleInstance(\n element: DocumentElement,\n elementBindings: DocumentElementBindings,\n item: Record<string, any> | undefined,\n inputAst: InputAstNode[],\n onResolved?: OnResolved\n ): ResolvedElement {\n const resolvedElement: ResolvedElement = {\n id: element.id,\n inputs: {},\n styles: {}\n };\n\n const context = { state: this.state, $: item };\n const bindings = elementBindings.inputs ?? {};\n\n const resolveInputsFromAst = (\n nodes: InputAstNode[],\n prefix: string[],\n target: Record<string, any>\n ) => {\n for (const node of nodes) {\n const pathParts = [...prefix, node.name];\n const path = pathParts.join(\"/\");\n const binding = bindings[path];\n const value = this.resolveBinding(binding, context) ?? node.input.defaultValue;\n\n const finalValue = onResolved ? onResolved(value, node.input) : value;\n\n if (node.children.length > 0) {\n if (node.list) {\n const uniqueIndexes = this.getUniqueIndexesFromPath(path, bindings);\n\n target[node.name] = uniqueIndexes.map(index => {\n const childTarget: Record<string, any> = {};\n resolveInputsFromAst(\n node.children,\n [...pathParts.slice(0, -1), `${node.name}/${index}`],\n childTarget\n );\n return childTarget;\n });\n } else {\n const childTarget: Record<string, any> = {};\n resolveInputsFromAst(node.children, pathParts, childTarget);\n target[node.name] = childTarget;\n }\n } else if (node.list) {\n // List node with no children (e.g., slot or primitive list)\n const uniqueIndexes = this.getUniqueIndexesFromPath(path, bindings);\n\n // If binding is e.g., `leftColumn/0`, we'll have `0` in unique indexes.\n if (uniqueIndexes.length > 0) {\n target[node.name] = uniqueIndexes.map(index => {\n const binding = bindings[`${node.name}/${index}`];\n const value =\n this.resolveBinding(binding, context) ?? node.input.defaultValue;\n return onResolved ? onResolved(value, node.input) : value;\n });\n } else {\n // If binding is a simple `children`, we simply assign the resolved value.\n target[node.name] = finalValue;\n }\n } else if (finalValue !== undefined) {\n target[node.name] = finalValue;\n }\n }\n };\n\n resolveInputsFromAst(inputAst, [], resolvedElement.inputs);\n\n // Resolve styles\n const styles: DocumentElementStyleBindings = elementBindings.styles\n ? (elementBindings.styles ?? {})\n : {};\n\n const resolvedStyles: SerializableCSSStyleDeclaration = {};\n\n for (const [path, binding] of Object.entries(styles)) {\n if (binding) {\n // @ts-expect-error We're positive this is correct.\n resolvedStyles[path] = this.resolveBinding(binding, context);\n }\n }\n\n return {\n ...resolvedElement,\n styles: resolvedStyles\n };\n }\n\n private getUniqueIndexesFromPath(flatKey: string, bindings: DocumentElementBindings) {\n const pattern = new RegExp(`^${flatKey}\\\\/(\\\\d+)`);\n\n const indexes = Object.keys(bindings).reduce((acc: number[], key) => {\n const match = key.match(pattern);\n if (match) {\n acc.push(parseInt(match[1], 10));\n }\n return acc;\n }, []);\n\n return Array.from(new Set(indexes)).sort((a, b) => a - b);\n }\n\n private resolveBinding(binding: ValueBinding | undefined, context: Record<string, any>): any {\n if (typeof binding === \"undefined\") {\n return undefined;\n }\n\n if (binding.expression) {\n return this.evaluateExpression(binding.expression, context);\n }\n\n return binding.static;\n }\n\n private evaluateExpression(expression: string | undefined, context: Record<string, any> = {}) {\n if (!expression || expression === \"$noop\") {\n return undefined;\n }\n\n try {\n let finalExpression = expression.trim();\n\n if (finalExpression.startsWith(\"$state\")) {\n finalExpression = finalExpression.replace(/^\\$state/, \"state\");\n }\n\n finalExpression = finalExpression.replace(/\\.([0-9]+)/g, \"[$1]\");\n\n const scopedFn = new Function(...Object.keys(context), `return ${finalExpression};`);\n return scopedFn(...Object.values(context));\n } catch {\n return undefined;\n }\n }\n}\n"],"names":["BindingsResolver","state","element","elementBindings","inputAst","onResolved","repeatBindingArray","items","toJS","Array","item","undefined","resolvedElement","context","bindings","resolveInputsFromAst","nodes","prefix","target","node","pathParts","path","binding","value","finalValue","uniqueIndexes","index","childTarget","styles","resolvedStyles","Object","flatKey","pattern","RegExp","indexes","acc","key","match","parseInt","Set","a","b","expression","finalExpression","scopedFn","Function"],"mappings":"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"}