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
|
@@ -250,7 +250,7 @@ function parseParagraph(element: HTMLElement): TiptapNode {
|
|
|
250
250
|
}
|
|
251
251
|
|
|
252
252
|
function parseHeading(element: HTMLElement): TiptapNode {
|
|
253
|
-
const level = parseInt(element.tagName[1], 10);
|
|
253
|
+
const level = parseInt(element.tagName[1] ?? '', 10);
|
|
254
254
|
const content = parseInlineChildren(element);
|
|
255
255
|
const node: TiptapNode = {
|
|
256
256
|
type: 'heading',
|
|
@@ -403,9 +403,7 @@ function parseTable(element: HTMLElement): TiptapNode {
|
|
|
403
403
|
}
|
|
404
404
|
|
|
405
405
|
// Also check direct tr children
|
|
406
|
-
const directRows = Array.from(element.children).filter(
|
|
407
|
-
(child) => child.tagName.toLowerCase() === 'tr'
|
|
408
|
-
);
|
|
406
|
+
const directRows = Array.from(element.children).filter((child) => child.tagName.toLowerCase() === 'tr');
|
|
409
407
|
for (const tr of directRows) {
|
|
410
408
|
const row = parseTableRow(tr as HTMLElement);
|
|
411
409
|
if (row) rows.push(row);
|
|
@@ -220,11 +220,7 @@ describe('tiptapToHtml', () => {
|
|
|
220
220
|
content: [
|
|
221
221
|
{
|
|
222
222
|
type: 'paragraph',
|
|
223
|
-
content: [
|
|
224
|
-
{ type: 'text', text: 'Line 1' },
|
|
225
|
-
{ type: 'hardBreak' },
|
|
226
|
-
{ type: 'text', text: 'Line 2' },
|
|
227
|
-
],
|
|
223
|
+
content: [{ type: 'text', text: 'Line 1' }, { type: 'hardBreak' }, { type: 'text', text: 'Line 2' }],
|
|
228
224
|
},
|
|
229
225
|
],
|
|
230
226
|
};
|
|
@@ -243,7 +239,10 @@ describe('tiptapToHtml', () => {
|
|
|
243
239
|
{
|
|
244
240
|
type: 'tableRow',
|
|
245
241
|
content: [
|
|
246
|
-
{
|
|
242
|
+
{
|
|
243
|
+
type: 'tableHeader',
|
|
244
|
+
content: [{ type: 'paragraph', content: [{ type: 'text', text: 'Header' }] }],
|
|
245
|
+
},
|
|
247
246
|
],
|
|
248
247
|
},
|
|
249
248
|
{
|
|
@@ -76,11 +76,4 @@ export type TiptapNodeType =
|
|
|
76
76
|
/**
|
|
77
77
|
* Known Tiptap mark types
|
|
78
78
|
*/
|
|
79
|
-
export type TiptapMarkType =
|
|
80
|
-
| 'bold'
|
|
81
|
-
| 'italic'
|
|
82
|
-
| 'underline'
|
|
83
|
-
| 'strike'
|
|
84
|
-
| 'code'
|
|
85
|
-
| 'link'
|
|
86
|
-
| 'textStyle';
|
|
79
|
+
export type TiptapMarkType = 'bold' | 'italic' | 'underline' | 'strike' | 'code' | 'link' | 'textStyle';
|
|
@@ -251,23 +251,23 @@ describe('slugTranslator', () => {
|
|
|
251
251
|
|
|
252
252
|
test('should include correct locale codes', () => {
|
|
253
253
|
const links = getLocaleLinks('/about', 'en', i18nConfig, slugIndex);
|
|
254
|
-
const codes = links.map(link => link.locale);
|
|
254
|
+
const codes = links.map((link) => link.locale);
|
|
255
255
|
expect(codes).toEqual(['en', 'pl', 'de']);
|
|
256
256
|
});
|
|
257
257
|
|
|
258
258
|
test('should include correct native names', () => {
|
|
259
259
|
const links = getLocaleLinks('/about', 'en', i18nConfig, slugIndex);
|
|
260
|
-
const names = links.map(link => link.nativeName);
|
|
260
|
+
const names = links.map((link) => link.nativeName);
|
|
261
261
|
expect(names).toEqual(['English', 'Polski', 'Deutsch']);
|
|
262
262
|
});
|
|
263
263
|
|
|
264
264
|
test('should mark current locale correctly', () => {
|
|
265
265
|
const links = getLocaleLinks('/about', 'pl', i18nConfig, slugIndex);
|
|
266
|
-
const currentLink = links.find(link => link.locale === 'pl');
|
|
266
|
+
const currentLink = links.find((link) => link.locale === 'pl');
|
|
267
267
|
expect(currentLink?.isCurrent).toBe(true);
|
|
268
268
|
|
|
269
|
-
const otherLinks = links.filter(link => link.locale !== 'pl');
|
|
270
|
-
otherLinks.forEach(link => {
|
|
269
|
+
const otherLinks = links.filter((link) => link.locale !== 'pl');
|
|
270
|
+
otherLinks.forEach((link) => {
|
|
271
271
|
expect(link.isCurrent).toBe(false);
|
|
272
272
|
});
|
|
273
273
|
});
|
|
@@ -275,36 +275,36 @@ describe('slugTranslator', () => {
|
|
|
275
275
|
test('should translate paths correctly for each locale', () => {
|
|
276
276
|
const links = getLocaleLinks('/about', 'en', i18nConfig, slugIndex);
|
|
277
277
|
|
|
278
|
-
const enLink = links.find(link => link.locale === 'en');
|
|
278
|
+
const enLink = links.find((link) => link.locale === 'en');
|
|
279
279
|
expect(enLink?.path).toBe('/about');
|
|
280
280
|
|
|
281
|
-
const plLink = links.find(link => link.locale === 'pl');
|
|
281
|
+
const plLink = links.find((link) => link.locale === 'pl');
|
|
282
282
|
expect(plLink?.path).toBe('/pl/o-nas');
|
|
283
283
|
|
|
284
|
-
const deLink = links.find(link => link.locale === 'de');
|
|
284
|
+
const deLink = links.find((link) => link.locale === 'de');
|
|
285
285
|
expect(deLink?.path).toBe('/de/uber');
|
|
286
286
|
});
|
|
287
287
|
|
|
288
288
|
test('should handle root path', () => {
|
|
289
289
|
const links = getLocaleLinks('/', 'en', i18nConfig, slugIndex);
|
|
290
290
|
|
|
291
|
-
const enLink = links.find(link => link.locale === 'en');
|
|
291
|
+
const enLink = links.find((link) => link.locale === 'en');
|
|
292
292
|
expect(enLink?.path).toBe('/');
|
|
293
293
|
|
|
294
|
-
const plLink = links.find(link => link.locale === 'pl');
|
|
294
|
+
const plLink = links.find((link) => link.locale === 'pl');
|
|
295
295
|
expect(plLink?.path).toBe('/pl');
|
|
296
296
|
|
|
297
|
-
const deLink = links.find(link => link.locale === 'de');
|
|
297
|
+
const deLink = links.find((link) => link.locale === 'de');
|
|
298
298
|
expect(deLink?.path).toBe('/de');
|
|
299
299
|
});
|
|
300
300
|
|
|
301
301
|
test('should handle Polish path', () => {
|
|
302
302
|
const links = getLocaleLinks('/pl/o-nas', 'pl', i18nConfig, slugIndex);
|
|
303
303
|
|
|
304
|
-
const enLink = links.find(link => link.locale === 'en');
|
|
304
|
+
const enLink = links.find((link) => link.locale === 'en');
|
|
305
305
|
expect(enLink?.path).toBe('/about');
|
|
306
306
|
|
|
307
|
-
const plLink = links.find(link => link.locale === 'pl');
|
|
307
|
+
const plLink = links.find((link) => link.locale === 'pl');
|
|
308
308
|
expect(plLink?.path).toBe('/pl/o-nas');
|
|
309
309
|
});
|
|
310
310
|
});
|
|
@@ -49,7 +49,7 @@ export function buildSlugIndex(mappings: SlugMap[]): Map<string, SlugIndexEntry>
|
|
|
49
49
|
export function findPageBySlug(
|
|
50
50
|
slug: string,
|
|
51
51
|
locale: string,
|
|
52
|
-
index: Map<string, SlugIndexEntry
|
|
52
|
+
index: Map<string, SlugIndexEntry>,
|
|
53
53
|
): SlugIndexEntry | undefined {
|
|
54
54
|
const key = `${locale}:${slug}`;
|
|
55
55
|
return index.get(key);
|
|
@@ -70,7 +70,7 @@ export function translatePath(
|
|
|
70
70
|
targetLocale: string,
|
|
71
71
|
currentLocale: string,
|
|
72
72
|
defaultLocale: string,
|
|
73
|
-
index: Map<string, SlugIndexEntry
|
|
73
|
+
index: Map<string, SlugIndexEntry>,
|
|
74
74
|
): string {
|
|
75
75
|
// Extract slug from current path (remove locale prefix if present)
|
|
76
76
|
let slug = currentPath;
|
|
@@ -127,12 +127,12 @@ export function translatePath(
|
|
|
127
127
|
* Locale link information for locale switcher
|
|
128
128
|
*/
|
|
129
129
|
export interface LocaleLink {
|
|
130
|
-
locale: string;
|
|
131
|
-
langTag: string;
|
|
132
|
-
name: string;
|
|
133
|
-
nativeName: string;
|
|
134
|
-
path: string;
|
|
135
|
-
isCurrent: boolean;
|
|
130
|
+
locale: string; // Locale code (e.g., "pl")
|
|
131
|
+
langTag: string; // BCP 47 language tag (e.g., "pl-PL")
|
|
132
|
+
name: string; // English name (e.g., "Polish")
|
|
133
|
+
nativeName: string; // Display name in native language (e.g., "Polski")
|
|
134
|
+
path: string; // Translated path for this locale
|
|
135
|
+
isCurrent: boolean; // Whether this is the current locale
|
|
136
136
|
}
|
|
137
137
|
|
|
138
138
|
/**
|
|
@@ -149,9 +149,9 @@ export function getLocaleLinks(
|
|
|
149
149
|
currentPath: string,
|
|
150
150
|
currentLocale: string,
|
|
151
151
|
i18nConfig: I18nConfig,
|
|
152
|
-
index: Map<string, SlugIndexEntry
|
|
152
|
+
index: Map<string, SlugIndexEntry>,
|
|
153
153
|
): LocaleLink[] {
|
|
154
|
-
return i18nConfig.locales.map(localeConfig => ({
|
|
154
|
+
return i18nConfig.locales.map((localeConfig) => ({
|
|
155
155
|
locale: localeConfig.code,
|
|
156
156
|
langTag: localeConfig.langTag,
|
|
157
157
|
name: localeConfig.name,
|
|
@@ -173,11 +173,7 @@ export function getLocaleLinks(
|
|
|
173
173
|
* Used by the slug/page-rename flow to compute the (old, new) href pair
|
|
174
174
|
* for cascade rewrites in incoming links.
|
|
175
175
|
*/
|
|
176
|
-
export function buildPageUrlForLocale(
|
|
177
|
-
slug: string,
|
|
178
|
-
locale: string,
|
|
179
|
-
defaultLocale: string,
|
|
180
|
-
): string {
|
|
176
|
+
export function buildPageUrlForLocale(slug: string, locale: string, defaultLocale: string): string {
|
|
181
177
|
const cleanSlug = slug.replace(/^\/+/, '');
|
|
182
178
|
if (locale === defaultLocale) {
|
|
183
179
|
return cleanSlug === '' ? '/' : `/${cleanSlug}`;
|
|
@@ -196,7 +192,7 @@ export function buildPageUrlForLocale(
|
|
|
196
192
|
export function resolveSlugToPageId(
|
|
197
193
|
slug: string,
|
|
198
194
|
locale: string,
|
|
199
|
-
index: Map<string, SlugIndexEntry
|
|
195
|
+
index: Map<string, SlugIndexEntry>,
|
|
200
196
|
): string | undefined {
|
|
201
197
|
const entry = findPageBySlug(slug, locale, index);
|
|
202
198
|
return entry?.pageId;
|
package/lib/shared/slugify.ts
CHANGED
|
@@ -17,13 +17,13 @@ export function slugify(text: string): string {
|
|
|
17
17
|
|
|
18
18
|
return text
|
|
19
19
|
.toLowerCase()
|
|
20
|
-
.normalize('NFD')
|
|
21
|
-
.replace(/[\u0300-\u036f]/g, '')
|
|
22
|
-
.replace(/[^a-z0-9\s-]/g, '')
|
|
20
|
+
.normalize('NFD') // Decompose accented chars (é -> e + ́)
|
|
21
|
+
.replace(/[\u0300-\u036f]/g, '') // Remove diacritics
|
|
22
|
+
.replace(/[^a-z0-9\s-]/g, '') // Remove special chars
|
|
23
23
|
.trim()
|
|
24
|
-
.replace(/\s+/g, '-')
|
|
25
|
-
.replace(/-+/g, '-')
|
|
26
|
-
.replace(/^-|-$/g, '');
|
|
24
|
+
.replace(/\s+/g, '-') // Replace spaces with hyphens
|
|
25
|
+
.replace(/-+/g, '-') // Collapse multiple hyphens
|
|
26
|
+
.replace(/^-|-$/g, ''); // Remove leading/trailing hyphens
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
/**
|
|
@@ -34,10 +34,7 @@ export function slugify(text: string): string {
|
|
|
34
34
|
* @param defaultLocale - Locale to use for i18n extraction (default: 'en')
|
|
35
35
|
* @returns Extracted string value
|
|
36
36
|
*/
|
|
37
|
-
export function extractStringValue(
|
|
38
|
-
value: unknown,
|
|
39
|
-
defaultLocale: string = 'en'
|
|
40
|
-
): string {
|
|
37
|
+
export function extractStringValue(value: unknown, defaultLocale: string = 'en'): string {
|
|
41
38
|
// Direct string
|
|
42
39
|
if (typeof value === 'string') {
|
|
43
40
|
return value;
|
|
@@ -69,10 +66,7 @@ export function extractStringValue(
|
|
|
69
66
|
* @param existingFilenames - Array of existing filenames to check against
|
|
70
67
|
* @returns Unique filename
|
|
71
68
|
*/
|
|
72
|
-
export function generateUniqueFilename(
|
|
73
|
-
baseSlug: string,
|
|
74
|
-
existingFilenames: string[]
|
|
75
|
-
): string {
|
|
69
|
+
export function generateUniqueFilename(baseSlug: string, existingFilenames: string[]): string {
|
|
76
70
|
if (!baseSlug) {
|
|
77
71
|
baseSlug = 'untitled';
|
|
78
72
|
}
|
|
@@ -107,7 +101,7 @@ export function generateFilenameFromItem(
|
|
|
107
101
|
item: Record<string, unknown>,
|
|
108
102
|
titleField: string = 'title',
|
|
109
103
|
existingFilenames: string[] = [],
|
|
110
|
-
defaultLocale: string = 'en'
|
|
104
|
+
defaultLocale: string = 'en',
|
|
111
105
|
): string {
|
|
112
106
|
// Try to get title from specified field
|
|
113
107
|
const titleValue = item[titleField];
|
|
@@ -52,7 +52,7 @@ describe('styleNodeUtils', () => {
|
|
|
52
52
|
type: NODE_TYPE.NODE,
|
|
53
53
|
tag: 'div',
|
|
54
54
|
children: [],
|
|
55
|
-
style: { color: 'blue' }
|
|
55
|
+
style: { color: 'blue' },
|
|
56
56
|
};
|
|
57
57
|
const instanceStyles = { fontSize: '16px' };
|
|
58
58
|
const result = mergeNodeStyles(node, instanceStyles);
|
|
@@ -63,7 +63,7 @@ describe('styleNodeUtils', () => {
|
|
|
63
63
|
const node: ComponentInstanceNode = {
|
|
64
64
|
type: NODE_TYPE.COMPONENT,
|
|
65
65
|
component: 'Button',
|
|
66
|
-
props: { style: { color: 'blue' } }
|
|
66
|
+
props: { style: { color: 'blue' } },
|
|
67
67
|
};
|
|
68
68
|
const instanceStyles = { padding: '10px' };
|
|
69
69
|
const result = mergeNodeStyles(node, instanceStyles);
|
|
@@ -75,7 +75,7 @@ describe('styleNodeUtils', () => {
|
|
|
75
75
|
type: NODE_TYPE.NODE,
|
|
76
76
|
tag: 'div',
|
|
77
77
|
children: [],
|
|
78
|
-
style: { color: 'blue', fontSize: '14px' }
|
|
78
|
+
style: { color: 'blue', fontSize: '14px' },
|
|
79
79
|
};
|
|
80
80
|
const instanceStyles = { fontSize: '16px' };
|
|
81
81
|
const result = mergeNodeStyles(node, instanceStyles);
|
|
@@ -100,7 +100,7 @@ describe('styleNodeUtils', () => {
|
|
|
100
100
|
type: NODE_TYPE.LINK,
|
|
101
101
|
href: '/foo',
|
|
102
102
|
children: [],
|
|
103
|
-
style: { color: '#000000', backgroundColor: '#ffffff' }
|
|
103
|
+
style: { color: '#000000', backgroundColor: '#ffffff' },
|
|
104
104
|
};
|
|
105
105
|
const instanceStyles = { backgroundColor: '#252525', color: '#ffffff' };
|
|
106
106
|
const result = mergeNodeStyles(node, instanceStyles);
|
|
@@ -112,7 +112,7 @@ describe('styleNodeUtils', () => {
|
|
|
112
112
|
type: NODE_TYPE.LINK,
|
|
113
113
|
href: '/foo',
|
|
114
114
|
children: [],
|
|
115
|
-
style: { base: { color: '#000', padding: '8px' }, tablet: { fontSize: '14px' }, mobile: {} }
|
|
115
|
+
style: { base: { color: '#000', padding: '8px' }, tablet: { fontSize: '14px' }, mobile: {} },
|
|
116
116
|
};
|
|
117
117
|
const instanceStyles = { base: { backgroundColor: '#252525', color: '#fff' }, tablet: {}, mobile: {} };
|
|
118
118
|
const result = mergeNodeStyles(node, instanceStyles);
|
|
@@ -130,7 +130,7 @@ describe('styleNodeUtils', () => {
|
|
|
130
130
|
type: NODE_TYPE.NODE,
|
|
131
131
|
tag: 'div',
|
|
132
132
|
children: [],
|
|
133
|
-
style: { color: 'red', fontSize: '16px' }
|
|
133
|
+
style: { color: 'red', fontSize: '16px' },
|
|
134
134
|
};
|
|
135
135
|
const styles = extractStylesFromNode(node);
|
|
136
136
|
expect(styles).toEqual({ color: 'red', fontSize: '16px' });
|
|
@@ -140,7 +140,7 @@ describe('styleNodeUtils', () => {
|
|
|
140
140
|
const node: ComponentInstanceNode = {
|
|
141
141
|
type: NODE_TYPE.COMPONENT,
|
|
142
142
|
component: 'Button',
|
|
143
|
-
props: { style: { padding: '10px' } }
|
|
143
|
+
props: { style: { padding: '10px' } },
|
|
144
144
|
};
|
|
145
145
|
const styles = extractStylesFromNode(node);
|
|
146
146
|
expect(styles).toEqual({ padding: '10px' });
|
|
@@ -169,7 +169,7 @@ describe('styleNodeUtils', () => {
|
|
|
169
169
|
type: NODE_TYPE.LINK,
|
|
170
170
|
href: '/foo',
|
|
171
171
|
children: [],
|
|
172
|
-
style: { backgroundColor: '#252525' }
|
|
172
|
+
style: { backgroundColor: '#252525' },
|
|
173
173
|
};
|
|
174
174
|
const styles = extractStylesFromNode(node);
|
|
175
175
|
expect(styles).toEqual({ backgroundColor: '#252525' });
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Provides helper functions for applying and merging styles based on node type
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import type { ComponentNode,
|
|
6
|
+
import type { ComponentNode, StyleValue } from './types';
|
|
7
7
|
import { isComponentNode, isHtmlNode, isEmbedNode, isListNode, isLinkNode } from './nodeUtils';
|
|
8
8
|
import { isResponsiveStyle } from './styleUtils';
|
|
9
9
|
|
|
@@ -15,7 +15,7 @@ import { isResponsiveStyle } from './styleUtils';
|
|
|
15
15
|
export function applyStylesToNode(
|
|
16
16
|
node: ComponentNode,
|
|
17
17
|
styles: StyleValue | Record<string, string | number> | null | undefined,
|
|
18
|
-
|
|
18
|
+
_viewportWidth?: number,
|
|
19
19
|
): ComponentNode {
|
|
20
20
|
if (!styles) return node;
|
|
21
21
|
|
|
@@ -44,31 +44,33 @@ export function applyStylesToNode(
|
|
|
44
44
|
* exporter can replicate SSR's instance-into-root style merge at build time.
|
|
45
45
|
*/
|
|
46
46
|
export function deepMergeStyles(
|
|
47
|
-
existing: StyleValue | Record<string,
|
|
48
|
-
instance: StyleValue | Record<string,
|
|
47
|
+
existing: StyleValue | Record<string, unknown>,
|
|
48
|
+
instance: StyleValue | Record<string, unknown> | null | undefined,
|
|
49
49
|
): StyleValue {
|
|
50
50
|
if (!instance) return existing as StyleValue;
|
|
51
51
|
|
|
52
|
-
const bothResponsive =
|
|
53
|
-
isResponsiveStyle(existing as StyleValue) && isResponsiveStyle(instance as StyleValue);
|
|
52
|
+
const bothResponsive = isResponsiveStyle(existing as StyleValue) && isResponsiveStyle(instance as StyleValue);
|
|
54
53
|
|
|
55
54
|
if (bothResponsive) {
|
|
56
|
-
const e = existing as Record<string,
|
|
57
|
-
const i = instance as Record<string,
|
|
58
|
-
const merged: Record<string,
|
|
55
|
+
const e = existing as Record<string, unknown>;
|
|
56
|
+
const i = instance as Record<string, unknown>;
|
|
57
|
+
const merged: Record<string, unknown> = {};
|
|
59
58
|
const keys = new Set([...Object.keys(e), ...Object.keys(i)]);
|
|
60
59
|
for (const key of keys) {
|
|
61
|
-
|
|
62
|
-
|
|
60
|
+
// Capture the indexed values so `typeof` narrows them for the object spread.
|
|
61
|
+
const ev = e[key];
|
|
62
|
+
const iv = i[key];
|
|
63
|
+
if (ev && iv && typeof ev === 'object' && typeof iv === 'object') {
|
|
64
|
+
merged[key] = { ...(ev as object), ...(iv as object) };
|
|
63
65
|
} else {
|
|
64
|
-
merged[key] =
|
|
66
|
+
merged[key] = iv !== undefined ? iv : ev;
|
|
65
67
|
}
|
|
66
68
|
}
|
|
67
69
|
return merged as StyleValue;
|
|
68
70
|
}
|
|
69
71
|
|
|
70
72
|
// Flat styles: shallow merge (instance overrides)
|
|
71
|
-
return { ...(existing as Record<string,
|
|
73
|
+
return { ...(existing as Record<string, unknown>), ...(instance as Record<string, unknown>) } as StyleValue;
|
|
72
74
|
}
|
|
73
75
|
|
|
74
76
|
/**
|
|
@@ -78,7 +80,7 @@ export function deepMergeStyles(
|
|
|
78
80
|
export function mergeNodeStyles(
|
|
79
81
|
node: ComponentNode,
|
|
80
82
|
instanceStyles: StyleValue | Record<string, string | number> | null | undefined,
|
|
81
|
-
|
|
83
|
+
_viewportWidth?: number,
|
|
82
84
|
): ComponentNode {
|
|
83
85
|
if (!instanceStyles) return node;
|
|
84
86
|
|
|
@@ -86,7 +88,7 @@ export function mergeNodeStyles(
|
|
|
86
88
|
// For HTML nodes, Embed nodes, List nodes, and Link nodes: merge instance styles with existing top-level styles
|
|
87
89
|
const existingStyle = node.style;
|
|
88
90
|
if (existingStyle && typeof existingStyle === 'object') {
|
|
89
|
-
node.style = deepMergeStyles(existingStyle, instanceStyles);
|
|
91
|
+
node.style = deepMergeStyles(existingStyle as Record<string, unknown>, instanceStyles);
|
|
90
92
|
} else {
|
|
91
93
|
node.style = instanceStyles as StyleValue;
|
|
92
94
|
}
|
|
@@ -110,10 +112,7 @@ export function mergeNodeStyles(
|
|
|
110
112
|
* Extract styles from a ComponentNode based on its type
|
|
111
113
|
* Returns a flat style object ready for React props
|
|
112
114
|
*/
|
|
113
|
-
export function extractStylesFromNode(
|
|
114
|
-
node: ComponentNode,
|
|
115
|
-
viewportWidth?: number
|
|
116
|
-
): Record<string, string | number> {
|
|
115
|
+
export function extractStylesFromNode(node: ComponentNode, _viewportWidth?: number): Record<string, string | number> {
|
|
117
116
|
if (isComponentNode(node)) {
|
|
118
117
|
// Component instance: styles are in props.style
|
|
119
118
|
const style = node.props?.style;
|
|
@@ -130,4 +129,3 @@ export function extractStylesFromNode(
|
|
|
130
129
|
|
|
131
130
|
return {};
|
|
132
131
|
}
|
|
133
|
-
|
|
@@ -21,11 +21,13 @@ describe('styleUtils', () => {
|
|
|
21
21
|
});
|
|
22
22
|
|
|
23
23
|
test('should return true for object with multiple responsive keys', () => {
|
|
24
|
-
expect(
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
24
|
+
expect(
|
|
25
|
+
isResponsiveStyle({
|
|
26
|
+
base: { color: 'red' },
|
|
27
|
+
tablet: { color: 'blue' },
|
|
28
|
+
mobile: { color: 'green' },
|
|
29
|
+
}),
|
|
30
|
+
).toBe(true);
|
|
29
31
|
});
|
|
30
32
|
|
|
31
33
|
test('should return false for regular style object', () => {
|
|
@@ -58,10 +60,12 @@ describe('styleUtils', () => {
|
|
|
58
60
|
});
|
|
59
61
|
|
|
60
62
|
test('should handle object with base key and other properties', () => {
|
|
61
|
-
expect(
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
63
|
+
expect(
|
|
64
|
+
isResponsiveStyle({
|
|
65
|
+
base: { color: 'red' },
|
|
66
|
+
customProp: 'value',
|
|
67
|
+
} as any),
|
|
68
|
+
).toBe(true);
|
|
65
69
|
});
|
|
66
70
|
});
|
|
67
71
|
|
|
@@ -71,41 +75,51 @@ describe('styleUtils', () => {
|
|
|
71
75
|
});
|
|
72
76
|
|
|
73
77
|
test('should return true for style object with string values', () => {
|
|
74
|
-
expect(
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
78
|
+
expect(
|
|
79
|
+
isStyleObject({
|
|
80
|
+
color: 'red',
|
|
81
|
+
backgroundColor: 'blue',
|
|
82
|
+
padding: '10px',
|
|
83
|
+
}),
|
|
84
|
+
).toBe(true);
|
|
79
85
|
});
|
|
80
86
|
|
|
81
87
|
test('should return true for style object with number values', () => {
|
|
82
|
-
expect(
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
88
|
+
expect(
|
|
89
|
+
isStyleObject({
|
|
90
|
+
width: 100,
|
|
91
|
+
height: 200,
|
|
92
|
+
opacity: 0.5,
|
|
93
|
+
}),
|
|
94
|
+
).toBe(true);
|
|
87
95
|
});
|
|
88
96
|
|
|
89
97
|
test('should return true for style object with mixed string and number', () => {
|
|
90
|
-
expect(
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
98
|
+
expect(
|
|
99
|
+
isStyleObject({
|
|
100
|
+
color: 'red',
|
|
101
|
+
width: 100,
|
|
102
|
+
fontSize: '16px',
|
|
103
|
+
opacity: 0.8,
|
|
104
|
+
}),
|
|
105
|
+
).toBe(true);
|
|
96
106
|
});
|
|
97
107
|
|
|
98
108
|
test('should return true for style object with _mapping property', () => {
|
|
99
|
-
expect(
|
|
100
|
-
|
|
101
|
-
|
|
109
|
+
expect(
|
|
110
|
+
isStyleObject({
|
|
111
|
+
color: { _mapping: 'theme.colors.primary' },
|
|
112
|
+
}),
|
|
113
|
+
).toBe(true);
|
|
102
114
|
});
|
|
103
115
|
|
|
104
116
|
test('should return false for responsive style object', () => {
|
|
105
|
-
expect(
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
117
|
+
expect(
|
|
118
|
+
isStyleObject({
|
|
119
|
+
base: { color: 'red' },
|
|
120
|
+
tablet: { color: 'blue' },
|
|
121
|
+
}),
|
|
122
|
+
).toBe(false);
|
|
109
123
|
});
|
|
110
124
|
|
|
111
125
|
test('should return false for object with only base key', () => {
|
|
@@ -138,25 +152,31 @@ describe('styleUtils', () => {
|
|
|
138
152
|
});
|
|
139
153
|
|
|
140
154
|
test('should return false for object with invalid value types', () => {
|
|
141
|
-
expect(
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
155
|
+
expect(
|
|
156
|
+
isStyleObject({
|
|
157
|
+
color: 'red',
|
|
158
|
+
invalid: [],
|
|
159
|
+
}),
|
|
160
|
+
).toBe(false);
|
|
145
161
|
});
|
|
146
162
|
|
|
147
163
|
test('should return false for object with nested objects without _mapping', () => {
|
|
148
|
-
expect(
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
164
|
+
expect(
|
|
165
|
+
isStyleObject({
|
|
166
|
+
color: 'red',
|
|
167
|
+
nested: { prop: 'value' },
|
|
168
|
+
}),
|
|
169
|
+
).toBe(false);
|
|
152
170
|
});
|
|
153
171
|
|
|
154
172
|
test('should handle complex StyleMapping objects', () => {
|
|
155
|
-
expect(
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
173
|
+
expect(
|
|
174
|
+
isStyleObject({
|
|
175
|
+
color: { _mapping: 'colors.primary' },
|
|
176
|
+
fontSize: '16px',
|
|
177
|
+
width: 100,
|
|
178
|
+
}),
|
|
179
|
+
).toBe(true);
|
|
160
180
|
});
|
|
161
181
|
});
|
|
162
182
|
|
|
@@ -166,10 +186,12 @@ describe('styleUtils', () => {
|
|
|
166
186
|
});
|
|
167
187
|
|
|
168
188
|
test('should return true for responsive style object', () => {
|
|
169
|
-
expect(
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
189
|
+
expect(
|
|
190
|
+
isStyleValue({
|
|
191
|
+
base: { color: 'red' },
|
|
192
|
+
tablet: { color: 'blue' },
|
|
193
|
+
}),
|
|
194
|
+
).toBe(true);
|
|
173
195
|
});
|
|
174
196
|
|
|
175
197
|
test('should return true for object with base key', () => {
|
|
@@ -218,21 +240,25 @@ describe('styleUtils', () => {
|
|
|
218
240
|
});
|
|
219
241
|
|
|
220
242
|
test('should handle complex responsive styles', () => {
|
|
221
|
-
expect(
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
243
|
+
expect(
|
|
244
|
+
isStyleValue({
|
|
245
|
+
base: { color: 'red', fontSize: '18px' },
|
|
246
|
+
tablet: { color: 'blue', fontSize: '16px' },
|
|
247
|
+
mobile: { color: 'green', fontSize: '14px' },
|
|
248
|
+
}),
|
|
249
|
+
).toBe(true);
|
|
226
250
|
});
|
|
227
251
|
|
|
228
252
|
test('should handle complex style objects', () => {
|
|
229
|
-
expect(
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
253
|
+
expect(
|
|
254
|
+
isStyleValue({
|
|
255
|
+
color: 'red',
|
|
256
|
+
fontSize: '16px',
|
|
257
|
+
width: 100,
|
|
258
|
+
height: 200,
|
|
259
|
+
opacity: 0.8,
|
|
260
|
+
}),
|
|
261
|
+
).toBe(true);
|
|
236
262
|
});
|
|
237
263
|
});
|
|
238
264
|
});
|