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
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { test, expect, describe, beforeEach, afterEach, mock } from
|
|
2
|
-
import { navigateTo, createNavigationHandler } from
|
|
1
|
+
import { test, expect, describe, beforeEach, afterEach, mock } from 'bun:test';
|
|
2
|
+
import { navigateTo, createNavigationHandler } from './navigation';
|
|
3
3
|
|
|
4
4
|
// Setup browser-like environment
|
|
5
5
|
function setupWindowMock() {
|
|
@@ -21,7 +21,7 @@ function setupWindowMock() {
|
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
describe(
|
|
24
|
+
describe('Navigation - navigateTo', () => {
|
|
25
25
|
let originalPushState: any;
|
|
26
26
|
let originalDispatchEvent: any;
|
|
27
27
|
let pushStateCalls: Array<{ state: any; title: string; url: string }>;
|
|
@@ -29,20 +29,20 @@ describe("Navigation - navigateTo", () => {
|
|
|
29
29
|
|
|
30
30
|
beforeEach(() => {
|
|
31
31
|
setupWindowMock();
|
|
32
|
-
|
|
32
|
+
|
|
33
33
|
// Save originals
|
|
34
34
|
originalPushState = (globalThis as any).window.history.pushState;
|
|
35
35
|
originalDispatchEvent = (globalThis as any).window.dispatchEvent;
|
|
36
|
-
|
|
36
|
+
|
|
37
37
|
// Track calls
|
|
38
38
|
pushStateCalls = [];
|
|
39
39
|
dispatchedEvents = [];
|
|
40
|
-
|
|
40
|
+
|
|
41
41
|
// Mock pushState
|
|
42
42
|
(globalThis as any).window.history.pushState = mock((state: any, title: string, url: string) => {
|
|
43
43
|
pushStateCalls.push({ state, title, url });
|
|
44
44
|
}) as any;
|
|
45
|
-
|
|
45
|
+
|
|
46
46
|
// Mock dispatchEvent
|
|
47
47
|
(globalThis as any).window.dispatchEvent = mock((event: Event) => {
|
|
48
48
|
dispatchedEvents.push(event);
|
|
@@ -58,57 +58,57 @@ describe("Navigation - navigateTo", () => {
|
|
|
58
58
|
}
|
|
59
59
|
});
|
|
60
60
|
|
|
61
|
-
test(
|
|
62
|
-
navigateTo(
|
|
63
|
-
|
|
61
|
+
test('should navigate to root path', () => {
|
|
62
|
+
navigateTo('/');
|
|
63
|
+
|
|
64
64
|
expect(pushStateCalls.length).toBe(1);
|
|
65
|
-
expect(pushStateCalls[0].url).toBe(
|
|
65
|
+
expect(pushStateCalls[0].url).toBe('/');
|
|
66
66
|
expect(dispatchedEvents.length).toBe(1);
|
|
67
|
-
expect(dispatchedEvents[0].type).toBe(
|
|
67
|
+
expect(dispatchedEvents[0].type).toBe('popstate');
|
|
68
68
|
});
|
|
69
69
|
|
|
70
|
-
test(
|
|
71
|
-
navigateTo(
|
|
72
|
-
|
|
70
|
+
test('should navigate to nested path', () => {
|
|
71
|
+
navigateTo('/about');
|
|
72
|
+
|
|
73
73
|
expect(pushStateCalls.length).toBe(1);
|
|
74
|
-
expect(pushStateCalls[0].url).toBe(
|
|
75
|
-
expect(dispatchedEvents[0].type).toBe(
|
|
74
|
+
expect(pushStateCalls[0].url).toBe('/about');
|
|
75
|
+
expect(dispatchedEvents[0].type).toBe('popstate');
|
|
76
76
|
});
|
|
77
77
|
|
|
78
|
-
test(
|
|
79
|
-
navigateTo(
|
|
80
|
-
|
|
81
|
-
expect(pushStateCalls[0].url).toBe(
|
|
78
|
+
test('should navigate to deeply nested path', () => {
|
|
79
|
+
navigateTo('/blog/post-1');
|
|
80
|
+
|
|
81
|
+
expect(pushStateCalls[0].url).toBe('/blog/post-1');
|
|
82
82
|
});
|
|
83
83
|
|
|
84
|
-
test(
|
|
85
|
-
navigateTo(
|
|
86
|
-
|
|
84
|
+
test('should call pushState with empty state object', () => {
|
|
85
|
+
navigateTo('/test');
|
|
86
|
+
|
|
87
87
|
expect(pushStateCalls[0].state).toEqual({});
|
|
88
|
-
expect(pushStateCalls[0].title).toBe(
|
|
88
|
+
expect(pushStateCalls[0].title).toBe('');
|
|
89
89
|
});
|
|
90
90
|
|
|
91
|
-
test(
|
|
92
|
-
navigateTo(
|
|
93
|
-
|
|
91
|
+
test('should dispatch PopStateEvent', () => {
|
|
92
|
+
navigateTo('/test');
|
|
93
|
+
|
|
94
94
|
expect(dispatchedEvents.length).toBe(1);
|
|
95
95
|
expect(dispatchedEvents[0]).toBeInstanceOf(PopStateEvent);
|
|
96
96
|
});
|
|
97
97
|
|
|
98
|
-
test(
|
|
99
|
-
navigateTo(
|
|
100
|
-
|
|
101
|
-
expect(pushStateCalls[0].url).toBe(
|
|
98
|
+
test('should handle path with query string', () => {
|
|
99
|
+
navigateTo('/search?q=test');
|
|
100
|
+
|
|
101
|
+
expect(pushStateCalls[0].url).toBe('/search?q=test');
|
|
102
102
|
});
|
|
103
103
|
|
|
104
|
-
test(
|
|
105
|
-
navigateTo(
|
|
106
|
-
|
|
107
|
-
expect(pushStateCalls[0].url).toBe(
|
|
104
|
+
test('should handle path with hash', () => {
|
|
105
|
+
navigateTo('/page#section');
|
|
106
|
+
|
|
107
|
+
expect(pushStateCalls[0].url).toBe('/page#section');
|
|
108
108
|
});
|
|
109
109
|
});
|
|
110
110
|
|
|
111
|
-
describe(
|
|
111
|
+
describe('Navigation - createNavigationHandler', () => {
|
|
112
112
|
let originalPushState: any;
|
|
113
113
|
let originalDispatchEvent: any;
|
|
114
114
|
let pushStateCalls: Array<{ url: string }>;
|
|
@@ -118,14 +118,14 @@ describe("Navigation - createNavigationHandler", () => {
|
|
|
118
118
|
setupWindowMock();
|
|
119
119
|
originalPushState = (globalThis as any).window.history.pushState;
|
|
120
120
|
originalDispatchEvent = (globalThis as any).window.dispatchEvent;
|
|
121
|
-
|
|
121
|
+
|
|
122
122
|
pushStateCalls = [];
|
|
123
123
|
preventDefaultCalled = false;
|
|
124
|
-
|
|
124
|
+
|
|
125
125
|
(globalThis as any).window.history.pushState = mock((state: any, title: string, url: string) => {
|
|
126
126
|
pushStateCalls.push({ url });
|
|
127
127
|
}) as any;
|
|
128
|
-
|
|
128
|
+
|
|
129
129
|
(globalThis as any).window.dispatchEvent = mock(() => true);
|
|
130
130
|
});
|
|
131
131
|
|
|
@@ -136,78 +136,78 @@ describe("Navigation - createNavigationHandler", () => {
|
|
|
136
136
|
}
|
|
137
137
|
});
|
|
138
138
|
|
|
139
|
-
test(
|
|
140
|
-
const handler = createNavigationHandler(
|
|
139
|
+
test('should create handler that prevents default', () => {
|
|
140
|
+
const handler = createNavigationHandler('/test');
|
|
141
141
|
const mockEvent = {
|
|
142
142
|
preventDefault: mock(() => {
|
|
143
143
|
preventDefaultCalled = true;
|
|
144
|
-
})
|
|
144
|
+
}),
|
|
145
145
|
} as any;
|
|
146
|
-
|
|
146
|
+
|
|
147
147
|
handler(mockEvent);
|
|
148
|
-
|
|
148
|
+
|
|
149
149
|
expect(preventDefaultCalled).toBe(true);
|
|
150
150
|
expect(mockEvent.preventDefault).toHaveBeenCalled();
|
|
151
151
|
});
|
|
152
152
|
|
|
153
|
-
test(
|
|
154
|
-
const handler = createNavigationHandler(
|
|
153
|
+
test('should create handler that navigates to path', () => {
|
|
154
|
+
const handler = createNavigationHandler('/about');
|
|
155
155
|
const mockEvent = {
|
|
156
|
-
preventDefault: mock(() => {})
|
|
156
|
+
preventDefault: mock(() => {}),
|
|
157
157
|
} as any;
|
|
158
|
-
|
|
158
|
+
|
|
159
159
|
handler(mockEvent);
|
|
160
|
-
|
|
160
|
+
|
|
161
161
|
expect(pushStateCalls.length).toBe(1);
|
|
162
|
-
expect(pushStateCalls[0].url).toBe(
|
|
162
|
+
expect(pushStateCalls[0].url).toBe('/about');
|
|
163
163
|
});
|
|
164
164
|
|
|
165
|
-
test(
|
|
166
|
-
const handler = createNavigationHandler(
|
|
165
|
+
test('should prevent default before navigating', () => {
|
|
166
|
+
const handler = createNavigationHandler('/test');
|
|
167
167
|
let preventDefaultCalledFirst = false;
|
|
168
168
|
let navigationCalledFirst = false;
|
|
169
|
-
|
|
169
|
+
|
|
170
170
|
const mockEvent = {
|
|
171
171
|
preventDefault: mock(() => {
|
|
172
172
|
preventDefaultCalledFirst = !navigationCalledFirst;
|
|
173
|
-
})
|
|
173
|
+
}),
|
|
174
174
|
} as any;
|
|
175
|
-
|
|
175
|
+
|
|
176
176
|
const originalPushState = (globalThis as any).window.history.pushState;
|
|
177
177
|
(globalThis as any).window.history.pushState = mock(() => {
|
|
178
178
|
navigationCalledFirst = !preventDefaultCalledFirst;
|
|
179
179
|
}) as any;
|
|
180
|
-
|
|
180
|
+
|
|
181
181
|
handler(mockEvent);
|
|
182
|
-
|
|
182
|
+
|
|
183
183
|
// preventDefault should be called before navigation
|
|
184
184
|
expect(preventDefaultCalledFirst).toBe(true);
|
|
185
185
|
});
|
|
186
186
|
|
|
187
|
-
test(
|
|
188
|
-
const handler = createNavigationHandler(
|
|
187
|
+
test('should handle root path in handler', () => {
|
|
188
|
+
const handler = createNavigationHandler('/');
|
|
189
189
|
const mockEvent = {
|
|
190
|
-
preventDefault: mock(() => {})
|
|
190
|
+
preventDefault: mock(() => {}),
|
|
191
191
|
} as any;
|
|
192
|
-
|
|
192
|
+
|
|
193
193
|
handler(mockEvent);
|
|
194
|
-
|
|
195
|
-
expect(pushStateCalls[0].url).toBe(
|
|
194
|
+
|
|
195
|
+
expect(pushStateCalls[0].url).toBe('/');
|
|
196
196
|
});
|
|
197
197
|
|
|
198
|
-
test(
|
|
199
|
-
const handler = createNavigationHandler(
|
|
198
|
+
test('should handle nested paths in handler', () => {
|
|
199
|
+
const handler = createNavigationHandler('/blog/post-1');
|
|
200
200
|
const mockEvent = {
|
|
201
|
-
preventDefault: mock(() => {})
|
|
201
|
+
preventDefault: mock(() => {}),
|
|
202
202
|
} as any;
|
|
203
|
-
|
|
203
|
+
|
|
204
204
|
handler(mockEvent);
|
|
205
|
-
|
|
206
|
-
expect(pushStateCalls[0].url).toBe(
|
|
205
|
+
|
|
206
|
+
expect(pushStateCalls[0].url).toBe('/blog/post-1');
|
|
207
207
|
});
|
|
208
208
|
});
|
|
209
209
|
|
|
210
|
-
describe(
|
|
210
|
+
describe('Navigation - Path handling', () => {
|
|
211
211
|
let originalPushState: any;
|
|
212
212
|
let originalDispatchEvent: any;
|
|
213
213
|
|
|
@@ -215,7 +215,7 @@ describe("Navigation - Path handling", () => {
|
|
|
215
215
|
setupWindowMock();
|
|
216
216
|
originalPushState = (globalThis as any).window.history.pushState;
|
|
217
217
|
originalDispatchEvent = (globalThis as any).window.dispatchEvent;
|
|
218
|
-
|
|
218
|
+
|
|
219
219
|
(globalThis as any).window.history.pushState = mock(() => {}) as any;
|
|
220
220
|
(globalThis as any).window.dispatchEvent = mock(() => true);
|
|
221
221
|
});
|
|
@@ -227,151 +227,151 @@ describe("Navigation - Path handling", () => {
|
|
|
227
227
|
}
|
|
228
228
|
});
|
|
229
229
|
|
|
230
|
-
describe(
|
|
231
|
-
test(
|
|
230
|
+
describe('Root path handling', () => {
|
|
231
|
+
test('should navigate to root path correctly', () => {
|
|
232
232
|
const pushStateCalls: Array<{ url: string }> = [];
|
|
233
233
|
(globalThis as any).window.history.pushState = mock((state: any, title: string, url: string) => {
|
|
234
234
|
pushStateCalls.push({ url });
|
|
235
235
|
}) as any;
|
|
236
|
-
|
|
237
|
-
navigateTo(
|
|
238
|
-
|
|
239
|
-
expect(pushStateCalls[0].url).toBe(
|
|
236
|
+
|
|
237
|
+
navigateTo('/');
|
|
238
|
+
|
|
239
|
+
expect(pushStateCalls[0].url).toBe('/');
|
|
240
240
|
});
|
|
241
241
|
|
|
242
|
-
test(
|
|
243
|
-
const handler = createNavigationHandler(
|
|
242
|
+
test('should handle root path with handler', () => {
|
|
243
|
+
const handler = createNavigationHandler('/');
|
|
244
244
|
const pushStateCalls: Array<{ url: string }> = [];
|
|
245
245
|
(globalThis as any).window.history.pushState = mock((state: any, title: string, url: string) => {
|
|
246
246
|
pushStateCalls.push({ url });
|
|
247
247
|
}) as any;
|
|
248
|
-
|
|
248
|
+
|
|
249
249
|
const mockEvent = {
|
|
250
|
-
preventDefault: mock(() => {})
|
|
250
|
+
preventDefault: mock(() => {}),
|
|
251
251
|
} as any;
|
|
252
|
-
|
|
252
|
+
|
|
253
253
|
handler(mockEvent);
|
|
254
|
-
|
|
255
|
-
expect(pushStateCalls[0].url).toBe(
|
|
254
|
+
|
|
255
|
+
expect(pushStateCalls[0].url).toBe('/');
|
|
256
256
|
});
|
|
257
257
|
});
|
|
258
258
|
|
|
259
|
-
describe(
|
|
260
|
-
test(
|
|
259
|
+
describe('Nested paths handling', () => {
|
|
260
|
+
test('should handle single level nested path', () => {
|
|
261
261
|
const pushStateCalls: Array<{ url: string }> = [];
|
|
262
262
|
(globalThis as any).window.history.pushState = mock((state: any, title: string, url: string) => {
|
|
263
263
|
pushStateCalls.push({ url });
|
|
264
264
|
}) as any;
|
|
265
|
-
|
|
266
|
-
navigateTo(
|
|
267
|
-
|
|
268
|
-
expect(pushStateCalls[0].url).toBe(
|
|
265
|
+
|
|
266
|
+
navigateTo('/about');
|
|
267
|
+
|
|
268
|
+
expect(pushStateCalls[0].url).toBe('/about');
|
|
269
269
|
});
|
|
270
270
|
|
|
271
|
-
test(
|
|
271
|
+
test('should handle multi-level nested paths', () => {
|
|
272
272
|
const pushStateCalls: Array<{ url: string }> = [];
|
|
273
273
|
(globalThis as any).window.history.pushState = mock((state: any, title: string, url: string) => {
|
|
274
274
|
pushStateCalls.push({ url });
|
|
275
275
|
}) as any;
|
|
276
|
-
|
|
277
|
-
navigateTo(
|
|
278
|
-
|
|
279
|
-
expect(pushStateCalls[0].url).toBe(
|
|
276
|
+
|
|
277
|
+
navigateTo('/blog/category/post-1');
|
|
278
|
+
|
|
279
|
+
expect(pushStateCalls[0].url).toBe('/blog/category/post-1');
|
|
280
280
|
});
|
|
281
281
|
|
|
282
|
-
test(
|
|
282
|
+
test('should handle paths with trailing slash', () => {
|
|
283
283
|
const pushStateCalls: Array<{ url: string }> = [];
|
|
284
284
|
(globalThis as any).window.history.pushState = mock((state: any, title: string, url: string) => {
|
|
285
285
|
pushStateCalls.push({ url });
|
|
286
286
|
}) as any;
|
|
287
|
-
|
|
288
|
-
navigateTo(
|
|
289
|
-
|
|
290
|
-
expect(pushStateCalls[0].url).toBe(
|
|
287
|
+
|
|
288
|
+
navigateTo('/about/');
|
|
289
|
+
|
|
290
|
+
expect(pushStateCalls[0].url).toBe('/about/');
|
|
291
291
|
});
|
|
292
292
|
});
|
|
293
293
|
|
|
294
|
-
describe(
|
|
295
|
-
test(
|
|
294
|
+
describe('Special path handling', () => {
|
|
295
|
+
test('should handle paths with query parameters', () => {
|
|
296
296
|
const pushStateCalls: Array<{ url: string }> = [];
|
|
297
297
|
(globalThis as any).window.history.pushState = mock((state: any, title: string, url: string) => {
|
|
298
298
|
pushStateCalls.push({ url });
|
|
299
299
|
}) as any;
|
|
300
|
-
|
|
301
|
-
navigateTo(
|
|
302
|
-
|
|
303
|
-
expect(pushStateCalls[0].url).toBe(
|
|
300
|
+
|
|
301
|
+
navigateTo('/search?q=test&page=1');
|
|
302
|
+
|
|
303
|
+
expect(pushStateCalls[0].url).toBe('/search?q=test&page=1');
|
|
304
304
|
});
|
|
305
305
|
|
|
306
|
-
test(
|
|
306
|
+
test('should handle paths with hash fragments', () => {
|
|
307
307
|
const pushStateCalls: Array<{ url: string }> = [];
|
|
308
308
|
(globalThis as any).window.history.pushState = mock((state: any, title: string, url: string) => {
|
|
309
309
|
pushStateCalls.push({ url });
|
|
310
310
|
}) as any;
|
|
311
|
-
|
|
312
|
-
navigateTo(
|
|
313
|
-
|
|
314
|
-
expect(pushStateCalls[0].url).toBe(
|
|
311
|
+
|
|
312
|
+
navigateTo('/page#section');
|
|
313
|
+
|
|
314
|
+
expect(pushStateCalls[0].url).toBe('/page#section');
|
|
315
315
|
});
|
|
316
316
|
|
|
317
|
-
test(
|
|
317
|
+
test('should handle paths with both query and hash', () => {
|
|
318
318
|
const pushStateCalls: Array<{ url: string }> = [];
|
|
319
319
|
(globalThis as any).window.history.pushState = mock((state: any, title: string, url: string) => {
|
|
320
320
|
pushStateCalls.push({ url });
|
|
321
321
|
}) as any;
|
|
322
|
-
|
|
323
|
-
navigateTo(
|
|
324
|
-
|
|
325
|
-
expect(pushStateCalls[0].url).toBe(
|
|
322
|
+
|
|
323
|
+
navigateTo('/page?param=value#section');
|
|
324
|
+
|
|
325
|
+
expect(pushStateCalls[0].url).toBe('/page?param=value#section');
|
|
326
326
|
});
|
|
327
327
|
});
|
|
328
328
|
|
|
329
|
-
describe(
|
|
330
|
-
test(
|
|
331
|
-
const handler = createNavigationHandler(
|
|
329
|
+
describe('Link component behavior simulation', () => {
|
|
330
|
+
test('should simulate Link component click behavior', () => {
|
|
331
|
+
const handler = createNavigationHandler('/link-target');
|
|
332
332
|
const mockEvent = {
|
|
333
333
|
preventDefault: mock(() => {}),
|
|
334
|
-
type:
|
|
335
|
-
target: {}
|
|
334
|
+
type: 'click',
|
|
335
|
+
target: {},
|
|
336
336
|
} as any;
|
|
337
|
-
|
|
337
|
+
|
|
338
338
|
const pushStateCalls: Array<{ url: string }> = [];
|
|
339
339
|
(globalThis as any).window.history.pushState = mock((state: any, title: string, url: string) => {
|
|
340
340
|
pushStateCalls.push({ url });
|
|
341
341
|
}) as any;
|
|
342
|
-
|
|
342
|
+
|
|
343
343
|
handler(mockEvent);
|
|
344
|
-
|
|
344
|
+
|
|
345
345
|
// Should prevent default (no page reload)
|
|
346
346
|
expect(mockEvent.preventDefault).toHaveBeenCalled();
|
|
347
347
|
// Should navigate using history API
|
|
348
348
|
expect(pushStateCalls.length).toBe(1);
|
|
349
|
-
expect(pushStateCalls[0].url).toBe(
|
|
349
|
+
expect(pushStateCalls[0].url).toBe('/link-target');
|
|
350
350
|
});
|
|
351
351
|
|
|
352
|
-
test(
|
|
353
|
-
const handler1 = createNavigationHandler(
|
|
354
|
-
const handler2 = createNavigationHandler(
|
|
355
|
-
|
|
352
|
+
test('should handle multiple Link clicks', () => {
|
|
353
|
+
const handler1 = createNavigationHandler('/page1');
|
|
354
|
+
const handler2 = createNavigationHandler('/page2');
|
|
355
|
+
|
|
356
356
|
const pushStateCalls: Array<{ url: string }> = [];
|
|
357
357
|
(globalThis as any).window.history.pushState = mock((state: any, title: string, url: string) => {
|
|
358
358
|
pushStateCalls.push({ url });
|
|
359
359
|
}) as any;
|
|
360
|
-
|
|
360
|
+
|
|
361
361
|
const mockEvent1 = { preventDefault: mock(() => {}) } as any;
|
|
362
362
|
const mockEvent2 = { preventDefault: mock(() => {}) } as any;
|
|
363
|
-
|
|
363
|
+
|
|
364
364
|
handler1(mockEvent1);
|
|
365
365
|
handler2(mockEvent2);
|
|
366
|
-
|
|
366
|
+
|
|
367
367
|
expect(pushStateCalls.length).toBe(2);
|
|
368
|
-
expect(pushStateCalls[0].url).toBe(
|
|
369
|
-
expect(pushStateCalls[1].url).toBe(
|
|
368
|
+
expect(pushStateCalls[0].url).toBe('/page1');
|
|
369
|
+
expect(pushStateCalls[1].url).toBe('/page2');
|
|
370
370
|
});
|
|
371
371
|
});
|
|
372
372
|
});
|
|
373
373
|
|
|
374
|
-
describe(
|
|
374
|
+
describe('Navigation - Integration scenarios', () => {
|
|
375
375
|
let originalPushState: any;
|
|
376
376
|
let originalDispatchEvent: any;
|
|
377
377
|
let pushStateCalls: Array<{ url: string }>;
|
|
@@ -381,14 +381,14 @@ describe("Navigation - Integration scenarios", () => {
|
|
|
381
381
|
setupWindowMock();
|
|
382
382
|
originalPushState = (globalThis as any).window.history.pushState;
|
|
383
383
|
originalDispatchEvent = (globalThis as any).window.dispatchEvent;
|
|
384
|
-
|
|
384
|
+
|
|
385
385
|
pushStateCalls = [];
|
|
386
386
|
dispatchedEvents = [];
|
|
387
|
-
|
|
387
|
+
|
|
388
388
|
(globalThis as any).window.history.pushState = mock((state: any, title: string, url: string) => {
|
|
389
389
|
pushStateCalls.push({ url });
|
|
390
390
|
}) as any;
|
|
391
|
-
|
|
391
|
+
|
|
392
392
|
(globalThis as any).window.dispatchEvent = mock((event: Event) => {
|
|
393
393
|
dispatchedEvents.push(event);
|
|
394
394
|
return true;
|
|
@@ -402,38 +402,38 @@ describe("Navigation - Integration scenarios", () => {
|
|
|
402
402
|
}
|
|
403
403
|
});
|
|
404
404
|
|
|
405
|
-
test(
|
|
406
|
-
navigateTo(
|
|
407
|
-
navigateTo(
|
|
408
|
-
navigateTo(
|
|
409
|
-
|
|
405
|
+
test('should handle navigation sequence', () => {
|
|
406
|
+
navigateTo('/');
|
|
407
|
+
navigateTo('/about');
|
|
408
|
+
navigateTo('/contact');
|
|
409
|
+
|
|
410
410
|
expect(pushStateCalls.length).toBe(3);
|
|
411
|
-
expect(pushStateCalls[0].url).toBe(
|
|
412
|
-
expect(pushStateCalls[1].url).toBe(
|
|
413
|
-
expect(pushStateCalls[2].url).toBe(
|
|
411
|
+
expect(pushStateCalls[0].url).toBe('/');
|
|
412
|
+
expect(pushStateCalls[1].url).toBe('/about');
|
|
413
|
+
expect(pushStateCalls[2].url).toBe('/contact');
|
|
414
414
|
expect(dispatchedEvents.length).toBe(3);
|
|
415
415
|
});
|
|
416
416
|
|
|
417
|
-
test(
|
|
418
|
-
const handler1 = createNavigationHandler(
|
|
419
|
-
const handler2 = createNavigationHandler(
|
|
420
|
-
|
|
417
|
+
test('should work with navigation handler in sequence', () => {
|
|
418
|
+
const handler1 = createNavigationHandler('/page1');
|
|
419
|
+
const handler2 = createNavigationHandler('/page2');
|
|
420
|
+
|
|
421
421
|
const mockEvent = {
|
|
422
|
-
preventDefault: mock(() => {})
|
|
422
|
+
preventDefault: mock(() => {}),
|
|
423
423
|
} as any;
|
|
424
|
-
|
|
424
|
+
|
|
425
425
|
handler1(mockEvent);
|
|
426
426
|
handler2(mockEvent);
|
|
427
|
-
|
|
427
|
+
|
|
428
428
|
expect(pushStateCalls.length).toBe(2);
|
|
429
429
|
});
|
|
430
430
|
|
|
431
|
-
test(
|
|
431
|
+
test('should handle back/forward navigation simulation', () => {
|
|
432
432
|
// Navigate forward
|
|
433
|
-
navigateTo(
|
|
434
|
-
navigateTo(
|
|
435
|
-
navigateTo(
|
|
436
|
-
|
|
433
|
+
navigateTo('/page1');
|
|
434
|
+
navigateTo('/page2');
|
|
435
|
+
navigateTo('/page3');
|
|
436
|
+
|
|
437
437
|
// Simulate back button (this would normally be handled by popstate listener)
|
|
438
438
|
// The navigateTo function doesn't handle back/forward, but the router does
|
|
439
439
|
expect(pushStateCalls.length).toBe(3);
|
package/lib/client/navigation.ts
CHANGED