@webiny/website-builder-sdk 0.0.0-unstable.eb196ccd2f → 0.0.0-unstable.eb81deee7e
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 -77
- package/BindingsProcessor.test.js.map +1 -1
- package/BindingsResolver.d.ts +5 -2
- package/BindingsResolver.js +99 -122
- package/BindingsResolver.js.map +1 -1
- package/BindingsResolver.test.js +399 -362
- package/BindingsResolver.test.js.map +1 -1
- package/ComponentInputTraverser.js +32 -49
- package/ComponentInputTraverser.js.map +1 -1
- package/ComponentManifestToAstConverter.js +20 -21
- package/ComponentManifestToAstConverter.js.map +1 -1
- package/ComponentRegistry.d.ts +9 -0
- package/ComponentRegistry.js +38 -22
- package/ComponentRegistry.js.map +1 -1
- package/ComponentResolver.d.ts +3 -2
- package/ComponentResolver.js +39 -29
- package/ComponentResolver.js.map +1 -1
- package/ComponentResolver.test.d.ts +1 -0
- package/ComponentResolver.test.js +81 -0
- package/ComponentResolver.test.js.map +1 -0
- package/ConstraintEvaluator.d.ts +36 -0
- package/ConstraintEvaluator.js +288 -0
- package/ConstraintEvaluator.js.map +1 -0
- package/ConstraintEvaluator.test.d.ts +1 -0
- package/ConstraintEvaluator.test.js +1634 -0
- package/ConstraintEvaluator.test.js.map +1 -0
- package/ContentSdk.d.ts +17 -3
- package/ContentSdk.js +113 -90
- package/ContentSdk.js.map +1 -1
- package/DocumentStore.d.ts +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.d.ts +2 -2
- package/EditingSdk.js +92 -124
- package/EditingSdk.js.map +1 -1
- package/ElementFactory.d.ts +2 -3
- package/ElementFactory.js +164 -163
- package/ElementFactory.js.map +1 -1
- package/ElementFactory.objectListDefaults.test.d.ts +1 -0
- package/ElementFactory.objectListDefaults.test.js +423 -0
- package/ElementFactory.objectListDefaults.test.js.map +1 -0
- package/ElementFactory.test.d.ts +1 -0
- package/ElementFactory.test.js +353 -0
- package/ElementFactory.test.js.map +1 -0
- 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 -12
- package/HashObject.js.map +1 -1
- package/HotkeyManager.js +41 -48
- package/HotkeyManager.js.map +1 -1
- package/IBindingsUpdater.js +0 -3
- package/IRedirects.js +0 -3
- package/InheritanceProcessor.d.ts +2 -2
- package/InheritanceProcessor.js +99 -139
- package/InheritanceProcessor.js.map +1 -1
- package/InheritanceProcessor.test.js +178 -178
- package/InheritanceProcessor.test.js.map +1 -1
- package/InheritedValueResolver.d.ts +18 -1
- package/InheritedValueResolver.js +18 -20
- package/InheritedValueResolver.js.map +1 -1
- package/InputBindingsProcessor.d.ts +23 -2
- package/InputBindingsProcessor.js +200 -289
- package/InputBindingsProcessor.js.map +1 -1
- package/InputBindingsProcessorTokens.test.d.ts +1 -0
- package/InputBindingsProcessorTokens.test.js +400 -0
- package/InputBindingsProcessorTokens.test.js.map +1 -0
- package/InputsBindingsProcessor.test.js +334 -313
- package/InputsBindingsProcessor.test.js.map +1 -1
- package/InputsUpdater.d.ts +1 -1
- package/InputsUpdater.js +23 -26
- package/InputsUpdater.js.map +1 -1
- package/LiveSdk.d.ts +2 -2
- package/LiveSdk.js +12 -13
- package/LiveSdk.js.map +1 -1
- package/Logger.d.ts +2 -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.d.ts +4 -3
- package/NullSdk.js +22 -14
- package/NullSdk.js.map +1 -1
- package/PreviewDocument.d.ts +1 -0
- package/PreviewDocument.js +30 -30
- package/PreviewDocument.js.map +1 -1
- package/PreviewSdk.d.ts +4 -3
- package/PreviewSdk.js +19 -17
- package/PreviewSdk.js.map +1 -1
- package/PreviewViewport.d.ts +0 -1
- package/PreviewViewport.js +50 -82
- package/PreviewViewport.js.map +1 -1
- package/README.md +10 -2
- package/ResizeObserver.js +24 -31
- package/ResizeObserver.js.map +1 -1
- package/StylesBindingsProcessor.d.ts +12 -2
- package/StylesBindingsProcessor.js +62 -79
- package/StylesBindingsProcessor.js.map +1 -1
- package/StylesUpdater.d.ts +1 -1
- package/StylesUpdater.js +20 -25
- package/StylesUpdater.js.map +1 -1
- package/Theme.js +30 -32
- package/Theme.js.map +1 -1
- package/ViewportManager.d.ts +2 -0
- package/ViewportManager.js +89 -97
- package/ViewportManager.js.map +1 -1
- package/assertBindingShapes.d.ts +31 -0
- package/assertBindingShapes.js +64 -0
- package/assertBindingShapes.js.map +1 -0
- package/assertBindingShapes.test.d.ts +1 -0
- package/assertBindingShapes.test.js +131 -0
- package/assertBindingShapes.test.js.map +1 -0
- package/asset/deliveryUrl.d.ts +41 -0
- package/asset/deliveryUrl.js +34 -0
- package/asset/deliveryUrl.js.map +1 -0
- package/asset/deliveryUrl.test.d.ts +1 -0
- package/asset/deliveryUrl.test.js +127 -0
- package/asset/deliveryUrl.test.js.map +1 -0
- package/asset/geometry.d.ts +7 -0
- package/asset/geometry.js +10 -0
- package/asset/geometry.js.map +1 -0
- package/asset/imageSrcSet.d.ts +63 -0
- package/asset/imageSrcSet.js +98 -0
- package/asset/imageSrcSet.js.map +1 -0
- package/asset/imageSrcSet.test.d.ts +1 -0
- package/asset/imageSrcSet.test.js +103 -0
- package/asset/imageSrcSet.test.js.map +1 -0
- package/asset/index.d.ts +5 -0
- package/asset/index.js +5 -0
- package/asset/normalize.d.ts +24 -0
- package/asset/normalize.js +106 -0
- package/asset/normalize.js.map +1 -0
- package/asset/normalize.test.d.ts +1 -0
- package/asset/normalize.test.js +263 -0
- package/asset/normalize.test.js.map +1 -0
- package/asset/types.d.ts +2 -0
- package/asset/types.js +0 -0
- package/constants.d.ts +1 -0
- package/constants.js +7 -5
- package/constants.js.map +1 -1
- package/contentEntry/ContentEntryBindingsResolver.d.ts +30 -0
- package/contentEntry/ContentEntryBindingsResolver.js +45 -0
- package/contentEntry/ContentEntryBindingsResolver.js.map +1 -0
- package/contentEntry/ContentEntryCache.d.ts +46 -0
- package/contentEntry/ContentEntryCache.js +50 -0
- package/contentEntry/ContentEntryCache.js.map +1 -0
- package/contentEntry/resolveContentEntry.d.ts +74 -0
- package/contentEntry/resolveContentEntry.js +53 -0
- package/contentEntry/resolveContentEntry.js.map +1 -0
- package/contentEntry/resolveContentEntry.test.d.ts +1 -0
- package/contentEntry/resolveContentEntry.test.js +213 -0
- package/contentEntry/resolveContentEntry.test.js.map +1 -0
- package/createComponent.d.ts +5 -0
- package/createComponent.js +32 -0
- package/createComponent.js.map +1 -0
- package/createElement.js +5 -6
- package/createElement.js.map +1 -1
- package/createInput.d.ts +132 -16
- package/createInput.js +92 -111
- package/createInput.js.map +1 -1
- package/createTheme.js +2 -3
- package/createTheme.js.map +1 -1
- package/dataProviders/ApiClient.d.ts +10 -5
- package/dataProviders/ApiClient.js +40 -49
- package/dataProviders/ApiClient.js.map +1 -1
- package/dataProviders/DefaultDataProvider.d.ts +7 -3
- package/dataProviders/DefaultDataProvider.js +91 -45
- package/dataProviders/DefaultDataProvider.js.map +1 -1
- package/dataProviders/GET_EXPERIMENT_PAUSED.d.ts +1 -0
- package/dataProviders/GET_EXPERIMENT_PAUSED.js +17 -0
- package/dataProviders/GET_EXPERIMENT_PAUSED.js.map +1 -0
- package/dataProviders/GET_PAGE_BY_ID.d.ts +1 -1
- package/dataProviders/GET_PAGE_BY_ID.js +4 -1
- package/dataProviders/GET_PAGE_BY_ID.js.map +1 -1
- package/dataProviders/GET_PAGE_BY_PATH.d.ts +1 -1
- package/dataProviders/GET_PAGE_BY_PATH.js +4 -1
- package/dataProviders/GET_PAGE_BY_PATH.js.map +1 -1
- package/dataProviders/GET_PAGE_EXPERIMENT.d.ts +1 -0
- package/dataProviders/GET_PAGE_EXPERIMENT.js +32 -0
- package/dataProviders/GET_PAGE_EXPERIMENT.js.map +1 -0
- package/dataProviders/GET_VARIANT_CONTENT.d.ts +1 -0
- package/dataProviders/GET_VARIANT_CONTENT.js +24 -0
- package/dataProviders/GET_VARIANT_CONTENT.js.map +1 -0
- package/dataProviders/LIST_PUBLISHED_PAGES.d.ts +1 -1
- package/dataProviders/LIST_PUBLISHED_PAGES.js +17 -5
- package/dataProviders/LIST_PUBLISHED_PAGES.js.map +1 -1
- package/dataProviders/NullDataProvider.d.ts +16 -4
- package/dataProviders/NullDataProvider.js +30 -13
- package/dataProviders/NullDataProvider.js.map +1 -1
- package/dataProviders/RedirectsProvider.js +24 -27
- package/dataProviders/RedirectsProvider.js.map +1 -1
- package/defaultBreakpoints.js +43 -22
- package/defaultBreakpoints.js.map +1 -1
- package/documentOperations/$addElementReferenceToParent.d.ts +1 -1
- package/documentOperations/$addElementReferenceToParent.js +30 -26
- package/documentOperations/$addElementReferenceToParent.js.map +1 -1
- package/documentOperations/AddElement.js +8 -7
- package/documentOperations/AddElement.js.map +1 -1
- package/documentOperations/AddToParent.d.ts +2 -2
- package/documentOperations/AddToParent.js +14 -13
- package/documentOperations/AddToParent.js.map +1 -1
- package/documentOperations/IDocumentOperation.js +0 -3
- package/documentOperations/RemoveElement.js +10 -7
- 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/experiments/PostHogAnalyticsProvider.d.ts +31 -0
- package/experiments/PostHogAnalyticsProvider.js +28 -0
- package/experiments/PostHogAnalyticsProvider.js.map +1 -0
- package/experiments/analyticsProvider.d.ts +4 -0
- package/experiments/analyticsProvider.js +11 -0
- package/experiments/analyticsProvider.js.map +1 -0
- package/experiments/bucketing.d.ts +27 -0
- package/experiments/bucketing.js +91 -0
- package/experiments/bucketing.js.map +1 -0
- package/experiments/bucketing.test.d.ts +1 -0
- package/experiments/bucketing.test.js +183 -0
- package/experiments/bucketing.test.js.map +1 -0
- package/experiments/index.d.ts +5 -0
- package/experiments/index.js +5 -0
- package/experiments/render.d.ts +79 -0
- package/experiments/render.js +149 -0
- package/experiments/render.js.map +1 -0
- package/experiments/types.d.ts +108 -0
- package/experiments/types.js +4 -0
- package/experiments/types.js.map +1 -0
- package/findMatchingAstNode.js +11 -13
- package/findMatchingAstNode.js.map +1 -1
- package/generateElementId.d.ts +1 -1
- package/generateElementId.js +2 -2
- package/generateElementId.js.map +1 -1
- package/headersProvider.js +4 -3
- package/headersProvider.js.map +1 -1
- package/image/geometry.d.ts +54 -0
- package/image/geometry.js +112 -0
- package/image/geometry.js.map +1 -0
- package/image/geometry.test.d.ts +1 -0
- package/image/geometry.test.js +190 -0
- package/image/geometry.test.js.map +1 -0
- package/image/index.d.ts +3 -0
- package/image/index.js +3 -0
- package/image/presets.d.ts +6 -0
- package/image/presets.js +20 -0
- package/image/presets.js.map +1 -0
- package/image/types.d.ts +10 -0
- package/image/types.js +0 -0
- package/index.d.ts +12 -1
- package/index.js +11 -3
- package/jsonPatch.d.ts +1 -1
- 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 +59 -70
- package/messenger/Messenger.js.map +1 -1
- package/messenger/index.js +0 -2
- package/package.json +19 -22
- package/registerComponentGroup.js +5 -6
- package/registerComponentGroup.js.map +1 -1
- package/tokenBinding.d.ts +26 -0
- package/tokenBinding.js +15 -0
- package/tokenBinding.js.map +1 -0
- package/tokenBinding.test.d.ts +1 -0
- package/tokenBinding.test.js +165 -0
- package/tokenBinding.test.js.map +1 -0
- package/types/ShorthandCssProperties.js +0 -3
- package/types/WebsiteBuilderTheme.d.ts +54 -45
- package/types/WebsiteBuilderTheme.js +0 -3
- package/types.d.ts +294 -13
- 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/lexical/createDefaultLexicalTheme.d.ts +0 -2
- package/lexical/createDefaultLexicalTheme.js +0 -84
- package/lexical/createDefaultLexicalTheme.js.map +0 -1
- package/lexical/createLexicalTheme.d.ts +0 -2
- package/lexical/createLexicalTheme.js +0 -7
- package/lexical/createLexicalTheme.js.map +0 -1
- package/lexical/deepMerge.d.ts +0 -1
- package/lexical/deepMerge.js +0 -23
- package/lexical/deepMerge.js.map +0 -1
- package/messenger/index.js.map +0 -1
- package/types/LexicalEditorTheme.d.ts +0 -2
- package/types/LexicalEditorTheme.js +0 -3
- package/types/LexicalEditorTheme.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/StylesUpdater.d.ts
CHANGED
|
@@ -6,5 +6,5 @@ export declare class StylesUpdater implements IBindingsUpdater {
|
|
|
6
6
|
private elementId;
|
|
7
7
|
constructor(elementId: string, bindings: ElementStylesBindings);
|
|
8
8
|
applyToDocument(document: Document): void;
|
|
9
|
-
createJsonPatch(bindings: DocumentElementBindings): import("
|
|
9
|
+
createJsonPatch(bindings: DocumentElementBindings): import("fast-json-patch").Operation[];
|
|
10
10
|
}
|
package/StylesUpdater.js
CHANGED
|
@@ -1,34 +1,29 @@
|
|
|
1
1
|
import { jsonPatch } from "./jsonPatch.js";
|
|
2
2
|
import set from "lodash/set.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
applyToDocument(document) {
|
|
9
|
-
if (this.bindings.styles) {
|
|
10
|
-
document.bindings[this.elementId].styles = this.bindings.styles;
|
|
3
|
+
class StylesUpdater {
|
|
4
|
+
constructor(elementId, bindings){
|
|
5
|
+
this.elementId = elementId;
|
|
6
|
+
this.bindings = bindings;
|
|
11
7
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
if (overrides
|
|
15
|
-
|
|
8
|
+
applyToDocument(document) {
|
|
9
|
+
if (this.bindings.styles) document.bindings[this.elementId].styles = this.bindings.styles;
|
|
10
|
+
if (this.bindings.overrides) {
|
|
11
|
+
for (const [bp, overrides] of Object.entries(this.bindings.overrides))if (overrides.styles) set(document.bindings, `${this.elementId}.overrides.${bp}.styles`, structuredClone(this.bindings.overrides[bp].styles));
|
|
16
12
|
}
|
|
17
|
-
}
|
|
18
13
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
14
|
+
createJsonPatch(bindings) {
|
|
15
|
+
const toCompare = {
|
|
16
|
+
...this.bindings
|
|
17
|
+
};
|
|
18
|
+
if (0 === Object.keys(toCompare.overrides ?? {}).length) delete toCompare.overrides;
|
|
19
|
+
const ignore = [
|
|
20
|
+
"/inputs",
|
|
21
|
+
"/overrides/inputs",
|
|
22
|
+
"/metadata"
|
|
23
|
+
];
|
|
24
|
+
return jsonPatch.compare(bindings, toCompare).filter((op)=>!ignore.some((prefix)=>op.path.startsWith(prefix)));
|
|
26
25
|
}
|
|
27
|
-
const ignore = ["/inputs", "/overrides/inputs", "/metadata"];
|
|
28
|
-
return jsonPatch.compare(bindings, toCompare).filter(op => {
|
|
29
|
-
return !ignore.some(prefix => op.path.startsWith(prefix));
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
26
|
}
|
|
27
|
+
export { StylesUpdater };
|
|
33
28
|
|
|
34
29
|
//# sourceMappingURL=StylesUpdater.js.map
|
package/StylesUpdater.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"StylesUpdater.js","sources":["../src/StylesUpdater.ts"],"sourcesContent":["import { jsonPatch } from \"~/jsonPatch.js\";\nimport set from \"lodash/set.js\";\nimport type { Document, DocumentElementBindings } from \"./types.js\";\nimport type { IBindingsUpdater } from \"./IBindingsUpdater.js\";\nimport type { ElementStylesBindings } from \"./StylesBindingsProcessor.js\";\n\nexport class StylesUpdater implements IBindingsUpdater {\n private readonly bindings: ElementStylesBindings;\n private elementId: string;\n\n constructor(elementId: string, bindings: ElementStylesBindings) {\n this.elementId = elementId;\n this.bindings = bindings;\n }\n\n applyToDocument(document: Document) {\n if (this.bindings.styles) {\n document.bindings[this.elementId].styles = this.bindings.styles;\n }\n\n if (this.bindings.overrides) {\n for (const [bp, overrides] of Object.entries(this.bindings.overrides)) {\n if (overrides.styles) {\n set(\n document.bindings,\n `${this.elementId}.overrides.${bp}.styles`,\n structuredClone(this.bindings.overrides[bp].styles)\n );\n }\n }\n }\n }\n\n createJsonPatch(bindings: DocumentElementBindings) {\n const toCompare: Partial<DocumentElementBindings> = { ...this.bindings };\n if (Object.keys(toCompare.overrides ?? {}).length === 0) {\n delete toCompare.overrides;\n }\n\n const ignore = [\"/inputs\", \"/overrides/inputs\", \"/metadata\"];\n\n return jsonPatch.compare(bindings, toCompare).filter(op => {\n return !ignore.some(prefix => op.path.startsWith(prefix));\n });\n }\n}\n"],"names":["StylesUpdater","elementId","bindings","document","bp","overrides","Object","set","structuredClone","toCompare","ignore","jsonPatch","op","prefix"],"mappings":";;AAMO,MAAMA;IAIT,YAAYC,SAAiB,EAAEC,QAA+B,CAAE;QAC5D,IAAI,CAAC,SAAS,GAAGD;QACjB,IAAI,CAAC,QAAQ,GAAGC;IACpB;IAEA,gBAAgBC,QAAkB,EAAE;QAChC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EACpBA,SAAS,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM;QAGnE,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,EACvB;YAAA,KAAK,MAAM,CAACC,IAAIC,UAAU,IAAIC,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAChE,IAAID,UAAU,MAAM,EAChBE,IACIJ,SAAS,QAAQ,EACjB,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAEC,GAAG,OAAO,CAAC,EAC1CI,gBAAgB,IAAI,CAAC,QAAQ,CAAC,SAAS,CAACJ,GAAG,CAAC,MAAM;QAG9D;IAER;IAEA,gBAAgBF,QAAiC,EAAE;QAC/C,MAAMO,YAA8C;YAAE,GAAG,IAAI,CAAC,QAAQ;QAAC;QACvE,IAAIH,AAAkD,MAAlDA,OAAO,IAAI,CAACG,UAAU,SAAS,IAAI,CAAC,GAAG,MAAM,EAC7C,OAAOA,UAAU,SAAS;QAG9B,MAAMC,SAAS;YAAC;YAAW;YAAqB;SAAY;QAE5D,OAAOC,UAAU,OAAO,CAACT,UAAUO,WAAW,MAAM,CAACG,CAAAA,KAC1C,CAACF,OAAO,IAAI,CAACG,CAAAA,SAAUD,GAAG,IAAI,CAAC,UAAU,CAACC;IAEzD;AACJ"}
|
package/Theme.js
CHANGED
|
@@ -1,36 +1,34 @@
|
|
|
1
|
-
import
|
|
1
|
+
import deepmerge from "deepmerge";
|
|
2
2
|
import { defaultBreakpoints } from "./defaultBreakpoints.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
}
|
|
32
|
-
};
|
|
33
|
-
}
|
|
3
|
+
class Theme {
|
|
4
|
+
static from(input) {
|
|
5
|
+
const { custom = {}, ...builtInOverrides } = input?.breakpoints ?? {};
|
|
6
|
+
const mergedBreakpoints = deepmerge.all([
|
|
7
|
+
{},
|
|
8
|
+
defaultBreakpoints,
|
|
9
|
+
builtInOverrides,
|
|
10
|
+
custom
|
|
11
|
+
]);
|
|
12
|
+
const breakpoints = [];
|
|
13
|
+
Object.entries(mergedBreakpoints ?? {}).forEach(([name, breakpoint])=>{
|
|
14
|
+
breakpoints.push({
|
|
15
|
+
name,
|
|
16
|
+
...breakpoint
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
return {
|
|
20
|
+
css: input.css,
|
|
21
|
+
fonts: input.fonts,
|
|
22
|
+
fontSizes: input.fontSizes,
|
|
23
|
+
breakpoints: breakpoints.sort((a, b)=>b.maxWidth - a.maxWidth),
|
|
24
|
+
colors: input?.colors ?? [],
|
|
25
|
+
typography: {
|
|
26
|
+
...input?.typography
|
|
27
|
+
},
|
|
28
|
+
allowCustomColors: input.allowCustomColors
|
|
29
|
+
};
|
|
30
|
+
}
|
|
34
31
|
}
|
|
32
|
+
export { Theme };
|
|
35
33
|
|
|
36
34
|
//# sourceMappingURL=Theme.js.map
|
package/Theme.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"Theme.js","sources":["../src/Theme.ts"],"sourcesContent":["import deepMerge from \"deepmerge\";\nimport type {\n Breakpoint,\n WebsiteBuilderTheme,\n WebsiteBuilderThemeInput\n} from \"~/types/WebsiteBuilderTheme.js\";\nimport { defaultBreakpoints } from \"~/defaultBreakpoints.js\";\n\nexport class Theme {\n static from(input: WebsiteBuilderThemeInput): WebsiteBuilderTheme {\n const { custom = {}, ...builtInOverrides } = input?.breakpoints ?? {};\n\n const mergedBreakpoints = deepMerge.all([\n {},\n defaultBreakpoints,\n builtInOverrides,\n custom\n ]) as WebsiteBuilderThemeInput[\"breakpoints\"];\n\n const breakpoints: Breakpoint[] = [];\n Object.entries(mergedBreakpoints ?? {}).forEach(([name, breakpoint]) => {\n breakpoints.push({\n name,\n ...(breakpoint as Omit<Breakpoint, \"name\">)\n });\n });\n\n return {\n css: input.css,\n fonts: input.fonts,\n fontSizes: input.fontSizes,\n breakpoints: breakpoints.sort((a, b) => b.maxWidth - a.maxWidth),\n colors: input?.colors ?? [],\n typography: {\n ...input?.typography\n },\n allowCustomColors: input.allowCustomColors\n };\n }\n}\n"],"names":["Theme","input","custom","builtInOverrides","mergedBreakpoints","deepMerge","defaultBreakpoints","breakpoints","Object","name","breakpoint","a","b"],"mappings":";;AAQO,MAAMA;IACT,OAAO,KAAKC,KAA+B,EAAuB;QAC9D,MAAM,EAAEC,SAAS,CAAC,CAAC,EAAE,GAAGC,kBAAkB,GAAGF,OAAO,eAAe,CAAC;QAEpE,MAAMG,oBAAoBC,UAAAA,GAAa,CAAC;YACpC,CAAC;YACDC;YACAH;YACAD;SACH;QAED,MAAMK,cAA4B,EAAE;QACpCC,OAAO,OAAO,CAACJ,qBAAqB,CAAC,GAAG,OAAO,CAAC,CAAC,CAACK,MAAMC,WAAW;YAC/DH,YAAY,IAAI,CAAC;gBACbE;gBACA,GAAIC,UAAU;YAClB;QACJ;QAEA,OAAO;YACH,KAAKT,MAAM,GAAG;YACd,OAAOA,MAAM,KAAK;YAClB,WAAWA,MAAM,SAAS;YAC1B,aAAaM,YAAY,IAAI,CAAC,CAACI,GAAGC,IAAMA,EAAE,QAAQ,GAAGD,EAAE,QAAQ;YAC/D,QAAQV,OAAO,UAAU,EAAE;YAC3B,YAAY;gBACR,GAAGA,OAAO,UAAU;YACxB;YACA,mBAAmBA,MAAM,iBAAiB;QAC9C;IACJ;AACJ"}
|
package/ViewportManager.d.ts
CHANGED
package/ViewportManager.js
CHANGED
|
@@ -1,106 +1,98 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
|
|
3
2
|
import { environment } from "./Environment.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
passive: true
|
|
27
|
-
});
|
|
3
|
+
class ViewportManager {
|
|
4
|
+
constructor(timeout = 150){
|
|
5
|
+
this.breakpoints = [
|
|
6
|
+
{
|
|
7
|
+
name: "desktop",
|
|
8
|
+
title: "",
|
|
9
|
+
description: "",
|
|
10
|
+
icon: "",
|
|
11
|
+
minWidth: 0,
|
|
12
|
+
maxWidth: 4000
|
|
13
|
+
}
|
|
14
|
+
];
|
|
15
|
+
this.changeTimeout = timeout;
|
|
16
|
+
this.changeStartSubscribers = new Set();
|
|
17
|
+
this.changeEndSubscribers = new Set();
|
|
18
|
+
this.isChanging = false;
|
|
19
|
+
this.changeTimer = null;
|
|
20
|
+
this.handleViewportChange = this.handleViewportChange.bind(this);
|
|
21
|
+
this.handleResize = this.handleResize.bind(this);
|
|
22
|
+
if (environment.isClient()) window.addEventListener("resize", this.handleResize, {
|
|
23
|
+
passive: true
|
|
24
|
+
});
|
|
28
25
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
26
|
+
setBreakpoints(breakpoints) {
|
|
27
|
+
this.breakpoints = breakpoints;
|
|
28
|
+
}
|
|
29
|
+
onViewportChangeStart(callback) {
|
|
30
|
+
this.changeStartSubscribers.add(callback);
|
|
31
|
+
return ()=>this.changeStartSubscribers.delete(callback);
|
|
32
|
+
}
|
|
33
|
+
onViewportChangeEnd(callback) {
|
|
34
|
+
this.changeEndSubscribers.add(callback);
|
|
35
|
+
return ()=>this.changeEndSubscribers.delete(callback);
|
|
36
|
+
}
|
|
37
|
+
getViewport() {
|
|
38
|
+
return this.getViewportInfo();
|
|
39
|
+
}
|
|
40
|
+
destroy() {
|
|
41
|
+
if (environment.isClient()) {
|
|
42
|
+
window.removeEventListener("resize", this.handleResize);
|
|
43
|
+
if (null !== this.changeTimer) clearTimeout(this.changeTimer);
|
|
44
|
+
this.changeStartSubscribers.clear();
|
|
45
|
+
this.changeEndSubscribers.clear();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
handleResize() {
|
|
49
|
+
this.handleViewportChange();
|
|
50
|
+
}
|
|
51
|
+
handleViewportChange() {
|
|
52
|
+
const viewportInfo = this.getViewportInfo();
|
|
53
|
+
if (!this.isChanging) {
|
|
54
|
+
this.isChanging = true;
|
|
55
|
+
this.notifySubscribers(this.changeStartSubscribers, viewportInfo);
|
|
56
|
+
}
|
|
57
|
+
if (null !== this.changeTimer) clearTimeout(this.changeTimer);
|
|
58
|
+
this.changeTimer = window.setTimeout(()=>{
|
|
59
|
+
this.isChanging = false;
|
|
60
|
+
this.notifySubscribers(this.changeEndSubscribers, viewportInfo);
|
|
61
|
+
}, this.changeTimeout);
|
|
56
62
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
63
|
+
getViewportInfo() {
|
|
64
|
+
const modes = [
|
|
65
|
+
...this.breakpoints
|
|
66
|
+
].reverse();
|
|
67
|
+
const viewport = environment.isClient() ? {
|
|
68
|
+
width: window.innerWidth,
|
|
69
|
+
height: window.innerHeight,
|
|
70
|
+
scrollWidth: window.document.body.scrollWidth,
|
|
71
|
+
scrollHeight: window.document.body.scrollHeight,
|
|
72
|
+
scrollX: window.scrollX,
|
|
73
|
+
scrollY: window.scrollY
|
|
74
|
+
} : {
|
|
75
|
+
height: 0,
|
|
76
|
+
width: 2000,
|
|
77
|
+
scrollHeight: 0,
|
|
78
|
+
scrollWidth: 2000,
|
|
79
|
+
scrollX: 0,
|
|
80
|
+
scrollY: 0
|
|
81
|
+
};
|
|
82
|
+
const [breakpoint] = modes.filter((mode)=>mode.maxWidth >= viewport.width);
|
|
83
|
+
return {
|
|
84
|
+
...viewport,
|
|
85
|
+
breakpoint: breakpoint.name,
|
|
86
|
+
breakpoints: this.breakpoints
|
|
87
|
+
};
|
|
66
88
|
}
|
|
67
|
-
|
|
68
|
-
|
|
89
|
+
notifySubscribers(subscribers, viewportInfo) {
|
|
90
|
+
subscribers.forEach((callback)=>{
|
|
91
|
+
if ("function" == typeof callback) callback(viewportInfo);
|
|
92
|
+
});
|
|
69
93
|
}
|
|
70
|
-
this.changeTimer = window.setTimeout(() => {
|
|
71
|
-
this.isChanging = false;
|
|
72
|
-
this.notifySubscribers(this.changeEndSubscribers, viewportInfo);
|
|
73
|
-
}, this.changeTimeout);
|
|
74
|
-
}
|
|
75
|
-
getViewportInfo() {
|
|
76
|
-
const modes = [...this.breakpoints].reverse();
|
|
77
|
-
const viewport = environment.isClient() ? {
|
|
78
|
-
width: window.innerWidth,
|
|
79
|
-
height: window.innerHeight,
|
|
80
|
-
scrollX: window.scrollX,
|
|
81
|
-
scrollY: window.scrollY
|
|
82
|
-
} : {
|
|
83
|
-
// During SSR or Next.js build, viewport is not available.
|
|
84
|
-
height: 0,
|
|
85
|
-
width: 2000,
|
|
86
|
-
scrollX: 0,
|
|
87
|
-
scrollY: 0
|
|
88
|
-
};
|
|
89
|
-
const [breakpoint] = modes.filter(mode => mode.maxWidth >= viewport.width);
|
|
90
|
-
return {
|
|
91
|
-
...viewport,
|
|
92
|
-
breakpoint: breakpoint.name,
|
|
93
|
-
breakpoints: this.breakpoints
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
notifySubscribers(subscribers, viewportInfo) {
|
|
97
|
-
subscribers.forEach(callback => {
|
|
98
|
-
if (typeof callback === "function") {
|
|
99
|
-
callback(viewportInfo);
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
94
|
}
|
|
104
|
-
|
|
95
|
+
const viewportManager = new ViewportManager();
|
|
96
|
+
export { ViewportManager, viewportManager };
|
|
105
97
|
|
|
106
98
|
//# sourceMappingURL=ViewportManager.js.map
|
package/ViewportManager.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"ViewportManager.js","sources":["../src/ViewportManager.ts"],"sourcesContent":["\"use client\";\nimport type { Breakpoint } from \"~/types.js\";\nimport { environment } from \"~/Environment.js\";\n\nexport interface ViewportInfo {\n width: number;\n height: number;\n scrollWidth: number;\n scrollHeight: number;\n scrollX: number;\n scrollY: number;\n breakpoint: string;\n breakpoints: Breakpoint[];\n}\n\nexport class ViewportManager {\n private readonly changeTimeout: number;\n private readonly changeStartSubscribers: Set<(info: ViewportInfo) => void>;\n private readonly changeEndSubscribers: Set<(info: ViewportInfo) => void>;\n private isChanging: boolean;\n private changeTimer: number | null;\n\n /**\n * We need this fallback breakpoint for server environments.\n */\n private breakpoints: Breakpoint[] = [\n {\n name: \"desktop\",\n title: \"\",\n description: \"\",\n icon: \"\",\n minWidth: 0,\n maxWidth: 4000\n }\n ];\n\n constructor(timeout: number = 150) {\n this.changeTimeout = timeout;\n this.changeStartSubscribers = new Set();\n this.changeEndSubscribers = new Set();\n this.isChanging = false;\n this.changeTimer = null;\n\n this.handleViewportChange = this.handleViewportChange.bind(this);\n this.handleResize = this.handleResize.bind(this);\n\n if (environment.isClient()) {\n window.addEventListener(\"resize\", this.handleResize, { passive: true });\n }\n }\n\n public setBreakpoints(breakpoints: Breakpoint[]) {\n this.breakpoints = breakpoints;\n }\n\n public onViewportChangeStart(callback: (info: ViewportInfo) => void): () => void {\n this.changeStartSubscribers.add(callback);\n return () => this.changeStartSubscribers.delete(callback);\n }\n\n public onViewportChangeEnd(callback: (info: ViewportInfo) => void): () => void {\n this.changeEndSubscribers.add(callback);\n return () => this.changeEndSubscribers.delete(callback);\n }\n\n /**\n * Get the current viewport information\n */\n public getViewport(): ViewportInfo {\n return this.getViewportInfo();\n }\n\n public destroy(): void {\n if (environment.isClient()) {\n window.removeEventListener(\"resize\", this.handleResize);\n if (this.changeTimer !== null) {\n clearTimeout(this.changeTimer);\n }\n this.changeStartSubscribers.clear();\n this.changeEndSubscribers.clear();\n }\n }\n\n private handleResize(): void {\n this.handleViewportChange();\n }\n\n private handleViewportChange(): void {\n const viewportInfo = this.getViewportInfo();\n\n if (!this.isChanging) {\n this.isChanging = true;\n this.notifySubscribers(this.changeStartSubscribers, viewportInfo);\n }\n\n if (this.changeTimer !== null) {\n clearTimeout(this.changeTimer);\n }\n\n this.changeTimer = window.setTimeout(() => {\n this.isChanging = false;\n this.notifySubscribers(this.changeEndSubscribers, viewportInfo);\n }, this.changeTimeout);\n }\n\n private getViewportInfo(): ViewportInfo {\n const modes = [...this.breakpoints].reverse();\n const viewport = environment.isClient()\n ? {\n width: window.innerWidth,\n height: window.innerHeight,\n scrollWidth: window.document.body.scrollWidth,\n scrollHeight: window.document.body.scrollHeight,\n scrollX: window.scrollX,\n scrollY: window.scrollY\n }\n : {\n // During SSR or Next.js build, viewport is not available.\n height: 0,\n width: 2000,\n scrollHeight: 0,\n scrollWidth: 2000,\n scrollX: 0,\n scrollY: 0\n };\n\n const [breakpoint] = modes.filter(mode => mode.maxWidth >= viewport.width);\n\n return { ...viewport, breakpoint: breakpoint.name, breakpoints: this.breakpoints };\n }\n\n private notifySubscribers(\n subscribers: Set<(info: ViewportInfo) => void>,\n viewportInfo: ViewportInfo\n ): void {\n subscribers.forEach(callback => {\n if (typeof callback === \"function\") {\n callback(viewportInfo);\n }\n });\n }\n}\n\nexport const viewportManager = new ViewportManager();\n"],"names":["ViewportManager","timeout","Set","environment","window","breakpoints","callback","clearTimeout","viewportInfo","modes","viewport","breakpoint","mode","subscribers","viewportManager"],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { DocumentElementBindings } from "./types.js";
|
|
2
|
+
import type { InputAstNode } from "./ComponentManifestToAstConverter.js";
|
|
3
|
+
/**
|
|
4
|
+
* A binding whose value does not match the shape its input declares.
|
|
5
|
+
*/
|
|
6
|
+
export interface BindingShapeViolation {
|
|
7
|
+
path: string;
|
|
8
|
+
/** What the input declares. */
|
|
9
|
+
declared: "list" | "scalar";
|
|
10
|
+
/** What the binding holds. */
|
|
11
|
+
found: "list" | "scalar";
|
|
12
|
+
value: unknown;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Checks a built element's bindings against the shapes its inputs declare.
|
|
16
|
+
*
|
|
17
|
+
* **Deliberately on the BINDINGS, not on the inputs handed to the factory.** A check on the inputs
|
|
18
|
+
* covers only the shapes that intermediate happens to carry, and the defect this exists for lived
|
|
19
|
+
* entirely downstream of it: the composition passed a correct array, and the traverser collapsed it
|
|
20
|
+
* to its last item while writing the bindings. An input-level check passed on all 34 occurrences
|
|
21
|
+
* while every one of those pages was failing to render. `stripInventedBindings` in the composition
|
|
22
|
+
* pipeline learned the same thing about invented destinations and says so in its own comment; this is
|
|
23
|
+
* that lesson paid for a second time.
|
|
24
|
+
*
|
|
25
|
+
* **READ THIS WITH the list tolerance in `BindingsResolver`, and do not remove one without the
|
|
26
|
+
* other.** This is the alarm: it fires where the bad write happens, so a writer that regresses is
|
|
27
|
+
* found rather than absorbed. The tolerance there is the recovery for documents already stored. Keep
|
|
28
|
+
* only the tolerance and a broken writer lives indefinitely, because nothing downstream ever looks
|
|
29
|
+
* wrong; keep only the alarm and every already-stored page stays broken.
|
|
30
|
+
*/
|
|
31
|
+
export declare const assertBindingShapes: (bindings: DocumentElementBindings, inputAst: InputAstNode[]) => BindingShapeViolation[];
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
const assertBindingShapes = (bindings, inputAst)=>{
|
|
2
|
+
const violations = [];
|
|
3
|
+
const inputs = bindings?.inputs ?? {};
|
|
4
|
+
const check = (nodes, prefix)=>{
|
|
5
|
+
for (const node of nodes){
|
|
6
|
+
const path = [
|
|
7
|
+
...prefix,
|
|
8
|
+
node.name
|
|
9
|
+
].join("/");
|
|
10
|
+
if (node.children.length > 0) {
|
|
11
|
+
if (node.list) {
|
|
12
|
+
for (const index of indexesUnder(path, inputs))check(node.children, [
|
|
13
|
+
...prefix,
|
|
14
|
+
`${node.name}/${index}`
|
|
15
|
+
]);
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
check(node.children, [
|
|
19
|
+
...prefix,
|
|
20
|
+
node.name
|
|
21
|
+
]);
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
if (node.list) {
|
|
25
|
+
if (indexesUnder(path, inputs).length > 0) continue;
|
|
26
|
+
const binding = inputs[path];
|
|
27
|
+
if (!binding || !("static" in binding)) continue;
|
|
28
|
+
const value = binding.static;
|
|
29
|
+
if (null == value || Array.isArray(value)) continue;
|
|
30
|
+
violations.push({
|
|
31
|
+
path,
|
|
32
|
+
declared: "list",
|
|
33
|
+
found: "scalar",
|
|
34
|
+
value
|
|
35
|
+
});
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
const binding = inputs[path];
|
|
39
|
+
if (binding && "static" in binding && Array.isArray(binding.static)) violations.push({
|
|
40
|
+
path,
|
|
41
|
+
declared: "scalar",
|
|
42
|
+
found: "list",
|
|
43
|
+
value: binding.static
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
check(inputAst, []);
|
|
48
|
+
return violations;
|
|
49
|
+
};
|
|
50
|
+
const indexesUnder = (path, inputs)=>{
|
|
51
|
+
const seen = new Set();
|
|
52
|
+
const prefix = `${path}/`;
|
|
53
|
+
for (const key of Object.keys(inputs)){
|
|
54
|
+
if (!key.startsWith(prefix)) continue;
|
|
55
|
+
const index = Number.parseInt(key.slice(prefix.length).split("/")[0], 10);
|
|
56
|
+
if (Number.isInteger(index)) seen.add(index);
|
|
57
|
+
}
|
|
58
|
+
return [
|
|
59
|
+
...seen
|
|
60
|
+
].sort((a, b)=>a - b);
|
|
61
|
+
};
|
|
62
|
+
export { assertBindingShapes };
|
|
63
|
+
|
|
64
|
+
//# sourceMappingURL=assertBindingShapes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertBindingShapes.js","sources":["../src/assertBindingShapes.ts"],"sourcesContent":["import type { DocumentElementBindings } from \"./types.js\";\nimport type { InputAstNode } from \"./ComponentManifestToAstConverter.js\";\n\n/**\n * A binding whose value does not match the shape its input declares.\n */\nexport interface BindingShapeViolation {\n path: string;\n /** What the input declares. */\n declared: \"list\" | \"scalar\";\n /** What the binding holds. */\n found: \"list\" | \"scalar\";\n value: unknown;\n}\n\n/**\n * Checks a built element's bindings against the shapes its inputs declare.\n *\n * **Deliberately on the BINDINGS, not on the inputs handed to the factory.** A check on the inputs\n * covers only the shapes that intermediate happens to carry, and the defect this exists for lived\n * entirely downstream of it: the composition passed a correct array, and the traverser collapsed it\n * to its last item while writing the bindings. An input-level check passed on all 34 occurrences\n * while every one of those pages was failing to render. `stripInventedBindings` in the composition\n * pipeline learned the same thing about invented destinations and says so in its own comment; this is\n * that lesson paid for a second time.\n *\n * **READ THIS WITH the list tolerance in `BindingsResolver`, and do not remove one without the\n * other.** This is the alarm: it fires where the bad write happens, so a writer that regresses is\n * found rather than absorbed. The tolerance there is the recovery for documents already stored. Keep\n * only the tolerance and a broken writer lives indefinitely, because nothing downstream ever looks\n * wrong; keep only the alarm and every already-stored page stays broken.\n */\nexport const assertBindingShapes = (\n bindings: DocumentElementBindings,\n inputAst: InputAstNode[]\n): BindingShapeViolation[] => {\n const violations: BindingShapeViolation[] = [];\n const inputs = bindings?.inputs ?? {};\n\n const check = (nodes: InputAstNode[], prefix: string[]): void => {\n for (const node of nodes) {\n const path = [...prefix, node.name].join(\"/\");\n\n if (node.children.length > 0) {\n // An object list is stored element-wise (`rows/0/label`), so its own path holds no\n // value to check; its children are checked under each index that exists.\n if (node.list) {\n for (const index of indexesUnder(path, inputs)) {\n check(node.children, [...prefix, `${node.name}/${index}`]);\n }\n continue;\n }\n check(node.children, [...prefix, node.name]);\n continue;\n }\n\n if (node.list) {\n /*\n * A scalar list is correct in either of two stored shapes: element-wise `name/0`,\n * `name/1`, … or a single binding holding an array. Both are what the resolver reads.\n * A single binding holding a scalar is the broken one.\n */\n if (indexesUnder(path, inputs).length > 0) {\n continue;\n }\n const binding = inputs[path];\n if (!binding || !(\"static\" in binding)) {\n continue;\n }\n const value = binding.static;\n if (value === undefined || value === null || Array.isArray(value)) {\n continue;\n }\n violations.push({ path, declared: \"list\", found: \"scalar\", value });\n continue;\n }\n\n const binding = inputs[path];\n if (binding && \"static\" in binding && Array.isArray(binding.static)) {\n violations.push({ path, declared: \"scalar\", found: \"list\", value: binding.static });\n }\n }\n };\n\n check(inputAst, []);\n return violations;\n};\n\n/** The indexes stored under a list path, from `name/0`, `name/1`, … */\nconst indexesUnder = (path: string, inputs: Record<string, unknown>): number[] => {\n const seen = new Set<number>();\n const prefix = `${path}/`;\n for (const key of Object.keys(inputs)) {\n if (!key.startsWith(prefix)) {\n continue;\n }\n const index = Number.parseInt(key.slice(prefix.length).split(\"/\")[0], 10);\n if (Number.isInteger(index)) {\n seen.add(index);\n }\n }\n return [...seen].sort((a, b) => a - b);\n};\n"],"names":["assertBindingShapes","bindings","inputAst","violations","inputs","check","nodes","prefix","node","path","index","indexesUnder","binding","value","Array","seen","Set","key","Object","Number","a","b"],"mappings":"AAgCO,MAAMA,sBAAsB,CAC/BC,UACAC;IAEA,MAAMC,aAAsC,EAAE;IAC9C,MAAMC,SAASH,UAAU,UAAU,CAAC;IAEpC,MAAMI,QAAQ,CAACC,OAAuBC;QAClC,KAAK,MAAMC,QAAQF,MAAO;YACtB,MAAMG,OAAO;mBAAIF;gBAAQC,KAAK,IAAI;aAAC,CAAC,IAAI,CAAC;YAEzC,IAAIA,KAAK,QAAQ,CAAC,MAAM,GAAG,GAAG;gBAG1B,IAAIA,KAAK,IAAI,EAAE;oBACX,KAAK,MAAME,SAASC,aAAaF,MAAML,QACnCC,MAAMG,KAAK,QAAQ,EAAE;2BAAID;wBAAQ,GAAGC,KAAK,IAAI,CAAC,CAAC,EAAEE,OAAO;qBAAC;oBAE7D;gBACJ;gBACAL,MAAMG,KAAK,QAAQ,EAAE;uBAAID;oBAAQC,KAAK,IAAI;iBAAC;gBAC3C;YACJ;YAEA,IAAIA,KAAK,IAAI,EAAE;gBAMX,IAAIG,aAAaF,MAAML,QAAQ,MAAM,GAAG,GACpC;gBAEJ,MAAMQ,UAAUR,MAAM,CAACK,KAAK;gBAC5B,IAAI,CAACG,WAAW,CAAE,aAAYA,OAAM,GAChC;gBAEJ,MAAMC,QAAQD,QAAQ,MAAM;gBAC5B,IAAIC,QAAAA,SAAyCC,MAAM,OAAO,CAACD,QACvD;gBAEJV,WAAW,IAAI,CAAC;oBAAEM;oBAAM,UAAU;oBAAQ,OAAO;oBAAUI;gBAAM;gBACjE;YACJ;YAEA,MAAMD,UAAUR,MAAM,CAACK,KAAK;YAC5B,IAAIG,WAAW,YAAYA,WAAWE,MAAM,OAAO,CAACF,QAAQ,MAAM,GAC9DT,WAAW,IAAI,CAAC;gBAAEM;gBAAM,UAAU;gBAAU,OAAO;gBAAQ,OAAOG,QAAQ,MAAM;YAAC;QAEzF;IACJ;IAEAP,MAAMH,UAAU,EAAE;IAClB,OAAOC;AACX;AAGA,MAAMQ,eAAe,CAACF,MAAcL;IAChC,MAAMW,OAAO,IAAIC;IACjB,MAAMT,SAAS,GAAGE,KAAK,CAAC,CAAC;IACzB,KAAK,MAAMQ,OAAOC,OAAO,IAAI,CAACd,QAAS;QACnC,IAAI,CAACa,IAAI,UAAU,CAACV,SAChB;QAEJ,MAAMG,QAAQS,OAAO,QAAQ,CAACF,IAAI,KAAK,CAACV,OAAO,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE;QACtE,IAAIY,OAAO,SAAS,CAACT,QACjBK,KAAK,GAAG,CAACL;IAEjB;IACA,OAAO;WAAIK;KAAK,CAAC,IAAI,CAAC,CAACK,GAAGC,IAAMD,IAAIC;AACxC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|