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
@@ -4,10 +4,10 @@
4
4
 
5
5
  import { describe, it, expect, beforeEach, afterEach } from 'bun:test';
6
6
  import { FileSystemCMSProvider } from './fileSystemCMSProvider';
7
- import { mkdirSync, writeFileSync, rmSync, existsSync } from 'fs';
8
- import { join } from 'path';
7
+ import { mkdirSync, writeFileSync, rmSync, existsSync } from 'node:fs';
8
+ import { join } from 'node:path';
9
9
 
10
- const TEST_DIR = '/tmp/cms-provider-test-' + Date.now();
10
+ const TEST_DIR = `/tmp/cms-provider-test-${Date.now()}`;
11
11
  const TEMPLATES_DIR = join(TEST_DIR, 'templates');
12
12
  const CMS_DIR = join(TEST_DIR, 'cms');
13
13
 
@@ -22,54 +22,70 @@ describe('FileSystemCMSProvider', () => {
22
22
  // Create test page with embedded schema in templates/ subdirectory
23
23
  writeFileSync(
24
24
  join(TEMPLATES_DIR, 'blog-post.json'),
25
- JSON.stringify({
26
- meta: {
27
- source: 'cms',
28
- cms: {
29
- id: 'blog-posts',
30
- name: 'Blog Posts',
31
- slugField: 'slug',
32
- urlPattern: '/blog/{{slug}}',
33
- fields: {
34
- title: { type: 'string', required: true },
35
- slug: { type: 'string', required: true },
36
- content: { type: 'text' },
25
+ JSON.stringify(
26
+ {
27
+ meta: {
28
+ source: 'cms',
29
+ cms: {
30
+ id: 'blog-posts',
31
+ name: 'Blog Posts',
32
+ slugField: 'slug',
33
+ urlPattern: '/blog/{{slug}}',
34
+ fields: {
35
+ title: { type: 'string', required: true },
36
+ slug: { type: 'string', required: true },
37
+ content: { type: 'text' },
38
+ },
37
39
  },
40
+ title: '{{cms.title}}',
38
41
  },
39
- title: '{{cms.title}}'
42
+ root: { type: 'node', tag: 'div', children: [] },
40
43
  },
41
- root: { type: 'node', tag: 'div', children: [] }
42
- }, null, 2)
44
+ null,
45
+ 2,
46
+ ),
43
47
  );
44
48
 
45
49
  // Create non-CMS page in templates (should be ignored since it lacks source: 'cms')
46
50
  writeFileSync(
47
51
  join(TEMPLATES_DIR, 'about.json'),
48
- JSON.stringify({
49
- meta: { title: 'About' },
50
- root: { type: 'node', tag: 'div', children: [] }
51
- }, null, 2)
52
+ JSON.stringify(
53
+ {
54
+ meta: { title: 'About' },
55
+ root: { type: 'node', tag: 'div', children: [] },
56
+ },
57
+ null,
58
+ 2,
59
+ ),
52
60
  );
53
61
 
54
62
  // Create CMS items
55
63
  writeFileSync(
56
64
  join(CMS_DIR, 'blog-posts', 'hello-world.json'),
57
- JSON.stringify({
58
- _id: '1',
59
- title: 'Hello World',
60
- slug: 'hello-world',
61
- content: 'First post content'
62
- }, null, 2)
65
+ JSON.stringify(
66
+ {
67
+ _id: '1',
68
+ title: 'Hello World',
69
+ slug: 'hello-world',
70
+ content: 'First post content',
71
+ },
72
+ null,
73
+ 2,
74
+ ),
63
75
  );
64
76
 
65
77
  writeFileSync(
66
78
  join(CMS_DIR, 'blog-posts', 'getting-started.json'),
67
- JSON.stringify({
68
- _id: '2',
69
- title: 'Getting Started',
70
- slug: 'getting-started',
71
- content: 'Guide content'
72
- }, null, 2)
79
+ JSON.stringify(
80
+ {
81
+ _id: '2',
82
+ title: 'Getting Started',
83
+ slug: 'getting-started',
84
+ content: 'Guide content',
85
+ },
86
+ null,
87
+ 2,
88
+ ),
73
89
  );
74
90
 
75
91
  provider = new FileSystemCMSProvider(TEMPLATES_DIR, CMS_DIR);
@@ -119,13 +135,13 @@ describe('FileSystemCMSProvider', () => {
119
135
  const items = await provider.getItems('blog-posts');
120
136
 
121
137
  expect(items).toHaveLength(2);
122
- expect(items.some(i => i.slug === 'hello-world')).toBe(true);
123
- expect(items.some(i => i.slug === 'getting-started')).toBe(true);
138
+ expect(items.some((i) => i.slug === 'hello-world')).toBe(true);
139
+ expect(items.some((i) => i.slug === 'getting-started')).toBe(true);
124
140
  });
125
141
 
126
142
  it('should add _slug from filename', async () => {
127
143
  const items = await provider.getItems('blog-posts');
128
- const helloWorld = items.find(i => i.slug === 'hello-world');
144
+ const helloWorld = items.find((i) => i.slug === 'hello-world');
129
145
 
130
146
  expect(helloWorld?._slug).toBe('hello-world');
131
147
  });
@@ -208,23 +224,27 @@ describe('FileSystemCMSProvider', () => {
208
224
  // Add products schema in templates/
209
225
  writeFileSync(
210
226
  join(TEMPLATES_DIR, 'product.json'),
211
- JSON.stringify({
212
- meta: {
213
- source: 'cms',
214
- cms: {
215
- id: 'products',
216
- name: 'Products',
217
- slugField: 'slug',
218
- urlPattern: '/shop/{{slug}}',
219
- fields: {
220
- name: { type: 'string' },
221
- slug: { type: 'string' },
222
- price: { type: 'number' },
227
+ JSON.stringify(
228
+ {
229
+ meta: {
230
+ source: 'cms',
231
+ cms: {
232
+ id: 'products',
233
+ name: 'Products',
234
+ slugField: 'slug',
235
+ urlPattern: '/shop/{{slug}}',
236
+ fields: {
237
+ name: { type: 'string' },
238
+ slug: { type: 'string' },
239
+ price: { type: 'number' },
240
+ },
223
241
  },
224
242
  },
243
+ root: { type: 'node', tag: 'div', children: [] },
225
244
  },
226
- root: { type: 'node', tag: 'div', children: [] }
227
- }, null, 2)
245
+ null,
246
+ 2,
247
+ ),
228
248
  );
229
249
 
230
250
  provider.clearSchemaCache();
@@ -264,19 +284,23 @@ describe('FileSystemCMSProvider', () => {
264
284
  // Add new page with CMS in templates/
265
285
  writeFileSync(
266
286
  join(TEMPLATES_DIR, 'product.json'),
267
- JSON.stringify({
268
- meta: {
269
- source: 'cms',
270
- cms: {
271
- id: 'products',
272
- name: 'Products',
273
- slugField: 'slug',
274
- urlPattern: '/shop/{{slug}}',
275
- fields: {},
287
+ JSON.stringify(
288
+ {
289
+ meta: {
290
+ source: 'cms',
291
+ cms: {
292
+ id: 'products',
293
+ name: 'Products',
294
+ slugField: 'slug',
295
+ urlPattern: '/shop/{{slug}}',
296
+ fields: {},
297
+ },
276
298
  },
299
+ root: { type: 'node', tag: 'div', children: [] },
277
300
  },
278
- root: { type: 'node', tag: 'div', children: [] }
279
- }, null, 2)
301
+ null,
302
+ 2,
303
+ ),
280
304
  );
281
305
 
282
306
  // Still cached
@@ -303,37 +327,43 @@ describe('FileSystemCMSProvider', () => {
303
327
  });
304
328
 
305
329
  it('should reject filenames with path traversal in getItemByFilename', async () => {
306
- await expect(provider.getItemByFilename('blog-posts', '../../../etc/passwd'))
307
- .rejects.toThrow(/Invalid filename/);
308
- await expect(provider.getItemByFilename('blog-posts', '..'))
309
- .rejects.toThrow(/Invalid filename/);
330
+ await expect(provider.getItemByFilename('blog-posts', '../../../etc/passwd')).rejects.toThrow(/Invalid filename/);
331
+ await expect(provider.getItemByFilename('blog-posts', '..')).rejects.toThrow(/Invalid filename/);
310
332
  });
311
333
 
312
334
  it('should reject filenames with path separators in getItemByFilename', async () => {
313
- await expect(provider.getItemByFilename('blog-posts', 'path/to/file'))
314
- .rejects.toThrow(/Invalid filename/);
335
+ await expect(provider.getItemByFilename('blog-posts', 'path/to/file')).rejects.toThrow(/Invalid filename/);
315
336
  });
316
337
 
317
338
  it('should reject invalid collection names in deleteItem', async () => {
318
- await expect(provider.deleteItem('../etc', 'passwd'))
319
- .rejects.toThrow(/Invalid collection name/);
339
+ await expect(provider.deleteItem('../etc', 'passwd')).rejects.toThrow(/Invalid collection name/);
320
340
  });
321
341
 
322
342
  it('should reject invalid filenames in deleteItem', async () => {
323
- await expect(provider.deleteItem('blog-posts', '../../../etc/passwd'))
324
- .rejects.toThrow(/Invalid filename/);
343
+ await expect(provider.deleteItem('blog-posts', '../../../etc/passwd')).rejects.toThrow(/Invalid filename/);
325
344
  });
326
345
 
327
346
  it('should reject invalid collection IDs in saveSchema', async () => {
328
- await expect(provider.saveSchema('../hack', {}))
329
- .rejects.toThrow(/Invalid collection ID/);
330
- await expect(provider.saveSchema('test/path', {}))
331
- .rejects.toThrow(/Invalid collection ID/);
347
+ await expect(provider.saveSchema('../hack', {})).rejects.toThrow(/Invalid collection ID/);
348
+ await expect(provider.saveSchema('test/path', {})).rejects.toThrow(/Invalid collection ID/);
332
349
  });
333
350
 
334
351
  it('should reject invalid collection IDs in updateSchema', async () => {
335
- await expect(provider.updateSchema('../hack', {}))
336
- .rejects.toThrow(/Invalid collection ID/);
352
+ await expect(provider.updateSchema('../hack', {})).rejects.toThrow(/Invalid collection ID/);
353
+ });
354
+
355
+ it('saveSchema creates a cms/<id>/ dir for a file-backed collection', async () => {
356
+ await provider.saveSchema('file-coll', { meta: { source: 'cms', cms: { id: 'file-coll' } } });
357
+ expect(existsSync(join(CMS_DIR, 'file-coll'))).toBe(true);
358
+ });
359
+
360
+ it('saveSchema does NOT create a cms/<id>/ dir for a Sanity-backed collection', async () => {
361
+ await provider.saveSchema('sanity-coll', {
362
+ meta: { source: 'cms', cms: { id: 'sanity-coll', source: 'sanity', documentType: 'post' } },
363
+ });
364
+ // Template written, but no on-disk items dir (items live in Sanity, read-only).
365
+ expect(existsSync(join(TEMPLATES_DIR, 'sanity-coll.json'))).toBe(true);
366
+ expect(existsSync(join(CMS_DIR, 'sanity-coll'))).toBe(false);
337
367
  });
338
368
 
339
369
  it('should accept valid collection names', async () => {
@@ -344,12 +374,9 @@ describe('FileSystemCMSProvider', () => {
344
374
 
345
375
  it('should reject filenames ending in reserved .draft suffix', async () => {
346
376
  const item = { _id: '99', _filename: 'foo.draft', title: 'Sneaky', slug: 'foo' };
347
- await expect(provider.saveItem('blog-posts', item))
348
- .rejects.toThrow(/\.draft.*reserved/);
349
- await expect(provider.deleteItem('blog-posts', 'foo.draft'))
350
- .rejects.toThrow(/\.draft.*reserved/);
351
- await expect(provider.getItemByFilename('blog-posts', 'foo.draft'))
352
- .rejects.toThrow(/\.draft.*reserved/);
377
+ await expect(provider.saveItem('blog-posts', item)).rejects.toThrow(/\.draft.*reserved/);
378
+ await expect(provider.deleteItem('blog-posts', 'foo.draft')).rejects.toThrow(/\.draft.*reserved/);
379
+ await expect(provider.getItemByFilename('blog-posts', 'foo.draft')).rejects.toThrow(/\.draft.*reserved/);
353
380
  });
354
381
  });
355
382
 
@@ -392,9 +419,9 @@ describe('FileSystemCMSProvider', () => {
392
419
  const items = await provider.getItems('blog-posts');
393
420
  // Still only the two original published items
394
421
  expect(items).toHaveLength(2);
395
- expect(items.find(i => i._filename === 'brand-new')).toBeUndefined();
422
+ expect(items.find((i) => i._filename === 'brand-new')).toBeUndefined();
396
423
  // hello-world's published title is unchanged
397
- expect(items.find(i => i._filename === 'hello-world')?.title).toBe('Hello World');
424
+ expect(items.find((i) => i._filename === 'hello-world')?.title).toBe('Hello World');
398
425
 
399
426
  const single = await provider.getItemByFilename('blog-posts', 'brand-new');
400
427
  expect(single).toBeNull();
@@ -402,22 +429,31 @@ describe('FileSystemCMSProvider', () => {
402
429
 
403
430
  it('getAllDrafts returns drafts with _isDraft transient flag', async () => {
404
431
  await provider.saveDraft('blog-posts', {
405
- _id: '1', _filename: 'hello-world', title: 'WIP', slug: 'hello-world',
432
+ _id: '1',
433
+ _filename: 'hello-world',
434
+ title: 'WIP',
435
+ slug: 'hello-world',
406
436
  });
407
437
  await provider.saveDraft('blog-posts', {
408
- _id: 'new', _filename: 'brand-new', title: 'New', slug: 'brand-new',
438
+ _id: 'new',
439
+ _filename: 'brand-new',
440
+ title: 'New',
441
+ slug: 'brand-new',
409
442
  });
410
443
 
411
444
  const drafts = await provider.getAllDrafts('blog-posts');
412
445
  expect(drafts).toHaveLength(2);
413
- expect(drafts.every(d => d._isDraft === true)).toBe(true);
414
- expect(drafts.map(d => d._filename).sort()).toEqual(['brand-new', 'hello-world']);
446
+ expect(drafts.every((d) => d._isDraft === true)).toBe(true);
447
+ expect(drafts.map((d) => d._filename).sort()).toEqual(['brand-new', 'hello-world']);
415
448
  });
416
449
 
417
450
  it('hasDraft reflects whether a draft file exists', async () => {
418
451
  expect(await provider.hasDraft('blog-posts', 'hello-world')).toBe(false);
419
452
  await provider.saveDraft('blog-posts', {
420
- _id: '1', _filename: 'hello-world', title: 'WIP', slug: 'hello-world',
453
+ _id: '1',
454
+ _filename: 'hello-world',
455
+ title: 'WIP',
456
+ slug: 'hello-world',
421
457
  });
422
458
  expect(await provider.hasDraft('blog-posts', 'hello-world')).toBe(true);
423
459
  });
@@ -426,7 +462,10 @@ describe('FileSystemCMSProvider', () => {
426
462
  await expect(provider.discardDraft('blog-posts', 'hello-world')).resolves.toBeUndefined();
427
463
 
428
464
  await provider.saveDraft('blog-posts', {
429
- _id: '1', _filename: 'hello-world', title: 'WIP', slug: 'hello-world',
465
+ _id: '1',
466
+ _filename: 'hello-world',
467
+ title: 'WIP',
468
+ slug: 'hello-world',
430
469
  });
431
470
  expect(existsSync(join(CMS_DIR, 'blog-posts', 'hello-world.draft.json'))).toBe(true);
432
471
 
@@ -459,25 +498,30 @@ describe('FileSystemCMSProvider', () => {
459
498
 
460
499
  it('publishDraft of a draft-only item creates the published file', async () => {
461
500
  await provider.saveDraft('blog-posts', {
462
- _id: 'new', _filename: 'brand-new', title: 'New post', slug: 'brand-new',
501
+ _id: 'new',
502
+ _filename: 'brand-new',
503
+ title: 'New post',
504
+ slug: 'brand-new',
463
505
  });
464
506
 
465
507
  const result = await provider.publishDraft('blog-posts', 'brand-new');
466
508
  expect(result._filename).toBe('brand-new');
467
509
 
468
510
  const items = await provider.getItems('blog-posts');
469
- expect(items.find(i => i._filename === 'brand-new')?.title).toBe('New post');
511
+ expect(items.find((i) => i._filename === 'brand-new')?.title).toBe('New post');
470
512
  expect(existsSync(join(CMS_DIR, 'blog-posts', 'brand-new.draft.json'))).toBe(false);
471
513
  });
472
514
 
473
515
  it('publishDraft throws when no draft exists', async () => {
474
- await expect(provider.publishDraft('blog-posts', 'hello-world'))
475
- .rejects.toThrow(/No draft to publish/);
516
+ await expect(provider.publishDraft('blog-posts', 'hello-world')).rejects.toThrow(/No draft to publish/);
476
517
  });
477
518
 
478
519
  it('deleteItem removes both published and draft files', async () => {
479
520
  await provider.saveDraft('blog-posts', {
480
- _id: '1', _filename: 'hello-world', title: 'WIP', slug: 'hello-world',
521
+ _id: '1',
522
+ _filename: 'hello-world',
523
+ title: 'WIP',
524
+ slug: 'hello-world',
481
525
  });
482
526
 
483
527
  await provider.deleteItem('blog-posts', 'hello-world');
@@ -497,12 +541,11 @@ describe('FileSystemCMSProvider', () => {
497
541
  };
498
542
  await provider.saveItem('blog-posts', item as any);
499
543
 
500
- const { readFile } = await import('fs/promises');
544
+ const { readFile } = await import('node:fs/promises');
501
545
  const raw = await readFile(join(CMS_DIR, 'blog-posts', 'hello-world.json'), 'utf-8');
502
546
  const parsed = JSON.parse(raw);
503
547
  expect(parsed._isDraft).toBeUndefined();
504
548
  expect(parsed._hasDraft).toBeUndefined();
505
549
  });
506
550
  });
507
-
508
551
  });