@webiny/website-builder-sdk 0.0.0-unstable.e53eceafb5
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.d.ts +25 -0
- package/BindingsApi.js +42 -0
- package/BindingsApi.js.map +1 -0
- package/BindingsProcessor.d.ts +11 -0
- package/BindingsProcessor.js +49 -0
- package/BindingsProcessor.js.map +1 -0
- package/BindingsProcessor.test.d.ts +1 -0
- package/BindingsProcessor.test.js +86 -0
- package/BindingsProcessor.test.js.map +1 -0
- package/BindingsResolver.d.ts +20 -0
- package/BindingsResolver.js +134 -0
- package/BindingsResolver.js.map +1 -0
- package/BindingsResolver.test.d.ts +1 -0
- package/BindingsResolver.test.js +382 -0
- package/BindingsResolver.test.js.map +1 -0
- package/ComponentInputTraverser.d.ts +18 -0
- package/ComponentInputTraverser.js +56 -0
- package/ComponentInputTraverser.js.map +1 -0
- package/ComponentManifestToAstConverter.d.ts +13 -0
- package/ComponentManifestToAstConverter.js +24 -0
- package/ComponentManifestToAstConverter.js.map +1 -0
- package/ComponentRegistry.d.ts +15 -0
- package/ComponentRegistry.js +25 -0
- package/ComponentRegistry.js.map +1 -0
- package/ComponentResolver.d.ts +14 -0
- package/ComponentResolver.js +36 -0
- package/ComponentResolver.js.map +1 -0
- package/ContentSdk.d.ts +38 -0
- package/ContentSdk.js +90 -0
- package/ContentSdk.js.map +1 -0
- package/DocumentStore.d.ts +15 -0
- package/DocumentStore.js +67 -0
- package/DocumentStore.js.map +1 -0
- package/DocumentStoreManager.d.ts +11 -0
- package/DocumentStoreManager.js +22 -0
- package/DocumentStoreManager.js.map +1 -0
- package/EditingSdk.d.ts +21 -0
- package/EditingSdk.js +143 -0
- package/EditingSdk.js.map +1 -0
- package/ElementFactory.d.ts +54 -0
- package/ElementFactory.js +183 -0
- package/ElementFactory.js.map +1 -0
- package/Environment.d.ts +9 -0
- package/Environment.js +23 -0
- package/Environment.js.map +1 -0
- package/FunctionConverter.d.ts +6 -0
- package/FunctionConverter.js +11 -0
- package/FunctionConverter.js.map +1 -0
- package/HashObject.d.ts +6 -0
- package/HashObject.js +17 -0
- package/HashObject.js.map +1 -0
- package/HotkeyManager.d.ts +6 -0
- package/HotkeyManager.js +58 -0
- package/HotkeyManager.js.map +1 -0
- package/IBindingsUpdater.d.ts +6 -0
- package/IBindingsUpdater.js +3 -0
- package/IBindingsUpdater.js.map +1 -0
- package/InheritanceProcessor.d.ts +29 -0
- package/InheritanceProcessor.js +147 -0
- package/InheritanceProcessor.js.map +1 -0
- package/InheritanceProcessor.test.d.ts +1 -0
- package/InheritanceProcessor.test.js +192 -0
- package/InheritanceProcessor.test.js.map +1 -0
- package/InheritedValueResolver.d.ts +10 -0
- package/InheritedValueResolver.js +24 -0
- package/InheritedValueResolver.js.map +1 -0
- package/InputBindingsProcessor.d.ts +38 -0
- package/InputBindingsProcessor.js +306 -0
- package/InputBindingsProcessor.js.map +1 -0
- package/InputsBindingsProcessor.test.d.ts +1 -0
- package/InputsBindingsProcessor.test.js +327 -0
- package/InputsBindingsProcessor.test.js.map +1 -0
- package/InputsUpdater.d.ts +12 -0
- package/InputsUpdater.js +34 -0
- package/InputsUpdater.js.map +1 -0
- package/LICENSE +21 -0
- package/LiveSdk.d.ts +7 -0
- package/LiveSdk.js +18 -0
- package/LiveSdk.js.map +1 -0
- package/Logger.d.ts +1 -0
- package/Logger.js +10 -0
- package/Logger.js.map +1 -0
- package/MouseTracker.d.ts +39 -0
- package/MouseTracker.js +93 -0
- package/MouseTracker.js.map +1 -0
- package/NullSdk.d.ts +7 -0
- package/NullSdk.js +14 -0
- package/NullSdk.js.map +1 -0
- package/PreviewDocument.d.ts +8 -0
- package/PreviewDocument.js +35 -0
- package/PreviewDocument.js.map +1 -0
- package/PreviewSdk.d.ts +8 -0
- package/PreviewSdk.js +22 -0
- package/PreviewSdk.js.map +1 -0
- package/PreviewViewport.d.ts +9 -0
- package/PreviewViewport.js +88 -0
- package/PreviewViewport.js.map +1 -0
- package/README.md +3 -0
- package/ResizeObserver.d.ts +5 -0
- package/ResizeObserver.js +41 -0
- package/ResizeObserver.js.map +1 -0
- package/StylesBindingsProcessor.d.ts +33 -0
- package/StylesBindingsProcessor.js +91 -0
- package/StylesBindingsProcessor.js.map +1 -0
- package/StylesUpdater.d.ts +10 -0
- package/StylesUpdater.js +34 -0
- package/StylesUpdater.js.map +1 -0
- package/Theme.d.ts +4 -0
- package/Theme.js +34 -0
- package/Theme.js.map +1 -0
- package/ViewportManager.d.ts +34 -0
- package/ViewportManager.js +103 -0
- package/ViewportManager.js.map +1 -0
- package/constants.d.ts +6 -0
- package/constants.js +8 -0
- package/constants.js.map +1 -0
- package/createElement.d.ts +10 -0
- package/createElement.js +8 -0
- package/createElement.js.map +1 -0
- package/createInput.d.ts +17 -0
- package/createInput.js +128 -0
- package/createInput.js.map +1 -0
- package/createTheme.d.ts +2 -0
- package/createTheme.js +5 -0
- package/createTheme.js.map +1 -0
- package/dataProviders/ApiClient.d.ts +13 -0
- package/dataProviders/ApiClient.js +43 -0
- package/dataProviders/ApiClient.js.map +1 -0
- package/dataProviders/DefaultDataProvider.d.ts +13 -0
- package/dataProviders/DefaultDataProvider.js +39 -0
- package/dataProviders/DefaultDataProvider.js.map +1 -0
- package/dataProviders/GET_PAGE_BY_ID.d.ts +1 -0
- package/dataProviders/GET_PAGE_BY_ID.js +21 -0
- package/dataProviders/GET_PAGE_BY_ID.js.map +1 -0
- package/dataProviders/GET_PAGE_BY_PATH.d.ts +1 -0
- package/dataProviders/GET_PAGE_BY_PATH.js +21 -0
- package/dataProviders/GET_PAGE_BY_PATH.js.map +1 -0
- package/dataProviders/LIST_PUBLISHED_PAGES.d.ts +1 -0
- package/dataProviders/LIST_PUBLISHED_PAGES.js +21 -0
- package/dataProviders/LIST_PUBLISHED_PAGES.js.map +1 -0
- package/dataProviders/NullDataProvider.d.ts +6 -0
- package/dataProviders/NullDataProvider.js +13 -0
- package/dataProviders/NullDataProvider.js.map +1 -0
- package/defaultBreakpoints.d.ts +2 -0
- package/defaultBreakpoints.js +25 -0
- package/defaultBreakpoints.js.map +1 -0
- package/documentOperations/$addElementReferenceToParent.d.ts +9 -0
- package/documentOperations/$addElementReferenceToParent.js +31 -0
- package/documentOperations/$addElementReferenceToParent.js.map +1 -0
- package/documentOperations/AddElement.d.ts +7 -0
- package/documentOperations/AddElement.js +10 -0
- package/documentOperations/AddElement.js.map +1 -0
- package/documentOperations/AddToParent.d.ts +8 -0
- package/documentOperations/AddToParent.js +17 -0
- package/documentOperations/AddToParent.js.map +1 -0
- package/documentOperations/IDocumentOperation.d.ts +4 -0
- package/documentOperations/IDocumentOperation.js +3 -0
- package/documentOperations/IDocumentOperation.js.map +1 -0
- package/documentOperations/RemoveElement.d.ts +7 -0
- package/documentOperations/RemoveElement.js +10 -0
- package/documentOperations/RemoveElement.js.map +1 -0
- package/documentOperations/SetGlobalInputBinding.d.ts +9 -0
- package/documentOperations/SetGlobalInputBinding.js +25 -0
- package/documentOperations/SetGlobalInputBinding.js.map +1 -0
- package/documentOperations/SetGlobalStyleBinding.d.ts +9 -0
- package/documentOperations/SetGlobalStyleBinding.js +26 -0
- package/documentOperations/SetGlobalStyleBinding.js.map +1 -0
- package/documentOperations/SetInputBindingOverride.d.ts +10 -0
- package/documentOperations/SetInputBindingOverride.js +33 -0
- package/documentOperations/SetInputBindingOverride.js.map +1 -0
- package/documentOperations/SetStyleBindingOverride.d.ts +10 -0
- package/documentOperations/SetStyleBindingOverride.js +35 -0
- package/documentOperations/SetStyleBindingOverride.js.map +1 -0
- package/documentOperations/index.d.ts +17 -0
- package/documentOperations/index.js +18 -0
- package/documentOperations/index.js.map +1 -0
- package/findMatchingAstNode.d.ts +2 -0
- package/findMatchingAstNode.js +17 -0
- package/findMatchingAstNode.js.map +1 -0
- package/generateElementId.d.ts +1 -0
- package/generateElementId.js +7 -0
- package/generateElementId.js.map +1 -0
- package/headersProvider.d.ts +4 -0
- package/headersProvider.js +7 -0
- package/headersProvider.js.map +1 -0
- package/index.d.ts +31 -0
- package/index.js +33 -0
- package/index.js.map +1 -0
- package/jsonPatch.d.ts +6 -0
- package/jsonPatch.js +12 -0
- package/jsonPatch.js.map +1 -0
- package/lexical/createDefaultLexicalTheme.d.ts +2 -0
- package/lexical/createDefaultLexicalTheme.js +84 -0
- package/lexical/createDefaultLexicalTheme.js.map +1 -0
- package/lexical/createLexicalTheme.d.ts +2 -0
- package/lexical/createLexicalTheme.js +7 -0
- package/lexical/createLexicalTheme.js.map +1 -0
- package/lexical/deepMerge.d.ts +1 -0
- package/lexical/deepMerge.js +23 -0
- package/lexical/deepMerge.js.map +1 -0
- package/messages.d.ts +11 -0
- package/messages.js +13 -0
- package/messages.js.map +1 -0
- package/messenger/MessageOrigin.d.ts +7 -0
- package/messenger/MessageOrigin.js +14 -0
- package/messenger/MessageOrigin.js.map +1 -0
- package/messenger/Messenger.d.ts +22 -0
- package/messenger/Messenger.js +80 -0
- package/messenger/Messenger.js.map +1 -0
- package/messenger/index.d.ts +2 -0
- package/messenger/index.js +4 -0
- package/messenger/index.js.map +1 -0
- package/package.json +54 -0
- package/registerComponentGroup.d.ts +2 -0
- package/registerComponentGroup.js +10 -0
- package/registerComponentGroup.js.map +1 -0
- package/types/LexicalEditorTheme.d.ts +2 -0
- package/types/LexicalEditorTheme.js +3 -0
- package/types/LexicalEditorTheme.js.map +1 -0
- package/types/ShorthandCssProperties.d.ts +1 -0
- package/types/ShorthandCssProperties.js +3 -0
- package/types/ShorthandCssProperties.js.map +1 -0
- package/types/WebsiteBuilderTheme.d.ts +79 -0
- package/types/WebsiteBuilderTheme.js +3 -0
- package/types/WebsiteBuilderTheme.js.map +1 -0
- package/types.d.ts +294 -0
- package/types.js +3 -0
- package/types.js.map +1 -0
package/BindingsApi.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ElementFactory } from "./ElementFactory";
|
|
2
|
+
import type { InputAstNode } from "./ComponentManifestToAstConverter";
|
|
3
|
+
import type { DocumentElementBindings, Document } from "./types";
|
|
4
|
+
import { type CreateElementParams } from "./createElement";
|
|
5
|
+
export type FlatBindings = Record<string, Record<string, any>>;
|
|
6
|
+
type DeepBindings = Record<string, any>;
|
|
7
|
+
export declare class BindingsApi {
|
|
8
|
+
inputs: DeepBindings;
|
|
9
|
+
styles: DeepBindings;
|
|
10
|
+
private inputsProcessor;
|
|
11
|
+
private stylesProcessor;
|
|
12
|
+
private breakpoint;
|
|
13
|
+
private breakpoints;
|
|
14
|
+
constructor(elementId: string, rawBindings: DocumentElementBindings, resolvedBindings: DocumentElementBindings, inputsAst: InputAstNode[], elementFactory: ElementFactory, breakpoint: string);
|
|
15
|
+
getPublicApi(): {
|
|
16
|
+
inputs: DeepBindings;
|
|
17
|
+
styles: DeepBindings;
|
|
18
|
+
createElement: (params: CreateElementParams) => {
|
|
19
|
+
action: string;
|
|
20
|
+
params: CreateElementParams;
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
applyToDocument(document: Document): void;
|
|
24
|
+
}
|
|
25
|
+
export {};
|
package/BindingsApi.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { createElement } from "./createElement";
|
|
2
|
+
import { StylesBindingsProcessor } from "./StylesBindingsProcessor";
|
|
3
|
+
import { InputsBindingsProcessor } from "./InputBindingsProcessor";
|
|
4
|
+
// The BindingsApi class manages the transformation and handling of element bindings,
|
|
5
|
+
// including inputs and styles, for a document element within the editor.
|
|
6
|
+
export class BindingsApi {
|
|
7
|
+
inputs = {};
|
|
8
|
+
styles = {};
|
|
9
|
+
// TODO: refactor to pass inputs and styles processor instead of their deps.
|
|
10
|
+
|
|
11
|
+
// Constructs a new BindingsApi instance for a specific element, providing its
|
|
12
|
+
// raw and resolved bindings, the input AST, an element factory, and the current breakpoint.
|
|
13
|
+
constructor(elementId, rawBindings, resolvedBindings, inputsAst, elementFactory, breakpoint) {
|
|
14
|
+
this.breakpoint = breakpoint;
|
|
15
|
+
// TODO: improve handling of breakpoints.
|
|
16
|
+
this.breakpoints = ["desktop", "tablet", "mobile"];
|
|
17
|
+
this.inputsProcessor = new InputsBindingsProcessor(elementId, inputsAst, this.breakpoints, rawBindings, elementFactory);
|
|
18
|
+
this.stylesProcessor = new StylesBindingsProcessor(elementId, this.breakpoints, rawBindings);
|
|
19
|
+
this.inputs = this.inputsProcessor.toDeepInputs(resolvedBindings.inputs || {});
|
|
20
|
+
this.styles = this.stylesProcessor.toDeepStyles(resolvedBindings.styles || {});
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Returns the public API for this binding context, exposing deep inputs, styles,
|
|
24
|
+
// and a function to create elements.
|
|
25
|
+
getPublicApi() {
|
|
26
|
+
return {
|
|
27
|
+
inputs: this.inputs,
|
|
28
|
+
styles: this.styles ?? {},
|
|
29
|
+
createElement: params => {
|
|
30
|
+
return createElement(params);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
applyToDocument(document) {
|
|
35
|
+
const inputs = this.inputsProcessor.createUpdate(this.inputs, this.breakpoint);
|
|
36
|
+
const styles = this.stylesProcessor.createUpdate(this.styles, this.breakpoint);
|
|
37
|
+
inputs.applyToDocument(document);
|
|
38
|
+
styles.applyToDocument(document);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=BindingsApi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createElement","StylesBindingsProcessor","InputsBindingsProcessor","BindingsApi","inputs","styles","constructor","elementId","rawBindings","resolvedBindings","inputsAst","elementFactory","breakpoint","breakpoints","inputsProcessor","stylesProcessor","toDeepInputs","toDeepStyles","getPublicApi","params","applyToDocument","document","createUpdate"],"sources":["BindingsApi.ts"],"sourcesContent":["import type { ElementFactory } from \"~/ElementFactory\";\nimport type { InputAstNode } from \"./ComponentManifestToAstConverter\";\nimport type { DocumentElementBindings, Document } from \"~/types\";\nimport { createElement, type CreateElementParams } from \"./createElement\";\nimport { StylesBindingsProcessor } from \"~/StylesBindingsProcessor\";\nimport { InputsBindingsProcessor } from \"~/InputBindingsProcessor\";\n\nexport type FlatBindings = Record<string, Record<string, any>>;\ntype DeepBindings = Record<string, any>;\n\n// The BindingsApi class manages the transformation and handling of element bindings,\n// including inputs and styles, for a document element within the editor.\nexport class BindingsApi {\n public inputs: DeepBindings = {};\n public styles: DeepBindings = {};\n private inputsProcessor: InputsBindingsProcessor;\n private stylesProcessor: StylesBindingsProcessor;\n private breakpoint: string;\n private breakpoints: string[];\n\n // TODO: refactor to pass inputs and styles processor instead of their deps.\n\n // Constructs a new BindingsApi instance for a specific element, providing its\n // raw and resolved bindings, the input AST, an element factory, and the current breakpoint.\n constructor(\n elementId: string,\n rawBindings: DocumentElementBindings,\n resolvedBindings: DocumentElementBindings,\n inputsAst: InputAstNode[],\n elementFactory: ElementFactory,\n breakpoint: string\n ) {\n this.breakpoint = breakpoint;\n // TODO: improve handling of breakpoints.\n this.breakpoints = [\"desktop\", \"tablet\", \"mobile\"];\n this.inputsProcessor = new InputsBindingsProcessor(\n elementId,\n inputsAst,\n this.breakpoints,\n rawBindings,\n elementFactory\n );\n this.stylesProcessor = new StylesBindingsProcessor(\n elementId,\n this.breakpoints,\n rawBindings\n );\n this.inputs = this.inputsProcessor.toDeepInputs(resolvedBindings.inputs || {});\n this.styles = this.stylesProcessor.toDeepStyles(resolvedBindings.styles || {});\n }\n\n // Returns the public API for this binding context, exposing deep inputs, styles,\n // and a function to create elements.\n public getPublicApi() {\n return {\n inputs: this.inputs,\n styles: this.styles ?? {},\n createElement: (params: CreateElementParams) => {\n return createElement(params);\n }\n };\n }\n\n public applyToDocument(document: Document) {\n const inputs = this.inputsProcessor.createUpdate(this.inputs, this.breakpoint);\n const styles = this.stylesProcessor.createUpdate(this.styles, this.breakpoint);\n\n inputs.applyToDocument(document);\n styles.applyToDocument(document);\n }\n}\n"],"mappings":"AAGA,SAASA,aAAa;AACtB,SAASC,uBAAuB;AAChC,SAASC,uBAAuB;AAKhC;AACA;AACA,OAAO,MAAMC,WAAW,CAAC;EACdC,MAAM,GAAiB,CAAC,CAAC;EACzBC,MAAM,GAAiB,CAAC,CAAC;EAMhC;;EAEA;EACA;EACAC,WAAWA,CACPC,SAAiB,EACjBC,WAAoC,EACpCC,gBAAyC,EACzCC,SAAyB,EACzBC,cAA8B,EAC9BC,UAAkB,EACpB;IACE,IAAI,CAACA,UAAU,GAAGA,UAAU;IAC5B;IACA,IAAI,CAACC,WAAW,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC;IAClD,IAAI,CAACC,eAAe,GAAG,IAAIZ,uBAAuB,CAC9CK,SAAS,EACTG,SAAS,EACT,IAAI,CAACG,WAAW,EAChBL,WAAW,EACXG,cACJ,CAAC;IACD,IAAI,CAACI,eAAe,GAAG,IAAId,uBAAuB,CAC9CM,SAAS,EACT,IAAI,CAACM,WAAW,EAChBL,WACJ,CAAC;IACD,IAAI,CAACJ,MAAM,GAAG,IAAI,CAACU,eAAe,CAACE,YAAY,CAACP,gBAAgB,CAACL,MAAM,IAAI,CAAC,CAAC,CAAC;IAC9E,IAAI,CAACC,MAAM,GAAG,IAAI,CAACU,eAAe,CAACE,YAAY,CAACR,gBAAgB,CAACJ,MAAM,IAAI,CAAC,CAAC,CAAC;EAClF;;EAEA;EACA;EACOa,YAAYA,CAAA,EAAG;IAClB,OAAO;MACHd,MAAM,EAAE,IAAI,CAACA,MAAM;MACnBC,MAAM,EAAE,IAAI,CAACA,MAAM,IAAI,CAAC,CAAC;MACzBL,aAAa,EAAGmB,MAA2B,IAAK;QAC5C,OAAOnB,aAAa,CAACmB,MAAM,CAAC;MAChC;IACJ,CAAC;EACL;EAEOC,eAAeA,CAACC,QAAkB,EAAE;IACvC,MAAMjB,MAAM,GAAG,IAAI,CAACU,eAAe,CAACQ,YAAY,CAAC,IAAI,CAAClB,MAAM,EAAE,IAAI,CAACQ,UAAU,CAAC;IAC9E,MAAMP,MAAM,GAAG,IAAI,CAACU,eAAe,CAACO,YAAY,CAAC,IAAI,CAACjB,MAAM,EAAE,IAAI,CAACO,UAAU,CAAC;IAE9ER,MAAM,CAACgB,eAAe,CAACC,QAAQ,CAAC;IAChChB,MAAM,CAACe,eAAe,CAACC,QAAQ,CAAC;EACpC;AACJ","ignoreList":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { DocumentElementBindings } from "./types";
|
|
2
|
+
type RequiredBindings<T extends DocumentElementBindings> = T & {
|
|
3
|
+
inputs: NonNullable<T["inputs"]>;
|
|
4
|
+
styles: NonNullable<T["styles"]>;
|
|
5
|
+
};
|
|
6
|
+
export declare class BindingsProcessor {
|
|
7
|
+
private readonly breakpoints;
|
|
8
|
+
constructor(breakpoints: string[]);
|
|
9
|
+
getBindings(bindings: DocumentElementBindings, breakpoint: string): RequiredBindings<DocumentElementBindings>;
|
|
10
|
+
}
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export class BindingsProcessor {
|
|
2
|
+
constructor(breakpoints) {
|
|
3
|
+
this.breakpoints = breakpoints;
|
|
4
|
+
}
|
|
5
|
+
getBindings(bindings, breakpoint) {
|
|
6
|
+
const result = {
|
|
7
|
+
$repeat: bindings.$repeat,
|
|
8
|
+
inputs: {
|
|
9
|
+
...(bindings.inputs || {})
|
|
10
|
+
},
|
|
11
|
+
styles: {
|
|
12
|
+
...(bindings.styles || {})
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
const overrides = bindings.overrides ?? {};
|
|
16
|
+
let upTo = this.breakpoints.indexOf(breakpoint);
|
|
17
|
+
if (upTo === -1) {
|
|
18
|
+
upTo = 0;
|
|
19
|
+
}
|
|
20
|
+
for (let i = 0; i <= upTo; i++) {
|
|
21
|
+
const bp = this.breakpoints[i];
|
|
22
|
+
const override = overrides[bp];
|
|
23
|
+
if (!override) {
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (override.inputs) {
|
|
27
|
+
for (const key in override.inputs) {
|
|
28
|
+
result.inputs[key] = {
|
|
29
|
+
...(result.inputs[key] || {}),
|
|
30
|
+
...override.inputs[key]
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (override.styles) {
|
|
35
|
+
for (const styleKey in override.styles) {
|
|
36
|
+
const key = styleKey;
|
|
37
|
+
// @ts-expect-error It's hard to make CSS properties happy.
|
|
38
|
+
result.styles[key] = {
|
|
39
|
+
...(result.styles[key] || {}),
|
|
40
|
+
...override.styles[key]
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
//# sourceMappingURL=BindingsProcessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["BindingsProcessor","constructor","breakpoints","getBindings","bindings","breakpoint","result","$repeat","inputs","styles","overrides","upTo","indexOf","i","bp","override","key","styleKey"],"sources":["BindingsProcessor.ts"],"sourcesContent":["import type { DocumentElementBindings, CssProperties } from \"~/types\";\n\ntype RequiredBindings<T extends DocumentElementBindings> = T & {\n inputs: NonNullable<T[\"inputs\"]>;\n styles: NonNullable<T[\"styles\"]>;\n};\n\nexport class BindingsProcessor {\n private readonly breakpoints: string[];\n\n constructor(breakpoints: string[]) {\n this.breakpoints = breakpoints;\n }\n\n public getBindings(bindings: DocumentElementBindings, breakpoint: string) {\n const result: RequiredBindings<DocumentElementBindings> = {\n $repeat: bindings.$repeat,\n inputs: { ...(bindings.inputs || {}) },\n styles: { ...(bindings.styles || {}) }\n };\n\n const overrides = bindings.overrides ?? {};\n\n let upTo = this.breakpoints.indexOf(breakpoint);\n if (upTo === -1) {\n upTo = 0;\n }\n\n for (let i = 0; i <= upTo; i++) {\n const bp = this.breakpoints[i];\n const override = overrides[bp];\n if (!override) {\n continue;\n }\n\n if (override.inputs) {\n for (const key in override.inputs) {\n result.inputs[key] = {\n ...(result.inputs![key] || {}),\n ...override.inputs[key]\n };\n }\n }\n\n if (override.styles) {\n for (const styleKey in override.styles) {\n const key = styleKey as keyof CssProperties;\n // @ts-expect-error It's hard to make CSS properties happy.\n result.styles[key] = {\n ...(result.styles[key] || {}),\n ...override.styles[key]\n };\n }\n }\n }\n\n return result;\n }\n}\n"],"mappings":"AAOA,OAAO,MAAMA,iBAAiB,CAAC;EAG3BC,WAAWA,CAACC,WAAqB,EAAE;IAC/B,IAAI,CAACA,WAAW,GAAGA,WAAW;EAClC;EAEOC,WAAWA,CAACC,QAAiC,EAAEC,UAAkB,EAAE;IACtE,MAAMC,MAAiD,GAAG;MACtDC,OAAO,EAAEH,QAAQ,CAACG,OAAO;MACzBC,MAAM,EAAE;QAAE,IAAIJ,QAAQ,CAACI,MAAM,IAAI,CAAC,CAAC;MAAE,CAAC;MACtCC,MAAM,EAAE;QAAE,IAAIL,QAAQ,CAACK,MAAM,IAAI,CAAC,CAAC;MAAE;IACzC,CAAC;IAED,MAAMC,SAAS,GAAGN,QAAQ,CAACM,SAAS,IAAI,CAAC,CAAC;IAE1C,IAAIC,IAAI,GAAG,IAAI,CAACT,WAAW,CAACU,OAAO,CAACP,UAAU,CAAC;IAC/C,IAAIM,IAAI,KAAK,CAAC,CAAC,EAAE;MACbA,IAAI,GAAG,CAAC;IACZ;IAEA,KAAK,IAAIE,CAAC,GAAG,CAAC,EAAEA,CAAC,IAAIF,IAAI,EAAEE,CAAC,EAAE,EAAE;MAC5B,MAAMC,EAAE,GAAG,IAAI,CAACZ,WAAW,CAACW,CAAC,CAAC;MAC9B,MAAME,QAAQ,GAAGL,SAAS,CAACI,EAAE,CAAC;MAC9B,IAAI,CAACC,QAAQ,EAAE;QACX;MACJ;MAEA,IAAIA,QAAQ,CAACP,MAAM,EAAE;QACjB,KAAK,MAAMQ,GAAG,IAAID,QAAQ,CAACP,MAAM,EAAE;UAC/BF,MAAM,CAACE,MAAM,CAACQ,GAAG,CAAC,GAAG;YACjB,IAAIV,MAAM,CAACE,MAAM,CAAEQ,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC9B,GAAGD,QAAQ,CAACP,MAAM,CAACQ,GAAG;UAC1B,CAAC;QACL;MACJ;MAEA,IAAID,QAAQ,CAACN,MAAM,EAAE;QACjB,KAAK,MAAMQ,QAAQ,IAAIF,QAAQ,CAACN,MAAM,EAAE;UACpC,MAAMO,GAAG,GAAGC,QAA+B;UAC3C;UACAX,MAAM,CAACG,MAAM,CAACO,GAAG,CAAC,GAAG;YACjB,IAAIV,MAAM,CAACG,MAAM,CAACO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7B,GAAGD,QAAQ,CAACN,MAAM,CAACO,GAAG;UAC1B,CAAC;QACL;MACJ;IACJ;IAEA,OAAOV,MAAM;EACjB;AACJ","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { BindingsProcessor } from "./BindingsProcessor";
|
|
2
|
+
describe("BindingsProcessor", () => {
|
|
3
|
+
const breakpoints = ["desktop", "tablet", "mobile"];
|
|
4
|
+
const processor = new BindingsProcessor(breakpoints);
|
|
5
|
+
const bindings = {
|
|
6
|
+
inputs: {
|
|
7
|
+
title: {
|
|
8
|
+
id: "title",
|
|
9
|
+
static: "Hello",
|
|
10
|
+
type: "text"
|
|
11
|
+
},
|
|
12
|
+
count: {
|
|
13
|
+
id: "count",
|
|
14
|
+
static: 1,
|
|
15
|
+
type: "number",
|
|
16
|
+
expression: "$state.count"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
styles: {
|
|
20
|
+
paddingTop: {
|
|
21
|
+
static: "10px"
|
|
22
|
+
},
|
|
23
|
+
backgroundColor: {
|
|
24
|
+
static: "white"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
overrides: {
|
|
28
|
+
tablet: {
|
|
29
|
+
inputs: {
|
|
30
|
+
title: {
|
|
31
|
+
id: "title",
|
|
32
|
+
static: "Hello Tablet",
|
|
33
|
+
type: "text"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
styles: {
|
|
37
|
+
backgroundColor: {
|
|
38
|
+
static: "gray"
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
mobile: {
|
|
43
|
+
inputs: {
|
|
44
|
+
count: {
|
|
45
|
+
id: "count",
|
|
46
|
+
static: 3,
|
|
47
|
+
type: "number"
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
styles: {
|
|
51
|
+
paddingTop: {
|
|
52
|
+
static: "5px"
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
it("should return unmodified bindings when base breakpoint is specified", () => {
|
|
59
|
+
const result = processor.getBindings(bindings, "desktop");
|
|
60
|
+
expect(result.inputs).toEqual(bindings.inputs);
|
|
61
|
+
expect(result.styles).toEqual(bindings.styles);
|
|
62
|
+
});
|
|
63
|
+
it("should merge tablet overrides", () => {
|
|
64
|
+
const result = processor.getBindings(bindings, "tablet");
|
|
65
|
+
expect(result.inputs?.title.static).toBe("Hello Tablet");
|
|
66
|
+
expect(result.inputs?.count.static).toBe(1);
|
|
67
|
+
expect(result.inputs?.count.expression).toBe("$state.count");
|
|
68
|
+
expect(result.styles?.backgroundColor?.static).toBe("gray");
|
|
69
|
+
expect(result.styles?.paddingTop?.static).toBe("10px");
|
|
70
|
+
});
|
|
71
|
+
it("should merge mobile and tablet overrides", () => {
|
|
72
|
+
const result = processor.getBindings(bindings, "mobile");
|
|
73
|
+
expect(result.inputs?.title.static).toBe("Hello Tablet");
|
|
74
|
+
expect(result.inputs?.count.static).toBe(3);
|
|
75
|
+
expect(result.inputs?.count.expression).toBe("$state.count");
|
|
76
|
+
expect(result.styles?.backgroundColor?.static).toBe("gray");
|
|
77
|
+
expect(result.styles?.paddingTop?.static).toBe("5px");
|
|
78
|
+
});
|
|
79
|
+
it("should ignore unknown breakpoints", () => {
|
|
80
|
+
const result = processor.getBindings(bindings, "unknown");
|
|
81
|
+
expect(result.inputs).toEqual(bindings.inputs);
|
|
82
|
+
expect(result.styles).toEqual(bindings.styles);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
//# sourceMappingURL=BindingsProcessor.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["BindingsProcessor","describe","breakpoints","processor","bindings","inputs","title","id","static","type","count","expression","styles","paddingTop","backgroundColor","overrides","tablet","mobile","it","result","getBindings","expect","toEqual","toBe"],"sources":["BindingsProcessor.test.ts"],"sourcesContent":["import { BindingsProcessor } from \"./BindingsProcessor\";\nimport type { DocumentElementBindings } from \"~/types\";\n\ndescribe(\"BindingsProcessor\", () => {\n const breakpoints = [\"desktop\", \"tablet\", \"mobile\"];\n const processor = new BindingsProcessor(breakpoints);\n\n const bindings: DocumentElementBindings = {\n inputs: {\n title: { id: \"title\", static: \"Hello\", type: \"text\" },\n count: { id: \"count\", static: 1, type: \"number\", expression: \"$state.count\" }\n },\n styles: {\n paddingTop: { static: \"10px\" },\n backgroundColor: { static: \"white\" }\n },\n overrides: {\n tablet: {\n inputs: {\n title: { id: \"title\", static: \"Hello Tablet\", type: \"text\" }\n },\n styles: {\n backgroundColor: { static: \"gray\" }\n }\n },\n mobile: {\n inputs: {\n count: { id: \"count\", static: 3, type: \"number\" }\n },\n styles: {\n paddingTop: { static: \"5px\" }\n }\n }\n }\n };\n\n it(\"should return unmodified bindings when base breakpoint is specified\", () => {\n const result = processor.getBindings(bindings, \"desktop\");\n expect(result.inputs).toEqual(bindings.inputs);\n expect(result.styles).toEqual(bindings.styles);\n });\n\n it(\"should merge tablet overrides\", () => {\n const result = processor.getBindings(bindings, \"tablet\");\n expect(result.inputs?.title.static).toBe(\"Hello Tablet\");\n expect(result.inputs?.count.static).toBe(1);\n expect(result.inputs?.count.expression).toBe(\"$state.count\");\n expect(result.styles?.backgroundColor?.static).toBe(\"gray\");\n expect(result.styles?.paddingTop?.static).toBe(\"10px\");\n });\n\n it(\"should merge mobile and tablet overrides\", () => {\n const result = processor.getBindings(bindings, \"mobile\");\n expect(result.inputs?.title.static).toBe(\"Hello Tablet\");\n expect(result.inputs?.count.static).toBe(3);\n expect(result.inputs?.count.expression).toBe(\"$state.count\");\n expect(result.styles?.backgroundColor?.static).toBe(\"gray\");\n expect(result.styles?.paddingTop?.static).toBe(\"5px\");\n });\n\n it(\"should ignore unknown breakpoints\", () => {\n const result = processor.getBindings(bindings, \"unknown\");\n expect(result.inputs).toEqual(bindings.inputs);\n expect(result.styles).toEqual(bindings.styles);\n });\n});\n"],"mappings":"AAAA,SAASA,iBAAiB;AAG1BC,QAAQ,CAAC,mBAAmB,EAAE,MAAM;EAChC,MAAMC,WAAW,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC;EACnD,MAAMC,SAAS,GAAG,IAAIH,iBAAiB,CAACE,WAAW,CAAC;EAEpD,MAAME,QAAiC,GAAG;IACtCC,MAAM,EAAE;MACJC,KAAK,EAAE;QAAEC,EAAE,EAAE,OAAO;QAAEC,MAAM,EAAE,OAAO;QAAEC,IAAI,EAAE;MAAO,CAAC;MACrDC,KAAK,EAAE;QAAEH,EAAE,EAAE,OAAO;QAAEC,MAAM,EAAE,CAAC;QAAEC,IAAI,EAAE,QAAQ;QAAEE,UAAU,EAAE;MAAe;IAChF,CAAC;IACDC,MAAM,EAAE;MACJC,UAAU,EAAE;QAAEL,MAAM,EAAE;MAAO,CAAC;MAC9BM,eAAe,EAAE;QAAEN,MAAM,EAAE;MAAQ;IACvC,CAAC;IACDO,SAAS,EAAE;MACPC,MAAM,EAAE;QACJX,MAAM,EAAE;UACJC,KAAK,EAAE;YAAEC,EAAE,EAAE,OAAO;YAAEC,MAAM,EAAE,cAAc;YAAEC,IAAI,EAAE;UAAO;QAC/D,CAAC;QACDG,MAAM,EAAE;UACJE,eAAe,EAAE;YAAEN,MAAM,EAAE;UAAO;QACtC;MACJ,CAAC;MACDS,MAAM,EAAE;QACJZ,MAAM,EAAE;UACJK,KAAK,EAAE;YAAEH,EAAE,EAAE,OAAO;YAAEC,MAAM,EAAE,CAAC;YAAEC,IAAI,EAAE;UAAS;QACpD,CAAC;QACDG,MAAM,EAAE;UACJC,UAAU,EAAE;YAAEL,MAAM,EAAE;UAAM;QAChC;MACJ;IACJ;EACJ,CAAC;EAEDU,EAAE,CAAC,qEAAqE,EAAE,MAAM;IAC5E,MAAMC,MAAM,GAAGhB,SAAS,CAACiB,WAAW,CAAChB,QAAQ,EAAE,SAAS,CAAC;IACzDiB,MAAM,CAACF,MAAM,CAACd,MAAM,CAAC,CAACiB,OAAO,CAAClB,QAAQ,CAACC,MAAM,CAAC;IAC9CgB,MAAM,CAACF,MAAM,CAACP,MAAM,CAAC,CAACU,OAAO,CAAClB,QAAQ,CAACQ,MAAM,CAAC;EAClD,CAAC,CAAC;EAEFM,EAAE,CAAC,+BAA+B,EAAE,MAAM;IACtC,MAAMC,MAAM,GAAGhB,SAAS,CAACiB,WAAW,CAAChB,QAAQ,EAAE,QAAQ,CAAC;IACxDiB,MAAM,CAACF,MAAM,CAACd,MAAM,EAAEC,KAAK,CAACE,MAAM,CAAC,CAACe,IAAI,CAAC,cAAc,CAAC;IACxDF,MAAM,CAACF,MAAM,CAACd,MAAM,EAAEK,KAAK,CAACF,MAAM,CAAC,CAACe,IAAI,CAAC,CAAC,CAAC;IAC3CF,MAAM,CAACF,MAAM,CAACd,MAAM,EAAEK,KAAK,CAACC,UAAU,CAAC,CAACY,IAAI,CAAC,cAAc,CAAC;IAC5DF,MAAM,CAACF,MAAM,CAACP,MAAM,EAAEE,eAAe,EAAEN,MAAM,CAAC,CAACe,IAAI,CAAC,MAAM,CAAC;IAC3DF,MAAM,CAACF,MAAM,CAACP,MAAM,EAAEC,UAAU,EAAEL,MAAM,CAAC,CAACe,IAAI,CAAC,MAAM,CAAC;EAC1D,CAAC,CAAC;EAEFL,EAAE,CAAC,0CAA0C,EAAE,MAAM;IACjD,MAAMC,MAAM,GAAGhB,SAAS,CAACiB,WAAW,CAAChB,QAAQ,EAAE,QAAQ,CAAC;IACxDiB,MAAM,CAACF,MAAM,CAACd,MAAM,EAAEC,KAAK,CAACE,MAAM,CAAC,CAACe,IAAI,CAAC,cAAc,CAAC;IACxDF,MAAM,CAACF,MAAM,CAACd,MAAM,EAAEK,KAAK,CAACF,MAAM,CAAC,CAACe,IAAI,CAAC,CAAC,CAAC;IAC3CF,MAAM,CAACF,MAAM,CAACd,MAAM,EAAEK,KAAK,CAACC,UAAU,CAAC,CAACY,IAAI,CAAC,cAAc,CAAC;IAC5DF,MAAM,CAACF,MAAM,CAACP,MAAM,EAAEE,eAAe,EAAEN,MAAM,CAAC,CAACe,IAAI,CAAC,MAAM,CAAC;IAC3DF,MAAM,CAACF,MAAM,CAACP,MAAM,EAAEC,UAAU,EAAEL,MAAM,CAAC,CAACe,IAAI,CAAC,KAAK,CAAC;EACzD,CAAC,CAAC;EAEFL,EAAE,CAAC,mCAAmC,EAAE,MAAM;IAC1C,MAAMC,MAAM,GAAGhB,SAAS,CAACiB,WAAW,CAAChB,QAAQ,EAAE,SAAS,CAAC;IACzDiB,MAAM,CAACF,MAAM,CAACd,MAAM,CAAC,CAACiB,OAAO,CAAClB,QAAQ,CAACC,MAAM,CAAC;IAC9CgB,MAAM,CAACF,MAAM,CAACP,MAAM,CAAC,CAACU,OAAO,CAAClB,QAAQ,CAACQ,MAAM,CAAC;EAClD,CAAC,CAAC;AACN,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { DocumentElement, DocumentState, ResolvedElement, ComponentInput, DocumentElementBindings } from "./types";
|
|
2
|
+
import type { InputAstNode } from "./ComponentManifestToAstConverter";
|
|
3
|
+
export interface OnResolved {
|
|
4
|
+
(value: any, input: ComponentInput): any;
|
|
5
|
+
}
|
|
6
|
+
export type ResolveElementParams = {
|
|
7
|
+
element: DocumentElement;
|
|
8
|
+
elementBindings: DocumentElementBindings;
|
|
9
|
+
inputAst: InputAstNode[];
|
|
10
|
+
onResolved?: OnResolved;
|
|
11
|
+
};
|
|
12
|
+
export declare class BindingsResolver {
|
|
13
|
+
private readonly state;
|
|
14
|
+
constructor(state: DocumentState);
|
|
15
|
+
resolveElement({ element, elementBindings, inputAst, onResolved }: ResolveElementParams): ResolvedElement[];
|
|
16
|
+
private resolveSingleInstance;
|
|
17
|
+
private getUniqueIndexesFromPath;
|
|
18
|
+
private resolveBinding;
|
|
19
|
+
private evaluateExpression;
|
|
20
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
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
|
+
});
|
|
23
|
+
}
|
|
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;
|
|
51
|
+
});
|
|
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;
|
|
74
|
+
}
|
|
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
|
+
}
|
|
87
|
+
}
|
|
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 (!binding) {
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
if (binding.expression) {
|
|
109
|
+
return this.evaluateExpression(binding.expression, context);
|
|
110
|
+
}
|
|
111
|
+
if (binding.static) {
|
|
112
|
+
return binding.static;
|
|
113
|
+
}
|
|
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 (e) {
|
|
129
|
+
return undefined;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
//# sourceMappingURL=BindingsResolver.js.map
|
|
@@ -0,0 +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","e"],"sources":["BindingsResolver.ts"],"sourcesContent":["import { toJS } from \"mobx\";\nimport type {\n DocumentElement,\n DocumentState,\n ResolvedElement,\n ComponentInput,\n ValueBinding,\n DocumentElementBindings,\n SerializableCSSStyleDeclaration,\n DocumentElementStyleBindings\n} from \"~/types\";\nimport type { InputAstNode } from \"./ComponentManifestToAstConverter\";\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 (!binding) {\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 (e) {\n return undefined;\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|