Skip to content

Commit b195a5a

Browse files
smaller
1 parent 8c19167 commit b195a5a

9 files changed

Lines changed: 95 additions & 63 deletions

File tree

packages/react-router/src/scroll-restoration.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { getScrollRestorationScriptForRouter } from '@tanstack/router-core'
1+
import { getScrollRestorationScriptForRouter } from '@tanstack/router-core/scroll-restoration-script'
22
import { useRouter } from './useRouter'
33
import { ScriptOnce } from './ScriptOnce'
44

packages/router-core/package.json

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,26 @@
148148
"default": "./dist/cjs/isServer/client.cjs"
149149
}
150150
},
151+
"./scroll-restoration-script": {
152+
"browser": {
153+
"import": {
154+
"types": "./dist/esm/scroll-restoration-script/client.d.ts",
155+
"default": "./dist/esm/scroll-restoration-script/client.js"
156+
},
157+
"require": {
158+
"types": "./dist/cjs/scroll-restoration-script/client.d.cts",
159+
"default": "./dist/cjs/scroll-restoration-script/client.cjs"
160+
}
161+
},
162+
"import": {
163+
"types": "./dist/esm/scroll-restoration-script/server.d.ts",
164+
"default": "./dist/esm/scroll-restoration-script/server.js"
165+
},
166+
"require": {
167+
"types": "./dist/cjs/scroll-restoration-script/server.d.cts",
168+
"default": "./dist/cjs/scroll-restoration-script/server.cjs"
169+
}
170+
},
151171
"./package.json": "./package.json"
152172
},
153173
"sideEffects": false,

packages/router-core/src/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,6 @@ export { isNotFound, notFound } from './not-found'
397397

398398
export {
399399
defaultGetScrollRestorationKey,
400-
getScrollRestorationScriptForRouter,
401400
getElementScrollRestorationEntry,
402401
storageKey,
403402
scrollRestorationCache,
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import type { AnyRouter } from '../router'
2+
3+
export function getScrollRestorationScriptForRouter(_router: AnyRouter) {
4+
return null
5+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import minifiedScrollRestorationScript from '../scroll-restoration-inline?script-string'
2+
import {
3+
defaultGetScrollRestorationKey,
4+
storageKey,
5+
} from '../scroll-restoration'
6+
import { escapeHtml } from '../utils'
7+
import type { AnyRouter } from '../router'
8+
9+
type InlineScrollRestorationScriptOptions = {
10+
storageKey: string
11+
key?: string
12+
behavior?: ScrollToOptions['behavior']
13+
shouldScrollRestoration?: boolean
14+
}
15+
16+
const defaultInlineScrollRestorationScript = `(${minifiedScrollRestorationScript})(${escapeHtml(
17+
JSON.stringify({
18+
storageKey,
19+
shouldScrollRestoration: true,
20+
} satisfies InlineScrollRestorationScriptOptions),
21+
)})`
22+
23+
function getScrollRestorationScript(
24+
options: InlineScrollRestorationScriptOptions,
25+
) {
26+
if (
27+
options.storageKey === storageKey &&
28+
options.shouldScrollRestoration === true &&
29+
options.key === undefined &&
30+
options.behavior === undefined
31+
) {
32+
return defaultInlineScrollRestorationScript
33+
}
34+
35+
return `(${minifiedScrollRestorationScript})(${escapeHtml(JSON.stringify(options))})`
36+
}
37+
38+
export function getScrollRestorationScriptForRouter(router: AnyRouter) {
39+
if (
40+
typeof router.options.scrollRestoration === 'function' &&
41+
!router.options.scrollRestoration({ location: router.latestLocation })
42+
) {
43+
return null
44+
}
45+
46+
const getKey = router.options.getScrollRestorationKey
47+
if (!getKey) {
48+
return defaultInlineScrollRestorationScript
49+
}
50+
51+
const location = router.latestLocation
52+
const userKey = getKey(location)
53+
const defaultKey = defaultGetScrollRestorationKey(location)
54+
55+
if (userKey === defaultKey) {
56+
return defaultInlineScrollRestorationScript
57+
}
58+
59+
return getScrollRestorationScript({
60+
storageKey,
61+
shouldScrollRestoration: true,
62+
key: userKey,
63+
})
64+
}

packages/router-core/src/scroll-restoration.ts

Lines changed: 1 addition & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { isServer } from '@tanstack/router-core/isServer'
2-
import minifiedScrollRestorationScript from './scroll-restoration-inline?script-string'
3-
import { escapeHtml, functionalUpdate, isPlainObject } from './utils'
2+
import { functionalUpdate, isPlainObject } from './utils'
43
import type { AnyRouter } from './router'
54
import type { ParsedLocation } from './location'
65
import type { NonNullableUpdater } from './utils'
@@ -22,13 +21,6 @@ export type ScrollRestorationOptions = {
2221
scrollBehavior?: ScrollToOptions['behavior']
2322
}
2423

25-
type InlineScrollRestorationScriptOptions = {
26-
storageKey: string
27-
key?: string
28-
behavior?: ScrollToOptions['behavior']
29-
shouldScrollRestoration?: boolean
30-
}
31-
3224
function getSafeSessionStorage() {
3325
try {
3426
return typeof window !== 'undefined' &&
@@ -86,56 +78,6 @@ function createScrollRestorationCache(): ScrollRestorationCache | null {
8678

8779
export const scrollRestorationCache = createScrollRestorationCache()
8880

89-
const defaultInlineScrollRestorationScript = `(${minifiedScrollRestorationScript})(${escapeHtml(
90-
JSON.stringify({
91-
storageKey,
92-
shouldScrollRestoration: true,
93-
} satisfies InlineScrollRestorationScriptOptions),
94-
)})`
95-
96-
export function getScrollRestorationScript(
97-
options: InlineScrollRestorationScriptOptions,
98-
) {
99-
if (
100-
options.storageKey === storageKey &&
101-
options.shouldScrollRestoration === true &&
102-
options.key === undefined &&
103-
options.behavior === undefined
104-
) {
105-
return defaultInlineScrollRestorationScript
106-
}
107-
108-
return `(${minifiedScrollRestorationScript})(${escapeHtml(JSON.stringify(options))})`
109-
}
110-
111-
export function getScrollRestorationScriptForRouter(router: AnyRouter) {
112-
if (
113-
typeof router.options.scrollRestoration === 'function' &&
114-
!router.options.scrollRestoration({ location: router.latestLocation })
115-
) {
116-
return null
117-
}
118-
119-
const getKey = router.options.getScrollRestorationKey
120-
if (!getKey) {
121-
return defaultInlineScrollRestorationScript
122-
}
123-
124-
const location = router.latestLocation
125-
const userKey = getKey(location)
126-
const defaultKey = defaultGetScrollRestorationKey(location)
127-
128-
if (userKey === defaultKey) {
129-
return defaultInlineScrollRestorationScript
130-
}
131-
132-
return getScrollRestorationScript({
133-
storageKey,
134-
shouldScrollRestoration: true,
135-
key: userKey,
136-
})
137-
}
138-
13981
/**
14082
* The default `getKey` function for `useScrollRestoration`.
14183
* It returns the `key` from the location state or the `href` of the location.

packages/router-core/vite.config.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ export default mergeConfig(
3131
'./src/index.ts',
3232
'./src/ssr/client.ts',
3333
'./src/ssr/server.ts',
34+
'./src/scroll-restoration-script/client.ts',
35+
'./src/scroll-restoration-script/server.ts',
3436
'./src/isServer/server.ts',
3537
'./src/isServer/client.ts',
3638
'./src/isServer/development.ts',

packages/solid-router/src/scroll-restoration.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { getScrollRestorationScriptForRouter } from '@tanstack/router-core'
1+
import { getScrollRestorationScriptForRouter } from '@tanstack/router-core/scroll-restoration-script'
22
import { useRouter } from './useRouter'
33
import { ScriptOnce } from './ScriptOnce'
44

packages/vue-router/src/scroll-restoration.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as Vue from 'vue'
2-
import { getScrollRestorationScriptForRouter } from '@tanstack/router-core'
2+
import { getScrollRestorationScriptForRouter } from '@tanstack/router-core/scroll-restoration-script'
33
import { useRouter } from './useRouter'
44
import { ScriptOnce } from './ScriptOnce'
55

0 commit comments

Comments
 (0)