meno-core 1.0.53 → 1.0.54

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 (387) hide show
  1. package/.claude/settings.local.json +1 -3
  2. package/bin/cli.ts +48 -57
  3. package/build-astro.ts +131 -113
  4. package/build-next.ts +109 -96
  5. package/build-static.test.ts +39 -10
  6. package/build-static.ts +120 -122
  7. package/dist/bin/cli.js +34 -38
  8. package/dist/bin/cli.js.map +2 -2
  9. package/dist/build-static.js +12 -11
  10. package/dist/chunks/chunk-2AR55GYH.js +42 -0
  11. package/dist/chunks/chunk-2AR55GYH.js.map +7 -0
  12. package/dist/chunks/{chunk-IGYR22T6.js → chunk-2FN4UOVO.js} +512 -239
  13. package/dist/chunks/chunk-2FN4UOVO.js.map +7 -0
  14. package/dist/chunks/chunk-3XER4E5W.js +168 -0
  15. package/dist/chunks/chunk-3XER4E5W.js.map +7 -0
  16. package/dist/chunks/{chunk-X754AHS5.js → chunk-5ETZFREW.js} +9 -12
  17. package/dist/chunks/chunk-5ETZFREW.js.map +7 -0
  18. package/dist/chunks/{chunk-2MHDV5BF.js → chunk-7E4IF5L7.js} +15 -21
  19. package/dist/chunks/chunk-7E4IF5L7.js.map +7 -0
  20. package/dist/chunks/{chunk-JGWFTO6P.js → chunk-7HWQUVTU.js} +1578 -1349
  21. package/dist/chunks/chunk-7HWQUVTU.js.map +7 -0
  22. package/dist/chunks/{chunk-O3NAGJP4.js → chunk-AE3QK5QW.js} +110 -21
  23. package/dist/chunks/chunk-AE3QK5QW.js.map +7 -0
  24. package/dist/chunks/{chunk-GZHGVVW3.js → chunk-F6KTJYGV.js} +7 -7
  25. package/dist/chunks/chunk-F6KTJYGV.js.map +7 -0
  26. package/dist/chunks/{chunk-WQFG7PAH.js → chunk-FZITJSSS.js} +2 -6
  27. package/dist/chunks/chunk-FZITJSSS.js.map +7 -0
  28. package/dist/chunks/{chunk-QB2LNO4W.js → chunk-GSYYA5GX.js} +2 -2
  29. package/dist/chunks/chunk-GSYYA5GX.js.map +7 -0
  30. package/dist/chunks/{chunk-YBLHKYFF.js → chunk-HIZMY3EP.js} +1 -1
  31. package/dist/chunks/chunk-HIZMY3EP.js.map +7 -0
  32. package/dist/chunks/{chunk-AZQYF6KE.js → chunk-I2WEGYA7.js} +41 -176
  33. package/dist/chunks/chunk-I2WEGYA7.js.map +7 -0
  34. package/dist/chunks/{chunk-I7YIGZXT.js → chunk-JNO3CNLJ.js} +6 -9
  35. package/dist/chunks/chunk-JNO3CNLJ.js.map +7 -0
  36. package/dist/chunks/{chunk-UB44F4Z2.js → chunk-NVRBTSQG.js} +2 -4
  37. package/dist/chunks/chunk-NVRBTSQG.js.map +7 -0
  38. package/dist/chunks/{chunk-JGP5A3Y5.js → chunk-Q4OBWKXG.js} +40 -33
  39. package/dist/chunks/chunk-Q4OBWKXG.js.map +7 -0
  40. package/dist/chunks/{chunk-R6XHAFBF.js → chunk-QTE32Y53.js} +250 -242
  41. package/dist/chunks/chunk-QTE32Y53.js.map +7 -0
  42. package/dist/chunks/{chunk-H3GJ4H2U.js → chunk-STDY3OVM.js} +214 -85
  43. package/dist/chunks/chunk-STDY3OVM.js.map +7 -0
  44. package/dist/chunks/configService-PRJZF7Y6.js +14 -0
  45. package/dist/chunks/{constants-STK2YBIW.js → constants-KIQEYMAM.js} +2 -2
  46. package/dist/chunks/{fs-JGINUXGL.js → fs-ZI5JEU7V.js} +2 -2
  47. package/dist/entries/server-router.js +14 -19
  48. package/dist/entries/server-router.js.map +2 -2
  49. package/dist/lib/client/index.js +638 -332
  50. package/dist/lib/client/index.js.map +2 -2
  51. package/dist/lib/server/index.js +177 -235
  52. package/dist/lib/server/index.js.map +2 -2
  53. package/dist/lib/shared/index.js +80 -44
  54. package/dist/lib/shared/index.js.map +2 -2
  55. package/dist/lib/shared/richtext/index.js +1 -1
  56. package/dist/lib/test-utils/index.js +38 -60
  57. package/dist/lib/test-utils/index.js.map +2 -2
  58. package/entries/client-router.tsx +10 -8
  59. package/entries/server-router.tsx +1 -7
  60. package/lib/client/ClientInitializer.ts +8 -8
  61. package/lib/client/ErrorBoundary.test.tsx +146 -143
  62. package/lib/client/ErrorBoundary.tsx +175 -127
  63. package/lib/client/componentRegistry.test.ts +96 -108
  64. package/lib/client/componentRegistry.ts +1 -2
  65. package/lib/client/contexts/ThemeContext.tsx +3 -2
  66. package/lib/client/core/ComponentBuilder.test.ts +513 -560
  67. package/lib/client/core/ComponentBuilder.ts +318 -146
  68. package/lib/client/core/ComponentRenderer.test.tsx +1 -2
  69. package/lib/client/core/ComponentRenderer.tsx +46 -33
  70. package/lib/client/core/builders/embedBuilder.ts +241 -53
  71. package/lib/client/core/builders/linkBuilder.ts +71 -44
  72. package/lib/client/core/builders/linkNodeBuilder.ts +78 -53
  73. package/lib/client/core/builders/listBuilder.ts +115 -86
  74. package/lib/client/core/builders/localeListBuilder.ts +95 -60
  75. package/lib/client/core/builders/types.ts +5 -5
  76. package/lib/client/core/cmsTemplateProcessor.ts +7 -7
  77. package/lib/client/elementRegistry.ts +3 -3
  78. package/lib/client/fontFamiliesService.test.ts +2 -10
  79. package/lib/client/fontFamiliesService.ts +3 -3
  80. package/lib/client/hmr/HMRManager.tsx +8 -0
  81. package/lib/client/hmrCssReload.ts +14 -8
  82. package/lib/client/hmrWebSocket.ts +9 -14
  83. package/lib/client/hooks/useColorVariables.test.ts +21 -21
  84. package/lib/client/hooks/useColorVariables.ts +12 -10
  85. package/lib/client/hooks/usePropertyAutocomplete.ts +3 -5
  86. package/lib/client/hooks/useVariables.ts +4 -4
  87. package/lib/client/hydration/HydrationUtils.test.ts +24 -25
  88. package/lib/client/hydration/HydrationUtils.ts +3 -4
  89. package/lib/client/i18nConfigService.test.ts +2 -7
  90. package/lib/client/i18nConfigService.ts +2 -2
  91. package/lib/client/meno-filter/MenoFilter.test.ts +19 -21
  92. package/lib/client/meno-filter/MenoFilter.ts +5 -9
  93. package/lib/client/meno-filter/bindings.ts +15 -40
  94. package/lib/client/meno-filter/init.ts +1 -1
  95. package/lib/client/meno-filter/renderer.ts +23 -29
  96. package/lib/client/meno-filter/script.generated.ts +1 -3
  97. package/lib/client/meno-filter/ui.ts +3 -5
  98. package/lib/client/meno-filter/updates.ts +15 -21
  99. package/lib/client/navigation.test.ts +159 -159
  100. package/lib/client/navigation.ts +0 -1
  101. package/lib/client/responsiveStyleResolver.test.ts +230 -228
  102. package/lib/client/responsiveStyleResolver.ts +13 -16
  103. package/lib/client/routing/RouteLoader.test.ts +23 -24
  104. package/lib/client/routing/RouteLoader.ts +22 -35
  105. package/lib/client/routing/Router.tsx +31 -3
  106. package/lib/client/scripts/ScriptExecutor.test.ts +157 -158
  107. package/lib/client/scripts/ScriptExecutor.ts +15 -33
  108. package/lib/client/services/PrefetchService.test.ts +2 -2
  109. package/lib/client/services/PrefetchService.ts +10 -24
  110. package/lib/client/styleProcessor.test.ts +9 -9
  111. package/lib/client/styleProcessor.ts +18 -15
  112. package/lib/client/styles/StyleInjector.test.ts +122 -115
  113. package/lib/client/styles/StyleInjector.ts +9 -6
  114. package/lib/client/styles/UtilityClassCollector.ts +19 -26
  115. package/lib/client/styles/cspNonce.test.ts +2 -5
  116. package/lib/client/templateEngine.test.ts +554 -482
  117. package/lib/client/templateEngine.ts +200 -64
  118. package/lib/client/theme.ts +0 -1
  119. package/lib/client/utils/toast.ts +0 -1
  120. package/lib/server/__integration__/api-routes.test.ts +8 -4
  121. package/lib/server/__integration__/cms-integration.test.ts +1 -4
  122. package/lib/server/__integration__/server-lifecycle.test.ts +2 -5
  123. package/lib/server/__integration__/ssr-rendering.test.ts +47 -37
  124. package/lib/server/__integration__/static-assets.test.ts +1 -1
  125. package/lib/server/__integration__/test-helpers.ts +84 -70
  126. package/lib/server/ab/generateFunctions.ts +12 -10
  127. package/lib/server/astro/cmsPageEmitter.ts +23 -38
  128. package/lib/server/astro/componentEmitter.ts +25 -36
  129. package/lib/server/astro/cssCollector.ts +10 -26
  130. package/lib/server/astro/nodeToAstro.test.ts +1750 -30
  131. package/lib/server/astro/nodeToAstro.ts +198 -187
  132. package/lib/server/astro/normalizeOrphanTemplateProps.test.ts +105 -109
  133. package/lib/server/astro/normalizeOrphanTemplateProps.ts +4 -12
  134. package/lib/server/astro/pageEmitter.ts +9 -13
  135. package/lib/server/astro/tailwindMapper.test.ts +10 -37
  136. package/lib/server/astro/tailwindMapper.ts +33 -40
  137. package/lib/server/astro/templateTransformer.ts +14 -17
  138. package/lib/server/createServer.ts +5 -17
  139. package/lib/server/cssGenerator.test.ts +35 -44
  140. package/lib/server/cssGenerator.ts +6 -17
  141. package/lib/server/fileWatcher.test.ts +124 -10
  142. package/lib/server/fileWatcher.ts +124 -118
  143. package/lib/server/index.ts +7 -1
  144. package/lib/server/jsonLoader.test.ts +39 -2
  145. package/lib/server/jsonLoader.ts +33 -31
  146. package/lib/server/middleware/cors.test.ts +20 -20
  147. package/lib/server/middleware/cors.ts +28 -4
  148. package/lib/server/middleware/errorHandler.test.ts +5 -3
  149. package/lib/server/middleware/errorHandler.ts +3 -8
  150. package/lib/server/middleware/index.ts +0 -1
  151. package/lib/server/middleware/logger.test.ts +7 -5
  152. package/lib/server/middleware/logger.ts +10 -22
  153. package/lib/server/pageCache.test.ts +76 -77
  154. package/lib/server/pageCache.ts +0 -1
  155. package/lib/server/projectContext.ts +4 -3
  156. package/lib/server/providers/fileSystemCMSProvider.test.ts +124 -95
  157. package/lib/server/providers/fileSystemCMSProvider.ts +35 -20
  158. package/lib/server/providers/fileSystemPageProvider.test.ts +84 -0
  159. package/lib/server/providers/fileSystemPageProvider.ts +31 -12
  160. package/lib/server/routes/api/cms.test.ts +26 -14
  161. package/lib/server/routes/api/cms.ts +9 -14
  162. package/lib/server/routes/api/components.ts +30 -34
  163. package/lib/server/routes/api/config.ts +0 -1
  164. package/lib/server/routes/api/core-routes.ts +47 -74
  165. package/lib/server/routes/api/functions.ts +8 -16
  166. package/lib/server/routes/api/index.ts +3 -6
  167. package/lib/server/routes/api/pages.ts +8 -11
  168. package/lib/server/routes/api/shared.test.ts +1 -1
  169. package/lib/server/routes/api/shared.ts +12 -9
  170. package/lib/server/routes/api/variables.test.ts +1 -3
  171. package/lib/server/routes/api/variables.ts +1 -1
  172. package/lib/server/routes/index.ts +23 -26
  173. package/lib/server/routes/pages.ts +34 -29
  174. package/lib/server/routes/static.ts +16 -4
  175. package/lib/server/runtime/bundler.ts +47 -32
  176. package/lib/server/runtime/fs.ts +3 -13
  177. package/lib/server/runtime/httpServer.ts +5 -9
  178. package/lib/server/services/ColorService.ts +32 -27
  179. package/lib/server/services/EnumService.test.ts +2 -6
  180. package/lib/server/services/EnumService.ts +7 -2
  181. package/lib/server/services/VariableService.test.ts +1 -5
  182. package/lib/server/services/VariableService.ts +6 -1
  183. package/lib/server/services/cmsService.test.ts +116 -78
  184. package/lib/server/services/cmsService.ts +24 -54
  185. package/lib/server/services/componentService.test.ts +122 -36
  186. package/lib/server/services/componentService.ts +54 -38
  187. package/lib/server/services/configService.test.ts +9 -31
  188. package/lib/server/services/configService.ts +20 -27
  189. package/lib/server/services/fileWatcherService.ts +40 -6
  190. package/lib/server/services/index.ts +0 -1
  191. package/lib/server/services/pageService.test.ts +1 -3
  192. package/lib/server/services/pageService.ts +14 -13
  193. package/lib/server/ssr/attributeBuilder.ts +16 -6
  194. package/lib/server/ssr/buildErrorOverlay.ts +11 -12
  195. package/lib/server/ssr/clientDataInjector.ts +7 -21
  196. package/lib/server/ssr/cmsSSRProcessor.ts +3 -6
  197. package/lib/server/ssr/cssCollector.ts +1 -1
  198. package/lib/server/ssr/errorOverlay.test.ts +1 -1
  199. package/lib/server/ssr/errorOverlay.ts +3 -9
  200. package/lib/server/ssr/htmlGenerator.nonce.test.ts +3 -9
  201. package/lib/server/ssr/htmlGenerator.test.ts +120 -43
  202. package/lib/server/ssr/htmlGenerator.ts +120 -85
  203. package/lib/server/ssr/imageMetadata.test.ts +3 -1
  204. package/lib/server/ssr/imageMetadata.ts +25 -19
  205. package/lib/server/ssr/jsCollector.test.ts +3 -13
  206. package/lib/server/ssr/jsCollector.ts +3 -8
  207. package/lib/server/ssr/liveReloadIntegration.test.ts +69 -28
  208. package/lib/server/ssr/metaTagGenerator.ts +2 -2
  209. package/lib/server/ssr/ssrRenderer.branches.test.ts +1103 -0
  210. package/lib/server/ssr/ssrRenderer.test.ts +196 -246
  211. package/lib/server/ssr/ssrRenderer.ts +609 -225
  212. package/lib/server/ssrRenderer.test.ts +1044 -950
  213. package/lib/server/utils/jsonLineMapper.test.ts +28 -28
  214. package/lib/server/utils/jsonLineMapper.ts +1 -1
  215. package/lib/server/validateStyleCoverage.ts +18 -20
  216. package/lib/server/webflow/buildWebflow.ts +41 -53
  217. package/lib/server/webflow/nodeToWebflow.test.ts +150 -218
  218. package/lib/server/webflow/nodeToWebflow.ts +195 -258
  219. package/lib/server/webflow/styleMapper.test.ts +15 -56
  220. package/lib/server/webflow/styleMapper.ts +33 -41
  221. package/lib/server/webflow/types.ts +1 -8
  222. package/lib/server/websocketManager.ts +16 -19
  223. package/lib/shared/attributeNodeUtils.test.ts +15 -15
  224. package/lib/shared/attributeNodeUtils.ts +5 -12
  225. package/lib/shared/breakpoints.ts +4 -11
  226. package/lib/shared/cmsQueryParser.test.ts +50 -42
  227. package/lib/shared/cmsQueryParser.ts +49 -31
  228. package/lib/shared/colorVariableUtils.test.ts +5 -5
  229. package/lib/shared/colorVariableUtils.ts +3 -8
  230. package/lib/shared/componentRefs.ts +1 -5
  231. package/lib/shared/constants.test.ts +3 -3
  232. package/lib/shared/constants.ts +4 -8
  233. package/lib/shared/cssGeneration.test.ts +262 -144
  234. package/lib/shared/cssGeneration.ts +189 -516
  235. package/lib/shared/cssNamedColors.ts +152 -30
  236. package/lib/shared/cssProperties.test.ts +5 -6
  237. package/lib/shared/cssProperties.ts +296 -112
  238. package/lib/shared/elementClassName.test.ts +109 -109
  239. package/lib/shared/elementClassName.ts +1 -1
  240. package/lib/shared/elementUtils.ts +12 -16
  241. package/lib/shared/errorLogger.ts +2 -10
  242. package/lib/shared/errors.test.ts +2 -13
  243. package/lib/shared/errors.ts +2 -8
  244. package/lib/shared/expressionEvaluator.test.ts +119 -0
  245. package/lib/shared/expressionEvaluator.ts +43 -24
  246. package/lib/shared/fontLoader.test.ts +19 -5
  247. package/lib/shared/friendlyError.ts +2 -3
  248. package/lib/shared/gradientUtils.test.ts +1 -5
  249. package/lib/shared/gradientUtils.ts +2 -6
  250. package/lib/shared/hrefRefs.ts +2 -10
  251. package/lib/shared/i18n.test.ts +1 -1
  252. package/lib/shared/i18n.ts +13 -34
  253. package/lib/shared/index.ts +4 -0
  254. package/lib/shared/inlineSvgStyleRules.ts +2 -4
  255. package/lib/shared/interactiveStyleMappings.test.ts +11 -33
  256. package/lib/shared/interactiveStyleMappings.ts +9 -16
  257. package/lib/shared/interactiveStyles.test.ts +165 -188
  258. package/lib/shared/interfaces/contentProvider.ts +1 -1
  259. package/lib/shared/itemTemplateUtils.test.ts +6 -12
  260. package/lib/shared/itemTemplateUtils.ts +19 -35
  261. package/lib/shared/jsonRepair.ts +8 -2
  262. package/lib/shared/libraryLoader.test.ts +15 -49
  263. package/lib/shared/libraryLoader.ts +7 -22
  264. package/lib/shared/netlifyLocale404.test.ts +179 -0
  265. package/lib/shared/netlifyLocale404.ts +110 -0
  266. package/lib/shared/nodeUtils.test.ts +24 -16
  267. package/lib/shared/nodeUtils.ts +49 -19
  268. package/lib/shared/pathArrayUtils.test.ts +1 -2
  269. package/lib/shared/pathArrayUtils.ts +1 -1
  270. package/lib/shared/pathSecurity.ts +1 -1
  271. package/lib/shared/pathUtils.test.ts +4 -6
  272. package/lib/shared/pathUtils.ts +42 -48
  273. package/lib/shared/paths/Path.test.ts +2 -2
  274. package/lib/shared/paths/Path.ts +0 -1
  275. package/lib/shared/paths/PathConverter.test.ts +1 -1
  276. package/lib/shared/paths/PathConverter.ts +14 -17
  277. package/lib/shared/paths/PathUtils.ts +9 -10
  278. package/lib/shared/paths/PathValidator.test.ts +2 -15
  279. package/lib/shared/paths/PathValidator.ts +11 -9
  280. package/lib/shared/paths/index.ts +1 -2
  281. package/lib/shared/propResolver.test.ts +240 -244
  282. package/lib/shared/propResolver.ts +14 -25
  283. package/lib/shared/pxToRem.test.ts +7 -6
  284. package/lib/shared/pxToRem.ts +2 -5
  285. package/lib/shared/registry/BaseNodeTypeRegistry.test.ts +9 -5
  286. package/lib/shared/registry/ClientRegistry.ts +0 -1
  287. package/lib/shared/registry/ComponentRegistry.test.ts +43 -29
  288. package/lib/shared/registry/ComponentRegistry.ts +9 -11
  289. package/lib/shared/registry/NodeTypeDefinition.ts +15 -8
  290. package/lib/shared/registry/RegistryManager.ts +1 -2
  291. package/lib/shared/registry/SSRRegistry.ts +0 -1
  292. package/lib/shared/registry/createNodeType.ts +7 -9
  293. package/lib/shared/registry/defineNodeType.ts +2 -6
  294. package/lib/shared/registry/index.ts +0 -1
  295. package/lib/shared/registry/nodeTypes/ComponentInstanceNodeType.ts +14 -15
  296. package/lib/shared/registry/nodeTypes/EmbedNodeType.ts +18 -11
  297. package/lib/shared/registry/nodeTypes/HtmlNodeType.ts +47 -18
  298. package/lib/shared/registry/nodeTypes/LinkNodeType.ts +21 -19
  299. package/lib/shared/registry/nodeTypes/ListNodeType.ts +78 -74
  300. package/lib/shared/registry/nodeTypes/LocaleListNodeType.ts +27 -21
  301. package/lib/shared/registry/nodeTypes/SlotMarkerType.ts +6 -7
  302. package/lib/shared/registry/nodeTypes/index.ts +10 -2
  303. package/lib/shared/responsiveScaling.test.ts +15 -31
  304. package/lib/shared/responsiveScaling.ts +55 -37
  305. package/lib/shared/responsiveStyleUtils.ts +11 -13
  306. package/lib/shared/richtext/htmlToTiptap.test.ts +23 -14
  307. package/lib/shared/richtext/htmlToTiptap.ts +1 -3
  308. package/lib/shared/richtext/tiptapToHtml.test.ts +5 -6
  309. package/lib/shared/richtext/types.ts +1 -8
  310. package/lib/shared/slugTranslator.test.ts +13 -13
  311. package/lib/shared/slugTranslator.ts +12 -16
  312. package/lib/shared/slugify.ts +9 -15
  313. package/lib/shared/styleNodeUtils.test.ts +8 -8
  314. package/lib/shared/styleNodeUtils.ts +5 -10
  315. package/lib/shared/styleUtils.test.ts +87 -61
  316. package/lib/shared/styleUtils.ts +5 -6
  317. package/lib/shared/themeDefaults.test.ts +11 -11
  318. package/lib/shared/themeDefaults.ts +3 -4
  319. package/lib/shared/tree/PathBuilder.test.ts +62 -138
  320. package/lib/shared/tree/PathBuilder.ts +49 -39
  321. package/lib/shared/treePathUtils.test.ts +2 -10
  322. package/lib/shared/treePathUtils.ts +54 -59
  323. package/lib/shared/types/api.ts +1 -2
  324. package/lib/shared/types/cms.ts +25 -21
  325. package/lib/shared/types/comment.ts +49 -16
  326. package/lib/shared/types/components.ts +27 -25
  327. package/lib/shared/types/errors.test.ts +1 -6
  328. package/lib/shared/types/errors.ts +3 -7
  329. package/lib/shared/types/experiments.ts +28 -28
  330. package/lib/shared/types/index.ts +2 -2
  331. package/lib/shared/types/styles.ts +0 -1
  332. package/lib/shared/types/variables.test.ts +4 -13
  333. package/lib/shared/types/variables.ts +48 -27
  334. package/lib/shared/types.ts +1 -2
  335. package/lib/shared/utilityClassConfig.ts +648 -321
  336. package/lib/shared/utilityClassMapper.test.ts +203 -92
  337. package/lib/shared/utilityClassMapper.ts +188 -246
  338. package/lib/shared/utilityClassNames.ts +326 -0
  339. package/lib/shared/utils.test.ts +2 -10
  340. package/lib/shared/utils.ts +19 -10
  341. package/lib/shared/validation/cmsValidators.ts +2 -1
  342. package/lib/shared/validation/commentValidators.test.ts +53 -0
  343. package/lib/shared/validation/commentValidators.ts +12 -1
  344. package/lib/shared/validation/propValidator.test.ts +18 -20
  345. package/lib/shared/validation/propValidator.ts +12 -17
  346. package/lib/shared/validation/schemas.test.ts +24 -33
  347. package/lib/shared/validation/schemas.ts +469 -344
  348. package/lib/shared/validation/validators.test.ts +1 -6
  349. package/lib/shared/validation/validators.ts +89 -68
  350. package/lib/shared/viewportUnits.integration.test.ts +14 -10
  351. package/lib/shared/viewportUnits.test.ts +11 -23
  352. package/lib/test-utils/dom-setup.ts +1 -1
  353. package/lib/test-utils/factories/ConsoleMockFactory.ts +3 -7
  354. package/lib/test-utils/factories/DomMockFactory.ts +7 -19
  355. package/lib/test-utils/factories/EventMockFactory.ts +7 -13
  356. package/lib/test-utils/factories/FetchMockFactory.ts +39 -57
  357. package/lib/test-utils/factories/ServerMockFactory.ts +5 -9
  358. package/lib/test-utils/factories/StoreMockFactory.ts +14 -25
  359. package/lib/test-utils/fixtures.ts +45 -45
  360. package/lib/test-utils/helpers/asyncHelpers.test.ts +15 -18
  361. package/lib/test-utils/helpers/asyncHelpers.ts +11 -20
  362. package/lib/test-utils/helpers.ts +1 -5
  363. package/lib/test-utils/index.ts +0 -4
  364. package/lib/test-utils/mockFactories.ts +12 -18
  365. package/lib/test-utils/mocks.ts +4 -2
  366. package/package.json +1 -1
  367. package/scripts/build-meno-filter.ts +1 -4
  368. package/vite.config.ts +4 -4
  369. package/dist/chunks/chunk-2MHDV5BF.js.map +0 -7
  370. package/dist/chunks/chunk-AZQYF6KE.js.map +0 -7
  371. package/dist/chunks/chunk-GZHGVVW3.js.map +0 -7
  372. package/dist/chunks/chunk-H3GJ4H2U.js.map +0 -7
  373. package/dist/chunks/chunk-I7YIGZXT.js.map +0 -7
  374. package/dist/chunks/chunk-IGYR22T6.js.map +0 -7
  375. package/dist/chunks/chunk-JGP5A3Y5.js.map +0 -7
  376. package/dist/chunks/chunk-JGWFTO6P.js.map +0 -7
  377. package/dist/chunks/chunk-O3NAGJP4.js.map +0 -7
  378. package/dist/chunks/chunk-QB2LNO4W.js.map +0 -7
  379. package/dist/chunks/chunk-R6XHAFBF.js.map +0 -7
  380. package/dist/chunks/chunk-UB44F4Z2.js.map +0 -7
  381. package/dist/chunks/chunk-WQFG7PAH.js.map +0 -7
  382. package/dist/chunks/chunk-X754AHS5.js.map +0 -7
  383. package/dist/chunks/chunk-YBLHKYFF.js.map +0 -7
  384. package/dist/chunks/configService-R3OGU2UD.js +0 -13
  385. /package/dist/chunks/{configService-R3OGU2UD.js.map → configService-PRJZF7Y6.js.map} +0 -0
  386. /package/dist/chunks/{constants-STK2YBIW.js.map → constants-KIQEYMAM.js.map} +0 -0
  387. /package/dist/chunks/{fs-JGINUXGL.js.map → fs-ZI5JEU7V.js.map} +0 -0
@@ -32,11 +32,7 @@ describe('PathBuilder - post-slot element path calculation', () => {
32
32
  // Component structure: Header (0), Slot (1), Footer (2)
33
33
  const componentStructure = {
34
34
  tag: 'div',
35
- children: [
36
- { tag: 'header', children: 'Header' },
37
- { type: 'slot' },
38
- { tag: 'footer', children: 'Footer' },
39
- ],
35
+ children: [{ tag: 'header', children: 'Header' }, { type: 'slot' }, { tag: 'footer', children: 'Footer' }],
40
36
  };
41
37
 
42
38
  // Editing component with 3 children in the slot
@@ -55,13 +51,11 @@ describe('PathBuilder - post-slot element path calculation', () => {
55
51
  const paths = buildTreePathsWithRendered(
56
52
  wrapAsComponentData(componentStructure),
57
53
  undefined, // no registry needed for this test
58
- navigationHistory
54
+ navigationHistory,
59
55
  );
60
56
 
61
57
  // Find footer path (logical [0, 2])
62
- const footerPathData = paths.find(
63
- (p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 2
64
- );
58
+ const footerPathData = paths.find((p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 2);
65
59
 
66
60
  expect(footerPathData).toBeDefined();
67
61
  // Footer should be at rendered [0, 4] because:
@@ -73,11 +67,7 @@ describe('PathBuilder - post-slot element path calculation', () => {
73
67
  it('should not offset pre-slot elements', () => {
74
68
  const componentStructure = {
75
69
  tag: 'div',
76
- children: [
77
- { tag: 'header', children: 'Header' },
78
- { type: 'slot' },
79
- { tag: 'footer', children: 'Footer' },
80
- ],
70
+ children: [{ tag: 'header', children: 'Header' }, { type: 'slot' }, { tag: 'footer', children: 'Footer' }],
81
71
  };
82
72
 
83
73
  const navigationHistory: NavigationContext[] = [
@@ -91,16 +81,10 @@ describe('PathBuilder - post-slot element path calculation', () => {
91
81
  },
92
82
  ];
93
83
 
94
- const paths = buildTreePathsWithRendered(
95
- wrapAsComponentData(componentStructure),
96
- undefined,
97
- navigationHistory
98
- );
84
+ const paths = buildTreePathsWithRendered(wrapAsComponentData(componentStructure), undefined, navigationHistory);
99
85
 
100
86
  // Find header path (logical [0, 0])
101
- const headerPathData = paths.find(
102
- (p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 0
103
- );
87
+ const headerPathData = paths.find((p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 0);
104
88
 
105
89
  expect(headerPathData).toBeDefined();
106
90
  // Header should stay at rendered [0, 0] - no offset for pre-slot elements
@@ -110,11 +94,7 @@ describe('PathBuilder - post-slot element path calculation', () => {
110
94
  it('should handle empty slot (no offset needed)', () => {
111
95
  const componentStructure = {
112
96
  tag: 'div',
113
- children: [
114
- { tag: 'header', children: 'Header' },
115
- { type: 'slot' },
116
- { tag: 'footer', children: 'Footer' },
117
- ],
97
+ children: [{ tag: 'header', children: 'Header' }, { type: 'slot' }, { tag: 'footer', children: 'Footer' }],
118
98
  };
119
99
 
120
100
  const navigationHistory: NavigationContext[] = [
@@ -125,16 +105,10 @@ describe('PathBuilder - post-slot element path calculation', () => {
125
105
  },
126
106
  ];
127
107
 
128
- const paths = buildTreePathsWithRendered(
129
- wrapAsComponentData(componentStructure),
130
- undefined,
131
- navigationHistory
132
- );
108
+ const paths = buildTreePathsWithRendered(wrapAsComponentData(componentStructure), undefined, navigationHistory);
133
109
 
134
110
  // Find footer path (logical [0, 2])
135
- const footerPathData = paths.find(
136
- (p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 2
137
- );
111
+ const footerPathData = paths.find((p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 2);
138
112
 
139
113
  expect(footerPathData).toBeDefined();
140
114
  // With empty slot, footer stays at rendered [0, 2] (no offset)
@@ -155,7 +129,7 @@ describe('PathBuilder - post-slot element path calculation', () => {
155
129
  { type: 'component', component: 'Section' }, // 1
156
130
  { type: 'component', component: 'Section' }, // 2
157
131
  { type: 'component', component: 'Section' }, // 3
158
- { type: 'slot' }, // 4 - CaseStudyLayout's slot
132
+ { type: 'slot' }, // 4 - CaseStudyLayout's slot
159
133
  { type: 'component', component: 'CtaSection' }, // 5 - after slot
160
134
  ],
161
135
  };
@@ -163,23 +137,26 @@ describe('PathBuilder - post-slot element path calculation', () => {
163
137
  // Mock registry with Layout structure
164
138
  // Layout has slot at [0, 1, 0] (div → main → slot)
165
139
  const mockRegistry = new Map([
166
- ['Layout', {
167
- component: {
168
- structure: {
169
- tag: 'div',
170
- children: [
171
- { component: 'Navigation' }, // 0
172
- {
173
- tag: 'main',
174
- children: [
175
- { type: 'slot' }, // slot at index 0 within main
176
- ],
177
- }, // 1
178
- { component: 'Footer' }, // 2
179
- ],
140
+ [
141
+ 'Layout',
142
+ {
143
+ component: {
144
+ structure: {
145
+ tag: 'div',
146
+ children: [
147
+ { component: 'Navigation' }, // 0
148
+ {
149
+ tag: 'main',
150
+ children: [
151
+ { type: 'slot' }, // slot at index 0 within main
152
+ ],
153
+ }, // 1
154
+ { component: 'Footer' }, // 2
155
+ ],
156
+ },
180
157
  },
181
158
  },
182
- }],
159
+ ],
183
160
  ]);
184
161
 
185
162
  // Editing CaseStudyLayout from a page that passes 1 child to slot
@@ -187,22 +164,18 @@ describe('PathBuilder - post-slot element path calculation', () => {
187
164
  {
188
165
  componentInstancePath: [0],
189
166
  componentInstanceRenderedPath: [0],
190
- instanceChildren: [
191
- { component: 'Section', children: 'Instance content' },
192
- ] as any, // 1 child passed to CaseStudyLayout's slot
167
+ instanceChildren: [{ component: 'Section', children: 'Instance content' }] as any, // 1 child passed to CaseStudyLayout's slot
193
168
  },
194
169
  ];
195
170
 
196
171
  const paths = buildTreePathsWithRendered(
197
172
  wrapAsComponentData(componentStructure),
198
173
  mockRegistry,
199
- navigationHistory
174
+ navigationHistory,
200
175
  );
201
176
 
202
177
  // Find CtaSection path (logical [0, 5])
203
- const ctaSectionPathData = paths.find(
204
- (p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 5
205
- );
178
+ const ctaSectionPathData = paths.find((p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 5);
206
179
 
207
180
  expect(ctaSectionPathData).toBeDefined();
208
181
 
@@ -222,22 +195,25 @@ describe('PathBuilder - post-slot element path calculation', () => {
222
195
  component: 'Layout',
223
196
  children: [
224
197
  { type: 'component', component: 'Section' }, // 0
225
- { type: 'slot' }, // 1 - slot
198
+ { type: 'slot' }, // 1 - slot
226
199
  { type: 'component', component: 'CtaSection' }, // 2 - after slot
227
200
  ],
228
201
  };
229
202
 
230
203
  const mockRegistry = new Map([
231
- ['Layout', {
232
- component: {
233
- structure: {
234
- tag: 'div',
235
- children: [
236
- { type: 'slot' }, // Layout's slot at [0, 0]
237
- ],
204
+ [
205
+ 'Layout',
206
+ {
207
+ component: {
208
+ structure: {
209
+ tag: 'div',
210
+ children: [
211
+ { type: 'slot' }, // Layout's slot at [0, 0]
212
+ ],
213
+ },
238
214
  },
239
215
  },
240
- }],
216
+ ],
241
217
  ]);
242
218
 
243
219
  // 3 children passed to slot
@@ -245,24 +221,18 @@ describe('PathBuilder - post-slot element path calculation', () => {
245
221
  {
246
222
  componentInstancePath: [0],
247
223
  componentInstanceRenderedPath: [0],
248
- instanceChildren: [
249
- { tag: 'p' },
250
- { tag: 'p' },
251
- { tag: 'p' },
252
- ] as any,
224
+ instanceChildren: [{ tag: 'p' }, { tag: 'p' }, { tag: 'p' }] as any,
253
225
  },
254
226
  ];
255
227
 
256
228
  const paths = buildTreePathsWithRendered(
257
229
  wrapAsComponentData(componentStructure),
258
230
  mockRegistry,
259
- navigationHistory
231
+ navigationHistory,
260
232
  );
261
233
 
262
234
  // Find CtaSection path (logical [0, 2])
263
- const ctaSectionPathData = paths.find(
264
- (p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 2
265
- );
235
+ const ctaSectionPathData = paths.find((p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 2);
266
236
 
267
237
  expect(ctaSectionPathData).toBeDefined();
268
238
 
@@ -284,11 +254,7 @@ describe('PathBuilder - post-slot element path calculation', () => {
284
254
  // Card structure: Header (0), Slot (1), Footer (2)
285
255
  const cardStructure = {
286
256
  tag: 'div',
287
- children: [
288
- { tag: 'div', children: 'Card Header' },
289
- { type: 'slot' },
290
- { tag: 'div', children: 'Card Footer' },
291
- ],
257
+ children: [{ tag: 'div', children: 'Card Header' }, { type: 'slot' }, { tag: 'div', children: 'Card Footer' }],
292
258
  };
293
259
 
294
260
  // Navigation history: first entered Section, then Card
@@ -316,16 +282,10 @@ describe('PathBuilder - post-slot element path calculation', () => {
316
282
  },
317
283
  ];
318
284
 
319
- const paths = buildTreePathsWithRendered(
320
- wrapAsComponentData(cardStructure),
321
- undefined,
322
- navigationHistory
323
- );
285
+ const paths = buildTreePathsWithRendered(wrapAsComponentData(cardStructure), undefined, navigationHistory);
324
286
 
325
287
  // Find Card's footer (logical [0, 2])
326
- const footerPathData = paths.find(
327
- (p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 2
328
- );
288
+ const footerPathData = paths.find((p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 2);
329
289
 
330
290
  expect(footerPathData).toBeDefined();
331
291
 
@@ -342,11 +302,7 @@ describe('PathBuilder - post-slot element path calculation', () => {
342
302
 
343
303
  const componentC = {
344
304
  tag: 'div',
345
- children: [
346
- { tag: 'span', children: 'C Header' },
347
- { type: 'slot' },
348
- { tag: 'span', children: 'C Footer' },
349
- ],
305
+ children: [{ tag: 'span', children: 'C Header' }, { type: 'slot' }, { tag: 'span', children: 'C Footer' }],
350
306
  };
351
307
 
352
308
  // Each componentInstancePath is relative to the current view:
@@ -368,25 +324,14 @@ describe('PathBuilder - post-slot element path calculation', () => {
368
324
  {
369
325
  componentInstancePath: [0, 0], // C is first child in B's slot
370
326
  componentInstanceRenderedPath: [0, 0],
371
- instanceChildren: [
372
- { tag: 'div' },
373
- { tag: 'div' },
374
- { tag: 'div' },
375
- { tag: 'div' },
376
- ] as any, // C has 4 children
327
+ instanceChildren: [{ tag: 'div' }, { tag: 'div' }, { tag: 'div' }, { tag: 'div' }] as any, // C has 4 children
377
328
  },
378
329
  ];
379
330
 
380
- const paths = buildTreePathsWithRendered(
381
- wrapAsComponentData(componentC),
382
- undefined,
383
- navigationHistory
384
- );
331
+ const paths = buildTreePathsWithRendered(wrapAsComponentData(componentC), undefined, navigationHistory);
385
332
 
386
333
  // Find C's footer (logical [0, 2])
387
- const footerPathData = paths.find(
388
- (p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 2
389
- );
334
+ const footerPathData = paths.find((p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 2);
390
335
 
391
336
  expect(footerPathData).toBeDefined();
392
337
 
@@ -406,15 +351,11 @@ describe('computeCumulativeInstancePath', () => {
406
351
  });
407
352
 
408
353
  it('returns the first entry path verbatim when there is one entry', () => {
354
+ expect(computeCumulativeInstancePath([{ componentInstancePath: [0], componentInstanceRenderedPath: [0] }])).toEqual(
355
+ [0],
356
+ );
409
357
  expect(
410
- computeCumulativeInstancePath([
411
- { componentInstancePath: [0], componentInstanceRenderedPath: [0] },
412
- ]),
413
- ).toEqual([0]);
414
- expect(
415
- computeCumulativeInstancePath([
416
- { componentInstancePath: [0, 2], componentInstanceRenderedPath: [0, 2] },
417
- ]),
358
+ computeCumulativeInstancePath([{ componentInstancePath: [0, 2], componentInstanceRenderedPath: [0, 2] }]),
418
359
  ).toEqual([0, 2]);
419
360
  });
420
361
 
@@ -436,10 +377,7 @@ describe('computeCumulativeInstancePath', () => {
436
377
 
437
378
  it('falls back to componentInstancePath when componentInstanceRenderedPath is missing', () => {
438
379
  expect(
439
- computeCumulativeInstancePath([
440
- { componentInstancePath: [0, 2] },
441
- { componentInstancePath: [0, 1] },
442
- ]),
380
+ computeCumulativeInstancePath([{ componentInstancePath: [0, 2] }, { componentInstancePath: [0, 1] }]),
443
381
  ).toEqual([0, 2, 1]);
444
382
  });
445
383
  });
@@ -467,16 +405,10 @@ describe('slotRenderedPaths on slot entries', () => {
467
405
  },
468
406
  ];
469
407
 
470
- const paths = buildTreePathsWithRendered(
471
- wrapAsComponentData(layoutStructure),
472
- undefined,
473
- navigationHistory,
474
- );
408
+ const paths = buildTreePathsWithRendered(wrapAsComponentData(layoutStructure), undefined, navigationHistory);
475
409
 
476
410
  // Slot's logical path is [0, 1] (second child of structure root).
477
- const slotEntry = paths.find(
478
- (p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 1,
479
- );
411
+ const slotEntry = paths.find((p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 1);
480
412
  expect(slotEntry).toBeDefined();
481
413
  expect(slotEntry!.renderedPath).toEqual([0, 1]);
482
414
  // With 7 instance children, the slot occupies positions 1..7 under the
@@ -503,16 +435,8 @@ describe('slotRenderedPaths on slot entries', () => {
503
435
  instanceChildren: [{ type: 'component' as const, component: 'Only' }] as any,
504
436
  },
505
437
  ];
506
- const noChildrenPaths = buildTreePathsWithRendered(
507
- wrapAsComponentData(layoutStructure),
508
- undefined,
509
- noChildren,
510
- );
511
- const oneChildPaths = buildTreePathsWithRendered(
512
- wrapAsComponentData(layoutStructure),
513
- undefined,
514
- oneChild,
515
- );
438
+ const noChildrenPaths = buildTreePathsWithRendered(wrapAsComponentData(layoutStructure), undefined, noChildren);
439
+ const oneChildPaths = buildTreePathsWithRendered(wrapAsComponentData(layoutStructure), undefined, oneChild);
516
440
 
517
441
  const slotEntryNo = noChildrenPaths.find((p) => p.path.length === 2 && p.path[1] === 1);
518
442
  const slotEntryOne = oneChildPaths.find((p) => p.path.length === 2 && p.path[1] === 1);
@@ -16,8 +16,8 @@ import { isComponentNode, isSlotMarker, isLocaleListNode, isCMSListNode, isListN
16
16
  * Node path data containing both logical and rendered paths
17
17
  */
18
18
  export interface NodePathData {
19
- path: Path; // Logical path in data structure
20
- renderedPath: Path; // Path adjusted for component structure wrapping
19
+ path: Path; // Logical path in data structure
20
+ renderedPath: Path; // Path adjusted for component structure wrapping
21
21
  /**
22
22
  * For slot markers being edited from inside their host component: the
23
23
  * page-absolute rendered paths of every DOM position the slot occupies
@@ -50,6 +50,9 @@ function findSlotMarkerPath(structure: any, currentPath: Path = [0]): Path | nul
50
50
  for (let i = 0; i < structure.children.length; i++) {
51
51
  const child = structure.children[i];
52
52
 
53
+ // Text children can't be (or contain) slot markers
54
+ if (typeof child === 'string') continue;
55
+
53
56
  if (isSlotMarker(child)) {
54
57
  return [...currentPath, i];
55
58
  }
@@ -86,7 +89,7 @@ function calculateRenderedPath(
86
89
  logicalPath: Path,
87
90
  currentNode: any,
88
91
  globalComponentRegistry: any,
89
- navigationHistory?: NavigationContext[]
92
+ navigationHistory?: NavigationContext[],
90
93
  ): Path {
91
94
  if (!currentNode || logicalPath.length === 0) {
92
95
  return logicalPath;
@@ -135,7 +138,7 @@ function calculateRenderedPath(
135
138
  // Build rendered path incrementally by walking through the logical path
136
139
  // and checking if each parent is a component with a nested slot
137
140
  let renderedPath: Path = [0];
138
- let node = currentNode;
141
+ let node: ComponentNode | null | undefined = currentNode;
139
142
 
140
143
  for (let i = 1; i < logicalPath.length; i++) {
141
144
  let childIndex = logicalPath[i];
@@ -181,7 +184,9 @@ function calculateRenderedPath(
181
184
  renderedPath = [...renderedPath, childIndex];
182
185
  }
183
186
 
184
- node = childNode;
187
+ // Text children have no children of their own — the next iteration's
188
+ // hasChildren() check breaks out, same as before, but keep `node` typed.
189
+ node = typeof childNode === 'string' ? undefined : childNode;
185
190
  }
186
191
 
187
192
  return renderedPath;
@@ -197,16 +202,16 @@ function calculateRenderedPath(
197
202
  * CMS item context for elements inside CMS List(s)
198
203
  */
199
204
  export interface CMSItemContext {
200
- itemIndexPath: number[]; // e.g., [0] for single list, [0, 2] for nested
201
- listPaths: Path[]; // Parallel array of list node paths
205
+ itemIndexPath: number[]; // e.g., [0] for single list, [0, 2] for nested
206
+ listPaths: Path[]; // Parallel array of list node paths
202
207
  }
203
208
 
204
209
  export interface NavigationContext {
205
- file?: any; // FileItem - optional as not all contexts have file
210
+ file?: any; // FileItem - optional as not all contexts have file
206
211
  componentInstancePath: Path | null;
207
- componentInstanceRenderedPath?: Path | null; // Rendered path for accurate DOM queries
208
- instanceChildren?: Array<ComponentNode | string>; // Children of the component instance (for path offset calculation)
209
- cmsItemContext?: CMSItemContext | null; // CMS context when editing component inside CMS List
212
+ componentInstanceRenderedPath?: Path | null; // Rendered path for accurate DOM queries
213
+ instanceChildren?: Array<ComponentNode | string>; // Children of the component instance (for path offset calculation)
214
+ cmsItemContext?: CMSItemContext | null; // CMS context when editing component inside CMS List
210
215
  }
211
216
 
212
217
  /**
@@ -218,16 +223,13 @@ export interface NavigationContext {
218
223
  * buildTreePathsWithRendered prepends, and to know how many leading elements
219
224
  * to strip when extracting a component-internal path back out.
220
225
  */
221
- export function computeCumulativeInstancePath(
222
- navigationHistory: NavigationContext[] | undefined,
223
- ): Path | null {
226
+ export function computeCumulativeInstancePath(navigationHistory: NavigationContext[] | undefined): Path | null {
224
227
  if (!navigationHistory || navigationHistory.length === 0) return null;
225
228
  let cumulative: Path | null =
226
229
  navigationHistory[0].componentInstanceRenderedPath ?? navigationHistory[0].componentInstancePath;
227
230
  if (!cumulative) return null;
228
231
  for (let i = 1; i < navigationHistory.length; i++) {
229
- const next =
230
- navigationHistory[i].componentInstanceRenderedPath ?? navigationHistory[i].componentInstancePath;
232
+ const next = navigationHistory[i].componentInstanceRenderedPath ?? navigationHistory[i].componentInstancePath;
231
233
  if (next) {
232
234
  cumulative = [...cumulative, ...next.slice(1)];
233
235
  }
@@ -264,7 +266,7 @@ export function computeCumulativeInstancePath(
264
266
  export function buildTreePathsWithRendered(
265
267
  pageData: PageData,
266
268
  globalComponentRegistry?: any,
267
- navigationHistory?: NavigationContext[]
269
+ navigationHistory?: NavigationContext[],
268
270
  ): NodePathData[] {
269
271
  const rootData = getRootData(pageData);
270
272
  if (!rootData) return [];
@@ -281,9 +283,9 @@ export function buildTreePathsWithRendered(
281
283
  // post-slot offset (the LAST navigation entry's instanceChildren).
282
284
  const hostInstanceChildrenCount =
283
285
  navigationHistory && navigationHistory.length > 0
284
- ? (Array.isArray(navigationHistory[navigationHistory.length - 1].instanceChildren)
285
- ? navigationHistory[navigationHistory.length - 1].instanceChildren!.length
286
- : 0)
286
+ ? Array.isArray(navigationHistory[navigationHistory.length - 1].instanceChildren)
287
+ ? navigationHistory[navigationHistory.length - 1].instanceChildren!.length
288
+ : 0
287
289
  : 0;
288
290
 
289
291
  function traverse(node: ComponentNode, currentPath: Path = [0]): void {
@@ -308,8 +310,8 @@ export function buildTreePathsWithRendered(
308
310
  : undefined;
309
311
 
310
312
  result.push({
311
- path: currentPath, // Keep logical path component-relative
312
- renderedPath: adjustedRenderedPath, // Adjust rendered path for page-relative queries
313
+ path: currentPath, // Keep logical path component-relative
314
+ renderedPath: adjustedRenderedPath, // Adjust rendered path for page-relative queries
313
315
  ...(slotRenderedPaths ? { slotRenderedPaths } : {}),
314
316
  });
315
317
 
@@ -321,7 +323,15 @@ export function buildTreePathsWithRendered(
321
323
  if (
322
324
  typeof child === 'object' &&
323
325
  child !== null &&
324
- ('tag' in child || 'component' in child || 'html' in child || 'src' in child || 'href' in child || isLocaleListNode(child) || isCMSListNode(child) || isListNode(child) || (cumulativeInstancePath && isSlotMarker(child)))
326
+ ('tag' in child ||
327
+ 'component' in child ||
328
+ 'html' in child ||
329
+ 'src' in child ||
330
+ 'href' in child ||
331
+ isLocaleListNode(child) ||
332
+ isCMSListNode(child) ||
333
+ isListNode(child) ||
334
+ (cumulativeInstancePath && isSlotMarker(child)))
325
335
  ) {
326
336
  const childPath = [...currentPath, index];
327
337
  traverse(child as ComponentNode, childPath);
@@ -365,7 +375,7 @@ function expandSlotRenderedPaths(slotRenderedPath: Path, instanceChildrenCount:
365
375
  export function buildComponentTreePaths(
366
376
  componentStructure: ComponentNode,
367
377
  globalComponentRegistry?: any,
368
- navigationHistory?: NavigationContext[]
378
+ navigationHistory?: NavigationContext[],
369
379
  ): NodePathData[] {
370
380
  const result: NodePathData[] = [];
371
381
 
@@ -374,9 +384,9 @@ export function buildComponentTreePaths(
374
384
 
375
385
  const hostInstanceChildrenCount =
376
386
  navigationHistory && navigationHistory.length > 0
377
- ? (Array.isArray(navigationHistory[navigationHistory.length - 1].instanceChildren)
378
- ? navigationHistory[navigationHistory.length - 1].instanceChildren!.length
379
- : 0)
387
+ ? Array.isArray(navigationHistory[navigationHistory.length - 1].instanceChildren)
388
+ ? navigationHistory[navigationHistory.length - 1].instanceChildren!.length
389
+ : 0
380
390
  : 0;
381
391
 
382
392
  function traverse(node: ComponentNode, currentPath: Path = [0]): void {
@@ -409,7 +419,15 @@ export function buildComponentTreePaths(
409
419
  if (
410
420
  typeof child === 'object' &&
411
421
  child !== null &&
412
- ('tag' in child || 'component' in child || 'html' in child || 'src' in child || 'href' in child || isLocaleListNode(child) || isCMSListNode(child) || isListNode(child) || isSlotMarker(child))
422
+ ('tag' in child ||
423
+ 'component' in child ||
424
+ 'html' in child ||
425
+ 'src' in child ||
426
+ 'href' in child ||
427
+ isLocaleListNode(child) ||
428
+ isCMSListNode(child) ||
429
+ isListNode(child) ||
430
+ isSlotMarker(child))
413
431
  ) {
414
432
  const childPath = [...currentPath, index];
415
433
  traverse(child as ComponentNode, childPath);
@@ -425,24 +443,16 @@ export function buildComponentTreePaths(
425
443
  /**
426
444
  * Find NodePathData by logical path
427
445
  */
428
- export function findPathData(
429
- pathsData: NodePathData[],
430
- searchPath: Path
431
- ): NodePathData | undefined {
446
+ export function findPathData(pathsData: NodePathData[], searchPath: Path): NodePathData | undefined {
432
447
  return pathsData.find(
433
- (item) =>
434
- item.path.length === searchPath.length &&
435
- item.path.every((val, idx) => val === searchPath[idx])
448
+ (item) => item.path.length === searchPath.length && item.path.every((val, idx) => val === searchPath[idx]),
436
449
  );
437
450
  }
438
451
 
439
452
  /**
440
453
  * Get all ancestors for a path (including the path itself)
441
454
  */
442
- export function getPathAncestors(
443
- pathsData: NodePathData[],
444
- searchPath: Path
445
- ): NodePathData[] {
455
+ export function getPathAncestors(pathsData: NodePathData[], searchPath: Path): NodePathData[] {
446
456
  const ancestors: NodePathData[] = [];
447
457
 
448
458
  for (let i = 1; i <= searchPath.length; i++) {
@@ -243,11 +243,7 @@ describe('extractStructureWithoutStyles', () => {
243
243
  });
244
244
 
245
245
  describe('calculateInsertionIndex', () => {
246
- const mockChildren = [
247
- createNode({ tag: 'p' }),
248
- createNode({ tag: 'span' }),
249
- createNode({ tag: 'div' }),
250
- ];
246
+ const mockChildren = [createNode({ tag: 'p' }), createNode({ tag: 'span' }), createNode({ tag: 'div' })];
251
247
  const emptyNodeDataMap = new Map<string, ComponentNode | string>();
252
248
 
253
249
  test('should use childIndex when provided', () => {
@@ -521,11 +517,7 @@ describe('edge cases', () => {
521
517
 
522
518
  test('should handle mixed children (nodes and strings)', () => {
523
519
  const pageData = createPageData({
524
- children: [
525
- 'text before',
526
- createNode({ tag: 'span' }),
527
- 'text after',
528
- ],
520
+ children: ['text before', createNode({ tag: 'span' }), 'text after'],
529
521
  });
530
522
 
531
523
  // Path to span should work