@webiny/website-builder-sdk 0.0.0-unstable.eb196ccd2f → 0.0.0-unstable.eb81deee7e

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (307) 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 -77
  6. package/BindingsProcessor.test.js.map +1 -1
  7. package/BindingsResolver.d.ts +5 -2
  8. package/BindingsResolver.js +99 -122
  9. package/BindingsResolver.js.map +1 -1
  10. package/BindingsResolver.test.js +399 -362
  11. package/BindingsResolver.test.js.map +1 -1
  12. package/ComponentInputTraverser.js +32 -49
  13. package/ComponentInputTraverser.js.map +1 -1
  14. package/ComponentManifestToAstConverter.js +20 -21
  15. package/ComponentManifestToAstConverter.js.map +1 -1
  16. package/ComponentRegistry.d.ts +9 -0
  17. package/ComponentRegistry.js +38 -22
  18. package/ComponentRegistry.js.map +1 -1
  19. package/ComponentResolver.d.ts +3 -2
  20. package/ComponentResolver.js +39 -29
  21. package/ComponentResolver.js.map +1 -1
  22. package/ComponentResolver.test.d.ts +1 -0
  23. package/ComponentResolver.test.js +81 -0
  24. package/ComponentResolver.test.js.map +1 -0
  25. package/ConstraintEvaluator.d.ts +36 -0
  26. package/ConstraintEvaluator.js +288 -0
  27. package/ConstraintEvaluator.js.map +1 -0
  28. package/ConstraintEvaluator.test.d.ts +1 -0
  29. package/ConstraintEvaluator.test.js +1634 -0
  30. package/ConstraintEvaluator.test.js.map +1 -0
  31. package/ContentSdk.d.ts +17 -3
  32. package/ContentSdk.js +113 -90
  33. package/ContentSdk.js.map +1 -1
  34. package/DocumentStore.d.ts +1 -1
  35. package/DocumentStore.js +47 -59
  36. package/DocumentStore.js.map +1 -1
  37. package/DocumentStoreManager.js +17 -16
  38. package/DocumentStoreManager.js.map +1 -1
  39. package/EditingSdk.d.ts +2 -2
  40. package/EditingSdk.js +92 -124
  41. package/EditingSdk.js.map +1 -1
  42. package/ElementFactory.d.ts +2 -3
  43. package/ElementFactory.js +164 -163
  44. package/ElementFactory.js.map +1 -1
  45. package/ElementFactory.objectListDefaults.test.d.ts +1 -0
  46. package/ElementFactory.objectListDefaults.test.js +423 -0
  47. package/ElementFactory.objectListDefaults.test.js.map +1 -0
  48. package/ElementFactory.test.d.ts +1 -0
  49. package/ElementFactory.test.js +353 -0
  50. package/ElementFactory.test.js.map +1 -0
  51. package/Environment.js +18 -19
  52. package/Environment.js.map +1 -1
  53. package/FunctionConverter.js +8 -7
  54. package/FunctionConverter.js.map +1 -1
  55. package/HashObject.js +11 -12
  56. package/HashObject.js.map +1 -1
  57. package/HotkeyManager.js +41 -48
  58. package/HotkeyManager.js.map +1 -1
  59. package/IBindingsUpdater.js +0 -3
  60. package/IRedirects.js +0 -3
  61. package/InheritanceProcessor.d.ts +2 -2
  62. package/InheritanceProcessor.js +99 -139
  63. package/InheritanceProcessor.js.map +1 -1
  64. package/InheritanceProcessor.test.js +178 -178
  65. package/InheritanceProcessor.test.js.map +1 -1
  66. package/InheritedValueResolver.d.ts +18 -1
  67. package/InheritedValueResolver.js +18 -20
  68. package/InheritedValueResolver.js.map +1 -1
  69. package/InputBindingsProcessor.d.ts +23 -2
  70. package/InputBindingsProcessor.js +200 -289
  71. package/InputBindingsProcessor.js.map +1 -1
  72. package/InputBindingsProcessorTokens.test.d.ts +1 -0
  73. package/InputBindingsProcessorTokens.test.js +400 -0
  74. package/InputBindingsProcessorTokens.test.js.map +1 -0
  75. package/InputsBindingsProcessor.test.js +334 -313
  76. package/InputsBindingsProcessor.test.js.map +1 -1
  77. package/InputsUpdater.d.ts +1 -1
  78. package/InputsUpdater.js +23 -26
  79. package/InputsUpdater.js.map +1 -1
  80. package/LiveSdk.d.ts +2 -2
  81. package/LiveSdk.js +12 -13
  82. package/LiveSdk.js.map +1 -1
  83. package/Logger.d.ts +2 -1
  84. package/Logger.js +9 -8
  85. package/Logger.js.map +1 -1
  86. package/MouseTracker.js +77 -83
  87. package/MouseTracker.js.map +1 -1
  88. package/NullSdk.d.ts +4 -3
  89. package/NullSdk.js +22 -14
  90. package/NullSdk.js.map +1 -1
  91. package/PreviewDocument.d.ts +1 -0
  92. package/PreviewDocument.js +30 -30
  93. package/PreviewDocument.js.map +1 -1
  94. package/PreviewSdk.d.ts +4 -3
  95. package/PreviewSdk.js +19 -17
  96. package/PreviewSdk.js.map +1 -1
  97. package/PreviewViewport.d.ts +0 -1
  98. package/PreviewViewport.js +50 -82
  99. package/PreviewViewport.js.map +1 -1
  100. package/README.md +10 -2
  101. package/ResizeObserver.js +24 -31
  102. package/ResizeObserver.js.map +1 -1
  103. package/StylesBindingsProcessor.d.ts +12 -2
  104. package/StylesBindingsProcessor.js +62 -79
  105. package/StylesBindingsProcessor.js.map +1 -1
  106. package/StylesUpdater.d.ts +1 -1
  107. package/StylesUpdater.js +20 -25
  108. package/StylesUpdater.js.map +1 -1
  109. package/Theme.js +30 -32
  110. package/Theme.js.map +1 -1
  111. package/ViewportManager.d.ts +2 -0
  112. package/ViewportManager.js +89 -97
  113. package/ViewportManager.js.map +1 -1
  114. package/assertBindingShapes.d.ts +31 -0
  115. package/assertBindingShapes.js +64 -0
  116. package/assertBindingShapes.js.map +1 -0
  117. package/assertBindingShapes.test.d.ts +1 -0
  118. package/assertBindingShapes.test.js +131 -0
  119. package/assertBindingShapes.test.js.map +1 -0
  120. package/asset/deliveryUrl.d.ts +41 -0
  121. package/asset/deliveryUrl.js +34 -0
  122. package/asset/deliveryUrl.js.map +1 -0
  123. package/asset/deliveryUrl.test.d.ts +1 -0
  124. package/asset/deliveryUrl.test.js +127 -0
  125. package/asset/deliveryUrl.test.js.map +1 -0
  126. package/asset/geometry.d.ts +7 -0
  127. package/asset/geometry.js +10 -0
  128. package/asset/geometry.js.map +1 -0
  129. package/asset/imageSrcSet.d.ts +63 -0
  130. package/asset/imageSrcSet.js +98 -0
  131. package/asset/imageSrcSet.js.map +1 -0
  132. package/asset/imageSrcSet.test.d.ts +1 -0
  133. package/asset/imageSrcSet.test.js +103 -0
  134. package/asset/imageSrcSet.test.js.map +1 -0
  135. package/asset/index.d.ts +5 -0
  136. package/asset/index.js +5 -0
  137. package/asset/normalize.d.ts +24 -0
  138. package/asset/normalize.js +106 -0
  139. package/asset/normalize.js.map +1 -0
  140. package/asset/normalize.test.d.ts +1 -0
  141. package/asset/normalize.test.js +263 -0
  142. package/asset/normalize.test.js.map +1 -0
  143. package/asset/types.d.ts +2 -0
  144. package/asset/types.js +0 -0
  145. package/constants.d.ts +1 -0
  146. package/constants.js +7 -5
  147. package/constants.js.map +1 -1
  148. package/contentEntry/ContentEntryBindingsResolver.d.ts +30 -0
  149. package/contentEntry/ContentEntryBindingsResolver.js +45 -0
  150. package/contentEntry/ContentEntryBindingsResolver.js.map +1 -0
  151. package/contentEntry/ContentEntryCache.d.ts +46 -0
  152. package/contentEntry/ContentEntryCache.js +50 -0
  153. package/contentEntry/ContentEntryCache.js.map +1 -0
  154. package/contentEntry/resolveContentEntry.d.ts +74 -0
  155. package/contentEntry/resolveContentEntry.js +53 -0
  156. package/contentEntry/resolveContentEntry.js.map +1 -0
  157. package/contentEntry/resolveContentEntry.test.d.ts +1 -0
  158. package/contentEntry/resolveContentEntry.test.js +213 -0
  159. package/contentEntry/resolveContentEntry.test.js.map +1 -0
  160. package/createComponent.d.ts +5 -0
  161. package/createComponent.js +32 -0
  162. package/createComponent.js.map +1 -0
  163. package/createElement.js +5 -6
  164. package/createElement.js.map +1 -1
  165. package/createInput.d.ts +132 -16
  166. package/createInput.js +92 -111
  167. package/createInput.js.map +1 -1
  168. package/createTheme.js +2 -3
  169. package/createTheme.js.map +1 -1
  170. package/dataProviders/ApiClient.d.ts +10 -5
  171. package/dataProviders/ApiClient.js +40 -49
  172. package/dataProviders/ApiClient.js.map +1 -1
  173. package/dataProviders/DefaultDataProvider.d.ts +7 -3
  174. package/dataProviders/DefaultDataProvider.js +91 -45
  175. package/dataProviders/DefaultDataProvider.js.map +1 -1
  176. package/dataProviders/GET_EXPERIMENT_PAUSED.d.ts +1 -0
  177. package/dataProviders/GET_EXPERIMENT_PAUSED.js +17 -0
  178. package/dataProviders/GET_EXPERIMENT_PAUSED.js.map +1 -0
  179. package/dataProviders/GET_PAGE_BY_ID.d.ts +1 -1
  180. package/dataProviders/GET_PAGE_BY_ID.js +4 -1
  181. package/dataProviders/GET_PAGE_BY_ID.js.map +1 -1
  182. package/dataProviders/GET_PAGE_BY_PATH.d.ts +1 -1
  183. package/dataProviders/GET_PAGE_BY_PATH.js +4 -1
  184. package/dataProviders/GET_PAGE_BY_PATH.js.map +1 -1
  185. package/dataProviders/GET_PAGE_EXPERIMENT.d.ts +1 -0
  186. package/dataProviders/GET_PAGE_EXPERIMENT.js +32 -0
  187. package/dataProviders/GET_PAGE_EXPERIMENT.js.map +1 -0
  188. package/dataProviders/GET_VARIANT_CONTENT.d.ts +1 -0
  189. package/dataProviders/GET_VARIANT_CONTENT.js +24 -0
  190. package/dataProviders/GET_VARIANT_CONTENT.js.map +1 -0
  191. package/dataProviders/LIST_PUBLISHED_PAGES.d.ts +1 -1
  192. package/dataProviders/LIST_PUBLISHED_PAGES.js +17 -5
  193. package/dataProviders/LIST_PUBLISHED_PAGES.js.map +1 -1
  194. package/dataProviders/NullDataProvider.d.ts +16 -4
  195. package/dataProviders/NullDataProvider.js +30 -13
  196. package/dataProviders/NullDataProvider.js.map +1 -1
  197. package/dataProviders/RedirectsProvider.js +24 -27
  198. package/dataProviders/RedirectsProvider.js.map +1 -1
  199. package/defaultBreakpoints.js +43 -22
  200. package/defaultBreakpoints.js.map +1 -1
  201. package/documentOperations/$addElementReferenceToParent.d.ts +1 -1
  202. package/documentOperations/$addElementReferenceToParent.js +30 -26
  203. package/documentOperations/$addElementReferenceToParent.js.map +1 -1
  204. package/documentOperations/AddElement.js +8 -7
  205. package/documentOperations/AddElement.js.map +1 -1
  206. package/documentOperations/AddToParent.d.ts +2 -2
  207. package/documentOperations/AddToParent.js +14 -13
  208. package/documentOperations/AddToParent.js.map +1 -1
  209. package/documentOperations/IDocumentOperation.js +0 -3
  210. package/documentOperations/RemoveElement.js +10 -7
  211. package/documentOperations/RemoveElement.js.map +1 -1
  212. package/documentOperations/SetGlobalInputBinding.js +23 -22
  213. package/documentOperations/SetGlobalInputBinding.js.map +1 -1
  214. package/documentOperations/SetGlobalStyleBinding.js +23 -23
  215. package/documentOperations/SetGlobalStyleBinding.js.map +1 -1
  216. package/documentOperations/SetInputBindingOverride.js +30 -29
  217. package/documentOperations/SetInputBindingOverride.js.map +1 -1
  218. package/documentOperations/SetStyleBindingOverride.js +30 -31
  219. package/documentOperations/SetStyleBindingOverride.js.map +1 -1
  220. package/documentOperations/index.js +9 -8
  221. package/documentOperations/index.js.map +1 -1
  222. package/experiments/PostHogAnalyticsProvider.d.ts +31 -0
  223. package/experiments/PostHogAnalyticsProvider.js +28 -0
  224. package/experiments/PostHogAnalyticsProvider.js.map +1 -0
  225. package/experiments/analyticsProvider.d.ts +4 -0
  226. package/experiments/analyticsProvider.js +11 -0
  227. package/experiments/analyticsProvider.js.map +1 -0
  228. package/experiments/bucketing.d.ts +27 -0
  229. package/experiments/bucketing.js +91 -0
  230. package/experiments/bucketing.js.map +1 -0
  231. package/experiments/bucketing.test.d.ts +1 -0
  232. package/experiments/bucketing.test.js +183 -0
  233. package/experiments/bucketing.test.js.map +1 -0
  234. package/experiments/index.d.ts +5 -0
  235. package/experiments/index.js +5 -0
  236. package/experiments/render.d.ts +79 -0
  237. package/experiments/render.js +149 -0
  238. package/experiments/render.js.map +1 -0
  239. package/experiments/types.d.ts +108 -0
  240. package/experiments/types.js +4 -0
  241. package/experiments/types.js.map +1 -0
  242. package/findMatchingAstNode.js +11 -13
  243. package/findMatchingAstNode.js.map +1 -1
  244. package/generateElementId.d.ts +1 -1
  245. package/generateElementId.js +2 -2
  246. package/generateElementId.js.map +1 -1
  247. package/headersProvider.js +4 -3
  248. package/headersProvider.js.map +1 -1
  249. package/image/geometry.d.ts +54 -0
  250. package/image/geometry.js +112 -0
  251. package/image/geometry.js.map +1 -0
  252. package/image/geometry.test.d.ts +1 -0
  253. package/image/geometry.test.js +190 -0
  254. package/image/geometry.test.js.map +1 -0
  255. package/image/index.d.ts +3 -0
  256. package/image/index.js +3 -0
  257. package/image/presets.d.ts +6 -0
  258. package/image/presets.js +20 -0
  259. package/image/presets.js.map +1 -0
  260. package/image/types.d.ts +10 -0
  261. package/image/types.js +0 -0
  262. package/index.d.ts +12 -1
  263. package/index.js +11 -3
  264. package/jsonPatch.d.ts +1 -1
  265. package/jsonPatch.js +5 -9
  266. package/jsonPatch.js.map +1 -1
  267. package/messages.js +12 -11
  268. package/messages.js.map +1 -1
  269. package/messenger/MessageOrigin.js +12 -11
  270. package/messenger/MessageOrigin.js.map +1 -1
  271. package/messenger/Messenger.js +59 -70
  272. package/messenger/Messenger.js.map +1 -1
  273. package/messenger/index.js +0 -2
  274. package/package.json +19 -22
  275. package/registerComponentGroup.js +5 -6
  276. package/registerComponentGroup.js.map +1 -1
  277. package/tokenBinding.d.ts +26 -0
  278. package/tokenBinding.js +15 -0
  279. package/tokenBinding.js.map +1 -0
  280. package/tokenBinding.test.d.ts +1 -0
  281. package/tokenBinding.test.js +165 -0
  282. package/tokenBinding.test.js.map +1 -0
  283. package/types/ShorthandCssProperties.js +0 -3
  284. package/types/WebsiteBuilderTheme.d.ts +54 -45
  285. package/types/WebsiteBuilderTheme.js +0 -3
  286. package/types.d.ts +294 -13
  287. package/types.js +0 -3
  288. package/IBindingsUpdater.js.map +0 -1
  289. package/IRedirects.js.map +0 -1
  290. package/documentOperations/IDocumentOperation.js.map +0 -1
  291. package/index.js.map +0 -1
  292. package/lexical/createDefaultLexicalTheme.d.ts +0 -2
  293. package/lexical/createDefaultLexicalTheme.js +0 -84
  294. package/lexical/createDefaultLexicalTheme.js.map +0 -1
  295. package/lexical/createLexicalTheme.d.ts +0 -2
  296. package/lexical/createLexicalTheme.js +0 -7
  297. package/lexical/createLexicalTheme.js.map +0 -1
  298. package/lexical/deepMerge.d.ts +0 -1
  299. package/lexical/deepMerge.js +0 -23
  300. package/lexical/deepMerge.js.map +0 -1
  301. package/messenger/index.js.map +0 -1
  302. package/types/LexicalEditorTheme.d.ts +0 -2
  303. package/types/LexicalEditorTheme.js +0 -3
  304. package/types/LexicalEditorTheme.js.map +0 -1
  305. package/types/ShorthandCssProperties.js.map +0 -1
  306. package/types/WebsiteBuilderTheme.js.map +0 -1
  307. package/types.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"names":["deepEqual","set","InheritedValueResolver","DocumentOperations","InputsUpdater","generateElementId","InputsBindingsProcessor","constructor","elementId","inputsAst","breakpoints","rawBindings","elementFactory","elementReferences","getElementReferences","inputs","toDeepInputs","flat","result","assignValue","path","value","current","i","length","key","nextKey","isNextIndex","Array","isArray","Error","push","walk","nodes","prefix","node","pathParts","name","flatKey","join","entry","staticValue","static","children","list","pattern","RegExp","indexes","Object","keys","reduce","acc","match","parseInt","uniqueIndexes","from","Set","sort","a","b","undefined","part","Number","createUpdate","breakpoint","operations","originalInputs","rebuilt","overrides","bp","entries","structuredClone","seenPaths","valueResolver","isBaseBreakpoint","getValue","obj","segments","split","flatMap","segment","map","test","compareAndCollect","add","slice","newValue","originalEntry","action","newElement","createElementFromComponent","componentName","params","component","parentId","slot","index","bindings","createdId","element","id","existingId","idToUse","binding","type","input","responsive","inheritedValue","getInheritedValue","isResponsive","usedSlotIds","has","RemoveElement","references","forEach","indexOf"],"sources":["InputBindingsProcessor.ts"],"sourcesContent":["import deepEqual from \"deep-equal\";\nimport set from \"lodash/set.js\";\nimport type { DocumentElementBindings, DocumentElementInputBindings } from \"~/types.js\";\nimport { InheritedValueResolver } from \"~/InheritedValueResolver.js\";\nimport type { InputAstNode } from \"~/ComponentManifestToAstConverter.js\";\nimport { DocumentOperations, type IDocumentOperation } from \"~/documentOperations/index.js\";\nimport type { ElementFactory } from \"~/ElementFactory.js\";\nimport { InputsUpdater } from \"~/InputsUpdater.js\";\nimport { generateElementId } from \"./generateElementId.js\";\ntype DeepBindings = Record<string, any>;\n\nexport type ElementInputsBindings = {\n inputs: DocumentElementInputBindings;\n overrides: {\n [breakpoint: string]: {\n inputs: DocumentElementInputBindings;\n };\n };\n};\n\n/**\n * Handles deep-to-flat and flat-to-deep conversion of input bindings,\n * with breakpoint inheritance awareness.\n */\nexport class InputsBindingsProcessor {\n private breakpoints: string[];\n private rawBindings: DocumentElementBindings;\n private elementFactory: ElementFactory;\n private elementId: string;\n private inputsAst: InputAstNode[];\n private elementReferences: Set<string>;\n\n constructor(\n elementId: string,\n inputsAst: InputAstNode[],\n breakpoints: string[],\n rawBindings: DocumentElementBindings,\n elementFactory: ElementFactory\n ) {\n this.elementId = elementId;\n this.inputsAst = inputsAst;\n this.breakpoints = breakpoints;\n this.rawBindings = rawBindings;\n this.elementFactory = elementFactory;\n this.elementReferences = this.getElementReferences(rawBindings.inputs);\n }\n\n /**\n * Converts flat input bindings into deep inputs object (removes `.static` wrappers).\n */\n public toDeepInputs(flat: NonNullable<DocumentElementBindings[\"inputs\"]>): DeepBindings {\n const result: DeepBindings = {};\n\n // Assigns a value to a nested path within the result object, creating arrays/objects as needed.\n const assignValue = (path: (string | number)[], value: any) => {\n let current = result;\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i];\n const nextKey = path[i + 1];\n const isNextIndex = typeof nextKey === \"number\";\n\n if (typeof key === \"number\") {\n if (!Array.isArray(current)) {\n throw new Error(\"Expected array in path assignment.\");\n }\n while (current.length <= key) {\n current.push(isNextIndex ? [] : {});\n }\n if (typeof current[key] !== \"object\") {\n current[key] = isNextIndex ? [] : {};\n }\n current = current[key];\n } else {\n if (!(key in current) || typeof current[key] !== \"object\") {\n current[key] = isNextIndex ? [] : {};\n }\n current = current[key];\n }\n }\n current[path[path.length - 1]] = value;\n };\n\n // Recursively walks the AST and assigns values from flat bindings to the nested result.\n const walk = (nodes: InputAstNode[], prefix: string[]) => {\n for (const node of nodes) {\n const pathParts = [...prefix, node.name];\n const flatKey = pathParts.join(\"/\");\n const entry = flat[flatKey];\n const staticValue = entry?.static;\n\n if (node.children.length > 0) {\n if (node.list) {\n const pattern = new RegExp(`^${flatKey}\\\\/(\\\\d+)\\\\/`);\n const indexes = Object.keys(flat).reduce((acc: number[], key) => {\n const match = key.match(pattern);\n if (match) {\n acc.push(parseInt(match[1], 10));\n }\n return acc;\n }, []);\n\n const uniqueIndexes = Array.from(new Set(indexes)).sort((a, b) => a - b);\n\n for (const i of uniqueIndexes) {\n walk(node.children, [...prefix, `${node.name}/${i}`]);\n }\n } else {\n walk(node.children, pathParts);\n }\n } else if (staticValue !== undefined) {\n const path = pathParts.reduce<(string | number)[]>((acc, part) => {\n const match = part.match(/(.*?)\\/(\\d+)/);\n if (match) {\n acc.push(match[1], Number(match[2]));\n } else {\n acc.push(part);\n }\n return acc;\n }, []);\n assignValue(path, staticValue);\n }\n }\n };\n\n walk(this.inputsAst, []);\n return result;\n }\n\n /**\n * Flattens deep inputs object into flat bindings with `.static` wrappers,\n * skipping overrides that match inherited parent breakpoint values.\n */\n public createUpdate(inputs: DeepBindings, breakpoint: string) {\n const operations: IDocumentOperation[] = [];\n const originalInputs = this.rawBindings.inputs ?? {};\n\n const rebuilt: ElementInputsBindings = { inputs: {}, overrides: {} };\n\n // Clone existing overrides if present, to avoid losing breakpoint overrides\n if (this.rawBindings.overrides) {\n for (const [bp, overrides] of Object.entries(this.rawBindings.overrides)) {\n if (overrides.inputs) {\n set(\n rebuilt,\n `overrides.${bp}.inputs`,\n structuredClone(this.rawBindings.overrides[bp].inputs)\n );\n }\n }\n }\n\n // Set to track which flat binding paths we've processed during traversal\n const seenPaths = new Set<string>();\n const valueResolver = new InheritedValueResolver(this.breakpoints, bp => {\n if (this.isBaseBreakpoint(bp)) {\n return this.rawBindings.inputs;\n }\n return this.rawBindings.overrides?.[bp]?.inputs;\n });\n\n // Extracts a nested value from an object based on a flat string path.\n // Supports array indexes like 'rows/0/columns/1/children'.\n const getValue = (obj: any, path: string): any => {\n const segments = path.split(\"/\");\n const keys = segments.flatMap(segment => {\n return segment.split(\".\").map(part => {\n return /^\\d+$/.test(part) ? parseInt(part, 10) : part;\n });\n });\n return keys.reduce((acc, key) => (acc ? acc[key] : undefined), obj);\n };\n\n // Recursively traverses the AST nodes, comparing new input values with original bindings.\n // Collects changed values into 'rebuilt' and generates operations for new elements.\n const compareAndCollect = (nodes: InputAstNode[], prefix: string[]) => {\n for (const node of nodes) {\n const pathParts = [...prefix, node.name];\n const flatKey = pathParts.join(\"/\");\n\n // Mark this path as seen\n seenPaths.add(flatKey);\n\n if (node.children.length) {\n if (node.list) {\n // For list nodes, process each indexed item separately\n const list = getValue(inputs, flatKey);\n if (Array.isArray(list)) {\n for (let i = 0; i < list.length; i++) {\n // Recurse with indexed path like 'rows[0]', 'rows[1]'\n compareAndCollect(node.children, [\n ...pathParts.slice(0, -1),\n `${node.name}/${i}`\n ]);\n }\n }\n } else {\n // For single object nodes, recurse normally\n compareAndCollect(node.children, pathParts);\n }\n } else {\n // Leaf node (primitive or slot) processing\n\n // Get current new value from deep inputs\n const newValue = getValue(inputs, flatKey);\n\n // Get original binding entry for this path\n const originalEntry = originalInputs[flatKey];\n\n // Skip if newValue is undefined and no original entry\n if (newValue === undefined && !originalEntry) {\n continue;\n }\n\n if (typeof newValue === \"object\" && newValue?.action === \"CreateElement\") {\n // Handle CreateElement action by generating element and operations\n const newElement = this.elementFactory.createElementFromComponent({\n componentName: newValue.params.component,\n parentId: this.elementId,\n slot: flatKey,\n index: -1,\n bindings: newValue.params\n });\n\n const createdId = newElement.element.id;\n\n // Assign or generate a stable unique id for the binding\n const existingId = originalEntry?.id;\n const idToUse = existingId ?? generateElementId();\n\n // Build binding for the new element id(s)\n const binding = {\n static: node.list ? [createdId] : createdId,\n type: node.type,\n list: node.list,\n id: idToUse\n };\n\n if (node.input?.responsive && !this.isBaseBreakpoint(breakpoint)) {\n const inheritedValue = valueResolver.getInheritedValue(\n flatKey,\n breakpoint\n );\n\n if (binding.static === undefined) {\n // Unset override\n if (rebuilt.overrides[breakpoint]?.inputs?.[flatKey]) {\n delete rebuilt.overrides[breakpoint].inputs[flatKey];\n }\n } else if (\n inheritedValue === undefined ||\n !deepEqual(inheritedValue, binding.static)\n ) {\n if (!rebuilt.overrides[breakpoint]) {\n rebuilt.overrides[breakpoint] = { inputs: {} };\n }\n rebuilt.overrides[breakpoint].inputs[flatKey] = binding;\n } else {\n if (rebuilt.overrides[breakpoint]?.inputs?.[flatKey]) {\n delete rebuilt.overrides[breakpoint].inputs[flatKey];\n }\n }\n\n if (originalEntry) {\n rebuilt.inputs[flatKey] = originalEntry;\n }\n } else {\n // Normal case: update base inputs\n rebuilt.inputs[flatKey] = binding;\n }\n\n // Add generated operations for this element creation\n operations.push(...newElement.operations);\n } else {\n // Normal value update\n const isResponsive =\n node.input?.responsive && !this.isBaseBreakpoint(breakpoint);\n\n // Assign or generate a stable unique id for the binding\n const existingId = originalEntry?.id;\n const idToUse = existingId ?? generateElementId();\n\n // Merge existing original entry data with updated static value\n const binding = {\n ...(originalEntry ?? {}),\n static: newValue,\n type: node.type,\n list: node.list,\n id: idToUse\n };\n\n if (isResponsive) {\n const inheritedValue = valueResolver.getInheritedValue(\n flatKey,\n breakpoint\n );\n\n if (binding.static === undefined) {\n // Unset override\n if (rebuilt.overrides[breakpoint]?.inputs?.[flatKey]) {\n delete rebuilt.overrides[breakpoint].inputs[flatKey];\n }\n } else if (\n inheritedValue === undefined ||\n !deepEqual(inheritedValue, binding.static)\n ) {\n if (!rebuilt.overrides[breakpoint]) {\n rebuilt.overrides[breakpoint] = { inputs: {} };\n }\n rebuilt.overrides[breakpoint].inputs[flatKey] = binding;\n } else {\n if (rebuilt.overrides[breakpoint]?.inputs?.[flatKey]) {\n delete rebuilt.overrides[breakpoint].inputs[flatKey];\n }\n }\n\n if (originalEntry) {\n rebuilt.inputs[flatKey] = originalEntry;\n }\n } else {\n // Base binding update\n rebuilt.inputs[flatKey] = binding;\n }\n }\n }\n }\n };\n\n // Start the AST traversal and collection.\n compareAndCollect(this.inputsAst, []);\n\n // Identify elements referenced in slots that were removed since last state,\n // and queue their removal.\n const usedSlotIds = this.getElementReferences(rebuilt.inputs);\n for (const id of this.elementReferences) {\n if (!usedSlotIds.has(id)) {\n operations.push(new DocumentOperations.RemoveElement(id));\n }\n }\n\n return new InputsUpdater(this.elementId, rebuilt, operations);\n }\n\n // Returns a set of element IDs referenced in slot bindings within the provided inputs.\n private getElementReferences(inputs: DocumentElementBindings[\"inputs\"] = {}) {\n const references = new Set<string>();\n\n for (const [, binding] of Object.entries(inputs)) {\n if (binding.type === \"slot\") {\n if (Array.isArray(binding.static)) {\n ((binding.static ?? []) as string[]).forEach(id => references.add(id));\n } else if (typeof binding.static === \"string\") {\n references.add(binding.static);\n }\n }\n }\n\n return references;\n }\n\n private isBaseBreakpoint(name: string): boolean {\n return this.breakpoints.indexOf(name) === 0;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"InputBindingsProcessor.js","sources":["../src/InputBindingsProcessor.ts"],"sourcesContent":["import deepEqual from \"deep-equal\";\nimport set from \"lodash/set.js\";\nimport type {\n DocumentElementBindings,\n DocumentElementInputBindings,\n TokenReference\n} from \"~/types.js\";\nimport { InheritedValueResolver } from \"~/InheritedValueResolver.js\";\nimport { isTokenBinding, tokenToCssValue } from \"./tokenBinding.js\";\nimport type { InputAstNode } from \"~/ComponentManifestToAstConverter.js\";\nimport { DocumentOperations, type IDocumentOperation } from \"~/documentOperations/index.js\";\nimport type { ElementFactory } from \"~/ElementFactory.js\";\nimport { InputsUpdater } from \"~/InputsUpdater.js\";\nimport { generateElementId } from \"./generateElementId.js\";\ntype DeepBindings = Record<string, any>;\n\nexport type ElementInputsBindings = {\n inputs: DocumentElementInputBindings;\n overrides: {\n [breakpoint: string]: {\n inputs: DocumentElementInputBindings;\n };\n };\n};\n\n/**\n * Handles deep-to-flat and flat-to-deep conversion of input bindings,\n * with breakpoint inheritance awareness.\n */\nexport class InputsBindingsProcessor {\n private breakpoints: string[];\n private rawBindings: DocumentElementBindings;\n private elementFactory: ElementFactory;\n private elementId: string;\n private inputsAst: InputAstNode[];\n private elementReferences: Set<string>;\n\n constructor(\n elementId: string,\n inputsAst: InputAstNode[],\n breakpoints: string[],\n rawBindings: DocumentElementBindings,\n elementFactory: ElementFactory\n ) {\n this.elementId = elementId;\n this.inputsAst = inputsAst;\n this.breakpoints = breakpoints;\n this.rawBindings = rawBindings;\n this.elementFactory = elementFactory;\n this.elementReferences = this.getElementReferences(rawBindings.inputs);\n }\n\n /**\n * The token references among these bindings, keyed by flat binding path.\n *\n * The counterpart to {@link toDeepInputs}: that resolves a reference to the CSS value so the preview\n * renders it, this reports *that it was a reference* so a picker can show which token is selected and\n * so {@link createUpdate} can write it back as one.\n *\n * Callers must seed their token map from this before editing. `createUpdate` treats an absent key as\n * \"make this a literal\", which is what clears a reference when someone picks a free value — so an\n * incomplete map silently converts every other token on the element into a frozen literal.\n */\n public toTokenMap(\n flat: NonNullable<DocumentElementBindings[\"inputs\"]> = {}\n ): Record<string, TokenReference> {\n const result: Record<string, TokenReference> = {};\n\n for (const [key, binding] of Object.entries(flat)) {\n if (isTokenBinding(binding)) {\n result[key] = binding.token;\n }\n }\n\n return result;\n }\n\n /**\n * Converts flat input bindings into deep inputs object (removes `.static` wrappers).\n *\n * A token reference yields its `var(--wby-…)` form, so an input bound to a theme colour renders the\n * themed value in the editor exactly as it will on the site. Use {@link toTokenMap} alongside this\n * when you need to know a value came from a token rather than a literal.\n */\n public toDeepInputs(flat: NonNullable<DocumentElementBindings[\"inputs\"]>): DeepBindings {\n const result: DeepBindings = {};\n\n // Assigns a value to a nested path within the result object, creating arrays/objects as needed.\n const assignValue = (path: (string | number)[], value: any) => {\n let current = result;\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i];\n const nextKey = path[i + 1];\n const isNextIndex = typeof nextKey === \"number\";\n\n if (typeof key === \"number\") {\n if (!Array.isArray(current)) {\n throw new Error(\"Expected array in path assignment.\");\n }\n while (current.length <= key) {\n current.push(isNextIndex ? [] : {});\n }\n if (typeof current[key] !== \"object\") {\n current[key] = isNextIndex ? [] : {};\n }\n current = current[key];\n } else {\n if (!(key in current) || typeof current[key] !== \"object\") {\n current[key] = isNextIndex ? [] : {};\n }\n current = current[key];\n }\n }\n current[path[path.length - 1]] = value;\n };\n\n // Recursively walks the AST and assigns values from flat bindings to the nested result.\n const walk = (nodes: InputAstNode[], prefix: string[]) => {\n for (const node of nodes) {\n const pathParts = [...prefix, node.name];\n const flatKey = pathParts.join(\"/\");\n const entry = flat[flatKey];\n // A token binding has no `static`, so it has to be resolved here or the input would\n // read as unset and the preview would fall back to the component's default.\n const staticValue = isTokenBinding(entry)\n ? tokenToCssValue(entry.token)\n : entry?.static;\n\n if (node.children.length > 0) {\n if (node.list) {\n const pattern = new RegExp(`^${flatKey}\\\\/(\\\\d+)\\\\/`);\n const indexes = Object.keys(flat).reduce((acc: number[], key) => {\n const match = key.match(pattern);\n if (match) {\n acc.push(parseInt(match[1], 10));\n }\n return acc;\n }, []);\n\n const uniqueIndexes = Array.from(new Set(indexes)).sort((a, b) => a - b);\n\n for (const i of uniqueIndexes) {\n walk(node.children, [...prefix, `${node.name}/${i}`]);\n }\n } else {\n walk(node.children, pathParts);\n }\n } else if (staticValue !== undefined) {\n const path = pathParts.reduce<(string | number)[]>((acc, part) => {\n const match = part.match(/(.*?)\\/(\\d+)/);\n if (match) {\n acc.push(match[1], Number(match[2]));\n } else {\n acc.push(part);\n }\n return acc;\n }, []);\n assignValue(path, staticValue);\n }\n }\n };\n\n walk(this.inputsAst, []);\n return result;\n }\n\n /**\n * Flattens deep inputs object into flat bindings with `.static` wrappers,\n * skipping overrides that match inherited parent breakpoint values.\n *\n * @param tokens Flat binding paths in this map are written as token references instead of literals.\n * A path absent from it is written as `static`, which is what clears a reference when\n * someone picks a free value over a token — so callers must seed the map from\n * {@link toTokenMap} rather than passing only the path they changed.\n */\n public createUpdate(\n inputs: DeepBindings,\n breakpoint: string,\n tokens: Record<string, TokenReference> = {}\n ) {\n const operations: IDocumentOperation[] = [];\n const originalInputs = this.rawBindings.inputs ?? {};\n\n const rebuilt: ElementInputsBindings = { inputs: {}, overrides: {} };\n\n // Clone existing overrides if present, to avoid losing breakpoint overrides\n if (this.rawBindings.overrides) {\n for (const [bp, overrides] of Object.entries(this.rawBindings.overrides)) {\n if (overrides.inputs) {\n set(\n rebuilt,\n `overrides.${bp}.inputs`,\n structuredClone(this.rawBindings.overrides[bp].inputs)\n );\n }\n }\n }\n\n // Set to track which flat binding paths we've processed during traversal\n const seenPaths = new Set<string>();\n const valueResolver = new InheritedValueResolver(this.breakpoints, bp => {\n if (this.isBaseBreakpoint(bp)) {\n return this.rawBindings.inputs;\n }\n return this.rawBindings.overrides?.[bp]?.inputs;\n });\n\n // Extracts a nested value from an object based on a flat string path.\n // Supports array indexes like 'rows/0/columns/1/children'.\n const getValue = (obj: any, path: string): any => {\n const segments = path.split(\"/\");\n const keys = segments.flatMap(segment => {\n return segment.split(\".\").map(part => {\n return /^\\d+$/.test(part) ? parseInt(part, 10) : part;\n });\n });\n return keys.reduce((acc, key) => (acc ? acc[key] : undefined), obj);\n };\n\n // Recursively traverses the AST nodes, comparing new input values with original bindings.\n // Collects changed values into 'rebuilt' and generates operations for new elements.\n const compareAndCollect = (nodes: InputAstNode[], prefix: string[]) => {\n for (const node of nodes) {\n const pathParts = [...prefix, node.name];\n const flatKey = pathParts.join(\"/\");\n\n // Mark this path as seen\n seenPaths.add(flatKey);\n\n if (node.children.length) {\n if (node.list) {\n // For list nodes, process each indexed item separately\n const list = getValue(inputs, flatKey);\n if (Array.isArray(list)) {\n for (let i = 0; i < list.length; i++) {\n // Recurse with indexed path like 'rows[0]', 'rows[1]'\n compareAndCollect(node.children, [\n ...pathParts.slice(0, -1),\n `${node.name}/${i}`\n ]);\n }\n }\n } else {\n // For single object nodes, recurse normally\n compareAndCollect(node.children, pathParts);\n }\n } else {\n // Leaf node (primitive or slot) processing\n\n // Get current new value from deep inputs\n let newValue = getValue(inputs, flatKey);\n\n // Get original binding entry for this path\n const originalEntry = originalInputs[flatKey];\n\n // Skip if newValue is undefined and no original entry\n if (newValue === undefined && !originalEntry) {\n continue;\n }\n\n // For list slots, process CreateElement items within the array.\n if (node.list && Array.isArray(newValue)) {\n newValue = newValue.map(item => {\n if (\n typeof item === \"object\" &&\n item !== null &&\n item.action === \"CreateElement\"\n ) {\n const newElement = this.elementFactory.createElementFromComponent({\n componentName: item.params.component,\n parentId: this.elementId,\n slot: flatKey,\n bindings: item.params\n });\n // Skip AddToParent — this processor manages the binding array.\n operations.push(\n ...newElement.operations.filter(\n op => !(op instanceof DocumentOperations.AddToParent)\n )\n );\n return newElement.element.id;\n }\n return item;\n });\n }\n\n if (\n !Array.isArray(newValue) &&\n typeof newValue === \"object\" &&\n newValue?.action === \"CreateElement\"\n ) {\n // Handle single (non-list) CreateElement action\n const newElement = this.elementFactory.createElementFromComponent({\n componentName: newValue.params.component,\n parentId: this.elementId,\n slot: flatKey,\n index: -1,\n bindings: newValue.params\n });\n\n const createdId = newElement.element.id;\n\n // Assign or generate a stable unique id for the binding\n const existingId = originalEntry?.id;\n const idToUse = existingId ?? generateElementId();\n\n // Build binding for the new element id(s)\n const binding = {\n static: createdId,\n type: node.type,\n list: node.list,\n id: idToUse\n };\n\n if (node.input?.responsive && !this.isBaseBreakpoint(breakpoint)) {\n const inheritedValue = valueResolver.getInheritedValue(\n flatKey,\n breakpoint\n );\n\n if (binding.static === undefined) {\n // Unset override\n if (rebuilt.overrides[breakpoint]?.inputs?.[flatKey]) {\n delete rebuilt.overrides[breakpoint].inputs[flatKey];\n }\n } else if (\n inheritedValue === undefined ||\n !deepEqual(inheritedValue, binding.static)\n ) {\n if (!rebuilt.overrides[breakpoint]) {\n rebuilt.overrides[breakpoint] = { inputs: {} };\n }\n rebuilt.overrides[breakpoint].inputs[flatKey] = binding;\n } else {\n if (rebuilt.overrides[breakpoint]?.inputs?.[flatKey]) {\n delete rebuilt.overrides[breakpoint].inputs[flatKey];\n }\n }\n\n if (originalEntry) {\n rebuilt.inputs[flatKey] = originalEntry;\n }\n } else {\n // Normal case: update base inputs\n rebuilt.inputs[flatKey] = binding;\n }\n\n // Skip AddToParent — this processor manages the binding directly.\n operations.push(\n ...newElement.operations.filter(\n op => !(op instanceof DocumentOperations.AddToParent)\n )\n );\n } else {\n // Normal value update\n const isResponsive =\n node.input?.responsive && !this.isBaseBreakpoint(breakpoint);\n\n // Assign or generate a stable unique id for the binding\n const existingId = originalEntry?.id;\n const idToUse = existingId ?? generateElementId();\n\n const token = tokens[flatKey];\n\n // A binding holds either a reference or a literal, never both. `originalEntry` is\n // spread first, so whichever of the two it used to carry has to be removed —\n // leaving a stale `static` beside a new `token` would make the stored value\n // ambiguous, and which one won would depend on the reader.\n //\n // The unused key is deleted rather than set to `undefined`: an explicit\n // `undefined` survives in memory and some serializers write it out as `null`,\n // which reads back as a real value.\n const binding: DocumentElementInputBindings[string] = {\n ...(originalEntry ?? {}),\n type: node.type,\n list: node.list,\n id: idToUse\n };\n\n if (token) {\n binding.token = token;\n delete binding.static;\n } else {\n binding.static = newValue;\n delete binding.token;\n }\n\n if (isResponsive) {\n const inherited = valueResolver.getInheritedBinding(\n flatKey,\n breakpoint\n );\n\n // Compared like against like: a token override is redundant when it points at\n // the same token as the breakpoint above, and a literal override is redundant\n // when it equals the inherited literal. Comparing a token against a literal\n // always differs, which is correct — they are genuinely different bindings.\n const isRedundant = token\n ? inherited?.token !== undefined &&\n deepEqual(inherited.token, token)\n : inherited?.static !== undefined &&\n deepEqual(inherited.static, newValue);\n\n const isUnset = token === undefined && newValue === undefined;\n\n if (isUnset || isRedundant) {\n if (rebuilt.overrides[breakpoint]?.inputs?.[flatKey]) {\n delete rebuilt.overrides[breakpoint].inputs[flatKey];\n }\n } else {\n if (!rebuilt.overrides[breakpoint]) {\n rebuilt.overrides[breakpoint] = { inputs: {} };\n }\n rebuilt.overrides[breakpoint].inputs[flatKey] = binding;\n }\n\n if (originalEntry) {\n rebuilt.inputs[flatKey] = originalEntry;\n }\n } else {\n // Base binding update\n rebuilt.inputs[flatKey] = binding;\n }\n }\n }\n }\n };\n\n // Start the AST traversal and collection.\n compareAndCollect(this.inputsAst, []);\n\n // Identify elements referenced in slots that were removed since last state,\n // and queue their removal.\n const usedSlotIds = this.getElementReferences(rebuilt.inputs);\n for (const id of this.elementReferences) {\n if (!usedSlotIds.has(id)) {\n operations.push(new DocumentOperations.RemoveElement(id));\n }\n }\n\n return new InputsUpdater(this.elementId, rebuilt, operations);\n }\n\n // Returns a set of element IDs referenced in slot bindings within the provided inputs.\n private getElementReferences(inputs: DocumentElementBindings[\"inputs\"] = {}) {\n const references = new Set<string>();\n\n for (const [, binding] of Object.entries(inputs)) {\n if (binding.type === \"slot\") {\n if (Array.isArray(binding.static)) {\n ((binding.static ?? []) as string[]).forEach(id => references.add(id));\n } else if (typeof binding.static === \"string\") {\n references.add(binding.static);\n }\n }\n }\n\n return references;\n }\n\n private isBaseBreakpoint(name: string): boolean {\n return this.breakpoints.indexOf(name) === 0;\n }\n}\n"],"names":["InputsBindingsProcessor","elementId","inputsAst","breakpoints","rawBindings","elementFactory","flat","result","key","binding","Object","isTokenBinding","assignValue","path","value","current","i","nextKey","isNextIndex","Array","Error","walk","nodes","prefix","node","pathParts","flatKey","entry","staticValue","tokenToCssValue","pattern","RegExp","indexes","acc","match","parseInt","uniqueIndexes","Set","a","b","undefined","part","Number","inputs","breakpoint","tokens","operations","originalInputs","rebuilt","bp","overrides","set","structuredClone","seenPaths","valueResolver","InheritedValueResolver","getValue","obj","segments","keys","segment","compareAndCollect","list","newValue","originalEntry","item","newElement","op","DocumentOperations","isResponsive","existingId","idToUse","generateElementId","token","inherited","isRedundant","deepEqual","isUnset","createdId","inheritedValue","usedSlotIds","id","InputsUpdater","references","name"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,400 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { InputsBindingsProcessor } from "./InputBindingsProcessor.js";
3
+ import { ElementFactory } from "./ElementFactory.js";
4
+ const ELEMENT_ID = "el-1";
5
+ const BRAND = {
6
+ path: "color.action.primary.background",
7
+ fallback: "#1f6feb"
8
+ };
9
+ const SURFACE = {
10
+ path: "color.surface.page",
11
+ fallback: "#ffffff"
12
+ };
13
+ const ast = [
14
+ {
15
+ name: "background",
16
+ type: "color",
17
+ list: false,
18
+ path: "background",
19
+ children: [],
20
+ input: {
21
+ type: "color",
22
+ name: "background",
23
+ label: "Background"
24
+ }
25
+ },
26
+ {
27
+ name: "border",
28
+ type: "color",
29
+ list: false,
30
+ path: "border",
31
+ children: [],
32
+ input: {
33
+ type: "color",
34
+ name: "border",
35
+ label: "Border",
36
+ responsive: true
37
+ }
38
+ },
39
+ {
40
+ name: "items",
41
+ type: "object",
42
+ list: true,
43
+ path: "items",
44
+ children: [
45
+ {
46
+ name: "color",
47
+ type: "color",
48
+ list: false,
49
+ path: "items.color",
50
+ children: [],
51
+ input: {
52
+ type: "color",
53
+ name: "color",
54
+ label: "Colour"
55
+ }
56
+ }
57
+ ],
58
+ input: {
59
+ type: "object",
60
+ name: "items",
61
+ list: true,
62
+ fields: [
63
+ {
64
+ type: "color",
65
+ name: "color",
66
+ label: "Colour"
67
+ }
68
+ ]
69
+ }
70
+ }
71
+ ];
72
+ const BREAKPOINTS = [
73
+ "desktop",
74
+ "tablet",
75
+ "mobile"
76
+ ];
77
+ const makeProcessor = (bindings)=>new InputsBindingsProcessor(ELEMENT_ID, ast, BREAKPOINTS, bindings, new ElementFactory({}));
78
+ const emptyBindings = ()=>({
79
+ inputs: {},
80
+ styles: {}
81
+ });
82
+ const apply = (updater)=>{
83
+ const document = {
84
+ bindings: {
85
+ [ELEMENT_ID]: {
86
+ inputs: {},
87
+ styles: {}
88
+ }
89
+ }
90
+ };
91
+ updater.applyToDocument(document);
92
+ return document.bindings[ELEMENT_ID];
93
+ };
94
+ describe("toTokenMap", ()=>{
95
+ it("reports token bindings by their flat path", ()=>{
96
+ const map = makeProcessor(emptyBindings()).toTokenMap({
97
+ background: {
98
+ token: BRAND,
99
+ id: "a",
100
+ type: "color"
101
+ },
102
+ border: {
103
+ static: "#cccccc",
104
+ id: "b",
105
+ type: "color"
106
+ }
107
+ });
108
+ expect(map).toEqual({
109
+ background: BRAND
110
+ });
111
+ });
112
+ it("finds tokens inside list items", ()=>{
113
+ const map = makeProcessor(emptyBindings()).toTokenMap({
114
+ "items/0/color": {
115
+ token: BRAND,
116
+ id: "a",
117
+ type: "color"
118
+ },
119
+ "items/1/color": {
120
+ static: "#000000",
121
+ id: "b",
122
+ type: "color"
123
+ }
124
+ });
125
+ expect(map).toEqual({
126
+ "items/0/color": BRAND
127
+ });
128
+ });
129
+ it("is empty for an element with no bindings", ()=>{
130
+ expect(makeProcessor(emptyBindings()).toTokenMap()).toEqual({});
131
+ });
132
+ });
133
+ describe("toDeepInputs with tokens", ()=>{
134
+ it("resolves a token to its CSS variable so the preview renders the themed value", ()=>{
135
+ const deep = makeProcessor(emptyBindings()).toDeepInputs({
136
+ background: {
137
+ token: BRAND,
138
+ id: "a",
139
+ type: "color"
140
+ }
141
+ });
142
+ expect(deep.background).toBe("var(--wby-color-action-primary-background, #1f6feb)");
143
+ });
144
+ it("emits the variable without a fallback when none was captured", ()=>{
145
+ const deep = makeProcessor(emptyBindings()).toDeepInputs({
146
+ background: {
147
+ token: {
148
+ path: "color.surface.page"
149
+ },
150
+ id: "a",
151
+ type: "color"
152
+ }
153
+ });
154
+ expect(deep.background).toBe("var(--wby-color-surface-page)");
155
+ });
156
+ it("still reads literals unchanged", ()=>{
157
+ const deep = makeProcessor(emptyBindings()).toDeepInputs({
158
+ background: {
159
+ static: "#abcdef",
160
+ id: "a",
161
+ type: "color"
162
+ }
163
+ });
164
+ expect(deep.background).toBe("#abcdef");
165
+ });
166
+ it("resolves tokens inside list items", ()=>{
167
+ const deep = makeProcessor(emptyBindings()).toDeepInputs({
168
+ "items/0/color": {
169
+ token: BRAND,
170
+ id: "a",
171
+ type: "color"
172
+ }
173
+ });
174
+ expect(deep.items[0].color).toBe("var(--wby-color-action-primary-background, #1f6feb)");
175
+ });
176
+ });
177
+ describe("createUpdate with tokens", ()=>{
178
+ it("stores a reference instead of a literal", ()=>{
179
+ const updater = makeProcessor(emptyBindings()).createUpdate({
180
+ background: "#1f6feb"
181
+ }, "desktop", {
182
+ background: BRAND
183
+ });
184
+ const binding = apply(updater).inputs.background;
185
+ expect(binding.token).toEqual(BRAND);
186
+ expect(binding).not.toHaveProperty("static");
187
+ });
188
+ it("keeps the type, list flag and id alongside the reference", ()=>{
189
+ const updater = makeProcessor(emptyBindings()).createUpdate({
190
+ background: "#1f6feb"
191
+ }, "desktop", {
192
+ background: BRAND
193
+ });
194
+ const binding = apply(updater).inputs.background;
195
+ expect(binding.type).toBe("color");
196
+ expect(binding.list).toBe(false);
197
+ expect(binding.id).toBeTruthy();
198
+ });
199
+ it("clears a reference when a free value is picked instead", ()=>{
200
+ const updater = makeProcessor({
201
+ inputs: {
202
+ background: {
203
+ token: BRAND,
204
+ id: "a",
205
+ type: "color"
206
+ }
207
+ },
208
+ styles: {}
209
+ }).createUpdate({
210
+ background: "#ff0000"
211
+ }, "desktop", {});
212
+ const binding = apply(updater).inputs.background;
213
+ expect(binding.static).toBe("#ff0000");
214
+ expect(binding).not.toHaveProperty("token");
215
+ });
216
+ it("replaces one token with another without leaving the first behind", ()=>{
217
+ const updater = makeProcessor({
218
+ inputs: {
219
+ background: {
220
+ token: BRAND,
221
+ id: "a",
222
+ type: "color"
223
+ }
224
+ },
225
+ styles: {}
226
+ }).createUpdate({
227
+ background: "#ffffff"
228
+ }, "desktop", {
229
+ background: SURFACE
230
+ });
231
+ expect(apply(updater).inputs.background.token).toEqual(SURFACE);
232
+ });
233
+ it("never stores a literal and a reference together", ()=>{
234
+ const updater = makeProcessor({
235
+ inputs: {
236
+ background: {
237
+ static: "#abcdef",
238
+ id: "a",
239
+ type: "color"
240
+ }
241
+ },
242
+ styles: {}
243
+ }).createUpdate({
244
+ background: "#1f6feb"
245
+ }, "desktop", {
246
+ background: BRAND
247
+ });
248
+ const binding = apply(updater).inputs.background;
249
+ expect(Object.keys(binding)).not.toContain("static");
250
+ expect(binding.token).toEqual(BRAND);
251
+ });
252
+ it("preserves the existing binding id when replacing a literal with a token", ()=>{
253
+ const updater = makeProcessor({
254
+ inputs: {
255
+ background: {
256
+ static: "#abcdef",
257
+ id: "keep-me",
258
+ type: "color"
259
+ }
260
+ },
261
+ styles: {}
262
+ }).createUpdate({
263
+ background: "#1f6feb"
264
+ }, "desktop", {
265
+ background: BRAND
266
+ });
267
+ expect(apply(updater).inputs.background.id).toBe("keep-me");
268
+ });
269
+ it("stores a reference on a list item", ()=>{
270
+ const updater = makeProcessor(emptyBindings()).createUpdate({
271
+ items: [
272
+ {
273
+ color: "#1f6feb"
274
+ },
275
+ {
276
+ color: "#000000"
277
+ }
278
+ ]
279
+ }, "desktop", {
280
+ "items/0/color": BRAND
281
+ });
282
+ const inputs = apply(updater).inputs;
283
+ expect(inputs["items/0/color"].token).toEqual(BRAND);
284
+ expect(inputs["items/1/color"].static).toBe("#000000");
285
+ });
286
+ it("leaves literal bindings alone when an unrelated token is set", ()=>{
287
+ const updater = makeProcessor(emptyBindings()).createUpdate({
288
+ background: "#1f6feb",
289
+ border: "#cccccc"
290
+ }, "desktop", {
291
+ background: BRAND
292
+ });
293
+ const inputs = apply(updater).inputs;
294
+ expect(inputs.background.token).toEqual(BRAND);
295
+ expect(inputs.border.static).toBe("#cccccc");
296
+ });
297
+ });
298
+ describe("createUpdate token inheritance across breakpoints", ()=>{
299
+ const withDesktopToken = ()=>({
300
+ inputs: {
301
+ border: {
302
+ token: BRAND,
303
+ id: "a",
304
+ type: "color"
305
+ }
306
+ },
307
+ styles: {}
308
+ });
309
+ it("does not write an override that repeats the inherited token", ()=>{
310
+ const updater = makeProcessor(withDesktopToken()).createUpdate({
311
+ border: "var(--wby-color-action-primary-background, #1f6feb)"
312
+ }, "mobile", {
313
+ border: BRAND
314
+ });
315
+ expect(apply(updater).overrides?.mobile?.inputs?.border).toBeUndefined();
316
+ });
317
+ it("writes an override for a different token", ()=>{
318
+ const updater = makeProcessor(withDesktopToken()).createUpdate({
319
+ border: "#ffffff"
320
+ }, "mobile", {
321
+ border: SURFACE
322
+ });
323
+ expect(apply(updater).overrides.mobile.inputs.border.token).toEqual(SURFACE);
324
+ });
325
+ it("writes an override when a literal replaces an inherited token", ()=>{
326
+ const updater = makeProcessor(withDesktopToken()).createUpdate({
327
+ border: "#ff0000"
328
+ }, "mobile", {});
329
+ expect(apply(updater).overrides.mobile.inputs.border.static).toBe("#ff0000");
330
+ });
331
+ it("writes an override when a token replaces an inherited literal", ()=>{
332
+ const updater = makeProcessor({
333
+ inputs: {
334
+ border: {
335
+ static: "#cccccc",
336
+ id: "a",
337
+ type: "color"
338
+ }
339
+ },
340
+ styles: {}
341
+ }).createUpdate({
342
+ border: "#1f6feb"
343
+ }, "mobile", {
344
+ border: BRAND
345
+ });
346
+ expect(apply(updater).overrides.mobile.inputs.border.token).toEqual(BRAND);
347
+ });
348
+ it("still skips an override that repeats an inherited literal", ()=>{
349
+ const updater = makeProcessor({
350
+ inputs: {
351
+ border: {
352
+ static: "#cccccc",
353
+ id: "a",
354
+ type: "color"
355
+ }
356
+ },
357
+ styles: {}
358
+ }).createUpdate({
359
+ border: "#cccccc"
360
+ }, "mobile", {});
361
+ expect(apply(updater).overrides?.mobile?.inputs?.border).toBeUndefined();
362
+ });
363
+ it("removes an existing override when the value is unset entirely", ()=>{
364
+ const bindings = {
365
+ inputs: {
366
+ border: {
367
+ static: "#cccccc",
368
+ id: "a",
369
+ type: "color"
370
+ }
371
+ },
372
+ overrides: {
373
+ mobile: {
374
+ inputs: {
375
+ border: {
376
+ static: "#ff0000",
377
+ id: "a",
378
+ type: "color"
379
+ }
380
+ }
381
+ }
382
+ },
383
+ styles: {}
384
+ };
385
+ const updater = makeProcessor(bindings).createUpdate({
386
+ border: void 0
387
+ }, "mobile", {});
388
+ expect(apply(updater).overrides?.mobile?.inputs?.border).toBeUndefined();
389
+ });
390
+ it("keeps the base binding untouched while writing a breakpoint override", ()=>{
391
+ const updater = makeProcessor(withDesktopToken()).createUpdate({
392
+ border: "#ffffff"
393
+ }, "mobile", {
394
+ border: SURFACE
395
+ });
396
+ expect(apply(updater).inputs.border.token).toEqual(BRAND);
397
+ });
398
+ });
399
+
400
+ //# sourceMappingURL=InputBindingsProcessorTokens.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InputBindingsProcessorTokens.test.js","sources":["../src/InputBindingsProcessorTokens.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { InputsBindingsProcessor } from \"./InputBindingsProcessor.js\";\nimport type { InputAstNode } from \"~/ComponentManifestToAstConverter.js\";\nimport type { DocumentElementBindings, TokenReference } from \"~/types.js\";\nimport { ElementFactory } from \"~/ElementFactory.js\";\nimport type { InputsUpdater } from \"~/InputsUpdater.js\";\n\n/**\n * Token references on element *inputs* — the counterpart to the same support on styles.\n *\n * Inputs were the harder half: the styles processor works over a flat map of CSS properties, whereas this\n * one reconstructs nested and list bindings from `/`-delimited paths, and each binding carries `type`,\n * `list` and `id` alongside its value.\n */\n\nconst ELEMENT_ID = \"el-1\";\n\nconst BRAND: TokenReference = { path: \"color.action.primary.background\", fallback: \"#1f6feb\" };\nconst SURFACE: TokenReference = { path: \"color.surface.page\", fallback: \"#ffffff\" };\n\nconst ast: InputAstNode[] = [\n {\n name: \"background\",\n type: \"color\",\n list: false,\n path: \"background\",\n children: [],\n input: { type: \"color\", name: \"background\", label: \"Background\" }\n },\n {\n name: \"border\",\n type: \"color\",\n list: false,\n path: \"border\",\n children: [],\n input: { type: \"color\", name: \"border\", label: \"Border\", responsive: true }\n },\n {\n name: \"items\",\n type: \"object\",\n list: true,\n path: \"items\",\n children: [\n {\n name: \"color\",\n type: \"color\",\n list: false,\n path: \"items.color\",\n children: [],\n input: { type: \"color\", name: \"color\", label: \"Colour\" }\n }\n ],\n input: {\n type: \"object\",\n name: \"items\",\n list: true,\n fields: [{ type: \"color\", name: \"color\", label: \"Colour\" }]\n }\n }\n];\n\nconst BREAKPOINTS = [\"desktop\", \"tablet\", \"mobile\"];\n\nconst makeProcessor = (bindings: DocumentElementBindings) =>\n new InputsBindingsProcessor(ELEMENT_ID, ast, BREAKPOINTS, bindings, new ElementFactory({}));\n\nconst emptyBindings = (): DocumentElementBindings => ({ inputs: {}, styles: {} });\n\n/** Applies the update to a stand-in document and returns the element's bindings, as the editor sees them. */\nconst apply = (updater: InputsUpdater) => {\n const document: any = { bindings: { [ELEMENT_ID]: { inputs: {}, styles: {} } } };\n updater.applyToDocument(document);\n return document.bindings[ELEMENT_ID];\n};\n\ndescribe(\"toTokenMap\", () => {\n it(\"reports token bindings by their flat path\", () => {\n const map = makeProcessor(emptyBindings()).toTokenMap({\n background: { token: BRAND, id: \"a\", type: \"color\" },\n border: { static: \"#cccccc\", id: \"b\", type: \"color\" }\n });\n\n expect(map).toEqual({ background: BRAND });\n });\n\n it(\"finds tokens inside list items\", () => {\n const map = makeProcessor(emptyBindings()).toTokenMap({\n \"items/0/color\": { token: BRAND, id: \"a\", type: \"color\" },\n \"items/1/color\": { static: \"#000000\", id: \"b\", type: \"color\" }\n });\n\n expect(map).toEqual({ \"items/0/color\": BRAND });\n });\n\n it(\"is empty for an element with no bindings\", () => {\n expect(makeProcessor(emptyBindings()).toTokenMap()).toEqual({});\n });\n});\n\ndescribe(\"toDeepInputs with tokens\", () => {\n it(\"resolves a token to its CSS variable so the preview renders the themed value\", () => {\n const deep = makeProcessor(emptyBindings()).toDeepInputs({\n background: { token: BRAND, id: \"a\", type: \"color\" }\n });\n\n expect(deep.background).toBe(\"var(--wby-color-action-primary-background, #1f6feb)\");\n });\n\n it(\"emits the variable without a fallback when none was captured\", () => {\n const deep = makeProcessor(emptyBindings()).toDeepInputs({\n background: { token: { path: \"color.surface.page\" }, id: \"a\", type: \"color\" }\n });\n\n expect(deep.background).toBe(\"var(--wby-color-surface-page)\");\n });\n\n it(\"still reads literals unchanged\", () => {\n const deep = makeProcessor(emptyBindings()).toDeepInputs({\n background: { static: \"#abcdef\", id: \"a\", type: \"color\" }\n });\n\n expect(deep.background).toBe(\"#abcdef\");\n });\n\n it(\"resolves tokens inside list items\", () => {\n const deep = makeProcessor(emptyBindings()).toDeepInputs({\n \"items/0/color\": { token: BRAND, id: \"a\", type: \"color\" }\n });\n\n expect(deep.items[0].color).toBe(\"var(--wby-color-action-primary-background, #1f6feb)\");\n });\n});\n\ndescribe(\"createUpdate with tokens\", () => {\n it(\"stores a reference instead of a literal\", () => {\n const updater = makeProcessor(emptyBindings()).createUpdate(\n { background: \"#1f6feb\" },\n \"desktop\",\n { background: BRAND }\n );\n\n const binding = apply(updater).inputs.background;\n\n expect(binding.token).toEqual(BRAND);\n expect(binding).not.toHaveProperty(\"static\");\n });\n\n it(\"keeps the type, list flag and id alongside the reference\", () => {\n // These travel with an input binding and are not optional — a token binding that dropped them\n // would break every reader that switches on `type`.\n const updater = makeProcessor(emptyBindings()).createUpdate(\n { background: \"#1f6feb\" },\n \"desktop\",\n { background: BRAND }\n );\n\n const binding = apply(updater).inputs.background;\n\n expect(binding.type).toBe(\"color\");\n expect(binding.list).toBe(false);\n expect(binding.id).toBeTruthy();\n });\n\n it(\"clears a reference when a free value is picked instead\", () => {\n // The absence of a path from the token map is the signal, which is why callers must seed the map\n // from `toTokenMap` rather than passing only what they changed.\n const updater = makeProcessor({\n inputs: { background: { token: BRAND, id: \"a\", type: \"color\" } },\n styles: {}\n }).createUpdate({ background: \"#ff0000\" }, \"desktop\", {});\n\n const binding = apply(updater).inputs.background;\n\n expect(binding.static).toBe(\"#ff0000\");\n expect(binding).not.toHaveProperty(\"token\");\n });\n\n it(\"replaces one token with another without leaving the first behind\", () => {\n const updater = makeProcessor({\n inputs: { background: { token: BRAND, id: \"a\", type: \"color\" } },\n styles: {}\n }).createUpdate({ background: \"#ffffff\" }, \"desktop\", { background: SURFACE });\n\n expect(apply(updater).inputs.background.token).toEqual(SURFACE);\n });\n\n it(\"never stores a literal and a reference together\", () => {\n // Which one wins would otherwise depend on the reader.\n const updater = makeProcessor({\n inputs: { background: { static: \"#abcdef\", id: \"a\", type: \"color\" } },\n styles: {}\n }).createUpdate({ background: \"#1f6feb\" }, \"desktop\", { background: BRAND });\n\n const binding = apply(updater).inputs.background;\n\n expect(Object.keys(binding)).not.toContain(\"static\");\n expect(binding.token).toEqual(BRAND);\n });\n\n it(\"preserves the existing binding id when replacing a literal with a token\", () => {\n const updater = makeProcessor({\n inputs: { background: { static: \"#abcdef\", id: \"keep-me\", type: \"color\" } },\n styles: {}\n }).createUpdate({ background: \"#1f6feb\" }, \"desktop\", { background: BRAND });\n\n expect(apply(updater).inputs.background.id).toBe(\"keep-me\");\n });\n\n it(\"stores a reference on a list item\", () => {\n const updater = makeProcessor(emptyBindings()).createUpdate(\n { items: [{ color: \"#1f6feb\" }, { color: \"#000000\" }] },\n \"desktop\",\n { \"items/0/color\": BRAND }\n );\n\n const inputs = apply(updater).inputs;\n\n expect(inputs[\"items/0/color\"].token).toEqual(BRAND);\n expect(inputs[\"items/1/color\"].static).toBe(\"#000000\");\n });\n\n it(\"leaves literal bindings alone when an unrelated token is set\", () => {\n const updater = makeProcessor(emptyBindings()).createUpdate(\n { background: \"#1f6feb\", border: \"#cccccc\" },\n \"desktop\",\n { background: BRAND }\n );\n\n const inputs = apply(updater).inputs;\n\n expect(inputs.background.token).toEqual(BRAND);\n expect(inputs.border.static).toBe(\"#cccccc\");\n });\n});\n\ndescribe(\"createUpdate token inheritance across breakpoints\", () => {\n const withDesktopToken = (): DocumentElementBindings => ({\n inputs: { border: { token: BRAND, id: \"a\", type: \"color\" } },\n styles: {}\n });\n\n it(\"does not write an override that repeats the inherited token\", () => {\n // The bug this guards: `getInheritedValue` only ever read `.static`, so a token inherited from a\n // parent breakpoint looked unset and an override was written every time — which would then stop\n // following the theme at that breakpoint.\n const updater = makeProcessor(withDesktopToken()).createUpdate(\n { border: \"var(--wby-color-action-primary-background, #1f6feb)\" },\n \"mobile\",\n { border: BRAND }\n );\n\n expect(apply(updater).overrides?.mobile?.inputs?.border).toBeUndefined();\n });\n\n it(\"writes an override for a different token\", () => {\n const updater = makeProcessor(withDesktopToken()).createUpdate(\n { border: \"#ffffff\" },\n \"mobile\",\n { border: SURFACE }\n );\n\n expect(apply(updater).overrides.mobile.inputs.border.token).toEqual(SURFACE);\n });\n\n it(\"writes an override when a literal replaces an inherited token\", () => {\n // A token and a literal are genuinely different bindings, so this is never redundant.\n const updater = makeProcessor(withDesktopToken()).createUpdate(\n { border: \"#ff0000\" },\n \"mobile\",\n {}\n );\n\n expect(apply(updater).overrides.mobile.inputs.border.static).toBe(\"#ff0000\");\n });\n\n it(\"writes an override when a token replaces an inherited literal\", () => {\n const updater = makeProcessor({\n inputs: { border: { static: \"#cccccc\", id: \"a\", type: \"color\" } },\n styles: {}\n }).createUpdate({ border: \"#1f6feb\" }, \"mobile\", { border: BRAND });\n\n expect(apply(updater).overrides.mobile.inputs.border.token).toEqual(BRAND);\n });\n\n it(\"still skips an override that repeats an inherited literal\", () => {\n // The pre-existing behaviour, retained.\n const updater = makeProcessor({\n inputs: { border: { static: \"#cccccc\", id: \"a\", type: \"color\" } },\n styles: {}\n }).createUpdate({ border: \"#cccccc\" }, \"mobile\", {});\n\n expect(apply(updater).overrides?.mobile?.inputs?.border).toBeUndefined();\n });\n\n it(\"removes an existing override when the value is unset entirely\", () => {\n // Neither a literal nor a token: the override goes away and the breakpoint inherits again.\n const bindings: DocumentElementBindings = {\n inputs: { border: { static: \"#cccccc\", id: \"a\", type: \"color\" } },\n overrides: {\n mobile: { inputs: { border: { static: \"#ff0000\", id: \"a\", type: \"color\" } } }\n },\n styles: {}\n };\n\n const updater = makeProcessor(bindings).createUpdate({ border: undefined }, \"mobile\", {});\n\n expect(apply(updater).overrides?.mobile?.inputs?.border).toBeUndefined();\n });\n\n it(\"keeps the base binding untouched while writing a breakpoint override\", () => {\n const updater = makeProcessor(withDesktopToken()).createUpdate(\n { border: \"#ffffff\" },\n \"mobile\",\n { border: SURFACE }\n );\n\n expect(apply(updater).inputs.border.token).toEqual(BRAND);\n });\n});\n"],"names":["ELEMENT_ID","BRAND","SURFACE","ast","BREAKPOINTS","makeProcessor","bindings","InputsBindingsProcessor","ElementFactory","emptyBindings","apply","updater","document","describe","it","map","expect","deep","binding","Object","inputs","withDesktopToken","undefined"],"mappings":"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"}