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
@@ -20,7 +20,7 @@ export function renderItemFromTemplate(
20
20
  item: Record<string, unknown>,
21
21
  itemAs: string,
22
22
  index: number,
23
- total: number
23
+ total: number,
24
24
  ): HTMLElement {
25
25
  let html = template;
26
26
 
@@ -69,7 +69,7 @@ export function renderNestedItemFromTemplate(
69
69
  index: number,
70
70
  total: number,
71
71
  parentItem: Record<string, unknown>,
72
- parentItemAs: string
72
+ parentItemAs: string,
73
73
  ): HTMLElement {
74
74
  let html = template;
75
75
 
@@ -146,11 +146,9 @@ export function renderNestedItemFromTemplate(
146
146
  export function hydrateNestedCMSLists(
147
147
  element: HTMLElement,
148
148
  parentItem: Record<string, unknown>,
149
- parentItemAs: string
149
+ parentItemAs: string,
150
150
  ): void {
151
- const placeholders = element.querySelectorAll<HTMLElement>(
152
- '[data-cms-list-nested="true"]'
153
- );
151
+ const placeholders = element.querySelectorAll<HTMLElement>('[data-cms-list-nested="true"]');
154
152
 
155
153
  for (const placeholder of placeholders) {
156
154
  hydrateNestedCMSList(placeholder, parentItem, parentItemAs);
@@ -163,7 +161,7 @@ export function hydrateNestedCMSLists(
163
161
  function hydrateNestedCMSList(
164
162
  placeholder: HTMLElement,
165
163
  parentItem: Record<string, unknown>,
166
- parentItemAs: string
164
+ parentItemAs: string,
167
165
  ): void {
168
166
  const configStr = placeholder.getAttribute('data-cms-config');
169
167
  if (!configStr) return;
@@ -176,9 +174,7 @@ function hydrateNestedCMSList(
176
174
  }
177
175
 
178
176
  const collection = config.collection;
179
- const templateEl = placeholder.querySelector<HTMLTemplateElement>(
180
- 'template[data-nested-template]'
181
- );
177
+ const templateEl = placeholder.querySelector<HTMLTemplateElement>('template[data-nested-template]');
182
178
  if (!templateEl) return;
183
179
 
184
180
  const childTemplate = templateEl.innerHTML.trim();
@@ -187,7 +183,9 @@ function hydrateNestedCMSList(
187
183
  // Get collection data from inline JSON
188
184
  const collectionData = getCollectionData(collection);
189
185
  if (!collectionData) {
190
- console.warn(`MenoFilter: No data for nested collection "${collection}". Ensure clientData.enabled is true in schema.`);
186
+ console.warn(
187
+ `MenoFilter: No data for nested collection "${collection}". Ensure clientData.enabled is true in schema.`,
188
+ );
191
189
  return;
192
190
  }
193
191
 
@@ -198,7 +196,7 @@ function hydrateNestedCMSList(
198
196
  // Reference relationship: resolve IDs from parent
199
197
  const itemIds = resolveItemsFromParent(config.items, parentItem, parentItemAs);
200
198
  items = itemIds
201
- .map(id => collectionData.find(item => item._id === id || item._filename === id))
199
+ .map((id) => collectionData.find((item) => item._id === id || item._filename === id))
202
200
  .filter((item): item is Record<string, unknown> => item !== undefined);
203
201
  } else {
204
202
  // Filter relationship: apply filter with resolved parent values
@@ -217,22 +215,25 @@ function hydrateNestedCMSList(
217
215
  // Render items with parent context preserved
218
216
  const renderedItems: HTMLElement[] = [];
219
217
  for (let i = 0; i < items.length; i++) {
218
+ const item = items[i];
219
+ if (item === undefined) continue;
220
220
  const childElement = renderNestedItemFromTemplate(
221
221
  childTemplate,
222
- items[i],
222
+ item,
223
223
  nestedItemAs,
224
224
  i,
225
225
  items.length,
226
226
  parentItem,
227
- parentItemAs
227
+ parentItemAs,
228
228
  );
229
229
  renderedItems.push(childElement);
230
230
  }
231
231
 
232
232
  // Replace placeholder content (keep template for potential re-renders)
233
- const existingChildren = Array.from(placeholder.children)
234
- .filter(el => el.tagName !== 'TEMPLATE');
235
- existingChildren.forEach(el => el.remove());
233
+ const existingChildren = Array.from(placeholder.children).filter((el) => el.tagName !== 'TEMPLATE');
234
+ existingChildren.forEach((el) => {
235
+ el.remove();
236
+ });
236
237
 
237
238
  for (const item of renderedItems) {
238
239
  placeholder.appendChild(item);
@@ -260,7 +261,7 @@ function getCollectionData(collection: string): Record<string, unknown>[] | null
260
261
  function resolveItemsFromParent(
261
262
  template: string | string[],
262
263
  parentItem: Record<string, unknown>,
263
- parentItemAs: string
264
+ parentItemAs: string,
264
265
  ): string[] {
265
266
  if (Array.isArray(template)) return template;
266
267
  if (typeof template !== 'string' || !template.startsWith('{{')) return [template];
@@ -268,7 +269,7 @@ function resolveItemsFromParent(
268
269
  const match = template.match(/^\{\{(\w+)\.([^}]+)\}\}$/);
269
270
  if (!match) return [];
270
271
 
271
- const [, varName, fieldPath] = match;
272
+ const [, varName, fieldPath = ''] = match;
272
273
  if (varName !== parentItemAs && varName !== 'item') return [];
273
274
 
274
275
  const value = getNestedValue(parentItem, fieldPath);
@@ -284,12 +285,12 @@ function applyNestedFilter(
284
285
  items: Record<string, unknown>[],
285
286
  filter: unknown,
286
287
  parentItem: Record<string, unknown>,
287
- parentItemAs: string
288
+ parentItemAs: string,
288
289
  ): Record<string, unknown>[] {
289
290
  if (!filter) return items;
290
291
 
291
292
  const resolved = resolveNestedFilterTemplates(filter, parentItem, parentItemAs);
292
- return items.filter(item => matchesNestedFilter(item, resolved));
293
+ return items.filter((item) => matchesNestedFilter(item, resolved));
293
294
  }
294
295
 
295
296
  /**
@@ -298,12 +299,12 @@ function applyNestedFilter(
298
299
  function resolveNestedFilterTemplates(
299
300
  filter: unknown,
300
301
  parentItem: Record<string, unknown>,
301
- parentItemAs: string
302
+ parentItemAs: string,
302
303
  ): unknown {
303
304
  if (Array.isArray(filter)) {
304
- return filter.map(cond => ({
305
+ return filter.map((cond) => ({
305
306
  ...cond,
306
- value: resolveNestedTemplateValue(cond.value, parentItem, parentItemAs)
307
+ value: resolveNestedTemplateValue(cond.value, parentItem, parentItemAs),
307
308
  }));
308
309
  }
309
310
 
@@ -311,7 +312,7 @@ function resolveNestedFilterTemplates(
311
312
  if ('field' in filter && 'value' in filter) {
312
313
  return {
313
314
  ...filter,
314
- value: resolveNestedTemplateValue((filter as { value: unknown }).value, parentItem, parentItemAs)
315
+ value: resolveNestedTemplateValue((filter as { value: unknown }).value, parentItem, parentItemAs),
315
316
  };
316
317
  }
317
318
 
@@ -332,14 +333,14 @@ function resolveNestedFilterTemplates(
332
333
  function resolveNestedTemplateValue(
333
334
  value: unknown,
334
335
  parentItem: Record<string, unknown>,
335
- parentItemAs: string
336
+ parentItemAs: string,
336
337
  ): unknown {
337
338
  if (typeof value !== 'string' || !value.startsWith('{{')) return value;
338
339
 
339
340
  const match = value.match(/^\{\{(\w+)\.([^}]+)\}\}$/);
340
341
  if (!match) return value;
341
342
 
342
- const [, varName, fieldPath] = match;
343
+ const [, varName, fieldPath = ''] = match;
343
344
  if (varName !== parentItemAs && varName !== 'item') return value;
344
345
 
345
346
  return getNestedValue(parentItem, fieldPath);
@@ -352,7 +353,7 @@ function matchesNestedFilter(item: Record<string, unknown>, filter: unknown): bo
352
353
  if (!filter || typeof filter !== 'object') return true;
353
354
 
354
355
  if (Array.isArray(filter)) {
355
- return filter.every(cond => matchesNestedCondition(item, cond));
356
+ return filter.every((cond) => matchesNestedCondition(item, cond));
356
357
  }
357
358
 
358
359
  if ('field' in filter && 'value' in filter) {
@@ -383,10 +384,7 @@ function matchesNestedCondition(item: Record<string, unknown>, cond: { field: st
383
384
  /**
384
385
  * Apply sorting to items
385
386
  */
386
- function applyNestedSorting(
387
- items: Record<string, unknown>[],
388
- sort: unknown
389
- ): Record<string, unknown>[] {
387
+ function applyNestedSorting(items: Record<string, unknown>[], sort: unknown): Record<string, unknown>[] {
390
388
  if (!sort) return items;
391
389
 
392
390
  const sortConfig = Array.isArray(sort) ? sort[0] : sort;
@@ -47,9 +47,7 @@ export function needsMenoFilter(html: string): boolean {
47
47
  /**
48
48
  * Check if any schemas have clientData enabled
49
49
  */
50
- export function schemasNeedMenoFilter(
51
- schemas: Array<{ clientData?: { enabled: boolean } }>
52
- ): boolean {
50
+ export function schemasNeedMenoFilter(schemas: Array<{ clientData?: { enabled: boolean } }>): boolean {
53
51
  return schemas.some((schema) => schema.clientData?.enabled === true);
54
52
  }
55
53
 
@@ -57,10 +57,7 @@ const DEFAULT_OPTIONS: Required<UIOptions> = {
57
57
  /**
58
58
  * Bind UI rendering to a MenoFilter instance
59
59
  */
60
- export function bindFilterUI(
61
- collection: string,
62
- options: UIOptions = {}
63
- ): (() => void) | null {
60
+ export function bindFilterUI(collection: string, options: UIOptions = {}): (() => void) | null {
64
61
  const filter = MenoFilter.get(collection);
65
62
  if (!filter) {
66
63
  console.warn(`MenoFilter: No instance found for "${collection}"`);
@@ -171,7 +168,7 @@ function showElement(element: HTMLElement, options: Required<UIOptions>): void {
171
168
  }, duration);
172
169
  break;
173
170
 
174
- case 'slide':
171
+ case 'slide': {
175
172
  element.style.maxHeight = '0';
176
173
  element.style.overflow = 'hidden';
177
174
  element.classList.remove(hiddenClass);
@@ -190,6 +187,7 @@ function showElement(element: HTMLElement, options: Required<UIOptions>): void {
190
187
  element.style.overflow = '';
191
188
  }, duration);
192
189
  break;
190
+ }
193
191
 
194
192
  default:
195
193
  element.classList.remove(hiddenClass);
@@ -356,7 +354,7 @@ export function autoBindUI(): void {
356
354
 
357
355
  const options: UIOptions = {};
358
356
  if (animate) options.animate = animate;
359
- if (!isNaN(duration)) options.duration = duration;
357
+ if (!Number.isNaN(duration)) options.duration = duration;
360
358
  if (scrollToTop) options.scrollToTop = true;
361
359
 
362
360
  bindFilterUI(collection, options);
@@ -105,6 +105,7 @@ function filterWithJsonData(instance: FilterInstance, listEl: HTMLElement): void
105
105
  // Render each item
106
106
  for (let i = 0; i < itemsToRender.length; i++) {
107
107
  const item = itemsToRender[i];
108
+ if (item === undefined) continue;
108
109
  const itemId = item._id;
109
110
 
110
111
  // In load-more mode, skip items already rendered
@@ -149,7 +150,7 @@ function filterDOMOnly(instance: FilterInstance, listEl: HTMLElement): void {
149
150
  const currentPage = filter.getPageInfo().current;
150
151
 
151
152
  // Build filtered list
152
- let filteredItems = items.filter(item => {
153
+ const filteredItems = items.filter((item) => {
153
154
  // Check filters
154
155
  for (const [field, value] of Object.entries(filters)) {
155
156
  const itemValue = getItemFieldValue(item, field);
@@ -234,7 +235,7 @@ function getItemFieldValue(item: HTMLElement, field: string): string | null {
234
235
  */
235
236
  function getSearchableText(item: HTMLElement, fields: string[]): string {
236
237
  if (fields.length > 0) {
237
- return fields.map(f => getItemFieldValue(item, f) || '').join(' ');
238
+ return fields.map((f) => getItemFieldValue(item, f) || '').join(' ');
238
239
  }
239
240
  return item.textContent || '';
240
241
  }
@@ -345,17 +346,11 @@ export function updateFacets(wrapper: HTMLElement, filter: MenoFilter): void {
345
346
  /**
346
347
  * Update active filters display
347
348
  */
348
- export function updateActiveFilters(
349
- wrapper: HTMLElement,
350
- filter: MenoFilter,
351
- instance: FilterInstance
352
- ): void {
349
+ export function updateActiveFilters(wrapper: HTMLElement, filter: MenoFilter, instance: FilterInstance): void {
353
350
  const container = wrapper.querySelector<HTMLElement>(`[${ATTR.ACTIVE_FILTERS}]`);
354
351
  if (!container) return;
355
352
 
356
- const template = wrapper.querySelector<HTMLTemplateElement>(
357
- `template[${ATTR.ACTIVE_FILTER_TEMPLATE}]`
358
- );
353
+ const template = wrapper.querySelector<HTMLTemplateElement>(`template[${ATTR.ACTIVE_FILTER_TEMPLATE}]`);
359
354
 
360
355
  const filters = filter.getFilters();
361
356
  const entries = Object.entries(filters);
@@ -478,7 +473,7 @@ export function updatePagination(wrapper: HTMLElement, state: FilterState): void
478
473
  export function generatePageButtons(
479
474
  container: HTMLElement,
480
475
  page: { current: number; total: number },
481
- onClick: (page: number) => void
476
+ onClick: (page: number) => void,
482
477
  ): void {
483
478
  container.innerHTML = '';
484
479
 
@@ -566,9 +561,7 @@ export function updateActiveStates(wrapper: HTMLElement, filter: MenoFilter): vo
566
561
  const activeClass = wrapper.getAttribute(ATTR.ACTIVE_CLASS) || 'active';
567
562
 
568
563
  // Update filter buttons
569
- const filterButtons = wrapper.querySelectorAll<HTMLElement>(
570
- `[${ATTR.FILTER_FIELD}][${ATTR.FILTER_VALUE}]`
571
- );
564
+ const filterButtons = wrapper.querySelectorAll<HTMLElement>(`[${ATTR.FILTER_FIELD}][${ATTR.FILTER_VALUE}]`);
572
565
 
573
566
  for (const btn of filterButtons) {
574
567
  if (btn.tagName === 'INPUT') continue;
@@ -582,13 +575,15 @@ export function updateActiveStates(wrapper: HTMLElement, filter: MenoFilter): vo
582
575
  const currentValue = filters[field];
583
576
 
584
577
  // Only active if filter is explicitly set AND matches this value
585
- const isActive = currentValue !== undefined && (
586
- currentValue === value ||
587
- (Array.isArray(currentValue) && currentValue.includes(value)) ||
588
- (typeof currentValue === 'object' && currentValue !== null && '$in' in currentValue &&
589
- Array.isArray((currentValue as { $in: unknown[] }).$in) &&
590
- (currentValue as { $in: unknown[] }).$in.includes(value))
591
- );
578
+ const isActive =
579
+ currentValue !== undefined &&
580
+ (currentValue === value ||
581
+ (Array.isArray(currentValue) && currentValue.includes(value)) ||
582
+ (typeof currentValue === 'object' &&
583
+ currentValue !== null &&
584
+ '$in' in currentValue &&
585
+ Array.isArray((currentValue as { $in: unknown[] }).$in) &&
586
+ (currentValue as { $in: unknown[] }).$in.includes(value)));
592
587
 
593
588
  btn.classList.toggle(activeClass, isActive);
594
589
  }
@@ -663,8 +658,8 @@ export function updateRangeInputs(wrapper: HTMLElement, filter: MenoFilter): voi
663
658
  if (input.type === 'date') {
664
659
  // Convert timestamp to YYYY-MM-DD format
665
660
  const date = new Date(value as number);
666
- if (!isNaN(date.getTime())) {
667
- input.value = date.toISOString().split('T')[0];
661
+ if (!Number.isNaN(date.getTime())) {
662
+ input.value = date.toISOString().split('T')[0] ?? '';
668
663
  }
669
664
  } else {
670
665
  input.value = String(value);
@@ -25,7 +25,7 @@ export function escapeHtml(str: string): string {
25
25
  * singularizeWord('cases') // 'case'
26
26
  */
27
27
  export function singularizeWord(word: string): string {
28
- if (word.endsWith('ies')) return word.slice(0, -3) + 'y';
28
+ if (word.endsWith('ies')) return `${word.slice(0, -3)}y`;
29
29
  if (word.endsWith('es')) return word.slice(0, -2);
30
30
  if (word.endsWith('s')) return word.slice(0, -1);
31
31
  return word;