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
@@ -9,7 +9,9 @@ import { createTestServer, fetch, TEST_PAGE_JSON } from './test-helpers';
9
9
  // Track servers for cleanup
10
10
  const servers: Array<{ cleanup: () => void }> = [];
11
11
  afterAll(() => {
12
- servers.forEach(s => s.cleanup());
12
+ servers.forEach((s) => {
13
+ s.cleanup();
14
+ });
13
15
  });
14
16
 
15
17
  describe('Server Lifecycle', () => {
@@ -83,10 +85,7 @@ describe('Server Lifecycle', () => {
83
85
 
84
86
  expect(ctx1.port).not.toBe(ctx2.port);
85
87
 
86
- const [res1, res2] = await Promise.all([
87
- fetch(`${ctx1.baseUrl}/api/pages`),
88
- fetch(`${ctx2.baseUrl}/api/pages`),
89
- ]);
88
+ const [res1, res2] = await Promise.all([fetch(`${ctx1.baseUrl}/api/pages`), fetch(`${ctx2.baseUrl}/api/pages`)]);
90
89
 
91
90
  expect(res1.status).toBe(200);
92
91
  expect(res2.status).toBe(200);
@@ -8,45 +8,53 @@ import { createTestServer, fetch, TEST_PAGE_JSON } from './test-helpers';
8
8
 
9
9
  let ctx: Awaited<ReturnType<typeof createTestServer>>;
10
10
 
11
- const PAGE_WITH_META = JSON.stringify({
12
- meta: {
13
- title: 'SEO Page',
14
- description: 'A page with meta description',
15
- og: {
16
- title: 'OG Title',
17
- description: 'OG Description',
18
- },
19
- },
20
- root: {
21
- type: 'node',
22
- tag: 'div',
23
- children: [
24
- {
25
- type: 'node',
26
- tag: 'h1',
27
- children: 'SEO Content',
11
+ const PAGE_WITH_META = JSON.stringify(
12
+ {
13
+ meta: {
14
+ title: 'SEO Page',
15
+ description: 'A page with meta description',
16
+ og: {
17
+ title: 'OG Title',
18
+ description: 'OG Description',
28
19
  },
29
- ],
30
- },
31
- }, null, 2);
32
-
33
- const PAGE_WITH_I18N = JSON.stringify({
34
- meta: {
35
- title: { _i18n: true, en: 'English Title', pl: 'Polish Title' },
36
- slugs: { en: 'about', pl: 'o-nas' },
20
+ },
21
+ root: {
22
+ type: 'node',
23
+ tag: 'div',
24
+ children: [
25
+ {
26
+ type: 'node',
27
+ tag: 'h1',
28
+ children: 'SEO Content',
29
+ },
30
+ ],
31
+ },
37
32
  },
38
- root: {
39
- type: 'node',
40
- tag: 'div',
41
- children: [
42
- {
43
- type: 'node',
44
- tag: 'h1',
45
- children: { _i18n: true, en: 'Hello', pl: 'Cześć' },
46
- },
47
- ],
33
+ null,
34
+ 2,
35
+ );
36
+
37
+ const PAGE_WITH_I18N = JSON.stringify(
38
+ {
39
+ meta: {
40
+ title: { _i18n: true, en: 'English Title', pl: 'Polish Title' },
41
+ slugs: { en: 'about', pl: 'o-nas' },
42
+ },
43
+ root: {
44
+ type: 'node',
45
+ tag: 'div',
46
+ children: [
47
+ {
48
+ type: 'node',
49
+ tag: 'h1',
50
+ children: { _i18n: true, en: 'Hello', pl: 'Cześć' },
51
+ },
52
+ ],
53
+ },
48
54
  },
49
- }, null, 2);
55
+ null,
56
+ 2,
57
+ );
50
58
 
51
59
  beforeAll(async () => {
52
60
  ctx = await createTestServer({
@@ -88,7 +96,9 @@ describe('SSR Rendering', () => {
88
96
  const res = await fetch(ctx.baseUrl);
89
97
  const html = await res.text();
90
98
 
91
- expect(html).toContain('<style>');
99
+ // The main style tag carries id="meno-styles" (so hot reload can patch it
100
+ // in place) and may carry a CSP nonce.
101
+ expect(html).toMatch(/<style id="meno-styles"[^>]*>/);
92
102
  // Base reset CSS should be present
93
103
  expect(html).toContain('box-sizing: border-box');
94
104
  });
@@ -14,7 +14,7 @@ let originalProjectRoot: string;
14
14
  // 1x1 transparent PNG (minimal valid PNG file)
15
15
  const TINY_PNG = Buffer.from(
16
16
  'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==',
17
- 'base64'
17
+ 'base64',
18
18
  );
19
19
 
20
20
  // Minimal WOFF2 header (just enough to test MIME type detection)
@@ -31,8 +31,8 @@ beforeAll(async () => {
31
31
  });
32
32
 
33
33
  // Write binary files properly
34
- const { writeFileSync } = await import('fs');
35
- const { join } = await import('path');
34
+ const { writeFileSync } = await import('node:fs');
35
+ const { join } = await import('node:path');
36
36
  writeFileSync(join(tempProject.projectDir, 'images/test.png'), TINY_PNG);
37
37
  writeFileSync(join(tempProject.projectDir, 'fonts/test.woff2'), TINY_WOFF2);
38
38
 
@@ -3,8 +3,8 @@
3
3
  * Shared utilities for server integration tests
4
4
  */
5
5
 
6
- import { mkdirSync, writeFileSync, rmSync } from 'fs';
7
- import { join } from 'path';
6
+ import { mkdirSync, writeFileSync, rmSync } from 'node:fs';
7
+ import { join } from 'node:path';
8
8
  import { createServer, WebSocketManager, type ServerConfig } from '../createServer';
9
9
  import { PageService } from '../services/pageService';
10
10
  import { ComponentService } from '../services/componentService';
@@ -13,7 +13,6 @@ import {
13
13
  createTypedMockPageProvider,
14
14
  createTypedMockComponentProvider,
15
15
  } from '../../test-utils/factories/ServerMockFactory';
16
- import { setProjectRoot } from '../projectContext';
17
16
 
18
17
  // Save original fetch before any test mocking can override it
19
18
  const originalFetch = globalThis.fetch;
@@ -29,45 +28,53 @@ export { originalFetch as fetch };
29
28
  /**
30
29
  * Minimal page JSON for testing
31
30
  */
32
- export const TEST_PAGE_JSON = JSON.stringify({
33
- meta: {
34
- title: 'Test Page',
35
- description: 'A test page for integration tests',
36
- },
37
- root: {
38
- type: 'node',
39
- tag: 'div',
40
- children: [
41
- {
42
- type: 'node',
43
- tag: 'h1',
44
- children: 'Hello World',
45
- },
46
- ],
31
+ export const TEST_PAGE_JSON = JSON.stringify(
32
+ {
33
+ meta: {
34
+ title: 'Test Page',
35
+ description: 'A test page for integration tests',
36
+ },
37
+ root: {
38
+ type: 'node',
39
+ tag: 'div',
40
+ children: [
41
+ {
42
+ type: 'node',
43
+ tag: 'h1',
44
+ children: 'Hello World',
45
+ },
46
+ ],
47
+ },
47
48
  },
48
- }, null, 2);
49
+ null,
50
+ 2,
51
+ );
49
52
 
50
53
  /**
51
54
  * Page with component reference
52
55
  */
53
- export const TEST_PAGE_WITH_COMPONENT = JSON.stringify({
54
- meta: {
55
- title: 'Component Page',
56
- },
57
- root: {
58
- type: 'node',
59
- tag: 'div',
60
- children: [
61
- {
62
- type: 'component',
63
- component: 'TestButton',
64
- props: {
65
- label: 'Click Me',
56
+ export const TEST_PAGE_WITH_COMPONENT = JSON.stringify(
57
+ {
58
+ meta: {
59
+ title: 'Component Page',
60
+ },
61
+ root: {
62
+ type: 'node',
63
+ tag: 'div',
64
+ children: [
65
+ {
66
+ type: 'component',
67
+ component: 'TestButton',
68
+ props: {
69
+ label: 'Click Me',
70
+ },
66
71
  },
67
- },
68
- ],
72
+ ],
73
+ },
69
74
  },
70
- }, null, 2);
75
+ null,
76
+ 2,
77
+ );
71
78
 
72
79
  /**
73
80
  * Simple component definition
@@ -88,51 +95,57 @@ export const TEST_COMPONENT_DEF = {
88
95
  /**
89
96
  * CMS template page JSON
90
97
  */
91
- export const TEST_CMS_TEMPLATE = JSON.stringify({
92
- meta: {
93
- title: '{{cms.title}}',
94
- source: 'cms',
95
- cms: {
96
- id: 'posts',
97
- name: 'Posts',
98
- collection: 'posts',
99
- slugField: 'slug',
100
- urlPattern: '/blog/{{slug}}',
101
- fields: {
102
- title: { type: 'string', required: true },
103
- slug: { type: 'string', required: true },
104
- body: { type: 'string' },
98
+ export const TEST_CMS_TEMPLATE = JSON.stringify(
99
+ {
100
+ meta: {
101
+ title: '{{cms.title}}',
102
+ source: 'cms',
103
+ cms: {
104
+ id: 'posts',
105
+ name: 'Posts',
106
+ collection: 'posts',
107
+ slugField: 'slug',
108
+ urlPattern: '/blog/{{slug}}',
109
+ fields: {
110
+ title: { type: 'string', required: true },
111
+ slug: { type: 'string', required: true },
112
+ body: { type: 'string' },
113
+ },
105
114
  },
106
115
  },
116
+ root: {
117
+ type: 'node',
118
+ tag: 'article',
119
+ children: [
120
+ {
121
+ type: 'node',
122
+ tag: 'h1',
123
+ children: '{{cms.title}}',
124
+ },
125
+ {
126
+ type: 'node',
127
+ tag: 'p',
128
+ children: '{{cms.body}}',
129
+ },
130
+ ],
131
+ },
107
132
  },
108
- root: {
109
- type: 'node',
110
- tag: 'article',
111
- children: [
112
- {
113
- type: 'node',
114
- tag: 'h1',
115
- children: '{{cms.title}}',
116
- },
117
- {
118
- type: 'node',
119
- tag: 'p',
120
- children: '{{cms.body}}',
121
- },
122
- ],
123
- },
124
- }, null, 2);
133
+ null,
134
+ 2,
135
+ );
125
136
 
126
137
  /**
127
138
  * Create a test server with mock providers
128
139
  */
129
- export async function createTestServer(options: {
130
- pages?: Record<string, string>;
131
- components?: Map<string, any>;
132
- port?: number;
133
- cmsService?: any;
134
- cmsProvider?: any;
135
- } = {}) {
140
+ export async function createTestServer(
141
+ options: {
142
+ pages?: Record<string, string>;
143
+ components?: Map<string, any>;
144
+ port?: number;
145
+ cmsService?: any;
146
+ cmsProvider?: any;
147
+ } = {},
148
+ ) {
136
149
  const port = options.port ?? 0;
137
150
  const wsManager = new WebSocketManager();
138
151
 
@@ -141,7 +154,7 @@ export async function createTestServer(options: {
141
154
  const pageService = new PageService(pageCache, pageProvider);
142
155
  await pageService.loadAllPages();
143
156
 
144
- const componentProvider = createTypedMockComponentProvider(options.components ?? new Map());
157
+ const _componentProvider = createTypedMockComponentProvider(options.components ?? new Map());
145
158
  const componentService = new ComponentService({
146
159
  loader: {
147
160
  loadDirectory: async () => options.components ?? new Map(),
@@ -10,20 +10,22 @@ import type { Experiment } from '../../shared/types/experiments';
10
10
  * Generate the _middleware.ts content for traffic splitting
11
11
  */
12
12
  export function generateMiddleware(experiments: Experiment[]): string {
13
- const running = experiments.filter(e => e.status === 'running');
13
+ const running = experiments.filter((e) => e.status === 'running');
14
14
  if (running.length === 0) return '';
15
15
 
16
16
  // Embed experiment config as JSON
17
- const configJSON = JSON.stringify(running.map(e => ({
18
- id: e.id,
19
- controlBranch: e.controlBranch,
20
- controlWeight: e.controlWeight,
21
- variants: e.variants.map(v => ({
22
- branch: v.branch,
23
- weight: v.weight,
24
- deployUrl: v.deployUrl,
17
+ const configJSON = JSON.stringify(
18
+ running.map((e) => ({
19
+ id: e.id,
20
+ controlBranch: e.controlBranch,
21
+ controlWeight: e.controlWeight,
22
+ variants: e.variants.map((v) => ({
23
+ branch: v.branch,
24
+ weight: v.weight,
25
+ deployUrl: v.deployUrl,
26
+ })),
25
27
  })),
26
- })));
28
+ );
27
29
 
28
30
  return `/**
29
31
  * A/B Testing Traffic Splitting Middleware
@@ -7,7 +7,6 @@ import type { JSONPage, ComponentDefinition, CMSSchema, I18nConfig } from '../..
7
7
  import type { BreakpointConfig } from '../../shared/breakpoints';
8
8
  import { DEFAULT_BREAKPOINTS } from '../../shared/breakpoints';
9
9
  import { nodeToAstro, type AstroEmitContext } from './nodeToAstro';
10
- import { transformCMSTemplate } from './templateTransformer';
11
10
  import type { ImageMetadataMap } from '../ssr/imageMetadata';
12
11
  import type { SlugMap } from '../../shared/slugTranslator';
13
12
  import type { ResponsiveScales } from '../../shared/responsiveScaling';
@@ -126,19 +125,19 @@ function collectRichTextFields(schema: CMSSchema): Set<string> {
126
125
  function transformTitleExpression(
127
126
  title: string,
128
127
  binding: string,
129
- richTextFields: Set<string>,
130
- wrapFn?: string
128
+ _richTextFields: Set<string>,
129
+ wrapFn?: string,
131
130
  ): string {
132
131
  if (!/\{\{cms\./.test(title)) {
133
132
  return `"${escapeJSX(title)}"`;
134
133
  }
135
134
 
136
- const w = (expr: string) => wrapFn ? `${wrapFn}(${expr})` : expr;
135
+ const w = (expr: string) => (wrapFn ? `${wrapFn}(${expr})` : expr);
137
136
 
138
137
  // Full match: entire title is a single {{cms.field}}
139
138
  const fullMatch = title.match(/^\{\{cms\.([^}]+)\}\}$/);
140
139
  if (fullMatch) {
141
- return `{${w(`${binding}.data.${fullMatch[1].trim()}`)}}`;
140
+ return `{${w(`${binding}.data.${(fullMatch[1] ?? '').trim()}`)}}`;
142
141
  }
143
142
 
144
143
  // Mixed content: "Page - {{cms.title}}" -> {`Page - ${entry.data.title}`}
@@ -169,20 +168,21 @@ function buildGetStaticPaths(
169
168
  schema: CMSSchema,
170
169
  isMultiLocale: boolean,
171
170
  i18nConfig: I18nConfig,
172
- locale?: string
171
+ locale?: string,
173
172
  ): string {
174
173
  const collectionId = schema.id;
175
174
  const slugField = schema.slugField || 'slug';
176
- const pathPrefix = extractPathPrefix(schema.urlPattern);
175
+ const pathPrefix = extractPathPrefix(schema.urlPattern ?? '');
177
176
  const targetLocale = locale || i18nConfig.defaultLocale;
178
177
 
179
178
  if (!isMultiLocale) {
180
179
  // Single-locale version: resolve slug for this specific locale
181
180
  // Route file is at blog/[slug].astro (or pl/blog/[slug].astro for non-default)
182
181
  // If i18n values exist, resolve for the target locale
183
- const slugExpr = i18nConfig.locales.length > 1
184
- ? `entry.data.${slugField}?.${targetLocale} || entry.data.${slugField} || entry.id`
185
- : `entry.data.${slugField} || entry.id`;
182
+ const slugExpr =
183
+ i18nConfig.locales.length > 1
184
+ ? `entry.data.${slugField}?.${targetLocale} || entry.data.${slugField} || entry.id`
185
+ : `entry.data.${slugField} || entry.id`;
186
186
 
187
187
  return [
188
188
  `export async function getStaticPaths() {`,
@@ -221,14 +221,14 @@ function buildGetStaticPaths(
221
221
  ` paths.push({`,
222
222
  ` params: { slug: \`${pathPrefix}\${${slugExpr}}\` },`,
223
223
  ` props: { entry, locale: '${code}' },`,
224
- ` });`
224
+ ` });`,
225
225
  );
226
226
  } else {
227
227
  lines.push(
228
228
  ` paths.push({`,
229
229
  ` params: { slug: ${slugExpr} },`,
230
230
  ` props: { entry, locale: '${code}' },`,
231
- ` });`
231
+ ` });`,
232
232
  );
233
233
  }
234
234
  } else {
@@ -238,18 +238,12 @@ function buildGetStaticPaths(
238
238
  ` paths.push({`,
239
239
  ` params: { slug: \`${code}/${pathPrefix}\${${slugExpr}}\` },`,
240
240
  ` props: { entry, locale: '${code}' },`,
241
- ` });`
241
+ ` });`,
242
242
  );
243
243
  }
244
244
  }
245
245
 
246
- lines.push(
247
- ` }`,
248
- ` return paths;`,
249
- `}`,
250
- ``,
251
- `const { entry, locale = '${defaultLocale}' } = Astro.props;`
252
- );
246
+ lines.push(` }`, ` return paths;`, `}`, ``, `const { entry, locale = '${defaultLocale}' } = Astro.props;`);
253
247
 
254
248
  return lines.join('\n');
255
249
  }
@@ -307,7 +301,7 @@ export function emitCMSPage(options: CMSPageEmitOptions): string {
307
301
  isMultiLocale,
308
302
  i18nConfig,
309
303
  binding,
310
- richTextFields
304
+ richTextFields,
311
305
  );
312
306
  }
313
307
 
@@ -373,9 +367,7 @@ export function emitCMSPage(options: CMSPageEmitOptions): string {
373
367
  const staticPaths = buildGetStaticPaths(cmsSchema, isMultiLocale, i18nConfig, locale);
374
368
 
375
369
  // Build script paths array
376
- const scriptsArrayLiteral = scriptPaths.length > 0
377
- ? `[${scriptPaths.map((s) => `"${s}"`).join(', ')}]`
378
- : '[]';
370
+ const scriptsArrayLiteral = scriptPaths.length > 0 ? `[${scriptPaths.map((s) => `"${s}"`).join(', ')}]` : '[]';
379
371
 
380
372
  // Build library tags literal
381
373
  const libraryTagsLiteral = `{ headCSS: \`${escapeTemplateLiteral(libraryTags.headCSS || '')}\`, headJS: \`${escapeTemplateLiteral(libraryTags.headJS || '')}\`, bodyEndJS: \`${escapeTemplateLiteral(libraryTags.bodyEndJS || '')}\` }`;
@@ -383,16 +375,10 @@ export function emitCMSPage(options: CMSPageEmitOptions): string {
383
375
  // Escape meta first, then transform CMS templates ({{cms.X}} survives escaping intact)
384
376
  const slugField = cmsSchema.slugField || 'slug';
385
377
  const escapedMeta = escapeTemplateLiteral(meta)
386
- .replace(
387
- /\{\{cms\.([^}]+)\}\}/g,
388
- (_, fieldPath) => `\${${wrapFn}(${binding}.data.${fieldPath.trim()})}`
389
- )
378
+ .replace(/\{\{cms\.([^}]+)\}\}/g, (_, fieldPath) => `\${${wrapFn}(${binding}.data.${fieldPath.trim()})}`)
390
379
  // Replace the metadata-pass stand-in slug with the per-entry slug so
391
380
  // canonical/og:url point at the real page instead of "__placeholder__".
392
- .replace(
393
- new RegExp(CMS_SLUG_PLACEHOLDER, 'g'),
394
- `\${${wrapFn}(${binding}.data.${slugField}) || ${binding}.id}`
395
- );
381
+ .replace(new RegExp(CMS_SLUG_PLACEHOLDER, 'g'), `\${${wrapFn}(${binding}.data.${slugField}) || ${binding}.id}`);
396
382
  const escapedFontPreloads = escapeTemplateLiteral(fontPreloads);
397
383
 
398
384
  // Transform title for CMS entry data
@@ -406,14 +392,14 @@ export function emitCMSPage(options: CMSPageEmitOptions): string {
406
392
 
407
393
  // Page-level collection queries emitted by collection-sourced list nodes
408
394
  // (getCollection import is already present in importLines above).
409
- const extraFrontmatter = ctx.frontmatterLines && ctx.frontmatterLines.length > 0
410
- ? '\n' + ctx.frontmatterLines.join('\n')
411
- : '';
395
+ const extraFrontmatter =
396
+ ctx.frontmatterLines && ctx.frontmatterLines.length > 0 ? `\n${ctx.frontmatterLines.join('\n')}` : '';
412
397
 
413
398
  // Generate interactive style block for page-level interactive styles
414
- const interactiveStyleSection = ctx.collectedInteractiveStyles!.size > 0
415
- ? `\n<style is:global>\n${generateAllInteractiveCSS(ctx.collectedInteractiveStyles!, breakpoints, remConfig, responsiveScales)}\n</style>\n`
416
- : '';
399
+ const interactiveStyleSection =
400
+ ctx.collectedInteractiveStyles!.size > 0
401
+ ? `\n<style is:global>\n${generateAllInteractiveCSS(ctx.collectedInteractiveStyles!, breakpoints, remConfig, responsiveScales)}\n</style>\n`
402
+ : '';
417
403
 
418
404
  return `---
419
405
  ${importLines.join('\n')}
@@ -453,13 +439,11 @@ function buildEmptyCMSPage(
453
439
  isMultiLocale: boolean,
454
440
  i18nConfig: I18nConfig,
455
441
  binding: string,
456
- richTextFields: Set<string>
442
+ richTextFields: Set<string>,
457
443
  ): string {
458
444
  const escapedMeta = escapeTemplateLiteral(meta);
459
445
  const escapedFontPreloads = escapeTemplateLiteral(fontPreloads);
460
- const scriptsArrayLiteral = scriptPaths.length > 0
461
- ? `[${scriptPaths.map((s) => `"${s}"`).join(', ')}]`
462
- : '[]';
446
+ const scriptsArrayLiteral = scriptPaths.length > 0 ? `[${scriptPaths.map((s) => `"${s}"`).join(', ')}]` : '[]';
463
447
  const libraryTagsLiteral = `{ headCSS: \`${escapeTemplateLiteral(libraryTags.headCSS || '')}\`, headJS: \`${escapeTemplateLiteral(libraryTags.headJS || '')}\`, bodyEndJS: \`${escapeTemplateLiteral(libraryTags.bodyEndJS || '')}\` }`;
464
448
 
465
449
  const wrapFn = 'r';