meno-core 1.0.53 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (415) hide show
  1. package/.claude/settings.local.json +1 -3
  2. package/bin/cli.ts +66 -261
  3. package/build-astro.ts +150 -128
  4. package/dist/bin/cli.js +42 -185
  5. package/dist/bin/cli.js.map +2 -2
  6. package/dist/chunks/chunk-2AR55GYH.js +42 -0
  7. package/dist/chunks/chunk-2AR55GYH.js.map +7 -0
  8. package/dist/chunks/{chunk-JGWFTO6P.js → chunk-2IIQK7T3.js} +2624 -1389
  9. package/dist/chunks/chunk-2IIQK7T3.js.map +7 -0
  10. package/dist/chunks/chunk-4ZRU52J2.js +169 -0
  11. package/dist/chunks/chunk-4ZRU52J2.js.map +7 -0
  12. package/dist/chunks/{chunk-UB44F4Z2.js → chunk-5X4HCN7J.js} +5 -7
  13. package/dist/chunks/chunk-5X4HCN7J.js.map +7 -0
  14. package/dist/chunks/{chunk-WQFG7PAH.js → chunk-7CCVOL5M.js} +15 -19
  15. package/dist/chunks/chunk-7CCVOL5M.js.map +7 -0
  16. package/dist/chunks/{chunk-YBLHKYFF.js → chunk-AR7LHIFY.js} +8 -2
  17. package/dist/chunks/chunk-AR7LHIFY.js.map +7 -0
  18. package/dist/chunks/{chunk-O3NAGJP4.js → chunk-NUP7H7D3.js} +135 -41
  19. package/dist/chunks/chunk-NUP7H7D3.js.map +7 -0
  20. package/dist/chunks/{chunk-X754AHS5.js → chunk-QWTQZHG3.js} +194 -90
  21. package/dist/chunks/chunk-QWTQZHG3.js.map +7 -0
  22. package/dist/chunks/{chunk-H3GJ4H2U.js → chunk-XTKNX4FW.js} +216 -87
  23. package/dist/chunks/chunk-XTKNX4FW.js.map +7 -0
  24. package/dist/chunks/{fs-JGINUXGL.js → fs-G3ANWEFP.js} +2 -2
  25. package/dist/lib/client/index.js +1003 -475
  26. package/dist/lib/client/index.js.map +3 -3
  27. package/dist/lib/server/index.js +14393 -6371
  28. package/dist/lib/server/index.js.map +4 -4
  29. package/dist/lib/shared/index.js +342 -101
  30. package/dist/lib/shared/index.js.map +4 -4
  31. package/dist/lib/shared/richtext/index.js +1 -1
  32. package/dist/lib/test-utils/index.js +64 -80
  33. package/dist/lib/test-utils/index.js.map +2 -2
  34. package/entries/client-router.tsx +10 -8
  35. package/lib/client/ClientInitializer.ts +8 -8
  36. package/lib/client/ErrorBoundary.test.tsx +246 -186
  37. package/lib/client/ErrorBoundary.tsx +183 -132
  38. package/lib/client/componentRegistry.test.ts +96 -108
  39. package/lib/client/componentRegistry.ts +1 -3
  40. package/lib/client/contexts/ThemeContext.tsx +3 -2
  41. package/lib/client/core/ComponentBuilder.test.ts +663 -560
  42. package/lib/client/core/ComponentBuilder.ts +427 -155
  43. package/lib/client/core/ComponentRenderer.test.tsx +2 -4
  44. package/lib/client/core/ComponentRenderer.tsx +46 -33
  45. package/lib/client/core/builders/embedBuilder.ts +242 -54
  46. package/lib/client/core/builders/linkBuilder.ts +72 -45
  47. package/lib/client/core/builders/linkNodeBuilder.ts +79 -54
  48. package/lib/client/core/builders/listBuilder.ts +155 -89
  49. package/lib/client/core/builders/localeListBuilder.ts +97 -62
  50. package/lib/client/core/builders/types.ts +5 -5
  51. package/lib/client/core/cmsTemplateProcessor.ts +8 -9
  52. package/lib/client/elementRegistry.ts +3 -3
  53. package/lib/client/fontFamiliesService.test.ts +2 -10
  54. package/lib/client/fontFamiliesService.ts +3 -3
  55. package/lib/client/hmr/HMRManager.tsx +47 -30
  56. package/lib/client/hmrCssReload.ts +49 -14
  57. package/lib/client/hmrWebSocket.ts +14 -19
  58. package/lib/client/hooks/useColorVariables.test.ts +21 -21
  59. package/lib/client/hooks/useColorVariables.ts +23 -18
  60. package/lib/client/hooks/usePropertyAutocomplete.ts +4 -6
  61. package/lib/client/hooks/useVariables.ts +6 -4
  62. package/lib/client/hydration/HydrationUtils.test.ts +24 -25
  63. package/lib/client/hydration/HydrationUtils.ts +3 -4
  64. package/lib/client/i18nConfigService.test.ts +2 -7
  65. package/lib/client/i18nConfigService.ts +2 -2
  66. package/lib/client/meno-filter/MenoFilter.test.ts +47 -49
  67. package/lib/client/meno-filter/MenoFilter.ts +14 -15
  68. package/lib/client/meno-filter/bindings.ts +18 -43
  69. package/lib/client/meno-filter/init.ts +4 -4
  70. package/lib/client/meno-filter/renderer.ts +30 -32
  71. package/lib/client/meno-filter/script.generated.ts +1 -3
  72. package/lib/client/meno-filter/ui.ts +4 -6
  73. package/lib/client/meno-filter/updates.ts +18 -23
  74. package/lib/client/meno-filter/utils.ts +1 -1
  75. package/lib/client/navigation.test.ts +174 -178
  76. package/lib/client/navigation.ts +0 -1
  77. package/lib/client/responsiveStyleResolver.knownTokens.test.ts +71 -0
  78. package/lib/client/responsiveStyleResolver.test.ts +234 -232
  79. package/lib/client/responsiveStyleResolver.ts +74 -20
  80. package/lib/client/routing/RouteLoader.test.ts +24 -25
  81. package/lib/client/routing/RouteLoader.ts +27 -35
  82. package/lib/client/routing/Router.tsx +210 -153
  83. package/lib/client/scripts/ScriptExecutor.test.ts +157 -158
  84. package/lib/client/scripts/ScriptExecutor.ts +18 -36
  85. package/lib/client/services/PrefetchService.test.ts +3 -3
  86. package/lib/client/services/PrefetchService.ts +23 -29
  87. package/lib/client/styleProcessor.test.ts +9 -9
  88. package/lib/client/styleProcessor.ts +24 -15
  89. package/lib/client/styles/StyleInjector.test.ts +122 -115
  90. package/lib/client/styles/StyleInjector.ts +10 -7
  91. package/lib/client/styles/UtilityClassCollector.ts +62 -28
  92. package/lib/client/styles/cspNonce.test.ts +2 -5
  93. package/lib/client/templateEngine.test.ts +554 -488
  94. package/lib/client/templateEngine.ts +203 -73
  95. package/lib/client/theme.test.ts +1 -1
  96. package/lib/client/theme.ts +0 -1
  97. package/lib/client/utils/toast.ts +0 -1
  98. package/lib/server/__integration__/api-routes.test.ts +8 -4
  99. package/lib/server/__integration__/cms-integration.test.ts +1 -4
  100. package/lib/server/__integration__/server-lifecycle.test.ts +4 -5
  101. package/lib/server/__integration__/ssr-rendering.test.ts +47 -37
  102. package/lib/server/__integration__/static-assets.test.ts +3 -3
  103. package/lib/server/__integration__/test-helpers.ts +87 -74
  104. package/lib/server/ab/generateFunctions.ts +12 -10
  105. package/lib/server/astro/cmsPageEmitter.ts +26 -42
  106. package/lib/server/astro/componentEmitter.ts +35 -43
  107. package/lib/server/astro/cssCollector.ts +10 -26
  108. package/lib/server/astro/nodeToAstro.test.ts +1754 -34
  109. package/lib/server/astro/nodeToAstro.ts +232 -216
  110. package/lib/server/astro/normalizeOrphanTemplateProps.test.ts +115 -119
  111. package/lib/server/astro/normalizeOrphanTemplateProps.ts +11 -18
  112. package/lib/server/astro/pageEmitter.ts +9 -13
  113. package/lib/server/astro/tailwindMapper.test.ts +10 -37
  114. package/lib/server/astro/tailwindMapper.ts +33 -40
  115. package/lib/server/astro/templateTransformer.ts +17 -20
  116. package/lib/server/createServer.ts +7 -19
  117. package/lib/server/cssGenerator.test.ts +35 -44
  118. package/lib/server/cssGenerator.ts +8 -19
  119. package/lib/server/fileWatcher.test.ts +164 -13
  120. package/lib/server/fileWatcher.ts +209 -124
  121. package/lib/server/index.ts +14 -17
  122. package/lib/server/jsonLoader.test.ts +39 -2
  123. package/lib/server/jsonLoader.ts +39 -34
  124. package/lib/server/middleware/cors.test.ts +21 -21
  125. package/lib/server/middleware/cors.ts +28 -4
  126. package/lib/server/middleware/errorHandler.test.ts +7 -5
  127. package/lib/server/middleware/errorHandler.ts +3 -8
  128. package/lib/server/middleware/index.ts +0 -1
  129. package/lib/server/middleware/logger.test.ts +10 -8
  130. package/lib/server/middleware/logger.ts +17 -29
  131. package/lib/server/migrateTemplates.ts +3 -3
  132. package/lib/server/pageCache.test.ts +76 -77
  133. package/lib/server/pageCache.ts +0 -1
  134. package/lib/server/projectContext.ts +5 -4
  135. package/lib/server/providers/fileSystemCMSProvider.test.ts +142 -99
  136. package/lib/server/providers/fileSystemCMSProvider.ts +62 -38
  137. package/lib/server/routes/api/cms.test.ts +26 -14
  138. package/lib/server/routes/api/cms.ts +9 -14
  139. package/lib/server/routes/api/colors.test.ts +2 -2
  140. package/lib/server/routes/api/components.ts +31 -35
  141. package/lib/server/routes/api/config.ts +3 -4
  142. package/lib/server/routes/api/core-routes.ts +49 -76
  143. package/lib/server/routes/api/enums.test.ts +2 -2
  144. package/lib/server/routes/api/functions.ts +9 -17
  145. package/lib/server/routes/api/index.ts +3 -6
  146. package/lib/server/routes/api/pages.ts +8 -11
  147. package/lib/server/routes/api/shared.test.ts +1 -1
  148. package/lib/server/routes/api/shared.ts +12 -9
  149. package/lib/server/routes/api/variables.test.ts +3 -5
  150. package/lib/server/routes/api/variables.ts +1 -1
  151. package/lib/server/routes/index.ts +25 -28
  152. package/lib/server/routes/pages.ts +35 -31
  153. package/lib/server/routes/static.ts +17 -6
  154. package/lib/server/runtime/bundler.ts +98 -61
  155. package/lib/server/runtime/fs.ts +16 -26
  156. package/lib/server/runtime/httpServer.ts +8 -12
  157. package/lib/server/services/ColorService.test.ts +3 -3
  158. package/lib/server/services/ColorService.ts +37 -29
  159. package/lib/server/services/EnumService.test.ts +4 -8
  160. package/lib/server/services/EnumService.ts +11 -3
  161. package/lib/server/services/VariableService.test.ts +8 -12
  162. package/lib/server/services/VariableService.ts +11 -3
  163. package/lib/server/services/cmsService.test.ts +158 -120
  164. package/lib/server/services/cmsService.ts +36 -146
  165. package/lib/server/services/componentService.test.ts +125 -45
  166. package/lib/server/services/componentService.ts +70 -46
  167. package/lib/server/services/configService.test.ts +22 -45
  168. package/lib/server/services/configService.ts +50 -27
  169. package/lib/server/services/fileWatcherService.ts +42 -8
  170. package/lib/server/services/index.ts +0 -1
  171. package/lib/server/services/pageService.test.ts +8 -10
  172. package/lib/server/services/pageService.ts +32 -18
  173. package/lib/server/ssr/attributeBuilder.ts +18 -8
  174. package/lib/server/ssr/buildErrorOverlay.ts +11 -12
  175. package/lib/server/ssr/clientDataInjector.ts +7 -21
  176. package/lib/server/ssr/cmsSSRProcessor.ts +4 -8
  177. package/lib/server/ssr/cssCollector.ts +1 -1
  178. package/lib/server/ssr/errorOverlay.test.ts +1 -1
  179. package/lib/server/ssr/errorOverlay.ts +3 -9
  180. package/lib/server/ssr/htmlGenerator.nonce.test.ts +9 -14
  181. package/lib/server/ssr/htmlGenerator.test.ts +120 -44
  182. package/lib/server/ssr/htmlGenerator.ts +126 -91
  183. package/lib/server/ssr/imageMetadata.test.ts +3 -1
  184. package/lib/server/ssr/imageMetadata.ts +27 -21
  185. package/lib/server/ssr/jsCollector.test.ts +8 -18
  186. package/lib/server/ssr/jsCollector.ts +3 -8
  187. package/lib/server/ssr/liveReloadIntegration.test.ts +76 -36
  188. package/lib/server/ssr/metaTagGenerator.ts +2 -2
  189. package/lib/server/ssr/ssrRenderer.branches.test.ts +1103 -0
  190. package/lib/server/ssr/ssrRenderer.test.ts +316 -256
  191. package/lib/server/ssr/ssrRenderer.ts +795 -243
  192. package/lib/server/ssrRenderer.test.ts +1048 -954
  193. package/lib/server/utils/jsonLineMapper.test.ts +28 -28
  194. package/lib/server/utils/jsonLineMapper.ts +7 -7
  195. package/lib/server/validateStyleCoverage.ts +18 -21
  196. package/lib/server/websocketManager.ts +28 -19
  197. package/lib/shared/attributeNodeUtils.test.ts +15 -15
  198. package/lib/shared/attributeNodeUtils.ts +5 -12
  199. package/lib/shared/breakpoints.test.ts +5 -5
  200. package/lib/shared/breakpoints.ts +4 -11
  201. package/lib/shared/cmsQuery.test.ts +81 -0
  202. package/lib/shared/cmsQuery.ts +92 -0
  203. package/lib/shared/cmsQueryParser.test.ts +50 -42
  204. package/lib/shared/cmsQueryParser.ts +60 -38
  205. package/lib/shared/colorConversions.ts +9 -9
  206. package/lib/shared/colorVariableUtils.test.ts +27 -5
  207. package/lib/shared/colorVariableUtils.ts +21 -12
  208. package/lib/shared/componentRefs.ts +1 -5
  209. package/lib/shared/constants.test.ts +3 -3
  210. package/lib/shared/constants.ts +8 -8
  211. package/lib/shared/cssGeneration.test.ts +285 -144
  212. package/lib/shared/cssGeneration.ts +217 -531
  213. package/lib/shared/cssNamedColors.ts +152 -30
  214. package/lib/shared/cssProperties.test.ts +69 -70
  215. package/lib/shared/cssProperties.ts +298 -114
  216. package/lib/shared/elementClassName.test.ts +109 -109
  217. package/lib/shared/elementClassName.ts +3 -3
  218. package/lib/shared/elementUtils.ts +12 -16
  219. package/lib/shared/errorLogger.test.ts +12 -12
  220. package/lib/shared/errorLogger.ts +2 -10
  221. package/lib/shared/errors.test.ts +2 -13
  222. package/lib/shared/errors.ts +2 -8
  223. package/lib/shared/expressionEvaluator.test.ts +145 -0
  224. package/lib/shared/expressionEvaluator.ts +52 -24
  225. package/lib/shared/fontLoader.test.ts +32 -18
  226. package/lib/shared/fontLoader.ts +2 -2
  227. package/lib/shared/friendlyError.ts +2 -3
  228. package/lib/shared/gradientUtils.test.ts +3 -7
  229. package/lib/shared/gradientUtils.ts +17 -14
  230. package/lib/shared/hrefRefs.test.ts +2 -2
  231. package/lib/shared/hrefRefs.ts +2 -10
  232. package/lib/shared/i18n.test.ts +4 -4
  233. package/lib/shared/i18n.ts +18 -38
  234. package/lib/shared/index.ts +27 -0
  235. package/lib/shared/inlineSvgStyleRules.ts +14 -13
  236. package/lib/shared/interactiveStyleMappings.test.ts +32 -54
  237. package/lib/shared/interactiveStyleMappings.ts +11 -24
  238. package/lib/shared/interactiveStyles.test.ts +165 -188
  239. package/lib/shared/interfaces/contentProvider.ts +1 -1
  240. package/lib/shared/itemTemplateUtils.test.ts +11 -17
  241. package/lib/shared/itemTemplateUtils.ts +27 -39
  242. package/lib/shared/jsonRepair.ts +16 -10
  243. package/lib/shared/libraryLoader.test.ts +21 -55
  244. package/lib/shared/libraryLoader.ts +7 -22
  245. package/lib/shared/linkUtils.ts +1 -1
  246. package/lib/shared/logger.test.ts +66 -0
  247. package/lib/shared/logger.ts +94 -0
  248. package/lib/shared/markdown.ts +25 -0
  249. package/lib/shared/netlifyLocale404.test.ts +179 -0
  250. package/lib/shared/netlifyLocale404.ts +110 -0
  251. package/lib/shared/nodeUtils.test.ts +28 -16
  252. package/lib/shared/nodeUtils.ts +76 -23
  253. package/lib/shared/pathArrayUtils.test.ts +1 -2
  254. package/lib/shared/pathArrayUtils.ts +1 -1
  255. package/lib/shared/pathSecurity.ts +2 -2
  256. package/lib/shared/pathUtils.test.ts +4 -6
  257. package/lib/shared/pathUtils.ts +42 -49
  258. package/lib/shared/paths/Path.test.ts +2 -2
  259. package/lib/shared/paths/Path.ts +0 -1
  260. package/lib/shared/paths/PathConverter.test.ts +1 -1
  261. package/lib/shared/paths/PathConverter.ts +17 -20
  262. package/lib/shared/paths/PathUtils.ts +13 -13
  263. package/lib/shared/paths/PathValidator.test.ts +2 -15
  264. package/lib/shared/paths/PathValidator.ts +12 -10
  265. package/lib/shared/paths/index.ts +1 -2
  266. package/lib/shared/permissions.test.ts +168 -0
  267. package/lib/shared/permissions.ts +162 -0
  268. package/lib/shared/propResolver.test.ts +240 -244
  269. package/lib/shared/propResolver.ts +15 -26
  270. package/lib/shared/pxToRem.test.ts +7 -6
  271. package/lib/shared/pxToRem.ts +2 -5
  272. package/lib/shared/registry/BaseNodeTypeRegistry.test.ts +12 -6
  273. package/lib/shared/registry/ClientRegistry.ts +0 -2
  274. package/lib/shared/registry/ComponentRegistry.test.ts +46 -32
  275. package/lib/shared/registry/ComponentRegistry.ts +12 -9
  276. package/lib/shared/registry/NodeTypeDefinition.ts +16 -9
  277. package/lib/shared/registry/RegistryManager.ts +1 -2
  278. package/lib/shared/registry/SSRRegistry.ts +0 -2
  279. package/lib/shared/registry/createNodeType.ts +7 -9
  280. package/lib/shared/registry/defineNodeType.ts +2 -6
  281. package/lib/shared/registry/fieldPresets.ts +3 -1
  282. package/lib/shared/registry/index.ts +0 -1
  283. package/lib/shared/registry/nodeTypes/ComponentInstanceNodeType.ts +14 -15
  284. package/lib/shared/registry/nodeTypes/CustomNodeType.ts +103 -0
  285. package/lib/shared/registry/nodeTypes/EmbedNodeType.ts +18 -11
  286. package/lib/shared/registry/nodeTypes/HtmlNodeType.ts +48 -19
  287. package/lib/shared/registry/nodeTypes/IslandNodeType.ts +129 -0
  288. package/lib/shared/registry/nodeTypes/LinkNodeType.ts +21 -19
  289. package/lib/shared/registry/nodeTypes/ListNodeType.ts +117 -77
  290. package/lib/shared/registry/nodeTypes/LocaleListNodeType.ts +27 -21
  291. package/lib/shared/registry/nodeTypes/MarkdownNodeType.ts +78 -0
  292. package/lib/shared/registry/nodeTypes/SlotMarkerType.ts +12 -8
  293. package/lib/shared/registry/nodeTypes/index.ts +26 -3
  294. package/lib/shared/responsiveScaling.test.ts +16 -34
  295. package/lib/shared/responsiveScaling.ts +61 -42
  296. package/lib/shared/responsiveStyleUtils.test.ts +0 -1
  297. package/lib/shared/responsiveStyleUtils.ts +11 -13
  298. package/lib/shared/richtext/htmlToTiptap.test.ts +139 -130
  299. package/lib/shared/richtext/htmlToTiptap.ts +2 -4
  300. package/lib/shared/richtext/tiptapToHtml.test.ts +5 -6
  301. package/lib/shared/richtext/types.ts +1 -8
  302. package/lib/shared/slugTranslator.test.ts +13 -13
  303. package/lib/shared/slugTranslator.ts +12 -16
  304. package/lib/shared/slugify.ts +9 -15
  305. package/lib/shared/styleNodeUtils.test.ts +8 -8
  306. package/lib/shared/styleNodeUtils.ts +18 -20
  307. package/lib/shared/styleUtils.test.ts +87 -61
  308. package/lib/shared/styleUtils.ts +5 -6
  309. package/lib/shared/themeDefaults.test.ts +11 -14
  310. package/lib/shared/themeDefaults.ts +3 -4
  311. package/lib/shared/tree/PathBuilder.test.ts +63 -145
  312. package/lib/shared/tree/PathBuilder.ts +59 -47
  313. package/lib/shared/treePathUtils.test.ts +51 -12
  314. package/lib/shared/treePathUtils.ts +91 -60
  315. package/lib/shared/types/api.ts +105 -8
  316. package/lib/shared/types/cms.test.ts +34 -0
  317. package/lib/shared/types/cms.ts +90 -34
  318. package/lib/shared/types/comment.ts +49 -16
  319. package/lib/shared/types/components.ts +51 -25
  320. package/lib/shared/types/errors.test.ts +1 -6
  321. package/lib/shared/types/errors.ts +3 -7
  322. package/lib/shared/types/experiments.ts +28 -28
  323. package/lib/shared/types/index.ts +25 -2
  324. package/lib/shared/types/permissions.ts +139 -0
  325. package/lib/shared/types/styles.ts +0 -1
  326. package/lib/shared/types/variables.test.ts +4 -13
  327. package/lib/shared/types/variables.ts +51 -30
  328. package/lib/shared/types.ts +1 -2
  329. package/lib/shared/utilityClassConfig.ts +751 -321
  330. package/lib/shared/utilityClassMapper.durability.test.ts +117 -0
  331. package/lib/shared/utilityClassMapper.test.ts +433 -95
  332. package/lib/shared/utilityClassMapper.ts +322 -249
  333. package/lib/shared/utilityClassNames.test.ts +38 -0
  334. package/lib/shared/utilityClassNames.ts +458 -0
  335. package/lib/shared/utils.test.ts +2 -10
  336. package/lib/shared/utils.ts +19 -10
  337. package/lib/shared/validation/cmsValidators.ts +2 -1
  338. package/lib/shared/validation/commentValidators.test.ts +53 -0
  339. package/lib/shared/validation/commentValidators.ts +12 -1
  340. package/lib/shared/validation/index.ts +1 -0
  341. package/lib/shared/validation/permissionsValidators.test.ts +49 -0
  342. package/lib/shared/validation/permissionsValidators.ts +49 -0
  343. package/lib/shared/validation/propValidator.test.ts +19 -21
  344. package/lib/shared/validation/propValidator.ts +13 -18
  345. package/lib/shared/validation/schemas.test.ts +64 -32
  346. package/lib/shared/validation/schemas.ts +616 -345
  347. package/lib/shared/validation/validators.test.ts +3 -8
  348. package/lib/shared/validation/validators.ts +89 -68
  349. package/lib/shared/viewportUnits.integration.test.ts +14 -10
  350. package/lib/shared/viewportUnits.test.ts +24 -23
  351. package/lib/shared/viewportUnits.ts +12 -5
  352. package/lib/test-utils/dom-setup.ts +1 -1
  353. package/lib/test-utils/factories/ConsoleMockFactory.ts +10 -14
  354. package/lib/test-utils/factories/DomMockFactory.ts +17 -23
  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 +6 -10
  358. package/lib/test-utils/factories/StoreMockFactory.ts +18 -29
  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 +13 -19
  365. package/lib/test-utils/mocks.ts +6 -4
  366. package/package.json +3 -5
  367. package/scripts/build-for-publish.mjs +2 -4
  368. package/scripts/build-meno-filter.ts +4 -7
  369. package/tsconfig.json +1 -0
  370. package/vite.config.ts +4 -4
  371. package/build-next.ts +0 -1361
  372. package/build-static.test.ts +0 -424
  373. package/build-static.ts +0 -1074
  374. package/dist/build-static.js +0 -36
  375. package/dist/chunks/chunk-2MHDV5BF.js +0 -251
  376. package/dist/chunks/chunk-2MHDV5BF.js.map +0 -7
  377. package/dist/chunks/chunk-AZQYF6KE.js +0 -559
  378. package/dist/chunks/chunk-AZQYF6KE.js.map +0 -7
  379. package/dist/chunks/chunk-GZHGVVW3.js +0 -322
  380. package/dist/chunks/chunk-GZHGVVW3.js.map +0 -7
  381. package/dist/chunks/chunk-H3GJ4H2U.js.map +0 -7
  382. package/dist/chunks/chunk-I7YIGZXT.js +0 -467
  383. package/dist/chunks/chunk-I7YIGZXT.js.map +0 -7
  384. package/dist/chunks/chunk-IGYR22T6.js +0 -6192
  385. package/dist/chunks/chunk-IGYR22T6.js.map +0 -7
  386. package/dist/chunks/chunk-JGP5A3Y5.js +0 -1136
  387. package/dist/chunks/chunk-JGP5A3Y5.js.map +0 -7
  388. package/dist/chunks/chunk-JGWFTO6P.js.map +0 -7
  389. package/dist/chunks/chunk-O3NAGJP4.js.map +0 -7
  390. package/dist/chunks/chunk-QB2LNO4W.js +0 -77
  391. package/dist/chunks/chunk-QB2LNO4W.js.map +0 -7
  392. package/dist/chunks/chunk-R6XHAFBF.js +0 -3821
  393. package/dist/chunks/chunk-R6XHAFBF.js.map +0 -7
  394. package/dist/chunks/chunk-UB44F4Z2.js.map +0 -7
  395. package/dist/chunks/chunk-WQFG7PAH.js.map +0 -7
  396. package/dist/chunks/chunk-X754AHS5.js.map +0 -7
  397. package/dist/chunks/chunk-YBLHKYFF.js.map +0 -7
  398. package/dist/chunks/configService-R3OGU2UD.js +0 -13
  399. package/dist/chunks/configService-R3OGU2UD.js.map +0 -7
  400. package/dist/chunks/constants-STK2YBIW.js +0 -46
  401. package/dist/chunks/constants-STK2YBIW.js.map +0 -7
  402. package/dist/chunks/fs-JGINUXGL.js.map +0 -7
  403. package/dist/entries/server-router.js +0 -67
  404. package/dist/entries/server-router.js.map +0 -7
  405. package/entries/server-router.tsx +0 -81
  406. package/lib/server/providers/fileSystemPageProvider.ts +0 -160
  407. package/lib/server/webflow/buildWebflow.ts +0 -635
  408. package/lib/server/webflow/index.ts +0 -23
  409. package/lib/server/webflow/nodeToWebflow.test.ts +0 -3170
  410. package/lib/server/webflow/nodeToWebflow.ts +0 -2435
  411. package/lib/server/webflow/styleMapper.test.ts +0 -389
  412. package/lib/server/webflow/styleMapper.ts +0 -695
  413. package/lib/server/webflow/templateWrapper.ts +0 -49
  414. package/lib/server/webflow/types.ts +0 -396
  415. /package/dist/{build-static.js.map → chunks/fs-G3ANWEFP.js.map} +0 -0
@@ -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;
@@ -107,7 +110,7 @@ function calculateRenderedPath(
107
110
  // Use the most recent (current) navigation context's instanceChildren
108
111
  // When editing nested components A > B, we need B's instanceChildren, not A's
109
112
  const currentContext = navigationHistory[navigationHistory.length - 1];
110
- const instanceChildren = currentContext.instanceChildren;
113
+ const instanceChildren = currentContext?.instanceChildren;
111
114
  const instanceChildrenCount = Array.isArray(instanceChildren) ? instanceChildren.length : 0;
112
115
 
113
116
  if (instanceChildrenCount > 0) {
@@ -117,8 +120,8 @@ function calculateRenderedPath(
117
120
  // Check if this path is for an element AFTER the slot marker
118
121
  const markerDepth = rootSlotPath.length - 1;
119
122
  if (logicalPath.length > markerDepth) {
120
- const indexAtMarkerLevel = logicalPath[markerDepth];
121
- const markerIndex = rootSlotPath[markerDepth];
123
+ const indexAtMarkerLevel = logicalPath[markerDepth] ?? 0;
124
+ const markerIndex = rootSlotPath[markerDepth] ?? 0;
122
125
 
123
126
  if (indexAtMarkerLevel > markerIndex) {
124
127
  // This path is after the slot marker in the structure
@@ -135,10 +138,11 @@ 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
- let childIndex = logicalPath[i];
144
+ const originalIndex = logicalPath[i] ?? 0;
145
+ let childIndex = originalIndex;
142
146
 
143
147
  // Apply post-slot offset at the appropriate depth
144
148
  // This handles elements that come AFTER a slot marker in the component structure
@@ -149,7 +153,7 @@ function calculateRenderedPath(
149
153
  if (!node || !hasChildren(node)) break;
150
154
 
151
155
  const children = node.children;
152
- const childNode = children[logicalPath[i]]; // Use original index for traversal
156
+ const childNode = children[originalIndex]; // Use original index for traversal
153
157
 
154
158
  // Check if current node (the parent) is a component
155
159
  if (isComponentNode(node)) {
@@ -164,7 +168,7 @@ function calculateRenderedPath(
164
168
  // prefix = path from component root to slot's parent container
165
169
  // For [0, 0, 0]: prefix = [0] (the middle elements, excluding root and slot index)
166
170
  const prefix = slotPath.slice(1, -1);
167
- const slotIndex = slotPath[slotPath.length - 1];
171
+ const slotIndex = slotPath[slotPath.length - 1] ?? 0;
168
172
 
169
173
  // Child renders at: currentRenderedPath + prefix + (slotIndex + adjustedChildIndex)
170
174
  renderedPath = [...renderedPath, ...prefix, slotIndex + childIndex];
@@ -181,7 +185,9 @@ function calculateRenderedPath(
181
185
  renderedPath = [...renderedPath, childIndex];
182
186
  }
183
187
 
184
- node = childNode;
188
+ // Text children have no children of their own — the next iteration's
189
+ // hasChildren() check breaks out, same as before, but keep `node` typed.
190
+ node = typeof childNode === 'string' ? undefined : childNode;
185
191
  }
186
192
 
187
193
  return renderedPath;
@@ -197,16 +203,16 @@ function calculateRenderedPath(
197
203
  * CMS item context for elements inside CMS List(s)
198
204
  */
199
205
  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
206
+ itemIndexPath: number[]; // e.g., [0] for single list, [0, 2] for nested
207
+ listPaths: Path[]; // Parallel array of list node paths
202
208
  }
203
209
 
204
210
  export interface NavigationContext {
205
- file?: any; // FileItem - optional as not all contexts have file
211
+ file?: any; // FileItem - optional as not all contexts have file
206
212
  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
213
+ componentInstanceRenderedPath?: Path | null; // Rendered path for accurate DOM queries
214
+ instanceChildren?: Array<ComponentNode | string>; // Children of the component instance (for path offset calculation)
215
+ cmsItemContext?: CMSItemContext | null; // CMS context when editing component inside CMS List
210
216
  }
211
217
 
212
218
  /**
@@ -218,16 +224,14 @@ export interface NavigationContext {
218
224
  * buildTreePathsWithRendered prepends, and to know how many leading elements
219
225
  * to strip when extracting a component-internal path back out.
220
226
  */
221
- export function computeCumulativeInstancePath(
222
- navigationHistory: NavigationContext[] | undefined,
223
- ): Path | null {
227
+ export function computeCumulativeInstancePath(navigationHistory: NavigationContext[] | undefined): Path | null {
224
228
  if (!navigationHistory || navigationHistory.length === 0) return null;
225
229
  let cumulative: Path | null =
226
- navigationHistory[0].componentInstanceRenderedPath ?? navigationHistory[0].componentInstancePath;
230
+ navigationHistory[0]?.componentInstanceRenderedPath ?? navigationHistory[0]?.componentInstancePath ?? null;
227
231
  if (!cumulative) return null;
228
232
  for (let i = 1; i < navigationHistory.length; i++) {
229
- const next =
230
- navigationHistory[i].componentInstanceRenderedPath ?? navigationHistory[i].componentInstancePath;
233
+ const entry = navigationHistory[i];
234
+ const next = entry?.componentInstanceRenderedPath ?? entry?.componentInstancePath;
231
235
  if (next) {
232
236
  cumulative = [...cumulative, ...next.slice(1)];
233
237
  }
@@ -264,7 +268,7 @@ export function computeCumulativeInstancePath(
264
268
  export function buildTreePathsWithRendered(
265
269
  pageData: PageData,
266
270
  globalComponentRegistry?: any,
267
- navigationHistory?: NavigationContext[]
271
+ navigationHistory?: NavigationContext[],
268
272
  ): NodePathData[] {
269
273
  const rootData = getRootData(pageData);
270
274
  if (!rootData) return [];
@@ -281,9 +285,9 @@ export function buildTreePathsWithRendered(
281
285
  // post-slot offset (the LAST navigation entry's instanceChildren).
282
286
  const hostInstanceChildrenCount =
283
287
  navigationHistory && navigationHistory.length > 0
284
- ? (Array.isArray(navigationHistory[navigationHistory.length - 1].instanceChildren)
285
- ? navigationHistory[navigationHistory.length - 1].instanceChildren!.length
286
- : 0)
288
+ ? Array.isArray(navigationHistory[navigationHistory.length - 1]?.instanceChildren)
289
+ ? navigationHistory[navigationHistory.length - 1]!.instanceChildren!.length
290
+ : 0
287
291
  : 0;
288
292
 
289
293
  function traverse(node: ComponentNode, currentPath: Path = [0]): void {
@@ -308,8 +312,8 @@ export function buildTreePathsWithRendered(
308
312
  : undefined;
309
313
 
310
314
  result.push({
311
- path: currentPath, // Keep logical path component-relative
312
- renderedPath: adjustedRenderedPath, // Adjust rendered path for page-relative queries
315
+ path: currentPath, // Keep logical path component-relative
316
+ renderedPath: adjustedRenderedPath, // Adjust rendered path for page-relative queries
313
317
  ...(slotRenderedPaths ? { slotRenderedPaths } : {}),
314
318
  });
315
319
 
@@ -321,7 +325,15 @@ export function buildTreePathsWithRendered(
321
325
  if (
322
326
  typeof child === 'object' &&
323
327
  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)))
328
+ ('tag' in child ||
329
+ 'component' in child ||
330
+ 'html' in child ||
331
+ 'src' in child ||
332
+ 'href' in child ||
333
+ isLocaleListNode(child) ||
334
+ isCMSListNode(child) ||
335
+ isListNode(child) ||
336
+ (cumulativeInstancePath && isSlotMarker(child)))
325
337
  ) {
326
338
  const childPath = [...currentPath, index];
327
339
  traverse(child as ComponentNode, childPath);
@@ -343,7 +355,7 @@ export function buildTreePathsWithRendered(
343
355
  function expandSlotRenderedPaths(slotRenderedPath: Path, instanceChildrenCount: number): Path[] {
344
356
  if (instanceChildrenCount <= 0 || slotRenderedPath.length === 0) return [];
345
357
  const prefix = slotRenderedPath.slice(0, -1);
346
- const slotIdx = slotRenderedPath[slotRenderedPath.length - 1];
358
+ const slotIdx = slotRenderedPath[slotRenderedPath.length - 1] ?? 0;
347
359
  const out: Path[] = [];
348
360
  for (let i = 0; i < instanceChildrenCount; i++) {
349
361
  out.push([...prefix, slotIdx + i]);
@@ -365,7 +377,7 @@ function expandSlotRenderedPaths(slotRenderedPath: Path, instanceChildrenCount:
365
377
  export function buildComponentTreePaths(
366
378
  componentStructure: ComponentNode,
367
379
  globalComponentRegistry?: any,
368
- navigationHistory?: NavigationContext[]
380
+ navigationHistory?: NavigationContext[],
369
381
  ): NodePathData[] {
370
382
  const result: NodePathData[] = [];
371
383
 
@@ -374,9 +386,9 @@ export function buildComponentTreePaths(
374
386
 
375
387
  const hostInstanceChildrenCount =
376
388
  navigationHistory && navigationHistory.length > 0
377
- ? (Array.isArray(navigationHistory[navigationHistory.length - 1].instanceChildren)
378
- ? navigationHistory[navigationHistory.length - 1].instanceChildren!.length
379
- : 0)
389
+ ? Array.isArray(navigationHistory[navigationHistory.length - 1]?.instanceChildren)
390
+ ? navigationHistory[navigationHistory.length - 1]!.instanceChildren!.length
391
+ : 0
380
392
  : 0;
381
393
 
382
394
  function traverse(node: ComponentNode, currentPath: Path = [0]): void {
@@ -409,7 +421,15 @@ export function buildComponentTreePaths(
409
421
  if (
410
422
  typeof child === 'object' &&
411
423
  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))
424
+ ('tag' in child ||
425
+ 'component' in child ||
426
+ 'html' in child ||
427
+ 'src' in child ||
428
+ 'href' in child ||
429
+ isLocaleListNode(child) ||
430
+ isCMSListNode(child) ||
431
+ isListNode(child) ||
432
+ isSlotMarker(child))
413
433
  ) {
414
434
  const childPath = [...currentPath, index];
415
435
  traverse(child as ComponentNode, childPath);
@@ -425,24 +445,16 @@ export function buildComponentTreePaths(
425
445
  /**
426
446
  * Find NodePathData by logical path
427
447
  */
428
- export function findPathData(
429
- pathsData: NodePathData[],
430
- searchPath: Path
431
- ): NodePathData | undefined {
448
+ export function findPathData(pathsData: NodePathData[], searchPath: Path): NodePathData | undefined {
432
449
  return pathsData.find(
433
- (item) =>
434
- item.path.length === searchPath.length &&
435
- item.path.every((val, idx) => val === searchPath[idx])
450
+ (item) => item.path.length === searchPath.length && item.path.every((val, idx) => val === searchPath[idx]),
436
451
  );
437
452
  }
438
453
 
439
454
  /**
440
455
  * Get all ancestors for a path (including the path itself)
441
456
  */
442
- export function getPathAncestors(
443
- pathsData: NodePathData[],
444
- searchPath: Path
445
- ): NodePathData[] {
457
+ export function getPathAncestors(pathsData: NodePathData[], searchPath: Path): NodePathData[] {
446
458
  const ancestors: NodePathData[] = [];
447
459
 
448
460
  for (let i = 1; i <= searchPath.length; i++) {
@@ -16,6 +16,7 @@ import {
16
16
  isComponentNodeParent,
17
17
  getParentChildren,
18
18
  setParentChildren,
19
+ findPathToNodeByReference,
19
20
  } from './treePathUtils';
20
21
  import type { ComponentNode, PageData, JSONPage, PageDataWithComponent, HtmlNode } from './types';
21
22
  import { NODE_TYPE } from './constants';
@@ -243,11 +244,7 @@ describe('extractStructureWithoutStyles', () => {
243
244
  });
244
245
 
245
246
  describe('calculateInsertionIndex', () => {
246
- const mockChildren = [
247
- createNode({ tag: 'p' }),
248
- createNode({ tag: 'span' }),
249
- createNode({ tag: 'div' }),
250
- ];
247
+ const mockChildren = [createNode({ tag: 'p' }), createNode({ tag: 'span' }), createNode({ tag: 'div' })];
251
248
  const emptyNodeDataMap = new Map<string, ComponentNode | string>();
252
249
 
253
250
  test('should use childIndex when provided', () => {
@@ -280,7 +277,7 @@ describe('calculateInsertionIndex', () => {
280
277
 
281
278
  test('should handle childAfterItem with nodeDataMap', () => {
282
279
  const nodeDataMap = new Map<string, ComponentNode | string>();
283
- nodeDataMap.set('path_0', mockChildren[0]);
280
+ nodeDataMap.set('path_0', mockChildren[0]!);
284
281
 
285
282
  const target = { childAfterItem: { index: 'path_0' } };
286
283
  expect(calculateInsertionIndex(target, mockChildren, nodeDataMap)).toBe(1);
@@ -288,7 +285,7 @@ describe('calculateInsertionIndex', () => {
288
285
 
289
286
  test('should handle childBeforeItem with nodeDataMap', () => {
290
287
  const nodeDataMap = new Map<string, ComponentNode | string>();
291
- nodeDataMap.set('path_1', mockChildren[1]);
288
+ nodeDataMap.set('path_1', mockChildren[1]!);
292
289
 
293
290
  const target = { childBeforeItem: { index: 'path_1' } };
294
291
  expect(calculateInsertionIndex(target, mockChildren, nodeDataMap)).toBe(1);
@@ -411,6 +408,16 @@ describe('isComponentNodeParent', () => {
411
408
  expect(isComponentNodeParent(node)).toBe(true);
412
409
  });
413
410
 
411
+ test('should return true for CustomNode', () => {
412
+ const node = { type: NODE_TYPE.CUSTOM, src: 'Callout.astro' } as ComponentNode;
413
+ expect(isComponentNodeParent(node)).toBe(true);
414
+ });
415
+
416
+ test('should return true for IslandNode', () => {
417
+ const node = { type: NODE_TYPE.ISLAND, src: 'Chart.tsx' } as ComponentNode;
418
+ expect(isComponentNodeParent(node)).toBe(true);
419
+ });
420
+
414
421
  test('should return false for PageData', () => {
415
422
  const pageData = createPageData();
416
423
  expect(isComponentNodeParent(pageData)).toBe(false);
@@ -521,11 +528,7 @@ describe('edge cases', () => {
521
528
 
522
529
  test('should handle mixed children (nodes and strings)', () => {
523
530
  const pageData = createPageData({
524
- children: [
525
- 'text before',
526
- createNode({ tag: 'span' }),
527
- 'text after',
528
- ],
531
+ children: ['text before', createNode({ tag: 'span' }), 'text after'],
529
532
  });
530
533
 
531
534
  // Path to span should work
@@ -537,3 +540,39 @@ describe('edge cases', () => {
537
540
  expect(textResult).toBeNull();
538
541
  });
539
542
  });
543
+
544
+ describe('findPathToNodeByReference', () => {
545
+ test('finds a nested node by reference and returns its [0, ...] path', () => {
546
+ const target: ComponentNode = { type: NODE_TYPE.NODE, tag: 'section', children: ['Nav'] };
547
+ const pageData: PageData = {
548
+ root: {
549
+ type: NODE_TYPE.NODE,
550
+ tag: 'div',
551
+ children: [
552
+ { type: NODE_TYPE.NODE, tag: 'header', children: ['Promo'] },
553
+ { type: NODE_TYPE.NODE, tag: 'main', children: [target] },
554
+ ],
555
+ },
556
+ };
557
+
558
+ expect(findPathToNodeByReference(pageData, target)).toEqual([0, 1, 0]);
559
+ });
560
+
561
+ test('returns [0] when the target is the root node', () => {
562
+ const root: ComponentNode = { type: NODE_TYPE.NODE, tag: 'div', children: [] };
563
+ expect(findPathToNodeByReference({ root }, root)).toEqual([0]);
564
+ });
565
+
566
+ test('returns null for a structurally-equal but non-identical node', () => {
567
+ const pageData: PageData = {
568
+ root: { type: NODE_TYPE.NODE, tag: 'div', children: [{ type: NODE_TYPE.NODE, tag: 'p', children: ['hi'] }] },
569
+ };
570
+ // Same shape, different reference -> not found (reference identity only).
571
+ const lookalike: ComponentNode = { type: NODE_TYPE.NODE, tag: 'p', children: ['hi'] };
572
+ expect(findPathToNodeByReference(pageData, lookalike)).toBeNull();
573
+ });
574
+
575
+ test('returns null when there is no root', () => {
576
+ expect(findPathToNodeByReference({} as PageData, { type: NODE_TYPE.NODE, tag: 'div' })).toBeNull();
577
+ });
578
+ });