@tanstack/vue-router 1.168.1 → 1.168.3
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/dist/esm/HeadContent.d.ts +18 -2
- package/dist/esm/HeadContent.dev.d.ts +15 -2
- package/dist/esm/HeadContent.dev.js +6 -2
- package/dist/esm/HeadContent.dev.js.map +1 -1
- package/dist/esm/HeadContent.js +6 -2
- package/dist/esm/HeadContent.js.map +1 -1
- package/dist/esm/Match.js +14 -7
- package/dist/esm/Match.js.map +1 -1
- package/dist/esm/Matches.js +2 -3
- package/dist/esm/Matches.js.map +1 -1
- package/dist/esm/fileRoute.js +4 -3
- package/dist/esm/fileRoute.js.map +1 -1
- package/dist/esm/headContentUtils.d.ts +2 -2
- package/dist/esm/headContentUtils.js +9 -4
- package/dist/esm/headContentUtils.js.map +1 -1
- package/dist/esm/renderRouteNotFound.js +3 -2
- package/dist/esm/renderRouteNotFound.js.map +1 -1
- package/dist/esm/useLoaderDeps.d.ts +3 -2
- package/dist/esm/useLoaderDeps.js.map +1 -1
- package/dist/esm/useMatch.js +9 -3
- package/dist/esm/useMatch.js.map +1 -1
- package/dist/esm/useRouter.js +3 -2
- package/dist/esm/useRouter.js.map +1 -1
- package/dist/source/HeadContent.d.ts +18 -2
- package/dist/source/HeadContent.dev.d.ts +15 -2
- package/dist/source/HeadContent.dev.jsx +8 -2
- package/dist/source/HeadContent.dev.jsx.map +1 -1
- package/dist/source/HeadContent.jsx +8 -2
- package/dist/source/HeadContent.jsx.map +1 -1
- package/dist/source/Match.jsx +22 -7
- package/dist/source/Match.jsx.map +1 -1
- package/dist/source/Matches.jsx +2 -3
- package/dist/source/Matches.jsx.map +1 -1
- package/dist/source/fileRoute.js +4 -3
- package/dist/source/fileRoute.js.map +1 -1
- package/dist/source/headContentUtils.d.ts +2 -2
- package/dist/source/headContentUtils.jsx +11 -4
- package/dist/source/headContentUtils.jsx.map +1 -1
- package/dist/source/renderRouteNotFound.jsx +4 -3
- package/dist/source/renderRouteNotFound.jsx.map +1 -1
- package/dist/source/useLoaderDeps.d.ts +3 -2
- package/dist/source/useLoaderDeps.jsx.map +1 -1
- package/dist/source/useMatch.jsx +14 -4
- package/dist/source/useMatch.jsx.map +1 -1
- package/dist/source/useRouter.jsx +5 -2
- package/dist/source/useRouter.jsx.map +1 -1
- package/package.json +3 -5
- package/src/HeadContent.dev.tsx +9 -2
- package/src/HeadContent.tsx +13 -2
- package/src/Match.tsx +27 -9
- package/src/Matches.tsx +3 -5
- package/src/fileRoute.ts +7 -8
- package/src/headContentUtils.tsx +21 -5
- package/src/renderRouteNotFound.tsx +6 -6
- package/src/useLoaderDeps.tsx +4 -3
- package/src/useMatch.tsx +23 -13
- package/src/useRouter.tsx +7 -5
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import type * as Vue from 'vue';
|
|
1
2
|
import type { AnyRouter, RegisteredRouter, ResolveUseLoaderDeps, StrictOrFrom, UseLoaderDepsResult } from '@tanstack/router-core';
|
|
2
3
|
export interface UseLoaderDepsBaseOptions<TRouter extends AnyRouter, TFrom, TSelected> {
|
|
3
4
|
select?: (deps: ResolveUseLoaderDeps<TRouter, TFrom>) => TSelected;
|
|
4
5
|
}
|
|
5
6
|
export type UseLoaderDepsOptions<TRouter extends AnyRouter, TFrom extends string | undefined, TSelected> = StrictOrFrom<TRouter, TFrom> & UseLoaderDepsBaseOptions<TRouter, TFrom, TSelected>;
|
|
6
|
-
export type UseLoaderDepsRoute<out TId> = <TRouter extends AnyRouter = RegisteredRouter, TSelected = unknown>(opts?: UseLoaderDepsBaseOptions<TRouter, TId, TSelected>) => UseLoaderDepsResult<TRouter, TId, TSelected
|
|
7
|
-
export declare function useLoaderDeps<TRouter extends AnyRouter = RegisteredRouter, const TFrom extends string | undefined = undefined, TSelected = unknown>(opts: UseLoaderDepsOptions<TRouter, TFrom, TSelected>): UseLoaderDepsResult<TRouter, TFrom, TSelected
|
|
7
|
+
export type UseLoaderDepsRoute<out TId> = <TRouter extends AnyRouter = RegisteredRouter, TSelected = unknown>(opts?: UseLoaderDepsBaseOptions<TRouter, TId, TSelected>) => Vue.Ref<UseLoaderDepsResult<TRouter, TId, TSelected>>;
|
|
8
|
+
export declare function useLoaderDeps<TRouter extends AnyRouter = RegisteredRouter, const TFrom extends string | undefined = undefined, TSelected = unknown>(opts: UseLoaderDepsOptions<TRouter, TFrom, TSelected>): Vue.Ref<UseLoaderDepsResult<TRouter, TFrom, TSelected>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLoaderDeps.jsx","sourceRoot":"","sources":["../../src/useLoaderDeps.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"useLoaderDeps.jsx","sourceRoot":"","sources":["../../src/useLoaderDeps.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAgCrC,MAAM,UAAU,aAAa,CAK3B,IAAqD;IAErD,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAA;IAChC,OAAO,QAAQ,CAAC;QACd,GAAG,IAAI;QACP,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE;YACZ,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAA;QACrD,CAAC;KACF,CAA4D,CAAA;AAC/D,CAAC"}
|
package/dist/source/useMatch.jsx
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as Vue from 'vue';
|
|
2
|
+
import { invariant } from '@tanstack/router-core';
|
|
2
3
|
import { useStore } from '@tanstack/vue-store';
|
|
3
4
|
import { isServer } from '@tanstack/router-core/isServer';
|
|
4
|
-
import invariant from 'tiny-invariant';
|
|
5
5
|
import { injectDummyPendingMatch, injectPendingMatch, routeIdContext, } from './matchContext';
|
|
6
6
|
import { useRouter } from './useRouter';
|
|
7
7
|
export function useMatch(opts) {
|
|
@@ -14,7 +14,12 @@ export function useMatch(opts) {
|
|
|
14
14
|
? router.stores.getMatchStoreByRouteId(opts.from ?? nearestRouteId)
|
|
15
15
|
: undefined;
|
|
16
16
|
const match = matchStore?.state;
|
|
17
|
-
|
|
17
|
+
if ((opts.shouldThrow ?? true) && !match) {
|
|
18
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
19
|
+
throw new Error(`Invariant failed: Could not find ${opts.from ? `an active match from "${opts.from}"` : 'a nearest match!'}`);
|
|
20
|
+
}
|
|
21
|
+
invariant();
|
|
22
|
+
}
|
|
18
23
|
if (match === undefined) {
|
|
19
24
|
return Vue.ref(undefined);
|
|
20
25
|
}
|
|
@@ -54,9 +59,14 @@ export function useMatch(opts) {
|
|
|
54
59
|
const hasPendingMatch = opts.from
|
|
55
60
|
? Boolean(hasPendingRouteMatch?.value[opts.from])
|
|
56
61
|
: hasPendingNearestMatch.value;
|
|
57
|
-
|
|
62
|
+
if (!hasPendingMatch &&
|
|
58
63
|
!isTransitioning.value &&
|
|
59
|
-
(opts.shouldThrow ?? true))
|
|
64
|
+
(opts.shouldThrow ?? true)) {
|
|
65
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
66
|
+
throw new Error(`Invariant failed: Could not find ${opts.from ? `an active match from "${opts.from}"` : 'a nearest match!'}`);
|
|
67
|
+
}
|
|
68
|
+
invariant();
|
|
69
|
+
}
|
|
60
70
|
return undefined;
|
|
61
71
|
}
|
|
62
72
|
return opts.select ? opts.select(selectedMatch) : selectedMatch;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMatch.jsx","sourceRoot":"","sources":["../../src/useMatch.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,KAAK,CAAA;AAC1B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"useMatch.jsx","sourceRoot":"","sources":["../../src/useMatch.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import * as Vue from 'vue';
|
|
2
|
-
import warning from 'tiny-warning';
|
|
3
2
|
import { routerContext } from './routerContext';
|
|
4
3
|
export function useRouter(opts) {
|
|
5
4
|
const value = Vue.inject(routerContext, null);
|
|
6
|
-
|
|
5
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
6
|
+
if ((opts?.warn ?? true) && !value) {
|
|
7
|
+
console.warn('Warning: useRouter must be used inside a <RouterProvider> component!');
|
|
8
|
+
}
|
|
9
|
+
}
|
|
7
10
|
return value;
|
|
8
11
|
}
|
|
9
12
|
//# sourceMappingURL=useRouter.jsx.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useRouter.jsx","sourceRoot":"","sources":["../../src/useRouter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,KAAK,CAAA;AAC1B,OAAO,
|
|
1
|
+
{"version":3,"file":"useRouter.jsx","sourceRoot":"","sources":["../../src/useRouter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,KAAK,CAAA;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAG/C,MAAM,UAAU,SAAS,CAA+C,IAEvE;IACC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,aAAoB,EAAE,IAAI,CAAC,CAAA;IACpD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC1C,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACnC,OAAO,CAAC,IAAI,CACV,sEAAsE,CACvE,CAAA;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAY,CAAA;AACrB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/vue-router",
|
|
3
|
-
"version": "1.168.
|
|
3
|
+
"version": "1.168.3",
|
|
4
4
|
"description": "Modern and scalable routing for Vue applications",
|
|
5
5
|
"author": "Tanner Linsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -64,10 +64,8 @@
|
|
|
64
64
|
"@vue/runtime-dom": "^3.5.25",
|
|
65
65
|
"isbot": "^5.1.22",
|
|
66
66
|
"jsesc": "^3.0.2",
|
|
67
|
-
"
|
|
68
|
-
"
|
|
69
|
-
"@tanstack/router-core": "1.168.1",
|
|
70
|
-
"@tanstack/history": "1.161.6"
|
|
67
|
+
"@tanstack/history": "1.161.6",
|
|
68
|
+
"@tanstack/router-core": "1.168.3"
|
|
71
69
|
},
|
|
72
70
|
"devDependencies": {
|
|
73
71
|
"@tanstack/intent": "^0.0.14",
|
package/src/HeadContent.dev.tsx
CHANGED
|
@@ -3,6 +3,7 @@ import * as Vue from 'vue'
|
|
|
3
3
|
import { Asset } from './Asset'
|
|
4
4
|
import { useHydrated } from './ClientOnly'
|
|
5
5
|
import { useTags } from './headContentUtils'
|
|
6
|
+
import type { AssetCrossOriginConfig } from '@tanstack/router-core'
|
|
6
7
|
|
|
7
8
|
const DEV_STYLES_ATTR = 'data-tanstack-router-dev-styles'
|
|
8
9
|
|
|
@@ -14,8 +15,14 @@ const DEV_STYLES_ATTR = 'data-tanstack-router-dev-styles'
|
|
|
14
15
|
*/
|
|
15
16
|
export const HeadContent = Vue.defineComponent({
|
|
16
17
|
name: 'HeadContent',
|
|
17
|
-
|
|
18
|
-
|
|
18
|
+
props: {
|
|
19
|
+
assetCrossOrigin: {
|
|
20
|
+
type: [String, Object] as Vue.PropType<AssetCrossOriginConfig>,
|
|
21
|
+
default: undefined,
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
setup(props) {
|
|
25
|
+
const tags = useTags(props.assetCrossOrigin)
|
|
19
26
|
const hydrated = useHydrated()
|
|
20
27
|
|
|
21
28
|
// Fallback cleanup for hydration mismatch cases
|
package/src/HeadContent.tsx
CHANGED
|
@@ -2,6 +2,11 @@ import * as Vue from 'vue'
|
|
|
2
2
|
|
|
3
3
|
import { Asset } from './Asset'
|
|
4
4
|
import { useTags } from './headContentUtils'
|
|
5
|
+
import type { AssetCrossOriginConfig } from '@tanstack/router-core'
|
|
6
|
+
|
|
7
|
+
export interface HeadContentProps {
|
|
8
|
+
assetCrossOrigin?: AssetCrossOriginConfig
|
|
9
|
+
}
|
|
5
10
|
|
|
6
11
|
/**
|
|
7
12
|
* @description The `HeadContent` component is used to render meta tags, links, and scripts for the current route.
|
|
@@ -9,8 +14,14 @@ import { useTags } from './headContentUtils'
|
|
|
9
14
|
*/
|
|
10
15
|
export const HeadContent = Vue.defineComponent({
|
|
11
16
|
name: 'HeadContent',
|
|
12
|
-
|
|
13
|
-
|
|
17
|
+
props: {
|
|
18
|
+
assetCrossOrigin: {
|
|
19
|
+
type: [String, Object] as Vue.PropType<AssetCrossOriginConfig>,
|
|
20
|
+
default: undefined,
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
setup(props) {
|
|
24
|
+
const tags = useTags(props.assetCrossOrigin)
|
|
14
25
|
|
|
15
26
|
return () => {
|
|
16
27
|
return tags().map((tag) =>
|
package/src/Match.tsx
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import * as Vue from 'vue'
|
|
2
|
-
import invariant from 'tiny-invariant'
|
|
3
|
-
import warning from 'tiny-warning'
|
|
4
2
|
import {
|
|
5
3
|
createControlledPromise,
|
|
6
4
|
getLocationChangeInfo,
|
|
5
|
+
invariant,
|
|
7
6
|
isNotFound,
|
|
8
7
|
isRedirect,
|
|
9
8
|
rootRouteId,
|
|
@@ -42,10 +41,15 @@ export const Match = Vue.defineComponent({
|
|
|
42
41
|
props.matchId,
|
|
43
42
|
)?.routeId
|
|
44
43
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
44
|
+
if (!routeId) {
|
|
45
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
46
|
+
throw new Error(
|
|
47
|
+
`Invariant failed: Could not find routeId for matchId "${props.matchId}". Please file an issue!`,
|
|
48
|
+
)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
invariant()
|
|
52
|
+
}
|
|
49
53
|
|
|
50
54
|
// Static route-tree check: is this route a direct child of the root?
|
|
51
55
|
// parentRoute is set at build time, so no reactive tracking needed.
|
|
@@ -187,7 +191,9 @@ export const Match = Vue.defineComponent({
|
|
|
187
191
|
onCatch: (error: Error) => {
|
|
188
192
|
// Forward not found errors (we don't want to show the error component for these)
|
|
189
193
|
if (isNotFound(error)) throw error
|
|
190
|
-
|
|
194
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
195
|
+
console.warn(`Warning: Error in route match: ${actualMatchId}`)
|
|
196
|
+
}
|
|
191
197
|
routeOnCatch.value?.(error)
|
|
192
198
|
},
|
|
193
199
|
children: content,
|
|
@@ -358,12 +364,24 @@ export const MatchInner = Vue.defineComponent({
|
|
|
358
364
|
}
|
|
359
365
|
|
|
360
366
|
if (match.value.status === 'notFound') {
|
|
361
|
-
|
|
367
|
+
if (!isNotFound(match.value.error)) {
|
|
368
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
369
|
+
throw new Error('Invariant failed: Expected a notFound error')
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
invariant()
|
|
373
|
+
}
|
|
362
374
|
return renderRouteNotFound(router, route.value, match.value.error)
|
|
363
375
|
}
|
|
364
376
|
|
|
365
377
|
if (match.value.status === 'redirected') {
|
|
366
|
-
|
|
378
|
+
if (!isRedirect(match.value.error)) {
|
|
379
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
380
|
+
throw new Error('Invariant failed: Expected a redirect error')
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
invariant()
|
|
384
|
+
}
|
|
367
385
|
throw router.getMatch(match.value.id)?._nonReactive.loadPromise
|
|
368
386
|
}
|
|
369
387
|
|
package/src/Matches.tsx
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import * as Vue from 'vue'
|
|
2
|
-
import warning from 'tiny-warning'
|
|
3
2
|
import { isServer } from '@tanstack/router-core/isServer'
|
|
4
3
|
import { useStore } from '@tanstack/vue-store'
|
|
5
4
|
import { CatchBoundary } from './CatchBoundary'
|
|
@@ -129,11 +128,10 @@ const MatchesInner = Vue.defineComponent({
|
|
|
129
128
|
onCatch:
|
|
130
129
|
process.env.NODE_ENV !== 'production'
|
|
131
130
|
? (error: Error) => {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
`The following error wasn't caught by any route! At the very least, consider setting an 'errorComponent' in your RootRoute!`,
|
|
131
|
+
console.warn(
|
|
132
|
+
`Warning: The following error wasn't caught by any route! At the very least, consider setting an 'errorComponent' in your RootRoute!`,
|
|
135
133
|
)
|
|
136
|
-
|
|
134
|
+
console.warn(`Warning: ${error.message || error.toString()}`)
|
|
137
135
|
}
|
|
138
136
|
: undefined,
|
|
139
137
|
children: childElement,
|
package/src/fileRoute.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import warning from 'tiny-warning'
|
|
2
1
|
import { createRoute } from './route'
|
|
3
2
|
|
|
4
3
|
import { useMatch } from './useMatch'
|
|
@@ -140,10 +139,11 @@ export class FileRoute<
|
|
|
140
139
|
THandlers
|
|
141
140
|
> => {
|
|
142
141
|
if (process.env.NODE_ENV !== 'production') {
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
142
|
+
if (!this.silent) {
|
|
143
|
+
console.warn(
|
|
144
|
+
'Warning: FileRoute is deprecated and will be removed in the next major version. Use the createFileRoute(path)(options) function instead.',
|
|
145
|
+
)
|
|
146
|
+
}
|
|
147
147
|
}
|
|
148
148
|
const route = createRoute(options as any)
|
|
149
149
|
;(route as any).isRoot = false
|
|
@@ -177,9 +177,8 @@ export function FileRouteLoader<
|
|
|
177
177
|
>,
|
|
178
178
|
) => TLoaderFn {
|
|
179
179
|
if (process.env.NODE_ENV !== 'production') {
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
`FileRouteLoader is deprecated and will be removed in the next major version. Please place the loader function in the the main route file, inside the \`createFileRoute('/path/to/file')(options)\` options`,
|
|
180
|
+
console.warn(
|
|
181
|
+
`Warning: FileRouteLoader is deprecated and will be removed in the next major version. Please place the loader function in the the main route file, inside the \`createFileRoute('/path/to/file')(options)\` options`,
|
|
183
182
|
)
|
|
184
183
|
}
|
|
185
184
|
return (loaderFn) => loaderFn as any
|
package/src/headContentUtils.tsx
CHANGED
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
import * as Vue from 'vue'
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
escapeHtml,
|
|
4
|
+
getAssetCrossOrigin,
|
|
5
|
+
resolveManifestAssetLink,
|
|
6
|
+
} from '@tanstack/router-core'
|
|
3
7
|
import { useStore } from '@tanstack/vue-store'
|
|
4
8
|
import { useRouter } from './useRouter'
|
|
5
|
-
import type {
|
|
9
|
+
import type {
|
|
10
|
+
AssetCrossOriginConfig,
|
|
11
|
+
RouterManagedTag,
|
|
12
|
+
} from '@tanstack/router-core'
|
|
6
13
|
|
|
7
|
-
export const useTags = () => {
|
|
14
|
+
export const useTags = (assetCrossOrigin?: AssetCrossOriginConfig) => {
|
|
8
15
|
const router = useRouter()
|
|
9
16
|
const matches = useStore(
|
|
10
17
|
router.stores.activeMatchesSnapshot,
|
|
@@ -95,11 +102,15 @@ export const useTags = () => {
|
|
|
95
102
|
router.ssr?.manifest?.routes[route.id]?.preloads
|
|
96
103
|
?.filter(Boolean)
|
|
97
104
|
.forEach((preload) => {
|
|
105
|
+
const preloadLink = resolveManifestAssetLink(preload)
|
|
98
106
|
preloadMeta.push({
|
|
99
107
|
tag: 'link',
|
|
100
108
|
attrs: {
|
|
101
109
|
rel: 'modulepreload',
|
|
102
|
-
href:
|
|
110
|
+
href: preloadLink.href,
|
|
111
|
+
crossOrigin:
|
|
112
|
+
getAssetCrossOrigin(assetCrossOrigin, 'modulepreload') ??
|
|
113
|
+
preloadLink.crossOrigin,
|
|
103
114
|
},
|
|
104
115
|
})
|
|
105
116
|
}),
|
|
@@ -135,7 +146,12 @@ export const useTags = () => {
|
|
|
135
146
|
(asset) =>
|
|
136
147
|
({
|
|
137
148
|
tag: 'link',
|
|
138
|
-
attrs: {
|
|
149
|
+
attrs: {
|
|
150
|
+
...asset.attrs,
|
|
151
|
+
crossOrigin:
|
|
152
|
+
getAssetCrossOrigin(assetCrossOrigin, 'stylesheet') ??
|
|
153
|
+
asset.attrs?.crossOrigin,
|
|
154
|
+
},
|
|
139
155
|
}) satisfies RouterManagedTag,
|
|
140
156
|
)
|
|
141
157
|
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import * as Vue from 'vue'
|
|
2
|
-
import warning from 'tiny-warning'
|
|
3
2
|
import { DefaultGlobalNotFound } from './not-found'
|
|
4
3
|
import type { AnyRoute, AnyRouter } from '@tanstack/router-core'
|
|
5
4
|
|
|
@@ -21,11 +20,12 @@ export function renderRouteNotFound(
|
|
|
21
20
|
return Vue.h(router.options.defaultNotFoundComponent as any, data)
|
|
22
21
|
}
|
|
23
22
|
|
|
24
|
-
if (process.env.NODE_ENV
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
23
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
24
|
+
if (!route.options.notFoundComponent) {
|
|
25
|
+
console.warn(
|
|
26
|
+
`Warning: A notFoundError was encountered on the route with ID "${route.id}", but a notFoundComponent option was not configured, nor was a router level defaultNotFoundComponent configured. Consider configuring at least one of these to avoid TanStack Router's overly generic defaultNotFoundComponent (<p>Not Found</p>)`,
|
|
27
|
+
)
|
|
28
|
+
}
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
return Vue.h(DefaultGlobalNotFound)
|
package/src/useLoaderDeps.tsx
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { useMatch } from './useMatch'
|
|
2
|
+
import type * as Vue from 'vue'
|
|
2
3
|
import type {
|
|
3
4
|
AnyRouter,
|
|
4
5
|
RegisteredRouter,
|
|
@@ -27,7 +28,7 @@ export type UseLoaderDepsRoute<out TId> = <
|
|
|
27
28
|
TSelected = unknown,
|
|
28
29
|
>(
|
|
29
30
|
opts?: UseLoaderDepsBaseOptions<TRouter, TId, TSelected>,
|
|
30
|
-
) => UseLoaderDepsResult<TRouter, TId, TSelected
|
|
31
|
+
) => Vue.Ref<UseLoaderDepsResult<TRouter, TId, TSelected>>
|
|
31
32
|
|
|
32
33
|
export function useLoaderDeps<
|
|
33
34
|
TRouter extends AnyRouter = RegisteredRouter,
|
|
@@ -35,12 +36,12 @@ export function useLoaderDeps<
|
|
|
35
36
|
TSelected = unknown,
|
|
36
37
|
>(
|
|
37
38
|
opts: UseLoaderDepsOptions<TRouter, TFrom, TSelected>,
|
|
38
|
-
): UseLoaderDepsResult<TRouter, TFrom, TSelected
|
|
39
|
+
): Vue.Ref<UseLoaderDepsResult<TRouter, TFrom, TSelected>> {
|
|
39
40
|
const { select, ...rest } = opts
|
|
40
41
|
return useMatch({
|
|
41
42
|
...rest,
|
|
42
43
|
select: (s) => {
|
|
43
44
|
return select ? select(s.loaderDeps) : s.loaderDeps
|
|
44
45
|
},
|
|
45
|
-
}) as UseLoaderDepsResult<TRouter, TFrom, TSelected
|
|
46
|
+
}) as Vue.Ref<UseLoaderDepsResult<TRouter, TFrom, TSelected>>
|
|
46
47
|
}
|
package/src/useMatch.tsx
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as Vue from 'vue'
|
|
2
|
+
import { invariant } from '@tanstack/router-core'
|
|
2
3
|
import { useStore } from '@tanstack/vue-store'
|
|
3
4
|
import { isServer } from '@tanstack/router-core/isServer'
|
|
4
|
-
import invariant from 'tiny-invariant'
|
|
5
5
|
import {
|
|
6
6
|
injectDummyPendingMatch,
|
|
7
7
|
injectPendingMatch,
|
|
@@ -87,10 +87,15 @@ export function useMatch<
|
|
|
87
87
|
: undefined
|
|
88
88
|
const match = matchStore?.state
|
|
89
89
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
90
|
+
if ((opts.shouldThrow ?? true) && !match) {
|
|
91
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
92
|
+
throw new Error(
|
|
93
|
+
`Invariant failed: Could not find ${opts.from ? `an active match from "${opts.from}"` : 'a nearest match!'}`,
|
|
94
|
+
)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
invariant()
|
|
98
|
+
}
|
|
94
99
|
|
|
95
100
|
if (match === undefined) {
|
|
96
101
|
return Vue.ref(undefined) as Vue.Ref<
|
|
@@ -151,14 +156,19 @@ export function useMatch<
|
|
|
151
156
|
const hasPendingMatch = opts.from
|
|
152
157
|
? Boolean(hasPendingRouteMatch?.value[opts.from!])
|
|
153
158
|
: hasPendingNearestMatch.value
|
|
154
|
-
|
|
155
|
-
!
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
)
|
|
160
|
-
|
|
161
|
-
|
|
159
|
+
if (
|
|
160
|
+
!hasPendingMatch &&
|
|
161
|
+
!isTransitioning.value &&
|
|
162
|
+
(opts.shouldThrow ?? true)
|
|
163
|
+
) {
|
|
164
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
165
|
+
throw new Error(
|
|
166
|
+
`Invariant failed: Could not find ${opts.from ? `an active match from "${opts.from}"` : 'a nearest match!'}`,
|
|
167
|
+
)
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
invariant()
|
|
171
|
+
}
|
|
162
172
|
|
|
163
173
|
return undefined
|
|
164
174
|
}
|
package/src/useRouter.tsx
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import * as Vue from 'vue'
|
|
2
|
-
import warning from 'tiny-warning'
|
|
3
2
|
import { routerContext } from './routerContext'
|
|
4
3
|
import type { AnyRouter, RegisteredRouter } from '@tanstack/router-core'
|
|
5
4
|
|
|
@@ -7,9 +6,12 @@ export function useRouter<TRouter extends AnyRouter = RegisteredRouter>(opts?: {
|
|
|
7
6
|
warn?: boolean
|
|
8
7
|
}): TRouter {
|
|
9
8
|
const value = Vue.inject(routerContext as any, null)
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
10
|
+
if ((opts?.warn ?? true) && !value) {
|
|
11
|
+
console.warn(
|
|
12
|
+
'Warning: useRouter must be used inside a <RouterProvider> component!',
|
|
13
|
+
)
|
|
14
|
+
}
|
|
15
|
+
}
|
|
14
16
|
return value as any
|
|
15
17
|
}
|