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
@@ -17,13 +17,13 @@ import { mergeResponsiveStyles } from '../shared/responsiveStyleUtils';
17
17
  * Get breakpoint configuration (with caching)
18
18
  */
19
19
  let breakpointConfig: BreakpointConfig | null = null;
20
- let breakpointPromise: Promise<BreakpointConfig> | null = null;
20
+ let _breakpointPromise: Promise<BreakpointConfig> | null = null;
21
21
 
22
22
  /**
23
23
  * Get responsive scales configuration (with caching)
24
24
  */
25
25
  let responsiveScalesConfig: ResponsiveScales | null = null;
26
- let responsiveScalesPromise: Promise<ResponsiveScales> | null = null;
26
+ let _responsiveScalesPromise: Promise<ResponsiveScales> | null = null;
27
27
 
28
28
  /**
29
29
  * Get rem conversion configuration (with caching)
@@ -40,7 +40,7 @@ let configPromise: Promise<void> | null = null;
40
40
  */
41
41
  export function clearBreakpointConfigCache(): void {
42
42
  breakpointConfig = null;
43
- breakpointPromise = null;
43
+ _breakpointPromise = null;
44
44
  }
45
45
 
46
46
  /**
@@ -48,7 +48,7 @@ export function clearBreakpointConfigCache(): void {
48
48
  */
49
49
  export function clearResponsiveScalesConfigCache(): void {
50
50
  responsiveScalesConfig = null;
51
- responsiveScalesPromise = null;
51
+ _responsiveScalesPromise = null;
52
52
  }
53
53
 
54
54
  /**
@@ -62,6 +62,7 @@ export function clearAllConfigCache(): void {
62
62
  clearBreakpointConfigCache();
63
63
  clearResponsiveScalesConfigCache();
64
64
  clearRemConversionConfigCache();
65
+ clearKnownTokensCache();
65
66
  configPromise = null;
66
67
  }
67
68
 
@@ -86,6 +87,62 @@ export function getCachedRemConversionConfig(): RemConversionConfig | null {
86
87
  return remConversionConfig;
87
88
  }
88
89
 
90
+ /**
91
+ * The project's design-token NAMES (color names across every theme + variable `cssVar`s minus `--`),
92
+ * cached for the design-canvas CSS generator. This is the `knownTokens` set the utility-class engine
93
+ * needs to expand the BARE color-token class form (`bg-muted` → `background-color: var(--muted)`) —
94
+ * without it those classes produce no rule and render no color in the canvas. Mirrors meno-astro's
95
+ * `readKnownTokensSync` (the build/play token source) so the canvas matches the real Astro build.
96
+ */
97
+ let knownTokens: Set<string> | null = null;
98
+ let _knownTokensPromise: Promise<void> | null = null;
99
+
100
+ /** Get the cached known-token set synchronously (null until {@link loadKnownTokens} resolves). */
101
+ export function getCachedKnownTokens(): ReadonlySet<string> | null {
102
+ return knownTokens;
103
+ }
104
+
105
+ /** Clear the known-token cache (color/variable config changed). */
106
+ export function clearKnownTokensCache(): void {
107
+ knownTokens = null;
108
+ _knownTokensPromise = null;
109
+ }
110
+
111
+ /** Fetch + cache the project's known design-token names. Deduped; safe to call repeatedly. */
112
+ export async function loadKnownTokens(): Promise<ReadonlySet<string>> {
113
+ if (knownTokens) return knownTokens;
114
+ if (!_knownTokensPromise) {
115
+ _knownTokensPromise = (async () => {
116
+ const tokens = new Set<string>();
117
+ try {
118
+ const res = await fetch('/api/colors-config');
119
+ if (res.ok) {
120
+ const cfg = (await res.json()) as { themes?: Record<string, { colors?: Record<string, unknown> }> };
121
+ for (const theme of Object.values(cfg?.themes ?? {})) {
122
+ for (const name of Object.keys(theme?.colors ?? {})) tokens.add(name);
123
+ }
124
+ }
125
+ } catch {
126
+ // colors unavailable → no color tokens
127
+ }
128
+ try {
129
+ const res = await fetch('/api/variables-status');
130
+ if (res.ok) {
131
+ const data = (await res.json()) as { config?: { variables?: Array<{ cssVar?: string }> } };
132
+ for (const v of data?.config?.variables ?? []) {
133
+ if (v?.cssVar) tokens.add(v.cssVar.replace(/^--/, ''));
134
+ }
135
+ }
136
+ } catch {
137
+ // variables unavailable → no variable tokens
138
+ }
139
+ knownTokens = tokens;
140
+ })();
141
+ }
142
+ await _knownTokensPromise;
143
+ return knownTokens ?? new Set<string>();
144
+ }
145
+
89
146
  /**
90
147
  * Shared config fetching - loads both breakpoints and responsive scales from single API call
91
148
  */
@@ -113,16 +170,16 @@ async function loadConfig(): Promise<void> {
113
170
  if (typeof entry.breakpoint === 'number' && entry.breakpoint > 0) {
114
171
  validInput[key] = {
115
172
  breakpoint: entry.breakpoint,
116
- previewPoint: typeof entry.previewPoint === 'number' && entry.previewPoint > 0
117
- ? entry.previewPoint
118
- : entry.breakpoint,
173
+ previewPoint:
174
+ typeof entry.previewPoint === 'number' && entry.previewPoint > 0
175
+ ? entry.previewPoint
176
+ : entry.breakpoint,
119
177
  };
120
178
  }
121
179
  }
122
180
  }
123
- breakpointConfig = Object.keys(validInput).length > 0
124
- ? normalizeBreakpointConfig(validInput)
125
- : { ...DEFAULT_BREAKPOINTS };
181
+ breakpointConfig =
182
+ Object.keys(validInput).length > 0 ? normalizeBreakpointConfig(validInput) : { ...DEFAULT_BREAKPOINTS };
126
183
  } else {
127
184
  breakpointConfig = { ...DEFAULT_BREAKPOINTS };
128
185
  }
@@ -174,17 +231,15 @@ export async function getResponsiveScalesConfig(): Promise<ResponsiveScales> {
174
231
  * Merge responsive styles into a single style object based on current viewport
175
232
  * Styles cascade: base → tablet → mobile
176
233
  */
177
- export async function resolveResponsiveStyle(
178
- style: ResponsiveStyleObject | StyleObject
179
- ): Promise<StyleObject> {
234
+ export async function resolveResponsiveStyle(style: ResponsiveStyleObject | StyleObject): Promise<StyleObject> {
180
235
  if (!isResponsiveStyle(style)) {
181
236
  return style as StyleObject;
182
237
  }
183
-
238
+
184
239
  const responsiveStyle = style as ResponsiveStyleObject;
185
240
  const viewportWidth = typeof window !== 'undefined' ? window.innerWidth : 1920;
186
241
  const breakpoints = await getBreakpointConfig();
187
-
242
+
188
243
  return mergeResponsiveStyles(responsiveStyle, 'viewport', viewportWidth, breakpoints);
189
244
  }
190
245
 
@@ -194,17 +249,17 @@ export async function resolveResponsiveStyle(
194
249
  */
195
250
  export function resolveResponsiveStyleSync(
196
251
  style: ResponsiveStyleObject | StyleObject,
197
- viewportWidth: number = typeof window !== 'undefined' ? window.innerWidth : 1920
252
+ viewportWidth: number = typeof window !== 'undefined' ? window.innerWidth : 1920,
198
253
  ): StyleObject {
199
254
  if (!isResponsiveStyle(style)) {
200
255
  return style as StyleObject;
201
256
  }
202
-
257
+
203
258
  const responsiveStyle = style as ResponsiveStyleObject;
204
-
259
+
205
260
  // Use cached breakpoints or defaults
206
261
  const breakpoints = breakpointConfig || { ...DEFAULT_BREAKPOINTS };
207
-
262
+
208
263
  return mergeResponsiveStyles(responsiveStyle, 'viewport', viewportWidth, breakpoints);
209
264
  }
210
265
 
@@ -223,4 +278,3 @@ export async function initializeBreakpoints(forceRefresh: boolean = false): Prom
223
278
  * Alias for initializeBreakpoints - initializes all config including responsive scales
224
279
  */
225
280
  export const initializeConfig = initializeBreakpoints;
226
-
@@ -1,8 +1,8 @@
1
- import { test, expect, describe, beforeEach, afterEach, afterAll, mock } from 'bun:test';
1
+ import { test, expect, describe, beforeEach, afterEach, mock } from 'bun:test';
2
2
 
3
3
  // Save original fetch before any test can modify it
4
4
  const _originalFetch = globalThis.fetch;
5
- import { RouteLoader, RouteLoaderConfig } from './RouteLoader';
5
+ import { RouteLoader, type RouteLoaderConfig } from './RouteLoader';
6
6
  import { ComponentRegistry } from '../componentRegistry';
7
7
  import { API_ROUTES, NOT_FOUND_TIMEOUT_MS } from '../../shared/constants';
8
8
  import type { ComponentNode } from '../../shared/types';
@@ -19,13 +19,15 @@ describe('RouteLoader', () => {
19
19
  componentRegistry,
20
20
  };
21
21
  routeLoader = new RouteLoader(config);
22
-
22
+
23
23
  // Mock fetch globally
24
- mockFetch = mock(() => Promise.resolve({
25
- ok: true,
26
- json: () => Promise.resolve({}),
27
- text: () => Promise.resolve('{}'),
28
- }));
24
+ mockFetch = mock(() =>
25
+ Promise.resolve({
26
+ ok: true,
27
+ json: () => Promise.resolve({}),
28
+ text: () => Promise.resolve('{}'),
29
+ }),
30
+ );
29
31
  globalThis.fetch = mockFetch as any;
30
32
  });
31
33
 
@@ -93,15 +95,15 @@ describe('RouteLoader', () => {
93
95
 
94
96
  test('should respect abort signal when loading global components', async () => {
95
97
  const abortController = new AbortController();
96
-
98
+
97
99
  // Start loading
98
100
  const loadPromise = routeLoader.loadGlobalComponents(abortController.signal);
99
-
101
+
100
102
  // Abort immediately
101
103
  abortController.abort();
102
-
104
+
103
105
  await loadPromise;
104
-
106
+
105
107
  // Should complete without error (abort is handled gracefully)
106
108
  // Test passes if no exception is thrown
107
109
  });
@@ -494,10 +496,10 @@ describe('RouteLoader', () => {
494
496
  });
495
497
 
496
498
  const loadPromise = routeLoader.loadComponents('/');
497
-
499
+
498
500
  // Cancel immediately
499
501
  routeLoader.cancel();
500
-
502
+
501
503
  await loadPromise;
502
504
 
503
505
  // onLoadStart might have been called before cancel, but onLoadComplete should not be called
@@ -585,11 +587,10 @@ describe('RouteLoader', () => {
585
587
  routeLoader = new RouteLoader(config);
586
588
 
587
589
  // Mock fetch - should NOT be called for /api/page-content since we have cache
588
- mockFetch
589
- .mockResolvedValueOnce({
590
- ok: true,
591
- json: () => Promise.resolve({}),
592
- } as any); // loadGlobalComponents only
590
+ mockFetch.mockResolvedValueOnce({
591
+ ok: true,
592
+ json: () => Promise.resolve({}),
593
+ } as any); // loadGlobalComponents only
593
594
 
594
595
  await routeLoader.loadComponents('/cached-page');
595
596
 
@@ -660,11 +661,10 @@ describe('RouteLoader', () => {
660
661
  config.prefetchService = mockPrefetchService as any;
661
662
  routeLoader = new RouteLoader(config);
662
663
 
663
- mockFetch
664
- .mockResolvedValueOnce({
665
- ok: true,
666
- json: () => Promise.resolve({}),
667
- } as any); // loadGlobalComponents
664
+ mockFetch.mockResolvedValueOnce({
665
+ ok: true,
666
+ json: () => Promise.resolve({}),
667
+ } as any); // loadGlobalComponents
668
668
 
669
669
  await routeLoader.loadComponents('/page-with-components');
670
670
 
@@ -750,4 +750,3 @@ describe('RouteLoader', () => {
750
750
  });
751
751
  });
752
752
  });
753
-
@@ -9,7 +9,7 @@ import type { ComponentNode, I18nConfig, JSONPage } from '../../shared/types';
9
9
  import { validatePageData } from '../../shared/validation/validators';
10
10
  import { parseLocaleFromPath, DEFAULT_I18N_CONFIG } from '../../shared/i18n';
11
11
  import type { PrefetchService } from '../services/PrefetchService';
12
- import { logNetworkError } from '../../shared/errorLogger';
12
+ import { logNetworkError, logRuntimeError } from '../../shared/errorLogger';
13
13
 
14
14
  export interface RouteLoaderConfig {
15
15
  componentRegistry: ComponentRegistry;
@@ -59,7 +59,7 @@ export class RouteLoader {
59
59
  }
60
60
 
61
61
  const response = await fetch(API_ROUTES.COMPONENTS, fetchOptions);
62
-
62
+
63
63
  // Check if aborted after fetch
64
64
  if (signal?.aborted) {
65
65
  return;
@@ -93,10 +93,8 @@ export class RouteLoader {
93
93
  try {
94
94
  const response = await fetch(API_ROUTES.PAGES);
95
95
  const data = await response.json();
96
- const pages = (data.pages || []).map((p: unknown) =>
97
- typeof p === 'string' ? p : (p as { path: string }).path
98
- );
99
-
96
+ const pages = (data.pages || []).map((p: unknown) => (typeof p === 'string' ? p : (p as { path: string }).path));
97
+
100
98
  if (this.config.onPagesLoaded) {
101
99
  this.config.onPagesLoaded(pages);
102
100
  }
@@ -186,7 +184,6 @@ export class RouteLoader {
186
184
  }
187
185
 
188
186
  if (!response.ok) {
189
-
190
187
  if (this.config.onLoadComplete && !this.isCancelled) {
191
188
  this.config.onLoadComplete(null);
192
189
  }
@@ -202,7 +199,7 @@ export class RouteLoader {
202
199
  this.notFoundTimeout = null;
203
200
  }, NOT_FOUND_TIMEOUT_MS);
204
201
  }
205
-
202
+
206
203
  return null;
207
204
  }
208
205
 
@@ -213,15 +210,18 @@ export class RouteLoader {
213
210
  return null;
214
211
  }
215
212
 
216
- let parsed;
213
+ // biome-ignore lint/suspicious/noExplicitAny: JSON.parse result is used dynamically as page data
214
+ let parsed: any;
217
215
  try {
218
216
  parsed = JSON.parse(jsonText);
219
-
217
+
220
218
  // Validate page data (logs warnings but doesn't fail - graceful degradation)
221
219
  const validationResult = validatePageData(parsed);
222
220
  if (!validationResult.valid) {
223
- console.warn(`[RouteLoader] Page validation failed for ${path}:`,
224
- validationResult.errors.map(e => `${e.path}: ${e.message}`).join('; '));
221
+ console.warn(
222
+ `[RouteLoader] Page validation failed for ${path}:`,
223
+ validationResult.errors.map((e) => `${e.path}: ${e.message}`).join('; '),
224
+ );
225
225
  }
226
226
  // Use validated data if available, otherwise use parsed (graceful degradation)
227
227
  parsed = validationResult.valid ? validationResult.data : parsed;
@@ -230,32 +230,32 @@ export class RouteLoader {
230
230
  const errorTree = this.createErrorTree(
231
231
  'Invalid JSON format',
232
232
  `Failed to parse JSON for page: ${path}`,
233
- String(parseError)
233
+ String(parseError),
234
234
  );
235
-
235
+
236
236
  if (this.config.onLoadComplete && !this.isCancelled) {
237
237
  this.config.onLoadComplete(errorTree);
238
238
  }
239
-
239
+
240
240
  if (this.config.onLoadError && !this.isCancelled) {
241
- this.config.onLoadError(
242
- parseError instanceof Error ? parseError : new Error(String(parseError)),
243
- errorTree
244
- );
241
+ this.config.onLoadError(parseError instanceof Error ? parseError : new Error(String(parseError)), errorTree);
245
242
  }
246
-
243
+
247
244
  return errorTree;
248
245
  }
249
246
 
250
247
  // Check if JSON has components section (page-specific components)
251
248
  let tree: ComponentNode | ComponentNode[] | null = null;
252
-
249
+
253
250
  if (parsed.components) {
254
251
  // Merge page-specific components with global (page-specific override global)
255
252
  try {
256
253
  this.config.componentRegistry.merge(parsed.components);
257
254
  // JavaScript will be executed via useEffect after componentTree renders
258
255
  } catch (componentError) {
256
+ // A malformed components section must not abort the page render, but
257
+ // dropping it silently leaves the page missing components with no clue why.
258
+ logRuntimeError('RouteLoader.mergePageComponents', componentError);
259
259
  }
260
260
  tree = parsed.root || parsed;
261
261
  } else if (parsed.root) {
@@ -279,7 +279,7 @@ export class RouteLoader {
279
279
 
280
280
  this.clearNotFoundTimeout();
281
281
  this.abortController = null;
282
-
282
+
283
283
  return tree;
284
284
  } catch (error) {
285
285
  // Ignore abort errors
@@ -294,21 +294,18 @@ export class RouteLoader {
294
294
 
295
295
  // Set a generic error tree
296
296
  const errorTree = this.createErrorTree('Error loading page', String(error));
297
-
297
+
298
298
  if (this.config.onLoadComplete && !this.isCancelled) {
299
299
  this.config.onLoadComplete(errorTree);
300
300
  }
301
-
301
+
302
302
  if (this.config.onLoadError && !this.isCancelled) {
303
- this.config.onLoadError(
304
- error instanceof Error ? error : new Error(String(error)),
305
- errorTree
306
- );
303
+ this.config.onLoadError(error instanceof Error ? error : new Error(String(error)), errorTree);
307
304
  }
308
305
 
309
306
  this.clearNotFoundTimeout();
310
307
  this.abortController = null;
311
-
308
+
312
309
  return errorTree;
313
310
  }
314
311
  }
@@ -328,11 +325,7 @@ export class RouteLoader {
328
325
  /**
329
326
  * Create error tree ComponentNode structure
330
327
  */
331
- private createErrorTree(
332
- title: string,
333
- message: string,
334
- details?: string
335
- ): ComponentNode {
328
+ private createErrorTree(title: string, message: string, details?: string): ComponentNode {
336
329
  const children: ComponentNode[] = [
337
330
  {
338
331
  type: 'node',
@@ -383,4 +376,3 @@ export class RouteLoader {
383
376
  }
384
377
  }
385
378
  }
386
-