@webiny/website-builder-sdk 6.3.0 → 6.4.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BindingsApi.js +29 -36
- package/BindingsApi.js.map +1 -1
- package/BindingsProcessor.js +34 -43
- package/BindingsProcessor.js.map +1 -1
- package/BindingsProcessor.test.js +82 -78
- package/BindingsProcessor.test.js.map +1 -1
- package/BindingsResolver.js +92 -119
- package/BindingsResolver.js.map +1 -1
- package/BindingsResolver.test.js +399 -363
- package/BindingsResolver.test.js.map +1 -1
- package/ComponentInputTraverser.js +28 -49
- package/ComponentInputTraverser.js.map +1 -1
- package/ComponentManifestToAstConverter.js +20 -21
- package/ComponentManifestToAstConverter.js.map +1 -1
- package/ComponentRegistry.js +26 -45
- package/ComponentRegistry.js.map +1 -1
- package/ComponentResolver.js +25 -29
- package/ComponentResolver.js.map +1 -1
- package/ConstraintEvaluator.js +246 -353
- package/ConstraintEvaluator.js.map +1 -1
- package/ConstraintEvaluator.test.js +1616 -1438
- package/ConstraintEvaluator.test.js.map +1 -1
- package/ContentSdk.js +83 -90
- package/ContentSdk.js.map +1 -1
- package/DocumentStore.js +47 -59
- package/DocumentStore.js.map +1 -1
- package/DocumentStoreManager.js +17 -16
- package/DocumentStoreManager.js.map +1 -1
- package/EditingSdk.js +87 -121
- package/EditingSdk.js.map +1 -1
- package/ElementFactory.js +126 -174
- package/ElementFactory.js.map +1 -1
- package/ElementFactory.test.js +234 -263
- package/ElementFactory.test.js.map +1 -1
- package/Environment.js +18 -19
- package/Environment.js.map +1 -1
- package/FunctionConverter.js +8 -7
- package/FunctionConverter.js.map +1 -1
- package/HashObject.js +11 -26
- package/HashObject.js.map +1 -1
- package/HotkeyManager.js +40 -47
- package/HotkeyManager.js.map +1 -1
- package/IBindingsUpdater.js +0 -3
- package/IRedirects.js +0 -3
- package/InheritanceProcessor.js +99 -139
- package/InheritanceProcessor.js.map +1 -1
- package/InheritanceProcessor.test.js +178 -179
- package/InheritanceProcessor.test.js.map +1 -1
- package/InheritedValueResolver.js +15 -20
- package/InheritedValueResolver.js.map +1 -1
- package/InputBindingsProcessor.js +187 -307
- package/InputBindingsProcessor.js.map +1 -1
- package/InputsBindingsProcessor.test.js +334 -315
- package/InputsBindingsProcessor.test.js.map +1 -1
- package/InputsUpdater.js +23 -26
- package/InputsUpdater.js.map +1 -1
- package/LiveSdk.js +12 -13
- package/LiveSdk.js.map +1 -1
- package/Logger.js +9 -8
- package/Logger.js.map +1 -1
- package/MouseTracker.js +77 -83
- package/MouseTracker.js.map +1 -1
- package/NullSdk.js +22 -21
- package/NullSdk.js.map +1 -1
- package/PreviewDocument.js +27 -30
- package/PreviewDocument.js.map +1 -1
- package/PreviewSdk.js +16 -17
- package/PreviewSdk.js.map +1 -1
- package/PreviewViewport.js +51 -63
- package/PreviewViewport.js.map +1 -1
- package/ResizeObserver.js +24 -31
- package/ResizeObserver.js.map +1 -1
- package/StylesBindingsProcessor.js +40 -79
- package/StylesBindingsProcessor.js.map +1 -1
- package/StylesUpdater.js +20 -25
- package/StylesUpdater.js.map +1 -1
- package/Theme.js +28 -25
- package/Theme.js.map +1 -1
- package/ViewportManager.js +89 -101
- package/ViewportManager.js.map +1 -1
- package/constants.js +7 -6
- package/constants.js.map +1 -1
- package/createElement.js +5 -6
- package/createElement.js.map +1 -1
- package/createInput.js +85 -143
- package/createInput.js.map +1 -1
- package/createTheme.js +2 -3
- package/createTheme.js.map +1 -1
- package/dataProviders/ApiClient.js +40 -49
- package/dataProviders/ApiClient.js.map +1 -1
- package/dataProviders/DefaultDataProvider.js +56 -58
- package/dataProviders/DefaultDataProvider.js.map +1 -1
- package/dataProviders/GET_PAGE_BY_ID.js +2 -1
- package/dataProviders/GET_PAGE_BY_ID.js.map +1 -1
- package/dataProviders/GET_PAGE_BY_PATH.js +2 -1
- package/dataProviders/GET_PAGE_BY_PATH.js.map +1 -1
- package/dataProviders/LIST_PUBLISHED_PAGES.js +2 -1
- package/dataProviders/LIST_PUBLISHED_PAGES.js.map +1 -1
- package/dataProviders/NullDataProvider.js +21 -20
- package/dataProviders/NullDataProvider.js.map +1 -1
- package/dataProviders/RedirectsProvider.js +24 -27
- package/dataProviders/RedirectsProvider.js.map +1 -1
- package/defaultBreakpoints.js +23 -22
- package/defaultBreakpoints.js.map +1 -1
- package/documentOperations/$addElementReferenceToParent.js +29 -32
- package/documentOperations/$addElementReferenceToParent.js.map +1 -1
- package/documentOperations/AddElement.js +8 -7
- package/documentOperations/AddElement.js.map +1 -1
- package/documentOperations/AddToParent.js +14 -13
- package/documentOperations/AddToParent.js.map +1 -1
- package/documentOperations/IDocumentOperation.js +0 -3
- package/documentOperations/RemoveElement.js +9 -15
- package/documentOperations/RemoveElement.js.map +1 -1
- package/documentOperations/SetGlobalInputBinding.js +23 -22
- package/documentOperations/SetGlobalInputBinding.js.map +1 -1
- package/documentOperations/SetGlobalStyleBinding.js +23 -23
- package/documentOperations/SetGlobalStyleBinding.js.map +1 -1
- package/documentOperations/SetInputBindingOverride.js +30 -29
- package/documentOperations/SetInputBindingOverride.js.map +1 -1
- package/documentOperations/SetStyleBindingOverride.js +30 -31
- package/documentOperations/SetStyleBindingOverride.js.map +1 -1
- package/documentOperations/index.js +9 -8
- package/documentOperations/index.js.map +1 -1
- package/findMatchingAstNode.js +11 -13
- package/findMatchingAstNode.js.map +1 -1
- package/generateElementId.js +2 -1
- package/generateElementId.js.map +1 -1
- package/headersProvider.js +4 -3
- package/headersProvider.js.map +1 -1
- package/index.js +0 -2
- package/jsonPatch.js +5 -9
- package/jsonPatch.js.map +1 -1
- package/messages.js +12 -11
- package/messages.js.map +1 -1
- package/messenger/MessageOrigin.js +12 -11
- package/messenger/MessageOrigin.js.map +1 -1
- package/messenger/Messenger.js +58 -69
- package/messenger/Messenger.js.map +1 -1
- package/messenger/index.js +0 -2
- package/package.json +5 -5
- package/registerComponentGroup.js +5 -6
- package/registerComponentGroup.js.map +1 -1
- package/types/ShorthandCssProperties.js +0 -3
- package/types/WebsiteBuilderTheme.js +0 -3
- package/types.d.ts +3 -0
- package/types.js +0 -3
- package/IBindingsUpdater.js.map +0 -1
- package/IRedirects.js.map +0 -1
- package/documentOperations/IDocumentOperation.js.map +0 -1
- package/index.js.map +0 -1
- package/messenger/index.js.map +0 -1
- package/types/ShorthandCssProperties.js.map +0 -1
- package/types/WebsiteBuilderTheme.js.map +0 -1
- package/types.js.map +0 -1
package/BindingsResolver.js
CHANGED
|
@@ -1,131 +1,104 @@
|
|
|
1
1
|
import { toJS } from "mobx";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
53
|
-
|
|
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
|
-
|
|
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
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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
|
-
|
|
109
|
-
|
|
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
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
return undefined;
|
|
84
|
+
resolveBinding(binding, context) {
|
|
85
|
+
if (void 0 === binding) return;
|
|
86
|
+
if (binding.expression) return this.evaluateExpression(binding.expression, context);
|
|
87
|
+
return binding.static;
|
|
116
88
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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
|
+
}
|
|
127
100
|
}
|
|
128
|
-
}
|
|
129
101
|
}
|
|
102
|
+
export { BindingsResolver };
|
|
130
103
|
|
|
131
104
|
//# sourceMappingURL=BindingsResolver.js.map
|
package/BindingsResolver.js.map
CHANGED
|
@@ -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 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"],"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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"}
|