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
@@ -51,7 +51,7 @@ export interface TypedMockMouseEvent extends MouseEvent {
51
51
 
52
52
  export function createTypedKeyboardEvent(
53
53
  type: 'keydown' | 'keyup' | 'keypress',
54
- options: MockKeyboardEventOptions
54
+ options: MockKeyboardEventOptions,
55
55
  ): TypedMockKeyboardEvent {
56
56
  const event = new KeyboardEvent(type, {
57
57
  key: options.key,
@@ -118,8 +118,7 @@ export const KeyboardShortcuts = {
118
118
  delete: () => createTypedKeyboardEvent('keydown', { key: 'Backspace' }),
119
119
  enter: () => createTypedKeyboardEvent('keydown', { key: 'Enter' }),
120
120
  escape: () => createTypedKeyboardEvent('keydown', { key: 'Escape' }),
121
- tab: (shift = false) =>
122
- createTypedKeyboardEvent('keydown', { key: 'Tab', shiftKey: shift }),
121
+ tab: (shift = false) => createTypedKeyboardEvent('keydown', { key: 'Tab', shiftKey: shift }),
123
122
  arrowUp: () => createTypedKeyboardEvent('keydown', { key: 'ArrowUp' }),
124
123
  arrowDown: () => createTypedKeyboardEvent('keydown', { key: 'ArrowDown' }),
125
124
  arrowLeft: () => createTypedKeyboardEvent('keydown', { key: 'ArrowLeft' }),
@@ -140,7 +139,7 @@ export function createTypedMouseEvent(
140
139
  | 'mouseover'
141
140
  | 'mouseout'
142
141
  | 'contextmenu',
143
- options: MockMouseEventOptions = {}
142
+ options: MockMouseEventOptions = {},
144
143
  ): TypedMockMouseEvent {
145
144
  const event = new MouseEvent(type, {
146
145
  button: options.button ?? 0,
@@ -176,7 +175,7 @@ export function createTypedMouseEvent(
176
175
  export function createTypedCustomEvent<T = unknown>(
177
176
  type: string,
178
177
  detail?: T,
179
- options: { bubbles?: boolean; cancelable?: boolean } = {}
178
+ options: { bubbles?: boolean; cancelable?: boolean } = {},
180
179
  ): CustomEvent<T> {
181
180
  return new CustomEvent(type, {
182
181
  detail,
@@ -199,9 +198,7 @@ export interface MockMessageEventOptions<T = unknown> {
199
198
  source?: MessageEventSource | null;
200
199
  }
201
200
 
202
- export function createTypedMessageEvent<T = unknown>(
203
- options: MockMessageEventOptions<T>
204
- ): MessageEvent<T> {
201
+ export function createTypedMessageEvent<T = unknown>(options: MockMessageEventOptions<T>): MessageEvent<T> {
205
202
  return new MessageEvent('message', {
206
203
  data: options.data,
207
204
  origin: options.origin ?? 'http://localhost',
@@ -213,7 +210,7 @@ export function createTypedMessageEvent<T = unknown>(
213
210
 
214
211
  export function createTypedFocusEvent(
215
212
  type: 'focus' | 'blur' | 'focusin' | 'focusout',
216
- options: { relatedTarget?: EventTarget | null } = {}
213
+ options: { relatedTarget?: EventTarget | null } = {},
217
214
  ): FocusEvent {
218
215
  return new FocusEvent(type, {
219
216
  bubbles: type === 'focusin' || type === 'focusout',
@@ -230,10 +227,7 @@ export interface MockInputEventOptions {
230
227
  isComposing?: boolean;
231
228
  }
232
229
 
233
- export function createTypedInputEvent(
234
- type: 'input' | 'beforeinput',
235
- options: MockInputEventOptions = {}
236
- ): InputEvent {
230
+ export function createTypedInputEvent(type: 'input' | 'beforeinput', options: MockInputEventOptions = {}): InputEvent {
237
231
  return new InputEvent(type, {
238
232
  data: options.data ?? null,
239
233
  inputType: options.inputType ?? 'insertText',
@@ -35,10 +35,7 @@ export interface TypedFetchMock {
35
35
  /** Reset call history */
36
36
  _reset: () => void;
37
37
  /** Add a response for a URL pattern */
38
- _addResponse: (
39
- pattern: string | RegExp,
40
- response: MockFetchResponse | (() => MockFetchResponse)
41
- ) => void;
38
+ _addResponse: (pattern: string | RegExp, response: MockFetchResponse | (() => MockFetchResponse)) => void;
42
39
  }
43
40
 
44
41
  // ========== Response Factory ==========
@@ -55,9 +52,7 @@ function createMockResponse(config: MockFetchResponse): Response {
55
52
  json: config.json ?? (() => Promise.resolve({})),
56
53
  text: config.text ?? (() => Promise.resolve('')),
57
54
  blob: config.blob ?? (() => Promise.resolve(new Blob())),
58
- clone: function () {
59
- return createMockResponse(config);
60
- },
55
+ clone: () => createMockResponse(config),
61
56
  arrayBuffer: () => Promise.resolve(new ArrayBuffer(0)),
62
57
  formData: () => Promise.resolve(new FormData()),
63
58
  body: null,
@@ -74,55 +69,47 @@ export function createTypedFetchMock(config: FetchMockConfig = {}): TypedFetchMo
74
69
  const calls: Array<{ url: string; options?: RequestInit }> = [];
75
70
  const responses = new Map(config.responses || []);
76
71
 
77
- const mockFn = mock(
78
- async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {
79
- const url = typeof input === 'string' ? input : input.toString();
80
- calls.push({ url, options: init });
72
+ const mockFn = mock(async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {
73
+ const url = typeof input === 'string' ? input : input.toString();
74
+ calls.push({ url, options: init });
81
75
 
82
- if (config.delay) {
83
- await new Promise((resolve) => setTimeout(resolve, config.delay));
84
- }
76
+ if (config.delay) {
77
+ await new Promise((resolve) => setTimeout(resolve, config.delay));
78
+ }
85
79
 
86
- // Find matching response
87
- let responseConfig:
88
- | MockFetchResponse
89
- | (() => MockFetchResponse)
90
- | undefined;
91
-
92
- for (const [pattern, response] of responses) {
93
- if (typeof pattern === 'string' && url === pattern) {
94
- responseConfig = response;
95
- break;
96
- }
97
- if (typeof pattern === 'string' && url.includes(pattern)) {
98
- responseConfig = response;
99
- break;
100
- }
101
- if (pattern instanceof RegExp && pattern.test(url)) {
102
- responseConfig = response;
103
- break;
104
- }
105
- }
80
+ // Find matching response
81
+ let responseConfig: MockFetchResponse | (() => MockFetchResponse) | undefined;
106
82
 
107
- if (!responseConfig && config.defaultResponse) {
108
- responseConfig = config.defaultResponse;
83
+ for (const [pattern, response] of responses) {
84
+ if (typeof pattern === 'string' && url === pattern) {
85
+ responseConfig = response;
86
+ break;
109
87
  }
110
-
111
- if (!responseConfig) {
112
- if (config.throwOnUnmatched) {
113
- throw new Error(`Unmatched fetch request: ${url}`);
114
- }
115
- return createMockResponse({ status: 404, ok: false });
88
+ if (typeof pattern === 'string' && url.includes(pattern)) {
89
+ responseConfig = response;
90
+ break;
91
+ }
92
+ if (pattern instanceof RegExp && pattern.test(url)) {
93
+ responseConfig = response;
94
+ break;
116
95
  }
96
+ }
117
97
 
118
- const resolvedConfig =
119
- typeof responseConfig === 'function'
120
- ? responseConfig()
121
- : responseConfig;
98
+ if (!responseConfig && config.defaultResponse) {
99
+ responseConfig = config.defaultResponse;
100
+ }
122
101
 
123
- return createMockResponse(resolvedConfig);
102
+ if (!responseConfig) {
103
+ if (config.throwOnUnmatched) {
104
+ throw new Error(`Unmatched fetch request: ${url}`);
105
+ }
106
+ return createMockResponse({ status: 404, ok: false });
124
107
  }
125
- ) as unknown as TypedFetchMock;
108
+
109
+ const resolvedConfig = typeof responseConfig === 'function' ? responseConfig() : responseConfig;
110
+
111
+ return createMockResponse(resolvedConfig);
112
+ }) as unknown as TypedFetchMock;
126
113
 
127
114
  mockFn._calls = calls;
128
115
  mockFn._reset = () => {
@@ -140,10 +127,7 @@ export function createTypedFetchMock(config: FetchMockConfig = {}): TypedFetchMo
140
127
  /**
141
128
  * Create a fetch mock that returns JSON data
142
129
  */
143
- export function createJsonFetchMock<T>(
144
- responseData: T,
145
- options: Partial<MockFetchResponse> = {}
146
- ): TypedFetchMock {
130
+ export function createJsonFetchMock<T>(responseData: T, options: Partial<MockFetchResponse> = {}): TypedFetchMock {
147
131
  return createTypedFetchMock({
148
132
  defaultResponse: {
149
133
  status: 200,
@@ -158,11 +142,9 @@ export function createJsonFetchMock<T>(
158
142
  /**
159
143
  * Create a fetch mock that returns an error
160
144
  */
161
- export function createErrorFetchMock(
162
- error: Error | string = 'Network error'
163
- ): TypedFetchMock {
145
+ export function createErrorFetchMock(error: Error | string = 'Network error'): TypedFetchMock {
164
146
  const mockFn = mock(() =>
165
- Promise.reject(typeof error === 'string' ? new Error(error) : error)
147
+ Promise.reject(typeof error === 'string' ? new Error(error) : error),
166
148
  ) as unknown as TypedFetchMock;
167
149
 
168
150
  mockFn._calls = [];
@@ -176,7 +158,7 @@ export function createErrorFetchMock(
176
158
  * Create a fetch mock that returns different responses based on URL
177
159
  */
178
160
  export function createRoutedFetchMock(
179
- routes: Record<string, MockFetchResponse | (() => MockFetchResponse)>
161
+ routes: Record<string, MockFetchResponse | (() => MockFetchResponse)>,
180
162
  ): TypedFetchMock {
181
163
  const responses = new Map<string, MockFetchResponse | (() => MockFetchResponse)>();
182
164
  for (const [url, response] of Object.entries(routes)) {
@@ -24,9 +24,7 @@ export interface TypedMockPageProvider extends PageProvider {
24
24
  * Create a typed mock PageProvider
25
25
  * @param initialPages - Initial page content map (path -> content)
26
26
  */
27
- export function createTypedMockPageProvider(
28
- initialPages: Record<string, string> = {}
29
- ): TypedMockPageProvider {
27
+ export function createTypedMockPageProvider(initialPages: Record<string, string> = {}): TypedMockPageProvider {
30
28
  const pages = { ...initialPages };
31
29
 
32
30
  const provider: TypedMockPageProvider = {
@@ -63,7 +61,7 @@ export interface TypedMockComponentProvider extends ComponentProvider {
63
61
  * Create a typed mock ComponentProvider
64
62
  */
65
63
  export function createTypedMockComponentProvider(
66
- initialComponents: Map<string, ComponentDefinition> = new Map()
64
+ initialComponents: Map<string, ComponentDefinition> = new Map(),
67
65
  ): TypedMockComponentProvider {
68
66
  const components = new Map(initialComponents);
69
67
  const js = new Map<string, string>();
@@ -98,7 +96,7 @@ export interface TypedMockComponentServiceFs extends ComponentServiceFs {
98
96
  * Create a typed mock file system for ComponentService
99
97
  */
100
98
  export function createTypedMockComponentServiceFs(
101
- initialFiles: Record<string, string> = {}
99
+ initialFiles: Record<string, string> = {},
102
100
  ): TypedMockComponentServiceFs {
103
101
  const files = { ...initialFiles };
104
102
 
@@ -126,7 +124,7 @@ export interface TypedMockComponentLoader extends ComponentLoader {
126
124
  * Create a typed mock component loader
127
125
  */
128
126
  export function createTypedMockComponentLoader(
129
- components: Map<string, ComponentDefinition> = new Map()
127
+ components: Map<string, ComponentDefinition> = new Map(),
130
128
  ): TypedMockComponentLoader {
131
129
  const storedComponents = new Map(components);
132
130
 
@@ -158,9 +156,7 @@ export interface TypedMockFs {
158
156
  * Create a comprehensive mock file system (similar to fs/promises)
159
157
  * @param initialFiles - Initial file content map (path -> content)
160
158
  */
161
- export function createTypedMockFs(
162
- initialFiles: Record<string, string> = {}
163
- ): TypedMockFs {
159
+ export function createTypedMockFs(initialFiles: Record<string, string> = {}): TypedMockFs {
164
160
  const files = { ...initialFiles };
165
161
 
166
162
  const makeError = (code: string, message: string) => {
@@ -186,7 +182,7 @@ export function createTypedMockFs(
186
182
  delete files[path];
187
183
  }),
188
184
  readdir: mock(async (dir: string) => {
189
- const normalizedDir = dir.endsWith('/') ? dir : dir + '/';
185
+ const normalizedDir = dir.endsWith('/') ? dir : `${dir}/`;
190
186
  const entries = new Set<string>();
191
187
  for (const path of Object.keys(files)) {
192
188
  if (path.startsWith(normalizedDir)) {
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import { mock } from 'bun:test';
7
- import type { ComponentNode, JSONPage, PageData } from '../../shared/types';
7
+ import type { ComponentNode, PageData } from '../../shared/types';
8
8
  import type { Path } from '../../shared/pathArrayUtils';
9
9
 
10
10
  // ========== FileStore Types ==========
@@ -48,14 +48,13 @@ export interface MockFileStoreActions {
48
48
  clearError: ReturnType<typeof mock>;
49
49
  }
50
50
 
51
- export type TypedMockFileStore = MockFileStoreState & MockFileStoreActions & {
52
- /** Get current state (for assertions) */
53
- getState: () => MockFileStoreState;
54
- };
51
+ export type TypedMockFileStore = MockFileStoreState &
52
+ MockFileStoreActions & {
53
+ /** Get current state (for assertions) */
54
+ getState: () => MockFileStoreState;
55
+ };
55
56
 
56
- export function createTypedMockFileStore(
57
- initialState: Partial<MockFileStoreState> = {}
58
- ): TypedMockFileStore {
57
+ export function createTypedMockFileStore(initialState: Partial<MockFileStoreState> = {}): TypedMockFileStore {
59
58
  const state: MockFileStoreState = {
60
59
  files: [],
61
60
  selectedFile: null,
@@ -137,7 +136,7 @@ export type TypedMockSelectionStore = MockSelectionStoreState &
137
136
  };
138
137
 
139
138
  export function createTypedMockSelectionStore(
140
- initialState: Partial<MockSelectionStoreState> = {}
139
+ initialState: Partial<MockSelectionStoreState> = {},
141
140
  ): TypedMockSelectionStore {
142
141
  const state: MockSelectionStoreState = {
143
142
  selectedTreeItem: null,
@@ -208,9 +207,7 @@ export type TypedMockNodeStore = MockNodeStoreState &
208
207
  getState: () => MockNodeStoreState;
209
208
  };
210
209
 
211
- export function createTypedMockNodeStore(
212
- initialState: Partial<MockNodeStoreState> = {}
213
- ): TypedMockNodeStore {
210
+ export function createTypedMockNodeStore(initialState: Partial<MockNodeStoreState> = {}): TypedMockNodeStore {
214
211
  const state: MockNodeStoreState = {
215
212
  pageData: null,
216
213
  isDirty: false,
@@ -225,19 +222,19 @@ export function createTypedMockNodeStore(
225
222
  state.isDirty = false;
226
223
  store.isDirty = false;
227
224
  }),
228
- updateNode: mock((path: Path, updates: Partial<ComponentNode>) => {
225
+ updateNode: mock((_path: Path, _updates: Partial<ComponentNode>) => {
229
226
  state.isDirty = true;
230
227
  store.isDirty = true;
231
228
  }),
232
- deleteNode: mock((path: Path) => {
229
+ deleteNode: mock((_path: Path) => {
233
230
  state.isDirty = true;
234
231
  store.isDirty = true;
235
232
  }),
236
- addNode: mock((parentPath: Path, node: ComponentNode, index?: number) => {
233
+ addNode: mock((_parentPath: Path, _node: ComponentNode, _index?: number) => {
237
234
  state.isDirty = true;
238
235
  store.isDirty = true;
239
236
  }),
240
- moveNode: mock((fromPath: Path, toPath: Path) => {
237
+ moveNode: mock((_fromPath: Path, _toPath: Path) => {
241
238
  state.isDirty = true;
242
239
  store.isDirty = true;
243
240
  }),
@@ -275,7 +272,7 @@ export type TypedMockComponentStore = MockComponentStoreState &
275
272
  };
276
273
 
277
274
  export function createTypedMockComponentStore(
278
- initialState: Partial<MockComponentStoreState> = {}
275
+ initialState: Partial<MockComponentStoreState> = {},
279
276
  ): TypedMockComponentStore {
280
277
  const state: MockComponentStoreState = {
281
278
  components: new Map(),
@@ -336,12 +333,8 @@ export interface TypedMockEditorServices {
336
333
  export function createTypedMockEditorServices(): TypedMockEditorServices {
337
334
  return {
338
335
  fileService: {
339
- loadAllFiles: mock(() =>
340
- Promise.resolve({ pages: [], components: [] })
341
- ),
342
- loadFileData: mock(() =>
343
- Promise.resolve({ component: { type: 'div', children: [] } })
344
- ),
336
+ loadAllFiles: mock(() => Promise.resolve({ pages: [], components: [] })),
337
+ loadFileData: mock(() => Promise.resolve({ component: { type: 'div', children: [] } })),
345
338
  saveFileData: mock(() => Promise.resolve()),
346
339
  saveComponentJS: mock(() => Promise.resolve()),
347
340
  saveComponentCSS: mock(() => Promise.resolve()),
@@ -359,12 +352,8 @@ export function createTypedMockEditorServices(): TypedMockEditorServices {
359
352
  },
360
353
  fileStoreService: {
361
354
  loadFiles: mock(() => Promise.resolve()),
362
- selectFile: mock(() =>
363
- Promise.resolve({ component: { type: 'div', children: [] } })
364
- ),
365
- reloadSelectedFilePreservingSelection: mock(() =>
366
- Promise.resolve({ component: { type: 'div', children: [] } })
367
- ),
355
+ selectFile: mock(() => Promise.resolve({ component: { type: 'div', children: [] } })),
356
+ reloadSelectedFilePreservingSelection: mock(() => Promise.resolve({ component: { type: 'div', children: [] } })),
368
357
  },
369
358
  };
370
359
  }
@@ -3,7 +3,7 @@
3
3
  * Common test data and fixtures for reuse across tests
4
4
  */
5
5
 
6
- import type { Path } from "../shared/pathArrayUtils";
6
+ import type { Path } from '../shared/pathArrayUtils';
7
7
 
8
8
  /**
9
9
  * Common test paths
@@ -24,14 +24,14 @@ export const TEST_PATHS = {
24
24
  * Common component names for testing
25
25
  */
26
26
  export const TEST_COMPONENTS = {
27
- BUTTON: "Button",
28
- CARD: "Card",
29
- HEADER: "Header",
30
- FOOTER: "Footer",
31
- LAYOUT: "Layout",
32
- GRID: "Grid",
33
- FORM: "Form",
34
- INPUT: "Input",
27
+ BUTTON: 'Button',
28
+ CARD: 'Card',
29
+ HEADER: 'Header',
30
+ FOOTER: 'Footer',
31
+ LAYOUT: 'Layout',
32
+ GRID: 'Grid',
33
+ FORM: 'Form',
34
+ INPUT: 'Input',
35
35
  };
36
36
 
37
37
  /**
@@ -39,48 +39,48 @@ export const TEST_COMPONENTS = {
39
39
  */
40
40
  export const SAMPLE_STRUCTURES = {
41
41
  button: {
42
- type: "button",
42
+ type: 'button',
43
43
  props: {
44
- className: "btn",
45
- onClick: "handleClick",
44
+ className: 'btn',
45
+ onClick: 'handleClick',
46
46
  },
47
- children: ["Click me"],
47
+ children: ['Click me'],
48
48
  },
49
49
  card: {
50
- type: "div",
50
+ type: 'div',
51
51
  props: {
52
- className: "card",
52
+ className: 'card',
53
53
  },
54
54
  children: [
55
55
  {
56
- type: "h3",
57
- props: { className: "card-title" },
58
- children: ["Card Title"],
56
+ type: 'h3',
57
+ props: { className: 'card-title' },
58
+ children: ['Card Title'],
59
59
  },
60
60
  {
61
- type: "div",
62
- props: { className: "card-content" },
63
- children: ["Card content here"],
61
+ type: 'div',
62
+ props: { className: 'card-content' },
63
+ children: ['Card content here'],
64
64
  },
65
65
  ],
66
66
  },
67
67
  layout: {
68
- type: "div",
68
+ type: 'div',
69
69
  props: {
70
- className: "layout",
70
+ className: 'layout',
71
71
  },
72
72
  children: [
73
73
  {
74
- type: "header",
75
- children: ["Header"],
74
+ type: 'header',
75
+ children: ['Header'],
76
76
  },
77
77
  {
78
- type: "main",
79
- children: ["Content"],
78
+ type: 'main',
79
+ children: ['Content'],
80
80
  },
81
81
  {
82
- type: "footer",
83
- children: ["Footer"],
82
+ type: 'footer',
83
+ children: ['Footer'],
84
84
  },
85
85
  ],
86
86
  },
@@ -91,21 +91,21 @@ export const SAMPLE_STRUCTURES = {
91
91
  */
92
92
  export const SAMPLE_PROPS = {
93
93
  buttonPrimary: {
94
- variant: "primary",
95
- size: "md",
94
+ variant: 'primary',
95
+ size: 'md',
96
96
  disabled: false,
97
97
  },
98
98
  buttonSecondary: {
99
- variant: "secondary",
100
- size: "lg",
99
+ variant: 'secondary',
100
+ size: 'lg',
101
101
  disabled: false,
102
102
  },
103
103
  cardVariant: {
104
- variant: "elevated",
104
+ variant: 'elevated',
105
105
  compact: false,
106
106
  },
107
107
  layoutProps: {
108
- spacing: "default",
108
+ spacing: 'default',
109
109
  responsive: true,
110
110
  },
111
111
  };
@@ -114,12 +114,12 @@ export const SAMPLE_PROPS = {
114
114
  * Error messages for testing error handling
115
115
  */
116
116
  export const ERROR_MESSAGES = {
117
- RENDER_ERROR: "Component render failed",
118
- STRUCTURE_MISSING: "Component structure missing",
119
- INVALID_PROP_TYPE: "Invalid prop type",
120
- TEMPLATE_ERROR: "Template evaluation error",
121
- COMPONENT_NOT_FOUND: "Component not found",
122
- PATH_RESOLUTION: "Failed to resolve path",
117
+ RENDER_ERROR: 'Component render failed',
118
+ STRUCTURE_MISSING: 'Component structure missing',
119
+ INVALID_PROP_TYPE: 'Invalid prop type',
120
+ TEMPLATE_ERROR: 'Template evaluation error',
121
+ COMPONENT_NOT_FOUND: 'Component not found',
122
+ PATH_RESOLUTION: 'Failed to resolve path',
123
123
  };
124
124
 
125
125
  /**
@@ -127,8 +127,8 @@ export const ERROR_MESSAGES = {
127
127
  */
128
128
  export const DEFAULT_TEST_CONFIG = {
129
129
  timeout: 5000,
130
- scrollBehavior: "smooth" as const,
131
- outlineColor: "#007acc",
132
- outlineWidth: "2px",
133
- outlineStyle: "solid" as const,
130
+ scrollBehavior: 'smooth' as const,
131
+ outlineColor: '#007acc',
132
+ outlineWidth: '2px',
133
+ outlineStyle: 'solid' as const,
134
134
  };
@@ -1,31 +1,26 @@
1
1
  import { describe, test, expect } from 'bun:test';
2
- import {
3
- waitFor,
4
- flushPromises,
5
- wait,
6
- createDeferred,
7
- retry,
8
- createCallCounter,
9
- } from './asyncHelpers';
2
+ import { waitFor, flushPromises, wait, createDeferred, retry, createCallCounter } from './asyncHelpers';
10
3
 
11
4
  describe('asyncHelpers', () => {
12
5
  describe('waitFor', () => {
13
6
  test('resolves when condition is true', async () => {
14
7
  let value = false;
15
- setTimeout(() => { value = true; }, 50);
8
+ setTimeout(() => {
9
+ value = true;
10
+ }, 50);
16
11
  await waitFor(() => value);
17
12
  expect(value).toBe(true);
18
13
  });
19
14
 
20
15
  test('throws on timeout', async () => {
21
- await expect(
22
- waitFor(() => false, { timeout: 100 })
23
- ).rejects.toThrow('timed out');
16
+ await expect(waitFor(() => false, { timeout: 100 })).rejects.toThrow('timed out');
24
17
  });
25
18
 
26
19
  test('handles async conditions', async () => {
27
20
  let value = false;
28
- setTimeout(() => { value = true; }, 50);
21
+ setTimeout(() => {
22
+ value = true;
23
+ }, 50);
29
24
  await waitFor(async () => value);
30
25
  expect(value).toBe(true);
31
26
  });
@@ -34,7 +29,9 @@ describe('asyncHelpers', () => {
34
29
  describe('flushPromises', () => {
35
30
  test('waits for microtask queue', async () => {
36
31
  let resolved = false;
37
- Promise.resolve().then(() => { resolved = true; });
32
+ Promise.resolve().then(() => {
33
+ resolved = true;
34
+ });
38
35
  expect(resolved).toBe(false);
39
36
  await flushPromises();
40
37
  expect(resolved).toBe(true);
@@ -85,10 +82,10 @@ describe('asyncHelpers', () => {
85
82
  });
86
83
 
87
84
  test('throws after max attempts', async () => {
88
- const fn = () => { throw new Error('Always fails'); };
89
- await expect(
90
- retry(fn, { maxAttempts: 2, delay: 10 })
91
- ).rejects.toThrow('Always fails');
85
+ const fn = () => {
86
+ throw new Error('Always fails');
87
+ };
88
+ await expect(retry(fn, { maxAttempts: 2, delay: 10 })).rejects.toThrow('Always fails');
92
89
  });
93
90
  });
94
91