@webiny/website-builder-sdk 6.3.0-beta.4 → 6.4.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BindingsApi.js +29 -36
- package/BindingsApi.js.map +1 -1
- package/BindingsProcessor.js +34 -43
- package/BindingsProcessor.js.map +1 -1
- package/BindingsProcessor.test.js +82 -78
- package/BindingsProcessor.test.js.map +1 -1
- package/BindingsResolver.js +92 -119
- package/BindingsResolver.js.map +1 -1
- package/BindingsResolver.test.js +399 -363
- package/BindingsResolver.test.js.map +1 -1
- package/ComponentInputTraverser.js +28 -49
- package/ComponentInputTraverser.js.map +1 -1
- package/ComponentManifestToAstConverter.js +20 -21
- package/ComponentManifestToAstConverter.js.map +1 -1
- package/ComponentRegistry.js +26 -45
- package/ComponentRegistry.js.map +1 -1
- package/ComponentResolver.js +25 -29
- package/ComponentResolver.js.map +1 -1
- package/ConstraintEvaluator.js +246 -353
- package/ConstraintEvaluator.js.map +1 -1
- package/ConstraintEvaluator.test.js +1616 -1438
- package/ConstraintEvaluator.test.js.map +1 -1
- package/ContentSdk.js +83 -90
- package/ContentSdk.js.map +1 -1
- package/DocumentStore.js +47 -59
- package/DocumentStore.js.map +1 -1
- package/DocumentStoreManager.js +17 -16
- package/DocumentStoreManager.js.map +1 -1
- package/EditingSdk.js +87 -121
- package/EditingSdk.js.map +1 -1
- package/ElementFactory.js +126 -174
- package/ElementFactory.js.map +1 -1
- package/ElementFactory.test.js +234 -263
- package/ElementFactory.test.js.map +1 -1
- package/Environment.js +18 -19
- package/Environment.js.map +1 -1
- package/FunctionConverter.js +8 -7
- package/FunctionConverter.js.map +1 -1
- package/HashObject.js +11 -26
- package/HashObject.js.map +1 -1
- package/HotkeyManager.js +40 -47
- package/HotkeyManager.js.map +1 -1
- package/IBindingsUpdater.js +0 -3
- package/IRedirects.js +0 -3
- package/InheritanceProcessor.js +99 -139
- package/InheritanceProcessor.js.map +1 -1
- package/InheritanceProcessor.test.js +178 -179
- package/InheritanceProcessor.test.js.map +1 -1
- package/InheritedValueResolver.js +15 -20
- package/InheritedValueResolver.js.map +1 -1
- package/InputBindingsProcessor.js +187 -307
- package/InputBindingsProcessor.js.map +1 -1
- package/InputsBindingsProcessor.test.js +334 -315
- package/InputsBindingsProcessor.test.js.map +1 -1
- package/InputsUpdater.js +23 -26
- package/InputsUpdater.js.map +1 -1
- package/LiveSdk.js +12 -13
- package/LiveSdk.js.map +1 -1
- package/Logger.js +9 -8
- package/Logger.js.map +1 -1
- package/MouseTracker.js +77 -83
- package/MouseTracker.js.map +1 -1
- package/NullSdk.js +22 -21
- package/NullSdk.js.map +1 -1
- package/PreviewDocument.js +27 -30
- package/PreviewDocument.js.map +1 -1
- package/PreviewSdk.js +16 -17
- package/PreviewSdk.js.map +1 -1
- package/PreviewViewport.js +51 -63
- package/PreviewViewport.js.map +1 -1
- package/ResizeObserver.js +24 -31
- package/ResizeObserver.js.map +1 -1
- package/StylesBindingsProcessor.js +40 -79
- package/StylesBindingsProcessor.js.map +1 -1
- package/StylesUpdater.js +20 -25
- package/StylesUpdater.js.map +1 -1
- package/Theme.js +28 -25
- package/Theme.js.map +1 -1
- package/ViewportManager.js +89 -101
- package/ViewportManager.js.map +1 -1
- package/constants.js +7 -6
- package/constants.js.map +1 -1
- package/createElement.js +5 -6
- package/createElement.js.map +1 -1
- package/createInput.js +85 -143
- package/createInput.js.map +1 -1
- package/createTheme.js +2 -3
- package/createTheme.js.map +1 -1
- package/dataProviders/ApiClient.js +40 -49
- package/dataProviders/ApiClient.js.map +1 -1
- package/dataProviders/DefaultDataProvider.js +56 -58
- package/dataProviders/DefaultDataProvider.js.map +1 -1
- package/dataProviders/GET_PAGE_BY_ID.js +2 -1
- package/dataProviders/GET_PAGE_BY_ID.js.map +1 -1
- package/dataProviders/GET_PAGE_BY_PATH.js +2 -1
- package/dataProviders/GET_PAGE_BY_PATH.js.map +1 -1
- package/dataProviders/LIST_PUBLISHED_PAGES.js +2 -1
- package/dataProviders/LIST_PUBLISHED_PAGES.js.map +1 -1
- package/dataProviders/NullDataProvider.js +21 -20
- package/dataProviders/NullDataProvider.js.map +1 -1
- package/dataProviders/RedirectsProvider.js +24 -27
- package/dataProviders/RedirectsProvider.js.map +1 -1
- package/defaultBreakpoints.js +23 -22
- package/defaultBreakpoints.js.map +1 -1
- package/documentOperations/$addElementReferenceToParent.js +29 -32
- package/documentOperations/$addElementReferenceToParent.js.map +1 -1
- package/documentOperations/AddElement.js +8 -7
- package/documentOperations/AddElement.js.map +1 -1
- package/documentOperations/AddToParent.js +14 -13
- package/documentOperations/AddToParent.js.map +1 -1
- package/documentOperations/IDocumentOperation.js +0 -3
- package/documentOperations/RemoveElement.js +9 -15
- package/documentOperations/RemoveElement.js.map +1 -1
- package/documentOperations/SetGlobalInputBinding.js +23 -22
- package/documentOperations/SetGlobalInputBinding.js.map +1 -1
- package/documentOperations/SetGlobalStyleBinding.js +23 -23
- package/documentOperations/SetGlobalStyleBinding.js.map +1 -1
- package/documentOperations/SetInputBindingOverride.js +30 -29
- package/documentOperations/SetInputBindingOverride.js.map +1 -1
- package/documentOperations/SetStyleBindingOverride.js +30 -31
- package/documentOperations/SetStyleBindingOverride.js.map +1 -1
- package/documentOperations/index.js +9 -8
- package/documentOperations/index.js.map +1 -1
- package/findMatchingAstNode.js +11 -13
- package/findMatchingAstNode.js.map +1 -1
- package/generateElementId.js +2 -1
- package/generateElementId.js.map +1 -1
- package/headersProvider.js +4 -3
- package/headersProvider.js.map +1 -1
- package/index.js +0 -2
- package/jsonPatch.js +5 -9
- package/jsonPatch.js.map +1 -1
- package/messages.js +12 -11
- package/messages.js.map +1 -1
- package/messenger/MessageOrigin.js +12 -11
- package/messenger/MessageOrigin.js.map +1 -1
- package/messenger/Messenger.js +58 -69
- package/messenger/Messenger.js.map +1 -1
- package/messenger/index.js +0 -2
- package/package.json +5 -5
- package/registerComponentGroup.js +5 -6
- package/registerComponentGroup.js.map +1 -1
- package/types/ShorthandCssProperties.js +0 -3
- package/types/WebsiteBuilderTheme.js +0 -3
- package/types.d.ts +3 -0
- package/types.js +0 -3
- package/IBindingsUpdater.js.map +0 -1
- package/IRedirects.js.map +0 -1
- package/documentOperations/IDocumentOperation.js.map +0 -1
- package/index.js.map +0 -1
- package/messenger/index.js.map +0 -1
- package/types/ShorthandCssProperties.js.map +0 -1
- package/types/WebsiteBuilderTheme.js.map +0 -1
- package/types.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["describe","it","expect","BindingsResolver","createSlotInput","createTextInput","ComponentManifestToAstConverter","baseElement","id","type","component","name","rootElement","state","user","bindings","inputs","text","expression","static","styles","paddingTop","inputAst","convert","resolver","resolved","resolveElement","element","elementBindings","toBe","toEqual","root","children","list","qizw1hgqjvj8g5a43szzc","title","backgroundColor","marginTop","cwld8kxy0qhhtaql42lr5","elements","parent","slot","renderer","label","fields","leftColumn","rightColumn","toBeUndefined","defaultValue","onResolved","value","input","products","$repeat","toHaveLength","invalid"],"sources":["BindingsResolver.test.ts"],"sourcesContent":["import { describe, it, expect } from \"vitest\";\nimport { BindingsResolver } from \"./BindingsResolver.js\";\nimport type {\n DocumentElement,\n DocumentState,\n DocumentElementBindings,\n DocumentBindings\n} from \"~/types.js\";\nimport { createSlotInput, createTextInput } from \"~/createInput.js\";\nimport { ComponentManifestToAstConverter } from \"~/ComponentManifestToAstConverter.js\";\n\ndescribe(\"BindingsResolver\", () => {\n const baseElement: DocumentElement = {\n id: \"test1\",\n type: \"Webiny/Element\",\n component: {\n name: \"Webiny/Text\"\n }\n };\n\n const rootElement: DocumentElement = {\n id: \"root\",\n type: \"Webiny/Element\",\n component: {\n name: \"Webiny/Root\"\n }\n };\n\n it(\"resolves input with expression binding\", () => {\n const state: DocumentState = {\n user: { name: \"Alice\" }\n };\n\n const bindings: DocumentElementBindings = {\n inputs: {\n text: {\n id: \"text\",\n type: \"text\",\n expression: \"$state.user.name\",\n static: \"Static fallback\"\n }\n },\n styles: {\n paddingTop: {\n static: \"10px\"\n }\n }\n };\n\n const inputs = [createTextInput({ name: \"text\" })];\n const inputAst = ComponentManifestToAstConverter.convert(inputs);\n const resolver = new BindingsResolver(state);\n const [resolved] = resolver.resolveElement({\n element: baseElement,\n inputAst,\n elementBindings: bindings\n });\n\n expect(resolved.inputs.text).toBe(\"Alice\");\n expect(resolved.styles).toEqual({ paddingTop: \"10px\" });\n });\n\n it(\"resolves nested objects\", () => {\n const state: DocumentState = {};\n\n const bindings: DocumentBindings = {\n root: {\n inputs: {\n children: {\n id: \"children\",\n type: \"slot\",\n list: true,\n static: [\"qizw1hgqjvj8g5a43szzc\"]\n }\n }\n },\n qizw1hgqjvj8g5a43szzc: {\n inputs: {\n title: {\n id: \"title\",\n static: \"Default Columns Title\",\n type: \"text\"\n },\n \"leftColumn/0\": {\n id: \"slot\",\n static: [\"7znyr9z2cpizegnrk2rhu\"],\n type: \"slot\",\n list: true\n },\n \"rightColumn/0\": {\n id: \"slot\",\n static: [\"cwld8kxy0qhhtaql42lr5\"],\n type: \"slot\",\n list: true\n }\n },\n styles: {\n paddingTop: {\n static: \"20px\"\n },\n backgroundColor: {\n static: \"#5c9a12\"\n }\n }\n },\n \"7znyr9z2cpizegnrk2rhu\": {\n inputs: {\n title: {\n id: \"title\",\n static: \"Left Column Title\",\n type: \"text\"\n },\n children: {\n id: \"slot\",\n static: [],\n type: \"slot\",\n list: true\n }\n },\n styles: {\n backgroundColor: {\n static: \"red\"\n },\n marginTop: {\n static: \"20px\"\n }\n }\n },\n cwld8kxy0qhhtaql42lr5: {\n inputs: {\n title: {\n id: \"title\",\n static: \"Right Column Title\",\n type: \"text\"\n },\n children: {\n id: \"slot\",\n static: [],\n type: \"slot\",\n list: true\n }\n },\n styles: {\n backgroundColor: {\n static: \"blue\"\n },\n marginTop: {\n static: \"20px\"\n }\n }\n }\n };\n\n const elements = {\n root: {\n type: \"Webiny/Element\",\n id: \"root\",\n component: {\n name: \"Webiny/Root\"\n }\n },\n qizw1hgqjvj8g5a43szzc: {\n type: \"Webiny/Element\",\n id: \"qizw1hgqjvj8g5a43szzc\",\n parent: {\n id: \"root\",\n slot: \"children\"\n },\n component: {\n name: \"Webiny/TwoColumns\"\n }\n },\n \"7znyr9z2cpizegnrk2rhu\": {\n type: \"Webiny/Element\",\n id: \"7znyr9z2cpizegnrk2rhu\",\n parent: {\n id: \"qizw1hgqjvj8g5a43szzc\",\n slot: \"leftColumn/0\"\n },\n component: {\n name: \"Webiny/TextWithDropzone\"\n }\n },\n cwld8kxy0qhhtaql42lr5: {\n type: \"Webiny/Element\",\n id: \"cwld8kxy0qhhtaql42lr5\",\n parent: {\n id: \"qizw1hgqjvj8g5a43szzc\",\n slot: \"rightColumn/0\"\n },\n component: {\n name: \"Webiny/TextWithDropzone\"\n }\n }\n };\n\n const inputs = [\n {\n type: \"text\",\n renderer: \"Webiny/Input\",\n name: \"title\",\n label: \"Title\",\n fields: []\n },\n {\n type: \"slot\",\n list: true,\n renderer: \"Webiny/Slot\",\n name: \"leftColumn\",\n fields: []\n },\n {\n type: \"slot\",\n list: true,\n renderer: \"Webiny/Slot\",\n name: \"rightColumn\",\n fields: []\n }\n ];\n const inputAst = ComponentManifestToAstConverter.convert(inputs);\n const resolver = new BindingsResolver(state);\n const [resolved] = resolver.resolveElement({\n element: elements[\"qizw1hgqjvj8g5a43szzc\"] as DocumentElement,\n inputAst,\n elementBindings: bindings[\"qizw1hgqjvj8g5a43szzc\"]\n });\n\n expect(resolved.inputs.title).toBe(\"Default Columns Title\");\n expect(resolved.inputs.leftColumn).toEqual([[\"7znyr9z2cpizegnrk2rhu\"]]);\n expect(resolved.inputs.rightColumn).toEqual([[\"cwld8kxy0qhhtaql42lr5\"]]);\n });\n\n it(\"falls back to static if no expression is provided\", () => {\n const state: DocumentState = {};\n\n const bindings: DocumentElementBindings = {\n inputs: {\n text: {\n id: \"text\",\n type: \"text\",\n static: \"Static only\"\n }\n }\n };\n\n const inputs = [createTextInput({ name: \"text\" })];\n const inputAst = ComponentManifestToAstConverter.convert(inputs);\n const resolver = new BindingsResolver(state);\n const [resolved] = resolver.resolveElement({\n element: baseElement,\n inputAst,\n elementBindings: bindings\n });\n\n expect(resolved.inputs.text).toBe(\"Static only\");\n });\n\n it(\"uses undefined if expression fails and no static exists\", () => {\n const state: DocumentState = {};\n\n const bindings: DocumentElementBindings = {\n inputs: {\n text: {\n id: \"text\",\n type: \"text\",\n static: \"Fallback\",\n expression: \"$.unknown.value\"\n }\n }\n };\n\n const inputs = [createTextInput({ name: \"text\" })];\n const inputAst = ComponentManifestToAstConverter.convert(inputs);\n const resolver = new BindingsResolver(state);\n const [resolved] = resolver.resolveElement({\n element: baseElement,\n inputAst,\n elementBindings: bindings\n });\n\n expect(resolved.inputs.text).toBeUndefined();\n });\n\n it(\"uses input's `defaultValue` if binding doesn't exist\", () => {\n const state: DocumentState = {};\n\n const bindings: DocumentElementBindings = {\n inputs: {}\n };\n\n const inputs = [createSlotInput({ name: \"children\", defaultValue: [] })];\n const inputAst = ComponentManifestToAstConverter.convert(inputs);\n const resolver = new BindingsResolver(state);\n const [resolved] = resolver.resolveElement({\n element: rootElement,\n inputAst,\n elementBindings: bindings,\n onResolved(value, input) {\n if (input.type === \"slot\") {\n return \"slot\";\n }\n\n return value;\n }\n });\n\n expect(resolved.inputs.children).toEqual(\"slot\");\n });\n\n it(\"handles $repeat using expression and maps items\", () => {\n const state: DocumentState = {\n products: [{ title: \"Shirt\" }, { title: \"Hat\" }]\n };\n\n const bindings: DocumentElementBindings = {\n $repeat: {\n expression: \"$state.products\"\n },\n inputs: {\n text: {\n id: \"text\",\n type: \"text\",\n expression: \"$.title\",\n static: \"Unnamed\"\n }\n }\n };\n\n const inputs = [createTextInput({ name: \"text\" })];\n const inputAst = ComponentManifestToAstConverter.convert(inputs);\n const resolver = new BindingsResolver(state);\n const resolved = resolver.resolveElement({\n element: baseElement,\n inputAst,\n elementBindings: bindings\n });\n\n expect(resolved).toHaveLength(2);\n expect(resolved[0].inputs.text).toBe(\"Shirt\");\n expect(resolved[1].inputs.text).toBe(\"Hat\");\n });\n\n it(\"returns empty array if $repeat doesn't resolve to an array\", () => {\n const state: DocumentState = {\n invalid: 42\n };\n\n const bindings: DocumentElementBindings = {\n $repeat: {\n expression: \"$state.invalid\"\n },\n inputs: {\n text: {\n id: \"text\",\n type: \"text\",\n static: \"Should not be used\"\n }\n }\n };\n\n const inputs = [createTextInput({ name: \"text\" })];\n const inputAst = ComponentManifestToAstConverter.convert(inputs);\n const resolver = new BindingsResolver(state);\n const resolved = resolver.resolveElement({\n element: baseElement,\n inputAst,\n elementBindings: bindings\n });\n\n expect(resolved).toEqual([]);\n });\n\n it(\"resolves binding that refers to a specific array index\", () => {\n const state: DocumentState = {\n list: [{ text: \"First item text\" }, { text: \"Second item text\" }]\n };\n\n const bindings: DocumentElementBindings = {\n inputs: {\n text: {\n id: \"text\",\n type: \"text\",\n static: \"Static fallback\",\n expression: \"$state.list.0.text\"\n }\n }\n };\n\n const inputs = [createTextInput({ name: \"text\" })];\n const inputAst = ComponentManifestToAstConverter.convert(inputs);\n const resolver = new BindingsResolver(state);\n const [resolved] = resolver.resolveElement({\n element: baseElement,\n inputAst,\n elementBindings: bindings\n });\n\n expect(resolved.inputs.text).toBe(\"First item text\");\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"BindingsResolver.test.js","sources":["../src/BindingsResolver.test.ts"],"sourcesContent":["import { describe, it, expect } from \"vitest\";\nimport { BindingsResolver } from \"./BindingsResolver.js\";\nimport type {\n DocumentElement,\n DocumentState,\n DocumentElementBindings,\n DocumentBindings\n} from \"~/types.js\";\nimport { createSlotInput, createTextInput } from \"~/createInput.js\";\nimport { ComponentManifestToAstConverter } from \"~/ComponentManifestToAstConverter.js\";\n\ndescribe(\"BindingsResolver\", () => {\n const baseElement: DocumentElement = {\n id: \"test1\",\n type: \"Webiny/Element\",\n component: {\n name: \"Webiny/Text\"\n }\n };\n\n const rootElement: DocumentElement = {\n id: \"root\",\n type: \"Webiny/Element\",\n component: {\n name: \"Webiny/Root\"\n }\n };\n\n it(\"resolves input with expression binding\", () => {\n const state: DocumentState = {\n user: { name: \"Alice\" }\n };\n\n const bindings: DocumentElementBindings = {\n inputs: {\n text: {\n id: \"text\",\n type: \"text\",\n expression: \"$state.user.name\",\n static: \"Static fallback\"\n }\n },\n styles: {\n paddingTop: {\n static: \"10px\"\n }\n }\n };\n\n const inputs = [createTextInput({ name: \"text\" })];\n const inputAst = ComponentManifestToAstConverter.convert(inputs);\n const resolver = new BindingsResolver(state);\n const [resolved] = resolver.resolveElement({\n element: baseElement,\n inputAst,\n elementBindings: bindings\n });\n\n expect(resolved.inputs.text).toBe(\"Alice\");\n expect(resolved.styles).toEqual({ paddingTop: \"10px\" });\n });\n\n it(\"resolves nested objects\", () => {\n const state: DocumentState = {};\n\n const bindings: DocumentBindings = {\n root: {\n inputs: {\n children: {\n id: \"children\",\n type: \"slot\",\n list: true,\n static: [\"qizw1hgqjvj8g5a43szzc\"]\n }\n }\n },\n qizw1hgqjvj8g5a43szzc: {\n inputs: {\n title: {\n id: \"title\",\n static: \"Default Columns Title\",\n type: \"text\"\n },\n \"leftColumn/0\": {\n id: \"slot\",\n static: [\"7znyr9z2cpizegnrk2rhu\"],\n type: \"slot\",\n list: true\n },\n \"rightColumn/0\": {\n id: \"slot\",\n static: [\"cwld8kxy0qhhtaql42lr5\"],\n type: \"slot\",\n list: true\n }\n },\n styles: {\n paddingTop: {\n static: \"20px\"\n },\n backgroundColor: {\n static: \"#5c9a12\"\n }\n }\n },\n \"7znyr9z2cpizegnrk2rhu\": {\n inputs: {\n title: {\n id: \"title\",\n static: \"Left Column Title\",\n type: \"text\"\n },\n children: {\n id: \"slot\",\n static: [],\n type: \"slot\",\n list: true\n }\n },\n styles: {\n backgroundColor: {\n static: \"red\"\n },\n marginTop: {\n static: \"20px\"\n }\n }\n },\n cwld8kxy0qhhtaql42lr5: {\n inputs: {\n title: {\n id: \"title\",\n static: \"Right Column Title\",\n type: \"text\"\n },\n children: {\n id: \"slot\",\n static: [],\n type: \"slot\",\n list: true\n }\n },\n styles: {\n backgroundColor: {\n static: \"blue\"\n },\n marginTop: {\n static: \"20px\"\n }\n }\n }\n };\n\n const elements = {\n root: {\n type: \"Webiny/Element\",\n id: \"root\",\n component: {\n name: \"Webiny/Root\"\n }\n },\n qizw1hgqjvj8g5a43szzc: {\n type: \"Webiny/Element\",\n id: \"qizw1hgqjvj8g5a43szzc\",\n parent: {\n id: \"root\",\n slot: \"children\"\n },\n component: {\n name: \"Webiny/TwoColumns\"\n }\n },\n \"7znyr9z2cpizegnrk2rhu\": {\n type: \"Webiny/Element\",\n id: \"7znyr9z2cpizegnrk2rhu\",\n parent: {\n id: \"qizw1hgqjvj8g5a43szzc\",\n slot: \"leftColumn/0\"\n },\n component: {\n name: \"Webiny/TextWithDropzone\"\n }\n },\n cwld8kxy0qhhtaql42lr5: {\n type: \"Webiny/Element\",\n id: \"cwld8kxy0qhhtaql42lr5\",\n parent: {\n id: \"qizw1hgqjvj8g5a43szzc\",\n slot: \"rightColumn/0\"\n },\n component: {\n name: \"Webiny/TextWithDropzone\"\n }\n }\n };\n\n const inputs = [\n {\n type: \"text\",\n renderer: \"Webiny/Input\",\n name: \"title\",\n label: \"Title\",\n fields: []\n },\n {\n type: \"slot\",\n list: true,\n renderer: \"Webiny/Slot\",\n name: \"leftColumn\",\n fields: []\n },\n {\n type: \"slot\",\n list: true,\n renderer: \"Webiny/Slot\",\n name: \"rightColumn\",\n fields: []\n }\n ];\n const inputAst = ComponentManifestToAstConverter.convert(inputs);\n const resolver = new BindingsResolver(state);\n const [resolved] = resolver.resolveElement({\n element: elements[\"qizw1hgqjvj8g5a43szzc\"] as DocumentElement,\n inputAst,\n elementBindings: bindings[\"qizw1hgqjvj8g5a43szzc\"]\n });\n\n expect(resolved.inputs.title).toBe(\"Default Columns Title\");\n expect(resolved.inputs.leftColumn).toEqual([[\"7znyr9z2cpizegnrk2rhu\"]]);\n expect(resolved.inputs.rightColumn).toEqual([[\"cwld8kxy0qhhtaql42lr5\"]]);\n });\n\n it(\"falls back to static if no expression is provided\", () => {\n const state: DocumentState = {};\n\n const bindings: DocumentElementBindings = {\n inputs: {\n text: {\n id: \"text\",\n type: \"text\",\n static: \"Static only\"\n }\n }\n };\n\n const inputs = [createTextInput({ name: \"text\" })];\n const inputAst = ComponentManifestToAstConverter.convert(inputs);\n const resolver = new BindingsResolver(state);\n const [resolved] = resolver.resolveElement({\n element: baseElement,\n inputAst,\n elementBindings: bindings\n });\n\n expect(resolved.inputs.text).toBe(\"Static only\");\n });\n\n it(\"uses undefined if expression fails and no static exists\", () => {\n const state: DocumentState = {};\n\n const bindings: DocumentElementBindings = {\n inputs: {\n text: {\n id: \"text\",\n type: \"text\",\n static: \"Fallback\",\n expression: \"$.unknown.value\"\n }\n }\n };\n\n const inputs = [createTextInput({ name: \"text\" })];\n const inputAst = ComponentManifestToAstConverter.convert(inputs);\n const resolver = new BindingsResolver(state);\n const [resolved] = resolver.resolveElement({\n element: baseElement,\n inputAst,\n elementBindings: bindings\n });\n\n expect(resolved.inputs.text).toBeUndefined();\n });\n\n it(\"uses input's `defaultValue` if binding doesn't exist\", () => {\n const state: DocumentState = {};\n\n const bindings: DocumentElementBindings = {\n inputs: {}\n };\n\n const inputs = [createSlotInput({ name: \"children\", defaultValue: [] })];\n const inputAst = ComponentManifestToAstConverter.convert(inputs);\n const resolver = new BindingsResolver(state);\n const [resolved] = resolver.resolveElement({\n element: rootElement,\n inputAst,\n elementBindings: bindings,\n onResolved(value, input) {\n if (input.type === \"slot\") {\n return \"slot\";\n }\n\n return value;\n }\n });\n\n expect(resolved.inputs.children).toEqual(\"slot\");\n });\n\n it(\"handles $repeat using expression and maps items\", () => {\n const state: DocumentState = {\n products: [{ title: \"Shirt\" }, { title: \"Hat\" }]\n };\n\n const bindings: DocumentElementBindings = {\n $repeat: {\n expression: \"$state.products\"\n },\n inputs: {\n text: {\n id: \"text\",\n type: \"text\",\n expression: \"$.title\",\n static: \"Unnamed\"\n }\n }\n };\n\n const inputs = [createTextInput({ name: \"text\" })];\n const inputAst = ComponentManifestToAstConverter.convert(inputs);\n const resolver = new BindingsResolver(state);\n const resolved = resolver.resolveElement({\n element: baseElement,\n inputAst,\n elementBindings: bindings\n });\n\n expect(resolved).toHaveLength(2);\n expect(resolved[0].inputs.text).toBe(\"Shirt\");\n expect(resolved[1].inputs.text).toBe(\"Hat\");\n });\n\n it(\"returns empty array if $repeat doesn't resolve to an array\", () => {\n const state: DocumentState = {\n invalid: 42\n };\n\n const bindings: DocumentElementBindings = {\n $repeat: {\n expression: \"$state.invalid\"\n },\n inputs: {\n text: {\n id: \"text\",\n type: \"text\",\n static: \"Should not be used\"\n }\n }\n };\n\n const inputs = [createTextInput({ name: \"text\" })];\n const inputAst = ComponentManifestToAstConverter.convert(inputs);\n const resolver = new BindingsResolver(state);\n const resolved = resolver.resolveElement({\n element: baseElement,\n inputAst,\n elementBindings: bindings\n });\n\n expect(resolved).toEqual([]);\n });\n\n it(\"resolves binding that refers to a specific array index\", () => {\n const state: DocumentState = {\n list: [{ text: \"First item text\" }, { text: \"Second item text\" }]\n };\n\n const bindings: DocumentElementBindings = {\n inputs: {\n text: {\n id: \"text\",\n type: \"text\",\n static: \"Static fallback\",\n expression: \"$state.list.0.text\"\n }\n }\n };\n\n const inputs = [createTextInput({ name: \"text\" })];\n const inputAst = ComponentManifestToAstConverter.convert(inputs);\n const resolver = new BindingsResolver(state);\n const [resolved] = resolver.resolveElement({\n element: baseElement,\n inputAst,\n elementBindings: bindings\n });\n\n expect(resolved.inputs.text).toBe(\"First item text\");\n });\n});\n"],"names":["describe","baseElement","rootElement","it","state","bindings","inputs","createTextInput","inputAst","ComponentManifestToAstConverter","resolver","BindingsResolver","resolved","expect","elements","createSlotInput","value","input"],"mappings":";;;;AAWAA,SAAS,oBAAoB;IACzB,MAAMC,cAA+B;QACjC,IAAI;QACJ,MAAM;QACN,WAAW;YACP,MAAM;QACV;IACJ;IAEA,MAAMC,cAA+B;QACjC,IAAI;QACJ,MAAM;QACN,WAAW;YACP,MAAM;QACV;IACJ;IAEAC,GAAG,0CAA0C;QACzC,MAAMC,QAAuB;YACzB,MAAM;gBAAE,MAAM;YAAQ;QAC1B;QAEA,MAAMC,WAAoC;YACtC,QAAQ;gBACJ,MAAM;oBACF,IAAI;oBACJ,MAAM;oBACN,YAAY;oBACZ,QAAQ;gBACZ;YACJ;YACA,QAAQ;gBACJ,YAAY;oBACR,QAAQ;gBACZ;YACJ;QACJ;QAEA,MAAMC,SAAS;YAACC,gBAAgB;gBAAE,MAAM;YAAO;SAAG;QAClD,MAAMC,WAAWC,gCAAgC,OAAO,CAACH;QACzD,MAAMI,WAAW,IAAIC,iBAAiBP;QACtC,MAAM,CAACQ,SAAS,GAAGF,SAAS,cAAc,CAAC;YACvC,SAAST;YACTO;YACA,iBAAiBH;QACrB;QAEAQ,OAAOD,SAAS,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;QAClCC,OAAOD,SAAS,MAAM,EAAE,OAAO,CAAC;YAAE,YAAY;QAAO;IACzD;IAEAT,GAAG,2BAA2B;QAC1B,MAAMC,QAAuB,CAAC;QAE9B,MAAMC,WAA6B;YAC/B,MAAM;gBACF,QAAQ;oBACJ,UAAU;wBACN,IAAI;wBACJ,MAAM;wBACN,MAAM;wBACN,QAAQ;4BAAC;yBAAwB;oBACrC;gBACJ;YACJ;YACA,uBAAuB;gBACnB,QAAQ;oBACJ,OAAO;wBACH,IAAI;wBACJ,QAAQ;wBACR,MAAM;oBACV;oBACA,gBAAgB;wBACZ,IAAI;wBACJ,QAAQ;4BAAC;yBAAwB;wBACjC,MAAM;wBACN,MAAM;oBACV;oBACA,iBAAiB;wBACb,IAAI;wBACJ,QAAQ;4BAAC;yBAAwB;wBACjC,MAAM;wBACN,MAAM;oBACV;gBACJ;gBACA,QAAQ;oBACJ,YAAY;wBACR,QAAQ;oBACZ;oBACA,iBAAiB;wBACb,QAAQ;oBACZ;gBACJ;YACJ;YACA,yBAAyB;gBACrB,QAAQ;oBACJ,OAAO;wBACH,IAAI;wBACJ,QAAQ;wBACR,MAAM;oBACV;oBACA,UAAU;wBACN,IAAI;wBACJ,QAAQ,EAAE;wBACV,MAAM;wBACN,MAAM;oBACV;gBACJ;gBACA,QAAQ;oBACJ,iBAAiB;wBACb,QAAQ;oBACZ;oBACA,WAAW;wBACP,QAAQ;oBACZ;gBACJ;YACJ;YACA,uBAAuB;gBACnB,QAAQ;oBACJ,OAAO;wBACH,IAAI;wBACJ,QAAQ;wBACR,MAAM;oBACV;oBACA,UAAU;wBACN,IAAI;wBACJ,QAAQ,EAAE;wBACV,MAAM;wBACN,MAAM;oBACV;gBACJ;gBACA,QAAQ;oBACJ,iBAAiB;wBACb,QAAQ;oBACZ;oBACA,WAAW;wBACP,QAAQ;oBACZ;gBACJ;YACJ;QACJ;QAEA,MAAMS,WAAW;YACb,MAAM;gBACF,MAAM;gBACN,IAAI;gBACJ,WAAW;oBACP,MAAM;gBACV;YACJ;YACA,uBAAuB;gBACnB,MAAM;gBACN,IAAI;gBACJ,QAAQ;oBACJ,IAAI;oBACJ,MAAM;gBACV;gBACA,WAAW;oBACP,MAAM;gBACV;YACJ;YACA,yBAAyB;gBACrB,MAAM;gBACN,IAAI;gBACJ,QAAQ;oBACJ,IAAI;oBACJ,MAAM;gBACV;gBACA,WAAW;oBACP,MAAM;gBACV;YACJ;YACA,uBAAuB;gBACnB,MAAM;gBACN,IAAI;gBACJ,QAAQ;oBACJ,IAAI;oBACJ,MAAM;gBACV;gBACA,WAAW;oBACP,MAAM;gBACV;YACJ;QACJ;QAEA,MAAMR,SAAS;YACX;gBACI,MAAM;gBACN,UAAU;gBACV,MAAM;gBACN,OAAO;gBACP,QAAQ,EAAE;YACd;YACA;gBACI,MAAM;gBACN,MAAM;gBACN,UAAU;gBACV,MAAM;gBACN,QAAQ,EAAE;YACd;YACA;gBACI,MAAM;gBACN,MAAM;gBACN,UAAU;gBACV,MAAM;gBACN,QAAQ,EAAE;YACd;SACH;QACD,MAAME,WAAWC,gCAAgC,OAAO,CAACH;QACzD,MAAMI,WAAW,IAAIC,iBAAiBP;QACtC,MAAM,CAACQ,SAAS,GAAGF,SAAS,cAAc,CAAC;YACvC,SAASI,QAAQ,CAAC,wBAAwB;YAC1CN;YACA,iBAAiBH,QAAQ,CAAC,wBAAwB;QACtD;QAEAQ,OAAOD,SAAS,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC;QACnCC,OAAOD,SAAS,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC;YAAC;gBAAC;aAAwB;SAAC;QACtEC,OAAOD,SAAS,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC;YAAC;gBAAC;aAAwB;SAAC;IAC3E;IAEAT,GAAG,qDAAqD;QACpD,MAAMC,QAAuB,CAAC;QAE9B,MAAMC,WAAoC;YACtC,QAAQ;gBACJ,MAAM;oBACF,IAAI;oBACJ,MAAM;oBACN,QAAQ;gBACZ;YACJ;QACJ;QAEA,MAAMC,SAAS;YAACC,gBAAgB;gBAAE,MAAM;YAAO;SAAG;QAClD,MAAMC,WAAWC,gCAAgC,OAAO,CAACH;QACzD,MAAMI,WAAW,IAAIC,iBAAiBP;QACtC,MAAM,CAACQ,SAAS,GAAGF,SAAS,cAAc,CAAC;YACvC,SAAST;YACTO;YACA,iBAAiBH;QACrB;QAEAQ,OAAOD,SAAS,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;IACtC;IAEAT,GAAG,2DAA2D;QAC1D,MAAMC,QAAuB,CAAC;QAE9B,MAAMC,WAAoC;YACtC,QAAQ;gBACJ,MAAM;oBACF,IAAI;oBACJ,MAAM;oBACN,QAAQ;oBACR,YAAY;gBAChB;YACJ;QACJ;QAEA,MAAMC,SAAS;YAACC,gBAAgB;gBAAE,MAAM;YAAO;SAAG;QAClD,MAAMC,WAAWC,gCAAgC,OAAO,CAACH;QACzD,MAAMI,WAAW,IAAIC,iBAAiBP;QACtC,MAAM,CAACQ,SAAS,GAAGF,SAAS,cAAc,CAAC;YACvC,SAAST;YACTO;YACA,iBAAiBH;QACrB;QAEAQ,OAAOD,SAAS,MAAM,CAAC,IAAI,EAAE,aAAa;IAC9C;IAEAT,GAAG,wDAAwD;QACvD,MAAMC,QAAuB,CAAC;QAE9B,MAAMC,WAAoC;YACtC,QAAQ,CAAC;QACb;QAEA,MAAMC,SAAS;YAACS,gBAAgB;gBAAE,MAAM;gBAAY,cAAc,EAAE;YAAC;SAAG;QACxE,MAAMP,WAAWC,gCAAgC,OAAO,CAACH;QACzD,MAAMI,WAAW,IAAIC,iBAAiBP;QACtC,MAAM,CAACQ,SAAS,GAAGF,SAAS,cAAc,CAAC;YACvC,SAASR;YACTM;YACA,iBAAiBH;YACjB,YAAWW,KAAK,EAAEC,KAAK;gBACnB,IAAIA,AAAe,WAAfA,MAAM,IAAI,EACV,OAAO;gBAGX,OAAOD;YACX;QACJ;QAEAH,OAAOD,SAAS,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC7C;IAEAT,GAAG,mDAAmD;QAClD,MAAMC,QAAuB;YACzB,UAAU;gBAAC;oBAAE,OAAO;gBAAQ;gBAAG;oBAAE,OAAO;gBAAM;aAAE;QACpD;QAEA,MAAMC,WAAoC;YACtC,SAAS;gBACL,YAAY;YAChB;YACA,QAAQ;gBACJ,MAAM;oBACF,IAAI;oBACJ,MAAM;oBACN,YAAY;oBACZ,QAAQ;gBACZ;YACJ;QACJ;QAEA,MAAMC,SAAS;YAACC,gBAAgB;gBAAE,MAAM;YAAO;SAAG;QAClD,MAAMC,WAAWC,gCAAgC,OAAO,CAACH;QACzD,MAAMI,WAAW,IAAIC,iBAAiBP;QACtC,MAAMQ,WAAWF,SAAS,cAAc,CAAC;YACrC,SAAST;YACTO;YACA,iBAAiBH;QACrB;QAEAQ,OAAOD,UAAU,YAAY,CAAC;QAC9BC,OAAOD,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;QACrCC,OAAOD,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;IACzC;IAEAT,GAAG,8DAA8D;QAC7D,MAAMC,QAAuB;YACzB,SAAS;QACb;QAEA,MAAMC,WAAoC;YACtC,SAAS;gBACL,YAAY;YAChB;YACA,QAAQ;gBACJ,MAAM;oBACF,IAAI;oBACJ,MAAM;oBACN,QAAQ;gBACZ;YACJ;QACJ;QAEA,MAAMC,SAAS;YAACC,gBAAgB;gBAAE,MAAM;YAAO;SAAG;QAClD,MAAMC,WAAWC,gCAAgC,OAAO,CAACH;QACzD,MAAMI,WAAW,IAAIC,iBAAiBP;QACtC,MAAMQ,WAAWF,SAAS,cAAc,CAAC;YACrC,SAAST;YACTO;YACA,iBAAiBH;QACrB;QAEAQ,OAAOD,UAAU,OAAO,CAAC,EAAE;IAC/B;IAEAT,GAAG,0DAA0D;QACzD,MAAMC,QAAuB;YACzB,MAAM;gBAAC;oBAAE,MAAM;gBAAkB;gBAAG;oBAAE,MAAM;gBAAmB;aAAE;QACrE;QAEA,MAAMC,WAAoC;YACtC,QAAQ;gBACJ,MAAM;oBACF,IAAI;oBACJ,MAAM;oBACN,QAAQ;oBACR,YAAY;gBAChB;YACJ;QACJ;QAEA,MAAMC,SAAS;YAACC,gBAAgB;gBAAE,MAAM;YAAO;SAAG;QAClD,MAAMC,WAAWC,gCAAgC,OAAO,CAACH;QACzD,MAAMI,WAAW,IAAIC,iBAAiBP;QACtC,MAAM,CAACQ,SAAS,GAAGF,SAAS,cAAc,CAAC;YACvC,SAAST;YACTO;YACA,iBAAiBH;QACrB;QAEAQ,OAAOD,SAAS,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;IACtC;AACJ"}
|
|
@@ -1,56 +1,35 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* ComponentInputTraverser
|
|
5
|
-
*
|
|
6
|
-
* Walks an input AST and a matching data object,
|
|
7
|
-
* invoking `visitor` for each leaf value found.
|
|
8
|
-
*/
|
|
9
|
-
export class ComponentInputTraverser {
|
|
10
|
-
constructor(ast) {
|
|
11
|
-
this.ast = ast;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Traverse the given `data` object according to the AST,
|
|
16
|
-
* calling `visitor(node, path, value)` for each leaf.
|
|
17
|
-
*/
|
|
18
|
-
traverse(data, visitor) {
|
|
19
|
-
for (const node of this.ast) {
|
|
20
|
-
const rootValue = data[node.name];
|
|
21
|
-
this.traverseNode(node, rootValue, node.name, visitor);
|
|
1
|
+
class ComponentInputTraverser {
|
|
2
|
+
constructor(ast){
|
|
3
|
+
this.ast = ast;
|
|
22
4
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
if (value.length === 0) {
|
|
28
|
-
visitor(node, currentPath, value);
|
|
29
|
-
}
|
|
30
|
-
value.forEach((item, index) => {
|
|
31
|
-
if (node.children.length > 0) {
|
|
32
|
-
const itemPath = `${currentPath}/${index}`;
|
|
33
|
-
for (const child of node.children) {
|
|
34
|
-
const childValue = item?.[child.name];
|
|
35
|
-
const childPath = `${itemPath}/${child.name}`;
|
|
36
|
-
this.traverseNode(child, childValue, childPath, visitor);
|
|
37
|
-
}
|
|
38
|
-
} else {
|
|
39
|
-
visitor(node, currentPath, item);
|
|
5
|
+
traverse(data, visitor) {
|
|
6
|
+
for (const node of this.ast){
|
|
7
|
+
const rootValue = data[node.name];
|
|
8
|
+
this.traverseNode(node, rootValue, node.name, visitor);
|
|
40
9
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
10
|
+
}
|
|
11
|
+
traverseNode(node, value, currentPath, visitor) {
|
|
12
|
+
if (node.list) {
|
|
13
|
+
value = value ?? [];
|
|
14
|
+
if (0 === value.length) visitor(node, currentPath, value);
|
|
15
|
+
value.forEach((item, index)=>{
|
|
16
|
+
if (node.children.length > 0) {
|
|
17
|
+
const itemPath = `${currentPath}/${index}`;
|
|
18
|
+
for (const child of node.children){
|
|
19
|
+
const childValue = item?.[child.name];
|
|
20
|
+
const childPath = `${itemPath}/${child.name}`;
|
|
21
|
+
this.traverseNode(child, childValue, childPath, visitor);
|
|
22
|
+
}
|
|
23
|
+
} else visitor(node, currentPath, item);
|
|
24
|
+
});
|
|
25
|
+
} else if (node.children.length > 0) for (const child of node.children){
|
|
26
|
+
const childValue = value?.[child.name];
|
|
27
|
+
const childPath = `${currentPath}/${child.name}`;
|
|
28
|
+
this.traverseNode(child, childValue, childPath, visitor);
|
|
48
29
|
}
|
|
49
|
-
|
|
50
|
-
visitor(node, currentPath, value);
|
|
51
|
-
}
|
|
30
|
+
else visitor(node, currentPath, value);
|
|
52
31
|
}
|
|
53
|
-
}
|
|
54
32
|
}
|
|
33
|
+
export { ComponentInputTraverser };
|
|
55
34
|
|
|
56
35
|
//# sourceMappingURL=ComponentInputTraverser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"ComponentInputTraverser.js","sources":["../src/ComponentInputTraverser.ts"],"sourcesContent":["import type { InputAstNode } from \"./ComponentManifestToAstConverter.js\";\n\n// Visitor signature: called for every resolved leaf\nexport type InputVisitor = (node: InputAstNode, path: string, value: any) => void;\n\n/**\n * ComponentInputTraverser\n *\n * Walks an input AST and a matching data object,\n * invoking `visitor` for each leaf value found.\n */\nexport class ComponentInputTraverser {\n private readonly ast: InputAstNode[];\n\n constructor(ast: InputAstNode[]) {\n this.ast = ast;\n }\n\n /**\n * Traverse the given `data` object according to the AST,\n * calling `visitor(node, path, value)` for each leaf.\n */\n public traverse(data: Record<string, any>, visitor: InputVisitor): void {\n for (const node of this.ast) {\n const rootValue = data[node.name];\n this.traverseNode(node, rootValue, node.name, visitor);\n }\n }\n\n private traverseNode(\n node: InputAstNode,\n value: any,\n currentPath: string,\n visitor: InputVisitor\n ): void {\n if (node.list) {\n value = value ?? [];\n\n if (value.length === 0) {\n visitor(node, currentPath, value);\n }\n\n value.forEach((item: any, index: number) => {\n if (node.children.length > 0) {\n const itemPath = `${currentPath}/${index}`;\n for (const child of node.children) {\n const childValue = item?.[child.name];\n const childPath = `${itemPath}/${child.name}`;\n this.traverseNode(child, childValue, childPath, visitor);\n }\n } else {\n visitor(node, currentPath, item);\n }\n });\n } else {\n if (node.children.length > 0) {\n for (const child of node.children) {\n const childValue = value?.[child.name];\n const childPath = `${currentPath}/${child.name}`;\n this.traverseNode(child, childValue, childPath, visitor);\n }\n } else {\n visitor(node, currentPath, value);\n }\n }\n }\n}\n"],"names":["ComponentInputTraverser","ast","data","visitor","node","rootValue","value","currentPath","item","index","itemPath","child","childValue","childPath"],"mappings":"AAWO,MAAMA;IAGT,YAAYC,GAAmB,CAAE;QAC7B,IAAI,CAAC,GAAG,GAAGA;IACf;IAMO,SAASC,IAAyB,EAAEC,OAAqB,EAAQ;QACpE,KAAK,MAAMC,QAAQ,IAAI,CAAC,GAAG,CAAE;YACzB,MAAMC,YAAYH,IAAI,CAACE,KAAK,IAAI,CAAC;YACjC,IAAI,CAAC,YAAY,CAACA,MAAMC,WAAWD,KAAK,IAAI,EAAED;QAClD;IACJ;IAEQ,aACJC,IAAkB,EAClBE,KAAU,EACVC,WAAmB,EACnBJ,OAAqB,EACjB;QACJ,IAAIC,KAAK,IAAI,EAAE;YACXE,QAAQA,SAAS,EAAE;YAEnB,IAAIA,AAAiB,MAAjBA,MAAM,MAAM,EACZH,QAAQC,MAAMG,aAAaD;YAG/BA,MAAM,OAAO,CAAC,CAACE,MAAWC;gBACtB,IAAIL,KAAK,QAAQ,CAAC,MAAM,GAAG,GAAG;oBAC1B,MAAMM,WAAW,GAAGH,YAAY,CAAC,EAAEE,OAAO;oBAC1C,KAAK,MAAME,SAASP,KAAK,QAAQ,CAAE;wBAC/B,MAAMQ,aAAaJ,MAAM,CAACG,MAAM,IAAI,CAAC;wBACrC,MAAME,YAAY,GAAGH,SAAS,CAAC,EAAEC,MAAM,IAAI,EAAE;wBAC7C,IAAI,CAAC,YAAY,CAACA,OAAOC,YAAYC,WAAWV;oBACpD;gBACJ,OACIA,QAAQC,MAAMG,aAAaC;YAEnC;QACJ,OACI,IAAIJ,KAAK,QAAQ,CAAC,MAAM,GAAG,GACvB,KAAK,MAAMO,SAASP,KAAK,QAAQ,CAAE;YAC/B,MAAMQ,aAAaN,OAAO,CAACK,MAAM,IAAI,CAAC;YACtC,MAAME,YAAY,GAAGN,YAAY,CAAC,EAAEI,MAAM,IAAI,EAAE;YAChD,IAAI,CAAC,YAAY,CAACA,OAAOC,YAAYC,WAAWV;QACpD;aAEAA,QAAQC,MAAMG,aAAaD;IAGvC;AACJ"}
|
|
@@ -1,24 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
});
|
|
21
|
-
}
|
|
1
|
+
class ComponentManifestToAstConverter {
|
|
2
|
+
static convert(inputs) {
|
|
3
|
+
return this.buildAst(inputs);
|
|
4
|
+
}
|
|
5
|
+
static buildAst(inputs, basePath = "") {
|
|
6
|
+
return inputs.map((input)=>{
|
|
7
|
+
const path = basePath ? `${basePath}/${input.name}` : input.name;
|
|
8
|
+
const node = {
|
|
9
|
+
name: input.name,
|
|
10
|
+
type: input.type,
|
|
11
|
+
list: input.list || false,
|
|
12
|
+
path,
|
|
13
|
+
children: [],
|
|
14
|
+
input
|
|
15
|
+
};
|
|
16
|
+
if ("object" === input.type && input.fields) node.children = this.buildAst(input.fields, path);
|
|
17
|
+
return node;
|
|
18
|
+
});
|
|
19
|
+
}
|
|
22
20
|
}
|
|
21
|
+
export { ComponentManifestToAstConverter };
|
|
23
22
|
|
|
24
23
|
//# sourceMappingURL=ComponentManifestToAstConverter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"ComponentManifestToAstConverter.js","sources":["../src/ComponentManifestToAstConverter.ts"],"sourcesContent":["import type { ComponentInput } from \"./types.js\";\n\nexport type InputAstNode = {\n name: string;\n type: string;\n list: boolean;\n path: string;\n children: InputAstNode[];\n input: ComponentInput;\n};\n\nexport class ComponentManifestToAstConverter {\n static convert(inputs: ComponentInput[]): InputAstNode[] {\n return this.buildAst(inputs);\n }\n\n private static buildAst(inputs: ComponentInput[], basePath = \"\"): InputAstNode[] {\n return inputs.map(input => {\n const path = basePath ? `${basePath}/${input.name}` : input.name;\n const node: InputAstNode = {\n name: input.name,\n type: input.type,\n list: input.list || false,\n path,\n children: [],\n input\n };\n\n if (input.type === \"object\" && input.fields) {\n node.children = this.buildAst(input.fields, path);\n }\n\n return node;\n });\n }\n}\n"],"names":["ComponentManifestToAstConverter","inputs","basePath","input","path","node"],"mappings":"AAWO,MAAMA;IACT,OAAO,QAAQC,MAAwB,EAAkB;QACrD,OAAO,IAAI,CAAC,QAAQ,CAACA;IACzB;IAEA,OAAe,SAASA,MAAwB,EAAEC,WAAW,EAAE,EAAkB;QAC7E,OAAOD,OAAO,GAAG,CAACE,CAAAA;YACd,MAAMC,OAAOF,WAAW,GAAGA,SAAS,CAAC,EAAEC,MAAM,IAAI,EAAE,GAAGA,MAAM,IAAI;YAChE,MAAME,OAAqB;gBACvB,MAAMF,MAAM,IAAI;gBAChB,MAAMA,MAAM,IAAI;gBAChB,MAAMA,MAAM,IAAI,IAAI;gBACpBC;gBACA,UAAU,EAAE;gBACZD;YACJ;YAEA,IAAIA,AAAe,aAAfA,MAAM,IAAI,IAAiBA,MAAM,MAAM,EACvCE,KAAK,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAACF,MAAM,MAAM,EAAEC;YAGhD,OAAOC;QACX;IACJ;AACJ"}
|
package/ComponentRegistry.js
CHANGED
|
@@ -1,55 +1,36 @@
|
|
|
1
1
|
import { functionConverter } from "./FunctionConverter.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
2
|
+
class ComponentRegistry {
|
|
3
|
+
register(component) {
|
|
4
|
+
const name = component.manifest.name;
|
|
5
|
+
component.manifest.tags = component.manifest.tags ?? [];
|
|
6
|
+
if (component.manifest.constraints) component.manifest.constraints = component.manifest.constraints.map((fn)=>functionConverter.serialize(fn));
|
|
7
|
+
if (component.manifest.descendantConstraints) component.manifest.descendantConstraints = component.manifest.descendantConstraints.map((fn)=>functionConverter.serialize(fn));
|
|
8
|
+
if (component.manifest.canDelete && "function" == typeof component.manifest.canDelete) component.manifest.canDelete = functionConverter.serialize(component.manifest.canDelete);
|
|
9
|
+
if (component.manifest.onChange) component.manifest.onChange = serializeHandlers(component.manifest.onChange);
|
|
10
|
+
if (component.manifest.onDescendantChange) component.manifest.onDescendantChange = serializeHandlers(component.manifest.onDescendantChange);
|
|
11
|
+
this.registry.set(name, component);
|
|
12
|
+
this.listeners.forEach((fn)=>fn({
|
|
13
|
+
name,
|
|
14
|
+
component
|
|
15
|
+
}));
|
|
13
16
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
component.manifest.descendantConstraints = component.manifest.descendantConstraints.map(fn => functionConverter.serialize(fn));
|
|
17
|
+
get(name) {
|
|
18
|
+
return this.registry.get(name);
|
|
17
19
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
onRegister(fn) {
|
|
21
|
+
this.listeners.add(fn);
|
|
22
|
+
return ()=>this.listeners.delete(fn);
|
|
21
23
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
constructor(){
|
|
25
|
+
this.registry = new Map();
|
|
26
|
+
this.listeners = new Set();
|
|
25
27
|
}
|
|
26
|
-
if (component.manifest.onDescendantChange) {
|
|
27
|
-
// @ts-expect-error Serialized form is a string (or string[]), but type expects a function.
|
|
28
|
-
component.manifest.onDescendantChange = serializeHandlers(component.manifest.onDescendantChange);
|
|
29
|
-
}
|
|
30
|
-
this.registry.set(name, component);
|
|
31
|
-
// notify subscribers
|
|
32
|
-
this.listeners.forEach(fn => fn({
|
|
33
|
-
name,
|
|
34
|
-
component
|
|
35
|
-
}));
|
|
36
|
-
}
|
|
37
|
-
get(name) {
|
|
38
|
-
return this.registry.get(name);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/** subscribe to *all* registrations */
|
|
42
|
-
onRegister(fn) {
|
|
43
|
-
this.listeners.add(fn);
|
|
44
|
-
return () => this.listeners.delete(fn);
|
|
45
|
-
}
|
|
46
28
|
}
|
|
47
29
|
function serializeHandlers(handler) {
|
|
48
|
-
|
|
49
|
-
return
|
|
50
|
-
}
|
|
51
|
-
return functionConverter.serialize(handler);
|
|
30
|
+
if (Array.isArray(handler)) return handler.map((h)=>functionConverter.serialize(h));
|
|
31
|
+
return functionConverter.serialize(handler);
|
|
52
32
|
}
|
|
53
|
-
|
|
33
|
+
const componentRegistry = new ComponentRegistry();
|
|
34
|
+
export { ComponentRegistry, componentRegistry };
|
|
54
35
|
|
|
55
36
|
//# sourceMappingURL=ComponentRegistry.js.map
|
package/ComponentRegistry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"ComponentRegistry.js","sources":["../src/ComponentRegistry.ts"],"sourcesContent":["import type { Component } from \"~/types.js\";\nimport { functionConverter } from \"~/FunctionConverter.js\";\n\ntype Registration = { name: string; component: Component };\n\nexport class ComponentRegistry {\n private registry = new Map<string, Component>();\n private listeners = new Set<(reg: Registration) => void>();\n\n public register(component: Component) {\n const name = component.manifest.name;\n // Normalize optional fields so downstream code never sees undefined.\n component.manifest.tags = component.manifest.tags ?? [];\n // Serialize constraint and handler functions for cross-boundary transport\n if (component.manifest.constraints) {\n // @ts-expect-error Serialized form is string[], but type expects function[].\n component.manifest.constraints = component.manifest.constraints.map(fn =>\n functionConverter.serialize(fn)\n );\n }\n if (component.manifest.descendantConstraints) {\n // @ts-expect-error Serialized form is string[], but type expects function[].\n component.manifest.descendantConstraints = component.manifest.descendantConstraints.map(\n fn => functionConverter.serialize(fn)\n );\n }\n if (component.manifest.canDelete && typeof component.manifest.canDelete === \"function\") {\n // @ts-expect-error Serialized form is a string, but type expects a function.\n component.manifest.canDelete = functionConverter.serialize(\n component.manifest.canDelete\n );\n }\n if (component.manifest.onChange) {\n // @ts-expect-error Serialized form is a string (or string[]), but type expects a function.\n component.manifest.onChange = serializeHandlers(component.manifest.onChange);\n }\n if (component.manifest.onDescendantChange) {\n // @ts-expect-error Serialized form is a string (or string[]), but type expects a function.\n component.manifest.onDescendantChange = serializeHandlers(\n component.manifest.onDescendantChange\n );\n }\n this.registry.set(name, component);\n // notify subscribers\n this.listeners.forEach(fn => fn({ name, component }));\n }\n\n public get(name: string) {\n return this.registry.get(name);\n }\n\n /** subscribe to *all* registrations */\n public onRegister(fn: (reg: Registration) => void) {\n this.listeners.add(fn);\n return () => this.listeners.delete(fn);\n }\n}\n\nfunction serializeHandlers(\n handler: ((...args: any[]) => any) | ((...args: any[]) => any)[]\n): string | string[] {\n if (Array.isArray(handler)) {\n return handler.map(h => functionConverter.serialize(h));\n }\n return functionConverter.serialize(handler);\n}\n\nexport const componentRegistry = new ComponentRegistry();\n"],"names":["ComponentRegistry","component","name","fn","functionConverter","serializeHandlers","Map","Set","handler","Array","h","componentRegistry"],"mappings":";AAKO,MAAMA;IAIF,SAASC,SAAoB,EAAE;QAClC,MAAMC,OAAOD,UAAU,QAAQ,CAAC,IAAI;QAEpCA,UAAU,QAAQ,CAAC,IAAI,GAAGA,UAAU,QAAQ,CAAC,IAAI,IAAI,EAAE;QAEvD,IAAIA,UAAU,QAAQ,CAAC,WAAW,EAE9BA,UAAU,QAAQ,CAAC,WAAW,GAAGA,UAAU,QAAQ,CAAC,WAAW,CAAC,GAAG,CAACE,CAAAA,KAChEC,kBAAkB,SAAS,CAACD;QAGpC,IAAIF,UAAU,QAAQ,CAAC,qBAAqB,EAExCA,UAAU,QAAQ,CAAC,qBAAqB,GAAGA,UAAU,QAAQ,CAAC,qBAAqB,CAAC,GAAG,CACnFE,CAAAA,KAAMC,kBAAkB,SAAS,CAACD;QAG1C,IAAIF,UAAU,QAAQ,CAAC,SAAS,IAAI,AAAwC,cAAxC,OAAOA,UAAU,QAAQ,CAAC,SAAS,EAEnEA,UAAU,QAAQ,CAAC,SAAS,GAAGG,kBAAkB,SAAS,CACtDH,UAAU,QAAQ,CAAC,SAAS;QAGpC,IAAIA,UAAU,QAAQ,CAAC,QAAQ,EAE3BA,UAAU,QAAQ,CAAC,QAAQ,GAAGI,kBAAkBJ,UAAU,QAAQ,CAAC,QAAQ;QAE/E,IAAIA,UAAU,QAAQ,CAAC,kBAAkB,EAErCA,UAAU,QAAQ,CAAC,kBAAkB,GAAGI,kBACpCJ,UAAU,QAAQ,CAAC,kBAAkB;QAG7C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAACC,MAAMD;QAExB,IAAI,CAAC,SAAS,CAAC,OAAO,CAACE,CAAAA,KAAMA,GAAG;gBAAED;gBAAMD;YAAU;IACtD;IAEO,IAAIC,IAAY,EAAE;QACrB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAACA;IAC7B;IAGO,WAAWC,EAA+B,EAAE;QAC/C,IAAI,CAAC,SAAS,CAAC,GAAG,CAACA;QACnB,OAAO,IAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAACA;IACvC;;aAjDQ,QAAQ,GAAG,IAAIG;aACf,SAAS,GAAG,IAAIC;;AAiD5B;AAEA,SAASF,kBACLG,OAAgE;IAEhE,IAAIC,MAAM,OAAO,CAACD,UACd,OAAOA,QAAQ,GAAG,CAACE,CAAAA,IAAKN,kBAAkB,SAAS,CAACM;IAExD,OAAON,kBAAkB,SAAS,CAACI;AACvC;AAEO,MAAMG,oBAAoB,IAAIX"}
|
package/ComponentResolver.js
CHANGED
|
@@ -1,36 +1,32 @@
|
|
|
1
1
|
import { logger } from "./Logger.js";
|
|
2
2
|
import { BindingsResolver } from "./BindingsResolver.js";
|
|
3
3
|
import { ComponentManifestToAstConverter } from "./ComponentManifestToAstConverter.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
4
|
+
class ComponentResolver {
|
|
5
|
+
constructor(registry){
|
|
6
|
+
this.components = registry;
|
|
7
|
+
}
|
|
8
|
+
resolve({ element, elementBindings = {}, onResolved, state }) {
|
|
9
|
+
const componentName = element.component.name;
|
|
10
|
+
const blueprint = this.components.get(componentName);
|
|
11
|
+
if (!blueprint) {
|
|
12
|
+
logger.warn(`Unknown component: ${componentName}`);
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
const bindingsResolver = new BindingsResolver(state);
|
|
16
|
+
const instances = bindingsResolver.resolveElement({
|
|
17
|
+
element,
|
|
18
|
+
elementBindings,
|
|
19
|
+
inputAst: ComponentManifestToAstConverter.convert(blueprint.manifest.inputs ?? []),
|
|
20
|
+
onResolved
|
|
21
|
+
});
|
|
22
|
+
return instances.map((instance)=>({
|
|
23
|
+
component: blueprint.component,
|
|
24
|
+
manifest: blueprint.manifest,
|
|
25
|
+
styles: instance.styles,
|
|
26
|
+
inputs: instance.inputs
|
|
27
|
+
}));
|
|
19
28
|
}
|
|
20
|
-
const bindingsResolver = new BindingsResolver(state);
|
|
21
|
-
const instances = bindingsResolver.resolveElement({
|
|
22
|
-
element,
|
|
23
|
-
elementBindings,
|
|
24
|
-
inputAst: ComponentManifestToAstConverter.convert(blueprint.manifest.inputs ?? []),
|
|
25
|
-
onResolved
|
|
26
|
-
});
|
|
27
|
-
return instances.map(instance => ({
|
|
28
|
-
component: blueprint.component,
|
|
29
|
-
manifest: blueprint.manifest,
|
|
30
|
-
styles: instance.styles,
|
|
31
|
-
inputs: instance.inputs
|
|
32
|
-
}));
|
|
33
|
-
}
|
|
34
29
|
}
|
|
30
|
+
export { ComponentResolver };
|
|
35
31
|
|
|
36
32
|
//# sourceMappingURL=ComponentResolver.js.map
|
package/ComponentResolver.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"ComponentResolver.js","sources":["../src/ComponentResolver.ts"],"sourcesContent":["import type { ComponentRegistry } from \"~/ComponentRegistry.js\";\nimport type {\n DocumentElement,\n DocumentElementBindings,\n DocumentState,\n ResolvedComponent\n} from \"~/types.js\";\nimport { logger } from \"./Logger.js\";\nimport type { OnResolved } from \"./BindingsResolver.js\";\nimport { BindingsResolver } from \"./BindingsResolver.js\";\nimport { ComponentManifestToAstConverter } from \"~/ComponentManifestToAstConverter.js\";\n\nexport type ResolveElementParams = {\n element: DocumentElement;\n elementBindings: DocumentElementBindings;\n state: DocumentState;\n onResolved?: OnResolved;\n};\n\nexport class ComponentResolver {\n private components: ComponentRegistry;\n\n constructor(registry: ComponentRegistry) {\n this.components = registry;\n }\n\n resolve({\n element,\n elementBindings = {},\n onResolved,\n state\n }: ResolveElementParams): ResolvedComponent[] | null {\n const componentName = element.component.name;\n const blueprint = this.components.get(componentName);\n\n if (!blueprint) {\n logger.warn(`Unknown component: ${componentName}`);\n return null;\n }\n\n const bindingsResolver = new BindingsResolver(state);\n const instances = bindingsResolver.resolveElement({\n element,\n elementBindings,\n inputAst: ComponentManifestToAstConverter.convert(blueprint.manifest.inputs ?? []),\n onResolved\n });\n\n return instances.map(instance => ({\n component: blueprint.component,\n manifest: blueprint.manifest!,\n styles: instance.styles,\n inputs: instance.inputs\n }));\n }\n}\n"],"names":["ComponentResolver","registry","element","elementBindings","onResolved","state","componentName","blueprint","logger","bindingsResolver","BindingsResolver","instances","ComponentManifestToAstConverter","instance"],"mappings":";;;AAmBO,MAAMA;IAGT,YAAYC,QAA2B,CAAE;QACrC,IAAI,CAAC,UAAU,GAAGA;IACtB;IAEA,QAAQ,EACJC,OAAO,EACPC,kBAAkB,CAAC,CAAC,EACpBC,UAAU,EACVC,KAAK,EACc,EAA8B;QACjD,MAAMC,gBAAgBJ,QAAQ,SAAS,CAAC,IAAI;QAC5C,MAAMK,YAAY,IAAI,CAAC,UAAU,CAAC,GAAG,CAACD;QAEtC,IAAI,CAACC,WAAW;YACZC,OAAO,IAAI,CAAC,CAAC,mBAAmB,EAAEF,eAAe;YACjD,OAAO;QACX;QAEA,MAAMG,mBAAmB,IAAIC,iBAAiBL;QAC9C,MAAMM,YAAYF,iBAAiB,cAAc,CAAC;YAC9CP;YACAC;YACA,UAAUS,gCAAgC,OAAO,CAACL,UAAU,QAAQ,CAAC,MAAM,IAAI,EAAE;YACjFH;QACJ;QAEA,OAAOO,UAAU,GAAG,CAACE,CAAAA,WAAa;gBAC9B,WAAWN,UAAU,SAAS;gBAC9B,UAAUA,UAAU,QAAQ;gBAC5B,QAAQM,SAAS,MAAM;gBACvB,QAAQA,SAAS,MAAM;YAC3B;IACJ;AACJ"}
|