@webiny/website-builder-sdk 6.3.0 → 6.4.0-beta.1
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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["describe","it","expect","ElementFactory","DocumentOperations","components","name","label","tags","inputs","type","list","renderer","defaultValue","fields","serializeOp","op","AddElement","element","AddToParent","index","SetGlobalInputBinding","elementId","bindingPath","binding","SetGlobalStyleBinding","factory","result","createElementFromComponent","componentName","parentId","slot","bindings","activeStep","steps","action","params","component","children","ops","operations","map","funnelId","id","toBe","static","step1Id","parent","toEqual","toBeUndefined","toHaveLength","document","state","elements","root","apply","stepElements","Object","values","filter","el","labels","toContain","stepsBinding","step1","find","step2"],"sources":["ElementFactory.test.ts"],"sourcesContent":["import { describe, it, expect } from \"vitest\";\nimport { ElementFactory } from \"./ElementFactory.js\";\nimport { DocumentOperations } from \"./documentOperations/index.js\";\nimport type { ComponentManifest, Document } from \"~/types.js\";\n\nconst components: Record<string, ComponentManifest> = {\n \"Webiny/Root\": {\n name: \"Webiny/Root\",\n label: \"Main Content\",\n tags: [],\n inputs: [\n {\n type: \"slot\",\n list: true,\n renderer: \"Webiny/Slot\",\n defaultValue: [],\n name: \"children\"\n }\n ]\n },\n \"FunnelBuilder/Funnel\": {\n name: \"FunnelBuilder/Funnel\",\n label: \"Funnel\",\n tags: [],\n inputs: [\n {\n type: \"object\",\n renderer: \"Webiny/Object\",\n name: \"fields\",\n list: true,\n fields: [],\n defaultValue: []\n },\n {\n type: \"number\",\n renderer: \"Webiny/Number\",\n name: \"activeStep\",\n label: \"Active Step\",\n defaultValue: 0\n },\n {\n type: \"slot\",\n list: true,\n renderer: \"Webiny/Slot\",\n defaultValue: [],\n name: \"steps\"\n },\n {\n type: \"object\",\n renderer: \"FunnelBuilder/ConditionRulesRenderer\",\n name: \"conditionRules\",\n list: true,\n fields: []\n }\n ]\n },\n \"FunnelBuilder/Step\": {\n name: \"FunnelBuilder/Step\",\n label: \"Funnel Step\",\n tags: [],\n inputs: [\n {\n type: \"text\",\n renderer: \"Webiny/Input\",\n name: \"label\",\n label: \"Label\"\n },\n {\n type: \"slot\",\n list: true,\n renderer: \"Webiny/Slot\",\n defaultValue: [],\n name: \"children\"\n }\n ]\n }\n};\n\n/**\n * Extract private fields from operation instances for assertion.\n */\nfunction serializeOp(op: any) {\n if (op instanceof DocumentOperations.AddElement) {\n return { type: \"AddElement\", element: op[\"element\"] };\n }\n if (op instanceof DocumentOperations.AddToParent) {\n return { type: \"AddToParent\", element: op[\"element\"], index: op[\"index\"] };\n }\n if (op instanceof DocumentOperations.SetGlobalInputBinding) {\n return {\n type: \"SetGlobalInputBinding\",\n elementId: op[\"elementId\"],\n bindingPath: op[\"bindingPath\"],\n binding: op[\"binding\"]\n };\n }\n if (op instanceof DocumentOperations.SetGlobalStyleBinding) {\n return {\n type: \"SetGlobalStyleBinding\",\n elementId: op[\"elementId\"],\n bindingPath: op[\"bindingPath\"],\n binding: op[\"binding\"]\n };\n }\n return op;\n}\n\ndescribe(\"ElementFactory\", () => {\n it(\"should produce correct operation sequence for a Funnel with two Steps\", () => {\n const factory = new ElementFactory(components);\n const result = factory.createElementFromComponent({\n componentName: \"FunnelBuilder/Funnel\",\n parentId: \"root\",\n slot: \"children\",\n index: 0,\n bindings: {\n inputs: {\n fields: [],\n activeStep: 0,\n steps: [\n {\n action: \"CreateElement\",\n params: {\n component: \"FunnelBuilder/Step\",\n inputs: { label: \"Step 1\", children: [] }\n }\n },\n {\n action: \"CreateElement\",\n params: {\n component: \"FunnelBuilder/Step\",\n inputs: { label: \"Final Step\", children: [] }\n }\n }\n ]\n }\n }\n });\n\n const ops = result.operations.map(serializeOp);\n const funnelId = result.element.id;\n\n // 0: AddElement — Funnel\n expect(ops[0].type).toBe(\"AddElement\");\n expect(ops[0].element.component.name).toBe(\"FunnelBuilder/Funnel\");\n\n // 1: AddToParent — Funnel → root/children at index 0\n expect(ops[1].type).toBe(\"AddToParent\");\n expect(ops[1].element.id).toBe(funnelId);\n expect(ops[1].index).toBe(0);\n\n // 2: SetGlobalInputBinding — activeStep = 0\n expect(ops[2].type).toBe(\"SetGlobalInputBinding\");\n expect(ops[2].elementId).toBe(funnelId);\n expect(ops[2].bindingPath).toBe(\"activeStep\");\n expect(ops[2].binding.static).toBe(0);\n\n // 3: AddElement — Step 1\n const step1Id = ops[3].element.id;\n expect(ops[3].type).toBe(\"AddElement\");\n expect(ops[3].element.component.name).toBe(\"FunnelBuilder/Step\");\n expect(ops[3].element.parent).toEqual({ id: funnelId, slot: \"steps\" });\n\n // 4: AddToParent — Step 1 (undefined = append)\n expect(ops[4].type).toBe(\"AddToParent\");\n expect(ops[4].element.id).toBe(step1Id);\n expect(ops[4].index).toBeUndefined();\n\n // 5: Step 1 label binding\n expect(ops[5].bindingPath).toBe(\"label\");\n expect(ops[5].binding.static).toBe(\"Step 1\");\n\n // 6: Step 1 children binding\n expect(ops[6].bindingPath).toBe(\"children\");\n expect(ops[6].binding.static).toEqual([]);\n\n // 7-8: Step 1 style bindings\n expect(ops[7].bindingPath).toBe(\"display\");\n expect(ops[8].bindingPath).toBe(\"flexDirection\");\n\n // 9: SetGlobalInputBinding — steps slot metadata (no static, AddToParent handles it)\n expect(ops[9].type).toBe(\"SetGlobalInputBinding\");\n expect(ops[9].elementId).toBe(funnelId);\n expect(ops[9].bindingPath).toBe(\"steps\");\n expect(ops[9].binding.static).toBeUndefined();\n expect(ops[9].binding.type).toBe(\"slot\");\n expect(ops[9].binding.list).toBe(true);\n\n // 10: AddElement — Step 2\n expect(ops[10].element.component.name).toBe(\"FunnelBuilder/Step\");\n\n // 11: AddToParent — Step 2 (undefined = append)\n expect(ops[11].index).toBeUndefined();\n\n // 12-15: Step 2 bindings + styles\n expect(ops[12].binding.static).toBe(\"Final Step\");\n expect(ops[13].binding.static).toEqual([]);\n\n // 16: SetGlobalInputBinding — steps slot metadata (no static)\n expect(ops[16].type).toBe(\"SetGlobalInputBinding\");\n expect(ops[16].elementId).toBe(funnelId);\n expect(ops[16].bindingPath).toBe(\"steps\");\n expect(ops[16].binding.static).toBeUndefined();\n\n // 17-18: Funnel style bindings\n expect(ops[17].bindingPath).toBe(\"display\");\n expect(ops[18].bindingPath).toBe(\"flexDirection\");\n\n expect(ops).toHaveLength(19);\n });\n\n it(\"should produce correct document after applying all operations\", () => {\n const factory = new ElementFactory(components);\n const result = factory.createElementFromComponent({\n componentName: \"FunnelBuilder/Funnel\",\n parentId: \"root\",\n slot: \"children\",\n index: 0,\n bindings: {\n inputs: {\n fields: [],\n activeStep: 0,\n steps: [\n {\n action: \"CreateElement\",\n params: {\n component: \"FunnelBuilder/Step\",\n inputs: { label: \"Step 1\", children: [] }\n }\n },\n {\n action: \"CreateElement\",\n params: {\n component: \"FunnelBuilder/Step\",\n inputs: { label: \"Final Step\", children: [] }\n }\n }\n ]\n }\n }\n });\n\n const document = {\n state: {},\n elements: {\n root: {\n type: \"Webiny/Element\",\n id: \"root\",\n component: { name: \"Webiny/Root\" }\n }\n },\n bindings: {}\n } as unknown as Document;\n\n for (const op of result.operations) {\n op.apply(document);\n }\n\n const funnelId = result.element.id;\n\n // Both step elements exist in the document.\n const stepElements = Object.values(document.elements).filter(\n el => el.component.name === \"FunnelBuilder/Step\"\n );\n expect(stepElements).toHaveLength(2);\n\n // Both steps have their correct labels.\n const labels = stepElements.map(el => document.bindings[el.id]?.inputs?.label?.static);\n expect(labels).toContain(\"Step 1\");\n expect(labels).toContain(\"Final Step\");\n\n // The steps binding contains both step IDs in order.\n const stepsBinding = document.bindings[funnelId]?.inputs?.steps;\n expect(stepsBinding?.list).toBe(true);\n expect(stepsBinding?.type).toBe(\"slot\");\n expect(stepsBinding?.static).toHaveLength(2);\n\n const step1 = stepElements.find(\n el => document.bindings[el.id]?.inputs?.label?.static === \"Step 1\"\n )!;\n const step2 = stepElements.find(\n el => document.bindings[el.id]?.inputs?.label?.static === \"Final Step\"\n )!;\n expect(stepsBinding?.static).toEqual([step1.id, step2.id]);\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"ElementFactory.test.js","sources":["../src/ElementFactory.test.ts"],"sourcesContent":["import { describe, it, expect } from \"vitest\";\nimport { ElementFactory } from \"./ElementFactory.js\";\nimport { DocumentOperations } from \"./documentOperations/index.js\";\nimport type { ComponentManifest, Document } from \"~/types.js\";\n\nconst components: Record<string, ComponentManifest> = {\n \"Webiny/Root\": {\n name: \"Webiny/Root\",\n label: \"Main Content\",\n tags: [],\n inputs: [\n {\n type: \"slot\",\n list: true,\n renderer: \"Webiny/Slot\",\n defaultValue: [],\n name: \"children\"\n }\n ]\n },\n \"FunnelBuilder/Funnel\": {\n name: \"FunnelBuilder/Funnel\",\n label: \"Funnel\",\n tags: [],\n inputs: [\n {\n type: \"object\",\n renderer: \"Webiny/Object\",\n name: \"fields\",\n list: true,\n fields: [],\n defaultValue: []\n },\n {\n type: \"number\",\n renderer: \"Webiny/Number\",\n name: \"activeStep\",\n label: \"Active Step\",\n defaultValue: 0\n },\n {\n type: \"slot\",\n list: true,\n renderer: \"Webiny/Slot\",\n defaultValue: [],\n name: \"steps\"\n },\n {\n type: \"object\",\n renderer: \"FunnelBuilder/ConditionRulesRenderer\",\n name: \"conditionRules\",\n list: true,\n fields: []\n }\n ]\n },\n \"FunnelBuilder/Step\": {\n name: \"FunnelBuilder/Step\",\n label: \"Funnel Step\",\n tags: [],\n inputs: [\n {\n type: \"text\",\n renderer: \"Webiny/Input\",\n name: \"label\",\n label: \"Label\"\n },\n {\n type: \"slot\",\n list: true,\n renderer: \"Webiny/Slot\",\n defaultValue: [],\n name: \"children\"\n }\n ]\n }\n};\n\n/**\n * Extract private fields from operation instances for assertion.\n */\nfunction serializeOp(op: any) {\n if (op instanceof DocumentOperations.AddElement) {\n return { type: \"AddElement\", element: op[\"element\"] };\n }\n if (op instanceof DocumentOperations.AddToParent) {\n return { type: \"AddToParent\", element: op[\"element\"], index: op[\"index\"] };\n }\n if (op instanceof DocumentOperations.SetGlobalInputBinding) {\n return {\n type: \"SetGlobalInputBinding\",\n elementId: op[\"elementId\"],\n bindingPath: op[\"bindingPath\"],\n binding: op[\"binding\"]\n };\n }\n if (op instanceof DocumentOperations.SetGlobalStyleBinding) {\n return {\n type: \"SetGlobalStyleBinding\",\n elementId: op[\"elementId\"],\n bindingPath: op[\"bindingPath\"],\n binding: op[\"binding\"]\n };\n }\n return op;\n}\n\ndescribe(\"ElementFactory\", () => {\n it(\"should produce correct operation sequence for a Funnel with two Steps\", () => {\n const factory = new ElementFactory(components);\n const result = factory.createElementFromComponent({\n componentName: \"FunnelBuilder/Funnel\",\n parentId: \"root\",\n slot: \"children\",\n index: 0,\n bindings: {\n inputs: {\n fields: [],\n activeStep: 0,\n steps: [\n {\n action: \"CreateElement\",\n params: {\n component: \"FunnelBuilder/Step\",\n inputs: { label: \"Step 1\", children: [] }\n }\n },\n {\n action: \"CreateElement\",\n params: {\n component: \"FunnelBuilder/Step\",\n inputs: { label: \"Final Step\", children: [] }\n }\n }\n ]\n }\n }\n });\n\n const ops = result.operations.map(serializeOp);\n const funnelId = result.element.id;\n\n // 0: AddElement — Funnel\n expect(ops[0].type).toBe(\"AddElement\");\n expect(ops[0].element.component.name).toBe(\"FunnelBuilder/Funnel\");\n\n // 1: AddToParent — Funnel → root/children at index 0\n expect(ops[1].type).toBe(\"AddToParent\");\n expect(ops[1].element.id).toBe(funnelId);\n expect(ops[1].index).toBe(0);\n\n // 2: SetGlobalInputBinding — activeStep = 0\n expect(ops[2].type).toBe(\"SetGlobalInputBinding\");\n expect(ops[2].elementId).toBe(funnelId);\n expect(ops[2].bindingPath).toBe(\"activeStep\");\n expect(ops[2].binding.static).toBe(0);\n\n // 3: AddElement — Step 1\n const step1Id = ops[3].element.id;\n expect(ops[3].type).toBe(\"AddElement\");\n expect(ops[3].element.component.name).toBe(\"FunnelBuilder/Step\");\n expect(ops[3].element.parent).toEqual({ id: funnelId, slot: \"steps\" });\n\n // 4: AddToParent — Step 1 (undefined = append)\n expect(ops[4].type).toBe(\"AddToParent\");\n expect(ops[4].element.id).toBe(step1Id);\n expect(ops[4].index).toBeUndefined();\n\n // 5: Step 1 label binding\n expect(ops[5].bindingPath).toBe(\"label\");\n expect(ops[5].binding.static).toBe(\"Step 1\");\n\n // 6: Step 1 children binding\n expect(ops[6].bindingPath).toBe(\"children\");\n expect(ops[6].binding.static).toEqual([]);\n\n // 7-8: Step 1 style bindings\n expect(ops[7].bindingPath).toBe(\"display\");\n expect(ops[8].bindingPath).toBe(\"flexDirection\");\n\n // 9: SetGlobalInputBinding — steps slot metadata (no static, AddToParent handles it)\n expect(ops[9].type).toBe(\"SetGlobalInputBinding\");\n expect(ops[9].elementId).toBe(funnelId);\n expect(ops[9].bindingPath).toBe(\"steps\");\n expect(ops[9].binding.static).toBeUndefined();\n expect(ops[9].binding.type).toBe(\"slot\");\n expect(ops[9].binding.list).toBe(true);\n\n // 10: AddElement — Step 2\n expect(ops[10].element.component.name).toBe(\"FunnelBuilder/Step\");\n\n // 11: AddToParent — Step 2 (undefined = append)\n expect(ops[11].index).toBeUndefined();\n\n // 12-15: Step 2 bindings + styles\n expect(ops[12].binding.static).toBe(\"Final Step\");\n expect(ops[13].binding.static).toEqual([]);\n\n // 16: SetGlobalInputBinding — steps slot metadata (no static)\n expect(ops[16].type).toBe(\"SetGlobalInputBinding\");\n expect(ops[16].elementId).toBe(funnelId);\n expect(ops[16].bindingPath).toBe(\"steps\");\n expect(ops[16].binding.static).toBeUndefined();\n\n // 17-18: Funnel style bindings\n expect(ops[17].bindingPath).toBe(\"display\");\n expect(ops[18].bindingPath).toBe(\"flexDirection\");\n\n expect(ops).toHaveLength(19);\n });\n\n it(\"should produce correct document after applying all operations\", () => {\n const factory = new ElementFactory(components);\n const result = factory.createElementFromComponent({\n componentName: \"FunnelBuilder/Funnel\",\n parentId: \"root\",\n slot: \"children\",\n index: 0,\n bindings: {\n inputs: {\n fields: [],\n activeStep: 0,\n steps: [\n {\n action: \"CreateElement\",\n params: {\n component: \"FunnelBuilder/Step\",\n inputs: { label: \"Step 1\", children: [] }\n }\n },\n {\n action: \"CreateElement\",\n params: {\n component: \"FunnelBuilder/Step\",\n inputs: { label: \"Final Step\", children: [] }\n }\n }\n ]\n }\n }\n });\n\n const document = {\n state: {},\n elements: {\n root: {\n type: \"Webiny/Element\",\n id: \"root\",\n component: { name: \"Webiny/Root\" }\n }\n },\n bindings: {}\n } as unknown as Document;\n\n for (const op of result.operations) {\n op.apply(document);\n }\n\n const funnelId = result.element.id;\n\n // Both step elements exist in the document.\n const stepElements = Object.values(document.elements).filter(\n el => el.component.name === \"FunnelBuilder/Step\"\n );\n expect(stepElements).toHaveLength(2);\n\n // Both steps have their correct labels.\n const labels = stepElements.map(el => document.bindings[el.id]?.inputs?.label?.static);\n expect(labels).toContain(\"Step 1\");\n expect(labels).toContain(\"Final Step\");\n\n // The steps binding contains both step IDs in order.\n const stepsBinding = document.bindings[funnelId]?.inputs?.steps;\n expect(stepsBinding?.list).toBe(true);\n expect(stepsBinding?.type).toBe(\"slot\");\n expect(stepsBinding?.static).toHaveLength(2);\n\n const step1 = stepElements.find(\n el => document.bindings[el.id]?.inputs?.label?.static === \"Step 1\"\n )!;\n const step2 = stepElements.find(\n el => document.bindings[el.id]?.inputs?.label?.static === \"Final Step\"\n )!;\n expect(stepsBinding?.static).toEqual([step1.id, step2.id]);\n });\n});\n"],"names":["components","serializeOp","op","DocumentOperations","describe","it","factory","ElementFactory","result","ops","funnelId","expect","step1Id","document","stepElements","Object","el","labels","stepsBinding","step1","step2"],"mappings":"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"}
|
package/Environment.js
CHANGED
|
@@ -1,23 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
1
|
+
class Environment {
|
|
2
|
+
isPreview() {
|
|
3
|
+
return null !== this.getQueryParam("preview.document");
|
|
4
|
+
}
|
|
5
|
+
isClient() {
|
|
6
|
+
return "u" > typeof window;
|
|
7
|
+
}
|
|
8
|
+
isServer() {
|
|
9
|
+
return !this.isClient();
|
|
10
|
+
}
|
|
11
|
+
isEditing() {
|
|
12
|
+
return this.isClient() && window.parent !== window;
|
|
13
|
+
}
|
|
14
|
+
getQueryParam(key) {
|
|
15
|
+
if (!this.isClient()) return null;
|
|
16
|
+
return new URLSearchParams(window.location.search).get(key);
|
|
17
17
|
}
|
|
18
|
-
return new URLSearchParams(window.location.search).get(key);
|
|
19
|
-
}
|
|
20
18
|
}
|
|
21
|
-
|
|
19
|
+
const environment = new Environment();
|
|
20
|
+
export { Environment, environment };
|
|
22
21
|
|
|
23
22
|
//# sourceMappingURL=Environment.js.map
|
package/Environment.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"Environment.js","sources":["../src/Environment.ts"],"sourcesContent":["import type { IEnvironment } from \"./types.js\";\n\nexport class Environment implements IEnvironment {\n public isPreview(): boolean {\n return this.getQueryParam(\"preview.document\") !== null;\n }\n\n public isClient(): boolean {\n return typeof window !== \"undefined\";\n }\n\n public isServer(): boolean {\n return !this.isClient();\n }\n\n public isEditing(): boolean {\n return this.isClient() && window.parent !== window;\n }\n\n private getQueryParam(key: string): string | null {\n if (!this.isClient()) {\n return null;\n }\n\n return new URLSearchParams(window.location.search).get(key);\n }\n}\n\nexport const environment = new Environment();\n"],"names":["Environment","window","key","URLSearchParams","environment"],"mappings":"AAEO,MAAMA;IACF,YAAqB;QACxB,OAAO,AAA2C,SAA3C,IAAI,CAAC,aAAa,CAAC;IAC9B;IAEO,WAAoB;QACvB,OAAO,AAAkB,MAAlB,OAAOC;IAClB;IAEO,WAAoB;QACvB,OAAO,CAAC,IAAI,CAAC,QAAQ;IACzB;IAEO,YAAqB;QACxB,OAAO,IAAI,CAAC,QAAQ,MAAMA,OAAO,MAAM,KAAKA;IAChD;IAEQ,cAAcC,GAAW,EAAiB;QAC9C,IAAI,CAAC,IAAI,CAAC,QAAQ,IACd,OAAO;QAGX,OAAO,IAAIC,gBAAgBF,OAAO,QAAQ,CAAC,MAAM,EAAE,GAAG,CAACC;IAC3D;AACJ;AAEO,MAAME,cAAc,IAAIJ"}
|
package/FunctionConverter.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
class FunctionConverter {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
serialize(fn) {
|
|
3
|
+
return fn.toString();
|
|
4
|
+
}
|
|
5
|
+
deserialize(fn) {
|
|
6
|
+
return new Function(`return ${fn}`)();
|
|
7
|
+
}
|
|
8
8
|
}
|
|
9
|
-
|
|
9
|
+
const functionConverter = new FunctionConverter();
|
|
10
|
+
export { functionConverter };
|
|
10
11
|
|
|
11
12
|
//# sourceMappingURL=FunctionConverter.js.map
|
package/FunctionConverter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"FunctionConverter.js","sources":["../src/FunctionConverter.ts"],"sourcesContent":["class FunctionConverter {\n serialize(fn: (...args: any[]) => unknown) {\n return fn.toString();\n }\n\n deserialize(fn: string) {\n return new Function(`return ${fn}`)();\n }\n}\n\nexport const functionConverter = new FunctionConverter();\n"],"names":["FunctionConverter","fn","Function","functionConverter"],"mappings":"AAAA,MAAMA;IACF,UAAUC,EAA+B,EAAE;QACvC,OAAOA,GAAG,QAAQ;IACtB;IAEA,YAAYA,EAAU,EAAE;QACpB,OAAO,IAAIC,SAAS,CAAC,OAAO,EAAED,IAAI;IACtC;AACJ;AAEO,MAAME,oBAAoB,IAAIH"}
|
package/HashObject.js
CHANGED
|
@@ -1,31 +1,16 @@
|
|
|
1
|
-
import
|
|
2
|
-
/*
|
|
3
|
-
// TODO @pavel consider using this library instead of fast-json-stable-stringify as it is a bit newer
|
|
4
|
-
import { configure } from 'safe-stable-stringify'
|
|
5
|
-
|
|
6
|
-
const stringify = configure({
|
|
7
|
-
bigint: true,
|
|
8
|
-
circularValue: '[Circular]',
|
|
9
|
-
deterministic: true,
|
|
10
|
-
maximumDepth: Infinity,
|
|
11
|
-
maximumBreadth: Infinity,
|
|
12
|
-
strict: false,
|
|
13
|
-
});
|
|
14
|
-
*/
|
|
15
|
-
|
|
1
|
+
import fast_json_stable_stringify from "fast-json-stable-stringify";
|
|
16
2
|
class HashObject {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
3
|
+
hash(object) {
|
|
4
|
+
return this.fastHash(object);
|
|
5
|
+
}
|
|
6
|
+
fastHash(obj) {
|
|
7
|
+
const str = fast_json_stable_stringify(obj);
|
|
8
|
+
let hash = 0;
|
|
9
|
+
for(let i = 0; i < str.length; i++)hash = (hash << 5) - hash + str.charCodeAt(i) | 0;
|
|
10
|
+
return hash >>> 0;
|
|
25
11
|
}
|
|
26
|
-
return hash >>> 0; // unsigned
|
|
27
|
-
}
|
|
28
12
|
}
|
|
29
|
-
|
|
13
|
+
const hashObject = new HashObject();
|
|
14
|
+
export { hashObject };
|
|
30
15
|
|
|
31
16
|
//# sourceMappingURL=HashObject.js.map
|
package/HashObject.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"HashObject.js","sources":["../src/HashObject.ts"],"sourcesContent":["import stringify from \"fast-json-stable-stringify\";\n/*\n// TODO @pavel consider using this library instead of fast-json-stable-stringify as it is a bit newer\nimport { configure } from 'safe-stable-stringify'\n\nconst stringify = configure({\n bigint: true,\n circularValue: '[Circular]',\n deterministic: true,\n maximumDepth: Infinity,\n maximumBreadth: Infinity,\n strict: false,\n});\n*/\n\nclass HashObject {\n hash(object: object) {\n return this.fastHash(object);\n }\n\n private fastHash(obj: object): number {\n const str = stringify(obj); // stable key order\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) - hash + str.charCodeAt(i)) | 0;\n }\n return hash >>> 0; // unsigned\n }\n}\n\nexport const hashObject = new HashObject();\n"],"names":["HashObject","object","obj","str","stringify","hash","i","hashObject"],"mappings":";AAeA,MAAMA;IACF,KAAKC,MAAc,EAAE;QACjB,OAAO,IAAI,CAAC,QAAQ,CAACA;IACzB;IAEQ,SAASC,GAAW,EAAU;QAClC,MAAMC,MAAMC,2BAAUF;QACtB,IAAIG,OAAO;QACX,IAAK,IAAIC,IAAI,GAAGA,IAAIH,IAAI,MAAM,EAAEG,IAC5BD,OAASA,AAAAA,CAAAA,QAAQ,KAAKA,OAAOF,IAAI,UAAU,CAACG,KAAM;QAEtD,OAAOD,SAAS;IACpB;AACJ;AAEO,MAAME,aAAa,IAAIP"}
|
package/HotkeyManager.js
CHANGED
|
@@ -1,58 +1,51 @@
|
|
|
1
1
|
import { isHotkey } from "is-hotkey";
|
|
2
2
|
const keyStack = {};
|
|
3
3
|
let listenerInitialized = false;
|
|
4
|
-
const filterTags = [
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
const filterTags = [
|
|
5
|
+
"TEXTAREA",
|
|
6
|
+
"INPUT"
|
|
7
|
+
];
|
|
8
|
+
const isContentEditable = (value)=>[
|
|
9
|
+
"true",
|
|
10
|
+
true
|
|
11
|
+
].includes(value);
|
|
8
12
|
let idCounter = 0;
|
|
9
|
-
const generateSimpleId = ()
|
|
10
|
-
const setupListener = ()
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
item.handler(ev);
|
|
26
|
-
ev.stopPropagation();
|
|
27
|
-
}
|
|
28
|
-
};
|
|
29
|
-
document.body.addEventListener("keydown", eventListener);
|
|
30
|
-
listenerInitialized = true;
|
|
13
|
+
const generateSimpleId = ()=>`hotkey-${++idCounter}`;
|
|
14
|
+
const setupListener = ()=>{
|
|
15
|
+
if (listenerInitialized || !document.body) return;
|
|
16
|
+
const eventListener = (ev)=>{
|
|
17
|
+
const target = ev.target;
|
|
18
|
+
if (!target) return;
|
|
19
|
+
if (filterTags.includes(target.nodeName) || isContentEditable(target.contentEditable)) return;
|
|
20
|
+
const matchedKey = Object.keys(keyStack).find((key)=>isHotkey(key, ev));
|
|
21
|
+
if (matchedKey && keyStack[matchedKey]?.length > 0) {
|
|
22
|
+
const item = keyStack[matchedKey][0];
|
|
23
|
+
item.handler(ev);
|
|
24
|
+
ev.stopPropagation();
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
document.body.addEventListener("keydown", eventListener);
|
|
28
|
+
listenerInitialized = true;
|
|
31
29
|
};
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
add(key, handler) {
|
|
38
|
-
keyStack[key] = keyStack[key] || [];
|
|
39
|
-
const exists = keyStack[key].some(item => item.id === this.id);
|
|
40
|
-
if (!exists) {
|
|
41
|
-
keyStack[key].unshift({
|
|
42
|
-
id: this.id,
|
|
43
|
-
handler
|
|
44
|
-
});
|
|
30
|
+
class HotkeyManager {
|
|
31
|
+
constructor(){
|
|
32
|
+
this.id = generateSimpleId();
|
|
33
|
+
setupListener();
|
|
45
34
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
35
|
+
add(key, handler) {
|
|
36
|
+
keyStack[key] = keyStack[key] || [];
|
|
37
|
+
const exists = keyStack[key].some((item)=>item.id === this.id);
|
|
38
|
+
if (!exists) keyStack[key].unshift({
|
|
39
|
+
id: this.id,
|
|
40
|
+
handler
|
|
41
|
+
});
|
|
50
42
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
43
|
+
remove(key) {
|
|
44
|
+
if (!keyStack[key]) return;
|
|
45
|
+
const index = keyStack[key].findIndex((item)=>item.id === this.id);
|
|
46
|
+
if (index >= 0) keyStack[key].splice(index, 1);
|
|
54
47
|
}
|
|
55
|
-
}
|
|
56
48
|
}
|
|
49
|
+
export { HotkeyManager };
|
|
57
50
|
|
|
58
51
|
//# sourceMappingURL=HotkeyManager.js.map
|
package/HotkeyManager.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"HotkeyManager.js","sources":["../src/HotkeyManager.ts"],"sourcesContent":["import { isHotkey } from \"is-hotkey\";\n\ninterface KeyHandler {\n id: string;\n handler: (e: KeyboardEvent) => void;\n}\n\nconst keyStack: Record<string, KeyHandler[]> = {};\nlet listenerInitialized = false;\nconst filterTags = [\"TEXTAREA\", \"INPUT\"];\n\nconst isContentEditable = (value: any) => {\n return [\"true\", true].includes(value);\n};\n\nlet idCounter = 0;\nconst generateSimpleId = () => `hotkey-${++idCounter}`;\n\nconst setupListener = (): void => {\n if (listenerInitialized || !document.body) {\n return;\n }\n\n const eventListener = (ev: KeyboardEvent) => {\n const target = ev.target as HTMLElement;\n\n if (!target) {\n return;\n }\n if (filterTags.includes(target.nodeName) || isContentEditable(target.contentEditable)) {\n return;\n }\n\n const matchedKey = Object.keys(keyStack).find(key => isHotkey(key, ev));\n if (matchedKey && keyStack[matchedKey]?.length > 0) {\n const item = keyStack[matchedKey][0];\n item.handler(ev);\n ev.stopPropagation();\n }\n };\n\n document.body.addEventListener(\"keydown\", eventListener);\n listenerInitialized = true;\n};\n\nexport class HotkeyManager {\n private readonly id: string;\n\n constructor() {\n this.id = generateSimpleId();\n setupListener();\n }\n\n add(key: string, handler: (e: KeyboardEvent) => void): void {\n keyStack[key] = keyStack[key] || [];\n const exists = keyStack[key].some(item => item.id === this.id);\n if (!exists) {\n keyStack[key].unshift({ id: this.id, handler });\n }\n }\n\n remove(key: string): void {\n if (!keyStack[key]) {\n return;\n }\n\n const index = keyStack[key].findIndex(item => item.id === this.id);\n if (index >= 0) {\n keyStack[key].splice(index, 1);\n }\n }\n}\n"],"names":["keyStack","listenerInitialized","filterTags","isContentEditable","value","idCounter","generateSimpleId","setupListener","document","eventListener","ev","target","matchedKey","Object","key","isHotkey","item","HotkeyManager","handler","exists","index"],"mappings":";AAOA,MAAMA,WAAyC,CAAC;AAChD,IAAIC,sBAAsB;AAC1B,MAAMC,aAAa;IAAC;IAAY;CAAQ;AAExC,MAAMC,oBAAoB,CAACC,QAChB;QAAC;QAAQ;KAAK,CAAC,QAAQ,CAACA;AAGnC,IAAIC,YAAY;AAChB,MAAMC,mBAAmB,IAAM,CAAC,OAAO,EAAE,EAAED,WAAW;AAEtD,MAAME,gBAAgB;IAClB,IAAIN,uBAAuB,CAACO,SAAS,IAAI,EACrC;IAGJ,MAAMC,gBAAgB,CAACC;QACnB,MAAMC,SAASD,GAAG,MAAM;QAExB,IAAI,CAACC,QACD;QAEJ,IAAIT,WAAW,QAAQ,CAACS,OAAO,QAAQ,KAAKR,kBAAkBQ,OAAO,eAAe,GAChF;QAGJ,MAAMC,aAAaC,OAAO,IAAI,CAACb,UAAU,IAAI,CAACc,CAAAA,MAAOC,SAASD,KAAKJ;QACnE,IAAIE,cAAcZ,QAAQ,CAACY,WAAW,EAAE,SAAS,GAAG;YAChD,MAAMI,OAAOhB,QAAQ,CAACY,WAAW,CAAC,EAAE;YACpCI,KAAK,OAAO,CAACN;YACbA,GAAG,eAAe;QACtB;IACJ;IAEAF,SAAS,IAAI,CAAC,gBAAgB,CAAC,WAAWC;IAC1CR,sBAAsB;AAC1B;AAEO,MAAMgB;IAGT,aAAc;QACV,IAAI,CAAC,EAAE,GAAGX;QACVC;IACJ;IAEA,IAAIO,GAAW,EAAEI,OAAmC,EAAQ;QACxDlB,QAAQ,CAACc,IAAI,GAAGd,QAAQ,CAACc,IAAI,IAAI,EAAE;QACnC,MAAMK,SAASnB,QAAQ,CAACc,IAAI,CAAC,IAAI,CAACE,CAAAA,OAAQA,KAAK,EAAE,KAAK,IAAI,CAAC,EAAE;QAC7D,IAAI,CAACG,QACDnB,QAAQ,CAACc,IAAI,CAAC,OAAO,CAAC;YAAE,IAAI,IAAI,CAAC,EAAE;YAAEI;QAAQ;IAErD;IAEA,OAAOJ,GAAW,EAAQ;QACtB,IAAI,CAACd,QAAQ,CAACc,IAAI,EACd;QAGJ,MAAMM,QAAQpB,QAAQ,CAACc,IAAI,CAAC,SAAS,CAACE,CAAAA,OAAQA,KAAK,EAAE,KAAK,IAAI,CAAC,EAAE;QACjE,IAAII,SAAS,GACTpB,QAAQ,CAACc,IAAI,CAAC,MAAM,CAACM,OAAO;IAEpC;AACJ"}
|
package/IBindingsUpdater.js
CHANGED
package/IRedirects.js
CHANGED
package/InheritanceProcessor.js
CHANGED
|
@@ -1,147 +1,107 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
}
|
|
6
|
-
getInheritanceMap(bindings, breakpoint) {
|
|
7
|
-
const overrides = bindings.overrides ?? {};
|
|
8
|
-
const inputs = bindings.inputs ?? {};
|
|
9
|
-
const styles = bindings.styles ?? {};
|
|
10
|
-
const upTo = Math.max(this.breakpoints.indexOf(breakpoint), 0);
|
|
11
|
-
const currentBpIndex = this.breakpoints.indexOf(breakpoint);
|
|
12
|
-
|
|
13
|
-
// Maps now store sets of all override indices per key for correct ancestor lookup
|
|
14
|
-
const overriddenInputsMap = new Map();
|
|
15
|
-
const overriddenStylesMap = new Map();
|
|
16
|
-
|
|
17
|
-
// 1) Merge overrides and track all override indices for inputs and styles
|
|
18
|
-
for (let i = 0; i <= upTo; i++) {
|
|
19
|
-
const bp = this.breakpoints[i];
|
|
20
|
-
const override = overrides[bp];
|
|
21
|
-
if (!override) {
|
|
22
|
-
continue;
|
|
23
|
-
}
|
|
24
|
-
if (override.inputs) {
|
|
25
|
-
for (const key in override.inputs) {
|
|
26
|
-
if (!overriddenInputsMap.has(key)) {
|
|
27
|
-
overriddenInputsMap.set(key, new Set());
|
|
28
|
-
}
|
|
29
|
-
overriddenInputsMap.get(key).add(i);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
if (override.styles) {
|
|
33
|
-
for (const key in override.styles) {
|
|
34
|
-
if (!overriddenStylesMap.has(key)) {
|
|
35
|
-
overriddenStylesMap.set(key, new Set());
|
|
36
|
-
}
|
|
37
|
-
overriddenStylesMap.get(key).add(i);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
1
|
+
class InheritanceProcessor {
|
|
2
|
+
constructor(breakpoints, inputsAst){
|
|
3
|
+
this.breakpoints = breakpoints;
|
|
4
|
+
this.responsiveInputPaths = this.getResponsiveInputPaths(inputsAst);
|
|
40
5
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
overriddenInputsMap
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const isResponsive = this.responsiveInputPaths.has(normalizedKey);
|
|
63
|
-
// Skip non-responsive input keys
|
|
64
|
-
if (!isResponsive) {
|
|
65
|
-
continue;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// If responsive, normalize key to ignore indexes for inheritance checks
|
|
69
|
-
const lookupKey = isResponsive ? normalizedKey : key;
|
|
70
|
-
|
|
71
|
-
// Find the greatest index <= currentBpIndex where key is overridden
|
|
72
|
-
const overrideIndices = overriddenInputsMap.get(lookupKey) ?? new Set();
|
|
73
|
-
let lastOverrideIndex = -1;
|
|
74
|
-
for (const idx of overrideIndices) {
|
|
75
|
-
if (idx <= currentBpIndex && idx > lastOverrideIndex) {
|
|
76
|
-
lastOverrideIndex = idx;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
const overridden = lastOverrideIndex === currentBpIndex;
|
|
80
|
-
|
|
81
|
-
// Find nearest ancestor breakpoint less than currentBpIndex
|
|
82
|
-
let inheritedFromIndex = 0; // Use `desktop` as fallback.
|
|
83
|
-
for (let j = currentBpIndex - 1; j >= 0; j--) {
|
|
84
|
-
if (overrideIndices.has(j)) {
|
|
85
|
-
inheritedFromIndex = j;
|
|
86
|
-
break;
|
|
6
|
+
getInheritanceMap(bindings, breakpoint) {
|
|
7
|
+
const overrides = bindings.overrides ?? {};
|
|
8
|
+
const inputs = bindings.inputs ?? {};
|
|
9
|
+
const styles = bindings.styles ?? {};
|
|
10
|
+
const upTo = Math.max(this.breakpoints.indexOf(breakpoint), 0);
|
|
11
|
+
const currentBpIndex = this.breakpoints.indexOf(breakpoint);
|
|
12
|
+
const overriddenInputsMap = new Map();
|
|
13
|
+
const overriddenStylesMap = new Map();
|
|
14
|
+
for(let i = 0; i <= upTo; i++){
|
|
15
|
+
const bp = this.breakpoints[i];
|
|
16
|
+
const override = overrides[bp];
|
|
17
|
+
if (override) {
|
|
18
|
+
if (override.inputs) for(const key in override.inputs){
|
|
19
|
+
if (!overriddenInputsMap.has(key)) overriddenInputsMap.set(key, new Set());
|
|
20
|
+
overriddenInputsMap.get(key).add(i);
|
|
21
|
+
}
|
|
22
|
+
if (override.styles) for(const key in override.styles){
|
|
23
|
+
if (!overriddenStylesMap.has(key)) overriddenStylesMap.set(key, new Set());
|
|
24
|
+
overriddenStylesMap.get(key).add(i);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
87
27
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
28
|
+
for(const key in inputs)if (overriddenInputsMap.has(key)) overriddenInputsMap.get(key).add(0);
|
|
29
|
+
else overriddenInputsMap.set(key, new Set([
|
|
30
|
+
0
|
|
31
|
+
]));
|
|
32
|
+
for(const key in styles)if (overriddenStylesMap.has(key)) overriddenStylesMap.get(key).add(0);
|
|
33
|
+
else overriddenStylesMap.set(key, new Set([
|
|
34
|
+
0
|
|
35
|
+
]));
|
|
36
|
+
const inputsInheritance = {};
|
|
37
|
+
for (const key of Object.keys(inputs)){
|
|
38
|
+
const normalizedKey = this.normalizeBindingKey(key);
|
|
39
|
+
const isResponsive = this.responsiveInputPaths.has(normalizedKey);
|
|
40
|
+
if (!isResponsive) continue;
|
|
41
|
+
const lookupKey = isResponsive ? normalizedKey : key;
|
|
42
|
+
const overrideIndices = overriddenInputsMap.get(lookupKey) ?? new Set();
|
|
43
|
+
let lastOverrideIndex = -1;
|
|
44
|
+
for (const idx of overrideIndices)if (idx <= currentBpIndex && idx > lastOverrideIndex) lastOverrideIndex = idx;
|
|
45
|
+
const overridden = lastOverrideIndex === currentBpIndex;
|
|
46
|
+
let inheritedFromIndex = 0;
|
|
47
|
+
for(let j = currentBpIndex - 1; j >= 0; j--)if (overrideIndices.has(j)) {
|
|
48
|
+
inheritedFromIndex = j;
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
const inheritedFrom = inheritedFromIndex >= 0 ? this.breakpoints[inheritedFromIndex] : void 0;
|
|
52
|
+
inputsInheritance[key] = {
|
|
53
|
+
overridden,
|
|
54
|
+
inheritedFrom: breakpoint === inheritedFrom ? void 0 : inheritedFrom
|
|
55
|
+
};
|
|
105
56
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
57
|
+
const stylesInheritance = {};
|
|
58
|
+
const keys = new Set([
|
|
59
|
+
...Object.keys(styles),
|
|
60
|
+
...Array.from(overriddenStylesMap.keys())
|
|
61
|
+
]);
|
|
62
|
+
for (const key of keys){
|
|
63
|
+
const overrideIndices = overriddenStylesMap.get(key) ?? new Set();
|
|
64
|
+
let lastOverrideIndex = -1;
|
|
65
|
+
for (const idx of overrideIndices)if (idx <= currentBpIndex && idx > lastOverrideIndex) lastOverrideIndex = idx;
|
|
66
|
+
const overridden = lastOverrideIndex === currentBpIndex;
|
|
67
|
+
let inheritedFromIndex = 0;
|
|
68
|
+
for(let j = currentBpIndex - 1; j >= 0; j--)if (overrideIndices.has(j)) {
|
|
69
|
+
inheritedFromIndex = j;
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
const inheritedFrom = inheritedFromIndex >= 0 ? this.breakpoints[inheritedFromIndex] : void 0;
|
|
73
|
+
stylesInheritance[key] = {
|
|
74
|
+
overridden,
|
|
75
|
+
inheritedFrom: breakpoint === inheritedFrom ? void 0 : inheritedFrom
|
|
76
|
+
};
|
|
113
77
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
78
|
+
return {
|
|
79
|
+
inputs: inputsInheritance,
|
|
80
|
+
styles: stylesInheritance
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
normalizeBindingKey(path) {
|
|
84
|
+
return path.replace(/\[\d+\]/g, "");
|
|
85
|
+
}
|
|
86
|
+
getResponsiveInputPaths(inputsAst) {
|
|
87
|
+
const responsivePaths = new Set();
|
|
88
|
+
const traverse = (nodes, prefix)=>{
|
|
89
|
+
for (const node of nodes){
|
|
90
|
+
const currentPath = [
|
|
91
|
+
...prefix,
|
|
92
|
+
node.name
|
|
93
|
+
].join("/");
|
|
94
|
+
if (node.input?.responsive) responsivePaths.add(currentPath);
|
|
95
|
+
if (node.children.length) traverse(node.children, [
|
|
96
|
+
...prefix,
|
|
97
|
+
node.name
|
|
98
|
+
]);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
traverse(inputsAst, []);
|
|
102
|
+
return responsivePaths;
|
|
120
103
|
}
|
|
121
|
-
return {
|
|
122
|
-
inputs: inputsInheritance,
|
|
123
|
-
styles: stylesInheritance
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
normalizeBindingKey(path) {
|
|
127
|
-
return path.replace(/\[\d+\]/g, "");
|
|
128
|
-
}
|
|
129
|
-
getResponsiveInputPaths(inputsAst) {
|
|
130
|
-
const responsivePaths = new Set();
|
|
131
|
-
const traverse = (nodes, prefix) => {
|
|
132
|
-
for (const node of nodes) {
|
|
133
|
-
const currentPath = [...prefix, node.name].join("/");
|
|
134
|
-
if (node.input?.responsive) {
|
|
135
|
-
responsivePaths.add(currentPath);
|
|
136
|
-
}
|
|
137
|
-
if (node.children.length) {
|
|
138
|
-
traverse(node.children, [...prefix, node.name]);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
};
|
|
142
|
-
traverse(inputsAst, []);
|
|
143
|
-
return responsivePaths;
|
|
144
|
-
}
|
|
145
104
|
}
|
|
105
|
+
export { InheritanceProcessor };
|
|
146
106
|
|
|
147
107
|
//# sourceMappingURL=InheritanceProcessor.js.map
|