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.
- package/.claude/settings.local.json +1 -3
- package/bin/cli.ts +66 -261
- package/build-astro.ts +150 -128
- package/dist/bin/cli.js +42 -185
- package/dist/bin/cli.js.map +2 -2
- package/dist/chunks/chunk-2AR55GYH.js +42 -0
- package/dist/chunks/chunk-2AR55GYH.js.map +7 -0
- package/dist/chunks/{chunk-JGWFTO6P.js → chunk-2IIQK7T3.js} +2624 -1389
- package/dist/chunks/chunk-2IIQK7T3.js.map +7 -0
- package/dist/chunks/chunk-4ZRU52J2.js +169 -0
- package/dist/chunks/chunk-4ZRU52J2.js.map +7 -0
- package/dist/chunks/{chunk-UB44F4Z2.js → chunk-5X4HCN7J.js} +5 -7
- package/dist/chunks/chunk-5X4HCN7J.js.map +7 -0
- package/dist/chunks/{chunk-WQFG7PAH.js → chunk-7CCVOL5M.js} +15 -19
- package/dist/chunks/chunk-7CCVOL5M.js.map +7 -0
- package/dist/chunks/{chunk-YBLHKYFF.js → chunk-AR7LHIFY.js} +8 -2
- package/dist/chunks/chunk-AR7LHIFY.js.map +7 -0
- package/dist/chunks/{chunk-O3NAGJP4.js → chunk-NUP7H7D3.js} +135 -41
- package/dist/chunks/chunk-NUP7H7D3.js.map +7 -0
- package/dist/chunks/{chunk-X754AHS5.js → chunk-QWTQZHG3.js} +194 -90
- package/dist/chunks/chunk-QWTQZHG3.js.map +7 -0
- package/dist/chunks/{chunk-H3GJ4H2U.js → chunk-XTKNX4FW.js} +216 -87
- package/dist/chunks/chunk-XTKNX4FW.js.map +7 -0
- package/dist/chunks/{fs-JGINUXGL.js → fs-G3ANWEFP.js} +2 -2
- package/dist/lib/client/index.js +1003 -475
- package/dist/lib/client/index.js.map +3 -3
- package/dist/lib/server/index.js +14393 -6371
- package/dist/lib/server/index.js.map +4 -4
- package/dist/lib/shared/index.js +342 -101
- package/dist/lib/shared/index.js.map +4 -4
- package/dist/lib/shared/richtext/index.js +1 -1
- package/dist/lib/test-utils/index.js +64 -80
- package/dist/lib/test-utils/index.js.map +2 -2
- package/entries/client-router.tsx +10 -8
- package/lib/client/ClientInitializer.ts +8 -8
- package/lib/client/ErrorBoundary.test.tsx +246 -186
- package/lib/client/ErrorBoundary.tsx +183 -132
- package/lib/client/componentRegistry.test.ts +96 -108
- package/lib/client/componentRegistry.ts +1 -3
- package/lib/client/contexts/ThemeContext.tsx +3 -2
- package/lib/client/core/ComponentBuilder.test.ts +663 -560
- package/lib/client/core/ComponentBuilder.ts +427 -155
- package/lib/client/core/ComponentRenderer.test.tsx +2 -4
- package/lib/client/core/ComponentRenderer.tsx +46 -33
- package/lib/client/core/builders/embedBuilder.ts +242 -54
- package/lib/client/core/builders/linkBuilder.ts +72 -45
- package/lib/client/core/builders/linkNodeBuilder.ts +79 -54
- package/lib/client/core/builders/listBuilder.ts +155 -89
- package/lib/client/core/builders/localeListBuilder.ts +97 -62
- package/lib/client/core/builders/types.ts +5 -5
- package/lib/client/core/cmsTemplateProcessor.ts +8 -9
- package/lib/client/elementRegistry.ts +3 -3
- package/lib/client/fontFamiliesService.test.ts +2 -10
- package/lib/client/fontFamiliesService.ts +3 -3
- package/lib/client/hmr/HMRManager.tsx +47 -30
- package/lib/client/hmrCssReload.ts +49 -14
- package/lib/client/hmrWebSocket.ts +14 -19
- package/lib/client/hooks/useColorVariables.test.ts +21 -21
- package/lib/client/hooks/useColorVariables.ts +23 -18
- package/lib/client/hooks/usePropertyAutocomplete.ts +4 -6
- package/lib/client/hooks/useVariables.ts +6 -4
- package/lib/client/hydration/HydrationUtils.test.ts +24 -25
- package/lib/client/hydration/HydrationUtils.ts +3 -4
- package/lib/client/i18nConfigService.test.ts +2 -7
- package/lib/client/i18nConfigService.ts +2 -2
- package/lib/client/meno-filter/MenoFilter.test.ts +47 -49
- package/lib/client/meno-filter/MenoFilter.ts +14 -15
- package/lib/client/meno-filter/bindings.ts +18 -43
- package/lib/client/meno-filter/init.ts +4 -4
- package/lib/client/meno-filter/renderer.ts +30 -32
- package/lib/client/meno-filter/script.generated.ts +1 -3
- package/lib/client/meno-filter/ui.ts +4 -6
- package/lib/client/meno-filter/updates.ts +18 -23
- package/lib/client/meno-filter/utils.ts +1 -1
- package/lib/client/navigation.test.ts +174 -178
- package/lib/client/navigation.ts +0 -1
- package/lib/client/responsiveStyleResolver.knownTokens.test.ts +71 -0
- package/lib/client/responsiveStyleResolver.test.ts +234 -232
- package/lib/client/responsiveStyleResolver.ts +74 -20
- package/lib/client/routing/RouteLoader.test.ts +24 -25
- package/lib/client/routing/RouteLoader.ts +27 -35
- package/lib/client/routing/Router.tsx +210 -153
- package/lib/client/scripts/ScriptExecutor.test.ts +157 -158
- package/lib/client/scripts/ScriptExecutor.ts +18 -36
- package/lib/client/services/PrefetchService.test.ts +3 -3
- package/lib/client/services/PrefetchService.ts +23 -29
- package/lib/client/styleProcessor.test.ts +9 -9
- package/lib/client/styleProcessor.ts +24 -15
- package/lib/client/styles/StyleInjector.test.ts +122 -115
- package/lib/client/styles/StyleInjector.ts +10 -7
- package/lib/client/styles/UtilityClassCollector.ts +62 -28
- package/lib/client/styles/cspNonce.test.ts +2 -5
- package/lib/client/templateEngine.test.ts +554 -488
- package/lib/client/templateEngine.ts +203 -73
- package/lib/client/theme.test.ts +1 -1
- package/lib/client/theme.ts +0 -1
- package/lib/client/utils/toast.ts +0 -1
- package/lib/server/__integration__/api-routes.test.ts +8 -4
- package/lib/server/__integration__/cms-integration.test.ts +1 -4
- package/lib/server/__integration__/server-lifecycle.test.ts +4 -5
- package/lib/server/__integration__/ssr-rendering.test.ts +47 -37
- package/lib/server/__integration__/static-assets.test.ts +3 -3
- package/lib/server/__integration__/test-helpers.ts +87 -74
- package/lib/server/ab/generateFunctions.ts +12 -10
- package/lib/server/astro/cmsPageEmitter.ts +26 -42
- package/lib/server/astro/componentEmitter.ts +35 -43
- package/lib/server/astro/cssCollector.ts +10 -26
- package/lib/server/astro/nodeToAstro.test.ts +1754 -34
- package/lib/server/astro/nodeToAstro.ts +232 -216
- package/lib/server/astro/normalizeOrphanTemplateProps.test.ts +115 -119
- package/lib/server/astro/normalizeOrphanTemplateProps.ts +11 -18
- package/lib/server/astro/pageEmitter.ts +9 -13
- package/lib/server/astro/tailwindMapper.test.ts +10 -37
- package/lib/server/astro/tailwindMapper.ts +33 -40
- package/lib/server/astro/templateTransformer.ts +17 -20
- package/lib/server/createServer.ts +7 -19
- package/lib/server/cssGenerator.test.ts +35 -44
- package/lib/server/cssGenerator.ts +8 -19
- package/lib/server/fileWatcher.test.ts +164 -13
- package/lib/server/fileWatcher.ts +209 -124
- package/lib/server/index.ts +14 -17
- package/lib/server/jsonLoader.test.ts +39 -2
- package/lib/server/jsonLoader.ts +39 -34
- package/lib/server/middleware/cors.test.ts +21 -21
- package/lib/server/middleware/cors.ts +28 -4
- package/lib/server/middleware/errorHandler.test.ts +7 -5
- package/lib/server/middleware/errorHandler.ts +3 -8
- package/lib/server/middleware/index.ts +0 -1
- package/lib/server/middleware/logger.test.ts +10 -8
- package/lib/server/middleware/logger.ts +17 -29
- package/lib/server/migrateTemplates.ts +3 -3
- package/lib/server/pageCache.test.ts +76 -77
- package/lib/server/pageCache.ts +0 -1
- package/lib/server/projectContext.ts +5 -4
- package/lib/server/providers/fileSystemCMSProvider.test.ts +142 -99
- package/lib/server/providers/fileSystemCMSProvider.ts +62 -38
- package/lib/server/routes/api/cms.test.ts +26 -14
- package/lib/server/routes/api/cms.ts +9 -14
- package/lib/server/routes/api/colors.test.ts +2 -2
- package/lib/server/routes/api/components.ts +31 -35
- package/lib/server/routes/api/config.ts +3 -4
- package/lib/server/routes/api/core-routes.ts +49 -76
- package/lib/server/routes/api/enums.test.ts +2 -2
- package/lib/server/routes/api/functions.ts +9 -17
- package/lib/server/routes/api/index.ts +3 -6
- package/lib/server/routes/api/pages.ts +8 -11
- package/lib/server/routes/api/shared.test.ts +1 -1
- package/lib/server/routes/api/shared.ts +12 -9
- package/lib/server/routes/api/variables.test.ts +3 -5
- package/lib/server/routes/api/variables.ts +1 -1
- package/lib/server/routes/index.ts +25 -28
- package/lib/server/routes/pages.ts +35 -31
- package/lib/server/routes/static.ts +17 -6
- package/lib/server/runtime/bundler.ts +98 -61
- package/lib/server/runtime/fs.ts +16 -26
- package/lib/server/runtime/httpServer.ts +8 -12
- package/lib/server/services/ColorService.test.ts +3 -3
- package/lib/server/services/ColorService.ts +37 -29
- package/lib/server/services/EnumService.test.ts +4 -8
- package/lib/server/services/EnumService.ts +11 -3
- package/lib/server/services/VariableService.test.ts +8 -12
- package/lib/server/services/VariableService.ts +11 -3
- package/lib/server/services/cmsService.test.ts +158 -120
- package/lib/server/services/cmsService.ts +36 -146
- package/lib/server/services/componentService.test.ts +125 -45
- package/lib/server/services/componentService.ts +70 -46
- package/lib/server/services/configService.test.ts +22 -45
- package/lib/server/services/configService.ts +50 -27
- package/lib/server/services/fileWatcherService.ts +42 -8
- package/lib/server/services/index.ts +0 -1
- package/lib/server/services/pageService.test.ts +8 -10
- package/lib/server/services/pageService.ts +32 -18
- package/lib/server/ssr/attributeBuilder.ts +18 -8
- package/lib/server/ssr/buildErrorOverlay.ts +11 -12
- package/lib/server/ssr/clientDataInjector.ts +7 -21
- package/lib/server/ssr/cmsSSRProcessor.ts +4 -8
- package/lib/server/ssr/cssCollector.ts +1 -1
- package/lib/server/ssr/errorOverlay.test.ts +1 -1
- package/lib/server/ssr/errorOverlay.ts +3 -9
- package/lib/server/ssr/htmlGenerator.nonce.test.ts +9 -14
- package/lib/server/ssr/htmlGenerator.test.ts +120 -44
- package/lib/server/ssr/htmlGenerator.ts +126 -91
- package/lib/server/ssr/imageMetadata.test.ts +3 -1
- package/lib/server/ssr/imageMetadata.ts +27 -21
- package/lib/server/ssr/jsCollector.test.ts +8 -18
- package/lib/server/ssr/jsCollector.ts +3 -8
- package/lib/server/ssr/liveReloadIntegration.test.ts +76 -36
- package/lib/server/ssr/metaTagGenerator.ts +2 -2
- package/lib/server/ssr/ssrRenderer.branches.test.ts +1103 -0
- package/lib/server/ssr/ssrRenderer.test.ts +316 -256
- package/lib/server/ssr/ssrRenderer.ts +795 -243
- package/lib/server/ssrRenderer.test.ts +1048 -954
- package/lib/server/utils/jsonLineMapper.test.ts +28 -28
- package/lib/server/utils/jsonLineMapper.ts +7 -7
- package/lib/server/validateStyleCoverage.ts +18 -21
- package/lib/server/websocketManager.ts +28 -19
- package/lib/shared/attributeNodeUtils.test.ts +15 -15
- package/lib/shared/attributeNodeUtils.ts +5 -12
- package/lib/shared/breakpoints.test.ts +5 -5
- package/lib/shared/breakpoints.ts +4 -11
- package/lib/shared/cmsQuery.test.ts +81 -0
- package/lib/shared/cmsQuery.ts +92 -0
- package/lib/shared/cmsQueryParser.test.ts +50 -42
- package/lib/shared/cmsQueryParser.ts +60 -38
- package/lib/shared/colorConversions.ts +9 -9
- package/lib/shared/colorVariableUtils.test.ts +27 -5
- package/lib/shared/colorVariableUtils.ts +21 -12
- package/lib/shared/componentRefs.ts +1 -5
- package/lib/shared/constants.test.ts +3 -3
- package/lib/shared/constants.ts +8 -8
- package/lib/shared/cssGeneration.test.ts +285 -144
- package/lib/shared/cssGeneration.ts +217 -531
- package/lib/shared/cssNamedColors.ts +152 -30
- package/lib/shared/cssProperties.test.ts +69 -70
- package/lib/shared/cssProperties.ts +298 -114
- package/lib/shared/elementClassName.test.ts +109 -109
- package/lib/shared/elementClassName.ts +3 -3
- package/lib/shared/elementUtils.ts +12 -16
- package/lib/shared/errorLogger.test.ts +12 -12
- package/lib/shared/errorLogger.ts +2 -10
- package/lib/shared/errors.test.ts +2 -13
- package/lib/shared/errors.ts +2 -8
- package/lib/shared/expressionEvaluator.test.ts +145 -0
- package/lib/shared/expressionEvaluator.ts +52 -24
- package/lib/shared/fontLoader.test.ts +32 -18
- package/lib/shared/fontLoader.ts +2 -2
- package/lib/shared/friendlyError.ts +2 -3
- package/lib/shared/gradientUtils.test.ts +3 -7
- package/lib/shared/gradientUtils.ts +17 -14
- package/lib/shared/hrefRefs.test.ts +2 -2
- package/lib/shared/hrefRefs.ts +2 -10
- package/lib/shared/i18n.test.ts +4 -4
- package/lib/shared/i18n.ts +18 -38
- package/lib/shared/index.ts +27 -0
- package/lib/shared/inlineSvgStyleRules.ts +14 -13
- package/lib/shared/interactiveStyleMappings.test.ts +32 -54
- package/lib/shared/interactiveStyleMappings.ts +11 -24
- package/lib/shared/interactiveStyles.test.ts +165 -188
- package/lib/shared/interfaces/contentProvider.ts +1 -1
- package/lib/shared/itemTemplateUtils.test.ts +11 -17
- package/lib/shared/itemTemplateUtils.ts +27 -39
- package/lib/shared/jsonRepair.ts +16 -10
- package/lib/shared/libraryLoader.test.ts +21 -55
- package/lib/shared/libraryLoader.ts +7 -22
- package/lib/shared/linkUtils.ts +1 -1
- package/lib/shared/logger.test.ts +66 -0
- package/lib/shared/logger.ts +94 -0
- package/lib/shared/markdown.ts +25 -0
- package/lib/shared/netlifyLocale404.test.ts +179 -0
- package/lib/shared/netlifyLocale404.ts +110 -0
- package/lib/shared/nodeUtils.test.ts +28 -16
- package/lib/shared/nodeUtils.ts +76 -23
- package/lib/shared/pathArrayUtils.test.ts +1 -2
- package/lib/shared/pathArrayUtils.ts +1 -1
- package/lib/shared/pathSecurity.ts +2 -2
- package/lib/shared/pathUtils.test.ts +4 -6
- package/lib/shared/pathUtils.ts +42 -49
- package/lib/shared/paths/Path.test.ts +2 -2
- package/lib/shared/paths/Path.ts +0 -1
- package/lib/shared/paths/PathConverter.test.ts +1 -1
- package/lib/shared/paths/PathConverter.ts +17 -20
- package/lib/shared/paths/PathUtils.ts +13 -13
- package/lib/shared/paths/PathValidator.test.ts +2 -15
- package/lib/shared/paths/PathValidator.ts +12 -10
- package/lib/shared/paths/index.ts +1 -2
- package/lib/shared/permissions.test.ts +168 -0
- package/lib/shared/permissions.ts +162 -0
- package/lib/shared/propResolver.test.ts +240 -244
- package/lib/shared/propResolver.ts +15 -26
- package/lib/shared/pxToRem.test.ts +7 -6
- package/lib/shared/pxToRem.ts +2 -5
- package/lib/shared/registry/BaseNodeTypeRegistry.test.ts +12 -6
- package/lib/shared/registry/ClientRegistry.ts +0 -2
- package/lib/shared/registry/ComponentRegistry.test.ts +46 -32
- package/lib/shared/registry/ComponentRegistry.ts +12 -9
- package/lib/shared/registry/NodeTypeDefinition.ts +16 -9
- package/lib/shared/registry/RegistryManager.ts +1 -2
- package/lib/shared/registry/SSRRegistry.ts +0 -2
- package/lib/shared/registry/createNodeType.ts +7 -9
- package/lib/shared/registry/defineNodeType.ts +2 -6
- package/lib/shared/registry/fieldPresets.ts +3 -1
- package/lib/shared/registry/index.ts +0 -1
- package/lib/shared/registry/nodeTypes/ComponentInstanceNodeType.ts +14 -15
- package/lib/shared/registry/nodeTypes/CustomNodeType.ts +103 -0
- package/lib/shared/registry/nodeTypes/EmbedNodeType.ts +18 -11
- package/lib/shared/registry/nodeTypes/HtmlNodeType.ts +48 -19
- package/lib/shared/registry/nodeTypes/IslandNodeType.ts +129 -0
- package/lib/shared/registry/nodeTypes/LinkNodeType.ts +21 -19
- package/lib/shared/registry/nodeTypes/ListNodeType.ts +117 -77
- package/lib/shared/registry/nodeTypes/LocaleListNodeType.ts +27 -21
- package/lib/shared/registry/nodeTypes/MarkdownNodeType.ts +78 -0
- package/lib/shared/registry/nodeTypes/SlotMarkerType.ts +12 -8
- package/lib/shared/registry/nodeTypes/index.ts +26 -3
- package/lib/shared/responsiveScaling.test.ts +16 -34
- package/lib/shared/responsiveScaling.ts +61 -42
- package/lib/shared/responsiveStyleUtils.test.ts +0 -1
- package/lib/shared/responsiveStyleUtils.ts +11 -13
- package/lib/shared/richtext/htmlToTiptap.test.ts +139 -130
- package/lib/shared/richtext/htmlToTiptap.ts +2 -4
- package/lib/shared/richtext/tiptapToHtml.test.ts +5 -6
- package/lib/shared/richtext/types.ts +1 -8
- package/lib/shared/slugTranslator.test.ts +13 -13
- package/lib/shared/slugTranslator.ts +12 -16
- package/lib/shared/slugify.ts +9 -15
- package/lib/shared/styleNodeUtils.test.ts +8 -8
- package/lib/shared/styleNodeUtils.ts +18 -20
- package/lib/shared/styleUtils.test.ts +87 -61
- package/lib/shared/styleUtils.ts +5 -6
- package/lib/shared/themeDefaults.test.ts +11 -14
- package/lib/shared/themeDefaults.ts +3 -4
- package/lib/shared/tree/PathBuilder.test.ts +63 -145
- package/lib/shared/tree/PathBuilder.ts +59 -47
- package/lib/shared/treePathUtils.test.ts +51 -12
- package/lib/shared/treePathUtils.ts +91 -60
- package/lib/shared/types/api.ts +105 -8
- package/lib/shared/types/cms.test.ts +34 -0
- package/lib/shared/types/cms.ts +90 -34
- package/lib/shared/types/comment.ts +49 -16
- package/lib/shared/types/components.ts +51 -25
- package/lib/shared/types/errors.test.ts +1 -6
- package/lib/shared/types/errors.ts +3 -7
- package/lib/shared/types/experiments.ts +28 -28
- package/lib/shared/types/index.ts +25 -2
- package/lib/shared/types/permissions.ts +139 -0
- package/lib/shared/types/styles.ts +0 -1
- package/lib/shared/types/variables.test.ts +4 -13
- package/lib/shared/types/variables.ts +51 -30
- package/lib/shared/types.ts +1 -2
- package/lib/shared/utilityClassConfig.ts +751 -321
- package/lib/shared/utilityClassMapper.durability.test.ts +117 -0
- package/lib/shared/utilityClassMapper.test.ts +433 -95
- package/lib/shared/utilityClassMapper.ts +322 -249
- package/lib/shared/utilityClassNames.test.ts +38 -0
- package/lib/shared/utilityClassNames.ts +458 -0
- package/lib/shared/utils.test.ts +2 -10
- package/lib/shared/utils.ts +19 -10
- package/lib/shared/validation/cmsValidators.ts +2 -1
- package/lib/shared/validation/commentValidators.test.ts +53 -0
- package/lib/shared/validation/commentValidators.ts +12 -1
- package/lib/shared/validation/index.ts +1 -0
- package/lib/shared/validation/permissionsValidators.test.ts +49 -0
- package/lib/shared/validation/permissionsValidators.ts +49 -0
- package/lib/shared/validation/propValidator.test.ts +19 -21
- package/lib/shared/validation/propValidator.ts +13 -18
- package/lib/shared/validation/schemas.test.ts +64 -32
- package/lib/shared/validation/schemas.ts +616 -345
- package/lib/shared/validation/validators.test.ts +3 -8
- package/lib/shared/validation/validators.ts +89 -68
- package/lib/shared/viewportUnits.integration.test.ts +14 -10
- package/lib/shared/viewportUnits.test.ts +24 -23
- package/lib/shared/viewportUnits.ts +12 -5
- package/lib/test-utils/dom-setup.ts +1 -1
- package/lib/test-utils/factories/ConsoleMockFactory.ts +10 -14
- package/lib/test-utils/factories/DomMockFactory.ts +17 -23
- package/lib/test-utils/factories/EventMockFactory.ts +7 -13
- package/lib/test-utils/factories/FetchMockFactory.ts +39 -57
- package/lib/test-utils/factories/ServerMockFactory.ts +6 -10
- package/lib/test-utils/factories/StoreMockFactory.ts +18 -29
- package/lib/test-utils/fixtures.ts +45 -45
- package/lib/test-utils/helpers/asyncHelpers.test.ts +15 -18
- package/lib/test-utils/helpers/asyncHelpers.ts +11 -20
- package/lib/test-utils/helpers.ts +1 -5
- package/lib/test-utils/index.ts +0 -4
- package/lib/test-utils/mockFactories.ts +13 -19
- package/lib/test-utils/mocks.ts +6 -4
- package/package.json +3 -5
- package/scripts/build-for-publish.mjs +2 -4
- package/scripts/build-meno-filter.ts +4 -7
- package/tsconfig.json +1 -0
- package/vite.config.ts +4 -4
- package/build-next.ts +0 -1361
- package/build-static.test.ts +0 -424
- package/build-static.ts +0 -1074
- package/dist/build-static.js +0 -36
- package/dist/chunks/chunk-2MHDV5BF.js +0 -251
- package/dist/chunks/chunk-2MHDV5BF.js.map +0 -7
- package/dist/chunks/chunk-AZQYF6KE.js +0 -559
- package/dist/chunks/chunk-AZQYF6KE.js.map +0 -7
- package/dist/chunks/chunk-GZHGVVW3.js +0 -322
- package/dist/chunks/chunk-GZHGVVW3.js.map +0 -7
- package/dist/chunks/chunk-H3GJ4H2U.js.map +0 -7
- package/dist/chunks/chunk-I7YIGZXT.js +0 -467
- package/dist/chunks/chunk-I7YIGZXT.js.map +0 -7
- package/dist/chunks/chunk-IGYR22T6.js +0 -6192
- package/dist/chunks/chunk-IGYR22T6.js.map +0 -7
- package/dist/chunks/chunk-JGP5A3Y5.js +0 -1136
- package/dist/chunks/chunk-JGP5A3Y5.js.map +0 -7
- package/dist/chunks/chunk-JGWFTO6P.js.map +0 -7
- package/dist/chunks/chunk-O3NAGJP4.js.map +0 -7
- package/dist/chunks/chunk-QB2LNO4W.js +0 -77
- package/dist/chunks/chunk-QB2LNO4W.js.map +0 -7
- package/dist/chunks/chunk-R6XHAFBF.js +0 -3821
- package/dist/chunks/chunk-R6XHAFBF.js.map +0 -7
- package/dist/chunks/chunk-UB44F4Z2.js.map +0 -7
- package/dist/chunks/chunk-WQFG7PAH.js.map +0 -7
- package/dist/chunks/chunk-X754AHS5.js.map +0 -7
- package/dist/chunks/chunk-YBLHKYFF.js.map +0 -7
- package/dist/chunks/configService-R3OGU2UD.js +0 -13
- package/dist/chunks/configService-R3OGU2UD.js.map +0 -7
- package/dist/chunks/constants-STK2YBIW.js +0 -46
- package/dist/chunks/constants-STK2YBIW.js.map +0 -7
- package/dist/chunks/fs-JGINUXGL.js.map +0 -7
- package/dist/entries/server-router.js +0 -67
- package/dist/entries/server-router.js.map +0 -7
- package/entries/server-router.tsx +0 -81
- package/lib/server/providers/fileSystemPageProvider.ts +0 -160
- package/lib/server/webflow/buildWebflow.ts +0 -635
- package/lib/server/webflow/index.ts +0 -23
- package/lib/server/webflow/nodeToWebflow.test.ts +0 -3170
- package/lib/server/webflow/nodeToWebflow.ts +0 -2435
- package/lib/server/webflow/styleMapper.test.ts +0 -389
- package/lib/server/webflow/styleMapper.ts +0 -695
- package/lib/server/webflow/templateWrapper.ts +0 -49
- package/lib/server/webflow/types.ts +0 -396
- /package/dist/{build-static.js.map → chunks/fs-G3ANWEFP.js.map} +0 -0
|
@@ -1,19 +1,15 @@
|
|
|
1
|
-
import { test, expect, describe
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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:
|
|
15
|
-
default:
|
|
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(
|
|
23
|
+
expect(result.variant).toBe('primary');
|
|
28
24
|
});
|
|
29
25
|
|
|
30
|
-
test(
|
|
26
|
+
test('should override default with passed prop', () => {
|
|
31
27
|
const propDefs: Record<string, PropDefinition> = {
|
|
32
28
|
variant: {
|
|
33
|
-
type:
|
|
34
|
-
default:
|
|
35
|
-
}
|
|
29
|
+
type: 'select',
|
|
30
|
+
default: 'primary',
|
|
31
|
+
},
|
|
36
32
|
};
|
|
37
|
-
const passedProps = { variant:
|
|
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(
|
|
42
|
+
expect(result.variant).toBe('secondary');
|
|
47
43
|
});
|
|
48
44
|
|
|
49
|
-
test(
|
|
45
|
+
test('should handle undefined passed prop value (should use default)', () => {
|
|
50
46
|
const propDefs: Record<string, PropDefinition> = {
|
|
51
47
|
variant: {
|
|
52
|
-
type:
|
|
53
|
-
default:
|
|
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(
|
|
61
|
+
expect(result.variant).toBe('primary');
|
|
66
62
|
});
|
|
67
63
|
|
|
68
|
-
test(
|
|
64
|
+
test('should apply multiple defaults', () => {
|
|
69
65
|
const propDefs: Record<string, PropDefinition> = {
|
|
70
66
|
variant: {
|
|
71
|
-
type:
|
|
72
|
-
default:
|
|
67
|
+
type: 'select',
|
|
68
|
+
default: 'primary',
|
|
73
69
|
},
|
|
74
70
|
size: {
|
|
75
|
-
type:
|
|
76
|
-
default:
|
|
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(
|
|
89
|
-
expect(result.size).toBe(
|
|
84
|
+
expect(result.variant).toBe('primary');
|
|
85
|
+
expect(result.size).toBe('medium');
|
|
90
86
|
});
|
|
91
87
|
|
|
92
|
-
test(
|
|
88
|
+
test('should handle null default value', () => {
|
|
93
89
|
const propDefs: Record<string, PropDefinition> = {
|
|
94
90
|
optional: {
|
|
95
|
-
type:
|
|
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(
|
|
113
|
-
test(
|
|
108
|
+
describe('Prop types', () => {
|
|
109
|
+
test('should handle select type with default', () => {
|
|
114
110
|
const propDefs: Record<string, PropDefinition> = {
|
|
115
111
|
variant: {
|
|
116
|
-
type:
|
|
117
|
-
options: [
|
|
118
|
-
default:
|
|
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(
|
|
126
|
+
expect(result.variant).toBe('primary');
|
|
131
127
|
});
|
|
132
128
|
|
|
133
|
-
test(
|
|
129
|
+
test('should handle boolean type with default true', () => {
|
|
134
130
|
const propDefs: Record<string, PropDefinition> = {
|
|
135
131
|
disabled: {
|
|
136
|
-
type:
|
|
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(
|
|
148
|
+
test('should handle boolean type with default false', () => {
|
|
153
149
|
const propDefs: Record<string, PropDefinition> = {
|
|
154
150
|
disabled: {
|
|
155
|
-
type:
|
|
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(
|
|
167
|
+
test('should handle slot type with default', () => {
|
|
172
168
|
const propDefs: Record<string, PropDefinition> = {
|
|
173
169
|
children: {
|
|
174
|
-
type:
|
|
175
|
-
default:
|
|
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(
|
|
183
|
+
expect(result.children).toBe('Click me');
|
|
188
184
|
});
|
|
189
185
|
|
|
190
|
-
test(
|
|
186
|
+
test('should handle props without defaults', () => {
|
|
191
187
|
const propDefs: Record<string, PropDefinition> = {
|
|
192
188
|
customProp: {
|
|
193
|
-
type:
|
|
189
|
+
type: 'string',
|
|
194
190
|
// No default
|
|
195
|
-
}
|
|
191
|
+
},
|
|
196
192
|
};
|
|
197
|
-
const passedProps = { customProp:
|
|
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(
|
|
202
|
+
expect(result.customProp).toBe('value');
|
|
207
203
|
});
|
|
208
204
|
|
|
209
|
-
test(
|
|
205
|
+
test('should return undefined for props without defaults when not passed', () => {
|
|
210
206
|
const propDefs: Record<string, PropDefinition> = {
|
|
211
207
|
customProp: {
|
|
212
|
-
type:
|
|
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(
|
|
230
|
-
test(
|
|
225
|
+
describe('Children handling', () => {
|
|
226
|
+
test('should use passed children when provided', () => {
|
|
231
227
|
const propDefs: Record<string, PropDefinition> = {
|
|
232
228
|
children: {
|
|
233
|
-
type:
|
|
234
|
-
default:
|
|
235
|
-
}
|
|
229
|
+
type: 'string',
|
|
230
|
+
default: 'Default text',
|
|
231
|
+
},
|
|
236
232
|
};
|
|
237
233
|
const passedProps = {};
|
|
238
|
-
const children: (ComponentNode | string)[] = [
|
|
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([
|
|
242
|
+
expect(result.children).toEqual(['Custom text']);
|
|
247
243
|
});
|
|
248
244
|
|
|
249
|
-
test(
|
|
245
|
+
test('should use default children when no children provided', () => {
|
|
250
246
|
const propDefs: Record<string, PropDefinition> = {
|
|
251
247
|
children: {
|
|
252
|
-
type:
|
|
253
|
-
default:
|
|
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(
|
|
261
|
+
expect(result.children).toBe('Default text');
|
|
266
262
|
});
|
|
267
263
|
|
|
268
|
-
test(
|
|
264
|
+
test('should use default children when children array is empty', () => {
|
|
269
265
|
const propDefs: Record<string, PropDefinition> = {
|
|
270
266
|
children: {
|
|
271
|
-
type:
|
|
272
|
-
default:
|
|
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(
|
|
280
|
+
expect(result.children).toBe('Click me');
|
|
285
281
|
});
|
|
286
282
|
|
|
287
|
-
test(
|
|
283
|
+
test('should handle empty children array when no default', () => {
|
|
288
284
|
const propDefs: Record<string, PropDefinition> = {
|
|
289
285
|
children: {
|
|
290
|
-
type:
|
|
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(
|
|
302
|
+
test('should handle children with multiple elements', () => {
|
|
307
303
|
const propDefs: Record<string, PropDefinition> = {
|
|
308
304
|
children: {
|
|
309
|
-
type:
|
|
310
|
-
default:
|
|
311
|
-
}
|
|
305
|
+
type: 'string',
|
|
306
|
+
default: 'Default',
|
|
307
|
+
},
|
|
312
308
|
};
|
|
313
309
|
const passedProps = {};
|
|
314
310
|
const children: (ComponentNode | string)[] = [
|
|
315
|
-
{ type:
|
|
316
|
-
{ type:
|
|
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(
|
|
325
|
+
test('should handle string children', () => {
|
|
330
326
|
const propDefs: Record<string, PropDefinition> = {
|
|
331
327
|
children: {
|
|
332
|
-
type:
|
|
333
|
-
default:
|
|
334
|
-
}
|
|
328
|
+
type: 'string',
|
|
329
|
+
default: 'Default',
|
|
330
|
+
},
|
|
335
331
|
};
|
|
336
332
|
const passedProps = {};
|
|
337
|
-
const children: string =
|
|
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(
|
|
343
|
+
expect(result.children).toBe('Default');
|
|
348
344
|
});
|
|
349
345
|
|
|
350
|
-
test(
|
|
346
|
+
test('should handle null children', () => {
|
|
351
347
|
const propDefs: Record<string, PropDefinition> = {
|
|
352
348
|
children: {
|
|
353
|
-
type:
|
|
354
|
-
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(
|
|
363
|
+
expect(result.children).toBe('Default');
|
|
368
364
|
});
|
|
369
365
|
});
|
|
370
366
|
|
|
371
|
-
describe(
|
|
372
|
-
test(
|
|
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:
|
|
376
|
-
options: [
|
|
377
|
-
default:
|
|
371
|
+
type: 'select',
|
|
372
|
+
options: ['primary', 'secondary'],
|
|
373
|
+
default: 'primary',
|
|
378
374
|
},
|
|
379
375
|
children: {
|
|
380
|
-
type:
|
|
381
|
-
default:
|
|
376
|
+
type: 'string',
|
|
377
|
+
default: 'Click me',
|
|
382
378
|
},
|
|
383
379
|
size: {
|
|
384
|
-
type:
|
|
385
|
-
default:
|
|
386
|
-
options: [
|
|
387
|
-
}
|
|
380
|
+
type: 'select',
|
|
381
|
+
default: 'medium',
|
|
382
|
+
options: ['medium', 'large'],
|
|
383
|
+
},
|
|
388
384
|
};
|
|
389
|
-
const passedProps = { variant:
|
|
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(
|
|
399
|
-
expect(result.children).toBe(
|
|
400
|
-
expect(result.size).toBe(
|
|
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(
|
|
399
|
+
test('should resolve Button component with all props provided', () => {
|
|
404
400
|
const propDefs: Record<string, PropDefinition> = {
|
|
405
401
|
variant: {
|
|
406
|
-
type:
|
|
407
|
-
default:
|
|
402
|
+
type: 'select',
|
|
403
|
+
default: 'primary',
|
|
408
404
|
},
|
|
409
405
|
children: {
|
|
410
|
-
type:
|
|
411
|
-
default:
|
|
406
|
+
type: 'string',
|
|
407
|
+
default: 'Click me',
|
|
412
408
|
},
|
|
413
409
|
size: {
|
|
414
|
-
type:
|
|
415
|
-
default:
|
|
416
|
-
}
|
|
410
|
+
type: 'select',
|
|
411
|
+
default: 'medium',
|
|
412
|
+
},
|
|
417
413
|
};
|
|
418
|
-
const passedProps = { variant:
|
|
419
|
-
const children: (ComponentNode | string)[] = [
|
|
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(
|
|
428
|
-
expect(result.children).toEqual([
|
|
429
|
-
expect(result.size).toBe(
|
|
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(
|
|
428
|
+
test('should handle props with different types mixed', () => {
|
|
433
429
|
const propDefs: Record<string, PropDefinition> = {
|
|
434
430
|
title: {
|
|
435
|
-
type:
|
|
436
|
-
default:
|
|
431
|
+
type: 'string',
|
|
432
|
+
default: 'Default Title',
|
|
437
433
|
},
|
|
438
434
|
count: {
|
|
439
|
-
type:
|
|
440
|
-
default: 0
|
|
435
|
+
type: 'number',
|
|
436
|
+
default: 0,
|
|
441
437
|
},
|
|
442
438
|
isActive: {
|
|
443
|
-
type:
|
|
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(
|
|
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(
|
|
463
|
-
test(
|
|
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(
|
|
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:
|
|
482
|
-
default:
|
|
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(
|
|
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:
|
|
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(
|
|
514
|
+
test('should preserve passed props that are not in propDefs', () => {
|
|
519
515
|
const propDefs: Record<string, PropDefinition> = {
|
|
520
516
|
variant: {
|
|
521
|
-
type:
|
|
522
|
-
default:
|
|
523
|
-
}
|
|
517
|
+
type: 'select',
|
|
518
|
+
default: 'primary',
|
|
519
|
+
},
|
|
524
520
|
};
|
|
525
521
|
const passedProps = {
|
|
526
|
-
variant:
|
|
527
|
-
extraProp:
|
|
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(
|
|
533
|
+
expect(result.variant).toBe('secondary');
|
|
538
534
|
// Extra props are now preserved for backward compatibility (with validation)
|
|
539
|
-
expect(result.extraProp).toBe(
|
|
535
|
+
expect(result.extraProp).toBe('extra value');
|
|
540
536
|
});
|
|
541
537
|
});
|
|
542
538
|
});
|
|
543
539
|
|
|
544
|
-
describe(
|
|
545
|
-
describe(
|
|
546
|
-
test(
|
|
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:
|
|
551
|
-
default:
|
|
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(
|
|
556
|
+
expect(result.variant).toBe('primary');
|
|
561
557
|
});
|
|
562
558
|
|
|
563
|
-
test(
|
|
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(
|
|
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(
|
|
583
|
+
test('should use passed props and children', () => {
|
|
588
584
|
const componentDef: StructuredComponentDefinition = {
|
|
589
585
|
interface: {
|
|
590
586
|
variant: {
|
|
591
|
-
type:
|
|
592
|
-
default:
|
|
587
|
+
type: 'select',
|
|
588
|
+
default: 'primary',
|
|
593
589
|
},
|
|
594
590
|
children: {
|
|
595
|
-
type:
|
|
596
|
-
default:
|
|
597
|
-
}
|
|
598
|
-
}
|
|
591
|
+
type: 'string',
|
|
592
|
+
default: 'Default',
|
|
593
|
+
},
|
|
594
|
+
},
|
|
599
595
|
};
|
|
600
|
-
const passedProps = { variant:
|
|
601
|
-
const children: (ComponentNode | string)[] = [
|
|
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(
|
|
606
|
-
expect(result.children).toEqual([
|
|
601
|
+
expect(result.variant).toBe('secondary');
|
|
602
|
+
expect(result.children).toEqual(['Custom']);
|
|
607
603
|
});
|
|
608
604
|
});
|
|
609
605
|
|
|
610
|
-
describe(
|
|
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(
|
|
615
|
+
test('should resolve I18nValue for string type', () => {
|
|
620
616
|
const propDefs: Record<string, PropDefinition> = {
|
|
621
|
-
title: { type:
|
|
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(
|
|
633
|
+
test('should fall back to default locale when requested locale missing', () => {
|
|
638
634
|
const propDefs: Record<string, PropDefinition> = {
|
|
639
|
-
title: { type:
|
|
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(
|
|
651
|
+
test('should resolve I18nValue and wrap rich-text', () => {
|
|
656
652
|
const propDefs: Record<string, PropDefinition> = {
|
|
657
|
-
text: { type:
|
|
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(
|
|
672
|
+
test('should wrap plain rich-text string in RichTextMarker', () => {
|
|
677
673
|
const propDefs: Record<string, PropDefinition> = {
|
|
678
|
-
text: { type:
|
|
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(
|
|
691
|
+
test('should NOT wrap empty rich-text string', () => {
|
|
696
692
|
const propDefs: Record<string, PropDefinition> = {
|
|
697
|
-
text: { type:
|
|
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(
|
|
715
|
-
test(
|
|
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:
|
|
720
|
-
options: [
|
|
721
|
-
default:
|
|
715
|
+
type: 'select',
|
|
716
|
+
options: ['primary', 'secondary'],
|
|
717
|
+
default: 'primary',
|
|
722
718
|
},
|
|
723
719
|
children: {
|
|
724
|
-
type:
|
|
725
|
-
default:
|
|
720
|
+
type: 'string',
|
|
721
|
+
default: 'Click me',
|
|
726
722
|
},
|
|
727
723
|
size: {
|
|
728
|
-
type:
|
|
729
|
-
default:
|
|
730
|
-
options: [
|
|
731
|
-
}
|
|
732
|
-
}
|
|
724
|
+
type: 'select',
|
|
725
|
+
default: 'medium',
|
|
726
|
+
options: ['medium', 'large'],
|
|
727
|
+
},
|
|
728
|
+
},
|
|
733
729
|
};
|
|
734
|
-
const passedProps = { variant:
|
|
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(
|
|
740
|
-
expect(result.children).toBe(
|
|
741
|
-
expect(result.size).toBe(
|
|
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
|
});
|