meno-core 1.0.53 → 1.0.54

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 (387) hide show
  1. package/.claude/settings.local.json +1 -3
  2. package/bin/cli.ts +48 -57
  3. package/build-astro.ts +131 -113
  4. package/build-next.ts +109 -96
  5. package/build-static.test.ts +39 -10
  6. package/build-static.ts +120 -122
  7. package/dist/bin/cli.js +34 -38
  8. package/dist/bin/cli.js.map +2 -2
  9. package/dist/build-static.js +12 -11
  10. package/dist/chunks/chunk-2AR55GYH.js +42 -0
  11. package/dist/chunks/chunk-2AR55GYH.js.map +7 -0
  12. package/dist/chunks/{chunk-IGYR22T6.js → chunk-2FN4UOVO.js} +512 -239
  13. package/dist/chunks/chunk-2FN4UOVO.js.map +7 -0
  14. package/dist/chunks/chunk-3XER4E5W.js +168 -0
  15. package/dist/chunks/chunk-3XER4E5W.js.map +7 -0
  16. package/dist/chunks/{chunk-X754AHS5.js → chunk-5ETZFREW.js} +9 -12
  17. package/dist/chunks/chunk-5ETZFREW.js.map +7 -0
  18. package/dist/chunks/{chunk-2MHDV5BF.js → chunk-7E4IF5L7.js} +15 -21
  19. package/dist/chunks/chunk-7E4IF5L7.js.map +7 -0
  20. package/dist/chunks/{chunk-JGWFTO6P.js → chunk-7HWQUVTU.js} +1578 -1349
  21. package/dist/chunks/chunk-7HWQUVTU.js.map +7 -0
  22. package/dist/chunks/{chunk-O3NAGJP4.js → chunk-AE3QK5QW.js} +110 -21
  23. package/dist/chunks/chunk-AE3QK5QW.js.map +7 -0
  24. package/dist/chunks/{chunk-GZHGVVW3.js → chunk-F6KTJYGV.js} +7 -7
  25. package/dist/chunks/chunk-F6KTJYGV.js.map +7 -0
  26. package/dist/chunks/{chunk-WQFG7PAH.js → chunk-FZITJSSS.js} +2 -6
  27. package/dist/chunks/chunk-FZITJSSS.js.map +7 -0
  28. package/dist/chunks/{chunk-QB2LNO4W.js → chunk-GSYYA5GX.js} +2 -2
  29. package/dist/chunks/chunk-GSYYA5GX.js.map +7 -0
  30. package/dist/chunks/{chunk-YBLHKYFF.js → chunk-HIZMY3EP.js} +1 -1
  31. package/dist/chunks/chunk-HIZMY3EP.js.map +7 -0
  32. package/dist/chunks/{chunk-AZQYF6KE.js → chunk-I2WEGYA7.js} +41 -176
  33. package/dist/chunks/chunk-I2WEGYA7.js.map +7 -0
  34. package/dist/chunks/{chunk-I7YIGZXT.js → chunk-JNO3CNLJ.js} +6 -9
  35. package/dist/chunks/chunk-JNO3CNLJ.js.map +7 -0
  36. package/dist/chunks/{chunk-UB44F4Z2.js → chunk-NVRBTSQG.js} +2 -4
  37. package/dist/chunks/chunk-NVRBTSQG.js.map +7 -0
  38. package/dist/chunks/{chunk-JGP5A3Y5.js → chunk-Q4OBWKXG.js} +40 -33
  39. package/dist/chunks/chunk-Q4OBWKXG.js.map +7 -0
  40. package/dist/chunks/{chunk-R6XHAFBF.js → chunk-QTE32Y53.js} +250 -242
  41. package/dist/chunks/chunk-QTE32Y53.js.map +7 -0
  42. package/dist/chunks/{chunk-H3GJ4H2U.js → chunk-STDY3OVM.js} +214 -85
  43. package/dist/chunks/chunk-STDY3OVM.js.map +7 -0
  44. package/dist/chunks/configService-PRJZF7Y6.js +14 -0
  45. package/dist/chunks/{constants-STK2YBIW.js → constants-KIQEYMAM.js} +2 -2
  46. package/dist/chunks/{fs-JGINUXGL.js → fs-ZI5JEU7V.js} +2 -2
  47. package/dist/entries/server-router.js +14 -19
  48. package/dist/entries/server-router.js.map +2 -2
  49. package/dist/lib/client/index.js +638 -332
  50. package/dist/lib/client/index.js.map +2 -2
  51. package/dist/lib/server/index.js +177 -235
  52. package/dist/lib/server/index.js.map +2 -2
  53. package/dist/lib/shared/index.js +80 -44
  54. package/dist/lib/shared/index.js.map +2 -2
  55. package/dist/lib/shared/richtext/index.js +1 -1
  56. package/dist/lib/test-utils/index.js +38 -60
  57. package/dist/lib/test-utils/index.js.map +2 -2
  58. package/entries/client-router.tsx +10 -8
  59. package/entries/server-router.tsx +1 -7
  60. package/lib/client/ClientInitializer.ts +8 -8
  61. package/lib/client/ErrorBoundary.test.tsx +146 -143
  62. package/lib/client/ErrorBoundary.tsx +175 -127
  63. package/lib/client/componentRegistry.test.ts +96 -108
  64. package/lib/client/componentRegistry.ts +1 -2
  65. package/lib/client/contexts/ThemeContext.tsx +3 -2
  66. package/lib/client/core/ComponentBuilder.test.ts +513 -560
  67. package/lib/client/core/ComponentBuilder.ts +318 -146
  68. package/lib/client/core/ComponentRenderer.test.tsx +1 -2
  69. package/lib/client/core/ComponentRenderer.tsx +46 -33
  70. package/lib/client/core/builders/embedBuilder.ts +241 -53
  71. package/lib/client/core/builders/linkBuilder.ts +71 -44
  72. package/lib/client/core/builders/linkNodeBuilder.ts +78 -53
  73. package/lib/client/core/builders/listBuilder.ts +115 -86
  74. package/lib/client/core/builders/localeListBuilder.ts +95 -60
  75. package/lib/client/core/builders/types.ts +5 -5
  76. package/lib/client/core/cmsTemplateProcessor.ts +7 -7
  77. package/lib/client/elementRegistry.ts +3 -3
  78. package/lib/client/fontFamiliesService.test.ts +2 -10
  79. package/lib/client/fontFamiliesService.ts +3 -3
  80. package/lib/client/hmr/HMRManager.tsx +8 -0
  81. package/lib/client/hmrCssReload.ts +14 -8
  82. package/lib/client/hmrWebSocket.ts +9 -14
  83. package/lib/client/hooks/useColorVariables.test.ts +21 -21
  84. package/lib/client/hooks/useColorVariables.ts +12 -10
  85. package/lib/client/hooks/usePropertyAutocomplete.ts +3 -5
  86. package/lib/client/hooks/useVariables.ts +4 -4
  87. package/lib/client/hydration/HydrationUtils.test.ts +24 -25
  88. package/lib/client/hydration/HydrationUtils.ts +3 -4
  89. package/lib/client/i18nConfigService.test.ts +2 -7
  90. package/lib/client/i18nConfigService.ts +2 -2
  91. package/lib/client/meno-filter/MenoFilter.test.ts +19 -21
  92. package/lib/client/meno-filter/MenoFilter.ts +5 -9
  93. package/lib/client/meno-filter/bindings.ts +15 -40
  94. package/lib/client/meno-filter/init.ts +1 -1
  95. package/lib/client/meno-filter/renderer.ts +23 -29
  96. package/lib/client/meno-filter/script.generated.ts +1 -3
  97. package/lib/client/meno-filter/ui.ts +3 -5
  98. package/lib/client/meno-filter/updates.ts +15 -21
  99. package/lib/client/navigation.test.ts +159 -159
  100. package/lib/client/navigation.ts +0 -1
  101. package/lib/client/responsiveStyleResolver.test.ts +230 -228
  102. package/lib/client/responsiveStyleResolver.ts +13 -16
  103. package/lib/client/routing/RouteLoader.test.ts +23 -24
  104. package/lib/client/routing/RouteLoader.ts +22 -35
  105. package/lib/client/routing/Router.tsx +31 -3
  106. package/lib/client/scripts/ScriptExecutor.test.ts +157 -158
  107. package/lib/client/scripts/ScriptExecutor.ts +15 -33
  108. package/lib/client/services/PrefetchService.test.ts +2 -2
  109. package/lib/client/services/PrefetchService.ts +10 -24
  110. package/lib/client/styleProcessor.test.ts +9 -9
  111. package/lib/client/styleProcessor.ts +18 -15
  112. package/lib/client/styles/StyleInjector.test.ts +122 -115
  113. package/lib/client/styles/StyleInjector.ts +9 -6
  114. package/lib/client/styles/UtilityClassCollector.ts +19 -26
  115. package/lib/client/styles/cspNonce.test.ts +2 -5
  116. package/lib/client/templateEngine.test.ts +554 -482
  117. package/lib/client/templateEngine.ts +200 -64
  118. package/lib/client/theme.ts +0 -1
  119. package/lib/client/utils/toast.ts +0 -1
  120. package/lib/server/__integration__/api-routes.test.ts +8 -4
  121. package/lib/server/__integration__/cms-integration.test.ts +1 -4
  122. package/lib/server/__integration__/server-lifecycle.test.ts +2 -5
  123. package/lib/server/__integration__/ssr-rendering.test.ts +47 -37
  124. package/lib/server/__integration__/static-assets.test.ts +1 -1
  125. package/lib/server/__integration__/test-helpers.ts +84 -70
  126. package/lib/server/ab/generateFunctions.ts +12 -10
  127. package/lib/server/astro/cmsPageEmitter.ts +23 -38
  128. package/lib/server/astro/componentEmitter.ts +25 -36
  129. package/lib/server/astro/cssCollector.ts +10 -26
  130. package/lib/server/astro/nodeToAstro.test.ts +1750 -30
  131. package/lib/server/astro/nodeToAstro.ts +198 -187
  132. package/lib/server/astro/normalizeOrphanTemplateProps.test.ts +105 -109
  133. package/lib/server/astro/normalizeOrphanTemplateProps.ts +4 -12
  134. package/lib/server/astro/pageEmitter.ts +9 -13
  135. package/lib/server/astro/tailwindMapper.test.ts +10 -37
  136. package/lib/server/astro/tailwindMapper.ts +33 -40
  137. package/lib/server/astro/templateTransformer.ts +14 -17
  138. package/lib/server/createServer.ts +5 -17
  139. package/lib/server/cssGenerator.test.ts +35 -44
  140. package/lib/server/cssGenerator.ts +6 -17
  141. package/lib/server/fileWatcher.test.ts +124 -10
  142. package/lib/server/fileWatcher.ts +124 -118
  143. package/lib/server/index.ts +7 -1
  144. package/lib/server/jsonLoader.test.ts +39 -2
  145. package/lib/server/jsonLoader.ts +33 -31
  146. package/lib/server/middleware/cors.test.ts +20 -20
  147. package/lib/server/middleware/cors.ts +28 -4
  148. package/lib/server/middleware/errorHandler.test.ts +5 -3
  149. package/lib/server/middleware/errorHandler.ts +3 -8
  150. package/lib/server/middleware/index.ts +0 -1
  151. package/lib/server/middleware/logger.test.ts +7 -5
  152. package/lib/server/middleware/logger.ts +10 -22
  153. package/lib/server/pageCache.test.ts +76 -77
  154. package/lib/server/pageCache.ts +0 -1
  155. package/lib/server/projectContext.ts +4 -3
  156. package/lib/server/providers/fileSystemCMSProvider.test.ts +124 -95
  157. package/lib/server/providers/fileSystemCMSProvider.ts +35 -20
  158. package/lib/server/providers/fileSystemPageProvider.test.ts +84 -0
  159. package/lib/server/providers/fileSystemPageProvider.ts +31 -12
  160. package/lib/server/routes/api/cms.test.ts +26 -14
  161. package/lib/server/routes/api/cms.ts +9 -14
  162. package/lib/server/routes/api/components.ts +30 -34
  163. package/lib/server/routes/api/config.ts +0 -1
  164. package/lib/server/routes/api/core-routes.ts +47 -74
  165. package/lib/server/routes/api/functions.ts +8 -16
  166. package/lib/server/routes/api/index.ts +3 -6
  167. package/lib/server/routes/api/pages.ts +8 -11
  168. package/lib/server/routes/api/shared.test.ts +1 -1
  169. package/lib/server/routes/api/shared.ts +12 -9
  170. package/lib/server/routes/api/variables.test.ts +1 -3
  171. package/lib/server/routes/api/variables.ts +1 -1
  172. package/lib/server/routes/index.ts +23 -26
  173. package/lib/server/routes/pages.ts +34 -29
  174. package/lib/server/routes/static.ts +16 -4
  175. package/lib/server/runtime/bundler.ts +47 -32
  176. package/lib/server/runtime/fs.ts +3 -13
  177. package/lib/server/runtime/httpServer.ts +5 -9
  178. package/lib/server/services/ColorService.ts +32 -27
  179. package/lib/server/services/EnumService.test.ts +2 -6
  180. package/lib/server/services/EnumService.ts +7 -2
  181. package/lib/server/services/VariableService.test.ts +1 -5
  182. package/lib/server/services/VariableService.ts +6 -1
  183. package/lib/server/services/cmsService.test.ts +116 -78
  184. package/lib/server/services/cmsService.ts +24 -54
  185. package/lib/server/services/componentService.test.ts +122 -36
  186. package/lib/server/services/componentService.ts +54 -38
  187. package/lib/server/services/configService.test.ts +9 -31
  188. package/lib/server/services/configService.ts +20 -27
  189. package/lib/server/services/fileWatcherService.ts +40 -6
  190. package/lib/server/services/index.ts +0 -1
  191. package/lib/server/services/pageService.test.ts +1 -3
  192. package/lib/server/services/pageService.ts +14 -13
  193. package/lib/server/ssr/attributeBuilder.ts +16 -6
  194. package/lib/server/ssr/buildErrorOverlay.ts +11 -12
  195. package/lib/server/ssr/clientDataInjector.ts +7 -21
  196. package/lib/server/ssr/cmsSSRProcessor.ts +3 -6
  197. package/lib/server/ssr/cssCollector.ts +1 -1
  198. package/lib/server/ssr/errorOverlay.test.ts +1 -1
  199. package/lib/server/ssr/errorOverlay.ts +3 -9
  200. package/lib/server/ssr/htmlGenerator.nonce.test.ts +3 -9
  201. package/lib/server/ssr/htmlGenerator.test.ts +120 -43
  202. package/lib/server/ssr/htmlGenerator.ts +120 -85
  203. package/lib/server/ssr/imageMetadata.test.ts +3 -1
  204. package/lib/server/ssr/imageMetadata.ts +25 -19
  205. package/lib/server/ssr/jsCollector.test.ts +3 -13
  206. package/lib/server/ssr/jsCollector.ts +3 -8
  207. package/lib/server/ssr/liveReloadIntegration.test.ts +69 -28
  208. package/lib/server/ssr/metaTagGenerator.ts +2 -2
  209. package/lib/server/ssr/ssrRenderer.branches.test.ts +1103 -0
  210. package/lib/server/ssr/ssrRenderer.test.ts +196 -246
  211. package/lib/server/ssr/ssrRenderer.ts +609 -225
  212. package/lib/server/ssrRenderer.test.ts +1044 -950
  213. package/lib/server/utils/jsonLineMapper.test.ts +28 -28
  214. package/lib/server/utils/jsonLineMapper.ts +1 -1
  215. package/lib/server/validateStyleCoverage.ts +18 -20
  216. package/lib/server/webflow/buildWebflow.ts +41 -53
  217. package/lib/server/webflow/nodeToWebflow.test.ts +150 -218
  218. package/lib/server/webflow/nodeToWebflow.ts +195 -258
  219. package/lib/server/webflow/styleMapper.test.ts +15 -56
  220. package/lib/server/webflow/styleMapper.ts +33 -41
  221. package/lib/server/webflow/types.ts +1 -8
  222. package/lib/server/websocketManager.ts +16 -19
  223. package/lib/shared/attributeNodeUtils.test.ts +15 -15
  224. package/lib/shared/attributeNodeUtils.ts +5 -12
  225. package/lib/shared/breakpoints.ts +4 -11
  226. package/lib/shared/cmsQueryParser.test.ts +50 -42
  227. package/lib/shared/cmsQueryParser.ts +49 -31
  228. package/lib/shared/colorVariableUtils.test.ts +5 -5
  229. package/lib/shared/colorVariableUtils.ts +3 -8
  230. package/lib/shared/componentRefs.ts +1 -5
  231. package/lib/shared/constants.test.ts +3 -3
  232. package/lib/shared/constants.ts +4 -8
  233. package/lib/shared/cssGeneration.test.ts +262 -144
  234. package/lib/shared/cssGeneration.ts +189 -516
  235. package/lib/shared/cssNamedColors.ts +152 -30
  236. package/lib/shared/cssProperties.test.ts +5 -6
  237. package/lib/shared/cssProperties.ts +296 -112
  238. package/lib/shared/elementClassName.test.ts +109 -109
  239. package/lib/shared/elementClassName.ts +1 -1
  240. package/lib/shared/elementUtils.ts +12 -16
  241. package/lib/shared/errorLogger.ts +2 -10
  242. package/lib/shared/errors.test.ts +2 -13
  243. package/lib/shared/errors.ts +2 -8
  244. package/lib/shared/expressionEvaluator.test.ts +119 -0
  245. package/lib/shared/expressionEvaluator.ts +43 -24
  246. package/lib/shared/fontLoader.test.ts +19 -5
  247. package/lib/shared/friendlyError.ts +2 -3
  248. package/lib/shared/gradientUtils.test.ts +1 -5
  249. package/lib/shared/gradientUtils.ts +2 -6
  250. package/lib/shared/hrefRefs.ts +2 -10
  251. package/lib/shared/i18n.test.ts +1 -1
  252. package/lib/shared/i18n.ts +13 -34
  253. package/lib/shared/index.ts +4 -0
  254. package/lib/shared/inlineSvgStyleRules.ts +2 -4
  255. package/lib/shared/interactiveStyleMappings.test.ts +11 -33
  256. package/lib/shared/interactiveStyleMappings.ts +9 -16
  257. package/lib/shared/interactiveStyles.test.ts +165 -188
  258. package/lib/shared/interfaces/contentProvider.ts +1 -1
  259. package/lib/shared/itemTemplateUtils.test.ts +6 -12
  260. package/lib/shared/itemTemplateUtils.ts +19 -35
  261. package/lib/shared/jsonRepair.ts +8 -2
  262. package/lib/shared/libraryLoader.test.ts +15 -49
  263. package/lib/shared/libraryLoader.ts +7 -22
  264. package/lib/shared/netlifyLocale404.test.ts +179 -0
  265. package/lib/shared/netlifyLocale404.ts +110 -0
  266. package/lib/shared/nodeUtils.test.ts +24 -16
  267. package/lib/shared/nodeUtils.ts +49 -19
  268. package/lib/shared/pathArrayUtils.test.ts +1 -2
  269. package/lib/shared/pathArrayUtils.ts +1 -1
  270. package/lib/shared/pathSecurity.ts +1 -1
  271. package/lib/shared/pathUtils.test.ts +4 -6
  272. package/lib/shared/pathUtils.ts +42 -48
  273. package/lib/shared/paths/Path.test.ts +2 -2
  274. package/lib/shared/paths/Path.ts +0 -1
  275. package/lib/shared/paths/PathConverter.test.ts +1 -1
  276. package/lib/shared/paths/PathConverter.ts +14 -17
  277. package/lib/shared/paths/PathUtils.ts +9 -10
  278. package/lib/shared/paths/PathValidator.test.ts +2 -15
  279. package/lib/shared/paths/PathValidator.ts +11 -9
  280. package/lib/shared/paths/index.ts +1 -2
  281. package/lib/shared/propResolver.test.ts +240 -244
  282. package/lib/shared/propResolver.ts +14 -25
  283. package/lib/shared/pxToRem.test.ts +7 -6
  284. package/lib/shared/pxToRem.ts +2 -5
  285. package/lib/shared/registry/BaseNodeTypeRegistry.test.ts +9 -5
  286. package/lib/shared/registry/ClientRegistry.ts +0 -1
  287. package/lib/shared/registry/ComponentRegistry.test.ts +43 -29
  288. package/lib/shared/registry/ComponentRegistry.ts +9 -11
  289. package/lib/shared/registry/NodeTypeDefinition.ts +15 -8
  290. package/lib/shared/registry/RegistryManager.ts +1 -2
  291. package/lib/shared/registry/SSRRegistry.ts +0 -1
  292. package/lib/shared/registry/createNodeType.ts +7 -9
  293. package/lib/shared/registry/defineNodeType.ts +2 -6
  294. package/lib/shared/registry/index.ts +0 -1
  295. package/lib/shared/registry/nodeTypes/ComponentInstanceNodeType.ts +14 -15
  296. package/lib/shared/registry/nodeTypes/EmbedNodeType.ts +18 -11
  297. package/lib/shared/registry/nodeTypes/HtmlNodeType.ts +47 -18
  298. package/lib/shared/registry/nodeTypes/LinkNodeType.ts +21 -19
  299. package/lib/shared/registry/nodeTypes/ListNodeType.ts +78 -74
  300. package/lib/shared/registry/nodeTypes/LocaleListNodeType.ts +27 -21
  301. package/lib/shared/registry/nodeTypes/SlotMarkerType.ts +6 -7
  302. package/lib/shared/registry/nodeTypes/index.ts +10 -2
  303. package/lib/shared/responsiveScaling.test.ts +15 -31
  304. package/lib/shared/responsiveScaling.ts +55 -37
  305. package/lib/shared/responsiveStyleUtils.ts +11 -13
  306. package/lib/shared/richtext/htmlToTiptap.test.ts +23 -14
  307. package/lib/shared/richtext/htmlToTiptap.ts +1 -3
  308. package/lib/shared/richtext/tiptapToHtml.test.ts +5 -6
  309. package/lib/shared/richtext/types.ts +1 -8
  310. package/lib/shared/slugTranslator.test.ts +13 -13
  311. package/lib/shared/slugTranslator.ts +12 -16
  312. package/lib/shared/slugify.ts +9 -15
  313. package/lib/shared/styleNodeUtils.test.ts +8 -8
  314. package/lib/shared/styleNodeUtils.ts +5 -10
  315. package/lib/shared/styleUtils.test.ts +87 -61
  316. package/lib/shared/styleUtils.ts +5 -6
  317. package/lib/shared/themeDefaults.test.ts +11 -11
  318. package/lib/shared/themeDefaults.ts +3 -4
  319. package/lib/shared/tree/PathBuilder.test.ts +62 -138
  320. package/lib/shared/tree/PathBuilder.ts +49 -39
  321. package/lib/shared/treePathUtils.test.ts +2 -10
  322. package/lib/shared/treePathUtils.ts +54 -59
  323. package/lib/shared/types/api.ts +1 -2
  324. package/lib/shared/types/cms.ts +25 -21
  325. package/lib/shared/types/comment.ts +49 -16
  326. package/lib/shared/types/components.ts +27 -25
  327. package/lib/shared/types/errors.test.ts +1 -6
  328. package/lib/shared/types/errors.ts +3 -7
  329. package/lib/shared/types/experiments.ts +28 -28
  330. package/lib/shared/types/index.ts +2 -2
  331. package/lib/shared/types/styles.ts +0 -1
  332. package/lib/shared/types/variables.test.ts +4 -13
  333. package/lib/shared/types/variables.ts +48 -27
  334. package/lib/shared/types.ts +1 -2
  335. package/lib/shared/utilityClassConfig.ts +648 -321
  336. package/lib/shared/utilityClassMapper.test.ts +203 -92
  337. package/lib/shared/utilityClassMapper.ts +188 -246
  338. package/lib/shared/utilityClassNames.ts +326 -0
  339. package/lib/shared/utils.test.ts +2 -10
  340. package/lib/shared/utils.ts +19 -10
  341. package/lib/shared/validation/cmsValidators.ts +2 -1
  342. package/lib/shared/validation/commentValidators.test.ts +53 -0
  343. package/lib/shared/validation/commentValidators.ts +12 -1
  344. package/lib/shared/validation/propValidator.test.ts +18 -20
  345. package/lib/shared/validation/propValidator.ts +12 -17
  346. package/lib/shared/validation/schemas.test.ts +24 -33
  347. package/lib/shared/validation/schemas.ts +469 -344
  348. package/lib/shared/validation/validators.test.ts +1 -6
  349. package/lib/shared/validation/validators.ts +89 -68
  350. package/lib/shared/viewportUnits.integration.test.ts +14 -10
  351. package/lib/shared/viewportUnits.test.ts +11 -23
  352. package/lib/test-utils/dom-setup.ts +1 -1
  353. package/lib/test-utils/factories/ConsoleMockFactory.ts +3 -7
  354. package/lib/test-utils/factories/DomMockFactory.ts +7 -19
  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 +5 -9
  358. package/lib/test-utils/factories/StoreMockFactory.ts +14 -25
  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 +12 -18
  365. package/lib/test-utils/mocks.ts +4 -2
  366. package/package.json +1 -1
  367. package/scripts/build-meno-filter.ts +1 -4
  368. package/vite.config.ts +4 -4
  369. package/dist/chunks/chunk-2MHDV5BF.js.map +0 -7
  370. package/dist/chunks/chunk-AZQYF6KE.js.map +0 -7
  371. package/dist/chunks/chunk-GZHGVVW3.js.map +0 -7
  372. package/dist/chunks/chunk-H3GJ4H2U.js.map +0 -7
  373. package/dist/chunks/chunk-I7YIGZXT.js.map +0 -7
  374. package/dist/chunks/chunk-IGYR22T6.js.map +0 -7
  375. package/dist/chunks/chunk-JGP5A3Y5.js.map +0 -7
  376. package/dist/chunks/chunk-JGWFTO6P.js.map +0 -7
  377. package/dist/chunks/chunk-O3NAGJP4.js.map +0 -7
  378. package/dist/chunks/chunk-QB2LNO4W.js.map +0 -7
  379. package/dist/chunks/chunk-R6XHAFBF.js.map +0 -7
  380. package/dist/chunks/chunk-UB44F4Z2.js.map +0 -7
  381. package/dist/chunks/chunk-WQFG7PAH.js.map +0 -7
  382. package/dist/chunks/chunk-X754AHS5.js.map +0 -7
  383. package/dist/chunks/chunk-YBLHKYFF.js.map +0 -7
  384. package/dist/chunks/configService-R3OGU2UD.js +0 -13
  385. /package/dist/chunks/{configService-R3OGU2UD.js.map → configService-PRJZF7Y6.js.map} +0 -0
  386. /package/dist/chunks/{constants-STK2YBIW.js.map → constants-KIQEYMAM.js.map} +0 -0
  387. /package/dist/chunks/{fs-JGINUXGL.js.map → fs-ZI5JEU7V.js.map} +0 -0
@@ -1,5 +1,5 @@
1
- import { test, expect, describe, beforeEach, afterEach, mock } from "bun:test";
2
- import { navigateTo, createNavigationHandler } from "./navigation";
1
+ import { test, expect, describe, beforeEach, afterEach, mock } from 'bun:test';
2
+ import { navigateTo, createNavigationHandler } from './navigation';
3
3
 
4
4
  // Setup browser-like environment
5
5
  function setupWindowMock() {
@@ -21,7 +21,7 @@ function setupWindowMock() {
21
21
  }
22
22
  }
23
23
 
24
- describe("Navigation - navigateTo", () => {
24
+ describe('Navigation - navigateTo', () => {
25
25
  let originalPushState: any;
26
26
  let originalDispatchEvent: any;
27
27
  let pushStateCalls: Array<{ state: any; title: string; url: string }>;
@@ -29,20 +29,20 @@ describe("Navigation - navigateTo", () => {
29
29
 
30
30
  beforeEach(() => {
31
31
  setupWindowMock();
32
-
32
+
33
33
  // Save originals
34
34
  originalPushState = (globalThis as any).window.history.pushState;
35
35
  originalDispatchEvent = (globalThis as any).window.dispatchEvent;
36
-
36
+
37
37
  // Track calls
38
38
  pushStateCalls = [];
39
39
  dispatchedEvents = [];
40
-
40
+
41
41
  // Mock pushState
42
42
  (globalThis as any).window.history.pushState = mock((state: any, title: string, url: string) => {
43
43
  pushStateCalls.push({ state, title, url });
44
44
  }) as any;
45
-
45
+
46
46
  // Mock dispatchEvent
47
47
  (globalThis as any).window.dispatchEvent = mock((event: Event) => {
48
48
  dispatchedEvents.push(event);
@@ -58,57 +58,57 @@ describe("Navigation - navigateTo", () => {
58
58
  }
59
59
  });
60
60
 
61
- test("should navigate to root path", () => {
62
- navigateTo("/");
63
-
61
+ test('should navigate to root path', () => {
62
+ navigateTo('/');
63
+
64
64
  expect(pushStateCalls.length).toBe(1);
65
- expect(pushStateCalls[0].url).toBe("/");
65
+ expect(pushStateCalls[0].url).toBe('/');
66
66
  expect(dispatchedEvents.length).toBe(1);
67
- expect(dispatchedEvents[0].type).toBe("popstate");
67
+ expect(dispatchedEvents[0].type).toBe('popstate');
68
68
  });
69
69
 
70
- test("should navigate to nested path", () => {
71
- navigateTo("/about");
72
-
70
+ test('should navigate to nested path', () => {
71
+ navigateTo('/about');
72
+
73
73
  expect(pushStateCalls.length).toBe(1);
74
- expect(pushStateCalls[0].url).toBe("/about");
75
- expect(dispatchedEvents[0].type).toBe("popstate");
74
+ expect(pushStateCalls[0].url).toBe('/about');
75
+ expect(dispatchedEvents[0].type).toBe('popstate');
76
76
  });
77
77
 
78
- test("should navigate to deeply nested path", () => {
79
- navigateTo("/blog/post-1");
80
-
81
- expect(pushStateCalls[0].url).toBe("/blog/post-1");
78
+ test('should navigate to deeply nested path', () => {
79
+ navigateTo('/blog/post-1');
80
+
81
+ expect(pushStateCalls[0].url).toBe('/blog/post-1');
82
82
  });
83
83
 
84
- test("should call pushState with empty state object", () => {
85
- navigateTo("/test");
86
-
84
+ test('should call pushState with empty state object', () => {
85
+ navigateTo('/test');
86
+
87
87
  expect(pushStateCalls[0].state).toEqual({});
88
- expect(pushStateCalls[0].title).toBe("");
88
+ expect(pushStateCalls[0].title).toBe('');
89
89
  });
90
90
 
91
- test("should dispatch PopStateEvent", () => {
92
- navigateTo("/test");
93
-
91
+ test('should dispatch PopStateEvent', () => {
92
+ navigateTo('/test');
93
+
94
94
  expect(dispatchedEvents.length).toBe(1);
95
95
  expect(dispatchedEvents[0]).toBeInstanceOf(PopStateEvent);
96
96
  });
97
97
 
98
- test("should handle path with query string", () => {
99
- navigateTo("/search?q=test");
100
-
101
- expect(pushStateCalls[0].url).toBe("/search?q=test");
98
+ test('should handle path with query string', () => {
99
+ navigateTo('/search?q=test');
100
+
101
+ expect(pushStateCalls[0].url).toBe('/search?q=test');
102
102
  });
103
103
 
104
- test("should handle path with hash", () => {
105
- navigateTo("/page#section");
106
-
107
- expect(pushStateCalls[0].url).toBe("/page#section");
104
+ test('should handle path with hash', () => {
105
+ navigateTo('/page#section');
106
+
107
+ expect(pushStateCalls[0].url).toBe('/page#section');
108
108
  });
109
109
  });
110
110
 
111
- describe("Navigation - createNavigationHandler", () => {
111
+ describe('Navigation - createNavigationHandler', () => {
112
112
  let originalPushState: any;
113
113
  let originalDispatchEvent: any;
114
114
  let pushStateCalls: Array<{ url: string }>;
@@ -118,14 +118,14 @@ describe("Navigation - createNavigationHandler", () => {
118
118
  setupWindowMock();
119
119
  originalPushState = (globalThis as any).window.history.pushState;
120
120
  originalDispatchEvent = (globalThis as any).window.dispatchEvent;
121
-
121
+
122
122
  pushStateCalls = [];
123
123
  preventDefaultCalled = false;
124
-
124
+
125
125
  (globalThis as any).window.history.pushState = mock((state: any, title: string, url: string) => {
126
126
  pushStateCalls.push({ url });
127
127
  }) as any;
128
-
128
+
129
129
  (globalThis as any).window.dispatchEvent = mock(() => true);
130
130
  });
131
131
 
@@ -136,78 +136,78 @@ describe("Navigation - createNavigationHandler", () => {
136
136
  }
137
137
  });
138
138
 
139
- test("should create handler that prevents default", () => {
140
- const handler = createNavigationHandler("/test");
139
+ test('should create handler that prevents default', () => {
140
+ const handler = createNavigationHandler('/test');
141
141
  const mockEvent = {
142
142
  preventDefault: mock(() => {
143
143
  preventDefaultCalled = true;
144
- })
144
+ }),
145
145
  } as any;
146
-
146
+
147
147
  handler(mockEvent);
148
-
148
+
149
149
  expect(preventDefaultCalled).toBe(true);
150
150
  expect(mockEvent.preventDefault).toHaveBeenCalled();
151
151
  });
152
152
 
153
- test("should create handler that navigates to path", () => {
154
- const handler = createNavigationHandler("/about");
153
+ test('should create handler that navigates to path', () => {
154
+ const handler = createNavigationHandler('/about');
155
155
  const mockEvent = {
156
- preventDefault: mock(() => {})
156
+ preventDefault: mock(() => {}),
157
157
  } as any;
158
-
158
+
159
159
  handler(mockEvent);
160
-
160
+
161
161
  expect(pushStateCalls.length).toBe(1);
162
- expect(pushStateCalls[0].url).toBe("/about");
162
+ expect(pushStateCalls[0].url).toBe('/about');
163
163
  });
164
164
 
165
- test("should prevent default before navigating", () => {
166
- const handler = createNavigationHandler("/test");
165
+ test('should prevent default before navigating', () => {
166
+ const handler = createNavigationHandler('/test');
167
167
  let preventDefaultCalledFirst = false;
168
168
  let navigationCalledFirst = false;
169
-
169
+
170
170
  const mockEvent = {
171
171
  preventDefault: mock(() => {
172
172
  preventDefaultCalledFirst = !navigationCalledFirst;
173
- })
173
+ }),
174
174
  } as any;
175
-
175
+
176
176
  const originalPushState = (globalThis as any).window.history.pushState;
177
177
  (globalThis as any).window.history.pushState = mock(() => {
178
178
  navigationCalledFirst = !preventDefaultCalledFirst;
179
179
  }) as any;
180
-
180
+
181
181
  handler(mockEvent);
182
-
182
+
183
183
  // preventDefault should be called before navigation
184
184
  expect(preventDefaultCalledFirst).toBe(true);
185
185
  });
186
186
 
187
- test("should handle root path in handler", () => {
188
- const handler = createNavigationHandler("/");
187
+ test('should handle root path in handler', () => {
188
+ const handler = createNavigationHandler('/');
189
189
  const mockEvent = {
190
- preventDefault: mock(() => {})
190
+ preventDefault: mock(() => {}),
191
191
  } as any;
192
-
192
+
193
193
  handler(mockEvent);
194
-
195
- expect(pushStateCalls[0].url).toBe("/");
194
+
195
+ expect(pushStateCalls[0].url).toBe('/');
196
196
  });
197
197
 
198
- test("should handle nested paths in handler", () => {
199
- const handler = createNavigationHandler("/blog/post-1");
198
+ test('should handle nested paths in handler', () => {
199
+ const handler = createNavigationHandler('/blog/post-1');
200
200
  const mockEvent = {
201
- preventDefault: mock(() => {})
201
+ preventDefault: mock(() => {}),
202
202
  } as any;
203
-
203
+
204
204
  handler(mockEvent);
205
-
206
- expect(pushStateCalls[0].url).toBe("/blog/post-1");
205
+
206
+ expect(pushStateCalls[0].url).toBe('/blog/post-1');
207
207
  });
208
208
  });
209
209
 
210
- describe("Navigation - Path handling", () => {
210
+ describe('Navigation - Path handling', () => {
211
211
  let originalPushState: any;
212
212
  let originalDispatchEvent: any;
213
213
 
@@ -215,7 +215,7 @@ describe("Navigation - Path handling", () => {
215
215
  setupWindowMock();
216
216
  originalPushState = (globalThis as any).window.history.pushState;
217
217
  originalDispatchEvent = (globalThis as any).window.dispatchEvent;
218
-
218
+
219
219
  (globalThis as any).window.history.pushState = mock(() => {}) as any;
220
220
  (globalThis as any).window.dispatchEvent = mock(() => true);
221
221
  });
@@ -227,151 +227,151 @@ describe("Navigation - Path handling", () => {
227
227
  }
228
228
  });
229
229
 
230
- describe("Root path handling", () => {
231
- test("should navigate to root path correctly", () => {
230
+ describe('Root path handling', () => {
231
+ test('should navigate to root path correctly', () => {
232
232
  const pushStateCalls: Array<{ url: string }> = [];
233
233
  (globalThis as any).window.history.pushState = mock((state: any, title: string, url: string) => {
234
234
  pushStateCalls.push({ url });
235
235
  }) as any;
236
-
237
- navigateTo("/");
238
-
239
- expect(pushStateCalls[0].url).toBe("/");
236
+
237
+ navigateTo('/');
238
+
239
+ expect(pushStateCalls[0].url).toBe('/');
240
240
  });
241
241
 
242
- test("should handle root path with handler", () => {
243
- const handler = createNavigationHandler("/");
242
+ test('should handle root path with handler', () => {
243
+ const handler = createNavigationHandler('/');
244
244
  const pushStateCalls: Array<{ url: string }> = [];
245
245
  (globalThis as any).window.history.pushState = mock((state: any, title: string, url: string) => {
246
246
  pushStateCalls.push({ url });
247
247
  }) as any;
248
-
248
+
249
249
  const mockEvent = {
250
- preventDefault: mock(() => {})
250
+ preventDefault: mock(() => {}),
251
251
  } as any;
252
-
252
+
253
253
  handler(mockEvent);
254
-
255
- expect(pushStateCalls[0].url).toBe("/");
254
+
255
+ expect(pushStateCalls[0].url).toBe('/');
256
256
  });
257
257
  });
258
258
 
259
- describe("Nested paths handling", () => {
260
- test("should handle single level nested path", () => {
259
+ describe('Nested paths handling', () => {
260
+ test('should handle single level nested path', () => {
261
261
  const pushStateCalls: Array<{ url: string }> = [];
262
262
  (globalThis as any).window.history.pushState = mock((state: any, title: string, url: string) => {
263
263
  pushStateCalls.push({ url });
264
264
  }) as any;
265
-
266
- navigateTo("/about");
267
-
268
- expect(pushStateCalls[0].url).toBe("/about");
265
+
266
+ navigateTo('/about');
267
+
268
+ expect(pushStateCalls[0].url).toBe('/about');
269
269
  });
270
270
 
271
- test("should handle multi-level nested paths", () => {
271
+ test('should handle multi-level nested paths', () => {
272
272
  const pushStateCalls: Array<{ url: string }> = [];
273
273
  (globalThis as any).window.history.pushState = mock((state: any, title: string, url: string) => {
274
274
  pushStateCalls.push({ url });
275
275
  }) as any;
276
-
277
- navigateTo("/blog/category/post-1");
278
-
279
- expect(pushStateCalls[0].url).toBe("/blog/category/post-1");
276
+
277
+ navigateTo('/blog/category/post-1');
278
+
279
+ expect(pushStateCalls[0].url).toBe('/blog/category/post-1');
280
280
  });
281
281
 
282
- test("should handle paths with trailing slash", () => {
282
+ test('should handle paths with trailing slash', () => {
283
283
  const pushStateCalls: Array<{ url: string }> = [];
284
284
  (globalThis as any).window.history.pushState = mock((state: any, title: string, url: string) => {
285
285
  pushStateCalls.push({ url });
286
286
  }) as any;
287
-
288
- navigateTo("/about/");
289
-
290
- expect(pushStateCalls[0].url).toBe("/about/");
287
+
288
+ navigateTo('/about/');
289
+
290
+ expect(pushStateCalls[0].url).toBe('/about/');
291
291
  });
292
292
  });
293
293
 
294
- describe("Special path handling", () => {
295
- test("should handle paths with query parameters", () => {
294
+ describe('Special path handling', () => {
295
+ test('should handle paths with query parameters', () => {
296
296
  const pushStateCalls: Array<{ url: string }> = [];
297
297
  (globalThis as any).window.history.pushState = mock((state: any, title: string, url: string) => {
298
298
  pushStateCalls.push({ url });
299
299
  }) as any;
300
-
301
- navigateTo("/search?q=test&page=1");
302
-
303
- expect(pushStateCalls[0].url).toBe("/search?q=test&page=1");
300
+
301
+ navigateTo('/search?q=test&page=1');
302
+
303
+ expect(pushStateCalls[0].url).toBe('/search?q=test&page=1');
304
304
  });
305
305
 
306
- test("should handle paths with hash fragments", () => {
306
+ test('should handle paths with hash fragments', () => {
307
307
  const pushStateCalls: Array<{ url: string }> = [];
308
308
  (globalThis as any).window.history.pushState = mock((state: any, title: string, url: string) => {
309
309
  pushStateCalls.push({ url });
310
310
  }) as any;
311
-
312
- navigateTo("/page#section");
313
-
314
- expect(pushStateCalls[0].url).toBe("/page#section");
311
+
312
+ navigateTo('/page#section');
313
+
314
+ expect(pushStateCalls[0].url).toBe('/page#section');
315
315
  });
316
316
 
317
- test("should handle paths with both query and hash", () => {
317
+ test('should handle paths with both query and hash', () => {
318
318
  const pushStateCalls: Array<{ url: string }> = [];
319
319
  (globalThis as any).window.history.pushState = mock((state: any, title: string, url: string) => {
320
320
  pushStateCalls.push({ url });
321
321
  }) as any;
322
-
323
- navigateTo("/page?param=value#section");
324
-
325
- expect(pushStateCalls[0].url).toBe("/page?param=value#section");
322
+
323
+ navigateTo('/page?param=value#section');
324
+
325
+ expect(pushStateCalls[0].url).toBe('/page?param=value#section');
326
326
  });
327
327
  });
328
328
 
329
- describe("Link component behavior simulation", () => {
330
- test("should simulate Link component click behavior", () => {
331
- const handler = createNavigationHandler("/link-target");
329
+ describe('Link component behavior simulation', () => {
330
+ test('should simulate Link component click behavior', () => {
331
+ const handler = createNavigationHandler('/link-target');
332
332
  const mockEvent = {
333
333
  preventDefault: mock(() => {}),
334
- type: "click",
335
- target: {}
334
+ type: 'click',
335
+ target: {},
336
336
  } as any;
337
-
337
+
338
338
  const pushStateCalls: Array<{ url: string }> = [];
339
339
  (globalThis as any).window.history.pushState = mock((state: any, title: string, url: string) => {
340
340
  pushStateCalls.push({ url });
341
341
  }) as any;
342
-
342
+
343
343
  handler(mockEvent);
344
-
344
+
345
345
  // Should prevent default (no page reload)
346
346
  expect(mockEvent.preventDefault).toHaveBeenCalled();
347
347
  // Should navigate using history API
348
348
  expect(pushStateCalls.length).toBe(1);
349
- expect(pushStateCalls[0].url).toBe("/link-target");
349
+ expect(pushStateCalls[0].url).toBe('/link-target');
350
350
  });
351
351
 
352
- test("should handle multiple Link clicks", () => {
353
- const handler1 = createNavigationHandler("/page1");
354
- const handler2 = createNavigationHandler("/page2");
355
-
352
+ test('should handle multiple Link clicks', () => {
353
+ const handler1 = createNavigationHandler('/page1');
354
+ const handler2 = createNavigationHandler('/page2');
355
+
356
356
  const pushStateCalls: Array<{ url: string }> = [];
357
357
  (globalThis as any).window.history.pushState = mock((state: any, title: string, url: string) => {
358
358
  pushStateCalls.push({ url });
359
359
  }) as any;
360
-
360
+
361
361
  const mockEvent1 = { preventDefault: mock(() => {}) } as any;
362
362
  const mockEvent2 = { preventDefault: mock(() => {}) } as any;
363
-
363
+
364
364
  handler1(mockEvent1);
365
365
  handler2(mockEvent2);
366
-
366
+
367
367
  expect(pushStateCalls.length).toBe(2);
368
- expect(pushStateCalls[0].url).toBe("/page1");
369
- expect(pushStateCalls[1].url).toBe("/page2");
368
+ expect(pushStateCalls[0].url).toBe('/page1');
369
+ expect(pushStateCalls[1].url).toBe('/page2');
370
370
  });
371
371
  });
372
372
  });
373
373
 
374
- describe("Navigation - Integration scenarios", () => {
374
+ describe('Navigation - Integration scenarios', () => {
375
375
  let originalPushState: any;
376
376
  let originalDispatchEvent: any;
377
377
  let pushStateCalls: Array<{ url: string }>;
@@ -381,14 +381,14 @@ describe("Navigation - Integration scenarios", () => {
381
381
  setupWindowMock();
382
382
  originalPushState = (globalThis as any).window.history.pushState;
383
383
  originalDispatchEvent = (globalThis as any).window.dispatchEvent;
384
-
384
+
385
385
  pushStateCalls = [];
386
386
  dispatchedEvents = [];
387
-
387
+
388
388
  (globalThis as any).window.history.pushState = mock((state: any, title: string, url: string) => {
389
389
  pushStateCalls.push({ url });
390
390
  }) as any;
391
-
391
+
392
392
  (globalThis as any).window.dispatchEvent = mock((event: Event) => {
393
393
  dispatchedEvents.push(event);
394
394
  return true;
@@ -402,38 +402,38 @@ describe("Navigation - Integration scenarios", () => {
402
402
  }
403
403
  });
404
404
 
405
- test("should handle navigation sequence", () => {
406
- navigateTo("/");
407
- navigateTo("/about");
408
- navigateTo("/contact");
409
-
405
+ test('should handle navigation sequence', () => {
406
+ navigateTo('/');
407
+ navigateTo('/about');
408
+ navigateTo('/contact');
409
+
410
410
  expect(pushStateCalls.length).toBe(3);
411
- expect(pushStateCalls[0].url).toBe("/");
412
- expect(pushStateCalls[1].url).toBe("/about");
413
- expect(pushStateCalls[2].url).toBe("/contact");
411
+ expect(pushStateCalls[0].url).toBe('/');
412
+ expect(pushStateCalls[1].url).toBe('/about');
413
+ expect(pushStateCalls[2].url).toBe('/contact');
414
414
  expect(dispatchedEvents.length).toBe(3);
415
415
  });
416
416
 
417
- test("should work with navigation handler in sequence", () => {
418
- const handler1 = createNavigationHandler("/page1");
419
- const handler2 = createNavigationHandler("/page2");
420
-
417
+ test('should work with navigation handler in sequence', () => {
418
+ const handler1 = createNavigationHandler('/page1');
419
+ const handler2 = createNavigationHandler('/page2');
420
+
421
421
  const mockEvent = {
422
- preventDefault: mock(() => {})
422
+ preventDefault: mock(() => {}),
423
423
  } as any;
424
-
424
+
425
425
  handler1(mockEvent);
426
426
  handler2(mockEvent);
427
-
427
+
428
428
  expect(pushStateCalls.length).toBe(2);
429
429
  });
430
430
 
431
- test("should handle back/forward navigation simulation", () => {
431
+ test('should handle back/forward navigation simulation', () => {
432
432
  // Navigate forward
433
- navigateTo("/page1");
434
- navigateTo("/page2");
435
- navigateTo("/page3");
436
-
433
+ navigateTo('/page1');
434
+ navigateTo('/page2');
435
+ navigateTo('/page3');
436
+
437
437
  // Simulate back button (this would normally be handled by popstate listener)
438
438
  // The navigateTo function doesn't handle back/forward, but the router does
439
439
  expect(pushStateCalls.length).toBe(3);
@@ -20,4 +20,3 @@ export function createNavigationHandler(path: string): (e: Event) => void {
20
20
  navigateTo(path);
21
21
  };
22
22
  }
23
-