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
@@ -19,20 +19,15 @@ export interface ScriptExecutorConfig {
19
19
  /**
20
20
  * Generate destructure statement for defineVars
21
21
  */
22
- function generateDestructure(
23
- defineVars: true | string[],
24
- interfaceDef?: Record<string, PropDefinition>
25
- ): string {
26
- const vars = defineVars === true
27
- ? Object.keys(interfaceDef || {})
28
- : defineVars;
22
+ function generateDestructure(defineVars: true | string[], interfaceDef?: Record<string, PropDefinition>): string {
23
+ const vars = defineVars === true ? Object.keys(interfaceDef || {}) : defineVars;
29
24
  if (vars.length === 0) return '';
30
25
  return `var {${vars.join(', ')}} = props;`;
31
26
  }
32
27
 
33
28
  /**
34
29
  * ScriptExecutor manages JavaScript execution from components
35
- *
30
+ *
36
31
  * Features:
37
32
  * - Executes JavaScript from all registered components
38
33
  * - Processes templates per component instance when needed
@@ -59,8 +54,10 @@ export class ScriptExecutor {
59
54
  // wrapper degrades gracefully when the hook is absent (e.g. direct
60
55
  // <script> use outside the runtime) — see executeWithInitPattern.
61
56
  if (typeof window !== 'undefined') {
62
- (window as { __menoShouldBind?: (el: Element, name: string) => boolean }).__menoShouldBind =
63
- (el: Element, name: string) => this.shouldBind(el, name);
57
+ (window as { __menoShouldBind?: (el: Element, name: string) => boolean }).__menoShouldBind = (
58
+ el: Element,
59
+ name: string,
60
+ ) => this.shouldBind(el, name);
64
61
  }
65
62
  }
66
63
 
@@ -71,7 +68,7 @@ export class ScriptExecutor {
71
68
  */
72
69
  private shouldBind(el: Element, componentName: string): boolean {
73
70
  let names = this.boundElements.get(el);
74
- if (names && names.has(componentName)) return false;
71
+ if (names?.has(componentName)) return false;
75
72
  if (!names) {
76
73
  names = new Set();
77
74
  this.boundElements.set(el, names);
@@ -89,7 +86,7 @@ export class ScriptExecutor {
89
86
  * @private
90
87
  */
91
88
  private executeWrappedJS(jsCode: string, componentName: string): void {
92
- if (!jsCode || !jsCode.trim()) return;
89
+ if (!jsCode?.trim()) return;
93
90
 
94
91
  const wrappedJS = `(function() {
95
92
  // Component: ${componentName}
@@ -133,7 +130,7 @@ export class ScriptExecutor {
133
130
  try {
134
131
  const processedJS = processCodeTemplates(originalJS, props);
135
132
  this.executeWrappedJS(processedJS, `${componentName} (instance: ${rootPath})`);
136
- } catch (templateError) {
133
+ } catch (_templateError) {
137
134
  // Fallback to original JS if template processing fails (similar to StyleInjector)
138
135
  this.executeWrappedJS(originalJS, `${componentName} (instance: ${rootPath})`);
139
136
  }
@@ -155,7 +152,7 @@ export class ScriptExecutor {
155
152
  componentName: string,
156
153
  js: string,
157
154
  defineVars: true | string[],
158
- interfaceDef?: Record<string, PropDefinition>
155
+ interfaceDef?: Record<string, PropDefinition>,
159
156
  ): void {
160
157
  const destructure = generateDestructure(defineVars, interfaceDef);
161
158
 
@@ -218,12 +215,7 @@ export class ScriptExecutor {
218
215
  if (defineVars) {
219
216
  // Use initComponent pattern - queries all instances and initializes each with props
220
217
  if (!executedComponents.has(componentName)) {
221
- this.executeWithInitPattern(
222
- componentName,
223
- originalJS,
224
- defineVars,
225
- component.component.interface
226
- );
218
+ this.executeWithInitPattern(componentName, originalJS, defineVars, component.component.interface);
227
219
  executedComponents.add(componentName);
228
220
  }
229
221
  } else if (hasTemplates(originalJS)) {
@@ -281,12 +273,7 @@ export class ScriptExecutor {
281
273
 
282
274
  // Check if component uses defineVars (Astro-style prop injection)
283
275
  if (defineVars) {
284
- this.executeWithInitPattern(
285
- componentName,
286
- originalJS,
287
- defineVars,
288
- component.component.interface
289
- );
276
+ this.executeWithInitPattern(componentName, originalJS, defineVars, component.component.interface);
290
277
  } else if (hasTemplates(originalJS)) {
291
278
  // Legacy: Process and execute JS per instance (templates need instance-specific props)
292
279
  const componentRootPaths = this.elementRegistry.getComponentRootPaths(componentName);
@@ -315,11 +302,7 @@ export class ScriptExecutor {
315
302
  * @param element - The DOM element to re-execute for
316
303
  * @param newProps - New props to inject
317
304
  */
318
- executeForElement(
319
- componentName: string,
320
- element: HTMLElement,
321
- newProps: Record<string, unknown>
322
- ): void {
305
+ executeForElement(componentName: string, element: HTMLElement, newProps: Record<string, unknown>): void {
323
306
  try {
324
307
  const component = this.componentRegistry.get(componentName);
325
308
  if (!component?.component?.javascript) return;
@@ -331,9 +314,7 @@ export class ScriptExecutor {
331
314
  const destructure = generateDestructure(defineVars, component.component.interface);
332
315
 
333
316
  // Update data-props attribute (keyed by component name)
334
- const varsToExpose = defineVars === true
335
- ? Object.keys(component.component.interface || {})
336
- : defineVars;
317
+ const varsToExpose = defineVars === true ? Object.keys(component.component.interface || {}) : defineVars;
337
318
 
338
319
  const propsForJS: Record<string, unknown> = {};
339
320
  for (const varName of varsToExpose) {
@@ -346,7 +327,9 @@ export class ScriptExecutor {
346
327
  let allProps: Record<string, unknown> = {};
347
328
  const existingStr = element.getAttribute('data-props');
348
329
  if (existingStr) {
349
- try { allProps = JSON.parse(existingStr); } catch {}
330
+ try {
331
+ allProps = JSON.parse(existingStr);
332
+ } catch {}
350
333
  }
351
334
  allProps[componentName] = propsForJS;
352
335
  element.setAttribute('data-props', JSON.stringify(allProps));
@@ -368,4 +351,3 @@ export class ScriptExecutor {
368
351
  }
369
352
  }
370
353
  }
371
-
@@ -2,7 +2,7 @@
2
2
  * PrefetchService unit tests
3
3
  */
4
4
 
5
- import { describe, test, expect, beforeEach, afterEach, mock, spyOn } from 'bun:test';
5
+ import { describe, test, expect, beforeEach, afterEach, mock } from 'bun:test';
6
6
  import { PrefetchService } from './PrefetchService';
7
7
  import { DEFAULT_PREFETCH_CONFIG } from '../../shared/types/prefetch';
8
8
 
@@ -19,7 +19,7 @@ describe('PrefetchService', () => {
19
19
  Promise.resolve({
20
20
  ok: true,
21
21
  json: () => Promise.resolve({ root: { type: 'node', tag: 'div' } }),
22
- } as Response)
22
+ } as Response),
23
23
  ) as unknown as typeof fetch;
24
24
 
25
25
  // Create service with enabled config
@@ -166,7 +166,7 @@ describe('PrefetchService', () => {
166
166
  Promise.resolve({
167
167
  ok: false,
168
168
  status: 404,
169
- } as Response)
169
+ } as Response),
170
170
  ) as unknown as typeof fetch;
171
171
 
172
172
  await service.prefetch('/nonexistent');
@@ -10,12 +10,7 @@
10
10
  */
11
11
 
12
12
  import { API_ROUTES } from '../../shared/constants';
13
- import type {
14
- PrefetchConfig,
15
- PrefetchStrategy,
16
- CachedPageEntry,
17
- ConnectionInfo,
18
- } from '../../shared/types/prefetch';
13
+ import type { PrefetchConfig, PrefetchStrategy, CachedPageEntry, ConnectionInfo } from '../../shared/types/prefetch';
19
14
  import { DEFAULT_PREFETCH_CONFIG } from '../../shared/types/prefetch';
20
15
 
21
16
  export interface PrefetchServiceConfig {
@@ -52,9 +47,7 @@ export class PrefetchService {
52
47
 
53
48
  return {
54
49
  saveData: connection?.saveData ?? false,
55
- effectiveType:
56
- (connection?.effectiveType as ConnectionInfo['effectiveType']) ??
57
- 'unknown',
50
+ effectiveType: (connection?.effectiveType as ConnectionInfo['effectiveType']) ?? 'unknown',
58
51
  downlink: connection?.downlink ?? Infinity,
59
52
  };
60
53
  }
@@ -62,9 +55,7 @@ export class PrefetchService {
62
55
  /**
63
56
  * Determine effective strategy based on connection quality
64
57
  */
65
- private getEffectiveStrategy(
66
- requestedStrategy: PrefetchStrategy
67
- ): PrefetchStrategy {
58
+ private getEffectiveStrategy(requestedStrategy: PrefetchStrategy): PrefetchStrategy {
68
59
  if (!this.config.respectSaveData) return requestedStrategy;
69
60
 
70
61
  const { saveData, effectiveType, downlink } = this.getConnectionInfo();
@@ -110,13 +101,13 @@ export class PrefetchService {
110
101
  if (this.cache.size <= this.config.maxCacheSize) return;
111
102
 
112
103
  // Get oldest entries and remove them
113
- const entries = Array.from(this.cache.entries()).sort(
114
- (a, b) => a[1].timestamp - b[1].timestamp
115
- );
104
+ const entries = Array.from(this.cache.entries()).sort((a, b) => a[1].timestamp - b[1].timestamp);
116
105
 
117
106
  const toRemove = this.cache.size - this.config.maxCacheSize;
118
107
  for (let i = 0; i < toRemove; i++) {
119
- this.cache.delete(entries[i][0]);
108
+ const entry = entries[i];
109
+ if (entry === undefined) continue;
110
+ this.cache.delete(entry[0]);
120
111
  }
121
112
  }
122
113
 
@@ -133,14 +124,11 @@ export class PrefetchService {
133
124
 
134
125
  try {
135
126
  // Fetch page data (same endpoint RouteLoader uses)
136
- const response = await fetch(
137
- `${API_ROUTES.PAGE_CONTENT}?page=${encodeURIComponent(path)}`,
138
- {
139
- signal: abortController.signal,
140
- // Allow browser caching for prefetched content
141
- cache: 'default',
142
- }
143
- );
127
+ const response = await fetch(`${API_ROUTES.PAGE_CONTENT}?page=${encodeURIComponent(path)}`, {
128
+ signal: abortController.signal,
129
+ // Allow browser caching for prefetched content
130
+ cache: 'default',
131
+ });
144
132
 
145
133
  if (!response.ok) {
146
134
  this.pendingPrefetches.delete(path);
@@ -242,13 +230,13 @@ export class PrefetchService {
242
230
  if (entry.isIntersecting) {
243
231
  const link = entry.target as HTMLAnchorElement;
244
232
  const href = link.getAttribute('href');
245
- if (href && href.startsWith('/')) {
233
+ if (href?.startsWith('/')) {
246
234
  this.prefetch(href);
247
235
  }
248
236
  }
249
237
  });
250
238
  },
251
- { rootMargin: '50px' } // Start prefetching slightly before visible
239
+ { rootMargin: '50px' }, // Start prefetching slightly before visible
252
240
  );
253
241
  }
254
242
 
@@ -301,11 +289,15 @@ export class PrefetchService {
301
289
  */
302
290
  clear(): void {
303
291
  // Cancel all pending prefetches
304
- this.pendingPrefetches.forEach((controller) => controller.abort());
292
+ this.pendingPrefetches.forEach((controller) => {
293
+ controller.abort();
294
+ });
305
295
  this.pendingPrefetches.clear();
306
296
 
307
297
  // Clear all hover timeouts
308
- this.hoverTimeouts.forEach((timeout) => clearTimeout(timeout));
298
+ this.hoverTimeouts.forEach((timeout) => {
299
+ clearTimeout(timeout);
300
+ });
309
301
  this.hoverTimeouts.clear();
310
302
 
311
303
  // Clear cache
@@ -313,7 +305,9 @@ export class PrefetchService {
313
305
 
314
306
  // Cleanup viewport observer
315
307
  if (this.viewportObserver) {
316
- this.observedLinks.forEach((link) => this.viewportObserver?.unobserve(link));
308
+ this.observedLinks.forEach((link) => {
309
+ this.viewportObserver?.unobserve(link);
310
+ });
317
311
  this.observedLinks.clear();
318
312
  this.linkPathMap.clear();
319
313
  this.viewportObserver.disconnect();
@@ -11,7 +11,7 @@ describe('styleProcessor', () => {
11
11
  expect(result).toEqual({
12
12
  color: 'red',
13
13
  fontSize: '16px',
14
- padding: '10px'
14
+ padding: '10px',
15
15
  });
16
16
  });
17
17
 
@@ -22,7 +22,7 @@ describe('styleProcessor', () => {
22
22
  expect(result).toEqual({
23
23
  color: 'blue',
24
24
  fontSize: '16px',
25
- padding: '10px'
25
+ padding: '10px',
26
26
  });
27
27
  });
28
28
 
@@ -31,7 +31,7 @@ describe('styleProcessor', () => {
31
31
  const result = mergeStyles(style1, undefined, { fontSize: '16px' });
32
32
  expect(result).toEqual({
33
33
  color: 'red',
34
- fontSize: '16px'
34
+ fontSize: '16px',
35
35
  });
36
36
  });
37
37
 
@@ -49,15 +49,15 @@ describe('styleProcessor', () => {
49
49
  const style1: StyleObject = {
50
50
  display: 'flex',
51
51
  flexDirection: 'column',
52
- padding: '20px'
52
+ padding: '20px',
53
53
  };
54
54
  const style2: StyleObject = {
55
55
  backgroundColor: '#f0f0f0',
56
- border: '1px solid #ccc'
56
+ border: '1px solid #ccc',
57
57
  };
58
58
  const style3: StyleObject = {
59
59
  padding: '30px',
60
- margin: '10px'
60
+ margin: '10px',
61
61
  };
62
62
  const result = mergeStyles(style1, style2, style3);
63
63
  expect(result).toEqual({
@@ -66,7 +66,7 @@ describe('styleProcessor', () => {
66
66
  padding: '30px',
67
67
  backgroundColor: '#f0f0f0',
68
68
  border: '1px solid #ccc',
69
- margin: '10px'
69
+ margin: '10px',
70
70
  });
71
71
  });
72
72
 
@@ -108,7 +108,7 @@ describe('styleProcessor', () => {
108
108
  expect(result).toEqual({
109
109
  opacity: 0.5,
110
110
  zIndex: 20,
111
- fontSize: 16
111
+ fontSize: 16,
112
112
  });
113
113
  });
114
114
 
@@ -119,7 +119,7 @@ describe('styleProcessor', () => {
119
119
  expect(result).toEqual({
120
120
  opacity: 0,
121
121
  margin: '0',
122
- padding: '0px'
122
+ padding: '0px',
123
123
  });
124
124
  });
125
125
  });
@@ -4,6 +4,7 @@
4
4
  */
5
5
 
6
6
  import type { ComponentDefinition, StyleObject, StyleValue } from '../shared/types';
7
+ import { logRuntimeError } from '../shared/errorLogger';
7
8
  import { processStructure, normalizeStyle } from './templateEngine';
8
9
 
9
10
  type ComponentProps = Record<string, unknown>;
@@ -12,10 +13,7 @@ type ComponentProps = Record<string, unknown>;
12
13
  * Merge component styles from structured component definition
13
14
  * Returns merged props with all applicable styles
14
15
  */
15
- export function mergeComponentStyles(
16
- componentDef: ComponentDefinition,
17
- props: ComponentProps
18
- ): ComponentProps {
16
+ export function mergeComponentStyles(componentDef: ComponentDefinition, props: ComponentProps): ComponentProps {
19
17
  try {
20
18
  // Start with base props from component definition
21
19
  let mergedProps: ComponentProps = { ...(componentDef.props || {}) };
@@ -43,20 +41,31 @@ export function mergeComponentStyles(
43
41
  // processStructure now reads from structure.style and merges into props.style
44
42
  try {
45
43
  if (structuredComponentDef.structure) {
46
- const processed = processStructure(structuredComponentDef.structure, { props: effectiveInputProps, componentDef: structuredComponentDef });
44
+ const processed = processStructure(structuredComponentDef.structure, {
45
+ props: effectiveInputProps,
46
+ componentDef: structuredComponentDef,
47
+ });
47
48
  // Type guard: ensure processed is a ComponentNode with props
48
49
  if (processed && typeof processed === 'object' && !Array.isArray(processed) && 'props' in processed) {
49
50
  const processedProps = processed.props as Record<string, unknown> | undefined;
50
- const structureStyle = (processedProps?.style && typeof processedProps.style === 'object' && processedProps.style !== null && !Array.isArray(processedProps.style))
51
- ? processedProps.style as Record<string, unknown>
52
- : {};
53
- const currentStyle = typeof mergedProps.style === 'object' && mergedProps.style !== null && !Array.isArray(mergedProps.style)
54
- ? { ...mergedProps.style as Record<string, unknown> }
55
- : {};
51
+ const structureStyle =
52
+ processedProps?.style &&
53
+ typeof processedProps.style === 'object' &&
54
+ processedProps.style !== null &&
55
+ !Array.isArray(processedProps.style)
56
+ ? (processedProps.style as Record<string, unknown>)
57
+ : {};
58
+ const currentStyle =
59
+ typeof mergedProps.style === 'object' && mergedProps.style !== null && !Array.isArray(mergedProps.style)
60
+ ? { ...(mergedProps.style as Record<string, unknown>) }
61
+ : {};
56
62
  mergedProps.style = { ...currentStyle, ...structureStyle };
57
63
  }
58
64
  }
59
65
  } catch (e) {
66
+ // A malformed structure-style merge must not break rendering, but it should
67
+ // not vanish either — the element would silently render with wrong styles.
68
+ logRuntimeError('styleProcessor.mergeStructureStyle', e);
60
69
  }
61
70
 
62
71
  // Merge with instance props (allows overrides)
@@ -64,7 +73,7 @@ export function mergeComponentStyles(
64
73
  const restProps = props || {};
65
74
  const normalizedMergedStyle = normalizeStyle(mergedProps.style as StyleValue) || {};
66
75
  const normalizedRestStyle = normalizeStyle(restProps?.style as StyleValue) || {};
67
-
76
+
68
77
  mergedProps = {
69
78
  ...mergedProps,
70
79
  ...restProps,
@@ -75,7 +84,7 @@ export function mergeComponentStyles(
75
84
  };
76
85
 
77
86
  return mergedProps;
78
- } catch (error) {
87
+ } catch (_error) {
79
88
  // Return props as-is if merging fails
80
89
  return props || {};
81
90
  }
@@ -87,7 +96,7 @@ export function mergeComponentStyles(
87
96
  export function mergeStyles(...styles: (StyleObject | undefined)[]): StyleObject {
88
97
  return styles.reduce<StyleObject>((acc, style) => {
89
98
  if (!style) return acc;
90
- return { ...acc, ...style };
99
+ Object.assign(acc, style);
100
+ return acc;
91
101
  }, {});
92
102
  }
93
-