From 7fb8ee679614d3aae7cd7765729555816f0936f0 Mon Sep 17 00:00:00 2001 From: Evan Sutherland Date: Sun, 22 Sep 2024 08:23:45 -0500 Subject: [PATCH] push/replace accepts option for hash, assembles on url --- src/services/createRouterResolve.spec.ts | 6 ++++++ src/services/createRouterResolve.ts | 2 ++ src/services/createRouterRoute.ts | 1 + src/services/urlAssembly.spec.ts | 11 +++++++++++ src/services/urlAssembly.ts | 6 +++++- src/types/routerPush.ts | 1 + src/types/routerReplace.ts | 1 + 7 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/services/createRouterResolve.spec.ts b/src/services/createRouterResolve.spec.ts index 3002a69c..a2b81294 100644 --- a/src/services/createRouterResolve.spec.ts +++ b/src/services/createRouterResolve.spec.ts @@ -83,4 +83,10 @@ test('when given an external route with params in host, interpolates param value const url = resolve('external', { 'subdomain': 'router' }) expect(url).toBe('https://router.kitbag.dev/') +}) + +test('given a route with hash, interpolates hash value', () => { + const resolve = createRouterResolve(routes) + + expect(resolve('parentA', { paramA: 'bar' }, { hash: 'foo' })).toBe('/parentA/bar#foo') }) \ No newline at end of file diff --git a/src/services/createRouterResolve.ts b/src/services/createRouterResolve.ts index 474387b4..5ce7b6f1 100644 --- a/src/services/createRouterResolve.ts +++ b/src/services/createRouterResolve.ts @@ -10,6 +10,7 @@ import { AllPropertiesAreOptional } from '@/types/utilities' export type RouterResolveOptions = { query?: Record, + hash?: string, } type RouterResolveArgs< @@ -51,6 +52,7 @@ export function createRouterResolve(routes: TRoute const url = assembleUrl(match, { params, query: options.query, + hash: options.hash, }) return url diff --git a/src/services/createRouterRoute.ts b/src/services/createRouterRoute.ts index 9961c945..4e70b15e 100644 --- a/src/services/createRouterRoute.ts +++ b/src/services/createRouterRoute.ts @@ -13,6 +13,7 @@ export type RouterRoute = Readonly matches: TRoute['matches'], state: TRoute['state'], query: ResolvedRouteQuery, + hash: TRoute['hash'], params: Writable, update: RouteUpdate, }> diff --git a/src/services/urlAssembly.spec.ts b/src/services/urlAssembly.spec.ts index ff0dda35..24eb7a8f 100644 --- a/src/services/urlAssembly.spec.ts +++ b/src/services/urlAssembly.spec.ts @@ -358,4 +358,15 @@ describe('host params', () => { expect(url).toBe('ABC.kitbag.dev/') }) +}) + +test('given route with hash, returns url with hash value interpolated', () => { + const route = createRoute({ + name: 'simple', + path: '/', + }) + + const url = assembleUrl(route, { hash: 'foo' }) + + expect(url).toBe('/#foo') }) \ No newline at end of file diff --git a/src/services/urlAssembly.ts b/src/services/urlAssembly.ts index 2c2f0148..b1a41779 100644 --- a/src/services/urlAssembly.ts +++ b/src/services/urlAssembly.ts @@ -11,6 +11,7 @@ import { Route } from '@/types/route' type AssembleUrlOptions = { params?: Record, query?: Record, + hash?: string, } export function assembleUrl(route: Route, options: AssembleUrlOptions = {}): string { @@ -20,7 +21,10 @@ export function assembleUrl(route: Route, options: AssembleUrlOptions = {}): str const pathWithParamsSet = assemblePathParamValues(route.path, paramValues) const queryWithParamsSet = assembleQueryParamValues(route.query, paramValues) - return withQuery(`${hostWithParamsSet}${pathWithParamsSet}`, queryWithParamsSet, queryValues) + const url = withQuery(`${hostWithParamsSet}${pathWithParamsSet}`, queryWithParamsSet, queryValues) + const hash = options.hash ? `#${options.hash.replace(/^#/, '')}` : '' + + return `${url}${hash}` } function assembleHostParamValues(host: Host, paramValues: Record): string { diff --git a/src/types/routerPush.ts b/src/types/routerPush.ts index 2bfe469f..74990865 100644 --- a/src/types/routerPush.ts +++ b/src/types/routerPush.ts @@ -9,6 +9,7 @@ export type RouterPushOptions< TState = unknown > = { query?: Record, + hash?: string, replace?: boolean, state?: Partial, } diff --git a/src/types/routerReplace.ts b/src/types/routerReplace.ts index 018fe665..ee3648e3 100644 --- a/src/types/routerReplace.ts +++ b/src/types/routerReplace.ts @@ -9,6 +9,7 @@ export type RouterReplaceOptions< TState = unknown > = { query?: Record, + hash?: string, state?: Partial, }