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
@@ -1,61 +1,59 @@
1
- import { test, expect, describe } from "bun:test";
2
- import { normalizeOrphanTemplateProps } from "./normalizeOrphanTemplateProps";
3
- import type { ComponentDefinition } from "../../shared/types";
1
+ import { test, expect, describe } from 'bun:test';
2
+ import { normalizeOrphanTemplateProps } from './normalizeOrphanTemplateProps';
3
+ import type { ComponentDefinition } from '../../shared/types';
4
4
 
5
- describe("normalizeOrphanTemplateProps", () => {
5
+ describe('normalizeOrphanTemplateProps', () => {
6
6
  test("lifts an orphan {{x}} onto the component's interface as a string default", () => {
7
7
  const components: Record<string, ComponentDefinition> = {
8
8
  ArrowLink: {
9
9
  component: {
10
10
  interface: {},
11
11
  structure: {
12
- type: "node",
13
- tag: "span",
14
- children: ["{{ctaText}}"]
15
- }
16
- }
17
- }
12
+ type: 'node',
13
+ tag: 'span',
14
+ children: ['{{ctaText}}'],
15
+ },
16
+ },
17
+ },
18
18
  };
19
19
 
20
20
  const out = normalizeOrphanTemplateProps(components);
21
- const arrowIface = out.ArrowLink.component!.interface!;
21
+ const arrowIface = out.ArrowLink!.component!.interface!;
22
22
  expect(arrowIface.ctaText).toBeDefined();
23
- expect((arrowIface.ctaText as any).type).toBe("string");
24
- expect((arrowIface.ctaText as any).default).toBe("");
23
+ expect((arrowIface.ctaText as any).type).toBe('string');
24
+ expect((arrowIface.ctaText as any).default).toBe('');
25
25
  });
26
26
 
27
- test("forwards lifted props on an instance ref when the host declares the prop", () => {
27
+ test('forwards lifted props on an instance ref when the host declares the prop', () => {
28
28
  const components: Record<string, ComponentDefinition> = {
29
29
  ArrowLink: {
30
30
  component: {
31
31
  interface: {},
32
32
  structure: {
33
- type: "node",
34
- tag: "span",
35
- children: ["{{ctaText}}"]
36
- }
37
- }
33
+ type: 'node',
34
+ tag: 'span',
35
+ children: ['{{ctaText}}'],
36
+ },
37
+ },
38
38
  },
39
39
  Card: {
40
40
  component: {
41
41
  interface: {
42
- ctaText: { type: "string", default: "Click" } as any
42
+ ctaText: { type: 'string', default: 'Click' } as any,
43
43
  },
44
44
  structure: {
45
- type: "node",
46
- tag: "div",
47
- children: [
48
- { type: "component", component: "ArrowLink" } as any
49
- ]
50
- }
51
- }
52
- }
45
+ type: 'node',
46
+ tag: 'div',
47
+ children: [{ type: 'component', component: 'ArrowLink' } as any],
48
+ },
49
+ },
50
+ },
53
51
  };
54
52
 
55
53
  const out = normalizeOrphanTemplateProps(components);
56
- const cardChildren = (out.Card.component!.structure as any).children;
54
+ const cardChildren = (out.Card!.component!.structure as any).children;
57
55
  expect(cardChildren[0].props).toBeDefined();
58
- expect(cardChildren[0].props.ctaText).toBe("{{ctaText}}");
56
+ expect(cardChildren[0].props.ctaText).toBe('{{ctaText}}');
59
57
  });
60
58
 
61
59
  test("does NOT forward when the host doesn't declare the same prop", () => {
@@ -63,202 +61,200 @@ describe("normalizeOrphanTemplateProps", () => {
63
61
  ArrowLink: {
64
62
  component: {
65
63
  interface: {},
66
- structure: { type: "node", tag: "span", children: ["{{ctaText}}"] }
67
- }
64
+ structure: { type: 'node', tag: 'span', children: ['{{ctaText}}'] },
65
+ },
68
66
  },
69
67
  // Page-level wrapper that doesn't know about ctaText.
70
68
  Wrapper: {
71
69
  component: {
72
70
  interface: {},
73
71
  structure: {
74
- type: "node",
75
- tag: "div",
76
- children: [{ type: "component", component: "ArrowLink" } as any]
77
- }
78
- }
79
- }
72
+ type: 'node',
73
+ tag: 'div',
74
+ children: [{ type: 'component', component: 'ArrowLink' } as any],
75
+ },
76
+ },
77
+ },
80
78
  };
81
79
 
82
80
  const out = normalizeOrphanTemplateProps(components);
83
- const wrapperChildren = (out.Wrapper.component!.structure as any).children;
81
+ const wrapperChildren = (out.Wrapper!.component!.structure as any).children;
84
82
  // No forward — would have made Wrapper produce a new orphan ref.
85
83
  expect(wrapperChildren[0].props).toBeUndefined();
86
84
  });
87
85
 
88
- test("does not override an instance prop the host already passes", () => {
86
+ test('does not override an instance prop the host already passes', () => {
89
87
  const components: Record<string, ComponentDefinition> = {
90
88
  ArrowLink: {
91
89
  component: {
92
90
  interface: {},
93
- structure: { type: "node", tag: "span", children: ["{{ctaText}}"] }
94
- }
91
+ structure: { type: 'node', tag: 'span', children: ['{{ctaText}}'] },
92
+ },
95
93
  },
96
94
  Card: {
97
95
  component: {
98
96
  interface: {
99
- ctaText: { type: "string", default: "Click" } as any
97
+ ctaText: { type: 'string', default: 'Click' } as any,
100
98
  },
101
99
  structure: {
102
- type: "node",
103
- tag: "div",
100
+ type: 'node',
101
+ tag: 'div',
104
102
  children: [
105
103
  {
106
- type: "component",
107
- component: "ArrowLink",
108
- props: { ctaText: "Explicit value" }
109
- } as any
110
- ]
111
- }
112
- }
113
- }
104
+ type: 'component',
105
+ component: 'ArrowLink',
106
+ props: { ctaText: 'Explicit value' },
107
+ } as any,
108
+ ],
109
+ },
110
+ },
111
+ },
114
112
  };
115
113
 
116
114
  const out = normalizeOrphanTemplateProps(components);
117
- const cardChildren = (out.Card.component!.structure as any).children;
118
- expect(cardChildren[0].props.ctaText).toBe("Explicit value");
115
+ const cardChildren = (out.Card!.component!.structure as any).children;
116
+ expect(cardChildren[0].props.ctaText).toBe('Explicit value');
119
117
  });
120
118
 
121
- test("ignores cms.*, item.*, page.* refs (already namespaced)", () => {
119
+ test('ignores cms.*, item.*, page.* refs (already namespaced)', () => {
122
120
  const components: Record<string, ComponentDefinition> = {
123
121
  Title: {
124
122
  component: {
125
123
  interface: {},
126
124
  structure: {
127
- type: "node",
128
- tag: "h1",
129
- children: ["{{cms.title}} - {{page.slug}}"]
130
- }
131
- }
132
- }
125
+ type: 'node',
126
+ tag: 'h1',
127
+ children: ['{{cms.title}} - {{page.slug}}'],
128
+ },
129
+ },
130
+ },
133
131
  };
134
132
 
135
133
  const out = normalizeOrphanTemplateProps(components);
136
- expect(Object.keys(out.Title.component!.interface!)).toHaveLength(0);
134
+ expect(Object.keys(out.Title!.component!.interface!)).toHaveLength(0);
137
135
  });
138
136
 
139
- test("ignores list loop variables", () => {
137
+ test('ignores list loop variables', () => {
140
138
  const components: Record<string, ComponentDefinition> = {
141
139
  List: {
142
140
  component: {
143
141
  interface: {
144
- items: { type: "list", default: [], itemSchema: {} } as any
142
+ items: { type: 'list', default: [], itemSchema: {} } as any,
145
143
  },
146
144
  structure: {
147
- type: "list",
148
- sourceType: "prop",
149
- source: "items",
150
- itemAs: "row",
151
- children: [
152
- { type: "node", tag: "div", children: ["{{row.label}}"] }
153
- ]
154
- }
155
- }
156
- }
145
+ type: 'list',
146
+ sourceType: 'prop',
147
+ source: 'items',
148
+ itemAs: 'row',
149
+ children: [{ type: 'node', tag: 'div', children: ['{{row.label}}'] }],
150
+ },
151
+ },
152
+ },
157
153
  };
158
154
 
159
155
  const out = normalizeOrphanTemplateProps(components);
160
156
  // `row` is the loop var — must NOT be auto-lifted as a string prop.
161
- expect((out.List.component!.interface as any).row).toBeUndefined();
157
+ expect((out.List!.component!.interface as any).row).toBeUndefined();
162
158
  });
163
159
 
164
- test("ignores expressions with operators (not a bare ident)", () => {
160
+ test('ignores expressions with operators (not a bare ident)', () => {
165
161
  const components: Record<string, ComponentDefinition> = {
166
162
  Cmp: {
167
163
  component: {
168
164
  interface: {},
169
165
  structure: {
170
- type: "node",
171
- tag: "div",
172
- children: ["{{a + b}} {{x ? y : z}}"]
173
- }
174
- }
175
- }
166
+ type: 'node',
167
+ tag: 'div',
168
+ children: ['{{a + b}} {{x ? y : z}}'],
169
+ },
170
+ },
171
+ },
176
172
  };
177
173
 
178
174
  const out = normalizeOrphanTemplateProps(components);
179
175
  // Don't lift `a`, `b`, `x`, `y`, `z` from compound expressions — too
180
176
  // risky to guess types or what's actually intended.
181
- expect(Object.keys(out.Cmp.component!.interface!)).toHaveLength(0);
177
+ expect(Object.keys(out.Cmp!.component!.interface!)).toHaveLength(0);
182
178
  });
183
179
 
184
- test("does not mutate the input component definitions", () => {
180
+ test('does not mutate the input component definitions', () => {
185
181
  const components: Record<string, ComponentDefinition> = {
186
182
  ArrowLink: {
187
183
  component: {
188
184
  interface: {},
189
- structure: { type: "node", tag: "span", children: ["{{ctaText}}"] }
190
- }
191
- }
185
+ structure: { type: 'node', tag: 'span', children: ['{{ctaText}}'] },
186
+ },
187
+ },
192
188
  };
193
189
  const before = JSON.stringify(components);
194
190
  normalizeOrphanTemplateProps(components);
195
191
  expect(JSON.stringify(components)).toBe(before);
196
192
  });
197
193
 
198
- test("lifts a prop ref from a style _mapping object", () => {
194
+ test('lifts a prop ref from a style _mapping object', () => {
199
195
  const components: Record<string, ComponentDefinition> = {
200
196
  Cmp: {
201
197
  component: {
202
198
  interface: {},
203
199
  structure: {
204
- type: "node",
205
- tag: "div",
200
+ type: 'node',
201
+ tag: 'div',
206
202
  style: {
207
203
  base: {
208
204
  color: {
209
205
  _mapping: true,
210
- prop: "variant",
211
- values: { default: "black", featured: "white" }
212
- }
213
- }
214
- }
215
- } as any
216
- }
217
- }
206
+ prop: 'variant',
207
+ values: { default: 'black', featured: 'white' },
208
+ },
209
+ },
210
+ },
211
+ } as any,
212
+ },
213
+ },
218
214
  };
219
215
 
220
216
  const out = normalizeOrphanTemplateProps(components);
221
- expect((out.Cmp.component!.interface as any).variant).toBeDefined();
222
- expect((out.Cmp.component!.interface as any).variant.type).toBe("string");
217
+ expect((out.Cmp!.component!.interface as any).variant).toBeDefined();
218
+ expect((out.Cmp!.component!.interface as any).variant.type).toBe('string');
223
219
  });
224
220
 
225
- test("lifts a prop ref from an if boolean mapping", () => {
221
+ test('lifts a prop ref from an if boolean mapping', () => {
226
222
  const components: Record<string, ComponentDefinition> = {
227
223
  Cmp: {
228
224
  component: {
229
225
  interface: {},
230
226
  structure: {
231
- type: "node",
232
- tag: "span",
227
+ type: 'node',
228
+ tag: 'span',
233
229
  if: {
234
230
  _mapping: true,
235
- prop: "showBadge",
236
- values: { true: true, false: false }
237
- }
238
- } as any
239
- }
240
- }
231
+ prop: 'showBadge',
232
+ values: { true: true, false: false },
233
+ },
234
+ } as any,
235
+ },
236
+ },
241
237
  };
242
238
 
243
239
  const out = normalizeOrphanTemplateProps(components);
244
- expect((out.Cmp.component!.interface as any).showBadge).toBeDefined();
240
+ expect((out.Cmp!.component!.interface as any).showBadge).toBeDefined();
245
241
  });
246
242
 
247
- test("dotted ref {{link.href}} lifts the base name", () => {
243
+ test('dotted ref {{link.href}} lifts the base name', () => {
248
244
  const components: Record<string, ComponentDefinition> = {
249
245
  Anchor: {
250
246
  component: {
251
247
  interface: {},
252
248
  structure: {
253
- type: "node",
254
- tag: "a",
255
- attributes: { href: "{{link.href}}" }
256
- }
257
- }
258
- }
249
+ type: 'node',
250
+ tag: 'a',
251
+ attributes: { href: '{{link.href}}' },
252
+ },
253
+ },
254
+ },
259
255
  };
260
256
 
261
257
  const out = normalizeOrphanTemplateProps(components);
262
- expect((out.Anchor.component!.interface as any).link).toBeDefined();
258
+ expect((out.Anchor!.component!.interface as any).link).toBeDefined();
263
259
  });
264
260
  });
@@ -35,17 +35,9 @@ import type { ComponentDefinition, PropDefinition } from '../../shared/types';
35
35
  const BARE_IDENT_BODY = /^\s*([a-zA-Z_$][a-zA-Z0-9_$]*)(?:\s*\.\s*[a-zA-Z_$][a-zA-Z0-9_$]*)*\s*$/;
36
36
 
37
37
  // Namespaces and meta-vars that are never component-instance props.
38
- const RESERVED_BASES = new Set([
39
- 'cms', 'item', 'page',
40
- 'itemIndex', 'itemFirst', 'itemLast',
41
- ]);
38
+ const RESERVED_BASES = new Set(['cms', 'item', 'page', 'itemIndex', 'itemFirst', 'itemLast']);
42
39
 
43
- function recordRef(
44
- base: string,
45
- declared: Set<string>,
46
- listVars: Set<string>,
47
- out: Set<string>
48
- ): void {
40
+ function recordRef(base: string, declared: Set<string>, listVars: Set<string>, out: Set<string>): void {
49
41
  if (RESERVED_BASES.has(base)) return;
50
42
  if (listVars.has(base)) return;
51
43
  if (declared.has(base)) return;
@@ -56,12 +48,13 @@ function findOrphanRefs(value: unknown, declared: Set<string>, listVars: Set<str
56
48
  if (value == null) return;
57
49
  if (typeof value === 'string') {
58
50
  const re = /\{\{([^}]+)\}\}/g;
59
- let m: RegExpExecArray | null;
60
- while ((m = re.exec(value)) !== null) {
61
- const body = m[1];
51
+ let m: RegExpExecArray | null = re.exec(value);
52
+ while (m !== null) {
53
+ const body = m[1] ?? '';
54
+ m = re.exec(value);
62
55
  const idMatch = body.match(BARE_IDENT_BODY);
63
56
  if (!idMatch) continue; // expressions, operators, calls — skip
64
- recordRef(idMatch[1], declared, listVars, out);
57
+ recordRef(idMatch[1] ?? '', declared, listVars, out);
65
58
  }
66
59
  return;
67
60
  }
@@ -111,7 +104,7 @@ function findOrphanRefs(value: unknown, declared: Set<string>, listVars: Set<str
111
104
  function forwardLiftedPropsOnInstances(
112
105
  structure: unknown,
113
106
  hostProps: Set<string>,
114
- liftedByComp: ReadonlyMap<string, ReadonlySet<string>>
107
+ liftedByComp: ReadonlyMap<string, ReadonlySet<string>>,
115
108
  ): void {
116
109
  if (structure == null || typeof structure !== 'object') return;
117
110
  if (Array.isArray(structure)) {
@@ -143,7 +136,7 @@ function forwardLiftedPropsOnInstances(
143
136
  * The input map is not mutated.
144
137
  */
145
138
  export function normalizeOrphanTemplateProps(
146
- components: Record<string, ComponentDefinition>
139
+ components: Record<string, ComponentDefinition>,
147
140
  ): Record<string, ComponentDefinition> {
148
141
  const next: Record<string, ComponentDefinition> = {};
149
142
  const liftedByComp = new Map<string, Set<string>>();
@@ -156,7 +149,7 @@ export function normalizeOrphanTemplateProps(
156
149
  next[name] = cloned;
157
150
 
158
151
  const comp = cloned.component;
159
- if (!comp || !comp.structure) continue;
152
+ if (!comp?.structure) continue;
160
153
  const iface = (comp.interface ?? {}) as Record<string, PropDefinition>;
161
154
  const declared = new Set(Object.keys(iface));
162
155
  const orphans = new Set<string>();
@@ -175,7 +168,7 @@ export function normalizeOrphanTemplateProps(
175
168
  // same prop. Mutates the cloned structures in `next`.
176
169
  for (const [, hostDef] of Object.entries(next)) {
177
170
  const comp = hostDef.component;
178
- if (!comp || !comp.structure) continue;
171
+ if (!comp?.structure) continue;
179
172
  const hostProps = new Set(Object.keys(comp.interface ?? {}));
180
173
  forwardLiftedPropsOnInstances(comp.structure, hostProps, liftedByComp);
181
174
  }
@@ -198,9 +198,7 @@ export function emitAstroPage(options: PageEmitOptions): string {
198
198
  }
199
199
 
200
200
  // Build script paths array
201
- const scriptsArrayLiteral = scriptPaths.length > 0
202
- ? `[${scriptPaths.map((s) => `"${s}"`).join(', ')}]`
203
- : '[]';
201
+ const scriptsArrayLiteral = scriptPaths.length > 0 ? `[${scriptPaths.map((s) => `"${s}"`).join(', ')}]` : '[]';
204
202
 
205
203
  // Build library tags literal
206
204
  const libraryTagsLiteral = `{ headCSS: \`${escapeTemplateLiteral(libraryTags.headCSS || '')}\`, headJS: \`${escapeTemplateLiteral(libraryTags.headJS || '')}\`, bodyEndJS: \`${escapeTemplateLiteral(libraryTags.bodyEndJS || '')}\` }`;
@@ -209,14 +207,14 @@ export function emitAstroPage(options: PageEmitOptions): string {
209
207
  const escapedFontPreloads = escapeTemplateLiteral(fontPreloads);
210
208
 
211
209
  // Collect frontmatter lines from list emission (e.g., getCollection calls)
212
- const extraFrontmatter = ctx.frontmatterLines && ctx.frontmatterLines.length > 0
213
- ? '\n' + ctx.frontmatterLines.join('\n')
214
- : '';
210
+ const extraFrontmatter =
211
+ ctx.frontmatterLines && ctx.frontmatterLines.length > 0 ? `\n${ctx.frontmatterLines.join('\n')}` : '';
215
212
 
216
213
  // Generate interactive style block for page-level interactive styles
217
- const interactiveStyleSection = ctx.collectedInteractiveStyles!.size > 0
218
- ? `\n<style is:global>\n${generateAllInteractiveCSS(ctx.collectedInteractiveStyles!, breakpoints, remConfig, responsiveScales)}\n</style>\n`
219
- : '';
214
+ const interactiveStyleSection =
215
+ ctx.collectedInteractiveStyles!.size > 0
216
+ ? `\n<style is:global>\n${generateAllInteractiveCSS(ctx.collectedInteractiveStyles!, breakpoints, remConfig, responsiveScales)}\n</style>\n`
217
+ : '';
220
218
 
221
219
  return `---
222
220
  ${importLines.join('\n')}${extraFrontmatter}
@@ -247,13 +245,11 @@ function buildEmptyPage(
247
245
  theme: string,
248
246
  fontPreloads: string,
249
247
  libraryTags: { headCSS?: string; headJS?: string; bodyEndJS?: string },
250
- scriptPaths: string[]
248
+ scriptPaths: string[],
251
249
  ): string {
252
250
  const escapedMeta = escapeTemplateLiteral(meta);
253
251
  const escapedFontPreloads = escapeTemplateLiteral(fontPreloads);
254
- const scriptsArrayLiteral = scriptPaths.length > 0
255
- ? `[${scriptPaths.map((s) => `"${s}"`).join(', ')}]`
256
- : '[]';
252
+ const scriptsArrayLiteral = scriptPaths.length > 0 ? `[${scriptPaths.map((s) => `"${s}"`).join(', ')}]` : '[]';
257
253
  const libraryTagsLiteral = `{ headCSS: \`${escapeTemplateLiteral(libraryTags.headCSS || '')}\`, headJS: \`${escapeTemplateLiteral(libraryTags.headJS || '')}\`, bodyEndJS: \`${escapeTemplateLiteral(libraryTags.bodyEndJS || '')}\` }`;
258
254
 
259
255
  return `---
@@ -23,24 +23,16 @@ const scalesDisabled: ResponsiveScales = {
23
23
 
24
24
  describe('responsiveStylesToTailwind — auto-responsive scaling', () => {
25
25
  test('emits scaled max-[Npx]: variants for base scalable property', () => {
26
- const { classes } = responsiveStylesToTailwind(
27
- { base: { padding: '40px' } },
28
- DEFAULT_BREAKPOINTS,
29
- scalesEnabled
30
- );
26
+ const { classes } = responsiveStylesToTailwind({ base: { padding: '40px' } }, DEFAULT_BREAKPOINTS, scalesEnabled);
31
27
  // base: 40px; tablet: 40 + (40-16)*(0.75-1) = 34px; mobile: 40 + (40-16)*(0.5-1) = 28px
32
- expect(classes).toEqual([
33
- 'p-[40px]',
34
- 'max-[1024px]:p-[34px]',
35
- 'max-[540px]:p-[28px]',
36
- ]);
28
+ expect(classes).toEqual(['p-[40px]', 'max-[1024px]:p-[34px]', 'max-[540px]:p-[28px]']);
37
29
  });
38
30
 
39
31
  test('explicit breakpoint override wins — no auto-scaled variant for that breakpoint/property pair', () => {
40
32
  const { classes } = responsiveStylesToTailwind(
41
33
  { base: { padding: '40px' }, tablet: { padding: '30px' } },
42
34
  DEFAULT_BREAKPOINTS,
43
- scalesEnabled
35
+ scalesEnabled,
44
36
  );
45
37
  expect(classes).toContain('p-[40px]');
46
38
  expect(classes).toContain('max-[1024px]:p-[30px]');
@@ -51,15 +43,8 @@ describe('responsiveStylesToTailwind — auto-responsive scaling', () => {
51
43
  });
52
44
 
53
45
  test('scaling disabled → output identical to no-scaling path', () => {
54
- const withScales = responsiveStylesToTailwind(
55
- { base: { padding: '40px' } },
56
- DEFAULT_BREAKPOINTS,
57
- scalesDisabled
58
- );
59
- const withoutScales = responsiveStylesToTailwind(
60
- { base: { padding: '40px' } },
61
- DEFAULT_BREAKPOINTS
62
- );
46
+ const withScales = responsiveStylesToTailwind({ base: { padding: '40px' } }, DEFAULT_BREAKPOINTS, scalesDisabled);
47
+ const withoutScales = responsiveStylesToTailwind({ base: { padding: '40px' } }, DEFAULT_BREAKPOINTS);
63
48
  expect(withScales.classes).toEqual(withoutScales.classes);
64
49
  expect(withScales.classes).toEqual(['p-[40px]']);
65
50
  });
@@ -68,17 +53,13 @@ describe('responsiveStylesToTailwind — auto-responsive scaling', () => {
68
53
  const { classes } = responsiveStylesToTailwind(
69
54
  { base: { padding: '8px' } }, // 8 < 16 → stays unchanged → skipped
70
55
  DEFAULT_BREAKPOINTS,
71
- scalesEnabled
56
+ scalesEnabled,
72
57
  );
73
58
  expect(classes).toEqual(['p-[8px]']);
74
59
  });
75
60
 
76
61
  test('non-scalable property (e.g. color) is left untouched', () => {
77
- const { classes } = responsiveStylesToTailwind(
78
- { base: { color: '#abc' } },
79
- DEFAULT_BREAKPOINTS,
80
- scalesEnabled
81
- );
62
+ const { classes } = responsiveStylesToTailwind({ base: { color: '#abc' } }, DEFAULT_BREAKPOINTS, scalesEnabled);
82
63
  // Just the base color class — no max-[Npx] prefix because color isn't in any scale category
83
64
  expect(classes.filter((c) => c.startsWith('max-['))).toEqual([]);
84
65
  });
@@ -87,7 +68,7 @@ describe('responsiveStylesToTailwind — auto-responsive scaling', () => {
87
68
  const { classes } = responsiveStylesToTailwind(
88
69
  { base: { padding: '40px 80px' } },
89
70
  DEFAULT_BREAKPOINTS,
90
- scalesEnabled
71
+ scalesEnabled,
91
72
  );
92
73
  // tablet: 40→34, 80→64; mobile: 40→28, 80→48
93
74
  expect(classes).toContain('max-[1024px]:p-[34px_64px]');
@@ -95,22 +76,14 @@ describe('responsiveStylesToTailwind — auto-responsive scaling', () => {
95
76
  });
96
77
 
97
78
  test('flat style object (no `base`) gets no auto-scaling', () => {
98
- const { classes } = responsiveStylesToTailwind(
99
- { padding: '40px' },
100
- DEFAULT_BREAKPOINTS,
101
- scalesEnabled
102
- );
79
+ const { classes } = responsiveStylesToTailwind({ padding: '40px' }, DEFAULT_BREAKPOINTS, scalesEnabled);
103
80
  // A flat style is treated as base with no breakpoints — nothing to
104
81
  // auto-scale *into*. The scaling pass only runs on the responsive branch.
105
82
  expect(classes.filter((c) => c.startsWith('max-['))).toEqual([]);
106
83
  });
107
84
 
108
85
  test('fontSize scales using the fontSize category', () => {
109
- const { classes } = responsiveStylesToTailwind(
110
- { base: { fontSize: '100px' } },
111
- DEFAULT_BREAKPOINTS,
112
- scalesEnabled
113
- );
86
+ const { classes } = responsiveStylesToTailwind({ base: { fontSize: '100px' } }, DEFAULT_BREAKPOINTS, scalesEnabled);
114
87
  // tablet: 100 + (100-16)*(0.88-1) = 100 - 10.08 = round(89.92) = 90
115
88
  // mobile: 100 + (100-16)*(0.75-1) = 100 - 21 = 79
116
89
  expect(classes).toContain('max-[1024px]:text-[length:90px]');