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,61 +1,59 @@
|
|
|
1
|
-
import { test, expect, describe } from
|
|
2
|
-
import { normalizeOrphanTemplateProps } from
|
|
3
|
-
import type { ComponentDefinition } from
|
|
1
|
+
import { test, expect, describe } from 'bun:test';
|
|
2
|
+
import { normalizeOrphanTemplateProps } from './normalizeOrphanTemplateProps';
|
|
3
|
+
import type { ComponentDefinition } from '../../shared/types';
|
|
4
4
|
|
|
5
|
-
describe(
|
|
5
|
+
describe('normalizeOrphanTemplateProps', () => {
|
|
6
6
|
test("lifts an orphan {{x}} onto the component's interface as a string default", () => {
|
|
7
7
|
const components: Record<string, ComponentDefinition> = {
|
|
8
8
|
ArrowLink: {
|
|
9
9
|
component: {
|
|
10
10
|
interface: {},
|
|
11
11
|
structure: {
|
|
12
|
-
type:
|
|
13
|
-
tag:
|
|
14
|
-
children: [
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
}
|
|
12
|
+
type: 'node',
|
|
13
|
+
tag: 'span',
|
|
14
|
+
children: ['{{ctaText}}'],
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
18
|
};
|
|
19
19
|
|
|
20
20
|
const out = normalizeOrphanTemplateProps(components);
|
|
21
|
-
const arrowIface = out.ArrowLink
|
|
21
|
+
const arrowIface = out.ArrowLink!.component!.interface!;
|
|
22
22
|
expect(arrowIface.ctaText).toBeDefined();
|
|
23
|
-
expect((arrowIface.ctaText as any).type).toBe(
|
|
24
|
-
expect((arrowIface.ctaText as any).default).toBe(
|
|
23
|
+
expect((arrowIface.ctaText as any).type).toBe('string');
|
|
24
|
+
expect((arrowIface.ctaText as any).default).toBe('');
|
|
25
25
|
});
|
|
26
26
|
|
|
27
|
-
test(
|
|
27
|
+
test('forwards lifted props on an instance ref when the host declares the prop', () => {
|
|
28
28
|
const components: Record<string, ComponentDefinition> = {
|
|
29
29
|
ArrowLink: {
|
|
30
30
|
component: {
|
|
31
31
|
interface: {},
|
|
32
32
|
structure: {
|
|
33
|
-
type:
|
|
34
|
-
tag:
|
|
35
|
-
children: [
|
|
36
|
-
}
|
|
37
|
-
}
|
|
33
|
+
type: 'node',
|
|
34
|
+
tag: 'span',
|
|
35
|
+
children: ['{{ctaText}}'],
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
38
|
},
|
|
39
39
|
Card: {
|
|
40
40
|
component: {
|
|
41
41
|
interface: {
|
|
42
|
-
ctaText: { type:
|
|
42
|
+
ctaText: { type: 'string', default: 'Click' } as any,
|
|
43
43
|
},
|
|
44
44
|
structure: {
|
|
45
|
-
type:
|
|
46
|
-
tag:
|
|
47
|
-
children: [
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
}
|
|
45
|
+
type: 'node',
|
|
46
|
+
tag: 'div',
|
|
47
|
+
children: [{ type: 'component', component: 'ArrowLink' } as any],
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
},
|
|
53
51
|
};
|
|
54
52
|
|
|
55
53
|
const out = normalizeOrphanTemplateProps(components);
|
|
56
|
-
const cardChildren = (out.Card
|
|
54
|
+
const cardChildren = (out.Card!.component!.structure as any).children;
|
|
57
55
|
expect(cardChildren[0].props).toBeDefined();
|
|
58
|
-
expect(cardChildren[0].props.ctaText).toBe(
|
|
56
|
+
expect(cardChildren[0].props.ctaText).toBe('{{ctaText}}');
|
|
59
57
|
});
|
|
60
58
|
|
|
61
59
|
test("does NOT forward when the host doesn't declare the same prop", () => {
|
|
@@ -63,202 +61,200 @@ describe("normalizeOrphanTemplateProps", () => {
|
|
|
63
61
|
ArrowLink: {
|
|
64
62
|
component: {
|
|
65
63
|
interface: {},
|
|
66
|
-
structure: { type:
|
|
67
|
-
}
|
|
64
|
+
structure: { type: 'node', tag: 'span', children: ['{{ctaText}}'] },
|
|
65
|
+
},
|
|
68
66
|
},
|
|
69
67
|
// Page-level wrapper that doesn't know about ctaText.
|
|
70
68
|
Wrapper: {
|
|
71
69
|
component: {
|
|
72
70
|
interface: {},
|
|
73
71
|
structure: {
|
|
74
|
-
type:
|
|
75
|
-
tag:
|
|
76
|
-
children: [{ type:
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
72
|
+
type: 'node',
|
|
73
|
+
tag: 'div',
|
|
74
|
+
children: [{ type: 'component', component: 'ArrowLink' } as any],
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
},
|
|
80
78
|
};
|
|
81
79
|
|
|
82
80
|
const out = normalizeOrphanTemplateProps(components);
|
|
83
|
-
const wrapperChildren = (out.Wrapper
|
|
81
|
+
const wrapperChildren = (out.Wrapper!.component!.structure as any).children;
|
|
84
82
|
// No forward — would have made Wrapper produce a new orphan ref.
|
|
85
83
|
expect(wrapperChildren[0].props).toBeUndefined();
|
|
86
84
|
});
|
|
87
85
|
|
|
88
|
-
test(
|
|
86
|
+
test('does not override an instance prop the host already passes', () => {
|
|
89
87
|
const components: Record<string, ComponentDefinition> = {
|
|
90
88
|
ArrowLink: {
|
|
91
89
|
component: {
|
|
92
90
|
interface: {},
|
|
93
|
-
structure: { type:
|
|
94
|
-
}
|
|
91
|
+
structure: { type: 'node', tag: 'span', children: ['{{ctaText}}'] },
|
|
92
|
+
},
|
|
95
93
|
},
|
|
96
94
|
Card: {
|
|
97
95
|
component: {
|
|
98
96
|
interface: {
|
|
99
|
-
ctaText: { type:
|
|
97
|
+
ctaText: { type: 'string', default: 'Click' } as any,
|
|
100
98
|
},
|
|
101
99
|
structure: {
|
|
102
|
-
type:
|
|
103
|
-
tag:
|
|
100
|
+
type: 'node',
|
|
101
|
+
tag: 'div',
|
|
104
102
|
children: [
|
|
105
103
|
{
|
|
106
|
-
type:
|
|
107
|
-
component:
|
|
108
|
-
props: { ctaText:
|
|
109
|
-
} as any
|
|
110
|
-
]
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
104
|
+
type: 'component',
|
|
105
|
+
component: 'ArrowLink',
|
|
106
|
+
props: { ctaText: 'Explicit value' },
|
|
107
|
+
} as any,
|
|
108
|
+
],
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
},
|
|
114
112
|
};
|
|
115
113
|
|
|
116
114
|
const out = normalizeOrphanTemplateProps(components);
|
|
117
|
-
const cardChildren = (out.Card
|
|
118
|
-
expect(cardChildren[0].props.ctaText).toBe(
|
|
115
|
+
const cardChildren = (out.Card!.component!.structure as any).children;
|
|
116
|
+
expect(cardChildren[0].props.ctaText).toBe('Explicit value');
|
|
119
117
|
});
|
|
120
118
|
|
|
121
|
-
test(
|
|
119
|
+
test('ignores cms.*, item.*, page.* refs (already namespaced)', () => {
|
|
122
120
|
const components: Record<string, ComponentDefinition> = {
|
|
123
121
|
Title: {
|
|
124
122
|
component: {
|
|
125
123
|
interface: {},
|
|
126
124
|
structure: {
|
|
127
|
-
type:
|
|
128
|
-
tag:
|
|
129
|
-
children: [
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
125
|
+
type: 'node',
|
|
126
|
+
tag: 'h1',
|
|
127
|
+
children: ['{{cms.title}} - {{page.slug}}'],
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
},
|
|
133
131
|
};
|
|
134
132
|
|
|
135
133
|
const out = normalizeOrphanTemplateProps(components);
|
|
136
|
-
expect(Object.keys(out.Title
|
|
134
|
+
expect(Object.keys(out.Title!.component!.interface!)).toHaveLength(0);
|
|
137
135
|
});
|
|
138
136
|
|
|
139
|
-
test(
|
|
137
|
+
test('ignores list loop variables', () => {
|
|
140
138
|
const components: Record<string, ComponentDefinition> = {
|
|
141
139
|
List: {
|
|
142
140
|
component: {
|
|
143
141
|
interface: {
|
|
144
|
-
items: { type:
|
|
142
|
+
items: { type: 'list', default: [], itemSchema: {} } as any,
|
|
145
143
|
},
|
|
146
144
|
structure: {
|
|
147
|
-
type:
|
|
148
|
-
sourceType:
|
|
149
|
-
source:
|
|
150
|
-
itemAs:
|
|
151
|
-
children: [
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
}
|
|
156
|
-
}
|
|
145
|
+
type: 'list',
|
|
146
|
+
sourceType: 'prop',
|
|
147
|
+
source: 'items',
|
|
148
|
+
itemAs: 'row',
|
|
149
|
+
children: [{ type: 'node', tag: 'div', children: ['{{row.label}}'] }],
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
},
|
|
157
153
|
};
|
|
158
154
|
|
|
159
155
|
const out = normalizeOrphanTemplateProps(components);
|
|
160
156
|
// `row` is the loop var — must NOT be auto-lifted as a string prop.
|
|
161
|
-
expect((out.List
|
|
157
|
+
expect((out.List!.component!.interface as any).row).toBeUndefined();
|
|
162
158
|
});
|
|
163
159
|
|
|
164
|
-
test(
|
|
160
|
+
test('ignores expressions with operators (not a bare ident)', () => {
|
|
165
161
|
const components: Record<string, ComponentDefinition> = {
|
|
166
162
|
Cmp: {
|
|
167
163
|
component: {
|
|
168
164
|
interface: {},
|
|
169
165
|
structure: {
|
|
170
|
-
type:
|
|
171
|
-
tag:
|
|
172
|
-
children: [
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
}
|
|
166
|
+
type: 'node',
|
|
167
|
+
tag: 'div',
|
|
168
|
+
children: ['{{a + b}} {{x ? y : z}}'],
|
|
169
|
+
},
|
|
170
|
+
},
|
|
171
|
+
},
|
|
176
172
|
};
|
|
177
173
|
|
|
178
174
|
const out = normalizeOrphanTemplateProps(components);
|
|
179
175
|
// Don't lift `a`, `b`, `x`, `y`, `z` from compound expressions — too
|
|
180
176
|
// risky to guess types or what's actually intended.
|
|
181
|
-
expect(Object.keys(out.Cmp
|
|
177
|
+
expect(Object.keys(out.Cmp!.component!.interface!)).toHaveLength(0);
|
|
182
178
|
});
|
|
183
179
|
|
|
184
|
-
test(
|
|
180
|
+
test('does not mutate the input component definitions', () => {
|
|
185
181
|
const components: Record<string, ComponentDefinition> = {
|
|
186
182
|
ArrowLink: {
|
|
187
183
|
component: {
|
|
188
184
|
interface: {},
|
|
189
|
-
structure: { type:
|
|
190
|
-
}
|
|
191
|
-
}
|
|
185
|
+
structure: { type: 'node', tag: 'span', children: ['{{ctaText}}'] },
|
|
186
|
+
},
|
|
187
|
+
},
|
|
192
188
|
};
|
|
193
189
|
const before = JSON.stringify(components);
|
|
194
190
|
normalizeOrphanTemplateProps(components);
|
|
195
191
|
expect(JSON.stringify(components)).toBe(before);
|
|
196
192
|
});
|
|
197
193
|
|
|
198
|
-
test(
|
|
194
|
+
test('lifts a prop ref from a style _mapping object', () => {
|
|
199
195
|
const components: Record<string, ComponentDefinition> = {
|
|
200
196
|
Cmp: {
|
|
201
197
|
component: {
|
|
202
198
|
interface: {},
|
|
203
199
|
structure: {
|
|
204
|
-
type:
|
|
205
|
-
tag:
|
|
200
|
+
type: 'node',
|
|
201
|
+
tag: 'div',
|
|
206
202
|
style: {
|
|
207
203
|
base: {
|
|
208
204
|
color: {
|
|
209
205
|
_mapping: true,
|
|
210
|
-
prop:
|
|
211
|
-
values: { default:
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
} as any
|
|
216
|
-
}
|
|
217
|
-
}
|
|
206
|
+
prop: 'variant',
|
|
207
|
+
values: { default: 'black', featured: 'white' },
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
},
|
|
211
|
+
} as any,
|
|
212
|
+
},
|
|
213
|
+
},
|
|
218
214
|
};
|
|
219
215
|
|
|
220
216
|
const out = normalizeOrphanTemplateProps(components);
|
|
221
|
-
expect((out.Cmp
|
|
222
|
-
expect((out.Cmp
|
|
217
|
+
expect((out.Cmp!.component!.interface as any).variant).toBeDefined();
|
|
218
|
+
expect((out.Cmp!.component!.interface as any).variant.type).toBe('string');
|
|
223
219
|
});
|
|
224
220
|
|
|
225
|
-
test(
|
|
221
|
+
test('lifts a prop ref from an if boolean mapping', () => {
|
|
226
222
|
const components: Record<string, ComponentDefinition> = {
|
|
227
223
|
Cmp: {
|
|
228
224
|
component: {
|
|
229
225
|
interface: {},
|
|
230
226
|
structure: {
|
|
231
|
-
type:
|
|
232
|
-
tag:
|
|
227
|
+
type: 'node',
|
|
228
|
+
tag: 'span',
|
|
233
229
|
if: {
|
|
234
230
|
_mapping: true,
|
|
235
|
-
prop:
|
|
236
|
-
values: { true: true, false: false }
|
|
237
|
-
}
|
|
238
|
-
} as any
|
|
239
|
-
}
|
|
240
|
-
}
|
|
231
|
+
prop: 'showBadge',
|
|
232
|
+
values: { true: true, false: false },
|
|
233
|
+
},
|
|
234
|
+
} as any,
|
|
235
|
+
},
|
|
236
|
+
},
|
|
241
237
|
};
|
|
242
238
|
|
|
243
239
|
const out = normalizeOrphanTemplateProps(components);
|
|
244
|
-
expect((out.Cmp
|
|
240
|
+
expect((out.Cmp!.component!.interface as any).showBadge).toBeDefined();
|
|
245
241
|
});
|
|
246
242
|
|
|
247
|
-
test(
|
|
243
|
+
test('dotted ref {{link.href}} lifts the base name', () => {
|
|
248
244
|
const components: Record<string, ComponentDefinition> = {
|
|
249
245
|
Anchor: {
|
|
250
246
|
component: {
|
|
251
247
|
interface: {},
|
|
252
248
|
structure: {
|
|
253
|
-
type:
|
|
254
|
-
tag:
|
|
255
|
-
attributes: { href:
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
}
|
|
249
|
+
type: 'node',
|
|
250
|
+
tag: 'a',
|
|
251
|
+
attributes: { href: '{{link.href}}' },
|
|
252
|
+
},
|
|
253
|
+
},
|
|
254
|
+
},
|
|
259
255
|
};
|
|
260
256
|
|
|
261
257
|
const out = normalizeOrphanTemplateProps(components);
|
|
262
|
-
expect((out.Anchor
|
|
258
|
+
expect((out.Anchor!.component!.interface as any).link).toBeDefined();
|
|
263
259
|
});
|
|
264
260
|
});
|
|
@@ -35,17 +35,9 @@ import type { ComponentDefinition, PropDefinition } from '../../shared/types';
|
|
|
35
35
|
const BARE_IDENT_BODY = /^\s*([a-zA-Z_$][a-zA-Z0-9_$]*)(?:\s*\.\s*[a-zA-Z_$][a-zA-Z0-9_$]*)*\s*$/;
|
|
36
36
|
|
|
37
37
|
// Namespaces and meta-vars that are never component-instance props.
|
|
38
|
-
const RESERVED_BASES = new Set([
|
|
39
|
-
'cms', 'item', 'page',
|
|
40
|
-
'itemIndex', 'itemFirst', 'itemLast',
|
|
41
|
-
]);
|
|
38
|
+
const RESERVED_BASES = new Set(['cms', 'item', 'page', 'itemIndex', 'itemFirst', 'itemLast']);
|
|
42
39
|
|
|
43
|
-
function recordRef(
|
|
44
|
-
base: string,
|
|
45
|
-
declared: Set<string>,
|
|
46
|
-
listVars: Set<string>,
|
|
47
|
-
out: Set<string>
|
|
48
|
-
): void {
|
|
40
|
+
function recordRef(base: string, declared: Set<string>, listVars: Set<string>, out: Set<string>): void {
|
|
49
41
|
if (RESERVED_BASES.has(base)) return;
|
|
50
42
|
if (listVars.has(base)) return;
|
|
51
43
|
if (declared.has(base)) return;
|
|
@@ -56,12 +48,13 @@ function findOrphanRefs(value: unknown, declared: Set<string>, listVars: Set<str
|
|
|
56
48
|
if (value == null) return;
|
|
57
49
|
if (typeof value === 'string') {
|
|
58
50
|
const re = /\{\{([^}]+)\}\}/g;
|
|
59
|
-
let m: RegExpExecArray | null;
|
|
60
|
-
while (
|
|
61
|
-
const body = m[1];
|
|
51
|
+
let m: RegExpExecArray | null = re.exec(value);
|
|
52
|
+
while (m !== null) {
|
|
53
|
+
const body = m[1] ?? '';
|
|
54
|
+
m = re.exec(value);
|
|
62
55
|
const idMatch = body.match(BARE_IDENT_BODY);
|
|
63
56
|
if (!idMatch) continue; // expressions, operators, calls — skip
|
|
64
|
-
recordRef(idMatch[1], declared, listVars, out);
|
|
57
|
+
recordRef(idMatch[1] ?? '', declared, listVars, out);
|
|
65
58
|
}
|
|
66
59
|
return;
|
|
67
60
|
}
|
|
@@ -111,7 +104,7 @@ function findOrphanRefs(value: unknown, declared: Set<string>, listVars: Set<str
|
|
|
111
104
|
function forwardLiftedPropsOnInstances(
|
|
112
105
|
structure: unknown,
|
|
113
106
|
hostProps: Set<string>,
|
|
114
|
-
liftedByComp: ReadonlyMap<string, ReadonlySet<string
|
|
107
|
+
liftedByComp: ReadonlyMap<string, ReadonlySet<string>>,
|
|
115
108
|
): void {
|
|
116
109
|
if (structure == null || typeof structure !== 'object') return;
|
|
117
110
|
if (Array.isArray(structure)) {
|
|
@@ -143,7 +136,7 @@ function forwardLiftedPropsOnInstances(
|
|
|
143
136
|
* The input map is not mutated.
|
|
144
137
|
*/
|
|
145
138
|
export function normalizeOrphanTemplateProps(
|
|
146
|
-
components: Record<string, ComponentDefinition
|
|
139
|
+
components: Record<string, ComponentDefinition>,
|
|
147
140
|
): Record<string, ComponentDefinition> {
|
|
148
141
|
const next: Record<string, ComponentDefinition> = {};
|
|
149
142
|
const liftedByComp = new Map<string, Set<string>>();
|
|
@@ -156,7 +149,7 @@ export function normalizeOrphanTemplateProps(
|
|
|
156
149
|
next[name] = cloned;
|
|
157
150
|
|
|
158
151
|
const comp = cloned.component;
|
|
159
|
-
if (!comp
|
|
152
|
+
if (!comp?.structure) continue;
|
|
160
153
|
const iface = (comp.interface ?? {}) as Record<string, PropDefinition>;
|
|
161
154
|
const declared = new Set(Object.keys(iface));
|
|
162
155
|
const orphans = new Set<string>();
|
|
@@ -175,7 +168,7 @@ export function normalizeOrphanTemplateProps(
|
|
|
175
168
|
// same prop. Mutates the cloned structures in `next`.
|
|
176
169
|
for (const [, hostDef] of Object.entries(next)) {
|
|
177
170
|
const comp = hostDef.component;
|
|
178
|
-
if (!comp
|
|
171
|
+
if (!comp?.structure) continue;
|
|
179
172
|
const hostProps = new Set(Object.keys(comp.interface ?? {}));
|
|
180
173
|
forwardLiftedPropsOnInstances(comp.structure, hostProps, liftedByComp);
|
|
181
174
|
}
|
|
@@ -198,9 +198,7 @@ export function emitAstroPage(options: PageEmitOptions): string {
|
|
|
198
198
|
}
|
|
199
199
|
|
|
200
200
|
// Build script paths array
|
|
201
|
-
const scriptsArrayLiteral = scriptPaths.length > 0
|
|
202
|
-
? `[${scriptPaths.map((s) => `"${s}"`).join(', ')}]`
|
|
203
|
-
: '[]';
|
|
201
|
+
const scriptsArrayLiteral = scriptPaths.length > 0 ? `[${scriptPaths.map((s) => `"${s}"`).join(', ')}]` : '[]';
|
|
204
202
|
|
|
205
203
|
// Build library tags literal
|
|
206
204
|
const libraryTagsLiteral = `{ headCSS: \`${escapeTemplateLiteral(libraryTags.headCSS || '')}\`, headJS: \`${escapeTemplateLiteral(libraryTags.headJS || '')}\`, bodyEndJS: \`${escapeTemplateLiteral(libraryTags.bodyEndJS || '')}\` }`;
|
|
@@ -209,14 +207,14 @@ export function emitAstroPage(options: PageEmitOptions): string {
|
|
|
209
207
|
const escapedFontPreloads = escapeTemplateLiteral(fontPreloads);
|
|
210
208
|
|
|
211
209
|
// Collect frontmatter lines from list emission (e.g., getCollection calls)
|
|
212
|
-
const extraFrontmatter =
|
|
213
|
-
?
|
|
214
|
-
: '';
|
|
210
|
+
const extraFrontmatter =
|
|
211
|
+
ctx.frontmatterLines && ctx.frontmatterLines.length > 0 ? `\n${ctx.frontmatterLines.join('\n')}` : '';
|
|
215
212
|
|
|
216
213
|
// Generate interactive style block for page-level interactive styles
|
|
217
|
-
const interactiveStyleSection =
|
|
218
|
-
|
|
219
|
-
|
|
214
|
+
const interactiveStyleSection =
|
|
215
|
+
ctx.collectedInteractiveStyles!.size > 0
|
|
216
|
+
? `\n<style is:global>\n${generateAllInteractiveCSS(ctx.collectedInteractiveStyles!, breakpoints, remConfig, responsiveScales)}\n</style>\n`
|
|
217
|
+
: '';
|
|
220
218
|
|
|
221
219
|
return `---
|
|
222
220
|
${importLines.join('\n')}${extraFrontmatter}
|
|
@@ -247,13 +245,11 @@ function buildEmptyPage(
|
|
|
247
245
|
theme: string,
|
|
248
246
|
fontPreloads: string,
|
|
249
247
|
libraryTags: { headCSS?: string; headJS?: string; bodyEndJS?: string },
|
|
250
|
-
scriptPaths: string[]
|
|
248
|
+
scriptPaths: string[],
|
|
251
249
|
): string {
|
|
252
250
|
const escapedMeta = escapeTemplateLiteral(meta);
|
|
253
251
|
const escapedFontPreloads = escapeTemplateLiteral(fontPreloads);
|
|
254
|
-
const scriptsArrayLiteral = scriptPaths.length > 0
|
|
255
|
-
? `[${scriptPaths.map((s) => `"${s}"`).join(', ')}]`
|
|
256
|
-
: '[]';
|
|
252
|
+
const scriptsArrayLiteral = scriptPaths.length > 0 ? `[${scriptPaths.map((s) => `"${s}"`).join(', ')}]` : '[]';
|
|
257
253
|
const libraryTagsLiteral = `{ headCSS: \`${escapeTemplateLiteral(libraryTags.headCSS || '')}\`, headJS: \`${escapeTemplateLiteral(libraryTags.headJS || '')}\`, bodyEndJS: \`${escapeTemplateLiteral(libraryTags.bodyEndJS || '')}\` }`;
|
|
258
254
|
|
|
259
255
|
return `---
|
|
@@ -23,24 +23,16 @@ const scalesDisabled: ResponsiveScales = {
|
|
|
23
23
|
|
|
24
24
|
describe('responsiveStylesToTailwind — auto-responsive scaling', () => {
|
|
25
25
|
test('emits scaled max-[Npx]: variants for base scalable property', () => {
|
|
26
|
-
const { classes } = responsiveStylesToTailwind(
|
|
27
|
-
{ base: { padding: '40px' } },
|
|
28
|
-
DEFAULT_BREAKPOINTS,
|
|
29
|
-
scalesEnabled
|
|
30
|
-
);
|
|
26
|
+
const { classes } = responsiveStylesToTailwind({ base: { padding: '40px' } }, DEFAULT_BREAKPOINTS, scalesEnabled);
|
|
31
27
|
// base: 40px; tablet: 40 + (40-16)*(0.75-1) = 34px; mobile: 40 + (40-16)*(0.5-1) = 28px
|
|
32
|
-
expect(classes).toEqual([
|
|
33
|
-
'p-[40px]',
|
|
34
|
-
'max-[1024px]:p-[34px]',
|
|
35
|
-
'max-[540px]:p-[28px]',
|
|
36
|
-
]);
|
|
28
|
+
expect(classes).toEqual(['p-[40px]', 'max-[1024px]:p-[34px]', 'max-[540px]:p-[28px]']);
|
|
37
29
|
});
|
|
38
30
|
|
|
39
31
|
test('explicit breakpoint override wins — no auto-scaled variant for that breakpoint/property pair', () => {
|
|
40
32
|
const { classes } = responsiveStylesToTailwind(
|
|
41
33
|
{ base: { padding: '40px' }, tablet: { padding: '30px' } },
|
|
42
34
|
DEFAULT_BREAKPOINTS,
|
|
43
|
-
scalesEnabled
|
|
35
|
+
scalesEnabled,
|
|
44
36
|
);
|
|
45
37
|
expect(classes).toContain('p-[40px]');
|
|
46
38
|
expect(classes).toContain('max-[1024px]:p-[30px]');
|
|
@@ -51,15 +43,8 @@ describe('responsiveStylesToTailwind — auto-responsive scaling', () => {
|
|
|
51
43
|
});
|
|
52
44
|
|
|
53
45
|
test('scaling disabled → output identical to no-scaling path', () => {
|
|
54
|
-
const withScales = responsiveStylesToTailwind(
|
|
55
|
-
|
|
56
|
-
DEFAULT_BREAKPOINTS,
|
|
57
|
-
scalesDisabled
|
|
58
|
-
);
|
|
59
|
-
const withoutScales = responsiveStylesToTailwind(
|
|
60
|
-
{ base: { padding: '40px' } },
|
|
61
|
-
DEFAULT_BREAKPOINTS
|
|
62
|
-
);
|
|
46
|
+
const withScales = responsiveStylesToTailwind({ base: { padding: '40px' } }, DEFAULT_BREAKPOINTS, scalesDisabled);
|
|
47
|
+
const withoutScales = responsiveStylesToTailwind({ base: { padding: '40px' } }, DEFAULT_BREAKPOINTS);
|
|
63
48
|
expect(withScales.classes).toEqual(withoutScales.classes);
|
|
64
49
|
expect(withScales.classes).toEqual(['p-[40px]']);
|
|
65
50
|
});
|
|
@@ -68,17 +53,13 @@ describe('responsiveStylesToTailwind — auto-responsive scaling', () => {
|
|
|
68
53
|
const { classes } = responsiveStylesToTailwind(
|
|
69
54
|
{ base: { padding: '8px' } }, // 8 < 16 → stays unchanged → skipped
|
|
70
55
|
DEFAULT_BREAKPOINTS,
|
|
71
|
-
scalesEnabled
|
|
56
|
+
scalesEnabled,
|
|
72
57
|
);
|
|
73
58
|
expect(classes).toEqual(['p-[8px]']);
|
|
74
59
|
});
|
|
75
60
|
|
|
76
61
|
test('non-scalable property (e.g. color) is left untouched', () => {
|
|
77
|
-
const { classes } = responsiveStylesToTailwind(
|
|
78
|
-
{ base: { color: '#abc' } },
|
|
79
|
-
DEFAULT_BREAKPOINTS,
|
|
80
|
-
scalesEnabled
|
|
81
|
-
);
|
|
62
|
+
const { classes } = responsiveStylesToTailwind({ base: { color: '#abc' } }, DEFAULT_BREAKPOINTS, scalesEnabled);
|
|
82
63
|
// Just the base color class — no max-[Npx] prefix because color isn't in any scale category
|
|
83
64
|
expect(classes.filter((c) => c.startsWith('max-['))).toEqual([]);
|
|
84
65
|
});
|
|
@@ -87,7 +68,7 @@ describe('responsiveStylesToTailwind — auto-responsive scaling', () => {
|
|
|
87
68
|
const { classes } = responsiveStylesToTailwind(
|
|
88
69
|
{ base: { padding: '40px 80px' } },
|
|
89
70
|
DEFAULT_BREAKPOINTS,
|
|
90
|
-
scalesEnabled
|
|
71
|
+
scalesEnabled,
|
|
91
72
|
);
|
|
92
73
|
// tablet: 40→34, 80→64; mobile: 40→28, 80→48
|
|
93
74
|
expect(classes).toContain('max-[1024px]:p-[34px_64px]');
|
|
@@ -95,22 +76,14 @@ describe('responsiveStylesToTailwind — auto-responsive scaling', () => {
|
|
|
95
76
|
});
|
|
96
77
|
|
|
97
78
|
test('flat style object (no `base`) gets no auto-scaling', () => {
|
|
98
|
-
const { classes } = responsiveStylesToTailwind(
|
|
99
|
-
{ padding: '40px' },
|
|
100
|
-
DEFAULT_BREAKPOINTS,
|
|
101
|
-
scalesEnabled
|
|
102
|
-
);
|
|
79
|
+
const { classes } = responsiveStylesToTailwind({ padding: '40px' }, DEFAULT_BREAKPOINTS, scalesEnabled);
|
|
103
80
|
// A flat style is treated as base with no breakpoints — nothing to
|
|
104
81
|
// auto-scale *into*. The scaling pass only runs on the responsive branch.
|
|
105
82
|
expect(classes.filter((c) => c.startsWith('max-['))).toEqual([]);
|
|
106
83
|
});
|
|
107
84
|
|
|
108
85
|
test('fontSize scales using the fontSize category', () => {
|
|
109
|
-
const { classes } = responsiveStylesToTailwind(
|
|
110
|
-
{ base: { fontSize: '100px' } },
|
|
111
|
-
DEFAULT_BREAKPOINTS,
|
|
112
|
-
scalesEnabled
|
|
113
|
-
);
|
|
86
|
+
const { classes } = responsiveStylesToTailwind({ base: { fontSize: '100px' } }, DEFAULT_BREAKPOINTS, scalesEnabled);
|
|
114
87
|
// tablet: 100 + (100-16)*(0.88-1) = 100 - 10.08 = round(89.92) = 90
|
|
115
88
|
// mobile: 100 + (100-16)*(0.75-1) = 100 - 21 = 79
|
|
116
89
|
expect(classes).toContain('max-[1024px]:text-[length:90px]');
|