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
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Permission Types
3
+ *
4
+ * Per-resource, soft (UI-coordination) edit permissions keyed by GitHub
5
+ * identity. The policy lives in `.meno/permissions.json` at the project root
6
+ * (committed, so every clone resolves the SAME policy locally). GitHub stays
7
+ * the identity + grouping authority (logins, teams, repo-admin bit); this model
8
+ * owns what those map to in editor terms.
9
+ *
10
+ * Enforcement tier is SOFT: these types drive UI gating (read-only editor
11
+ * paths, disabled save), not an adversarial security boundary — a user with the
12
+ * clone can always edit files directly. Hard enforcement (a CI check on PRs)
13
+ * is a later, additive layer that reads the same policy file.
14
+ *
15
+ * This module is pure data + types; the resolver lives in `../permissions.ts`.
16
+ */
17
+
18
+ /** Permission tiers, lowest → highest capability. */
19
+ export type PermissionRole = 'viewer' | 'editor' | 'admin';
20
+
21
+ export const PERMISSION_ROLES = ['viewer', 'editor', 'admin'] as const satisfies readonly PermissionRole[];
22
+
23
+ /**
24
+ * The editable unit kinds of a Meno project. Mirrors the on-disk layout:
25
+ * - `page` → `src/pages/<slug>.astro` (id = page slug, e.g. `blog/post`)
26
+ * - `component` → `src/components/<Name>.astro` (id = component name)
27
+ * - `cms` → `src/content/<collectionId>/` (id = collection id; items inherit)
28
+ * - `config` → root config files (id = a {@link ConfigArea})
29
+ */
30
+ export type ResourceKind = 'page' | 'component' | 'cms' | 'config';
31
+
32
+ export const RESOURCE_KINDS: readonly ResourceKind[] = ['page', 'component', 'cms', 'config'] as const;
33
+
34
+ /**
35
+ * Named global-config capabilities (the `config` resource kind's id namespace):
36
+ * - `project` → `project.config.json` (site URL, breakpoints, fonts, …)
37
+ * - `colors` → `colors.json`
38
+ * - `variables` → `variables.json`
39
+ * - `i18n` → locale config inside `project.config.json`
40
+ *
41
+ * NOTE: `i18n` lives *inside* `project.config.json`, so the CI checker (which
42
+ * maps whole files) enforces it at `project` granularity — granting `i18n`
43
+ * without `project` is advisory only (no file maps to it on its own), and
44
+ * granting `project` implies `i18n`.
45
+ */
46
+ export type ConfigArea = 'project' | 'colors' | 'variables' | 'i18n';
47
+
48
+ export const CONFIG_AREAS: readonly ConfigArea[] = ['project', 'colors', 'variables', 'i18n'] as const;
49
+
50
+ /**
51
+ * A reference to one editable resource, checked against a {@link PermissionRule}.
52
+ * `id` is matched against the rule's glob list for `kind` (see
53
+ * `matchesPermissionPattern`).
54
+ */
55
+ export interface ResourceRef {
56
+ kind: ResourceKind;
57
+ /** page slug | component name | collection id | config area. */
58
+ id: string;
59
+ }
60
+
61
+ /**
62
+ * Per-resource-kind allow-lists. Each entry is a glob pattern (`*` matches any
63
+ * run of characters, including `/`) matched against a {@link ResourceRef.id}.
64
+ * Only consulted for the `editor` role — `viewer` edits nothing, `admin`
65
+ * edits everything. An absent/empty list for a kind means "no resources of
66
+ * that kind".
67
+ */
68
+ export interface PermissionRule {
69
+ /** Page slugs, e.g. `["blog/*", "about"]`. */
70
+ pages?: string[];
71
+ /** Component names, e.g. `["Card", "*Hero"]`. */
72
+ components?: string[];
73
+ /** CMS collection ids, e.g. `["posts", "*"]`. */
74
+ cms?: string[];
75
+ /** Config areas, e.g. `["colors", "variables"]` or `["*"]`. */
76
+ config?: string[];
77
+ }
78
+
79
+ /**
80
+ * One person's or team's grant. `role` defaults to `editor` when `allow` is
81
+ * present, otherwise `viewer`.
82
+ */
83
+ export interface PermissionGrant {
84
+ role?: PermissionRole;
85
+ /** Editable resources — only meaningful for the `editor` role. */
86
+ allow?: PermissionRule;
87
+ }
88
+
89
+ /** Current `version` value written by this app. */
90
+ export const CURRENT_PERMISSIONS_VERSION = 1;
91
+
92
+ /**
93
+ * The committed `.meno/permissions.json` document. Logins/team slugs are
94
+ * matched case-insensitively (GitHub logins are case-insensitive).
95
+ */
96
+ export interface PermissionsPolicy {
97
+ /** Schema version. {@link CURRENT_PERMISSIONS_VERSION} for documents this app writes. */
98
+ version: number;
99
+ /** Role for authenticated users not listed in `members`/`teams`. Defaults to `viewer`. */
100
+ defaultRole?: PermissionRole;
101
+ /** Per-GitHub-login grants. */
102
+ members?: Record<string, PermissionGrant>;
103
+ /** Per-GitHub-team-slug grants (a user's grants are the union over their teams). */
104
+ teams?: Record<string, PermissionGrant>;
105
+ }
106
+
107
+ /**
108
+ * Who is asking, resolved from the GitHub session. `login: null` means
109
+ * unauthenticated / no GitHub identity (a local project, or a non-electron
110
+ * run) — see {@link PermissionsPolicy} handling in the resolver.
111
+ */
112
+ export interface PermissionIdentity {
113
+ /** GitHub login, or `null` when unauthenticated. */
114
+ login: string | null;
115
+ /** GitHub team slugs the user belongs to (for `teams` grants). */
116
+ teams?: string[];
117
+ /**
118
+ * GitHub repo `permissions.admin`. Repo admins are ALWAYS treated as admin
119
+ * here (bootstrap safety — a policy can't lock the repo owner out).
120
+ */
121
+ isRepoAdmin?: boolean;
122
+ }
123
+
124
+ /**
125
+ * The resolved capability set for one identity against one policy. Plain,
126
+ * serializable data (no methods) so it can live in a store; query it with
127
+ * `canEdit()` from `../permissions.ts`.
128
+ */
129
+ export interface ResolvedPermissions {
130
+ login: string | null;
131
+ /** Effective top role after merging member + team grants (and repo-admin). */
132
+ role: PermissionRole;
133
+ /** `true` for `admin` role or a GitHub repo admin. Admins edit everything. */
134
+ isAdmin: boolean;
135
+ /** May the user edit `.meno/permissions.json` itself? Admins only. */
136
+ canManagePolicy: boolean;
137
+ /** Merged allow-lists from all matching grants (consulted for the `editor` role). */
138
+ allow: Required<PermissionRule>;
139
+ }
@@ -80,4 +80,3 @@ export interface InteractiveStyleRule {
80
80
  * Each rule has a selector and associated styles
81
81
  */
82
82
  export type InteractiveStyles = InteractiveStyleRule[];
83
-
@@ -1,15 +1,10 @@
1
1
  import { describe, expect, it } from 'bun:test';
2
- import {
3
- getGroupAbbreviation,
4
- getDefaultScalingType,
5
- generateShortCssVar,
6
- VARIABLE_TYPES,
7
- } from './variables';
2
+ import { getGroupAbbreviation, getDefaultScalingType, generateShortCssVar, VARIABLE_TYPES } from './variables';
8
3
  import type { CSSVariable } from './variables';
9
4
 
10
5
  describe('VARIABLE_TYPES', () => {
11
6
  it('has all expected scaling types', () => {
12
- const values = VARIABLE_TYPES.map(t => t.value);
7
+ const values = VARIABLE_TYPES.map((t) => t.value);
13
8
  expect(values).toEqual(['fontSize', 'padding', 'margin', 'gap', 'borderRadius', 'size', 'none']);
14
9
  });
15
10
  });
@@ -97,9 +92,7 @@ describe('generateShortCssVar', () => {
97
92
  });
98
93
 
99
94
  it('extends prefix on collision', () => {
100
- const existing: CSSVariable[] = [
101
- { name: 'H', cssVar: '--h-ls', value: '1px', type: 'none' },
102
- ];
95
+ const existing: CSSVariable[] = [{ name: 'H', cssVar: '--h-ls', value: '1px', type: 'none' }];
103
96
  const result = generateShortCssVar('Heading', 'letter-spacing', existing);
104
97
  expect(result).toBe('--he-ls');
105
98
  });
@@ -130,9 +123,7 @@ describe('generateShortCssVar', () => {
130
123
  });
131
124
 
132
125
  it('adds numeric suffix for no-group collisions', () => {
133
- const existing: CSSVariable[] = [
134
- { name: '', cssVar: '--my-var', value: '1px', type: 'none' },
135
- ];
126
+ const existing: CSSVariable[] = [{ name: '', cssVar: '--my-var', value: '1px', type: 'none' }];
136
127
  const result = generateShortCssVar('My Var', '', existing);
137
128
  expect(result).toBe('--my-var-2');
138
129
  });
@@ -15,18 +15,25 @@ export type VariableType = 'fontSize' | 'padding' | 'margin' | 'gap' | 'borderRa
15
15
  * Controls which variables appear in the picker based on the CSS property being edited.
16
16
  */
17
17
  export type VariableGroup =
18
- | 'font-family' | 'font-size' | 'font-weight'
19
- | 'line-height' | 'letter-spacing'
20
- | 'margin' | 'padding' | 'gap'
18
+ | 'font-family'
19
+ | 'font-size'
20
+ | 'font-weight'
21
+ | 'line-height'
22
+ | 'letter-spacing'
23
+ | 'margin'
24
+ | 'padding'
25
+ | 'gap'
21
26
  | 'size'
22
27
  | 'position'
23
- | 'border-radius' | 'border-width'
28
+ | 'border-radius'
29
+ | 'border-width'
24
30
  | 'outline'
25
31
  | 'shadow'
26
32
  | 'filter'
27
33
  | 'duration'
28
34
  | 'aspect-ratio'
29
- | 'opacity' | 'z-index'
35
+ | 'opacity'
36
+ | 'z-index'
30
37
  | 'text-align'
31
38
  | 'other';
32
39
 
@@ -56,7 +63,7 @@ export const VARIABLE_GROUPS: { value: VariableGroup; label: string }[] = [
56
63
  ];
57
64
 
58
65
  /** All valid group string values */
59
- export const VARIABLE_GROUP_VALUES: VariableGroup[] = VARIABLE_GROUPS.map(g => g.value);
66
+ export const VARIABLE_GROUP_VALUES: VariableGroup[] = VARIABLE_GROUPS.map((g) => g.value);
60
67
 
61
68
  /** Maps CSS property names to variable groups */
62
69
  const CSS_PROPERTY_TO_GROUP: Record<string, VariableGroup> = {
@@ -66,13 +73,13 @@ const CSS_PROPERTY_TO_GROUP: Record<string, VariableGroup> = {
66
73
  'line-height': 'line-height',
67
74
  'letter-spacing': 'letter-spacing',
68
75
  'text-align': 'text-align',
69
- 'opacity': 'opacity',
76
+ opacity: 'opacity',
70
77
  'z-index': 'z-index',
71
- 'top': 'position',
72
- 'right': 'position',
73
- 'bottom': 'position',
74
- 'left': 'position',
75
- 'inset': 'position',
78
+ top: 'position',
79
+ right: 'position',
80
+ bottom: 'position',
81
+ left: 'position',
82
+ inset: 'position',
76
83
  'inset-block': 'position',
77
84
  'inset-inline': 'position',
78
85
  'inset-block-start': 'position',
@@ -81,7 +88,7 @@ const CSS_PROPERTY_TO_GROUP: Record<string, VariableGroup> = {
81
88
  'inset-inline-end': 'position',
82
89
  'box-shadow': 'shadow',
83
90
  'text-shadow': 'shadow',
84
- 'filter': 'filter',
91
+ filter: 'filter',
85
92
  'backdrop-filter': 'filter',
86
93
  'aspect-ratio': 'aspect-ratio',
87
94
  'transition-duration': 'duration',
@@ -123,15 +130,15 @@ const CSS_PROPERTY_PREFIX_GROUPS: { prefix: string; group: VariableGroup }[] = [
123
130
  */
124
131
  export function getGroupForProperty(prop: string): VariableGroup | null {
125
132
  // Normalize camelCase to kebab-case (e.g., "fontFamily" → "font-family")
126
- const normalized = prop.replace(/[A-Z]/g, letter => `-${letter.toLowerCase()}`);
133
+ const normalized = prop.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);
127
134
 
128
135
  // Exact match first
129
136
  if (normalized in CSS_PROPERTY_TO_GROUP) {
130
- return CSS_PROPERTY_TO_GROUP[normalized];
137
+ return CSS_PROPERTY_TO_GROUP[normalized] ?? null;
131
138
  }
132
139
  // Prefix-based match (handles margin-top, padding-left, etc.)
133
140
  for (const { prefix, group } of CSS_PROPERTY_PREFIX_GROUPS) {
134
- if (normalized === prefix || normalized.startsWith(prefix + '-')) {
141
+ if (normalized === prefix || normalized.startsWith(`${prefix}-`)) {
135
142
  return group;
136
143
  }
137
144
  }
@@ -177,20 +184,23 @@ export const VARIABLE_TYPES: { value: VariableType; label: string }[] = [
177
184
  ];
178
185
 
179
186
  /** All valid variable scaling type values */
180
- export const VARIABLE_TYPE_VALUES: VariableType[] = VARIABLE_TYPES.map(t => t.value);
187
+ export const VARIABLE_TYPE_VALUES: VariableType[] = VARIABLE_TYPES.map((t) => t.value);
181
188
 
182
189
  /**
183
190
  * Returns an abbreviation for a variable group by taking the first letter of each word.
184
191
  * e.g. 'letter-spacing' -> 'ls', 'font-size' -> 'fs', 'spacing' -> 's'
185
192
  */
186
193
  export function getGroupAbbreviation(group: string): string {
187
- return group.split('-').map(w => w[0] || '').join('');
194
+ return group
195
+ .split('-')
196
+ .map((w) => w[0] || '')
197
+ .join('');
188
198
  }
189
199
 
190
200
  /**
191
201
  * Infers a default scaling type from a variable group and optional CSS property.
192
202
  */
193
- export function getDefaultScalingType(group: string, cssProperty?: string): VariableType {
203
+ export function getDefaultScalingType(group: string, _cssProperty?: string): VariableType {
194
204
  if (group === 'font-size') return 'fontSize';
195
205
  if (group === 'margin') return 'margin';
196
206
  if (group === 'padding') return 'padding';
@@ -205,34 +215,45 @@ export function getDefaultScalingType(group: string, cssProperty?: string): Vari
205
215
  * e.g. name="Heading", group="letter-spacing" -> "--h-ls"
206
216
  * If taken, extends prefix: "--he-ls", "--hea-ls", etc.
207
217
  */
208
- export function generateShortCssVar(
209
- name: string,
210
- group: string,
211
- existingVariables: CSSVariable[]
212
- ): string {
218
+ export function generateShortCssVar(name: string, group: string, existingVariables: CSSVariable[]): string {
213
219
  const trimmed = name.trim();
214
220
  if (!trimmed) return '--';
215
221
  if (!group) {
216
222
  // No group: just kebab-case the name
217
- const base = '--' + trimmed.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, '');
223
+ const base =
224
+ '--' +
225
+ trimmed
226
+ .toLowerCase()
227
+ .replace(/\s+/g, '-')
228
+ .replace(/[^a-z0-9-]/g, '');
218
229
  return ensureUnique(base, existingVariables);
219
230
  }
220
231
 
221
232
  const groupAbbr = getGroupAbbreviation(group);
222
- const kebabName = trimmed.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, '');
233
+ const kebabName = trimmed
234
+ .toLowerCase()
235
+ .replace(/\s+/g, '-')
236
+ .replace(/[^a-z0-9-]/g, '');
223
237
  const words = kebabName.split('-').filter(Boolean);
224
- const existingNames = new Set(existingVariables.map(v => v.cssVar));
238
+ const existingNames = new Set(existingVariables.map((v) => v.cssVar));
225
239
 
226
240
  // Try progressively longer prefixes from the name
227
241
  // Start with first letter of each word, then extend first word
228
- const initials = words.map(w => w[0] || '').join('');
242
+ const initials = words.map((w) => w[0] || '').join('');
229
243
  const initialCandidate = `--${initials}-${groupAbbr}`;
230
244
  if (!existingNames.has(initialCandidate)) return initialCandidate;
231
245
 
232
246
  // Extend first word progressively
233
247
  const firstWord = words[0] || '';
234
248
  for (let len = 2; len <= firstWord.length; len++) {
235
- const prefix = firstWord.slice(0, len) + (words.length > 1 ? words.slice(1).map(w => w[0] || '').join('') : '');
249
+ const prefix =
250
+ firstWord.slice(0, len) +
251
+ (words.length > 1
252
+ ? words
253
+ .slice(1)
254
+ .map((w) => w[0] || '')
255
+ .join('')
256
+ : '');
236
257
  const candidate = `--${prefix}-${groupAbbr}`;
237
258
  if (!existingNames.has(candidate)) return candidate;
238
259
  }
@@ -248,7 +269,7 @@ export function generateShortCssVar(
248
269
  }
249
270
 
250
271
  function ensureUnique(base: string, existingVariables: CSSVariable[]): string {
251
- const existingNames = new Set(existingVariables.map(v => v.cssVar));
272
+ const existingNames = new Set(existingVariables.map((v) => v.cssVar));
252
273
  if (!existingNames.has(base)) return base;
253
274
  let i = 2;
254
275
  while (existingNames.has(`${base}-${i}`)) i++;
@@ -1,11 +1,10 @@
1
1
  /**
2
2
  * Shared TypeScript types and interfaces
3
3
  * Used by both client and server code
4
- *
4
+ *
5
5
  * This file maintains backward compatibility while using the new modular type system.
6
6
  * All types are re-exported from the organized type modules.
7
7
  */
8
8
 
9
9
  // Re-export all types from the new modular structure
10
10
  export * from './types/index';
11
-