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,10 +1,5 @@
|
|
|
1
1
|
import { describe, test, expect } from 'bun:test';
|
|
2
|
-
import {
|
|
3
|
-
validatePropDefinition,
|
|
4
|
-
validateComponentNode,
|
|
5
|
-
validateOrThrow,
|
|
6
|
-
type ValidationResult,
|
|
7
|
-
} from './validators';
|
|
2
|
+
import { validatePropDefinition, validateComponentNode, validateOrThrow, type ValidationResult } from './validators';
|
|
8
3
|
import { NODE_TYPE } from '../constants';
|
|
9
4
|
|
|
10
5
|
describe('validators', () => {
|
|
@@ -90,7 +85,7 @@ describe('validators', () => {
|
|
|
90
85
|
});
|
|
91
86
|
|
|
92
87
|
test('throws on invalid input', () => {
|
|
93
|
-
const validator = (
|
|
88
|
+
const validator = (_data: unknown): ValidationResult<string> => ({
|
|
94
89
|
valid: false,
|
|
95
90
|
errors: [{ path: 'root', message: 'Invalid' }],
|
|
96
91
|
});
|
|
@@ -98,7 +93,7 @@ describe('validators', () => {
|
|
|
98
93
|
});
|
|
99
94
|
|
|
100
95
|
test('includes custom error message', () => {
|
|
101
|
-
const validator = (
|
|
96
|
+
const validator = (_data: unknown): ValidationResult<string> => ({
|
|
102
97
|
valid: false,
|
|
103
98
|
errors: [{ path: 'field', message: 'Required' }],
|
|
104
99
|
});
|
|
@@ -5,7 +5,13 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import type { ZodError, ZodType } from 'zod';
|
|
8
|
-
import type {
|
|
8
|
+
import type {
|
|
9
|
+
PropDefinition,
|
|
10
|
+
ComponentDefinition,
|
|
11
|
+
StructuredComponentDefinition,
|
|
12
|
+
PageData,
|
|
13
|
+
PageDataWithComponent,
|
|
14
|
+
} from '../types/components';
|
|
9
15
|
import type { ComponentNode } from '../types/nodes';
|
|
10
16
|
import type { PageMetaData } from '../types/api';
|
|
11
17
|
import type { CMSSchema, CMSItem } from '../types/cms';
|
|
@@ -34,15 +40,13 @@ export interface ValidationError {
|
|
|
34
40
|
/**
|
|
35
41
|
* Validation result type - always includes error details on failure
|
|
36
42
|
*/
|
|
37
|
-
export type ValidationResult<T> =
|
|
38
|
-
| { valid: true; data: T }
|
|
39
|
-
| { valid: false; errors: ValidationError[] };
|
|
43
|
+
export type ValidationResult<T> = { valid: true; data: T } | { valid: false; errors: ValidationError[] };
|
|
40
44
|
|
|
41
45
|
/**
|
|
42
46
|
* Convert Zod errors to ValidationError format
|
|
43
47
|
*/
|
|
44
48
|
function zodToValidationErrors(zodError: ZodError): ValidationError[] {
|
|
45
|
-
return zodError.errors.map(err => ({
|
|
49
|
+
return zodError.errors.map((err) => ({
|
|
46
50
|
path: err.path.join('.') || 'root',
|
|
47
51
|
message: err.message,
|
|
48
52
|
code: 'INVALID_TYPE' as const,
|
|
@@ -55,11 +59,11 @@ function zodToValidationErrors(zodError: ZodError): ValidationError[] {
|
|
|
55
59
|
export function validateOrThrow<T>(
|
|
56
60
|
data: unknown,
|
|
57
61
|
validator: (data: unknown) => ValidationResult<T>,
|
|
58
|
-
errorMessage?: string
|
|
62
|
+
errorMessage?: string,
|
|
59
63
|
): T {
|
|
60
64
|
const result = validator(data);
|
|
61
65
|
if (!result.valid) {
|
|
62
|
-
const details = result.errors.map(e => `${e.path}: ${e.message}`).join('; ');
|
|
66
|
+
const details = result.errors.map((e) => `${e.path}: ${e.message}`).join('; ');
|
|
63
67
|
throw new Error(errorMessage ? `${errorMessage}: ${details}` : details);
|
|
64
68
|
}
|
|
65
69
|
return result.data;
|
|
@@ -79,11 +83,13 @@ export function validatePropDefinition(propDef: unknown): ValidationResult<PropD
|
|
|
79
83
|
} catch (error) {
|
|
80
84
|
return {
|
|
81
85
|
valid: false,
|
|
82
|
-
errors: [
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
86
|
+
errors: [
|
|
87
|
+
{
|
|
88
|
+
path: 'root',
|
|
89
|
+
message: error instanceof Error ? error.message : 'Unknown validation error',
|
|
90
|
+
code: 'UNKNOWN',
|
|
91
|
+
},
|
|
92
|
+
],
|
|
87
93
|
};
|
|
88
94
|
}
|
|
89
95
|
}
|
|
@@ -102,11 +108,13 @@ export function validateComponentNode(node: unknown): ValidationResult<Component
|
|
|
102
108
|
} catch (error) {
|
|
103
109
|
return {
|
|
104
110
|
valid: false,
|
|
105
|
-
errors: [
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
111
|
+
errors: [
|
|
112
|
+
{
|
|
113
|
+
path: 'root',
|
|
114
|
+
message: error instanceof Error ? error.message : 'Unknown validation error',
|
|
115
|
+
code: 'UNKNOWN',
|
|
116
|
+
},
|
|
117
|
+
],
|
|
110
118
|
};
|
|
111
119
|
}
|
|
112
120
|
}
|
|
@@ -125,11 +133,13 @@ export function validateStructuredComponentDefinition(def: unknown): ValidationR
|
|
|
125
133
|
} catch (error) {
|
|
126
134
|
return {
|
|
127
135
|
valid: false,
|
|
128
|
-
errors: [
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
136
|
+
errors: [
|
|
137
|
+
{
|
|
138
|
+
path: 'root',
|
|
139
|
+
message: error instanceof Error ? error.message : 'Unknown validation error',
|
|
140
|
+
code: 'UNKNOWN',
|
|
141
|
+
},
|
|
142
|
+
],
|
|
133
143
|
};
|
|
134
144
|
}
|
|
135
145
|
}
|
|
@@ -148,11 +158,13 @@ export function validateComponentDefinition(def: unknown): ValidationResult<Comp
|
|
|
148
158
|
} catch (error) {
|
|
149
159
|
return {
|
|
150
160
|
valid: false,
|
|
151
|
-
errors: [
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
161
|
+
errors: [
|
|
162
|
+
{
|
|
163
|
+
path: 'root',
|
|
164
|
+
message: error instanceof Error ? error.message : 'Unknown validation error',
|
|
165
|
+
code: 'UNKNOWN',
|
|
166
|
+
},
|
|
167
|
+
],
|
|
156
168
|
};
|
|
157
169
|
}
|
|
158
170
|
}
|
|
@@ -171,11 +183,13 @@ export function validatePageData(data: unknown): ValidationResult<PageData> {
|
|
|
171
183
|
} catch (error) {
|
|
172
184
|
return {
|
|
173
185
|
valid: false,
|
|
174
|
-
errors: [
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
186
|
+
errors: [
|
|
187
|
+
{
|
|
188
|
+
path: 'root',
|
|
189
|
+
message: error instanceof Error ? error.message : 'Unknown validation error',
|
|
190
|
+
code: 'UNKNOWN',
|
|
191
|
+
},
|
|
192
|
+
],
|
|
179
193
|
};
|
|
180
194
|
}
|
|
181
195
|
}
|
|
@@ -194,11 +208,13 @@ export function validatePageDataWithComponent(data: unknown): ValidationResult<P
|
|
|
194
208
|
} catch (error) {
|
|
195
209
|
return {
|
|
196
210
|
valid: false,
|
|
197
|
-
errors: [
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
211
|
+
errors: [
|
|
212
|
+
{
|
|
213
|
+
path: 'root',
|
|
214
|
+
message: error instanceof Error ? error.message : 'Unknown validation error',
|
|
215
|
+
code: 'UNKNOWN',
|
|
216
|
+
},
|
|
217
|
+
],
|
|
202
218
|
};
|
|
203
219
|
}
|
|
204
220
|
}
|
|
@@ -217,11 +233,13 @@ export function validatePageMetaData(data: unknown): ValidationResult<PageMetaDa
|
|
|
217
233
|
} catch (error) {
|
|
218
234
|
return {
|
|
219
235
|
valid: false,
|
|
220
|
-
errors: [
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
236
|
+
errors: [
|
|
237
|
+
{
|
|
238
|
+
path: 'root',
|
|
239
|
+
message: error instanceof Error ? error.message : 'Unknown validation error',
|
|
240
|
+
code: 'UNKNOWN',
|
|
241
|
+
},
|
|
242
|
+
],
|
|
225
243
|
};
|
|
226
244
|
}
|
|
227
245
|
}
|
|
@@ -230,10 +248,7 @@ export function validatePageMetaData(data: unknown): ValidationResult<PageMetaDa
|
|
|
230
248
|
* Validate with detailed error information using a custom schema
|
|
231
249
|
* @returns ValidationResult with error details on failure
|
|
232
250
|
*/
|
|
233
|
-
export function validateWithDetails<T>(
|
|
234
|
-
data: unknown,
|
|
235
|
-
schema: ZodType<T>
|
|
236
|
-
): ValidationResult<T> {
|
|
251
|
+
export function validateWithDetails<T>(data: unknown, schema: ZodType<T>): ValidationResult<T> {
|
|
237
252
|
try {
|
|
238
253
|
const result = schema.safeParse(data);
|
|
239
254
|
if (result.success) {
|
|
@@ -243,11 +258,13 @@ export function validateWithDetails<T>(
|
|
|
243
258
|
} catch (error) {
|
|
244
259
|
return {
|
|
245
260
|
valid: false,
|
|
246
|
-
errors: [
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
261
|
+
errors: [
|
|
262
|
+
{
|
|
263
|
+
path: 'root',
|
|
264
|
+
message: error instanceof Error ? error.message : 'Unknown validation error',
|
|
265
|
+
code: 'UNKNOWN',
|
|
266
|
+
},
|
|
267
|
+
],
|
|
251
268
|
};
|
|
252
269
|
}
|
|
253
270
|
}
|
|
@@ -270,11 +287,13 @@ export function validateCMSSchema(data: unknown): ValidationResult<CMSSchema> {
|
|
|
270
287
|
} catch (error) {
|
|
271
288
|
return {
|
|
272
289
|
valid: false,
|
|
273
|
-
errors: [
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
290
|
+
errors: [
|
|
291
|
+
{
|
|
292
|
+
path: 'root',
|
|
293
|
+
message: error instanceof Error ? error.message : 'Unknown validation error',
|
|
294
|
+
code: 'UNKNOWN',
|
|
295
|
+
},
|
|
296
|
+
],
|
|
278
297
|
};
|
|
279
298
|
}
|
|
280
299
|
}
|
|
@@ -293,11 +312,13 @@ export function validateCMSItem(data: unknown): ValidationResult<CMSItem> {
|
|
|
293
312
|
} catch (error) {
|
|
294
313
|
return {
|
|
295
314
|
valid: false,
|
|
296
|
-
errors: [
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
315
|
+
errors: [
|
|
316
|
+
{
|
|
317
|
+
path: 'root',
|
|
318
|
+
message: error instanceof Error ? error.message : 'Unknown validation error',
|
|
319
|
+
code: 'UNKNOWN',
|
|
320
|
+
},
|
|
321
|
+
],
|
|
301
322
|
};
|
|
302
323
|
}
|
|
303
324
|
}
|
|
@@ -317,13 +338,13 @@ export function validateCMSDraftItem(data: unknown): ValidationResult<CMSItem> {
|
|
|
317
338
|
} catch (error) {
|
|
318
339
|
return {
|
|
319
340
|
valid: false,
|
|
320
|
-
errors: [
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
341
|
+
errors: [
|
|
342
|
+
{
|
|
343
|
+
path: 'root',
|
|
344
|
+
message: error instanceof Error ? error.message : 'Unknown validation error',
|
|
345
|
+
code: 'UNKNOWN',
|
|
346
|
+
},
|
|
347
|
+
],
|
|
325
348
|
};
|
|
326
349
|
}
|
|
327
350
|
}
|
|
328
|
-
|
|
329
|
-
|
|
@@ -9,11 +9,13 @@ describe('viewport-unit rewrite — user-bug repro path', () => {
|
|
|
9
9
|
// { style: { base: { backgroundColor: "var(--bg)", minHeight: "100vh" } } }
|
|
10
10
|
// Studio collects this into the InteractiveStyles map keyed by the element
|
|
11
11
|
// class, and generateInteractiveCSS emits the CSS that ships to the iframe.
|
|
12
|
-
const interactiveStyles: InteractiveStyles = [
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
const interactiveStyles: InteractiveStyles = [
|
|
13
|
+
{
|
|
14
|
+
prefix: '',
|
|
15
|
+
postfix: '',
|
|
16
|
+
style: { base: { minHeight: '100vh', backgroundColor: 'var(--bg)' } },
|
|
17
|
+
},
|
|
18
|
+
];
|
|
17
19
|
const map = new Map<string, InteractiveStyles>([['c_layout_root', interactiveStyles]]);
|
|
18
20
|
|
|
19
21
|
const css = generateAllInteractiveCSS(map);
|
|
@@ -28,11 +30,13 @@ describe('viewport-unit rewrite — user-bug repro path', () => {
|
|
|
28
30
|
});
|
|
29
31
|
|
|
30
32
|
it('leaves non-vh values in the same rule untouched', () => {
|
|
31
|
-
const interactiveStyles: InteractiveStyles = [
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
const interactiveStyles: InteractiveStyles = [
|
|
34
|
+
{
|
|
35
|
+
prefix: '',
|
|
36
|
+
postfix: '',
|
|
37
|
+
style: { base: { minHeight: '100vh', padding: '24px', color: 'red' } },
|
|
38
|
+
},
|
|
39
|
+
];
|
|
36
40
|
const map = new Map<string, InteractiveStyles>([['c_a', interactiveStyles]]);
|
|
37
41
|
const rewritten = rewriteViewportUnits(generateAllInteractiveCSS(map));
|
|
38
42
|
|
|
@@ -3,47 +3,37 @@ import { rewriteViewportUnits } from './viewportUnits';
|
|
|
3
3
|
|
|
4
4
|
describe('rewriteViewportUnits', () => {
|
|
5
5
|
it('rewrites basic vh values in declarations', () => {
|
|
6
|
-
expect(rewriteViewportUnits('min-height: 100vh;')).toBe(
|
|
7
|
-
'min-height: calc(var(--design-vh, 1vh) * 100);'
|
|
8
|
-
);
|
|
6
|
+
expect(rewriteViewportUnits('min-height: 100vh;')).toBe('min-height: calc(var(--design-vh, 1vh) * 100);');
|
|
9
7
|
});
|
|
10
8
|
|
|
11
9
|
it('rewrites vw values', () => {
|
|
12
|
-
expect(rewriteViewportUnits('width: 50vw;')).toBe(
|
|
13
|
-
'width: calc(var(--design-vw, 1vw) * 50);'
|
|
14
|
-
);
|
|
10
|
+
expect(rewriteViewportUnits('width: 50vw;')).toBe('width: calc(var(--design-vw, 1vw) * 50);');
|
|
15
11
|
});
|
|
16
12
|
|
|
17
13
|
it('handles negative values', () => {
|
|
18
|
-
expect(rewriteViewportUnits('top: -100vh;')).toBe(
|
|
19
|
-
'top: calc(var(--design-vh, 1vh) * -100);'
|
|
20
|
-
);
|
|
14
|
+
expect(rewriteViewportUnits('top: -100vh;')).toBe('top: calc(var(--design-vh, 1vh) * -100);');
|
|
21
15
|
});
|
|
22
16
|
|
|
23
17
|
it('handles decimal values', () => {
|
|
24
|
-
expect(rewriteViewportUnits('height: 33.5vh;')).toBe(
|
|
25
|
-
|
|
26
|
-
);
|
|
27
|
-
expect(rewriteViewportUnits('height: .5vh;')).toBe(
|
|
28
|
-
'height: calc(var(--design-vh, 1vh) * .5);'
|
|
29
|
-
);
|
|
18
|
+
expect(rewriteViewportUnits('height: 33.5vh;')).toBe('height: calc(var(--design-vh, 1vh) * 33.5);');
|
|
19
|
+
expect(rewriteViewportUnits('height: .5vh;')).toBe('height: calc(var(--design-vh, 1vh) * .5);');
|
|
30
20
|
});
|
|
31
21
|
|
|
32
22
|
it('handles small/large/dynamic viewport units', () => {
|
|
33
23
|
expect(rewriteViewportUnits('h: 100svh; w: 100lvw; x: 100dvh;')).toBe(
|
|
34
|
-
'h: calc(var(--design-svh, 1svh) * 100); w: calc(var(--design-lvw, 1lvw) * 100); x: calc(var(--design-dvh, 1dvh) * 100);'
|
|
24
|
+
'h: calc(var(--design-svh, 1svh) * 100); w: calc(var(--design-lvw, 1lvw) * 100); x: calc(var(--design-dvh, 1dvh) * 100);',
|
|
35
25
|
);
|
|
36
26
|
});
|
|
37
27
|
|
|
38
28
|
it('preserves vh inside calc()', () => {
|
|
39
29
|
expect(rewriteViewportUnits('height: calc(100vh - 20px);')).toBe(
|
|
40
|
-
'height: calc(calc(var(--design-vh, 1vh) * 100) - 20px);'
|
|
30
|
+
'height: calc(calc(var(--design-vh, 1vh) * 100) - 20px);',
|
|
41
31
|
);
|
|
42
32
|
});
|
|
43
33
|
|
|
44
34
|
it('rewrites vh inside transform functions', () => {
|
|
45
35
|
expect(rewriteViewportUnits('transform: translateY(-100vh);')).toBe(
|
|
46
|
-
'transform: translateY(calc(var(--design-vh, 1vh) * -100));'
|
|
36
|
+
'transform: translateY(calc(var(--design-vh, 1vh) * -100));',
|
|
47
37
|
);
|
|
48
38
|
});
|
|
49
39
|
|
|
@@ -60,15 +50,28 @@ describe('rewriteViewportUnits', () => {
|
|
|
60
50
|
expect(rewriteViewportUnits('.foo-100vh-bar')).toBe('.foo-100vh-bar');
|
|
61
51
|
});
|
|
62
52
|
|
|
53
|
+
it('preserves arbitrary-value class selectors, rewriting only the value', () => {
|
|
54
|
+
// `.min-h-[100svh]` is the literal class on the element; the `[` before the
|
|
55
|
+
// value blocks the selector rewrite, so the rule still matches and its
|
|
56
|
+
// design-mode viewport pin works (`svh`/`dvh`/arbitrary `vh` all hit this —
|
|
57
|
+
// `100vh` dodged the bug only by mapping to the bracket-free `min-h-screen`).
|
|
58
|
+
expect(rewriteViewportUnits('.min-h-\\[100svh\\] { min-height: 100svh; }')).toBe(
|
|
59
|
+
'.min-h-\\[100svh\\] { min-height: calc(var(--design-svh, 1svh) * 100); }',
|
|
60
|
+
);
|
|
61
|
+
expect(rewriteViewportUnits('.h-\\[50dvh\\] { height: calc(50dvh - 1rem); }')).toBe(
|
|
62
|
+
'.h-\\[50dvh\\] { height: calc(calc(var(--design-dvh, 1dvh) * 50) - 1rem); }',
|
|
63
|
+
);
|
|
64
|
+
});
|
|
65
|
+
|
|
63
66
|
it('does NOT rewrite px / em / rem / % values', () => {
|
|
64
67
|
expect(rewriteViewportUnits('padding: 10px; margin: 1em; height: 50%;')).toBe(
|
|
65
|
-
'padding: 10px; margin: 1em; height: 50%;'
|
|
68
|
+
'padding: 10px; margin: 1em; height: 50%;',
|
|
66
69
|
);
|
|
67
70
|
});
|
|
68
71
|
|
|
69
72
|
it('handles multiple values in one rule', () => {
|
|
70
73
|
expect(rewriteViewportUnits('inset: 10vh 5vw 20vh 5vw;')).toBe(
|
|
71
|
-
'inset: calc(var(--design-vh, 1vh) * 10) calc(var(--design-vw, 1vw) * 5) calc(var(--design-vh, 1vh) * 20) calc(var(--design-vw, 1vw) * 5);'
|
|
74
|
+
'inset: calc(var(--design-vh, 1vh) * 10) calc(var(--design-vw, 1vw) * 5) calc(var(--design-vh, 1vh) * 20) calc(var(--design-vw, 1vw) * 5);',
|
|
72
75
|
);
|
|
73
76
|
});
|
|
74
77
|
|
|
@@ -96,8 +99,6 @@ describe('rewriteViewportUnits', () => {
|
|
|
96
99
|
});
|
|
97
100
|
|
|
98
101
|
it('handles 0vh (zero with unit) without producing invalid output', () => {
|
|
99
|
-
expect(rewriteViewportUnits('top: 0vh;')).toBe(
|
|
100
|
-
'top: calc(var(--design-vh, 1vh) * 0);'
|
|
101
|
-
);
|
|
102
|
+
expect(rewriteViewportUnits('top: 0vh;')).toBe('top: calc(var(--design-vh, 1vh) * 0);');
|
|
102
103
|
});
|
|
103
104
|
});
|
|
@@ -26,11 +26,18 @@
|
|
|
26
26
|
*/
|
|
27
27
|
|
|
28
28
|
// A number (possibly negative, with optional decimal), an optional size keyword
|
|
29
|
-
// (s/l/d), and `vh` or `vw` as a complete token. The negative lookbehind
|
|
30
|
-
//
|
|
31
|
-
//
|
|
32
|
-
//
|
|
33
|
-
|
|
29
|
+
// (s/l/d), and `vh` or `vw` as a complete token. The negative lookbehind rejects
|
|
30
|
+
// matches that sit inside a utility-class identifier, so a class SELECTOR keeps
|
|
31
|
+
// its literal name while only the declaration VALUE is rewritten:
|
|
32
|
+
// - `\w-` covers dash identifiers, e.g. `.mh-100vh`.
|
|
33
|
+
// - `\[` covers arbitrary-value classes, e.g. `.min-h-[100svh]`, where the
|
|
34
|
+
// `100svh` sits right after the `[`. Without this the selector would be
|
|
35
|
+
// rewritten to `.min-h-[calc(...)]` and no longer match the element's
|
|
36
|
+
// `class="min-h-[100svh]"` — the rule (and the design-mode viewport pin it
|
|
37
|
+
// carries) would silently break, so `min-height:100svh` couples to the
|
|
38
|
+
// iframe viewport and a hero blows up to the full design-frame height.
|
|
39
|
+
// (`100vh` dodged this only because it maps to the bracket-free `min-h-screen`.)
|
|
40
|
+
const VIEWPORT_UNIT_RE = /(?<![\w\-[])(-?\d*\.?\d+)(s|l|d)?(vh|vw)\b/g;
|
|
34
41
|
|
|
35
42
|
/**
|
|
36
43
|
* Rewrite viewport-relative lengths inside any CSS-shaped string (full
|
|
@@ -38,6 +38,7 @@ globalAny.DocumentFragment = window.DocumentFragment;
|
|
|
38
38
|
globalAny.KeyboardEvent = window.KeyboardEvent;
|
|
39
39
|
globalAny.MouseEvent = window.MouseEvent;
|
|
40
40
|
globalAny.CustomEvent = window.CustomEvent;
|
|
41
|
+
globalAny.MessageEvent = window.MessageEvent;
|
|
41
42
|
globalAny.Event = window.Event;
|
|
42
43
|
globalAny.getComputedStyle = window.getComputedStyle.bind(window);
|
|
43
44
|
globalAny.requestAnimationFrame = window.requestAnimationFrame.bind(window);
|
|
@@ -46,7 +47,6 @@ globalAny.MutationObserver = window.MutationObserver;
|
|
|
46
47
|
globalAny.ResizeObserver = window.ResizeObserver;
|
|
47
48
|
globalAny.IntersectionObserver = window.IntersectionObserver;
|
|
48
49
|
|
|
49
|
-
|
|
50
50
|
// Export for manual usage if needed
|
|
51
51
|
export function setupDOM() {
|
|
52
52
|
// Already set up on import
|
|
@@ -39,12 +39,12 @@ export function createTypedConsoleSpy(): TypedConsoleSpy {
|
|
|
39
39
|
};
|
|
40
40
|
|
|
41
41
|
const mocks = {
|
|
42
|
-
log: mock((...
|
|
43
|
-
warn: mock((...
|
|
44
|
-
error: mock((...
|
|
45
|
-
info: mock((...
|
|
46
|
-
debug: mock((...
|
|
47
|
-
trace: mock((...
|
|
42
|
+
log: mock((..._args: unknown[]) => {}),
|
|
43
|
+
warn: mock((..._args: unknown[]) => {}),
|
|
44
|
+
error: mock((..._args: unknown[]) => {}),
|
|
45
|
+
info: mock((..._args: unknown[]) => {}),
|
|
46
|
+
debug: mock((..._args: unknown[]) => {}),
|
|
47
|
+
trace: mock((..._args: unknown[]) => {}),
|
|
48
48
|
};
|
|
49
49
|
|
|
50
50
|
// Replace console methods
|
|
@@ -77,7 +77,7 @@ export function createTypedConsoleSpy(): TypedConsoleSpy {
|
|
|
77
77
|
return arg.test(call[i] as string);
|
|
78
78
|
}
|
|
79
79
|
return call[i] === arg;
|
|
80
|
-
})
|
|
80
|
+
}),
|
|
81
81
|
);
|
|
82
82
|
},
|
|
83
83
|
clearCalls: () => {
|
|
@@ -102,9 +102,7 @@ export function suppressConsole(): () => void {
|
|
|
102
102
|
/**
|
|
103
103
|
* Capture console output for specific methods only
|
|
104
104
|
*/
|
|
105
|
-
export function captureConsole(
|
|
106
|
-
methods: ConsoleMethods[]
|
|
107
|
-
): TypedConsoleSpy & { only: ConsoleMethods[] } {
|
|
105
|
+
export function captureConsole(methods: ConsoleMethods[]): TypedConsoleSpy & { only: ConsoleMethods[] } {
|
|
108
106
|
const spy = createTypedConsoleSpy();
|
|
109
107
|
|
|
110
108
|
// Restore methods we don't want to capture
|
|
@@ -112,7 +110,7 @@ export function captureConsole(
|
|
|
112
110
|
for (const method of allMethods) {
|
|
113
111
|
if (!methods.includes(method)) {
|
|
114
112
|
// Restore this method to original
|
|
115
|
-
const
|
|
113
|
+
const _original = {
|
|
116
114
|
log: console.log,
|
|
117
115
|
warn: console.warn,
|
|
118
116
|
error: console.error,
|
|
@@ -187,9 +185,7 @@ export function createPassthroughConsoleSpy(): TypedConsoleSpy {
|
|
|
187
185
|
},
|
|
188
186
|
wasCalledWith: (method: ConsoleMethods, ...args: unknown[]) => {
|
|
189
187
|
const calls = mocks[method] as unknown as { mock: { calls: unknown[][] } };
|
|
190
|
-
return (calls.mock?.calls || []).some((call) =>
|
|
191
|
-
args.every((arg, i) => call[i] === arg)
|
|
192
|
-
);
|
|
188
|
+
return (calls.mock?.calls || []).some((call) => args.every((arg, i) => call[i] === arg));
|
|
193
189
|
},
|
|
194
190
|
clearCalls: () => {
|
|
195
191
|
for (const method of Object.values(mocks)) {
|
|
@@ -59,9 +59,7 @@ export function createMockDOMRect(overrides?: Partial<MockDOMRect>): DOMRect {
|
|
|
59
59
|
|
|
60
60
|
// ========== CSSStyleDeclaration ==========
|
|
61
61
|
|
|
62
|
-
export function createMockCSSStyleDeclaration(
|
|
63
|
-
initial?: Partial<CSSStyleDeclaration>
|
|
64
|
-
): CSSStyleDeclaration {
|
|
62
|
+
export function createMockCSSStyleDeclaration(initial?: Partial<CSSStyleDeclaration>): CSSStyleDeclaration {
|
|
65
63
|
const styles: Record<string, string> = {};
|
|
66
64
|
|
|
67
65
|
// Copy initial values
|
|
@@ -74,7 +72,7 @@ export function createMockCSSStyleDeclaration(
|
|
|
74
72
|
}
|
|
75
73
|
|
|
76
74
|
return new Proxy(styles as unknown as CSSStyleDeclaration, {
|
|
77
|
-
get(
|
|
75
|
+
get(_target, prop: string) {
|
|
78
76
|
if (prop === 'setProperty') {
|
|
79
77
|
return (name: string, value: string) => {
|
|
80
78
|
styles[name] = value;
|
|
@@ -139,12 +137,8 @@ export interface TypedMockHTMLElement {
|
|
|
139
137
|
_eventListeners: Map<string, EventListener[]>;
|
|
140
138
|
}
|
|
141
139
|
|
|
142
|
-
export function createTypedMockHTMLElement(
|
|
143
|
-
|
|
144
|
-
): TypedMockHTMLElement {
|
|
145
|
-
const attributes = new Map<string, string>(
|
|
146
|
-
Object.entries(options.attributes || {})
|
|
147
|
-
);
|
|
140
|
+
export function createTypedMockHTMLElement(options: MockHTMLElementOptions = {}): TypedMockHTMLElement {
|
|
141
|
+
const attributes = new Map<string, string>(Object.entries(options.attributes || {}));
|
|
148
142
|
const eventListeners = new Map<string, EventListener[]>();
|
|
149
143
|
const childNodes: Node[] = [];
|
|
150
144
|
|
|
@@ -185,7 +179,9 @@ export function createTypedMockHTMLElement(
|
|
|
185
179
|
}),
|
|
186
180
|
dispatchEvent: mock((event: Event) => {
|
|
187
181
|
const listeners = eventListeners.get(event.type);
|
|
188
|
-
listeners?.forEach((l) =>
|
|
182
|
+
listeners?.forEach((l) => {
|
|
183
|
+
l(event);
|
|
184
|
+
});
|
|
189
185
|
return true;
|
|
190
186
|
}),
|
|
191
187
|
|
|
@@ -248,9 +244,7 @@ export interface TypedMockLocation {
|
|
|
248
244
|
toString: () => string;
|
|
249
245
|
}
|
|
250
246
|
|
|
251
|
-
export function createTypedMockLocation(
|
|
252
|
-
overrides?: Partial<Location>
|
|
253
|
-
): TypedMockLocation {
|
|
247
|
+
export function createTypedMockLocation(overrides?: Partial<Location>): TypedMockLocation {
|
|
254
248
|
const base = {
|
|
255
249
|
href: 'http://localhost/',
|
|
256
250
|
pathname: '/',
|
|
@@ -333,9 +327,7 @@ export interface TypedMockWindow {
|
|
|
333
327
|
_eventListeners: Map<string, EventListener[]>;
|
|
334
328
|
}
|
|
335
329
|
|
|
336
|
-
export function createTypedMockWindow(
|
|
337
|
-
options: MockWindowOptions = {}
|
|
338
|
-
): TypedMockWindow {
|
|
330
|
+
export function createTypedMockWindow(options: MockWindowOptions = {}): TypedMockWindow {
|
|
339
331
|
const eventListeners = new Map<string, EventListener[]>();
|
|
340
332
|
const location = createTypedMockLocation(options.location);
|
|
341
333
|
const history = createTypedMockHistory();
|
|
@@ -361,7 +353,9 @@ export function createTypedMockWindow(
|
|
|
361
353
|
}),
|
|
362
354
|
dispatchEvent: mock((event: Event) => {
|
|
363
355
|
const listeners = eventListeners.get(event.type);
|
|
364
|
-
listeners?.forEach((l) =>
|
|
356
|
+
listeners?.forEach((l) => {
|
|
357
|
+
l(event);
|
|
358
|
+
});
|
|
365
359
|
return true;
|
|
366
360
|
}),
|
|
367
361
|
|
|
@@ -400,9 +394,7 @@ export interface TypedMockDocument {
|
|
|
400
394
|
_eventListeners: Map<string, EventListener[]>;
|
|
401
395
|
}
|
|
402
396
|
|
|
403
|
-
export function createTypedMockDocument(
|
|
404
|
-
options: MockDocumentOptions = {}
|
|
405
|
-
): TypedMockDocument {
|
|
397
|
+
export function createTypedMockDocument(options: MockDocumentOptions = {}): TypedMockDocument {
|
|
406
398
|
const registeredElements = new Map<string, TypedMockHTMLElement>();
|
|
407
399
|
const createdElements: TypedMockHTMLElement[] = [];
|
|
408
400
|
const eventListeners = new Map<string, EventListener[]>();
|
|
@@ -439,7 +431,9 @@ export function createTypedMockDocument(
|
|
|
439
431
|
}),
|
|
440
432
|
dispatchEvent: mock((event: Event) => {
|
|
441
433
|
const listeners = eventListeners.get(event.type);
|
|
442
|
-
listeners?.forEach((l) =>
|
|
434
|
+
listeners?.forEach((l) => {
|
|
435
|
+
l(event);
|
|
436
|
+
});
|
|
443
437
|
return true;
|
|
444
438
|
}),
|
|
445
439
|
|
|
@@ -465,7 +459,7 @@ export interface DomMockInstallation {
|
|
|
465
459
|
* Install mock DOM globally and return cleanup function
|
|
466
460
|
*/
|
|
467
461
|
export function installMockDom(
|
|
468
|
-
options: { window?: MockWindowOptions; document?: MockDocumentOptions } = {}
|
|
462
|
+
options: { window?: MockWindowOptions; document?: MockDocumentOptions } = {},
|
|
469
463
|
): DomMockInstallation {
|
|
470
464
|
const originalWindow = (globalThis as any).window;
|
|
471
465
|
const originalDocument = (globalThis as any).document;
|