meno-core 1.0.53 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (415) hide show
  1. package/.claude/settings.local.json +1 -3
  2. package/bin/cli.ts +66 -261
  3. package/build-astro.ts +150 -128
  4. package/dist/bin/cli.js +42 -185
  5. package/dist/bin/cli.js.map +2 -2
  6. package/dist/chunks/chunk-2AR55GYH.js +42 -0
  7. package/dist/chunks/chunk-2AR55GYH.js.map +7 -0
  8. package/dist/chunks/{chunk-JGWFTO6P.js → chunk-2IIQK7T3.js} +2624 -1389
  9. package/dist/chunks/chunk-2IIQK7T3.js.map +7 -0
  10. package/dist/chunks/chunk-4ZRU52J2.js +169 -0
  11. package/dist/chunks/chunk-4ZRU52J2.js.map +7 -0
  12. package/dist/chunks/{chunk-UB44F4Z2.js → chunk-5X4HCN7J.js} +5 -7
  13. package/dist/chunks/chunk-5X4HCN7J.js.map +7 -0
  14. package/dist/chunks/{chunk-WQFG7PAH.js → chunk-7CCVOL5M.js} +15 -19
  15. package/dist/chunks/chunk-7CCVOL5M.js.map +7 -0
  16. package/dist/chunks/{chunk-YBLHKYFF.js → chunk-AR7LHIFY.js} +8 -2
  17. package/dist/chunks/chunk-AR7LHIFY.js.map +7 -0
  18. package/dist/chunks/{chunk-O3NAGJP4.js → chunk-NUP7H7D3.js} +135 -41
  19. package/dist/chunks/chunk-NUP7H7D3.js.map +7 -0
  20. package/dist/chunks/{chunk-X754AHS5.js → chunk-QWTQZHG3.js} +194 -90
  21. package/dist/chunks/chunk-QWTQZHG3.js.map +7 -0
  22. package/dist/chunks/{chunk-H3GJ4H2U.js → chunk-XTKNX4FW.js} +216 -87
  23. package/dist/chunks/chunk-XTKNX4FW.js.map +7 -0
  24. package/dist/chunks/{fs-JGINUXGL.js → fs-G3ANWEFP.js} +2 -2
  25. package/dist/lib/client/index.js +1003 -475
  26. package/dist/lib/client/index.js.map +3 -3
  27. package/dist/lib/server/index.js +14393 -6371
  28. package/dist/lib/server/index.js.map +4 -4
  29. package/dist/lib/shared/index.js +342 -101
  30. package/dist/lib/shared/index.js.map +4 -4
  31. package/dist/lib/shared/richtext/index.js +1 -1
  32. package/dist/lib/test-utils/index.js +64 -80
  33. package/dist/lib/test-utils/index.js.map +2 -2
  34. package/entries/client-router.tsx +10 -8
  35. package/lib/client/ClientInitializer.ts +8 -8
  36. package/lib/client/ErrorBoundary.test.tsx +246 -186
  37. package/lib/client/ErrorBoundary.tsx +183 -132
  38. package/lib/client/componentRegistry.test.ts +96 -108
  39. package/lib/client/componentRegistry.ts +1 -3
  40. package/lib/client/contexts/ThemeContext.tsx +3 -2
  41. package/lib/client/core/ComponentBuilder.test.ts +663 -560
  42. package/lib/client/core/ComponentBuilder.ts +427 -155
  43. package/lib/client/core/ComponentRenderer.test.tsx +2 -4
  44. package/lib/client/core/ComponentRenderer.tsx +46 -33
  45. package/lib/client/core/builders/embedBuilder.ts +242 -54
  46. package/lib/client/core/builders/linkBuilder.ts +72 -45
  47. package/lib/client/core/builders/linkNodeBuilder.ts +79 -54
  48. package/lib/client/core/builders/listBuilder.ts +155 -89
  49. package/lib/client/core/builders/localeListBuilder.ts +97 -62
  50. package/lib/client/core/builders/types.ts +5 -5
  51. package/lib/client/core/cmsTemplateProcessor.ts +8 -9
  52. package/lib/client/elementRegistry.ts +3 -3
  53. package/lib/client/fontFamiliesService.test.ts +2 -10
  54. package/lib/client/fontFamiliesService.ts +3 -3
  55. package/lib/client/hmr/HMRManager.tsx +47 -30
  56. package/lib/client/hmrCssReload.ts +49 -14
  57. package/lib/client/hmrWebSocket.ts +14 -19
  58. package/lib/client/hooks/useColorVariables.test.ts +21 -21
  59. package/lib/client/hooks/useColorVariables.ts +23 -18
  60. package/lib/client/hooks/usePropertyAutocomplete.ts +4 -6
  61. package/lib/client/hooks/useVariables.ts +6 -4
  62. package/lib/client/hydration/HydrationUtils.test.ts +24 -25
  63. package/lib/client/hydration/HydrationUtils.ts +3 -4
  64. package/lib/client/i18nConfigService.test.ts +2 -7
  65. package/lib/client/i18nConfigService.ts +2 -2
  66. package/lib/client/meno-filter/MenoFilter.test.ts +47 -49
  67. package/lib/client/meno-filter/MenoFilter.ts +14 -15
  68. package/lib/client/meno-filter/bindings.ts +18 -43
  69. package/lib/client/meno-filter/init.ts +4 -4
  70. package/lib/client/meno-filter/renderer.ts +30 -32
  71. package/lib/client/meno-filter/script.generated.ts +1 -3
  72. package/lib/client/meno-filter/ui.ts +4 -6
  73. package/lib/client/meno-filter/updates.ts +18 -23
  74. package/lib/client/meno-filter/utils.ts +1 -1
  75. package/lib/client/navigation.test.ts +174 -178
  76. package/lib/client/navigation.ts +0 -1
  77. package/lib/client/responsiveStyleResolver.knownTokens.test.ts +71 -0
  78. package/lib/client/responsiveStyleResolver.test.ts +234 -232
  79. package/lib/client/responsiveStyleResolver.ts +74 -20
  80. package/lib/client/routing/RouteLoader.test.ts +24 -25
  81. package/lib/client/routing/RouteLoader.ts +27 -35
  82. package/lib/client/routing/Router.tsx +210 -153
  83. package/lib/client/scripts/ScriptExecutor.test.ts +157 -158
  84. package/lib/client/scripts/ScriptExecutor.ts +18 -36
  85. package/lib/client/services/PrefetchService.test.ts +3 -3
  86. package/lib/client/services/PrefetchService.ts +23 -29
  87. package/lib/client/styleProcessor.test.ts +9 -9
  88. package/lib/client/styleProcessor.ts +24 -15
  89. package/lib/client/styles/StyleInjector.test.ts +122 -115
  90. package/lib/client/styles/StyleInjector.ts +10 -7
  91. package/lib/client/styles/UtilityClassCollector.ts +62 -28
  92. package/lib/client/styles/cspNonce.test.ts +2 -5
  93. package/lib/client/templateEngine.test.ts +554 -488
  94. package/lib/client/templateEngine.ts +203 -73
  95. package/lib/client/theme.test.ts +1 -1
  96. package/lib/client/theme.ts +0 -1
  97. package/lib/client/utils/toast.ts +0 -1
  98. package/lib/server/__integration__/api-routes.test.ts +8 -4
  99. package/lib/server/__integration__/cms-integration.test.ts +1 -4
  100. package/lib/server/__integration__/server-lifecycle.test.ts +4 -5
  101. package/lib/server/__integration__/ssr-rendering.test.ts +47 -37
  102. package/lib/server/__integration__/static-assets.test.ts +3 -3
  103. package/lib/server/__integration__/test-helpers.ts +87 -74
  104. package/lib/server/ab/generateFunctions.ts +12 -10
  105. package/lib/server/astro/cmsPageEmitter.ts +26 -42
  106. package/lib/server/astro/componentEmitter.ts +35 -43
  107. package/lib/server/astro/cssCollector.ts +10 -26
  108. package/lib/server/astro/nodeToAstro.test.ts +1754 -34
  109. package/lib/server/astro/nodeToAstro.ts +232 -216
  110. package/lib/server/astro/normalizeOrphanTemplateProps.test.ts +115 -119
  111. package/lib/server/astro/normalizeOrphanTemplateProps.ts +11 -18
  112. package/lib/server/astro/pageEmitter.ts +9 -13
  113. package/lib/server/astro/tailwindMapper.test.ts +10 -37
  114. package/lib/server/astro/tailwindMapper.ts +33 -40
  115. package/lib/server/astro/templateTransformer.ts +17 -20
  116. package/lib/server/createServer.ts +7 -19
  117. package/lib/server/cssGenerator.test.ts +35 -44
  118. package/lib/server/cssGenerator.ts +8 -19
  119. package/lib/server/fileWatcher.test.ts +164 -13
  120. package/lib/server/fileWatcher.ts +209 -124
  121. package/lib/server/index.ts +14 -17
  122. package/lib/server/jsonLoader.test.ts +39 -2
  123. package/lib/server/jsonLoader.ts +39 -34
  124. package/lib/server/middleware/cors.test.ts +21 -21
  125. package/lib/server/middleware/cors.ts +28 -4
  126. package/lib/server/middleware/errorHandler.test.ts +7 -5
  127. package/lib/server/middleware/errorHandler.ts +3 -8
  128. package/lib/server/middleware/index.ts +0 -1
  129. package/lib/server/middleware/logger.test.ts +10 -8
  130. package/lib/server/middleware/logger.ts +17 -29
  131. package/lib/server/migrateTemplates.ts +3 -3
  132. package/lib/server/pageCache.test.ts +76 -77
  133. package/lib/server/pageCache.ts +0 -1
  134. package/lib/server/projectContext.ts +5 -4
  135. package/lib/server/providers/fileSystemCMSProvider.test.ts +142 -99
  136. package/lib/server/providers/fileSystemCMSProvider.ts +62 -38
  137. package/lib/server/routes/api/cms.test.ts +26 -14
  138. package/lib/server/routes/api/cms.ts +9 -14
  139. package/lib/server/routes/api/colors.test.ts +2 -2
  140. package/lib/server/routes/api/components.ts +31 -35
  141. package/lib/server/routes/api/config.ts +3 -4
  142. package/lib/server/routes/api/core-routes.ts +49 -76
  143. package/lib/server/routes/api/enums.test.ts +2 -2
  144. package/lib/server/routes/api/functions.ts +9 -17
  145. package/lib/server/routes/api/index.ts +3 -6
  146. package/lib/server/routes/api/pages.ts +8 -11
  147. package/lib/server/routes/api/shared.test.ts +1 -1
  148. package/lib/server/routes/api/shared.ts +12 -9
  149. package/lib/server/routes/api/variables.test.ts +3 -5
  150. package/lib/server/routes/api/variables.ts +1 -1
  151. package/lib/server/routes/index.ts +25 -28
  152. package/lib/server/routes/pages.ts +35 -31
  153. package/lib/server/routes/static.ts +17 -6
  154. package/lib/server/runtime/bundler.ts +98 -61
  155. package/lib/server/runtime/fs.ts +16 -26
  156. package/lib/server/runtime/httpServer.ts +8 -12
  157. package/lib/server/services/ColorService.test.ts +3 -3
  158. package/lib/server/services/ColorService.ts +37 -29
  159. package/lib/server/services/EnumService.test.ts +4 -8
  160. package/lib/server/services/EnumService.ts +11 -3
  161. package/lib/server/services/VariableService.test.ts +8 -12
  162. package/lib/server/services/VariableService.ts +11 -3
  163. package/lib/server/services/cmsService.test.ts +158 -120
  164. package/lib/server/services/cmsService.ts +36 -146
  165. package/lib/server/services/componentService.test.ts +125 -45
  166. package/lib/server/services/componentService.ts +70 -46
  167. package/lib/server/services/configService.test.ts +22 -45
  168. package/lib/server/services/configService.ts +50 -27
  169. package/lib/server/services/fileWatcherService.ts +42 -8
  170. package/lib/server/services/index.ts +0 -1
  171. package/lib/server/services/pageService.test.ts +8 -10
  172. package/lib/server/services/pageService.ts +32 -18
  173. package/lib/server/ssr/attributeBuilder.ts +18 -8
  174. package/lib/server/ssr/buildErrorOverlay.ts +11 -12
  175. package/lib/server/ssr/clientDataInjector.ts +7 -21
  176. package/lib/server/ssr/cmsSSRProcessor.ts +4 -8
  177. package/lib/server/ssr/cssCollector.ts +1 -1
  178. package/lib/server/ssr/errorOverlay.test.ts +1 -1
  179. package/lib/server/ssr/errorOverlay.ts +3 -9
  180. package/lib/server/ssr/htmlGenerator.nonce.test.ts +9 -14
  181. package/lib/server/ssr/htmlGenerator.test.ts +120 -44
  182. package/lib/server/ssr/htmlGenerator.ts +126 -91
  183. package/lib/server/ssr/imageMetadata.test.ts +3 -1
  184. package/lib/server/ssr/imageMetadata.ts +27 -21
  185. package/lib/server/ssr/jsCollector.test.ts +8 -18
  186. package/lib/server/ssr/jsCollector.ts +3 -8
  187. package/lib/server/ssr/liveReloadIntegration.test.ts +76 -36
  188. package/lib/server/ssr/metaTagGenerator.ts +2 -2
  189. package/lib/server/ssr/ssrRenderer.branches.test.ts +1103 -0
  190. package/lib/server/ssr/ssrRenderer.test.ts +316 -256
  191. package/lib/server/ssr/ssrRenderer.ts +795 -243
  192. package/lib/server/ssrRenderer.test.ts +1048 -954
  193. package/lib/server/utils/jsonLineMapper.test.ts +28 -28
  194. package/lib/server/utils/jsonLineMapper.ts +7 -7
  195. package/lib/server/validateStyleCoverage.ts +18 -21
  196. package/lib/server/websocketManager.ts +28 -19
  197. package/lib/shared/attributeNodeUtils.test.ts +15 -15
  198. package/lib/shared/attributeNodeUtils.ts +5 -12
  199. package/lib/shared/breakpoints.test.ts +5 -5
  200. package/lib/shared/breakpoints.ts +4 -11
  201. package/lib/shared/cmsQuery.test.ts +81 -0
  202. package/lib/shared/cmsQuery.ts +92 -0
  203. package/lib/shared/cmsQueryParser.test.ts +50 -42
  204. package/lib/shared/cmsQueryParser.ts +60 -38
  205. package/lib/shared/colorConversions.ts +9 -9
  206. package/lib/shared/colorVariableUtils.test.ts +27 -5
  207. package/lib/shared/colorVariableUtils.ts +21 -12
  208. package/lib/shared/componentRefs.ts +1 -5
  209. package/lib/shared/constants.test.ts +3 -3
  210. package/lib/shared/constants.ts +8 -8
  211. package/lib/shared/cssGeneration.test.ts +285 -144
  212. package/lib/shared/cssGeneration.ts +217 -531
  213. package/lib/shared/cssNamedColors.ts +152 -30
  214. package/lib/shared/cssProperties.test.ts +69 -70
  215. package/lib/shared/cssProperties.ts +298 -114
  216. package/lib/shared/elementClassName.test.ts +109 -109
  217. package/lib/shared/elementClassName.ts +3 -3
  218. package/lib/shared/elementUtils.ts +12 -16
  219. package/lib/shared/errorLogger.test.ts +12 -12
  220. package/lib/shared/errorLogger.ts +2 -10
  221. package/lib/shared/errors.test.ts +2 -13
  222. package/lib/shared/errors.ts +2 -8
  223. package/lib/shared/expressionEvaluator.test.ts +145 -0
  224. package/lib/shared/expressionEvaluator.ts +52 -24
  225. package/lib/shared/fontLoader.test.ts +32 -18
  226. package/lib/shared/fontLoader.ts +2 -2
  227. package/lib/shared/friendlyError.ts +2 -3
  228. package/lib/shared/gradientUtils.test.ts +3 -7
  229. package/lib/shared/gradientUtils.ts +17 -14
  230. package/lib/shared/hrefRefs.test.ts +2 -2
  231. package/lib/shared/hrefRefs.ts +2 -10
  232. package/lib/shared/i18n.test.ts +4 -4
  233. package/lib/shared/i18n.ts +18 -38
  234. package/lib/shared/index.ts +27 -0
  235. package/lib/shared/inlineSvgStyleRules.ts +14 -13
  236. package/lib/shared/interactiveStyleMappings.test.ts +32 -54
  237. package/lib/shared/interactiveStyleMappings.ts +11 -24
  238. package/lib/shared/interactiveStyles.test.ts +165 -188
  239. package/lib/shared/interfaces/contentProvider.ts +1 -1
  240. package/lib/shared/itemTemplateUtils.test.ts +11 -17
  241. package/lib/shared/itemTemplateUtils.ts +27 -39
  242. package/lib/shared/jsonRepair.ts +16 -10
  243. package/lib/shared/libraryLoader.test.ts +21 -55
  244. package/lib/shared/libraryLoader.ts +7 -22
  245. package/lib/shared/linkUtils.ts +1 -1
  246. package/lib/shared/logger.test.ts +66 -0
  247. package/lib/shared/logger.ts +94 -0
  248. package/lib/shared/markdown.ts +25 -0
  249. package/lib/shared/netlifyLocale404.test.ts +179 -0
  250. package/lib/shared/netlifyLocale404.ts +110 -0
  251. package/lib/shared/nodeUtils.test.ts +28 -16
  252. package/lib/shared/nodeUtils.ts +76 -23
  253. package/lib/shared/pathArrayUtils.test.ts +1 -2
  254. package/lib/shared/pathArrayUtils.ts +1 -1
  255. package/lib/shared/pathSecurity.ts +2 -2
  256. package/lib/shared/pathUtils.test.ts +4 -6
  257. package/lib/shared/pathUtils.ts +42 -49
  258. package/lib/shared/paths/Path.test.ts +2 -2
  259. package/lib/shared/paths/Path.ts +0 -1
  260. package/lib/shared/paths/PathConverter.test.ts +1 -1
  261. package/lib/shared/paths/PathConverter.ts +17 -20
  262. package/lib/shared/paths/PathUtils.ts +13 -13
  263. package/lib/shared/paths/PathValidator.test.ts +2 -15
  264. package/lib/shared/paths/PathValidator.ts +12 -10
  265. package/lib/shared/paths/index.ts +1 -2
  266. package/lib/shared/permissions.test.ts +168 -0
  267. package/lib/shared/permissions.ts +162 -0
  268. package/lib/shared/propResolver.test.ts +240 -244
  269. package/lib/shared/propResolver.ts +15 -26
  270. package/lib/shared/pxToRem.test.ts +7 -6
  271. package/lib/shared/pxToRem.ts +2 -5
  272. package/lib/shared/registry/BaseNodeTypeRegistry.test.ts +12 -6
  273. package/lib/shared/registry/ClientRegistry.ts +0 -2
  274. package/lib/shared/registry/ComponentRegistry.test.ts +46 -32
  275. package/lib/shared/registry/ComponentRegistry.ts +12 -9
  276. package/lib/shared/registry/NodeTypeDefinition.ts +16 -9
  277. package/lib/shared/registry/RegistryManager.ts +1 -2
  278. package/lib/shared/registry/SSRRegistry.ts +0 -2
  279. package/lib/shared/registry/createNodeType.ts +7 -9
  280. package/lib/shared/registry/defineNodeType.ts +2 -6
  281. package/lib/shared/registry/fieldPresets.ts +3 -1
  282. package/lib/shared/registry/index.ts +0 -1
  283. package/lib/shared/registry/nodeTypes/ComponentInstanceNodeType.ts +14 -15
  284. package/lib/shared/registry/nodeTypes/CustomNodeType.ts +103 -0
  285. package/lib/shared/registry/nodeTypes/EmbedNodeType.ts +18 -11
  286. package/lib/shared/registry/nodeTypes/HtmlNodeType.ts +48 -19
  287. package/lib/shared/registry/nodeTypes/IslandNodeType.ts +129 -0
  288. package/lib/shared/registry/nodeTypes/LinkNodeType.ts +21 -19
  289. package/lib/shared/registry/nodeTypes/ListNodeType.ts +117 -77
  290. package/lib/shared/registry/nodeTypes/LocaleListNodeType.ts +27 -21
  291. package/lib/shared/registry/nodeTypes/MarkdownNodeType.ts +78 -0
  292. package/lib/shared/registry/nodeTypes/SlotMarkerType.ts +12 -8
  293. package/lib/shared/registry/nodeTypes/index.ts +26 -3
  294. package/lib/shared/responsiveScaling.test.ts +16 -34
  295. package/lib/shared/responsiveScaling.ts +61 -42
  296. package/lib/shared/responsiveStyleUtils.test.ts +0 -1
  297. package/lib/shared/responsiveStyleUtils.ts +11 -13
  298. package/lib/shared/richtext/htmlToTiptap.test.ts +139 -130
  299. package/lib/shared/richtext/htmlToTiptap.ts +2 -4
  300. package/lib/shared/richtext/tiptapToHtml.test.ts +5 -6
  301. package/lib/shared/richtext/types.ts +1 -8
  302. package/lib/shared/slugTranslator.test.ts +13 -13
  303. package/lib/shared/slugTranslator.ts +12 -16
  304. package/lib/shared/slugify.ts +9 -15
  305. package/lib/shared/styleNodeUtils.test.ts +8 -8
  306. package/lib/shared/styleNodeUtils.ts +18 -20
  307. package/lib/shared/styleUtils.test.ts +87 -61
  308. package/lib/shared/styleUtils.ts +5 -6
  309. package/lib/shared/themeDefaults.test.ts +11 -14
  310. package/lib/shared/themeDefaults.ts +3 -4
  311. package/lib/shared/tree/PathBuilder.test.ts +63 -145
  312. package/lib/shared/tree/PathBuilder.ts +59 -47
  313. package/lib/shared/treePathUtils.test.ts +51 -12
  314. package/lib/shared/treePathUtils.ts +91 -60
  315. package/lib/shared/types/api.ts +105 -8
  316. package/lib/shared/types/cms.test.ts +34 -0
  317. package/lib/shared/types/cms.ts +90 -34
  318. package/lib/shared/types/comment.ts +49 -16
  319. package/lib/shared/types/components.ts +51 -25
  320. package/lib/shared/types/errors.test.ts +1 -6
  321. package/lib/shared/types/errors.ts +3 -7
  322. package/lib/shared/types/experiments.ts +28 -28
  323. package/lib/shared/types/index.ts +25 -2
  324. package/lib/shared/types/permissions.ts +139 -0
  325. package/lib/shared/types/styles.ts +0 -1
  326. package/lib/shared/types/variables.test.ts +4 -13
  327. package/lib/shared/types/variables.ts +51 -30
  328. package/lib/shared/types.ts +1 -2
  329. package/lib/shared/utilityClassConfig.ts +751 -321
  330. package/lib/shared/utilityClassMapper.durability.test.ts +117 -0
  331. package/lib/shared/utilityClassMapper.test.ts +433 -95
  332. package/lib/shared/utilityClassMapper.ts +322 -249
  333. package/lib/shared/utilityClassNames.test.ts +38 -0
  334. package/lib/shared/utilityClassNames.ts +458 -0
  335. package/lib/shared/utils.test.ts +2 -10
  336. package/lib/shared/utils.ts +19 -10
  337. package/lib/shared/validation/cmsValidators.ts +2 -1
  338. package/lib/shared/validation/commentValidators.test.ts +53 -0
  339. package/lib/shared/validation/commentValidators.ts +12 -1
  340. package/lib/shared/validation/index.ts +1 -0
  341. package/lib/shared/validation/permissionsValidators.test.ts +49 -0
  342. package/lib/shared/validation/permissionsValidators.ts +49 -0
  343. package/lib/shared/validation/propValidator.test.ts +19 -21
  344. package/lib/shared/validation/propValidator.ts +13 -18
  345. package/lib/shared/validation/schemas.test.ts +64 -32
  346. package/lib/shared/validation/schemas.ts +616 -345
  347. package/lib/shared/validation/validators.test.ts +3 -8
  348. package/lib/shared/validation/validators.ts +89 -68
  349. package/lib/shared/viewportUnits.integration.test.ts +14 -10
  350. package/lib/shared/viewportUnits.test.ts +24 -23
  351. package/lib/shared/viewportUnits.ts +12 -5
  352. package/lib/test-utils/dom-setup.ts +1 -1
  353. package/lib/test-utils/factories/ConsoleMockFactory.ts +10 -14
  354. package/lib/test-utils/factories/DomMockFactory.ts +17 -23
  355. package/lib/test-utils/factories/EventMockFactory.ts +7 -13
  356. package/lib/test-utils/factories/FetchMockFactory.ts +39 -57
  357. package/lib/test-utils/factories/ServerMockFactory.ts +6 -10
  358. package/lib/test-utils/factories/StoreMockFactory.ts +18 -29
  359. package/lib/test-utils/fixtures.ts +45 -45
  360. package/lib/test-utils/helpers/asyncHelpers.test.ts +15 -18
  361. package/lib/test-utils/helpers/asyncHelpers.ts +11 -20
  362. package/lib/test-utils/helpers.ts +1 -5
  363. package/lib/test-utils/index.ts +0 -4
  364. package/lib/test-utils/mockFactories.ts +13 -19
  365. package/lib/test-utils/mocks.ts +6 -4
  366. package/package.json +3 -5
  367. package/scripts/build-for-publish.mjs +2 -4
  368. package/scripts/build-meno-filter.ts +4 -7
  369. package/tsconfig.json +1 -0
  370. package/vite.config.ts +4 -4
  371. package/build-next.ts +0 -1361
  372. package/build-static.test.ts +0 -424
  373. package/build-static.ts +0 -1074
  374. package/dist/build-static.js +0 -36
  375. package/dist/chunks/chunk-2MHDV5BF.js +0 -251
  376. package/dist/chunks/chunk-2MHDV5BF.js.map +0 -7
  377. package/dist/chunks/chunk-AZQYF6KE.js +0 -559
  378. package/dist/chunks/chunk-AZQYF6KE.js.map +0 -7
  379. package/dist/chunks/chunk-GZHGVVW3.js +0 -322
  380. package/dist/chunks/chunk-GZHGVVW3.js.map +0 -7
  381. package/dist/chunks/chunk-H3GJ4H2U.js.map +0 -7
  382. package/dist/chunks/chunk-I7YIGZXT.js +0 -467
  383. package/dist/chunks/chunk-I7YIGZXT.js.map +0 -7
  384. package/dist/chunks/chunk-IGYR22T6.js +0 -6192
  385. package/dist/chunks/chunk-IGYR22T6.js.map +0 -7
  386. package/dist/chunks/chunk-JGP5A3Y5.js +0 -1136
  387. package/dist/chunks/chunk-JGP5A3Y5.js.map +0 -7
  388. package/dist/chunks/chunk-JGWFTO6P.js.map +0 -7
  389. package/dist/chunks/chunk-O3NAGJP4.js.map +0 -7
  390. package/dist/chunks/chunk-QB2LNO4W.js +0 -77
  391. package/dist/chunks/chunk-QB2LNO4W.js.map +0 -7
  392. package/dist/chunks/chunk-R6XHAFBF.js +0 -3821
  393. package/dist/chunks/chunk-R6XHAFBF.js.map +0 -7
  394. package/dist/chunks/chunk-UB44F4Z2.js.map +0 -7
  395. package/dist/chunks/chunk-WQFG7PAH.js.map +0 -7
  396. package/dist/chunks/chunk-X754AHS5.js.map +0 -7
  397. package/dist/chunks/chunk-YBLHKYFF.js.map +0 -7
  398. package/dist/chunks/configService-R3OGU2UD.js +0 -13
  399. package/dist/chunks/configService-R3OGU2UD.js.map +0 -7
  400. package/dist/chunks/constants-STK2YBIW.js +0 -46
  401. package/dist/chunks/constants-STK2YBIW.js.map +0 -7
  402. package/dist/chunks/fs-JGINUXGL.js.map +0 -7
  403. package/dist/entries/server-router.js +0 -67
  404. package/dist/entries/server-router.js.map +0 -7
  405. package/entries/server-router.tsx +0 -81
  406. package/lib/server/providers/fileSystemPageProvider.ts +0 -160
  407. package/lib/server/webflow/buildWebflow.ts +0 -635
  408. package/lib/server/webflow/index.ts +0 -23
  409. package/lib/server/webflow/nodeToWebflow.test.ts +0 -3170
  410. package/lib/server/webflow/nodeToWebflow.ts +0 -2435
  411. package/lib/server/webflow/styleMapper.test.ts +0 -389
  412. package/lib/server/webflow/styleMapper.ts +0 -695
  413. package/lib/server/webflow/templateWrapper.ts +0 -49
  414. package/lib/server/webflow/types.ts +0 -396
  415. /package/dist/{build-static.js.map → chunks/fs-G3ANWEFP.js.map} +0 -0
@@ -1,19 +1,15 @@
1
- import { test, expect, describe, beforeEach } from "bun:test";
2
- import {
3
- resolveComponentProps,
4
- resolvePropsFromDefinition,
5
- isRichTextMarker
6
- } from "./propResolver";
7
- import type { StructuredComponentDefinition, ComponentNode, I18nConfig, PropDefinition } from "./types";
8
-
9
- describe("Prop Resolver - resolveComponentProps", () => {
10
- describe("Default values", () => {
11
- test("should apply default value when prop not provided", () => {
1
+ import { test, expect, describe } from 'bun:test';
2
+ import { resolveComponentProps, resolvePropsFromDefinition, isRichTextMarker } from './propResolver';
3
+ import type { StructuredComponentDefinition, ComponentNode, I18nConfig, PropDefinition } from './types';
4
+
5
+ describe('Prop Resolver - resolveComponentProps', () => {
6
+ describe('Default values', () => {
7
+ test('should apply default value when prop not provided', () => {
12
8
  const propDefs: Record<string, PropDefinition> = {
13
9
  variant: {
14
- type: "select",
15
- default: "primary"
16
- }
10
+ type: 'select',
11
+ default: 'primary',
12
+ },
17
13
  };
18
14
  const passedProps = {};
19
15
  const children: (ComponentNode | string)[] = [];
@@ -21,37 +17,37 @@ describe("Prop Resolver - resolveComponentProps", () => {
21
17
  const result = resolveComponentProps({
22
18
  propDefs,
23
19
  passedProps,
24
- children
20
+ children,
25
21
  });
26
22
 
27
- expect(result.variant).toBe("primary");
23
+ expect(result.variant).toBe('primary');
28
24
  });
29
25
 
30
- test("should override default with passed prop", () => {
26
+ test('should override default with passed prop', () => {
31
27
  const propDefs: Record<string, PropDefinition> = {
32
28
  variant: {
33
- type: "select",
34
- default: "primary"
35
- }
29
+ type: 'select',
30
+ default: 'primary',
31
+ },
36
32
  };
37
- const passedProps = { variant: "secondary" };
33
+ const passedProps = { variant: 'secondary' };
38
34
  const children: (ComponentNode | string)[] = [];
39
35
 
40
36
  const result = resolveComponentProps({
41
37
  propDefs,
42
38
  passedProps,
43
- children
39
+ children,
44
40
  });
45
41
 
46
- expect(result.variant).toBe("secondary");
42
+ expect(result.variant).toBe('secondary');
47
43
  });
48
44
 
49
- test("should handle undefined passed prop value (should use default)", () => {
45
+ test('should handle undefined passed prop value (should use default)', () => {
50
46
  const propDefs: Record<string, PropDefinition> = {
51
47
  variant: {
52
- type: "select",
53
- default: "primary"
54
- }
48
+ type: 'select',
49
+ default: 'primary',
50
+ },
55
51
  };
56
52
  const passedProps = { variant: undefined };
57
53
  const children: (ComponentNode | string)[] = [];
@@ -59,22 +55,22 @@ describe("Prop Resolver - resolveComponentProps", () => {
59
55
  const result = resolveComponentProps({
60
56
  propDefs,
61
57
  passedProps,
62
- children
58
+ children,
63
59
  });
64
60
 
65
- expect(result.variant).toBe("primary");
61
+ expect(result.variant).toBe('primary');
66
62
  });
67
63
 
68
- test("should apply multiple defaults", () => {
64
+ test('should apply multiple defaults', () => {
69
65
  const propDefs: Record<string, PropDefinition> = {
70
66
  variant: {
71
- type: "select",
72
- default: "primary"
67
+ type: 'select',
68
+ default: 'primary',
73
69
  },
74
70
  size: {
75
- type: "select",
76
- default: "medium"
77
- }
71
+ type: 'select',
72
+ default: 'medium',
73
+ },
78
74
  };
79
75
  const passedProps = {};
80
76
  const children: (ComponentNode | string)[] = [];
@@ -82,19 +78,19 @@ describe("Prop Resolver - resolveComponentProps", () => {
82
78
  const result = resolveComponentProps({
83
79
  propDefs,
84
80
  passedProps,
85
- children
81
+ children,
86
82
  });
87
83
 
88
- expect(result.variant).toBe("primary");
89
- expect(result.size).toBe("medium");
84
+ expect(result.variant).toBe('primary');
85
+ expect(result.size).toBe('medium');
90
86
  });
91
87
 
92
- test("should handle null default value", () => {
88
+ test('should handle null default value', () => {
93
89
  const propDefs: Record<string, PropDefinition> = {
94
90
  optional: {
95
- type: "select",
96
- default: undefined
97
- }
91
+ type: 'select',
92
+ default: undefined,
93
+ },
98
94
  };
99
95
  const passedProps = {};
100
96
  const children: (ComponentNode | string)[] = [];
@@ -102,21 +98,21 @@ describe("Prop Resolver - resolveComponentProps", () => {
102
98
  const result = resolveComponentProps({
103
99
  propDefs,
104
100
  passedProps,
105
- children
101
+ children,
106
102
  });
107
103
 
108
104
  expect(result.optional).toBeUndefined();
109
105
  });
110
106
  });
111
107
 
112
- describe("Prop types", () => {
113
- test("should handle select type with default", () => {
108
+ describe('Prop types', () => {
109
+ test('should handle select type with default', () => {
114
110
  const propDefs: Record<string, PropDefinition> = {
115
111
  variant: {
116
- type: "select",
117
- options: ["primary", "secondary"],
118
- default: "primary"
119
- }
112
+ type: 'select',
113
+ options: ['primary', 'secondary'],
114
+ default: 'primary',
115
+ },
120
116
  };
121
117
  const passedProps = {};
122
118
  const children: (ComponentNode | string)[] = [];
@@ -124,18 +120,18 @@ describe("Prop Resolver - resolveComponentProps", () => {
124
120
  const result = resolveComponentProps({
125
121
  propDefs,
126
122
  passedProps,
127
- children
123
+ children,
128
124
  });
129
125
 
130
- expect(result.variant).toBe("primary");
126
+ expect(result.variant).toBe('primary');
131
127
  });
132
128
 
133
- test("should handle boolean type with default true", () => {
129
+ test('should handle boolean type with default true', () => {
134
130
  const propDefs: Record<string, PropDefinition> = {
135
131
  disabled: {
136
- type: "boolean",
137
- default: true
138
- }
132
+ type: 'boolean',
133
+ default: true,
134
+ },
139
135
  };
140
136
  const passedProps = {};
141
137
  const children: (ComponentNode | string)[] = [];
@@ -143,18 +139,18 @@ describe("Prop Resolver - resolveComponentProps", () => {
143
139
  const result = resolveComponentProps({
144
140
  propDefs,
145
141
  passedProps,
146
- children
142
+ children,
147
143
  });
148
144
 
149
145
  expect(result.disabled).toBe(true);
150
146
  });
151
147
 
152
- test("should handle boolean type with default false", () => {
148
+ test('should handle boolean type with default false', () => {
153
149
  const propDefs: Record<string, PropDefinition> = {
154
150
  disabled: {
155
- type: "boolean",
156
- default: false
157
- }
151
+ type: 'boolean',
152
+ default: false,
153
+ },
158
154
  };
159
155
  const passedProps = {};
160
156
  const children: (ComponentNode | string)[] = [];
@@ -162,18 +158,18 @@ describe("Prop Resolver - resolveComponentProps", () => {
162
158
  const result = resolveComponentProps({
163
159
  propDefs,
164
160
  passedProps,
165
- children
161
+ children,
166
162
  });
167
163
 
168
164
  expect(result.disabled).toBe(false);
169
165
  });
170
166
 
171
- test("should handle slot type with default", () => {
167
+ test('should handle slot type with default', () => {
172
168
  const propDefs: Record<string, PropDefinition> = {
173
169
  children: {
174
- type: "string",
175
- default: "Click me"
176
- }
170
+ type: 'string',
171
+ default: 'Click me',
172
+ },
177
173
  };
178
174
  const passedProps = {};
179
175
  const children: (ComponentNode | string)[] = [];
@@ -181,37 +177,37 @@ describe("Prop Resolver - resolveComponentProps", () => {
181
177
  const result = resolveComponentProps({
182
178
  propDefs,
183
179
  passedProps,
184
- children
180
+ children,
185
181
  });
186
182
 
187
- expect(result.children).toBe("Click me");
183
+ expect(result.children).toBe('Click me');
188
184
  });
189
185
 
190
- test("should handle props without defaults", () => {
186
+ test('should handle props without defaults', () => {
191
187
  const propDefs: Record<string, PropDefinition> = {
192
188
  customProp: {
193
- type: "string"
189
+ type: 'string',
194
190
  // No default
195
- }
191
+ },
196
192
  };
197
- const passedProps = { customProp: "value" };
193
+ const passedProps = { customProp: 'value' };
198
194
  const children: (ComponentNode | string)[] = [];
199
195
 
200
196
  const result = resolveComponentProps({
201
197
  propDefs,
202
198
  passedProps,
203
- children
199
+ children,
204
200
  });
205
201
 
206
- expect(result.customProp).toBe("value");
202
+ expect(result.customProp).toBe('value');
207
203
  });
208
204
 
209
- test("should return undefined for props without defaults when not passed", () => {
205
+ test('should return undefined for props without defaults when not passed', () => {
210
206
  const propDefs: Record<string, PropDefinition> = {
211
207
  customProp: {
212
- type: "string"
208
+ type: 'string',
213
209
  // No default
214
- }
210
+ },
215
211
  };
216
212
  const passedProps = {};
217
213
  const children: (ComponentNode | string)[] = [];
@@ -219,39 +215,39 @@ describe("Prop Resolver - resolveComponentProps", () => {
219
215
  const result = resolveComponentProps({
220
216
  propDefs,
221
217
  passedProps,
222
- children
218
+ children,
223
219
  });
224
220
 
225
221
  expect(result.customProp).toBeUndefined();
226
222
  });
227
223
  });
228
224
 
229
- describe("Children handling", () => {
230
- test("should use passed children when provided", () => {
225
+ describe('Children handling', () => {
226
+ test('should use passed children when provided', () => {
231
227
  const propDefs: Record<string, PropDefinition> = {
232
228
  children: {
233
- type: "string",
234
- default: "Default text"
235
- }
229
+ type: 'string',
230
+ default: 'Default text',
231
+ },
236
232
  };
237
233
  const passedProps = {};
238
- const children: (ComponentNode | string)[] = ["Custom text"];
234
+ const children: (ComponentNode | string)[] = ['Custom text'];
239
235
 
240
236
  const result = resolveComponentProps({
241
237
  propDefs,
242
238
  passedProps,
243
- children
239
+ children,
244
240
  });
245
241
 
246
- expect(result.children).toEqual(["Custom text"]);
242
+ expect(result.children).toEqual(['Custom text']);
247
243
  });
248
244
 
249
- test("should use default children when no children provided", () => {
245
+ test('should use default children when no children provided', () => {
250
246
  const propDefs: Record<string, PropDefinition> = {
251
247
  children: {
252
- type: "string",
253
- default: "Default text"
254
- }
248
+ type: 'string',
249
+ default: 'Default text',
250
+ },
255
251
  };
256
252
  const passedProps = {};
257
253
  const children: (ComponentNode | string)[] = [];
@@ -259,18 +255,18 @@ describe("Prop Resolver - resolveComponentProps", () => {
259
255
  const result = resolveComponentProps({
260
256
  propDefs,
261
257
  passedProps,
262
- children
258
+ children,
263
259
  });
264
260
 
265
- expect(result.children).toBe("Default text");
261
+ expect(result.children).toBe('Default text');
266
262
  });
267
263
 
268
- test("should use default children when children array is empty", () => {
264
+ test('should use default children when children array is empty', () => {
269
265
  const propDefs: Record<string, PropDefinition> = {
270
266
  children: {
271
- type: "string",
272
- default: "Click me"
273
- }
267
+ type: 'string',
268
+ default: 'Click me',
269
+ },
274
270
  };
275
271
  const passedProps = {};
276
272
  const children: (ComponentNode | string)[] = [];
@@ -278,18 +274,18 @@ describe("Prop Resolver - resolveComponentProps", () => {
278
274
  const result = resolveComponentProps({
279
275
  propDefs,
280
276
  passedProps,
281
- children
277
+ children,
282
278
  });
283
279
 
284
- expect(result.children).toBe("Click me");
280
+ expect(result.children).toBe('Click me');
285
281
  });
286
282
 
287
- test("should handle empty children array when no default", () => {
283
+ test('should handle empty children array when no default', () => {
288
284
  const propDefs: Record<string, PropDefinition> = {
289
285
  children: {
290
- type: "string"
286
+ type: 'string',
291
287
  // No default
292
- }
288
+ },
293
289
  };
294
290
  const passedProps = {};
295
291
  const children: (ComponentNode | string)[] = [];
@@ -297,62 +293,62 @@ describe("Prop Resolver - resolveComponentProps", () => {
297
293
  const result = resolveComponentProps({
298
294
  propDefs,
299
295
  passedProps,
300
- children
296
+ children,
301
297
  });
302
298
 
303
299
  expect(result.children).toBeUndefined();
304
300
  });
305
301
 
306
- test("should handle children with multiple elements", () => {
302
+ test('should handle children with multiple elements', () => {
307
303
  const propDefs: Record<string, PropDefinition> = {
308
304
  children: {
309
- type: "string",
310
- default: "Default"
311
- }
305
+ type: 'string',
306
+ default: 'Default',
307
+ },
312
308
  };
313
309
  const passedProps = {};
314
310
  const children: (ComponentNode | string)[] = [
315
- { type: "node", tag: "span", children: ["First"] },
316
- { type: "node", tag: "span", children: ["Second"] }
311
+ { type: 'node', tag: 'span', children: ['First'] },
312
+ { type: 'node', tag: 'span', children: ['Second'] },
317
313
  ];
318
314
 
319
315
  const result = resolveComponentProps({
320
316
  propDefs,
321
317
  passedProps,
322
- children
318
+ children,
323
319
  });
324
320
 
325
321
  expect(Array.isArray(result.children)).toBe(true);
326
322
  expect((result.children as ComponentNode[]).length).toBe(2);
327
323
  });
328
324
 
329
- test("should handle string children", () => {
325
+ test('should handle string children', () => {
330
326
  const propDefs: Record<string, PropDefinition> = {
331
327
  children: {
332
- type: "string",
333
- default: "Default"
334
- }
328
+ type: 'string',
329
+ default: 'Default',
330
+ },
335
331
  };
336
332
  const passedProps = {};
337
- const children: string = "String child";
333
+ const children: string = 'String child';
338
334
 
339
335
  const result = resolveComponentProps({
340
336
  propDefs,
341
337
  passedProps,
342
- children
338
+ children,
343
339
  });
344
340
 
345
341
  // String children are not arrays, so default is used
346
342
  // (Implementation only uses passed children if Array.isArray(children) && children.length > 0)
347
- expect(result.children).toBe("Default");
343
+ expect(result.children).toBe('Default');
348
344
  });
349
345
 
350
- test("should handle null children", () => {
346
+ test('should handle null children', () => {
351
347
  const propDefs: Record<string, PropDefinition> = {
352
348
  children: {
353
- type: "string",
354
- default: "Default"
355
- }
349
+ type: 'string',
350
+ default: 'Default',
351
+ },
356
352
  };
357
353
  const passedProps = {};
358
354
  const children = null;
@@ -360,89 +356,89 @@ describe("Prop Resolver - resolveComponentProps", () => {
360
356
  const result = resolveComponentProps({
361
357
  propDefs,
362
358
  passedProps,
363
- children
359
+ children,
364
360
  });
365
361
 
366
362
  // null is not an array with length > 0, so should use default
367
- expect(result.children).toBe("Default");
363
+ expect(result.children).toBe('Default');
368
364
  });
369
365
  });
370
366
 
371
- describe("Mixed scenarios", () => {
372
- test("should resolve Button component props (from Button.json example)", () => {
367
+ describe('Mixed scenarios', () => {
368
+ test('should resolve Button component props (from Button.json example)', () => {
373
369
  const propDefs: Record<string, PropDefinition> = {
374
370
  variant: {
375
- type: "select",
376
- options: ["primary", "secondary"],
377
- default: "primary"
371
+ type: 'select',
372
+ options: ['primary', 'secondary'],
373
+ default: 'primary',
378
374
  },
379
375
  children: {
380
- type: "string",
381
- default: "Click me"
376
+ type: 'string',
377
+ default: 'Click me',
382
378
  },
383
379
  size: {
384
- type: "select",
385
- default: "medium",
386
- options: ["medium", "large"]
387
- }
380
+ type: 'select',
381
+ default: 'medium',
382
+ options: ['medium', 'large'],
383
+ },
388
384
  };
389
- const passedProps = { variant: "secondary" };
385
+ const passedProps = { variant: 'secondary' };
390
386
  const children: (ComponentNode | string)[] = [];
391
387
 
392
388
  const result = resolveComponentProps({
393
389
  propDefs,
394
390
  passedProps,
395
- children
391
+ children,
396
392
  });
397
393
 
398
- expect(result.variant).toBe("secondary"); // Overridden
399
- expect(result.children).toBe("Click me"); // Default used
400
- expect(result.size).toBe("medium"); // Default used
394
+ expect(result.variant).toBe('secondary'); // Overridden
395
+ expect(result.children).toBe('Click me'); // Default used
396
+ expect(result.size).toBe('medium'); // Default used
401
397
  });
402
398
 
403
- test("should resolve Button component with all props provided", () => {
399
+ test('should resolve Button component with all props provided', () => {
404
400
  const propDefs: Record<string, PropDefinition> = {
405
401
  variant: {
406
- type: "select",
407
- default: "primary"
402
+ type: 'select',
403
+ default: 'primary',
408
404
  },
409
405
  children: {
410
- type: "string",
411
- default: "Click me"
406
+ type: 'string',
407
+ default: 'Click me',
412
408
  },
413
409
  size: {
414
- type: "select",
415
- default: "medium"
416
- }
410
+ type: 'select',
411
+ default: 'medium',
412
+ },
417
413
  };
418
- const passedProps = { variant: "secondary", size: "large" };
419
- const children: (ComponentNode | string)[] = ["Custom Button"];
414
+ const passedProps = { variant: 'secondary', size: 'large' };
415
+ const children: (ComponentNode | string)[] = ['Custom Button'];
420
416
 
421
417
  const result = resolveComponentProps({
422
418
  propDefs,
423
419
  passedProps,
424
- children
420
+ children,
425
421
  });
426
422
 
427
- expect(result.variant).toBe("secondary");
428
- expect(result.children).toEqual(["Custom Button"]);
429
- expect(result.size).toBe("large");
423
+ expect(result.variant).toBe('secondary');
424
+ expect(result.children).toEqual(['Custom Button']);
425
+ expect(result.size).toBe('large');
430
426
  });
431
427
 
432
- test("should handle props with different types mixed", () => {
428
+ test('should handle props with different types mixed', () => {
433
429
  const propDefs: Record<string, PropDefinition> = {
434
430
  title: {
435
- type: "string",
436
- default: "Default Title"
431
+ type: 'string',
432
+ default: 'Default Title',
437
433
  },
438
434
  count: {
439
- type: "number",
440
- default: 0
435
+ type: 'number',
436
+ default: 0,
441
437
  },
442
438
  isActive: {
443
- type: "boolean",
444
- default: false
445
- }
439
+ type: 'boolean',
440
+ default: false,
441
+ },
446
442
  };
447
443
  const passedProps = { count: 10 };
448
444
  const children: (ComponentNode | string)[] = [];
@@ -450,37 +446,37 @@ describe("Prop Resolver - resolveComponentProps", () => {
450
446
  const result = resolveComponentProps({
451
447
  propDefs,
452
448
  passedProps,
453
- children
449
+ children,
454
450
  });
455
451
 
456
- expect(result.title).toBe("Default Title");
452
+ expect(result.title).toBe('Default Title');
457
453
  expect(result.count).toBe(10);
458
454
  expect(result.isActive).toBe(false);
459
455
  });
460
456
  });
461
457
 
462
- describe("Edge cases", () => {
463
- test("should handle empty propDefs object", () => {
458
+ describe('Edge cases', () => {
459
+ test('should handle empty propDefs object', () => {
464
460
  const propDefs = {};
465
461
  const passedProps = {};
466
462
  const children: (ComponentNode | string)[] = [];
467
-
463
+
468
464
  const result = resolveComponentProps({
469
465
  propDefs,
470
466
  passedProps,
471
- children
467
+ children,
472
468
  });
473
-
469
+
474
470
  expect(Object.keys(result).length).toBe(0);
475
471
  });
476
472
 
477
- test("should handle propDefs with invalid structure", () => {
473
+ test('should handle propDefs with invalid structure', () => {
478
474
  const propDefs: Record<string, PropDefinition> = {
479
475
  invalid: null as any,
480
476
  valid: {
481
- type: "string",
482
- default: "value"
483
- }
477
+ type: 'string',
478
+ default: 'value',
479
+ },
484
480
  };
485
481
  const passedProps = {};
486
482
  const children: (ComponentNode | string)[] = [];
@@ -488,20 +484,20 @@ describe("Prop Resolver - resolveComponentProps", () => {
488
484
  const result = resolveComponentProps({
489
485
  propDefs,
490
486
  passedProps,
491
- children
487
+ children,
492
488
  });
493
489
 
494
490
  // Should skip invalid propDefs and only process valid ones
495
- expect(result.valid).toBe("value");
491
+ expect(result.valid).toBe('value');
496
492
  expect(result.invalid).toBeUndefined();
497
493
  });
498
494
 
499
495
  test("should handle propDefs without 'default' key", () => {
500
496
  const propDefs: Record<string, PropDefinition> = {
501
497
  noDefault: {
502
- type: "string"
498
+ type: 'string',
503
499
  // No 'default' key
504
- }
500
+ },
505
501
  };
506
502
  const passedProps = {};
507
503
  const children: (ComponentNode | string)[] = [];
@@ -509,116 +505,116 @@ describe("Prop Resolver - resolveComponentProps", () => {
509
505
  const result = resolveComponentProps({
510
506
  propDefs,
511
507
  passedProps,
512
- children
508
+ children,
513
509
  });
514
510
 
515
511
  expect(result.noDefault).toBeUndefined();
516
512
  });
517
513
 
518
- test("should preserve passed props that are not in propDefs", () => {
514
+ test('should preserve passed props that are not in propDefs', () => {
519
515
  const propDefs: Record<string, PropDefinition> = {
520
516
  variant: {
521
- type: "select",
522
- default: "primary"
523
- }
517
+ type: 'select',
518
+ default: 'primary',
519
+ },
524
520
  };
525
521
  const passedProps = {
526
- variant: "secondary",
527
- extraProp: "extra value"
522
+ variant: 'secondary',
523
+ extraProp: 'extra value',
528
524
  };
529
525
  const children: (ComponentNode | string)[] = [];
530
526
 
531
527
  const result = resolveComponentProps({
532
528
  propDefs,
533
529
  passedProps,
534
- children
530
+ children,
535
531
  });
536
532
 
537
- expect(result.variant).toBe("secondary");
533
+ expect(result.variant).toBe('secondary');
538
534
  // Extra props are now preserved for backward compatibility (with validation)
539
- expect(result.extraProp).toBe("extra value");
535
+ expect(result.extraProp).toBe('extra value');
540
536
  });
541
537
  });
542
538
  });
543
539
 
544
- describe("Prop Resolver - resolvePropsFromDefinition", () => {
545
- describe("Basic usage", () => {
546
- test("should resolve props from structured component definition", () => {
540
+ describe('Prop Resolver - resolvePropsFromDefinition', () => {
541
+ describe('Basic usage', () => {
542
+ test('should resolve props from structured component definition', () => {
547
543
  const componentDef: StructuredComponentDefinition = {
548
544
  interface: {
549
545
  variant: {
550
- type: "select",
551
- default: "primary"
552
- }
553
- }
546
+ type: 'select',
547
+ default: 'primary',
548
+ },
549
+ },
554
550
  };
555
551
  const passedProps = {};
556
552
  const children: (ComponentNode | string)[] = [];
557
553
 
558
554
  const result = resolvePropsFromDefinition(componentDef, passedProps, children);
559
555
 
560
- expect(result.variant).toBe("primary");
556
+ expect(result.variant).toBe('primary');
561
557
  });
562
558
 
563
- test("should handle missing interface", () => {
559
+ test('should handle missing interface', () => {
564
560
  const componentDef: StructuredComponentDefinition = {
565
561
  // No interface
566
562
  };
567
563
  const passedProps = {};
568
564
  const children: (ComponentNode | string)[] = [];
569
-
565
+
570
566
  const result = resolvePropsFromDefinition(componentDef, passedProps, children);
571
-
567
+
572
568
  expect(Object.keys(result).length).toBe(0);
573
569
  });
574
570
 
575
- test("should handle empty interface", () => {
571
+ test('should handle empty interface', () => {
576
572
  const componentDef: StructuredComponentDefinition = {
577
- interface: {}
573
+ interface: {},
578
574
  };
579
575
  const passedProps = {};
580
576
  const children: (ComponentNode | string)[] = [];
581
-
577
+
582
578
  const result = resolvePropsFromDefinition(componentDef, passedProps, children);
583
-
579
+
584
580
  expect(Object.keys(result).length).toBe(0);
585
581
  });
586
582
 
587
- test("should use passed props and children", () => {
583
+ test('should use passed props and children', () => {
588
584
  const componentDef: StructuredComponentDefinition = {
589
585
  interface: {
590
586
  variant: {
591
- type: "select",
592
- default: "primary"
587
+ type: 'select',
588
+ default: 'primary',
593
589
  },
594
590
  children: {
595
- type: "string",
596
- default: "Default"
597
- }
598
- }
591
+ type: 'string',
592
+ default: 'Default',
593
+ },
594
+ },
599
595
  };
600
- const passedProps = { variant: "secondary" };
601
- const children: (ComponentNode | string)[] = ["Custom"];
596
+ const passedProps = { variant: 'secondary' };
597
+ const children: (ComponentNode | string)[] = ['Custom'];
602
598
 
603
599
  const result = resolvePropsFromDefinition(componentDef, passedProps, children);
604
600
 
605
- expect(result.variant).toBe("secondary");
606
- expect(result.children).toEqual(["Custom"]);
601
+ expect(result.variant).toBe('secondary');
602
+ expect(result.children).toEqual(['Custom']);
607
603
  });
608
604
  });
609
605
 
610
- describe("i18n resolution", () => {
606
+ describe('i18n resolution', () => {
611
607
  const i18nConfig: I18nConfig = {
612
608
  defaultLocale: 'en',
613
609
  locales: [
614
610
  { code: 'en', name: 'English', nativeName: 'English', langTag: 'en-US' },
615
- { code: 'es', name: 'Spanish', nativeName: 'Español', langTag: 'es-ES' }
616
- ]
611
+ { code: 'es', name: 'Spanish', nativeName: 'Español', langTag: 'es-ES' },
612
+ ],
617
613
  };
618
614
 
619
- test("should resolve I18nValue for string type", () => {
615
+ test('should resolve I18nValue for string type', () => {
620
616
  const propDefs: Record<string, PropDefinition> = {
621
- title: { type: "string", default: "Default Title" }
617
+ title: { type: 'string', default: 'Default Title' },
622
618
  };
623
619
  const passedProps = { title: { _i18n: true, en: 'Hello', es: 'Hola' } };
624
620
  const children: (ComponentNode | string)[] = [];
@@ -628,15 +624,15 @@ describe("Prop Resolver - resolvePropsFromDefinition", () => {
628
624
  passedProps,
629
625
  children,
630
626
  locale: 'es',
631
- i18nConfig
627
+ i18nConfig,
632
628
  });
633
629
 
634
630
  expect(result.title).toBe('Hola');
635
631
  });
636
632
 
637
- test("should fall back to default locale when requested locale missing", () => {
633
+ test('should fall back to default locale when requested locale missing', () => {
638
634
  const propDefs: Record<string, PropDefinition> = {
639
- title: { type: "string", default: "Default Title" }
635
+ title: { type: 'string', default: 'Default Title' },
640
636
  };
641
637
  const passedProps = { title: { _i18n: true, en: 'Hello' } }; // No 'es'
642
638
  const children: (ComponentNode | string)[] = [];
@@ -646,15 +642,15 @@ describe("Prop Resolver - resolvePropsFromDefinition", () => {
646
642
  passedProps,
647
643
  children,
648
644
  locale: 'es',
649
- i18nConfig
645
+ i18nConfig,
650
646
  });
651
647
 
652
648
  expect(result.title).toBe('Hello'); // Falls back to 'en'
653
649
  });
654
650
 
655
- test("should resolve I18nValue and wrap rich-text", () => {
651
+ test('should resolve I18nValue and wrap rich-text', () => {
656
652
  const propDefs: Record<string, PropDefinition> = {
657
- text: { type: "rich-text", default: "Default Text" }
653
+ text: { type: 'rich-text', default: 'Default Text' },
658
654
  };
659
655
  const passedProps = { text: { _i18n: true, en: '<b>Bold</b>', es: 'Test' } };
660
656
  const children: (ComponentNode | string)[] = [];
@@ -664,7 +660,7 @@ describe("Prop Resolver - resolvePropsFromDefinition", () => {
664
660
  passedProps,
665
661
  children,
666
662
  locale: 'es',
667
- i18nConfig
663
+ i18nConfig,
668
664
  });
669
665
 
670
666
  // Should be wrapped in RichTextMarker after i18n resolution
@@ -673,9 +669,9 @@ describe("Prop Resolver - resolvePropsFromDefinition", () => {
673
669
  expect((result.text as any).format).toBe('html');
674
670
  });
675
671
 
676
- test("should wrap plain rich-text string in RichTextMarker", () => {
672
+ test('should wrap plain rich-text string in RichTextMarker', () => {
677
673
  const propDefs: Record<string, PropDefinition> = {
678
- text: { type: "rich-text", default: "Default Text" }
674
+ text: { type: 'rich-text', default: 'Default Text' },
679
675
  };
680
676
  const passedProps = { text: '<b>Bold text</b>' };
681
677
  const children: (ComponentNode | string)[] = [];
@@ -683,7 +679,7 @@ describe("Prop Resolver - resolvePropsFromDefinition", () => {
683
679
  const result = resolveComponentProps({
684
680
  propDefs,
685
681
  passedProps,
686
- children
682
+ children,
687
683
  });
688
684
 
689
685
  // Should be wrapped in RichTextMarker
@@ -692,9 +688,9 @@ describe("Prop Resolver - resolvePropsFromDefinition", () => {
692
688
  expect((result.text as any).format).toBe('html');
693
689
  });
694
690
 
695
- test("should NOT wrap empty rich-text string", () => {
691
+ test('should NOT wrap empty rich-text string', () => {
696
692
  const propDefs: Record<string, PropDefinition> = {
697
- text: { type: "rich-text", default: "" }
693
+ text: { type: 'rich-text', default: '' },
698
694
  };
699
695
  const passedProps = { text: '' };
700
696
  const children: (ComponentNode | string)[] = [];
@@ -702,7 +698,7 @@ describe("Prop Resolver - resolvePropsFromDefinition", () => {
702
698
  const result = resolveComponentProps({
703
699
  propDefs,
704
700
  passedProps,
705
- children
701
+ children,
706
702
  });
707
703
 
708
704
  // Empty strings should not be wrapped
@@ -711,34 +707,34 @@ describe("Prop Resolver - resolvePropsFromDefinition", () => {
711
707
  });
712
708
  });
713
709
 
714
- describe("Integration with Button.json structure", () => {
715
- test("should resolve Button component props correctly", () => {
710
+ describe('Integration with Button.json structure', () => {
711
+ test('should resolve Button component props correctly', () => {
716
712
  const componentDef: StructuredComponentDefinition = {
717
713
  interface: {
718
714
  variant: {
719
- type: "select",
720
- options: ["primary", "secondary"],
721
- default: "primary"
715
+ type: 'select',
716
+ options: ['primary', 'secondary'],
717
+ default: 'primary',
722
718
  },
723
719
  children: {
724
- type: "string",
725
- default: "Click me"
720
+ type: 'string',
721
+ default: 'Click me',
726
722
  },
727
723
  size: {
728
- type: "select",
729
- default: "medium",
730
- options: ["medium", "large"]
731
- }
732
- }
724
+ type: 'select',
725
+ default: 'medium',
726
+ options: ['medium', 'large'],
727
+ },
728
+ },
733
729
  };
734
- const passedProps = { variant: "secondary" };
730
+ const passedProps = { variant: 'secondary' };
735
731
  const children: (ComponentNode | string)[] = [];
736
732
 
737
733
  const result = resolvePropsFromDefinition(componentDef, passedProps, children);
738
734
 
739
- expect(result.variant).toBe("secondary");
740
- expect(result.children).toBe("Click me");
741
- expect(result.size).toBe("medium");
735
+ expect(result.variant).toBe('secondary');
736
+ expect(result.children).toBe('Click me');
737
+ expect(result.size).toBe('medium');
742
738
  });
743
739
  });
744
740
  });