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
@@ -10,8 +10,8 @@
10
10
 
11
11
  import { test, expect, describe } from 'bun:test';
12
12
  import { Window } from 'happy-dom';
13
- import * as fs from 'fs';
14
- import * as path from 'path';
13
+ import * as fs from 'node:fs';
14
+ import * as path from 'node:path';
15
15
 
16
16
  function loadLiveReloadScript(): string {
17
17
  const src = fs.readFileSync(path.join(import.meta.dir, 'htmlGenerator.ts'), 'utf8');
@@ -23,8 +23,9 @@ function loadLiveReloadScript(): string {
23
23
  if (!match) throw new Error('liveReloadScript script tag not found');
24
24
  // The script lives inside a TS template literal; reverse the template's
25
25
  // runtime transformations so the executable form matches what a browser sees.
26
- return match[1]
27
- .split('\\\\').join('\\')
26
+ return match[1]!
27
+ .split('\\\\')
28
+ .join('\\')
28
29
  .replace(/\$\{wsUrl\}/g, "'ws://localhost:3000/hmr'");
29
30
  }
30
31
 
@@ -56,40 +57,61 @@ function setupHarness(initialBodyHtml: string): Harness {
56
57
  window,
57
58
  document,
58
59
  capturedHandler: null,
59
- setFetch: (fn) => { (window as any).fetch = fn; },
60
+ setFetch: (fn) => {
61
+ (window as any).fetch = fn;
62
+ },
60
63
  triggerHmr: () => {
61
64
  if (!harness.capturedHandler) throw new Error('WebSocket handler not captured');
62
65
  harness.capturedHandler({ data: JSON.stringify({ type: 'hmr:update' }) });
63
66
  },
64
- flush: () => new Promise(r => setTimeout(r, 100)),
67
+ flush: () => new Promise((r) => setTimeout(r, 100)),
65
68
  reloadCalls: 0,
66
69
  dispatchedDOMContentLoaded: 0,
67
70
  };
68
71
 
69
72
  (window as any).WebSocket = class {
70
- constructor() {}
71
- set onmessage(fn: any) { harness.capturedHandler = fn; }
72
- get onmessage() { return harness.capturedHandler; }
73
+ set onmessage(fn: any) {
74
+ harness.capturedHandler = fn;
75
+ }
76
+ get onmessage() {
77
+ return harness.capturedHandler;
78
+ }
73
79
  onclose: any = null;
74
80
  };
75
81
 
76
82
  // Track dispatched DOMContentLoaded (the IIFE fires this on document)
77
- document.addEventListener('DOMContentLoaded', () => { harness.dispatchedDOMContentLoaded += 1; });
83
+ document.addEventListener('DOMContentLoaded', () => {
84
+ harness.dispatchedDOMContentLoaded += 1;
85
+ });
78
86
 
79
87
  const dynamicFetch = (...args: any[]) => (window as any).fetch(...args);
80
88
  const fn = new Function(
81
- 'document', 'WebSocket', 'fetch', 'setTimeout', 'clearTimeout',
82
- 'DOMParser', 'Event', 'window', 'location',
83
- script
89
+ 'document',
90
+ 'WebSocket',
91
+ 'fetch',
92
+ 'setTimeout',
93
+ 'clearTimeout',
94
+ 'DOMParser',
95
+ 'Event',
96
+ 'window',
97
+ 'location',
98
+ script,
84
99
  );
85
100
  fn(
86
- document, (window as any).WebSocket, dynamicFetch,
87
- setTimeout, clearTimeout,
88
- (window as any).DOMParser, (window as any).Event, window,
101
+ document,
102
+ (window as any).WebSocket,
103
+ dynamicFetch,
104
+ setTimeout,
105
+ clearTimeout,
106
+ (window as any).DOMParser,
107
+ (window as any).Event,
108
+ window,
89
109
  {
90
110
  href: 'http://localhost/',
91
- reload: () => { harness.reloadCalls += 1; },
92
- }
111
+ reload: () => {
112
+ harness.reloadCalls += 1;
113
+ },
114
+ },
93
115
  );
94
116
 
95
117
  return harness;
@@ -98,7 +120,9 @@ function setupHarness(initialBodyHtml: string): Harness {
98
120
  function makeServerHtml(rootInner: string, scriptHash = 'abc'): string {
99
121
  return [
100
122
  '<!DOCTYPE html><html lang="en" theme="light"><head></head><body>',
101
- '<div id="root">', rootInner, '</div>',
123
+ '<div id="root">',
124
+ rootInner,
125
+ '</div>',
102
126
  '<style id="meno-styles">.dummy{color:red}</style>',
103
127
  `<script src="/_scripts/${scriptHash}.js" defer></script>`,
104
128
  '</body></html>',
@@ -117,7 +141,9 @@ describe('live reload IIFE', () => {
117
141
  </div>
118
142
  </header>
119
143
  `;
120
- const harness = setupHarness(`<div id="root">${initialRootInner}</div><style id="meno-styles">.t-bg-red{background:red}</style><script src="/_scripts/v1.js" defer></script>`);
144
+ const harness = setupHarness(
145
+ `<div id="root">${initialRootInner}</div><style id="meno-styles">.t-bg-red{background:red}</style><script src="/_scripts/v1.js" defer></script>`,
146
+ );
121
147
 
122
148
  // User opens dropdown via JS — adds runtime class + initialization marker.
123
149
  const container = harness.document.querySelector('[data-element-path="0,0"]')!;
@@ -153,7 +179,9 @@ describe('live reload IIFE', () => {
153
179
 
154
180
  test('re-dispatches DOMContentLoaded only when /_scripts/ hash changes', async () => {
155
181
  const initialRootInner = `<header data-element-path="0"><span data-element-path="0,0">hi</span></header>`;
156
- const harness = setupHarness(`<div id="root">${initialRootInner}</div><style id="meno-styles">.x{}</style><script src="/_scripts/v1.js" defer></script>`);
182
+ const harness = setupHarness(
183
+ `<div id="root">${initialRootInner}</div><style id="meno-styles">.x{}</style><script src="/_scripts/v1.js" defer></script>`,
184
+ );
157
185
 
158
186
  // Edit that changes user JS → new content-hash on /_scripts/
159
187
  const newRootInner = `<header data-element-path="0"><span data-element-path="0,0">hi</span></header>`;
@@ -162,7 +190,7 @@ describe('live reload IIFE', () => {
162
190
  harness.triggerHmr();
163
191
  await harness.flush();
164
192
  // Wait a beat for the dynamically-appended script's onload to (try to) fire.
165
- await new Promise(r => setTimeout(r, 50));
193
+ await new Promise((r) => setTimeout(r, 50));
166
194
 
167
195
  // The hash changed, so the IIFE removed the old /_scripts/ tag and appended
168
196
  // a new one. happy-dom's appended <script src> won't actually load over the
@@ -174,13 +202,15 @@ describe('live reload IIFE', () => {
174
202
  // new one was appended.
175
203
  const scripts = Array.from(harness.document.querySelectorAll('script[src^="/_scripts/"]'));
176
204
  expect(scripts.length).toBe(1);
177
- expect(scripts[0].getAttribute('src') || '').toContain('/_scripts/v2.js');
205
+ expect(scripts[0]!.getAttribute('src') || '').toContain('/_scripts/v2.js');
178
206
  expect(harness.reloadCalls).toBe(0);
179
207
  });
180
208
 
181
209
  test('hard-resets (#root innerHTML replace + script re-run) on a server structure change', async () => {
182
210
  const initialRootInner = `<header data-element-path="0"><span data-element-path="0,0">a</span></header>`;
183
- const harness = setupHarness(`<div id="root">${initialRootInner}</div><style id="meno-styles">.x{}</style><script src="/_scripts/v1.js" defer></script>`);
211
+ const harness = setupHarness(
212
+ `<div id="root">${initialRootInner}</div><style id="meno-styles">.x{}</style><script src="/_scripts/v1.js" defer></script>`,
213
+ );
184
214
 
185
215
  // The editor added a node: the new SERVER markup has an extra [data-element-path]
186
216
  // (a genuine structure change, independent of any runtime JS mutation). The
@@ -198,7 +228,7 @@ describe('live reload IIFE', () => {
198
228
  // because #root was rebuilt and JS state is gone (slider-revert guard).
199
229
  const scripts = Array.from(harness.document.querySelectorAll('script[src^="/_scripts/"]'));
200
230
  expect(scripts.length).toBe(1);
201
- expect(scripts[0].getAttribute('src') || '').toContain('_r=');
231
+ expect(scripts[0]!.getAttribute('src') || '').toContain('_r=');
202
232
  expect(harness.reloadCalls).toBe(0);
203
233
  });
204
234
 
@@ -209,7 +239,9 @@ describe('live reload IIFE', () => {
209
239
  // only styles/classes update. (Structure is judged old-server vs new-server, which
210
240
  // are identical here — not live-vs-server, which the clone perturbed.)
211
241
  const initialRootInner = `<div data-element-path="0" data-component="Slider"><span data-element-path="0,0" class="slide t-op-50">slide</span></div>`;
212
- const harness = setupHarness(`<div id="root">${initialRootInner}</div><style id="meno-styles">.t-op-50{opacity:.5}</style><script src="/_scripts/v1.js" defer></script>`);
242
+ const harness = setupHarness(
243
+ `<div id="root">${initialRootInner}</div><style id="meno-styles">.t-op-50{opacity:.5}</style><script src="/_scripts/v1.js" defer></script>`,
244
+ );
213
245
 
214
246
  // Slider JS cloned a slide + recorded an init marker on the live DOM.
215
247
  const slider = harness.document.querySelector('[data-element-path="0"]')!;
@@ -236,7 +268,7 @@ describe('live reload IIFE', () => {
236
268
  // /_scripts NOT re-appended and no DOMContentLoaded re-dispatch.
237
269
  const scripts = Array.from(harness.document.querySelectorAll('script[src^="/_scripts/"]'));
238
270
  expect(scripts.length).toBe(1);
239
- expect(scripts[0].getAttribute('src')).toBe('/_scripts/v1.js');
271
+ expect(scripts[0]!.getAttribute('src')).toBe('/_scripts/v1.js');
240
272
  expect(harness.dispatchedDOMContentLoaded).toBe(0);
241
273
  // The style edit still applied: new class on the slide + stylesheet swapped in place.
242
274
  expect(original.classList.contains('t-op-100')).toBe(true);
@@ -247,7 +279,9 @@ describe('live reload IIFE', () => {
247
279
 
248
280
  test('a soft update preserves a runtime attribute mutation (aria-expanded)', async () => {
249
281
  const initialRootInner = `<button data-element-path="0" aria-expanded="false" class="t-c-red">Menu</button>`;
250
- const harness = setupHarness(`<div id="root">${initialRootInner}</div><style id="meno-styles">.t-c-red{color:red}</style><script src="/_scripts/v1.js" defer></script>`);
282
+ const harness = setupHarness(
283
+ `<div id="root">${initialRootInner}</div><style id="meno-styles">.t-c-red{color:red}</style><script src="/_scripts/v1.js" defer></script>`,
284
+ );
251
285
 
252
286
  // JS opened the menu at runtime: aria-expanded false -> true (an ATTRIBUTE, not a class).
253
287
  const btn = harness.document.querySelector('[data-element-path="0"]')!;
@@ -261,16 +295,18 @@ describe('live reload IIFE', () => {
261
295
  await harness.flush();
262
296
 
263
297
  const after = harness.document.querySelector('[data-element-path="0"]')!;
264
- expect(after).toBe(btn); // identity preserved (soft)
265
- expect(after.getAttribute('aria-expanded')).toBe('true'); // runtime mutation kept (menu stays open)
266
- expect(after.classList.contains('t-c-blue')).toBe(true); // editor style applied
298
+ expect(after).toBe(btn); // identity preserved (soft)
299
+ expect(after.getAttribute('aria-expanded')).toBe('true'); // runtime mutation kept (menu stays open)
300
+ expect(after.classList.contains('t-c-blue')).toBe(true); // editor style applied
267
301
  expect(after.classList.contains('t-c-red')).toBe(false);
268
302
  expect(harness.dispatchedDOMContentLoaded).toBe(0);
269
303
  });
270
304
 
271
305
  test('a soft update still applies a genuine editor attribute edit (server value wins)', async () => {
272
306
  const initialRootInner = `<a data-element-path="0" href="/old" class="t-c-red">x</a>`;
273
- const harness = setupHarness(`<div id="root">${initialRootInner}</div><style id="meno-styles">.x{}</style><script src="/_scripts/v1.js" defer></script>`);
307
+ const harness = setupHarness(
308
+ `<div id="root">${initialRootInner}</div><style id="meno-styles">.x{}</style><script src="/_scripts/v1.js" defer></script>`,
309
+ );
274
310
  const link = harness.document.querySelector('[data-element-path="0"]')!;
275
311
 
276
312
  // Editor changed href in the markup (server /old -> /new); same structure & hash.
@@ -281,13 +317,15 @@ describe('live reload IIFE', () => {
281
317
  await harness.flush();
282
318
 
283
319
  expect(harness.document.querySelector('[data-element-path="0"]')).toBe(link); // soft, identity kept
284
- expect(link.getAttribute('href')).toBe('/new'); // editor edit wins
320
+ expect(link.getAttribute('href')).toBe('/new'); // editor edit wins
285
321
  expect(harness.dispatchedDOMContentLoaded).toBe(0);
286
322
  });
287
323
 
288
324
  test('a JS edit (changed /_scripts hash) hard-resets the DOM and re-runs the script', async () => {
289
325
  const initialRootInner = `<div data-element-path="0"><span data-element-path="0,0">x</span></div>`;
290
- const harness = setupHarness(`<div id="root">${initialRootInner}</div><style id="meno-styles">.x{}</style><script src="/_scripts/v1.js" defer></script>`);
326
+ const harness = setupHarness(
327
+ `<div id="root">${initialRootInner}</div><style id="meno-styles">.x{}</style><script src="/_scripts/v1.js" defer></script>`,
328
+ );
291
329
 
292
330
  // Runtime mutation: JS set a flag + injected a node (no data-element-path).
293
331
  const root0 = harness.document.querySelector('[data-element-path="0"]')!;
@@ -307,13 +345,15 @@ describe('live reload IIFE', () => {
307
345
  // Script re-appended with cache-bust (clean re-run on a clean DOM).
308
346
  const scripts = Array.from(harness.document.querySelectorAll('script[src^="/_scripts/"]'));
309
347
  expect(scripts.length).toBe(1);
310
- expect(scripts[0].getAttribute('src') || '').toContain('/_scripts/v2.js');
348
+ expect(scripts[0]!.getAttribute('src') || '').toContain('/_scripts/v2.js');
311
349
  expect(harness.reloadCalls).toBe(0);
312
350
  });
313
351
 
314
352
  test('updates lang/theme only when they actually differ', async () => {
315
353
  const initialRootInner = `<span data-element-path="0">hi</span>`;
316
- const harness = setupHarness(`<div id="root">${initialRootInner}</div><style id="meno-styles">.x{}</style><script src="/_scripts/v1.js" defer></script>`);
354
+ const harness = setupHarness(
355
+ `<div id="root">${initialRootInner}</div><style id="meno-styles">.x{}</style><script src="/_scripts/v1.js" defer></script>`,
356
+ );
317
357
  const beforeLang = harness.document.documentElement.getAttribute('lang');
318
358
 
319
359
  // Same lang/theme as initial document
@@ -83,7 +83,7 @@ export function generateMetaTags(
83
83
  url: string = '',
84
84
  locale: string = 'en',
85
85
  config: I18nConfig = DEFAULT_I18N_CONFIG,
86
- options?: MetaTagOptions
86
+ options?: MetaTagOptions,
87
87
  ): string {
88
88
  const tags: string[] = [];
89
89
 
@@ -174,7 +174,7 @@ export function generateMetaTags(
174
174
  }
175
175
 
176
176
  // Add x-default pointing to default locale version
177
- const defaultLink = localeLinks.find(l => l.locale === config.defaultLocale);
177
+ const defaultLink = localeLinks.find((l) => l.locale === config.defaultLocale);
178
178
  if (defaultLink) {
179
179
  const xDefaultUrl = baseUrl ? `${baseUrl}${defaultLink.path}` : defaultLink.path;
180
180
  tags.push(`<link rel="alternate" hreflang="x-default" href="${escapeHtml(xDefaultUrl)}" />`);