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,49 +0,0 @@
1
- /**
2
- * Webflow Designer Extension template wrapper.
3
- *
4
- * The Webflow Designer injects the `webflow` API global only when extension
5
- * HTML is wrapped in a template fetched from `webflow-ext.com`. This module
6
- * fetches the template once per process, caches it, then splices the
7
- * extension's <head>/<body> content into the `{{ui}}` placeholder.
8
- *
9
- * Used by both the studio's mounted `/webflow-extension/*` route and the
10
- * standalone serve.ts on port 1337, so they stay in sync automatically.
11
- */
12
-
13
- import { readFile } from 'fs/promises';
14
-
15
- let cachedTemplate: string | null = null;
16
-
17
- async function getWebflowTemplate(appName: string): Promise<string> {
18
- if (cachedTemplate) return cachedTemplate;
19
- const url = `https://webflow-ext.com/template/v2?name=${encodeURIComponent(appName)}`;
20
- const res = await fetch(url);
21
- if (!res.ok) throw new Error(`Failed to fetch Webflow template: ${res.status}`);
22
- cachedTemplate = await res.text();
23
- return cachedTemplate;
24
- }
25
-
26
- /**
27
- * Wrap extension HTML in the Webflow Designer template.
28
- * `manifestPath` points to the extension's `webflow.json` — its `name` field
29
- * is forwarded as the `?name=` query param to webflow-ext.com.
30
- *
31
- * On any failure (manifest read, template fetch) we log a warning and return
32
- * the raw HTML, matching the prior behavior of the two duplicate copies.
33
- */
34
- export async function wrapInWebflowTemplate(html: string, manifestPath: string): Promise<string> {
35
- try {
36
- const manifest = JSON.parse(await readFile(manifestPath, 'utf-8'));
37
- const template = await getWebflowTemplate(manifest.name || 'Meno Import');
38
-
39
- const headMatch = html.match(/<head[^>]*>([\s\S]*?)<\/head>/i);
40
- const bodyMatch = html.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
41
- const headContent = headMatch ? headMatch[1] : '';
42
- const bodyContent = bodyMatch ? bodyMatch[1] : '';
43
-
44
- return template.replace('{{ui}}', headContent + bodyContent);
45
- } catch (err: any) {
46
- console.warn('Could not fetch Webflow wrapper template:', err.message);
47
- return html;
48
- }
49
- }
@@ -1,396 +0,0 @@
1
- /**
2
- * Webflow Export Types
3
- * Defines the payload structure for Webflow Designer API consumption.
4
- */
5
-
6
- import type { CMSFieldType } from '../../shared/types/cms';
7
-
8
- // ---------------------------------------------------------------------------
9
- // Style Classes
10
- // ---------------------------------------------------------------------------
11
-
12
- /**
13
- * Webflow Designer API breakpoint identifiers.
14
- * `main` is the desktop / default tier; `xxl|xl|large` are above-desktop;
15
- * `medium|small|tiny` are below-desktop.
16
- * Reference: https://developers.webflow.com/designer/reference/set-style-properties
17
- */
18
- export type WebflowBreakpoint =
19
- | 'xxl'
20
- | 'xl'
21
- | 'large'
22
- | 'main'
23
- | 'medium'
24
- | 'small'
25
- | 'tiny';
26
-
27
- /**
28
- * Webflow Designer API pseudo-state identifiers.
29
- * Reference: https://developers.webflow.com/designer/reference/set-style-properties
30
- */
31
- export type WebflowPseudoState =
32
- | 'noPseudo'
33
- | 'hover'
34
- | 'focus'
35
- | 'focus-visible'
36
- | 'focus-within'
37
- | 'active'
38
- | 'visited'
39
- | 'pressed'
40
- | 'before'
41
- | 'after'
42
- | 'placeholder'
43
- | 'empty'
44
- | 'first-child'
45
- | 'last-child'
46
- | 'nth-child(odd)'
47
- | 'nth-child(even)';
48
-
49
- /** CSS properties as a flat record */
50
- export type CSSProperties = Record<string, string>;
51
-
52
- /** A named Webflow style class with responsive + pseudo-state overrides */
53
- export interface WebflowStyleClass {
54
- /** Unique class name (e.g., "navigation-hamburger" for components, "p-about-grid5" for pages) */
55
- name: string;
56
- /** Base (Desktop) CSS properties */
57
- base: CSSProperties;
58
- /** Breakpoint overrides */
59
- breakpoints?: Partial<Record<WebflowBreakpoint, CSSProperties>>;
60
- /** Pseudo-state overrides */
61
- pseudoStates?: Partial<Record<WebflowPseudoState, CSSProperties>>;
62
- /** Combo class parent (if this is a variant class) */
63
- comboParent?: string;
64
- }
65
-
66
- // ---------------------------------------------------------------------------
67
- // Elements
68
- // ---------------------------------------------------------------------------
69
-
70
- /** A Webflow element (DOM node) */
71
- export interface WebflowElement {
72
- /** HTML tag (div, section, h1, a, img, etc.) */
73
- tag: string;
74
- /** Primary class name applied to this element */
75
- className?: string;
76
- /** Additional combo class names (for StyleMapping variants) */
77
- comboClasses?: string[];
78
- /** Inline text content (for text nodes) */
79
- textContent?: string;
80
- /**
81
- * Child elements. Plain strings are inline text runs (Webflow String nodes)
82
- * — used for mixed content like `<h1>foo <span>bar</span> baz</h1>`.
83
- */
84
- children?: Array<WebflowElement | string>;
85
- /** HTML attributes (src, alt, href, target, etc.) */
86
- attributes?: Record<string, string | number | boolean>;
87
- /**
88
- * Inline SVG markup for an embed node. The Webflow extension uploads this
89
- * as an `image/svg+xml` asset and emits an Image element — Webflow's
90
- * Designer API has no public method to set HtmlEmbed code content.
91
- */
92
- svgSource?: string;
93
- /** Source URL for an `<img>`-rooted embed; uploaded into Webflow as an asset. */
94
- imageSrc?: string;
95
- /** Alt text paired with `svgSource` / `imageSrc`. */
96
- imageAlt?: string;
97
- /**
98
- * Pre-fetched image bytes for `<img>` / embed elements whose source URL
99
- * the Webflow Designer iframe can't reach (e.g. project-relative paths
100
- * like `/images/foo.webp`, which would resolve against `designer.webflow.com`).
101
- * The extension uploads these directly via `createAsset` instead of
102
- * `fetch`-ing them.
103
- */
104
- imageDataBase64?: string;
105
- imageDataMime?: string;
106
- imageDataFileName?: string;
107
- /**
108
- * Embed payload that is neither SVG nor a single `<img>`. The extension
109
- * logs it and skips insertion (no equivalent Webflow API exists).
110
- */
111
- unsupportedEmbed?: { reason: string; preview: string; label?: string };
112
- /**
113
- * When set, this element is an instance of a Webflow Component registered
114
- * via `payload.components`. The extension appends the registered Component
115
- * (looked up by name) instead of building children. `tag`/`className`/etc.
116
- * remain set as a fallback for older extensions that don't understand
117
- * `componentRef`.
118
- */
119
- componentRef?: string;
120
- /**
121
- * Inline-expanded element tree to use when the Webflow Designer API can't
122
- * register Components (older runtime, missing `canCreateComponents`
123
- * permission). Mirrors the pre-promotion expansion of the Meno component so
124
- * the extension can render the same markup it does today.
125
- */
126
- inlineFallback?: WebflowElement[];
127
- /**
128
- * Bound CMS list marker. When set, this element is the synthetic wrapper
129
- * for `<list sourceType="collection">` emitted in bound mode (see
130
- * `buildWebflowPayload({ bindCollectionLists: true })`). Value is the Meno
131
- * collection slug; the extension translates that to a Webflow collection
132
- * ID via the v1 sync ID map and inserts a `DynamoWrapper` preset.
133
- * Children are the *single* rendered item template (not N copies), with
134
- * field references preserved as `menoBind` markers below.
135
- */
136
- menoCollectionRef?: string;
137
- /**
138
- * Per-element CMS field binding markers. Captured at server emit time from
139
- * the source `{{field}}` template; the extension translates them into
140
- * `data-meno-bind-*` custom attributes on the inserted element and surfaces
141
- * a manual-bind checklist. Webflow's Designer API has no `setBinding` /
142
- * `setCollection` write surface yet (Apr 2026 — confirmed by Webflow
143
- * staff Plata + Selser on the developer forum), so the user does the
144
- * actual field binding once in the Designer UI after insertion.
145
- */
146
- menoBind?: {
147
- /** Bind this element's text content to this CMS field slug. */
148
- textField?: string;
149
- /** Map of attribute name → CMS field slug to bind. */
150
- attrFields?: Record<string, string>;
151
- };
152
- }
153
-
154
- // ---------------------------------------------------------------------------
155
- // Bound-list sentinel (server-side internal — extension consumes `menoBind`)
156
- // ---------------------------------------------------------------------------
157
-
158
- /**
159
- * String sentinel inserted in place of a real CMS field value when emitting a
160
- * bound Collection List. The existing template engine is reused unchanged: a
161
- * synthetic placeholder item maps every schema field to
162
- * `${SENTINEL_PREFIX}${fieldSlug}${SENTINEL_SUFFIX}`, so `{{post.title}}`
163
- * resolves to that string. A post-walk then converts those strings into
164
- * `WebflowElement.menoBind` markers and replaces them with a readable
165
- * placeholder so the user can see what each child is meant to display.
166
- */
167
- export const MENO_BIND_SENTINEL_PREFIX = '__MENO_BIND__:';
168
- export const MENO_BIND_SENTINEL_SUFFIX = ':__';
169
- export const MENO_BIND_SENTINEL_RE = /__MENO_BIND__:([^:]+):__/g;
170
- export const MENO_BIND_SENTINEL_EXACT_RE = /^__MENO_BIND__:([^:]+):__$/;
171
-
172
- /** Synthetic tag for the bound Collection List wrapper. */
173
- export const COLLECTION_LIST_TAG = '__collection_list__';
174
-
175
- /**
176
- * A Meno component promoted to a Webflow Component. The extension calls
177
- * `webflow.registerComponent` once per entry, then `parent.append(component)`
178
- * for every element in the page tree that has a matching `componentRef`.
179
- */
180
- export interface WebflowComponentDef {
181
- /** Component name as it appears in Webflow's Components panel. */
182
- name: string;
183
- /** Element tree that becomes the Component's body. */
184
- elements: WebflowElement[];
185
- }
186
-
187
- // ---------------------------------------------------------------------------
188
- // Pages
189
- // ---------------------------------------------------------------------------
190
-
191
- /** A Webflow page */
192
- export interface WebflowPage {
193
- /** Page title */
194
- title: string;
195
- /** URL slug (e.g., "about", "blog/post-1") */
196
- slug: string;
197
- /** Meta description */
198
- description?: string;
199
- /** Comma-separated keywords from page meta */
200
- keywords?: string;
201
- /** Open Graph title */
202
- ogTitle?: string;
203
- /** Open Graph description */
204
- ogDescription?: string;
205
- /** Open Graph image URL */
206
- ogImage?: string;
207
- /** Root elements of the page body */
208
- elements: WebflowElement[];
209
- /** Locale code */
210
- locale?: string;
211
- }
212
-
213
- /**
214
- * A component-level script bundled into the export. The Webflow extension
215
- * concatenates these into a single `<script>` injected at the end of `<body>`
216
- * so interactive Meno components (FAQ accordion, dropdowns, mobile menu) work
217
- * once published.
218
- */
219
- export interface WebflowScript {
220
- /** Component name (used by the runtime to find element instances). */
221
- componentName: string;
222
- /** Component's JavaScript code (verbatim from `Component.js`). */
223
- code: string;
224
- /** Whether the source defined defineVars (true / explicit list / undefined). */
225
- defineVars?: true | string[];
226
- }
227
-
228
- // ---------------------------------------------------------------------------
229
- // CMS
230
- // ---------------------------------------------------------------------------
231
-
232
- /** Webflow CMS field type mapping */
233
- export type WebflowFieldType =
234
- | 'PlainText'
235
- | 'RichText'
236
- | 'Number'
237
- | 'Switch'
238
- | 'Image'
239
- | 'Date'
240
- | 'Option'
241
- | 'File'
242
- | 'Reference';
243
-
244
- /** A field in a Webflow CMS collection */
245
- export interface WebflowCMSField {
246
- /** Field display name */
247
- name: string;
248
- /** Field slug (machine name) */
249
- slug: string;
250
- /** Webflow field type */
251
- type: WebflowFieldType;
252
- /** Whether this field is required */
253
- required?: boolean;
254
- /** Options for Option type fields */
255
- options?: string[];
256
- /** Help text shown to editors in the Webflow CMS UI */
257
- helpText?: string;
258
- /**
259
- * For Reference fields: Meno collection slug of the target collection.
260
- * The sync orchestrator resolves this to a Webflow collection ID at create
261
- * time (pass 2 of the two-pass collection create — references can only be
262
- * added once their target exists).
263
- */
264
- referenceCollection?: string;
265
- /** True for multi-reference (array of IDs); false / undefined for single ref. */
266
- multiReference?: boolean;
267
- }
268
-
269
- /** A Webflow CMS collection definition */
270
- export interface WebflowCMSCollection {
271
- /** Collection display name (plural) */
272
- name: string;
273
- /** Singular form of the display name (Webflow requires this for new collections) */
274
- singularName: string;
275
- /** Collection slug */
276
- slug: string;
277
- /** URL pattern for detail pages */
278
- urlPattern?: string;
279
- /** Field definitions */
280
- fields: WebflowCMSField[];
281
- /** Collection items */
282
- items: Record<string, unknown>[];
283
- }
284
-
285
- // ---------------------------------------------------------------------------
286
- // Assets
287
- // ---------------------------------------------------------------------------
288
-
289
- /** Reference to an asset that needs uploading to Webflow */
290
- export interface WebflowAssetRef {
291
- /** Local file path relative to project root */
292
- localPath: string;
293
- /** Asset type */
294
- type: 'image' | 'font' | 'video' | 'file';
295
- /** File name */
296
- fileName: string;
297
- }
298
-
299
- // ---------------------------------------------------------------------------
300
- // Export Payload
301
- // ---------------------------------------------------------------------------
302
-
303
- /** Per-locale slug mapping for a single source page */
304
- export interface WebflowSlugMap {
305
- /** The page's canonical id (e.g., "about", "blog/post-1") */
306
- pageId: string;
307
- /** Locale code → translated slug */
308
- slugs: Record<string, string>;
309
- }
310
-
311
- /** Complete Webflow export payload */
312
- export interface WebflowExportPayload {
313
- /** Export format version */
314
- version: 1;
315
- /** Timestamp of export */
316
- exportedAt: string;
317
- /** All pages with their element trees */
318
- pages: WebflowPage[];
319
- /** All style class definitions */
320
- styles: WebflowStyleClass[];
321
- /** CMS collection definitions (if any) */
322
- cms: WebflowCMSCollection[];
323
- /** Asset references (images, fonts, etc.) */
324
- assets: WebflowAssetRef[];
325
- /** Per-locale slug translations so the consumer can route between locales */
326
- slugMappings?: WebflowSlugMap[];
327
- /** Component scripts — bundled at body end so components stay interactive. */
328
- scripts?: WebflowScript[];
329
- /**
330
- * Meno components promoted to Webflow Components (currently `Navigation`
331
- * and `Footer`). The extension registers each one before inserting page
332
- * elements; pages reference them via `WebflowElement.componentRef`.
333
- */
334
- components?: WebflowComponentDef[];
335
- /**
336
- * Concatenated `Component.css` sidecars (raw CSS) for components that ship
337
- * hand-written styles. Component-scoped rules — data-attribute selectors,
338
- * runtime state classes (e.g. `.is-open`), `:checked ~` siblings — aren't
339
- * representable in Webflow's class system and are silently lost when only
340
- * the per-element classes are emitted. The user pastes this into Site
341
- * Settings → Custom Code → Head Code along with the combo-class overrides.
342
- */
343
- componentCss?: string;
344
- /**
345
- * Raw CSS for `interactiveStyles` rules that Webflow's class system can't
346
- * represent natively — anything with a `prefix` (descendant/sibling
347
- * selector built from a state class on an ancestor), a class-style
348
- * `postfix` like `.is-open`, or breakpoint-divided pseudo states.
349
- * Pseudo-only rules with empty prefix continue to flow through Webflow's
350
- * `Style.setProperties({ pseudo })`. Pasted into Site Settings → Custom
351
- * Code → Head Code along with `componentCss`.
352
- */
353
- interactiveCss?: string;
354
- /**
355
- * Project i18n summary so the extension can show a locale picker. Always
356
- * present; single-locale projects still receive their lone locale here.
357
- * `selectedLocale` reflects which locale's pages were emitted in this
358
- * payload — the extension uses it to round-trip the picker selection.
359
- */
360
- i18n?: {
361
- defaultLocale: string;
362
- locales: Array<{ code: string; name: string; nativeName?: string }>;
363
- selectedLocale: string;
364
- };
365
- }
366
-
367
- // ---------------------------------------------------------------------------
368
- // Helpers
369
- // ---------------------------------------------------------------------------
370
-
371
- /** Map Meno CMS field type → Webflow field type */
372
- export function mapCMSFieldType(menoType: CMSFieldType): WebflowFieldType {
373
- switch (menoType) {
374
- case 'string':
375
- return 'PlainText';
376
- case 'text':
377
- case 'rich-text':
378
- return 'RichText';
379
- case 'number':
380
- return 'Number';
381
- case 'boolean':
382
- return 'Switch';
383
- case 'image':
384
- return 'Image';
385
- case 'date':
386
- return 'Date';
387
- case 'select':
388
- return 'Option';
389
- case 'file':
390
- return 'File';
391
- case 'reference':
392
- return 'Reference';
393
- default:
394
- return 'PlainText';
395
- }
396
- }