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
|
@@ -9,7 +9,9 @@ import { createTestServer, fetch, TEST_PAGE_JSON } from './test-helpers';
|
|
|
9
9
|
// Track servers for cleanup
|
|
10
10
|
const servers: Array<{ cleanup: () => void }> = [];
|
|
11
11
|
afterAll(() => {
|
|
12
|
-
servers.forEach(s =>
|
|
12
|
+
servers.forEach((s) => {
|
|
13
|
+
s.cleanup();
|
|
14
|
+
});
|
|
13
15
|
});
|
|
14
16
|
|
|
15
17
|
describe('Server Lifecycle', () => {
|
|
@@ -83,10 +85,7 @@ describe('Server Lifecycle', () => {
|
|
|
83
85
|
|
|
84
86
|
expect(ctx1.port).not.toBe(ctx2.port);
|
|
85
87
|
|
|
86
|
-
const [res1, res2] = await Promise.all([
|
|
87
|
-
fetch(`${ctx1.baseUrl}/api/pages`),
|
|
88
|
-
fetch(`${ctx2.baseUrl}/api/pages`),
|
|
89
|
-
]);
|
|
88
|
+
const [res1, res2] = await Promise.all([fetch(`${ctx1.baseUrl}/api/pages`), fetch(`${ctx2.baseUrl}/api/pages`)]);
|
|
90
89
|
|
|
91
90
|
expect(res1.status).toBe(200);
|
|
92
91
|
expect(res2.status).toBe(200);
|
|
@@ -8,45 +8,53 @@ import { createTestServer, fetch, TEST_PAGE_JSON } from './test-helpers';
|
|
|
8
8
|
|
|
9
9
|
let ctx: Awaited<ReturnType<typeof createTestServer>>;
|
|
10
10
|
|
|
11
|
-
const PAGE_WITH_META = JSON.stringify(
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
},
|
|
20
|
-
root: {
|
|
21
|
-
type: 'node',
|
|
22
|
-
tag: 'div',
|
|
23
|
-
children: [
|
|
24
|
-
{
|
|
25
|
-
type: 'node',
|
|
26
|
-
tag: 'h1',
|
|
27
|
-
children: 'SEO Content',
|
|
11
|
+
const PAGE_WITH_META = JSON.stringify(
|
|
12
|
+
{
|
|
13
|
+
meta: {
|
|
14
|
+
title: 'SEO Page',
|
|
15
|
+
description: 'A page with meta description',
|
|
16
|
+
og: {
|
|
17
|
+
title: 'OG Title',
|
|
18
|
+
description: 'OG Description',
|
|
28
19
|
},
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
20
|
+
},
|
|
21
|
+
root: {
|
|
22
|
+
type: 'node',
|
|
23
|
+
tag: 'div',
|
|
24
|
+
children: [
|
|
25
|
+
{
|
|
26
|
+
type: 'node',
|
|
27
|
+
tag: 'h1',
|
|
28
|
+
children: 'SEO Content',
|
|
29
|
+
},
|
|
30
|
+
],
|
|
31
|
+
},
|
|
37
32
|
},
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
},
|
|
47
|
-
|
|
33
|
+
null,
|
|
34
|
+
2,
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
const PAGE_WITH_I18N = JSON.stringify(
|
|
38
|
+
{
|
|
39
|
+
meta: {
|
|
40
|
+
title: { _i18n: true, en: 'English Title', pl: 'Polish Title' },
|
|
41
|
+
slugs: { en: 'about', pl: 'o-nas' },
|
|
42
|
+
},
|
|
43
|
+
root: {
|
|
44
|
+
type: 'node',
|
|
45
|
+
tag: 'div',
|
|
46
|
+
children: [
|
|
47
|
+
{
|
|
48
|
+
type: 'node',
|
|
49
|
+
tag: 'h1',
|
|
50
|
+
children: { _i18n: true, en: 'Hello', pl: 'Cześć' },
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
},
|
|
48
54
|
},
|
|
49
|
-
|
|
55
|
+
null,
|
|
56
|
+
2,
|
|
57
|
+
);
|
|
50
58
|
|
|
51
59
|
beforeAll(async () => {
|
|
52
60
|
ctx = await createTestServer({
|
|
@@ -88,7 +96,9 @@ describe('SSR Rendering', () => {
|
|
|
88
96
|
const res = await fetch(ctx.baseUrl);
|
|
89
97
|
const html = await res.text();
|
|
90
98
|
|
|
91
|
-
|
|
99
|
+
// The main style tag carries id="meno-styles" (so hot reload can patch it
|
|
100
|
+
// in place) and may carry a CSP nonce.
|
|
101
|
+
expect(html).toMatch(/<style id="meno-styles"[^>]*>/);
|
|
92
102
|
// Base reset CSS should be present
|
|
93
103
|
expect(html).toContain('box-sizing: border-box');
|
|
94
104
|
});
|
|
@@ -14,7 +14,7 @@ let originalProjectRoot: string;
|
|
|
14
14
|
// 1x1 transparent PNG (minimal valid PNG file)
|
|
15
15
|
const TINY_PNG = Buffer.from(
|
|
16
16
|
'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==',
|
|
17
|
-
'base64'
|
|
17
|
+
'base64',
|
|
18
18
|
);
|
|
19
19
|
|
|
20
20
|
// Minimal WOFF2 header (just enough to test MIME type detection)
|
|
@@ -31,8 +31,8 @@ beforeAll(async () => {
|
|
|
31
31
|
});
|
|
32
32
|
|
|
33
33
|
// Write binary files properly
|
|
34
|
-
const { writeFileSync } = await import('fs');
|
|
35
|
-
const { join } = await import('path');
|
|
34
|
+
const { writeFileSync } = await import('node:fs');
|
|
35
|
+
const { join } = await import('node:path');
|
|
36
36
|
writeFileSync(join(tempProject.projectDir, 'images/test.png'), TINY_PNG);
|
|
37
37
|
writeFileSync(join(tempProject.projectDir, 'fonts/test.woff2'), TINY_WOFF2);
|
|
38
38
|
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* Shared utilities for server integration tests
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { mkdirSync, writeFileSync, rmSync } from 'fs';
|
|
7
|
-
import { join } from 'path';
|
|
6
|
+
import { mkdirSync, writeFileSync, rmSync } from 'node:fs';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
8
|
import { createServer, WebSocketManager, type ServerConfig } from '../createServer';
|
|
9
9
|
import { PageService } from '../services/pageService';
|
|
10
10
|
import { ComponentService } from '../services/componentService';
|
|
@@ -13,7 +13,6 @@ import {
|
|
|
13
13
|
createTypedMockPageProvider,
|
|
14
14
|
createTypedMockComponentProvider,
|
|
15
15
|
} from '../../test-utils/factories/ServerMockFactory';
|
|
16
|
-
import { setProjectRoot } from '../projectContext';
|
|
17
16
|
|
|
18
17
|
// Save original fetch before any test mocking can override it
|
|
19
18
|
const originalFetch = globalThis.fetch;
|
|
@@ -29,45 +28,53 @@ export { originalFetch as fetch };
|
|
|
29
28
|
/**
|
|
30
29
|
* Minimal page JSON for testing
|
|
31
30
|
*/
|
|
32
|
-
export const TEST_PAGE_JSON = JSON.stringify(
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
31
|
+
export const TEST_PAGE_JSON = JSON.stringify(
|
|
32
|
+
{
|
|
33
|
+
meta: {
|
|
34
|
+
title: 'Test Page',
|
|
35
|
+
description: 'A test page for integration tests',
|
|
36
|
+
},
|
|
37
|
+
root: {
|
|
38
|
+
type: 'node',
|
|
39
|
+
tag: 'div',
|
|
40
|
+
children: [
|
|
41
|
+
{
|
|
42
|
+
type: 'node',
|
|
43
|
+
tag: 'h1',
|
|
44
|
+
children: 'Hello World',
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
},
|
|
47
48
|
},
|
|
48
|
-
|
|
49
|
+
null,
|
|
50
|
+
2,
|
|
51
|
+
);
|
|
49
52
|
|
|
50
53
|
/**
|
|
51
54
|
* Page with component reference
|
|
52
55
|
*/
|
|
53
|
-
export const TEST_PAGE_WITH_COMPONENT = JSON.stringify(
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
56
|
+
export const TEST_PAGE_WITH_COMPONENT = JSON.stringify(
|
|
57
|
+
{
|
|
58
|
+
meta: {
|
|
59
|
+
title: 'Component Page',
|
|
60
|
+
},
|
|
61
|
+
root: {
|
|
62
|
+
type: 'node',
|
|
63
|
+
tag: 'div',
|
|
64
|
+
children: [
|
|
65
|
+
{
|
|
66
|
+
type: 'component',
|
|
67
|
+
component: 'TestButton',
|
|
68
|
+
props: {
|
|
69
|
+
label: 'Click Me',
|
|
70
|
+
},
|
|
66
71
|
},
|
|
67
|
-
|
|
68
|
-
|
|
72
|
+
],
|
|
73
|
+
},
|
|
69
74
|
},
|
|
70
|
-
|
|
75
|
+
null,
|
|
76
|
+
2,
|
|
77
|
+
);
|
|
71
78
|
|
|
72
79
|
/**
|
|
73
80
|
* Simple component definition
|
|
@@ -88,51 +95,57 @@ export const TEST_COMPONENT_DEF = {
|
|
|
88
95
|
/**
|
|
89
96
|
* CMS template page JSON
|
|
90
97
|
*/
|
|
91
|
-
export const TEST_CMS_TEMPLATE = JSON.stringify(
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
98
|
+
export const TEST_CMS_TEMPLATE = JSON.stringify(
|
|
99
|
+
{
|
|
100
|
+
meta: {
|
|
101
|
+
title: '{{cms.title}}',
|
|
102
|
+
source: 'cms',
|
|
103
|
+
cms: {
|
|
104
|
+
id: 'posts',
|
|
105
|
+
name: 'Posts',
|
|
106
|
+
collection: 'posts',
|
|
107
|
+
slugField: 'slug',
|
|
108
|
+
urlPattern: '/blog/{{slug}}',
|
|
109
|
+
fields: {
|
|
110
|
+
title: { type: 'string', required: true },
|
|
111
|
+
slug: { type: 'string', required: true },
|
|
112
|
+
body: { type: 'string' },
|
|
113
|
+
},
|
|
105
114
|
},
|
|
106
115
|
},
|
|
116
|
+
root: {
|
|
117
|
+
type: 'node',
|
|
118
|
+
tag: 'article',
|
|
119
|
+
children: [
|
|
120
|
+
{
|
|
121
|
+
type: 'node',
|
|
122
|
+
tag: 'h1',
|
|
123
|
+
children: '{{cms.title}}',
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
type: 'node',
|
|
127
|
+
tag: 'p',
|
|
128
|
+
children: '{{cms.body}}',
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
},
|
|
107
132
|
},
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
children: [
|
|
112
|
-
{
|
|
113
|
-
type: 'node',
|
|
114
|
-
tag: 'h1',
|
|
115
|
-
children: '{{cms.title}}',
|
|
116
|
-
},
|
|
117
|
-
{
|
|
118
|
-
type: 'node',
|
|
119
|
-
tag: 'p',
|
|
120
|
-
children: '{{cms.body}}',
|
|
121
|
-
},
|
|
122
|
-
],
|
|
123
|
-
},
|
|
124
|
-
}, null, 2);
|
|
133
|
+
null,
|
|
134
|
+
2,
|
|
135
|
+
);
|
|
125
136
|
|
|
126
137
|
/**
|
|
127
138
|
* Create a test server with mock providers
|
|
128
139
|
*/
|
|
129
|
-
export async function createTestServer(
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
140
|
+
export async function createTestServer(
|
|
141
|
+
options: {
|
|
142
|
+
pages?: Record<string, string>;
|
|
143
|
+
components?: Map<string, any>;
|
|
144
|
+
port?: number;
|
|
145
|
+
cmsService?: any;
|
|
146
|
+
cmsProvider?: any;
|
|
147
|
+
} = {},
|
|
148
|
+
) {
|
|
136
149
|
const port = options.port ?? 0;
|
|
137
150
|
const wsManager = new WebSocketManager();
|
|
138
151
|
|
|
@@ -141,7 +154,7 @@ export async function createTestServer(options: {
|
|
|
141
154
|
const pageService = new PageService(pageCache, pageProvider);
|
|
142
155
|
await pageService.loadAllPages();
|
|
143
156
|
|
|
144
|
-
const
|
|
157
|
+
const _componentProvider = createTypedMockComponentProvider(options.components ?? new Map());
|
|
145
158
|
const componentService = new ComponentService({
|
|
146
159
|
loader: {
|
|
147
160
|
loadDirectory: async () => options.components ?? new Map(),
|
|
@@ -10,20 +10,22 @@ import type { Experiment } from '../../shared/types/experiments';
|
|
|
10
10
|
* Generate the _middleware.ts content for traffic splitting
|
|
11
11
|
*/
|
|
12
12
|
export function generateMiddleware(experiments: Experiment[]): string {
|
|
13
|
-
const running = experiments.filter(e => e.status === 'running');
|
|
13
|
+
const running = experiments.filter((e) => e.status === 'running');
|
|
14
14
|
if (running.length === 0) return '';
|
|
15
15
|
|
|
16
16
|
// Embed experiment config as JSON
|
|
17
|
-
const configJSON = JSON.stringify(
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
17
|
+
const configJSON = JSON.stringify(
|
|
18
|
+
running.map((e) => ({
|
|
19
|
+
id: e.id,
|
|
20
|
+
controlBranch: e.controlBranch,
|
|
21
|
+
controlWeight: e.controlWeight,
|
|
22
|
+
variants: e.variants.map((v) => ({
|
|
23
|
+
branch: v.branch,
|
|
24
|
+
weight: v.weight,
|
|
25
|
+
deployUrl: v.deployUrl,
|
|
26
|
+
})),
|
|
25
27
|
})),
|
|
26
|
-
|
|
28
|
+
);
|
|
27
29
|
|
|
28
30
|
return `/**
|
|
29
31
|
* A/B Testing Traffic Splitting Middleware
|
|
@@ -7,7 +7,6 @@ import type { JSONPage, ComponentDefinition, CMSSchema, I18nConfig } from '../..
|
|
|
7
7
|
import type { BreakpointConfig } from '../../shared/breakpoints';
|
|
8
8
|
import { DEFAULT_BREAKPOINTS } from '../../shared/breakpoints';
|
|
9
9
|
import { nodeToAstro, type AstroEmitContext } from './nodeToAstro';
|
|
10
|
-
import { transformCMSTemplate } from './templateTransformer';
|
|
11
10
|
import type { ImageMetadataMap } from '../ssr/imageMetadata';
|
|
12
11
|
import type { SlugMap } from '../../shared/slugTranslator';
|
|
13
12
|
import type { ResponsiveScales } from '../../shared/responsiveScaling';
|
|
@@ -126,19 +125,19 @@ function collectRichTextFields(schema: CMSSchema): Set<string> {
|
|
|
126
125
|
function transformTitleExpression(
|
|
127
126
|
title: string,
|
|
128
127
|
binding: string,
|
|
129
|
-
|
|
130
|
-
wrapFn?: string
|
|
128
|
+
_richTextFields: Set<string>,
|
|
129
|
+
wrapFn?: string,
|
|
131
130
|
): string {
|
|
132
131
|
if (!/\{\{cms\./.test(title)) {
|
|
133
132
|
return `"${escapeJSX(title)}"`;
|
|
134
133
|
}
|
|
135
134
|
|
|
136
|
-
const w = (expr: string) => wrapFn ? `${wrapFn}(${expr})` : expr;
|
|
135
|
+
const w = (expr: string) => (wrapFn ? `${wrapFn}(${expr})` : expr);
|
|
137
136
|
|
|
138
137
|
// Full match: entire title is a single {{cms.field}}
|
|
139
138
|
const fullMatch = title.match(/^\{\{cms\.([^}]+)\}\}$/);
|
|
140
139
|
if (fullMatch) {
|
|
141
|
-
return `{${w(`${binding}.data.${fullMatch[1].trim()}`)}}`;
|
|
140
|
+
return `{${w(`${binding}.data.${(fullMatch[1] ?? '').trim()}`)}}`;
|
|
142
141
|
}
|
|
143
142
|
|
|
144
143
|
// Mixed content: "Page - {{cms.title}}" -> {`Page - ${entry.data.title}`}
|
|
@@ -169,20 +168,21 @@ function buildGetStaticPaths(
|
|
|
169
168
|
schema: CMSSchema,
|
|
170
169
|
isMultiLocale: boolean,
|
|
171
170
|
i18nConfig: I18nConfig,
|
|
172
|
-
locale?: string
|
|
171
|
+
locale?: string,
|
|
173
172
|
): string {
|
|
174
173
|
const collectionId = schema.id;
|
|
175
174
|
const slugField = schema.slugField || 'slug';
|
|
176
|
-
const pathPrefix = extractPathPrefix(schema.urlPattern);
|
|
175
|
+
const pathPrefix = extractPathPrefix(schema.urlPattern ?? '');
|
|
177
176
|
const targetLocale = locale || i18nConfig.defaultLocale;
|
|
178
177
|
|
|
179
178
|
if (!isMultiLocale) {
|
|
180
179
|
// Single-locale version: resolve slug for this specific locale
|
|
181
180
|
// Route file is at blog/[slug].astro (or pl/blog/[slug].astro for non-default)
|
|
182
181
|
// If i18n values exist, resolve for the target locale
|
|
183
|
-
const slugExpr =
|
|
184
|
-
|
|
185
|
-
|
|
182
|
+
const slugExpr =
|
|
183
|
+
i18nConfig.locales.length > 1
|
|
184
|
+
? `entry.data.${slugField}?.${targetLocale} || entry.data.${slugField} || entry.id`
|
|
185
|
+
: `entry.data.${slugField} || entry.id`;
|
|
186
186
|
|
|
187
187
|
return [
|
|
188
188
|
`export async function getStaticPaths() {`,
|
|
@@ -221,14 +221,14 @@ function buildGetStaticPaths(
|
|
|
221
221
|
` paths.push({`,
|
|
222
222
|
` params: { slug: \`${pathPrefix}\${${slugExpr}}\` },`,
|
|
223
223
|
` props: { entry, locale: '${code}' },`,
|
|
224
|
-
` })
|
|
224
|
+
` });`,
|
|
225
225
|
);
|
|
226
226
|
} else {
|
|
227
227
|
lines.push(
|
|
228
228
|
` paths.push({`,
|
|
229
229
|
` params: { slug: ${slugExpr} },`,
|
|
230
230
|
` props: { entry, locale: '${code}' },`,
|
|
231
|
-
` })
|
|
231
|
+
` });`,
|
|
232
232
|
);
|
|
233
233
|
}
|
|
234
234
|
} else {
|
|
@@ -238,18 +238,12 @@ function buildGetStaticPaths(
|
|
|
238
238
|
` paths.push({`,
|
|
239
239
|
` params: { slug: \`${code}/${pathPrefix}\${${slugExpr}}\` },`,
|
|
240
240
|
` props: { entry, locale: '${code}' },`,
|
|
241
|
-
` })
|
|
241
|
+
` });`,
|
|
242
242
|
);
|
|
243
243
|
}
|
|
244
244
|
}
|
|
245
245
|
|
|
246
|
-
lines.push(
|
|
247
|
-
` }`,
|
|
248
|
-
` return paths;`,
|
|
249
|
-
`}`,
|
|
250
|
-
``,
|
|
251
|
-
`const { entry, locale = '${defaultLocale}' } = Astro.props;`
|
|
252
|
-
);
|
|
246
|
+
lines.push(` }`, ` return paths;`, `}`, ``, `const { entry, locale = '${defaultLocale}' } = Astro.props;`);
|
|
253
247
|
|
|
254
248
|
return lines.join('\n');
|
|
255
249
|
}
|
|
@@ -307,7 +301,7 @@ export function emitCMSPage(options: CMSPageEmitOptions): string {
|
|
|
307
301
|
isMultiLocale,
|
|
308
302
|
i18nConfig,
|
|
309
303
|
binding,
|
|
310
|
-
richTextFields
|
|
304
|
+
richTextFields,
|
|
311
305
|
);
|
|
312
306
|
}
|
|
313
307
|
|
|
@@ -373,9 +367,7 @@ export function emitCMSPage(options: CMSPageEmitOptions): string {
|
|
|
373
367
|
const staticPaths = buildGetStaticPaths(cmsSchema, isMultiLocale, i18nConfig, locale);
|
|
374
368
|
|
|
375
369
|
// Build script paths array
|
|
376
|
-
const scriptsArrayLiteral = scriptPaths.length > 0
|
|
377
|
-
? `[${scriptPaths.map((s) => `"${s}"`).join(', ')}]`
|
|
378
|
-
: '[]';
|
|
370
|
+
const scriptsArrayLiteral = scriptPaths.length > 0 ? `[${scriptPaths.map((s) => `"${s}"`).join(', ')}]` : '[]';
|
|
379
371
|
|
|
380
372
|
// Build library tags literal
|
|
381
373
|
const libraryTagsLiteral = `{ headCSS: \`${escapeTemplateLiteral(libraryTags.headCSS || '')}\`, headJS: \`${escapeTemplateLiteral(libraryTags.headJS || '')}\`, bodyEndJS: \`${escapeTemplateLiteral(libraryTags.bodyEndJS || '')}\` }`;
|
|
@@ -383,16 +375,10 @@ export function emitCMSPage(options: CMSPageEmitOptions): string {
|
|
|
383
375
|
// Escape meta first, then transform CMS templates ({{cms.X}} survives escaping intact)
|
|
384
376
|
const slugField = cmsSchema.slugField || 'slug';
|
|
385
377
|
const escapedMeta = escapeTemplateLiteral(meta)
|
|
386
|
-
.replace(
|
|
387
|
-
/\{\{cms\.([^}]+)\}\}/g,
|
|
388
|
-
(_, fieldPath) => `\${${wrapFn}(${binding}.data.${fieldPath.trim()})}`
|
|
389
|
-
)
|
|
378
|
+
.replace(/\{\{cms\.([^}]+)\}\}/g, (_, fieldPath) => `\${${wrapFn}(${binding}.data.${fieldPath.trim()})}`)
|
|
390
379
|
// Replace the metadata-pass stand-in slug with the per-entry slug so
|
|
391
380
|
// canonical/og:url point at the real page instead of "__placeholder__".
|
|
392
|
-
.replace(
|
|
393
|
-
new RegExp(CMS_SLUG_PLACEHOLDER, 'g'),
|
|
394
|
-
`\${${wrapFn}(${binding}.data.${slugField}) || ${binding}.id}`
|
|
395
|
-
);
|
|
381
|
+
.replace(new RegExp(CMS_SLUG_PLACEHOLDER, 'g'), `\${${wrapFn}(${binding}.data.${slugField}) || ${binding}.id}`);
|
|
396
382
|
const escapedFontPreloads = escapeTemplateLiteral(fontPreloads);
|
|
397
383
|
|
|
398
384
|
// Transform title for CMS entry data
|
|
@@ -406,14 +392,14 @@ export function emitCMSPage(options: CMSPageEmitOptions): string {
|
|
|
406
392
|
|
|
407
393
|
// Page-level collection queries emitted by collection-sourced list nodes
|
|
408
394
|
// (getCollection import is already present in importLines above).
|
|
409
|
-
const extraFrontmatter =
|
|
410
|
-
?
|
|
411
|
-
: '';
|
|
395
|
+
const extraFrontmatter =
|
|
396
|
+
ctx.frontmatterLines && ctx.frontmatterLines.length > 0 ? `\n${ctx.frontmatterLines.join('\n')}` : '';
|
|
412
397
|
|
|
413
398
|
// Generate interactive style block for page-level interactive styles
|
|
414
|
-
const interactiveStyleSection =
|
|
415
|
-
|
|
416
|
-
|
|
399
|
+
const interactiveStyleSection =
|
|
400
|
+
ctx.collectedInteractiveStyles!.size > 0
|
|
401
|
+
? `\n<style is:global>\n${generateAllInteractiveCSS(ctx.collectedInteractiveStyles!, breakpoints, remConfig, responsiveScales)}\n</style>\n`
|
|
402
|
+
: '';
|
|
417
403
|
|
|
418
404
|
return `---
|
|
419
405
|
${importLines.join('\n')}
|
|
@@ -453,13 +439,11 @@ function buildEmptyCMSPage(
|
|
|
453
439
|
isMultiLocale: boolean,
|
|
454
440
|
i18nConfig: I18nConfig,
|
|
455
441
|
binding: string,
|
|
456
|
-
richTextFields: Set<string
|
|
442
|
+
richTextFields: Set<string>,
|
|
457
443
|
): string {
|
|
458
444
|
const escapedMeta = escapeTemplateLiteral(meta);
|
|
459
445
|
const escapedFontPreloads = escapeTemplateLiteral(fontPreloads);
|
|
460
|
-
const scriptsArrayLiteral = scriptPaths.length > 0
|
|
461
|
-
? `[${scriptPaths.map((s) => `"${s}"`).join(', ')}]`
|
|
462
|
-
: '[]';
|
|
446
|
+
const scriptsArrayLiteral = scriptPaths.length > 0 ? `[${scriptPaths.map((s) => `"${s}"`).join(', ')}]` : '[]';
|
|
463
447
|
const libraryTagsLiteral = `{ headCSS: \`${escapeTemplateLiteral(libraryTags.headCSS || '')}\`, headJS: \`${escapeTemplateLiteral(libraryTags.headJS || '')}\`, bodyEndJS: \`${escapeTemplateLiteral(libraryTags.bodyEndJS || '')}\` }`;
|
|
464
448
|
|
|
465
449
|
const wrapFn = 'r';
|