meno-core 1.0.53 → 1.0.54
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 +48 -57
- package/build-astro.ts +131 -113
- package/build-next.ts +109 -96
- package/build-static.test.ts +39 -10
- package/build-static.ts +120 -122
- package/dist/bin/cli.js +34 -38
- package/dist/bin/cli.js.map +2 -2
- package/dist/build-static.js +12 -11
- package/dist/chunks/chunk-2AR55GYH.js +42 -0
- package/dist/chunks/chunk-2AR55GYH.js.map +7 -0
- package/dist/chunks/{chunk-IGYR22T6.js → chunk-2FN4UOVO.js} +512 -239
- package/dist/chunks/chunk-2FN4UOVO.js.map +7 -0
- package/dist/chunks/chunk-3XER4E5W.js +168 -0
- package/dist/chunks/chunk-3XER4E5W.js.map +7 -0
- package/dist/chunks/{chunk-X754AHS5.js → chunk-5ETZFREW.js} +9 -12
- package/dist/chunks/chunk-5ETZFREW.js.map +7 -0
- package/dist/chunks/{chunk-2MHDV5BF.js → chunk-7E4IF5L7.js} +15 -21
- package/dist/chunks/chunk-7E4IF5L7.js.map +7 -0
- package/dist/chunks/{chunk-JGWFTO6P.js → chunk-7HWQUVTU.js} +1578 -1349
- package/dist/chunks/chunk-7HWQUVTU.js.map +7 -0
- package/dist/chunks/{chunk-O3NAGJP4.js → chunk-AE3QK5QW.js} +110 -21
- package/dist/chunks/chunk-AE3QK5QW.js.map +7 -0
- package/dist/chunks/{chunk-GZHGVVW3.js → chunk-F6KTJYGV.js} +7 -7
- package/dist/chunks/chunk-F6KTJYGV.js.map +7 -0
- package/dist/chunks/{chunk-WQFG7PAH.js → chunk-FZITJSSS.js} +2 -6
- package/dist/chunks/chunk-FZITJSSS.js.map +7 -0
- package/dist/chunks/{chunk-QB2LNO4W.js → chunk-GSYYA5GX.js} +2 -2
- package/dist/chunks/chunk-GSYYA5GX.js.map +7 -0
- package/dist/chunks/{chunk-YBLHKYFF.js → chunk-HIZMY3EP.js} +1 -1
- package/dist/chunks/chunk-HIZMY3EP.js.map +7 -0
- package/dist/chunks/{chunk-AZQYF6KE.js → chunk-I2WEGYA7.js} +41 -176
- package/dist/chunks/chunk-I2WEGYA7.js.map +7 -0
- package/dist/chunks/{chunk-I7YIGZXT.js → chunk-JNO3CNLJ.js} +6 -9
- package/dist/chunks/chunk-JNO3CNLJ.js.map +7 -0
- package/dist/chunks/{chunk-UB44F4Z2.js → chunk-NVRBTSQG.js} +2 -4
- package/dist/chunks/chunk-NVRBTSQG.js.map +7 -0
- package/dist/chunks/{chunk-JGP5A3Y5.js → chunk-Q4OBWKXG.js} +40 -33
- package/dist/chunks/chunk-Q4OBWKXG.js.map +7 -0
- package/dist/chunks/{chunk-R6XHAFBF.js → chunk-QTE32Y53.js} +250 -242
- package/dist/chunks/chunk-QTE32Y53.js.map +7 -0
- package/dist/chunks/{chunk-H3GJ4H2U.js → chunk-STDY3OVM.js} +214 -85
- package/dist/chunks/chunk-STDY3OVM.js.map +7 -0
- package/dist/chunks/configService-PRJZF7Y6.js +14 -0
- package/dist/chunks/{constants-STK2YBIW.js → constants-KIQEYMAM.js} +2 -2
- package/dist/chunks/{fs-JGINUXGL.js → fs-ZI5JEU7V.js} +2 -2
- package/dist/entries/server-router.js +14 -19
- package/dist/entries/server-router.js.map +2 -2
- package/dist/lib/client/index.js +638 -332
- package/dist/lib/client/index.js.map +2 -2
- package/dist/lib/server/index.js +177 -235
- package/dist/lib/server/index.js.map +2 -2
- package/dist/lib/shared/index.js +80 -44
- package/dist/lib/shared/index.js.map +2 -2
- package/dist/lib/shared/richtext/index.js +1 -1
- package/dist/lib/test-utils/index.js +38 -60
- package/dist/lib/test-utils/index.js.map +2 -2
- package/entries/client-router.tsx +10 -8
- package/entries/server-router.tsx +1 -7
- package/lib/client/ClientInitializer.ts +8 -8
- package/lib/client/ErrorBoundary.test.tsx +146 -143
- package/lib/client/ErrorBoundary.tsx +175 -127
- package/lib/client/componentRegistry.test.ts +96 -108
- package/lib/client/componentRegistry.ts +1 -2
- package/lib/client/contexts/ThemeContext.tsx +3 -2
- package/lib/client/core/ComponentBuilder.test.ts +513 -560
- package/lib/client/core/ComponentBuilder.ts +318 -146
- package/lib/client/core/ComponentRenderer.test.tsx +1 -2
- package/lib/client/core/ComponentRenderer.tsx +46 -33
- package/lib/client/core/builders/embedBuilder.ts +241 -53
- package/lib/client/core/builders/linkBuilder.ts +71 -44
- package/lib/client/core/builders/linkNodeBuilder.ts +78 -53
- package/lib/client/core/builders/listBuilder.ts +115 -86
- package/lib/client/core/builders/localeListBuilder.ts +95 -60
- package/lib/client/core/builders/types.ts +5 -5
- package/lib/client/core/cmsTemplateProcessor.ts +7 -7
- 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 +8 -0
- package/lib/client/hmrCssReload.ts +14 -8
- package/lib/client/hmrWebSocket.ts +9 -14
- package/lib/client/hooks/useColorVariables.test.ts +21 -21
- package/lib/client/hooks/useColorVariables.ts +12 -10
- package/lib/client/hooks/usePropertyAutocomplete.ts +3 -5
- package/lib/client/hooks/useVariables.ts +4 -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 +19 -21
- package/lib/client/meno-filter/MenoFilter.ts +5 -9
- package/lib/client/meno-filter/bindings.ts +15 -40
- package/lib/client/meno-filter/init.ts +1 -1
- package/lib/client/meno-filter/renderer.ts +23 -29
- package/lib/client/meno-filter/script.generated.ts +1 -3
- package/lib/client/meno-filter/ui.ts +3 -5
- package/lib/client/meno-filter/updates.ts +15 -21
- package/lib/client/navigation.test.ts +159 -159
- package/lib/client/navigation.ts +0 -1
- package/lib/client/responsiveStyleResolver.test.ts +230 -228
- package/lib/client/responsiveStyleResolver.ts +13 -16
- package/lib/client/routing/RouteLoader.test.ts +23 -24
- package/lib/client/routing/RouteLoader.ts +22 -35
- package/lib/client/routing/Router.tsx +31 -3
- package/lib/client/scripts/ScriptExecutor.test.ts +157 -158
- package/lib/client/scripts/ScriptExecutor.ts +15 -33
- package/lib/client/services/PrefetchService.test.ts +2 -2
- package/lib/client/services/PrefetchService.ts +10 -24
- package/lib/client/styleProcessor.test.ts +9 -9
- package/lib/client/styleProcessor.ts +18 -15
- package/lib/client/styles/StyleInjector.test.ts +122 -115
- package/lib/client/styles/StyleInjector.ts +9 -6
- package/lib/client/styles/UtilityClassCollector.ts +19 -26
- package/lib/client/styles/cspNonce.test.ts +2 -5
- package/lib/client/templateEngine.test.ts +554 -482
- package/lib/client/templateEngine.ts +200 -64
- 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 +2 -5
- package/lib/server/__integration__/ssr-rendering.test.ts +47 -37
- package/lib/server/__integration__/static-assets.test.ts +1 -1
- package/lib/server/__integration__/test-helpers.ts +84 -70
- package/lib/server/ab/generateFunctions.ts +12 -10
- package/lib/server/astro/cmsPageEmitter.ts +23 -38
- package/lib/server/astro/componentEmitter.ts +25 -36
- package/lib/server/astro/cssCollector.ts +10 -26
- package/lib/server/astro/nodeToAstro.test.ts +1750 -30
- package/lib/server/astro/nodeToAstro.ts +198 -187
- package/lib/server/astro/normalizeOrphanTemplateProps.test.ts +105 -109
- package/lib/server/astro/normalizeOrphanTemplateProps.ts +4 -12
- 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 +14 -17
- package/lib/server/createServer.ts +5 -17
- package/lib/server/cssGenerator.test.ts +35 -44
- package/lib/server/cssGenerator.ts +6 -17
- package/lib/server/fileWatcher.test.ts +124 -10
- package/lib/server/fileWatcher.ts +124 -118
- package/lib/server/index.ts +7 -1
- package/lib/server/jsonLoader.test.ts +39 -2
- package/lib/server/jsonLoader.ts +33 -31
- package/lib/server/middleware/cors.test.ts +20 -20
- package/lib/server/middleware/cors.ts +28 -4
- package/lib/server/middleware/errorHandler.test.ts +5 -3
- package/lib/server/middleware/errorHandler.ts +3 -8
- package/lib/server/middleware/index.ts +0 -1
- package/lib/server/middleware/logger.test.ts +7 -5
- package/lib/server/middleware/logger.ts +10 -22
- package/lib/server/pageCache.test.ts +76 -77
- package/lib/server/pageCache.ts +0 -1
- package/lib/server/projectContext.ts +4 -3
- package/lib/server/providers/fileSystemCMSProvider.test.ts +124 -95
- package/lib/server/providers/fileSystemCMSProvider.ts +35 -20
- package/lib/server/providers/fileSystemPageProvider.test.ts +84 -0
- package/lib/server/providers/fileSystemPageProvider.ts +31 -12
- package/lib/server/routes/api/cms.test.ts +26 -14
- package/lib/server/routes/api/cms.ts +9 -14
- package/lib/server/routes/api/components.ts +30 -34
- package/lib/server/routes/api/config.ts +0 -1
- package/lib/server/routes/api/core-routes.ts +47 -74
- package/lib/server/routes/api/functions.ts +8 -16
- 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 +1 -3
- package/lib/server/routes/api/variables.ts +1 -1
- package/lib/server/routes/index.ts +23 -26
- package/lib/server/routes/pages.ts +34 -29
- package/lib/server/routes/static.ts +16 -4
- package/lib/server/runtime/bundler.ts +47 -32
- package/lib/server/runtime/fs.ts +3 -13
- package/lib/server/runtime/httpServer.ts +5 -9
- package/lib/server/services/ColorService.ts +32 -27
- package/lib/server/services/EnumService.test.ts +2 -6
- package/lib/server/services/EnumService.ts +7 -2
- package/lib/server/services/VariableService.test.ts +1 -5
- package/lib/server/services/VariableService.ts +6 -1
- package/lib/server/services/cmsService.test.ts +116 -78
- package/lib/server/services/cmsService.ts +24 -54
- package/lib/server/services/componentService.test.ts +122 -36
- package/lib/server/services/componentService.ts +54 -38
- package/lib/server/services/configService.test.ts +9 -31
- package/lib/server/services/configService.ts +20 -27
- package/lib/server/services/fileWatcherService.ts +40 -6
- package/lib/server/services/index.ts +0 -1
- package/lib/server/services/pageService.test.ts +1 -3
- package/lib/server/services/pageService.ts +14 -13
- package/lib/server/ssr/attributeBuilder.ts +16 -6
- package/lib/server/ssr/buildErrorOverlay.ts +11 -12
- package/lib/server/ssr/clientDataInjector.ts +7 -21
- package/lib/server/ssr/cmsSSRProcessor.ts +3 -6
- 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 +3 -9
- package/lib/server/ssr/htmlGenerator.test.ts +120 -43
- package/lib/server/ssr/htmlGenerator.ts +120 -85
- package/lib/server/ssr/imageMetadata.test.ts +3 -1
- package/lib/server/ssr/imageMetadata.ts +25 -19
- package/lib/server/ssr/jsCollector.test.ts +3 -13
- package/lib/server/ssr/jsCollector.ts +3 -8
- package/lib/server/ssr/liveReloadIntegration.test.ts +69 -28
- 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 +196 -246
- package/lib/server/ssr/ssrRenderer.ts +609 -225
- package/lib/server/ssrRenderer.test.ts +1044 -950
- package/lib/server/utils/jsonLineMapper.test.ts +28 -28
- package/lib/server/utils/jsonLineMapper.ts +1 -1
- package/lib/server/validateStyleCoverage.ts +18 -20
- package/lib/server/webflow/buildWebflow.ts +41 -53
- package/lib/server/webflow/nodeToWebflow.test.ts +150 -218
- package/lib/server/webflow/nodeToWebflow.ts +195 -258
- package/lib/server/webflow/styleMapper.test.ts +15 -56
- package/lib/server/webflow/styleMapper.ts +33 -41
- package/lib/server/webflow/types.ts +1 -8
- package/lib/server/websocketManager.ts +16 -19
- package/lib/shared/attributeNodeUtils.test.ts +15 -15
- package/lib/shared/attributeNodeUtils.ts +5 -12
- package/lib/shared/breakpoints.ts +4 -11
- package/lib/shared/cmsQueryParser.test.ts +50 -42
- package/lib/shared/cmsQueryParser.ts +49 -31
- package/lib/shared/colorVariableUtils.test.ts +5 -5
- package/lib/shared/colorVariableUtils.ts +3 -8
- package/lib/shared/componentRefs.ts +1 -5
- package/lib/shared/constants.test.ts +3 -3
- package/lib/shared/constants.ts +4 -8
- package/lib/shared/cssGeneration.test.ts +262 -144
- package/lib/shared/cssGeneration.ts +189 -516
- package/lib/shared/cssNamedColors.ts +152 -30
- package/lib/shared/cssProperties.test.ts +5 -6
- package/lib/shared/cssProperties.ts +296 -112
- package/lib/shared/elementClassName.test.ts +109 -109
- package/lib/shared/elementClassName.ts +1 -1
- package/lib/shared/elementUtils.ts +12 -16
- 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 +119 -0
- package/lib/shared/expressionEvaluator.ts +43 -24
- package/lib/shared/fontLoader.test.ts +19 -5
- package/lib/shared/friendlyError.ts +2 -3
- package/lib/shared/gradientUtils.test.ts +1 -5
- package/lib/shared/gradientUtils.ts +2 -6
- package/lib/shared/hrefRefs.ts +2 -10
- package/lib/shared/i18n.test.ts +1 -1
- package/lib/shared/i18n.ts +13 -34
- package/lib/shared/index.ts +4 -0
- package/lib/shared/inlineSvgStyleRules.ts +2 -4
- package/lib/shared/interactiveStyleMappings.test.ts +11 -33
- package/lib/shared/interactiveStyleMappings.ts +9 -16
- package/lib/shared/interactiveStyles.test.ts +165 -188
- package/lib/shared/interfaces/contentProvider.ts +1 -1
- package/lib/shared/itemTemplateUtils.test.ts +6 -12
- package/lib/shared/itemTemplateUtils.ts +19 -35
- package/lib/shared/jsonRepair.ts +8 -2
- package/lib/shared/libraryLoader.test.ts +15 -49
- package/lib/shared/libraryLoader.ts +7 -22
- package/lib/shared/netlifyLocale404.test.ts +179 -0
- package/lib/shared/netlifyLocale404.ts +110 -0
- package/lib/shared/nodeUtils.test.ts +24 -16
- package/lib/shared/nodeUtils.ts +49 -19
- package/lib/shared/pathArrayUtils.test.ts +1 -2
- package/lib/shared/pathArrayUtils.ts +1 -1
- package/lib/shared/pathSecurity.ts +1 -1
- package/lib/shared/pathUtils.test.ts +4 -6
- package/lib/shared/pathUtils.ts +42 -48
- 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 +14 -17
- package/lib/shared/paths/PathUtils.ts +9 -10
- package/lib/shared/paths/PathValidator.test.ts +2 -15
- package/lib/shared/paths/PathValidator.ts +11 -9
- package/lib/shared/paths/index.ts +1 -2
- package/lib/shared/propResolver.test.ts +240 -244
- package/lib/shared/propResolver.ts +14 -25
- package/lib/shared/pxToRem.test.ts +7 -6
- package/lib/shared/pxToRem.ts +2 -5
- package/lib/shared/registry/BaseNodeTypeRegistry.test.ts +9 -5
- package/lib/shared/registry/ClientRegistry.ts +0 -1
- package/lib/shared/registry/ComponentRegistry.test.ts +43 -29
- package/lib/shared/registry/ComponentRegistry.ts +9 -11
- package/lib/shared/registry/NodeTypeDefinition.ts +15 -8
- package/lib/shared/registry/RegistryManager.ts +1 -2
- package/lib/shared/registry/SSRRegistry.ts +0 -1
- package/lib/shared/registry/createNodeType.ts +7 -9
- package/lib/shared/registry/defineNodeType.ts +2 -6
- package/lib/shared/registry/index.ts +0 -1
- package/lib/shared/registry/nodeTypes/ComponentInstanceNodeType.ts +14 -15
- package/lib/shared/registry/nodeTypes/EmbedNodeType.ts +18 -11
- package/lib/shared/registry/nodeTypes/HtmlNodeType.ts +47 -18
- package/lib/shared/registry/nodeTypes/LinkNodeType.ts +21 -19
- package/lib/shared/registry/nodeTypes/ListNodeType.ts +78 -74
- package/lib/shared/registry/nodeTypes/LocaleListNodeType.ts +27 -21
- package/lib/shared/registry/nodeTypes/SlotMarkerType.ts +6 -7
- package/lib/shared/registry/nodeTypes/index.ts +10 -2
- package/lib/shared/responsiveScaling.test.ts +15 -31
- package/lib/shared/responsiveScaling.ts +55 -37
- package/lib/shared/responsiveStyleUtils.ts +11 -13
- package/lib/shared/richtext/htmlToTiptap.test.ts +23 -14
- package/lib/shared/richtext/htmlToTiptap.ts +1 -3
- 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 +5 -10
- package/lib/shared/styleUtils.test.ts +87 -61
- package/lib/shared/styleUtils.ts +5 -6
- package/lib/shared/themeDefaults.test.ts +11 -11
- package/lib/shared/themeDefaults.ts +3 -4
- package/lib/shared/tree/PathBuilder.test.ts +62 -138
- package/lib/shared/tree/PathBuilder.ts +49 -39
- package/lib/shared/treePathUtils.test.ts +2 -10
- package/lib/shared/treePathUtils.ts +54 -59
- package/lib/shared/types/api.ts +1 -2
- package/lib/shared/types/cms.ts +25 -21
- package/lib/shared/types/comment.ts +49 -16
- package/lib/shared/types/components.ts +27 -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 +2 -2
- package/lib/shared/types/styles.ts +0 -1
- package/lib/shared/types/variables.test.ts +4 -13
- package/lib/shared/types/variables.ts +48 -27
- package/lib/shared/types.ts +1 -2
- package/lib/shared/utilityClassConfig.ts +648 -321
- package/lib/shared/utilityClassMapper.test.ts +203 -92
- package/lib/shared/utilityClassMapper.ts +188 -246
- package/lib/shared/utilityClassNames.ts +326 -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/propValidator.test.ts +18 -20
- package/lib/shared/validation/propValidator.ts +12 -17
- package/lib/shared/validation/schemas.test.ts +24 -33
- package/lib/shared/validation/schemas.ts +469 -344
- package/lib/shared/validation/validators.test.ts +1 -6
- package/lib/shared/validation/validators.ts +89 -68
- package/lib/shared/viewportUnits.integration.test.ts +14 -10
- package/lib/shared/viewportUnits.test.ts +11 -23
- package/lib/test-utils/dom-setup.ts +1 -1
- package/lib/test-utils/factories/ConsoleMockFactory.ts +3 -7
- package/lib/test-utils/factories/DomMockFactory.ts +7 -19
- 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 +5 -9
- package/lib/test-utils/factories/StoreMockFactory.ts +14 -25
- 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 +12 -18
- package/lib/test-utils/mocks.ts +4 -2
- package/package.json +1 -1
- package/scripts/build-meno-filter.ts +1 -4
- package/vite.config.ts +4 -4
- package/dist/chunks/chunk-2MHDV5BF.js.map +0 -7
- package/dist/chunks/chunk-AZQYF6KE.js.map +0 -7
- package/dist/chunks/chunk-GZHGVVW3.js.map +0 -7
- package/dist/chunks/chunk-H3GJ4H2U.js.map +0 -7
- package/dist/chunks/chunk-I7YIGZXT.js.map +0 -7
- package/dist/chunks/chunk-IGYR22T6.js.map +0 -7
- 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.map +0 -7
- 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 → configService-PRJZF7Y6.js.map} +0 -0
- /package/dist/chunks/{constants-STK2YBIW.js.map → constants-KIQEYMAM.js.map} +0 -0
- /package/dist/chunks/{fs-JGINUXGL.js.map → fs-ZI5JEU7V.js.map} +0 -0
package/build-next.ts
CHANGED
|
@@ -11,37 +11,46 @@
|
|
|
11
11
|
* browser parses the statically exported `.html` file.
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
-
import { existsSync, readdirSync, mkdirSync, rmSync, statSync, copyFileSync, writeFileSync } from
|
|
15
|
-
import { writeFile, readFile } from
|
|
16
|
-
import { join } from
|
|
17
|
-
import { createHash } from
|
|
14
|
+
import { existsSync, readdirSync, mkdirSync, rmSync, statSync, copyFileSync, writeFileSync } from 'fs';
|
|
15
|
+
import { writeFile, readFile } from 'fs/promises';
|
|
16
|
+
import { join } from 'path';
|
|
17
|
+
import { createHash } from 'crypto';
|
|
18
18
|
import {
|
|
19
19
|
loadJSONFile,
|
|
20
20
|
loadComponentDirectory,
|
|
21
21
|
mapPageNameToPath,
|
|
22
22
|
parseJSON,
|
|
23
23
|
loadI18nConfig,
|
|
24
|
-
} from
|
|
25
|
-
import { projectPaths } from
|
|
26
|
-
import { loadProjectConfig, generateFontCSS, generateFontPreloadTags } from
|
|
27
|
-
import { FileSystemCMSProvider } from
|
|
28
|
-
import { CMSService } from
|
|
29
|
-
import { isI18nValue, resolveI18nValue } from
|
|
30
|
-
import type { ComponentDefinition, JSONPage, CMSSchema, CMSItem, I18nConfig } from
|
|
31
|
-
import { isItemDraftForLocale } from
|
|
32
|
-
import type { SlugMap } from
|
|
33
|
-
import { renderPageSSR } from
|
|
34
|
-
import { generateThemeColorVariablesCSS, generateVariablesCSS } from
|
|
35
|
-
import { colorService } from
|
|
36
|
-
import { variableService } from
|
|
37
|
-
import { configService } from
|
|
38
|
-
import { loadBreakpointConfig, loadIconsConfig } from
|
|
39
|
-
import type { InteractiveStyles } from
|
|
40
|
-
import {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
24
|
+
} from './lib/server/jsonLoader';
|
|
25
|
+
import { projectPaths } from './lib/server/projectContext';
|
|
26
|
+
import { loadProjectConfig, generateFontCSS, generateFontPreloadTags } from './lib/shared/fontLoader';
|
|
27
|
+
import { FileSystemCMSProvider } from './lib/server/providers/fileSystemCMSProvider';
|
|
28
|
+
import { CMSService } from './lib/server/services/cmsService';
|
|
29
|
+
import { isI18nValue, resolveI18nValue } from './lib/shared/i18n';
|
|
30
|
+
import type { ComponentDefinition, JSONPage, CMSSchema, CMSItem, I18nConfig } from './lib/shared/types';
|
|
31
|
+
import { isItemDraftForLocale } from './lib/shared/types';
|
|
32
|
+
import type { SlugMap } from './lib/shared/slugTranslator';
|
|
33
|
+
import { renderPageSSR } from './lib/server/ssr/ssrRenderer';
|
|
34
|
+
import { generateThemeColorVariablesCSS, generateVariablesCSS } from './lib/server/cssGenerator';
|
|
35
|
+
import { colorService } from './lib/server/services/ColorService';
|
|
36
|
+
import { variableService } from './lib/server/services/VariableService';
|
|
37
|
+
import { configService } from './lib/server/services/configService';
|
|
38
|
+
import { loadBreakpointConfig, loadIconsConfig } from './lib/server/jsonLoader';
|
|
39
|
+
import type { InteractiveStyles } from './lib/shared/types/styles';
|
|
40
|
+
import {
|
|
41
|
+
collectComponentLibraries,
|
|
42
|
+
filterLibrariesByContext,
|
|
43
|
+
mergeLibraries,
|
|
44
|
+
generateLibraryTags,
|
|
45
|
+
} from './lib/shared/libraryLoader';
|
|
46
|
+
import { migrateTemplatesDirectory } from './lib/server/migrateTemplates';
|
|
47
|
+
import { collectAllMappingClasses } from './lib/server/astro/cssCollector';
|
|
48
|
+
import {
|
|
49
|
+
generateAllInteractiveCSS,
|
|
50
|
+
generateUtilityCSS,
|
|
51
|
+
extractUtilityClassesFromHTML,
|
|
52
|
+
} from './lib/shared/cssGeneration';
|
|
53
|
+
import { needsFormHandler, formHandlerScript } from './lib/client/scripts/formHandler';
|
|
45
54
|
|
|
46
55
|
// ---------------------------------------------------------------------------
|
|
47
56
|
// Helpers
|
|
@@ -65,11 +74,7 @@ function writePageScript(javascript: string | undefined, scriptsDir: string): st
|
|
|
65
74
|
return [`/_scripts/${scriptFile}`];
|
|
66
75
|
}
|
|
67
76
|
|
|
68
|
-
function copyDirectory(
|
|
69
|
-
src: string,
|
|
70
|
-
dest: string,
|
|
71
|
-
filter?: (filename: string) => boolean,
|
|
72
|
-
): void {
|
|
77
|
+
function copyDirectory(src: string, dest: string, filter?: (filename: string) => boolean): void {
|
|
73
78
|
if (!existsSync(src)) return;
|
|
74
79
|
if (!existsSync(dest)) mkdirSync(dest, { recursive: true });
|
|
75
80
|
const files = readdirSync(src);
|
|
@@ -95,7 +100,7 @@ function buildCMSItemPath(
|
|
|
95
100
|
item: CMSItem,
|
|
96
101
|
slugField: string,
|
|
97
102
|
locale: string,
|
|
98
|
-
i18nConfig: I18nConfig
|
|
103
|
+
i18nConfig: I18nConfig,
|
|
99
104
|
): string {
|
|
100
105
|
let slug = item[slugField] ?? item._slug ?? item._id;
|
|
101
106
|
if (isI18nValue(slug)) {
|
|
@@ -212,7 +217,10 @@ interface NextBuildStats {
|
|
|
212
217
|
*/
|
|
213
218
|
function metaHtmlToJSX(metaHtml: string): string {
|
|
214
219
|
if (!metaHtml || !metaHtml.trim()) return '';
|
|
215
|
-
const lines = metaHtml
|
|
220
|
+
const lines = metaHtml
|
|
221
|
+
.split(/\r?\n/)
|
|
222
|
+
.map((l) => l.trim())
|
|
223
|
+
.filter(Boolean);
|
|
216
224
|
|
|
217
225
|
const elements: string[] = [];
|
|
218
226
|
for (const line of lines) {
|
|
@@ -232,7 +240,6 @@ function metaHtmlToJSX(metaHtml: string): string {
|
|
|
232
240
|
.map(([k, v]) => `${jsxAttrName(k)}=${JSON.stringify(v)}`)
|
|
233
241
|
.join(' ');
|
|
234
242
|
elements.push(`<${tagName} ${attrParts} />`);
|
|
235
|
-
continue;
|
|
236
243
|
}
|
|
237
244
|
// Unknown tag — skip rather than crash the build.
|
|
238
245
|
}
|
|
@@ -246,15 +253,15 @@ function metaHtmlToJSX(metaHtml: string): string {
|
|
|
246
253
|
*/
|
|
247
254
|
const JSX_ATTR_NAMES: Record<string, string> = {
|
|
248
255
|
'http-equiv': 'httpEquiv',
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
256
|
+
hreflang: 'hrefLang',
|
|
257
|
+
crossorigin: 'crossOrigin',
|
|
258
|
+
referrerpolicy: 'referrerPolicy',
|
|
259
|
+
imagesrcset: 'imageSrcSet',
|
|
260
|
+
imagesizes: 'imageSizes',
|
|
261
|
+
fetchpriority: 'fetchPriority',
|
|
262
|
+
class: 'className',
|
|
263
|
+
for: 'htmlFor',
|
|
264
|
+
charset: 'charSet',
|
|
258
265
|
};
|
|
259
266
|
|
|
260
267
|
function jsxAttrName(name: string): string {
|
|
@@ -395,12 +402,15 @@ export default function Page() {
|
|
|
395
402
|
*/
|
|
396
403
|
function emitNextCMSPage(options: {
|
|
397
404
|
slugs: string[];
|
|
398
|
-
perSlugData: Record<
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
405
|
+
perSlugData: Record<
|
|
406
|
+
string,
|
|
407
|
+
{
|
|
408
|
+
html: string;
|
|
409
|
+
meta: string;
|
|
410
|
+
title: string;
|
|
411
|
+
scriptPaths: string[];
|
|
412
|
+
}
|
|
413
|
+
>;
|
|
404
414
|
locale: string;
|
|
405
415
|
theme: string;
|
|
406
416
|
fontPreloads: string;
|
|
@@ -409,17 +419,8 @@ function emitNextCMSPage(options: {
|
|
|
409
419
|
iconTagsHtml: string;
|
|
410
420
|
formHandlerNeeded: boolean;
|
|
411
421
|
}): string {
|
|
412
|
-
const {
|
|
413
|
-
|
|
414
|
-
perSlugData,
|
|
415
|
-
locale,
|
|
416
|
-
theme,
|
|
417
|
-
fontPreloads,
|
|
418
|
-
libraryTags,
|
|
419
|
-
customCode,
|
|
420
|
-
iconTagsHtml,
|
|
421
|
-
formHandlerNeeded,
|
|
422
|
-
} = options;
|
|
422
|
+
const { slugs, perSlugData, locale, theme, fontPreloads, libraryTags, customCode, iconTagsHtml, formHandlerNeeded } =
|
|
423
|
+
options;
|
|
423
424
|
|
|
424
425
|
const headHtmlBlocks: string[] = [];
|
|
425
426
|
if (iconTagsHtml) headHtmlBlocks.push(iconTagsHtml);
|
|
@@ -451,7 +452,7 @@ function emitNextCMSPage(options: {
|
|
|
451
452
|
metaHtml: \`${escapeTemplateLiteral(data.meta)}\`,
|
|
452
453
|
html: \`${escapeTemplateLiteral(data.html)}\`,
|
|
453
454
|
bodyEndHtml: \`${escapeTemplateLiteral(bodyEndHtml)}\`,
|
|
454
|
-
}
|
|
455
|
+
}`,
|
|
455
456
|
);
|
|
456
457
|
}
|
|
457
458
|
|
|
@@ -502,7 +503,9 @@ export default async function Page({ params }: { params: Promise<{ slug: string
|
|
|
502
503
|
`;
|
|
503
504
|
}
|
|
504
505
|
|
|
505
|
-
function cmsRawHeadImport(_options: {
|
|
506
|
+
function cmsRawHeadImport(_options: {
|
|
507
|
+
/* keep for future depth handling */
|
|
508
|
+
}): string {
|
|
506
509
|
// CMS files live two levels under app/ (e.g. app/blog/[slug]/page.tsx), so
|
|
507
510
|
// the relative path to app/components/RawHead.tsx is "../../components/RawHead".
|
|
508
511
|
// When the URL pattern's path prefix is empty (e.g. "/[slug]"), they live at
|
|
@@ -512,7 +515,9 @@ function cmsRawHeadImport(_options: { /* keep for future depth handling */ }): s
|
|
|
512
515
|
return '../../components/RawHead';
|
|
513
516
|
}
|
|
514
517
|
|
|
515
|
-
function cmsMetaTagsImport(_options: {
|
|
518
|
+
function cmsMetaTagsImport(_options: {
|
|
519
|
+
/* placeholder */
|
|
520
|
+
}): string {
|
|
516
521
|
return '../../components/MetaTags';
|
|
517
522
|
}
|
|
518
523
|
|
|
@@ -520,10 +525,7 @@ function cmsMetaTagsImport(_options: { /* placeholder */ }): string {
|
|
|
520
525
|
// Main export
|
|
521
526
|
// ---------------------------------------------------------------------------
|
|
522
527
|
|
|
523
|
-
export async function buildNextProject(
|
|
524
|
-
projectRoot?: string,
|
|
525
|
-
outputDir?: string
|
|
526
|
-
): Promise<NextBuildStats> {
|
|
528
|
+
export async function buildNextProject(projectRoot?: string, outputDir?: string): Promise<NextBuildStats> {
|
|
527
529
|
// ----------------------------------------------------------
|
|
528
530
|
// 1. Setup: load project configuration
|
|
529
531
|
// ----------------------------------------------------------
|
|
@@ -538,7 +540,9 @@ export async function buildNextProject(
|
|
|
538
540
|
|
|
539
541
|
const { components, warnings, errors: compErrors } = await loadComponentDirectory(projectPaths.components());
|
|
540
542
|
const globalComponents: Record<string, ComponentDefinition> = {};
|
|
541
|
-
components.forEach((value, key) => {
|
|
543
|
+
components.forEach((value, key) => {
|
|
544
|
+
globalComponents[key] = value;
|
|
545
|
+
});
|
|
542
546
|
for (const w of warnings) console.warn(` Warning: ${w}`);
|
|
543
547
|
for (const e of compErrors) console.error(` Error: ${e}`);
|
|
544
548
|
|
|
@@ -600,7 +604,9 @@ export async function buildNextProject(
|
|
|
600
604
|
const pageId = basePath === '/' ? 'index' : basePath.substring(1);
|
|
601
605
|
slugMappings.push({ pageId, slugs: pageData.meta.slugs });
|
|
602
606
|
}
|
|
603
|
-
} catch {
|
|
607
|
+
} catch {
|
|
608
|
+
/* ignore parse errors in first pass */
|
|
609
|
+
}
|
|
604
610
|
}
|
|
605
611
|
|
|
606
612
|
// ----------------------------------------------------------
|
|
@@ -623,7 +629,15 @@ export async function buildNextProject(
|
|
|
623
629
|
}
|
|
624
630
|
|
|
625
631
|
function recordRender(
|
|
626
|
-
result: {
|
|
632
|
+
result: {
|
|
633
|
+
html: string;
|
|
634
|
+
meta: string;
|
|
635
|
+
title: string;
|
|
636
|
+
javascript: string;
|
|
637
|
+
componentCSS?: string;
|
|
638
|
+
locale: string;
|
|
639
|
+
interactiveStylesMap: Map<string, InteractiveStyles>;
|
|
640
|
+
},
|
|
627
641
|
urlPath: string,
|
|
628
642
|
pageData?: JSONPage,
|
|
629
643
|
pageName?: string,
|
|
@@ -691,8 +705,12 @@ export async function buildNextProject(
|
|
|
691
705
|
}
|
|
692
706
|
|
|
693
707
|
const urlPath = isDefault
|
|
694
|
-
?
|
|
695
|
-
|
|
708
|
+
? slug === ''
|
|
709
|
+
? '/'
|
|
710
|
+
: `/${slug}`
|
|
711
|
+
: slug === ''
|
|
712
|
+
? `/${locale}`
|
|
713
|
+
: `/${locale}/${slug}`;
|
|
696
714
|
|
|
697
715
|
const result = await renderPageSSR(
|
|
698
716
|
pageData,
|
|
@@ -704,7 +722,7 @@ export async function buildNextProject(
|
|
|
704
722
|
slugMappings,
|
|
705
723
|
undefined,
|
|
706
724
|
cmsService,
|
|
707
|
-
true
|
|
725
|
+
true,
|
|
708
726
|
);
|
|
709
727
|
|
|
710
728
|
recordRender(result, urlPath, pageData, pageName);
|
|
@@ -785,7 +803,7 @@ export async function buildNextProject(
|
|
|
785
803
|
const cmsEmissions: CMSEmission[] = [];
|
|
786
804
|
|
|
787
805
|
if (existsSync(templatesDir)) {
|
|
788
|
-
const templateFiles = readdirSync(templatesDir).filter(f => f.endsWith('.json'));
|
|
806
|
+
const templateFiles = readdirSync(templatesDir).filter((f) => f.endsWith('.json'));
|
|
789
807
|
|
|
790
808
|
for (const file of templateFiles) {
|
|
791
809
|
const templateContent = await loadJSONFile(join(templatesDir, file));
|
|
@@ -811,9 +829,8 @@ export async function buildNextProject(
|
|
|
811
829
|
const items = await cmsService.queryItems({ collection: cmsSchema.id });
|
|
812
830
|
const urlPatternWithoutSlash = cmsSchema.urlPattern.replace(/^\//, '');
|
|
813
831
|
const slugPlaceholderIdx = urlPatternWithoutSlash.indexOf('{{');
|
|
814
|
-
const pathPrefix =
|
|
815
|
-
? urlPatternWithoutSlash.substring(0, slugPlaceholderIdx).replace(/\/$/, '')
|
|
816
|
-
: '';
|
|
832
|
+
const pathPrefix =
|
|
833
|
+
slugPlaceholderIdx > 0 ? urlPatternWithoutSlash.substring(0, slugPlaceholderIdx).replace(/\/$/, '') : '';
|
|
817
834
|
|
|
818
835
|
for (const localeEntry of i18nConfig.locales) {
|
|
819
836
|
const localeCode = localeEntry.code;
|
|
@@ -839,7 +856,7 @@ export async function buildNextProject(
|
|
|
839
856
|
slugMappings,
|
|
840
857
|
{ cms: itemWithUrl },
|
|
841
858
|
cmsService,
|
|
842
|
-
true
|
|
859
|
+
true,
|
|
843
860
|
);
|
|
844
861
|
|
|
845
862
|
mergeInteractiveStyles(result.interactiveStylesMap);
|
|
@@ -912,12 +929,14 @@ export async function buildNextProject(
|
|
|
912
929
|
const themeColorCSS = generateThemeColorVariablesCSS(themeConfig);
|
|
913
930
|
const variablesCSS = generateVariablesCSS(variablesConfig, breakpoints, responsiveScales);
|
|
914
931
|
const componentCSSCombined = Array.from(allComponentCSS).join('\n');
|
|
915
|
-
const utilityCSS =
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
932
|
+
const utilityCSS =
|
|
933
|
+
allUtilityClasses.size > 0
|
|
934
|
+
? generateUtilityCSS(allUtilityClasses, breakpoints, responsiveScales, remConversionConfig)
|
|
935
|
+
: '';
|
|
936
|
+
const interactiveStylesCSS =
|
|
937
|
+
allInteractiveStyles.size > 0
|
|
938
|
+
? generateAllInteractiveCSS(allInteractiveStyles, breakpoints, remConversionConfig, responsiveScales)
|
|
939
|
+
: '';
|
|
921
940
|
|
|
922
941
|
const baseCSS = `@layer base {
|
|
923
942
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
@@ -948,7 +967,9 @@ export async function buildNextProject(
|
|
|
948
967
|
utilityCSS,
|
|
949
968
|
componentCSSCombined,
|
|
950
969
|
interactiveStylesCSS,
|
|
951
|
-
]
|
|
970
|
+
]
|
|
971
|
+
.filter(Boolean)
|
|
972
|
+
.join('\n\n');
|
|
952
973
|
|
|
953
974
|
await writeFile(join(appDir, 'globals.css'), globalCSS, 'utf-8');
|
|
954
975
|
|
|
@@ -1091,9 +1112,7 @@ export default function MetaTags({ html }: { html: string }) {
|
|
|
1091
1112
|
// 10. Emit regular page files (app/<path>/page.tsx)
|
|
1092
1113
|
// ----------------------------------------------------------
|
|
1093
1114
|
for (const result of allResults) {
|
|
1094
|
-
const scriptPaths: string[] = result.javascript
|
|
1095
|
-
? [`/_scripts/${hashContent(result.javascript)}.js`]
|
|
1096
|
-
: [];
|
|
1115
|
+
const scriptPaths: string[] = result.javascript ? [`/_scripts/${hashContent(result.javascript)}.js`] : [];
|
|
1097
1116
|
|
|
1098
1117
|
const route = urlPathToAppRoute(result.urlPath);
|
|
1099
1118
|
const targetDir = route.isRoot ? appDir : join(appDir, route.dir);
|
|
@@ -1123,7 +1142,7 @@ export default function MetaTags({ html }: { html: string }) {
|
|
|
1123
1142
|
});
|
|
1124
1143
|
content = content.replace(
|
|
1125
1144
|
"import RawHead from '../components/RawHead';",
|
|
1126
|
-
`import RawHead from '${rawHeadImportPath}'
|
|
1145
|
+
`import RawHead from '${rawHeadImportPath}';`,
|
|
1127
1146
|
);
|
|
1128
1147
|
|
|
1129
1148
|
await writeFile(pageFilePath, content, 'utf-8');
|
|
@@ -1298,17 +1317,11 @@ export default nextConfig;
|
|
|
1298
1317
|
await writeFile(
|
|
1299
1318
|
join(outDir, 'next-env.d.ts'),
|
|
1300
1319
|
`/// <reference types="next" />\n/// <reference types="next/image-types/global" />\n`,
|
|
1301
|
-
'utf-8'
|
|
1320
|
+
'utf-8',
|
|
1302
1321
|
);
|
|
1303
1322
|
|
|
1304
1323
|
// .gitignore — keep the exported project clean when committed.
|
|
1305
|
-
const gitignore = [
|
|
1306
|
-
'node_modules',
|
|
1307
|
-
'.next',
|
|
1308
|
-
'out',
|
|
1309
|
-
'.DS_Store',
|
|
1310
|
-
'*.log',
|
|
1311
|
-
].join('\n') + '\n';
|
|
1324
|
+
const gitignore = ['node_modules', '.next', 'out', '.DS_Store', '*.log'].join('\n') + '\n';
|
|
1312
1325
|
await writeFile(join(outDir, '.gitignore'), gitignore, 'utf-8');
|
|
1313
1326
|
|
|
1314
1327
|
// README — quick start, mirrors what Astro export ships.
|
package/build-static.test.ts
CHANGED
|
@@ -71,7 +71,7 @@ describe('formatBunLog', () => {
|
|
|
71
71
|
test('formats log with position info', () => {
|
|
72
72
|
const log = {
|
|
73
73
|
position: { file: 'src/app.ts', line: 42, column: 10, lineText: 'const x = y;' },
|
|
74
|
-
message: 'Variable not found'
|
|
74
|
+
message: 'Variable not found',
|
|
75
75
|
};
|
|
76
76
|
const result = formatBunLog(log);
|
|
77
77
|
expect(result).toContain('File: src/app.ts');
|
|
@@ -110,7 +110,7 @@ describe('formatBunLog', () => {
|
|
|
110
110
|
test('handles position without lineText', () => {
|
|
111
111
|
const log = {
|
|
112
112
|
position: { file: 'index.ts', line: 1 },
|
|
113
|
-
message: 'Error'
|
|
113
|
+
message: 'Error',
|
|
114
114
|
};
|
|
115
115
|
const result = formatBunLog(log);
|
|
116
116
|
expect(result).toContain('File: index.ts');
|
|
@@ -160,6 +160,21 @@ describe('getLocalizedOutputPath', () => {
|
|
|
160
160
|
test('deep nested path with default locale', () => {
|
|
161
161
|
expect(getLocalizedOutputPath('/blog/post', 'en', 'en', dist)).toBe('/project/dist/blog/post.html');
|
|
162
162
|
});
|
|
163
|
+
|
|
164
|
+
test('normalizes "/" slug to index.html (path-like slug from editor)', () => {
|
|
165
|
+
const slugs = { en: '/' };
|
|
166
|
+
expect(getLocalizedOutputPath('/', 'en', 'en', dist, slugs)).toBe('/project/dist/index.html');
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
test('normalizes leading-slash slug', () => {
|
|
170
|
+
const slugs = { en: '/privacy' };
|
|
171
|
+
expect(getLocalizedOutputPath('/privacy', 'en', 'en', dist, slugs)).toBe('/project/dist/privacy.html');
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
test('normalizes trailing-slash slug', () => {
|
|
175
|
+
const slugs = { en: 'privacy/' };
|
|
176
|
+
expect(getLocalizedOutputPath('/privacy', 'en', 'en', dist, slugs)).toBe('/project/dist/privacy.html');
|
|
177
|
+
});
|
|
163
178
|
});
|
|
164
179
|
|
|
165
180
|
// ============================================================================
|
|
@@ -197,6 +212,16 @@ describe('getDisplayPath', () => {
|
|
|
197
212
|
const slugs = { en: 'about' };
|
|
198
213
|
expect(getDisplayPath('/about', 'de', 'en', slugs)).toBe('/de/about');
|
|
199
214
|
});
|
|
215
|
+
|
|
216
|
+
test('normalizes "/" slug to root path', () => {
|
|
217
|
+
const slugs = { en: '/' };
|
|
218
|
+
expect(getDisplayPath('/', 'en', 'en', slugs)).toBe('/');
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
test('normalizes leading-slash slug', () => {
|
|
222
|
+
const slugs = { en: '/privacy' };
|
|
223
|
+
expect(getDisplayPath('/privacy', 'en', 'en', slugs)).toBe('/privacy');
|
|
224
|
+
});
|
|
200
225
|
});
|
|
201
226
|
|
|
202
227
|
// ============================================================================
|
|
@@ -208,9 +233,9 @@ describe('isCMSPage', () => {
|
|
|
208
233
|
const page = {
|
|
209
234
|
meta: {
|
|
210
235
|
source: 'cms',
|
|
211
|
-
cms: { id: 'blog', urlPattern: '/blog/{{slug}}', slugField: 'slug' }
|
|
236
|
+
cms: { id: 'blog', urlPattern: '/blog/{{slug}}', slugField: 'slug' },
|
|
212
237
|
},
|
|
213
|
-
nodes: []
|
|
238
|
+
nodes: [],
|
|
214
239
|
} as unknown as JSONPage;
|
|
215
240
|
expect(isCMSPage(page)).toBe(true);
|
|
216
241
|
});
|
|
@@ -218,7 +243,7 @@ describe('isCMSPage', () => {
|
|
|
218
243
|
test('returns false when source is not cms', () => {
|
|
219
244
|
const page = {
|
|
220
245
|
meta: { title: 'About' },
|
|
221
|
-
nodes: []
|
|
246
|
+
nodes: [],
|
|
222
247
|
} as unknown as JSONPage;
|
|
223
248
|
expect(isCMSPage(page)).toBe(false);
|
|
224
249
|
});
|
|
@@ -226,7 +251,7 @@ describe('isCMSPage', () => {
|
|
|
226
251
|
test('returns false when source is cms but cms config is missing', () => {
|
|
227
252
|
const page = {
|
|
228
253
|
meta: { source: 'cms' },
|
|
229
|
-
nodes: []
|
|
254
|
+
nodes: [],
|
|
230
255
|
} as unknown as JSONPage;
|
|
231
256
|
expect(isCMSPage(page)).toBe(false);
|
|
232
257
|
});
|
|
@@ -249,7 +274,10 @@ describe('isCMSPage', () => {
|
|
|
249
274
|
describe('buildCMSItemPath', () => {
|
|
250
275
|
const defaultI18nConfig: I18nConfig = {
|
|
251
276
|
defaultLocale: 'en',
|
|
252
|
-
locales: [
|
|
277
|
+
locales: [
|
|
278
|
+
{ code: 'en', name: 'English' },
|
|
279
|
+
{ code: 'fr', name: 'French' },
|
|
280
|
+
],
|
|
253
281
|
};
|
|
254
282
|
|
|
255
283
|
test('replaces {{slug}} with item slug field', () => {
|
|
@@ -280,7 +308,7 @@ describe('buildCMSItemPath', () => {
|
|
|
280
308
|
const item: CMSItem = {
|
|
281
309
|
_id: '1',
|
|
282
310
|
_slug: { _i18n: true, en: 'hello', fr: 'bonjour' },
|
|
283
|
-
title: 'Test'
|
|
311
|
+
title: 'Test',
|
|
284
312
|
};
|
|
285
313
|
const result = buildCMSItemPath('/page/{{slug}}', item, '_slug', 'fr', defaultI18nConfig);
|
|
286
314
|
expect(result).toBe('/page/bonjour');
|
|
@@ -290,7 +318,7 @@ describe('buildCMSItemPath', () => {
|
|
|
290
318
|
const item: CMSItem = {
|
|
291
319
|
_id: '1',
|
|
292
320
|
_slug: { _i18n: true, en: 'hello', fr: 'bonjour' },
|
|
293
|
-
title: 'Test'
|
|
321
|
+
title: 'Test',
|
|
294
322
|
};
|
|
295
323
|
const result = buildCMSItemPath('/page/{{slug}}', item, '_slug', 'en', defaultI18nConfig);
|
|
296
324
|
expect(result).toBe('/page/hello');
|
|
@@ -316,7 +344,8 @@ describe('injectTrackingScript', () => {
|
|
|
316
344
|
});
|
|
317
345
|
|
|
318
346
|
test('preserves existing head content', () => {
|
|
319
|
-
const html =
|
|
347
|
+
const html =
|
|
348
|
+
'<html><head><meta charset="utf-8"><link rel="stylesheet" href="style.css"></head><body></body></html>';
|
|
320
349
|
const script = 'track()';
|
|
321
350
|
const result = injectTrackingScript(html, script);
|
|
322
351
|
expect(result).toContain('<meta charset="utf-8">');
|