@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.
Files changed (154) hide show
  1. package/BindingsApi.js +29 -36
  2. package/BindingsApi.js.map +1 -1
  3. package/BindingsProcessor.js +34 -43
  4. package/BindingsProcessor.js.map +1 -1
  5. package/BindingsProcessor.test.js +82 -78
  6. package/BindingsProcessor.test.js.map +1 -1
  7. package/BindingsResolver.js +92 -119
  8. package/BindingsResolver.js.map +1 -1
  9. package/BindingsResolver.test.js +399 -363
  10. package/BindingsResolver.test.js.map +1 -1
  11. package/ComponentInputTraverser.js +28 -49
  12. package/ComponentInputTraverser.js.map +1 -1
  13. package/ComponentManifestToAstConverter.js +20 -21
  14. package/ComponentManifestToAstConverter.js.map +1 -1
  15. package/ComponentRegistry.js +26 -45
  16. package/ComponentRegistry.js.map +1 -1
  17. package/ComponentResolver.js +25 -29
  18. package/ComponentResolver.js.map +1 -1
  19. package/ConstraintEvaluator.js +246 -353
  20. package/ConstraintEvaluator.js.map +1 -1
  21. package/ConstraintEvaluator.test.js +1616 -1438
  22. package/ConstraintEvaluator.test.js.map +1 -1
  23. package/ContentSdk.js +83 -90
  24. package/ContentSdk.js.map +1 -1
  25. package/DocumentStore.js +47 -59
  26. package/DocumentStore.js.map +1 -1
  27. package/DocumentStoreManager.js +17 -16
  28. package/DocumentStoreManager.js.map +1 -1
  29. package/EditingSdk.js +87 -121
  30. package/EditingSdk.js.map +1 -1
  31. package/ElementFactory.js +126 -174
  32. package/ElementFactory.js.map +1 -1
  33. package/ElementFactory.test.js +234 -263
  34. package/ElementFactory.test.js.map +1 -1
  35. package/Environment.js +18 -19
  36. package/Environment.js.map +1 -1
  37. package/FunctionConverter.js +8 -7
  38. package/FunctionConverter.js.map +1 -1
  39. package/HashObject.js +11 -26
  40. package/HashObject.js.map +1 -1
  41. package/HotkeyManager.js +40 -47
  42. package/HotkeyManager.js.map +1 -1
  43. package/IBindingsUpdater.js +0 -3
  44. package/IRedirects.js +0 -3
  45. package/InheritanceProcessor.js +99 -139
  46. package/InheritanceProcessor.js.map +1 -1
  47. package/InheritanceProcessor.test.js +178 -179
  48. package/InheritanceProcessor.test.js.map +1 -1
  49. package/InheritedValueResolver.js +15 -20
  50. package/InheritedValueResolver.js.map +1 -1
  51. package/InputBindingsProcessor.js +187 -307
  52. package/InputBindingsProcessor.js.map +1 -1
  53. package/InputsBindingsProcessor.test.js +334 -315
  54. package/InputsBindingsProcessor.test.js.map +1 -1
  55. package/InputsUpdater.js +23 -26
  56. package/InputsUpdater.js.map +1 -1
  57. package/LiveSdk.js +12 -13
  58. package/LiveSdk.js.map +1 -1
  59. package/Logger.js +9 -8
  60. package/Logger.js.map +1 -1
  61. package/MouseTracker.js +77 -83
  62. package/MouseTracker.js.map +1 -1
  63. package/NullSdk.js +22 -21
  64. package/NullSdk.js.map +1 -1
  65. package/PreviewDocument.js +27 -30
  66. package/PreviewDocument.js.map +1 -1
  67. package/PreviewSdk.js +16 -17
  68. package/PreviewSdk.js.map +1 -1
  69. package/PreviewViewport.js +51 -63
  70. package/PreviewViewport.js.map +1 -1
  71. package/ResizeObserver.js +24 -31
  72. package/ResizeObserver.js.map +1 -1
  73. package/StylesBindingsProcessor.js +40 -79
  74. package/StylesBindingsProcessor.js.map +1 -1
  75. package/StylesUpdater.js +20 -25
  76. package/StylesUpdater.js.map +1 -1
  77. package/Theme.js +28 -25
  78. package/Theme.js.map +1 -1
  79. package/ViewportManager.js +89 -101
  80. package/ViewportManager.js.map +1 -1
  81. package/constants.js +7 -6
  82. package/constants.js.map +1 -1
  83. package/createElement.js +5 -6
  84. package/createElement.js.map +1 -1
  85. package/createInput.js +85 -143
  86. package/createInput.js.map +1 -1
  87. package/createTheme.js +2 -3
  88. package/createTheme.js.map +1 -1
  89. package/dataProviders/ApiClient.js +40 -49
  90. package/dataProviders/ApiClient.js.map +1 -1
  91. package/dataProviders/DefaultDataProvider.js +56 -58
  92. package/dataProviders/DefaultDataProvider.js.map +1 -1
  93. package/dataProviders/GET_PAGE_BY_ID.js +2 -1
  94. package/dataProviders/GET_PAGE_BY_ID.js.map +1 -1
  95. package/dataProviders/GET_PAGE_BY_PATH.js +2 -1
  96. package/dataProviders/GET_PAGE_BY_PATH.js.map +1 -1
  97. package/dataProviders/LIST_PUBLISHED_PAGES.js +2 -1
  98. package/dataProviders/LIST_PUBLISHED_PAGES.js.map +1 -1
  99. package/dataProviders/NullDataProvider.js +21 -20
  100. package/dataProviders/NullDataProvider.js.map +1 -1
  101. package/dataProviders/RedirectsProvider.js +24 -27
  102. package/dataProviders/RedirectsProvider.js.map +1 -1
  103. package/defaultBreakpoints.js +23 -22
  104. package/defaultBreakpoints.js.map +1 -1
  105. package/documentOperations/$addElementReferenceToParent.js +29 -32
  106. package/documentOperations/$addElementReferenceToParent.js.map +1 -1
  107. package/documentOperations/AddElement.js +8 -7
  108. package/documentOperations/AddElement.js.map +1 -1
  109. package/documentOperations/AddToParent.js +14 -13
  110. package/documentOperations/AddToParent.js.map +1 -1
  111. package/documentOperations/IDocumentOperation.js +0 -3
  112. package/documentOperations/RemoveElement.js +9 -15
  113. package/documentOperations/RemoveElement.js.map +1 -1
  114. package/documentOperations/SetGlobalInputBinding.js +23 -22
  115. package/documentOperations/SetGlobalInputBinding.js.map +1 -1
  116. package/documentOperations/SetGlobalStyleBinding.js +23 -23
  117. package/documentOperations/SetGlobalStyleBinding.js.map +1 -1
  118. package/documentOperations/SetInputBindingOverride.js +30 -29
  119. package/documentOperations/SetInputBindingOverride.js.map +1 -1
  120. package/documentOperations/SetStyleBindingOverride.js +30 -31
  121. package/documentOperations/SetStyleBindingOverride.js.map +1 -1
  122. package/documentOperations/index.js +9 -8
  123. package/documentOperations/index.js.map +1 -1
  124. package/findMatchingAstNode.js +11 -13
  125. package/findMatchingAstNode.js.map +1 -1
  126. package/generateElementId.js +2 -1
  127. package/generateElementId.js.map +1 -1
  128. package/headersProvider.js +4 -3
  129. package/headersProvider.js.map +1 -1
  130. package/index.js +0 -2
  131. package/jsonPatch.js +5 -9
  132. package/jsonPatch.js.map +1 -1
  133. package/messages.js +12 -11
  134. package/messages.js.map +1 -1
  135. package/messenger/MessageOrigin.js +12 -11
  136. package/messenger/MessageOrigin.js.map +1 -1
  137. package/messenger/Messenger.js +58 -69
  138. package/messenger/Messenger.js.map +1 -1
  139. package/messenger/index.js +0 -2
  140. package/package.json +5 -5
  141. package/registerComponentGroup.js +5 -6
  142. package/registerComponentGroup.js.map +1 -1
  143. package/types/ShorthandCssProperties.js +0 -3
  144. package/types/WebsiteBuilderTheme.js +0 -3
  145. package/types.d.ts +3 -0
  146. package/types.js +0 -3
  147. package/IBindingsUpdater.js.map +0 -1
  148. package/IRedirects.js.map +0 -1
  149. package/documentOperations/IDocumentOperation.js.map +0 -1
  150. package/index.js.map +0 -1
  151. package/messenger/index.js.map +0 -1
  152. package/types/ShorthandCssProperties.js.map +0 -1
  153. package/types/WebsiteBuilderTheme.js.map +0 -1
  154. 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":"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"}
@@ -1,56 +1,35 @@
1
- // Visitor signature: called for every resolved leaf
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
- traverseNode(node, value, currentPath, visitor) {
25
- if (node.list) {
26
- value = value ?? [];
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
- } else {
43
- if (node.children.length > 0) {
44
- for (const child of node.children) {
45
- const childValue = value?.[child.name];
46
- const childPath = `${currentPath}/${child.name}`;
47
- this.traverseNode(child, childValue, childPath, visitor);
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
- } else {
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,"names":["ComponentInputTraverser","constructor","ast","traverse","data","visitor","node","rootValue","name","traverseNode","value","currentPath","list","length","forEach","item","index","children","itemPath","child","childValue","childPath"],"sources":["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"],"mappings":"AAEA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMA,uBAAuB,CAAC;EAGjCC,WAAWA,CAACC,GAAmB,EAAE;IAC7B,IAAI,CAACA,GAAG,GAAGA,GAAG;EAClB;;EAEA;AACJ;AACA;AACA;EACWC,QAAQA,CAACC,IAAyB,EAAEC,OAAqB,EAAQ;IACpE,KAAK,MAAMC,IAAI,IAAI,IAAI,CAACJ,GAAG,EAAE;MACzB,MAAMK,SAAS,GAAGH,IAAI,CAACE,IAAI,CAACE,IAAI,CAAC;MACjC,IAAI,CAACC,YAAY,CAACH,IAAI,EAAEC,SAAS,EAAED,IAAI,CAACE,IAAI,EAAEH,OAAO,CAAC;IAC1D;EACJ;EAEQI,YAAYA,CAChBH,IAAkB,EAClBI,KAAU,EACVC,WAAmB,EACnBN,OAAqB,EACjB;IACJ,IAAIC,IAAI,CAACM,IAAI,EAAE;MACXF,KAAK,GAAGA,KAAK,IAAI,EAAE;MAEnB,IAAIA,KAAK,CAACG,MAAM,KAAK,CAAC,EAAE;QACpBR,OAAO,CAACC,IAAI,EAAEK,WAAW,EAAED,KAAK,CAAC;MACrC;MAEAA,KAAK,CAACI,OAAO,CAAC,CAACC,IAAS,EAAEC,KAAa,KAAK;QACxC,IAAIV,IAAI,CAACW,QAAQ,CAACJ,MAAM,GAAG,CAAC,EAAE;UAC1B,MAAMK,QAAQ,GAAG,GAAGP,WAAW,IAAIK,KAAK,EAAE;UAC1C,KAAK,MAAMG,KAAK,IAAIb,IAAI,CAACW,QAAQ,EAAE;YAC/B,MAAMG,UAAU,GAAGL,IAAI,GAAGI,KAAK,CAACX,IAAI,CAAC;YACrC,MAAMa,SAAS,GAAG,GAAGH,QAAQ,IAAIC,KAAK,CAACX,IAAI,EAAE;YAC7C,IAAI,CAACC,YAAY,CAACU,KAAK,EAAEC,UAAU,EAAEC,SAAS,EAAEhB,OAAO,CAAC;UAC5D;QACJ,CAAC,MAAM;UACHA,OAAO,CAACC,IAAI,EAAEK,WAAW,EAAEI,IAAI,CAAC;QACpC;MACJ,CAAC,CAAC;IACN,CAAC,MAAM;MACH,IAAIT,IAAI,CAACW,QAAQ,CAACJ,MAAM,GAAG,CAAC,EAAE;QAC1B,KAAK,MAAMM,KAAK,IAAIb,IAAI,CAACW,QAAQ,EAAE;UAC/B,MAAMG,UAAU,GAAGV,KAAK,GAAGS,KAAK,CAACX,IAAI,CAAC;UACtC,MAAMa,SAAS,GAAG,GAAGV,WAAW,IAAIQ,KAAK,CAACX,IAAI,EAAE;UAChD,IAAI,CAACC,YAAY,CAACU,KAAK,EAAEC,UAAU,EAAEC,SAAS,EAAEhB,OAAO,CAAC;QAC5D;MACJ,CAAC,MAAM;QACHA,OAAO,CAACC,IAAI,EAAEK,WAAW,EAAED,KAAK,CAAC;MACrC;IACJ;EACJ;AACJ","ignoreList":[]}
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
- export 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 (input.type === "object" && input.fields) {
17
- node.children = this.buildAst(input.fields, path);
18
- }
19
- return node;
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,"names":["ComponentManifestToAstConverter","convert","inputs","buildAst","basePath","map","input","path","name","node","type","list","children","fields"],"sources":["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"],"mappings":"AAWA,OAAO,MAAMA,+BAA+B,CAAC;EACzC,OAAOC,OAAOA,CAACC,MAAwB,EAAkB;IACrD,OAAO,IAAI,CAACC,QAAQ,CAACD,MAAM,CAAC;EAChC;EAEA,OAAeC,QAAQA,CAACD,MAAwB,EAAEE,QAAQ,GAAG,EAAE,EAAkB;IAC7E,OAAOF,MAAM,CAACG,GAAG,CAACC,KAAK,IAAI;MACvB,MAAMC,IAAI,GAAGH,QAAQ,GAAG,GAAGA,QAAQ,IAAIE,KAAK,CAACE,IAAI,EAAE,GAAGF,KAAK,CAACE,IAAI;MAChE,MAAMC,IAAkB,GAAG;QACvBD,IAAI,EAAEF,KAAK,CAACE,IAAI;QAChBE,IAAI,EAAEJ,KAAK,CAACI,IAAI;QAChBC,IAAI,EAAEL,KAAK,CAACK,IAAI,IAAI,KAAK;QACzBJ,IAAI;QACJK,QAAQ,EAAE,EAAE;QACZN;MACJ,CAAC;MAED,IAAIA,KAAK,CAACI,IAAI,KAAK,QAAQ,IAAIJ,KAAK,CAACO,MAAM,EAAE;QACzCJ,IAAI,CAACG,QAAQ,GAAG,IAAI,CAACT,QAAQ,CAACG,KAAK,CAACO,MAAM,EAAEN,IAAI,CAAC;MACrD;MAEA,OAAOE,IAAI;IACf,CAAC,CAAC;EACN;AACJ","ignoreList":[]}
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"}
@@ -1,55 +1,36 @@
1
1
  import { functionConverter } from "./FunctionConverter.js";
2
- export class ComponentRegistry {
3
- registry = new Map();
4
- listeners = new Set();
5
- register(component) {
6
- const name = component.manifest.name;
7
- // Normalize optional fields so downstream code never sees undefined.
8
- component.manifest.tags = component.manifest.tags ?? [];
9
- // Serialize constraint and handler functions for cross-boundary transport
10
- if (component.manifest.constraints) {
11
- // @ts-expect-error Serialized form is string[], but type expects function[].
12
- component.manifest.constraints = component.manifest.constraints.map(fn => functionConverter.serialize(fn));
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
- if (component.manifest.descendantConstraints) {
15
- // @ts-expect-error Serialized form is string[], but type expects function[].
16
- component.manifest.descendantConstraints = component.manifest.descendantConstraints.map(fn => functionConverter.serialize(fn));
17
+ get(name) {
18
+ return this.registry.get(name);
17
19
  }
18
- if (component.manifest.canDelete && typeof component.manifest.canDelete === "function") {
19
- // @ts-expect-error Serialized form is a string, but type expects a function.
20
- component.manifest.canDelete = functionConverter.serialize(component.manifest.canDelete);
20
+ onRegister(fn) {
21
+ this.listeners.add(fn);
22
+ return ()=>this.listeners.delete(fn);
21
23
  }
22
- if (component.manifest.onChange) {
23
- // @ts-expect-error Serialized form is a string (or string[]), but type expects a function.
24
- component.manifest.onChange = serializeHandlers(component.manifest.onChange);
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
- if (Array.isArray(handler)) {
49
- return handler.map(h => functionConverter.serialize(h));
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
- export const componentRegistry = new ComponentRegistry();
33
+ const componentRegistry = new ComponentRegistry();
34
+ export { ComponentRegistry, componentRegistry };
54
35
 
55
36
  //# sourceMappingURL=ComponentRegistry.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["functionConverter","ComponentRegistry","registry","Map","listeners","Set","register","component","name","manifest","tags","constraints","map","fn","serialize","descendantConstraints","canDelete","onChange","serializeHandlers","onDescendantChange","set","forEach","get","onRegister","add","delete","handler","Array","isArray","h","componentRegistry"],"sources":["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"],"mappings":"AACA,SAASA,iBAAiB;AAI1B,OAAO,MAAMC,iBAAiB,CAAC;EACnBC,QAAQ,GAAG,IAAIC,GAAG,CAAoB,CAAC;EACvCC,SAAS,GAAG,IAAIC,GAAG,CAA8B,CAAC;EAEnDC,QAAQA,CAACC,SAAoB,EAAE;IAClC,MAAMC,IAAI,GAAGD,SAAS,CAACE,QAAQ,CAACD,IAAI;IACpC;IACAD,SAAS,CAACE,QAAQ,CAACC,IAAI,GAAGH,SAAS,CAACE,QAAQ,CAACC,IAAI,IAAI,EAAE;IACvD;IACA,IAAIH,SAAS,CAACE,QAAQ,CAACE,WAAW,EAAE;MAChC;MACAJ,SAAS,CAACE,QAAQ,CAACE,WAAW,GAAGJ,SAAS,CAACE,QAAQ,CAACE,WAAW,CAACC,GAAG,CAACC,EAAE,IAClEb,iBAAiB,CAACc,SAAS,CAACD,EAAE,CAClC,CAAC;IACL;IACA,IAAIN,SAAS,CAACE,QAAQ,CAACM,qBAAqB,EAAE;MAC1C;MACAR,SAAS,CAACE,QAAQ,CAACM,qBAAqB,GAAGR,SAAS,CAACE,QAAQ,CAACM,qBAAqB,CAACH,GAAG,CACnFC,EAAE,IAAIb,iBAAiB,CAACc,SAAS,CAACD,EAAE,CACxC,CAAC;IACL;IACA,IAAIN,SAAS,CAACE,QAAQ,CAACO,SAAS,IAAI,OAAOT,SAAS,CAACE,QAAQ,CAACO,SAAS,KAAK,UAAU,EAAE;MACpF;MACAT,SAAS,CAACE,QAAQ,CAACO,SAAS,GAAGhB,iBAAiB,CAACc,SAAS,CACtDP,SAAS,CAACE,QAAQ,CAACO,SACvB,CAAC;IACL;IACA,IAAIT,SAAS,CAACE,QAAQ,CAACQ,QAAQ,EAAE;MAC7B;MACAV,SAAS,CAACE,QAAQ,CAACQ,QAAQ,GAAGC,iBAAiB,CAACX,SAAS,CAACE,QAAQ,CAACQ,QAAQ,CAAC;IAChF;IACA,IAAIV,SAAS,CAACE,QAAQ,CAACU,kBAAkB,EAAE;MACvC;MACAZ,SAAS,CAACE,QAAQ,CAACU,kBAAkB,GAAGD,iBAAiB,CACrDX,SAAS,CAACE,QAAQ,CAACU,kBACvB,CAAC;IACL;IACA,IAAI,CAACjB,QAAQ,CAACkB,GAAG,CAACZ,IAAI,EAAED,SAAS,CAAC;IAClC;IACA,IAAI,CAACH,SAAS,CAACiB,OAAO,CAACR,EAAE,IAAIA,EAAE,CAAC;MAAEL,IAAI;MAAED;IAAU,CAAC,CAAC,CAAC;EACzD;EAEOe,GAAGA,CAACd,IAAY,EAAE;IACrB,OAAO,IAAI,CAACN,QAAQ,CAACoB,GAAG,CAACd,IAAI,CAAC;EAClC;;EAEA;EACOe,UAAUA,CAACV,EAA+B,EAAE;IAC/C,IAAI,CAACT,SAAS,CAACoB,GAAG,CAACX,EAAE,CAAC;IACtB,OAAO,MAAM,IAAI,CAACT,SAAS,CAACqB,MAAM,CAACZ,EAAE,CAAC;EAC1C;AACJ;AAEA,SAASK,iBAAiBA,CACtBQ,OAAgE,EAC/C;EACjB,IAAIC,KAAK,CAACC,OAAO,CAACF,OAAO,CAAC,EAAE;IACxB,OAAOA,OAAO,CAACd,GAAG,CAACiB,CAAC,IAAI7B,iBAAiB,CAACc,SAAS,CAACe,CAAC,CAAC,CAAC;EAC3D;EACA,OAAO7B,iBAAiB,CAACc,SAAS,CAACY,OAAO,CAAC;AAC/C;AAEA,OAAO,MAAMI,iBAAiB,GAAG,IAAI7B,iBAAiB,CAAC,CAAC","ignoreList":[]}
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"}
@@ -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
- export class ComponentResolver {
5
- constructor(registry) {
6
- this.components = registry;
7
- }
8
- resolve({
9
- element,
10
- elementBindings = {},
11
- onResolved,
12
- state
13
- }) {
14
- const componentName = element.component.name;
15
- const blueprint = this.components.get(componentName);
16
- if (!blueprint) {
17
- logger.warn(`Unknown component: ${componentName}`);
18
- return null;
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
@@ -1 +1 @@
1
- {"version":3,"names":["logger","BindingsResolver","ComponentManifestToAstConverter","ComponentResolver","constructor","registry","components","resolve","element","elementBindings","onResolved","state","componentName","component","name","blueprint","get","warn","bindingsResolver","instances","resolveElement","inputAst","convert","manifest","inputs","map","instance","styles"],"sources":["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"],"mappings":"AAOA,SAASA,MAAM;AAEf,SAASC,gBAAgB;AACzB,SAASC,+BAA+B;AASxC,OAAO,MAAMC,iBAAiB,CAAC;EAG3BC,WAAWA,CAACC,QAA2B,EAAE;IACrC,IAAI,CAACC,UAAU,GAAGD,QAAQ;EAC9B;EAEAE,OAAOA,CAAC;IACJC,OAAO;IACPC,eAAe,GAAG,CAAC,CAAC;IACpBC,UAAU;IACVC;EACkB,CAAC,EAA8B;IACjD,MAAMC,aAAa,GAAGJ,OAAO,CAACK,SAAS,CAACC,IAAI;IAC5C,MAAMC,SAAS,GAAG,IAAI,CAACT,UAAU,CAACU,GAAG,CAACJ,aAAa,CAAC;IAEpD,IAAI,CAACG,SAAS,EAAE;MACZf,MAAM,CAACiB,IAAI,CAAC,sBAAsBL,aAAa,EAAE,CAAC;MAClD,OAAO,IAAI;IACf;IAEA,MAAMM,gBAAgB,GAAG,IAAIjB,gBAAgB,CAACU,KAAK,CAAC;IACpD,MAAMQ,SAAS,GAAGD,gBAAgB,CAACE,cAAc,CAAC;MAC9CZ,OAAO;MACPC,eAAe;MACfY,QAAQ,EAAEnB,+BAA+B,CAACoB,OAAO,CAACP,SAAS,CAACQ,QAAQ,CAACC,MAAM,IAAI,EAAE,CAAC;MAClFd;IACJ,CAAC,CAAC;IAEF,OAAOS,SAAS,CAACM,GAAG,CAACC,QAAQ,KAAK;MAC9Bb,SAAS,EAAEE,SAAS,CAACF,SAAS;MAC9BU,QAAQ,EAAER,SAAS,CAACQ,QAAS;MAC7BI,MAAM,EAAED,QAAQ,CAACC,MAAM;MACvBH,MAAM,EAAEE,QAAQ,CAACF;IACrB,CAAC,CAAC,CAAC;EACP;AACJ","ignoreList":[]}
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"}