@tanstack/react-router 1.20.6 → 1.21.0
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/cjs/index.cjs +0 -5
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +0 -1
- package/dist/cjs/not-found.cjs.map +1 -1
- package/dist/cjs/not-found.d.cts +1 -0
- package/dist/cjs/redirects.cjs +2 -1
- package/dist/cjs/redirects.cjs.map +1 -1
- package/dist/cjs/redirects.d.cts +2 -1
- package/dist/cjs/routeInfo.d.cts +1 -1
- package/dist/esm/index.d.ts +0 -1
- package/dist/esm/index.js +0 -5
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/not-found.d.ts +1 -0
- package/dist/esm/not-found.js.map +1 -1
- package/dist/esm/redirects.d.ts +2 -1
- package/dist/esm/redirects.js +2 -1
- package/dist/esm/redirects.js.map +1 -1
- package/dist/esm/routeInfo.d.ts +1 -1
- package/package.json +2 -2
- package/src/index.tsx +0 -1
- package/src/not-found.tsx +1 -0
- package/src/redirects.ts +4 -2
- package/src/routeInfo.ts +1 -2
- package/dist/cjs/createServerFn.cjs +0 -40
- package/dist/cjs/createServerFn.cjs.map +0 -1
- package/dist/cjs/createServerFn.d.cts +0 -44
- package/dist/esm/createServerFn.d.ts +0 -44
- package/dist/esm/createServerFn.js +0 -40
- package/dist/esm/createServerFn.js.map +0 -1
- package/src/createServerFn.ts +0 -107
package/dist/cjs/index.cjs
CHANGED
|
@@ -28,7 +28,6 @@ const useRouter = require("./useRouter.cjs");
|
|
|
28
28
|
const useRouterState = require("./useRouterState.cjs");
|
|
29
29
|
const utils = require("./utils.cjs");
|
|
30
30
|
const notFound = require("./not-found.cjs");
|
|
31
|
-
const createServerFn = require("./createServerFn.cjs");
|
|
32
31
|
exports.invariant = invariant;
|
|
33
32
|
exports.warning = warning;
|
|
34
33
|
exports.Await = awaited.Await;
|
|
@@ -132,10 +131,6 @@ exports.CatchNotFound = notFound.CatchNotFound;
|
|
|
132
131
|
exports.DefaultGlobalNotFound = notFound.DefaultGlobalNotFound;
|
|
133
132
|
exports.isNotFound = notFound.isNotFound;
|
|
134
133
|
exports.notFound = notFound.notFound;
|
|
135
|
-
exports.createServerFn = createServerFn.createServerFn;
|
|
136
|
-
exports.json = createServerFn.json;
|
|
137
|
-
exports.serverFnPayloadTypeHeader = createServerFn.serverFnPayloadTypeHeader;
|
|
138
|
-
exports.serverFnReturnTypeHeader = createServerFn.serverFnReturnTypeHeader;
|
|
139
134
|
Object.keys(history).forEach((k) => {
|
|
140
135
|
if (k !== "default" && !Object.prototype.hasOwnProperty.call(exports, k))
|
|
141
136
|
Object.defineProperty(exports, k, {
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/cjs/index.d.cts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"not-found.cjs","sources":["../../src/not-found.tsx"],"sourcesContent":["import * as React from 'react'\nimport { CatchBoundary } from './CatchBoundary'\nimport { useRouterState } from './useRouterState'\nimport { RegisteredRouter } from './router'\nimport { RouteIds } from './routeInfo'\n\nexport type NotFoundError = {\n /**\n @deprecated\n Use `routeId: rootRouteId` instead\n */\n global?: boolean\n /**\n @private\n Do not use this. It's used internally to indicate a path matching error\n */\n _global?: boolean\n data?: any\n throw?: boolean\n routeId?: RouteIds<RegisteredRouter['routeTree']>\n}\n\nexport function notFound(options: NotFoundError = {}) {\n ;(options as any).isNotFound = true\n if (options.throw) throw options\n return options\n}\n\nexport function isNotFound(obj: any): obj is NotFoundError {\n return !!obj?.isNotFound\n}\n\nexport function CatchNotFound(props: {\n fallback?: (error: NotFoundError) => React.ReactElement\n onCatch?: (error: any) => void\n children: React.ReactNode\n}) {\n // TODO: Some way for the user to programmatically reset the not-found boundary?\n const resetKey = useRouterState({\n select: (s) => `not-found-${s.location.pathname}-${s.status}`,\n })\n\n return (\n <CatchBoundary\n getResetKey={() => resetKey}\n onCatch={(error) => {\n if (isNotFound(error)) {\n props.onCatch?.(error)\n } else {\n throw error\n }\n }}\n errorComponent={({ error }: { error: NotFoundError }) =>\n props.fallback?.(error)\n }\n >\n {props.children}\n </CatchBoundary>\n )\n}\n\nexport function DefaultGlobalNotFound() {\n return <p>Not Found</p>\n}\n"],"names":["useRouterState","jsx","CatchBoundary"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"not-found.cjs","sources":["../../src/not-found.tsx"],"sourcesContent":["import * as React from 'react'\nimport { CatchBoundary } from './CatchBoundary'\nimport { useRouterState } from './useRouterState'\nimport { RegisteredRouter } from './router'\nimport { RouteIds } from './routeInfo'\n\nexport type NotFoundError = {\n /**\n @deprecated\n Use `routeId: rootRouteId` instead\n */\n global?: boolean\n /**\n @private\n Do not use this. It's used internally to indicate a path matching error\n */\n _global?: boolean\n data?: any\n throw?: boolean\n routeId?: RouteIds<RegisteredRouter['routeTree']>\n headers?: HeadersInit\n}\n\nexport function notFound(options: NotFoundError = {}) {\n ;(options as any).isNotFound = true\n if (options.throw) throw options\n return options\n}\n\nexport function isNotFound(obj: any): obj is NotFoundError {\n return !!obj?.isNotFound\n}\n\nexport function CatchNotFound(props: {\n fallback?: (error: NotFoundError) => React.ReactElement\n onCatch?: (error: any) => void\n children: React.ReactNode\n}) {\n // TODO: Some way for the user to programmatically reset the not-found boundary?\n const resetKey = useRouterState({\n select: (s) => `not-found-${s.location.pathname}-${s.status}`,\n })\n\n return (\n <CatchBoundary\n getResetKey={() => resetKey}\n onCatch={(error) => {\n if (isNotFound(error)) {\n props.onCatch?.(error)\n } else {\n throw error\n }\n }}\n errorComponent={({ error }: { error: NotFoundError }) =>\n props.fallback?.(error)\n }\n >\n {props.children}\n </CatchBoundary>\n )\n}\n\nexport function DefaultGlobalNotFound() {\n return <p>Not Found</p>\n}\n"],"names":["useRouterState","jsx","CatchBoundary"],"mappings":";;;;;AAuBgB,SAAA,SAAS,UAAyB,IAAI;AAClD,UAAgB,aAAa;AAC/B,MAAI,QAAQ;AAAa,UAAA;AAClB,SAAA;AACT;AAEO,SAAS,WAAW,KAAgC;AAClD,SAAA,CAAC,EAAC,2BAAK;AAChB;AAEO,SAAS,cAAc,OAI3B;AAED,QAAM,WAAWA,eAAAA,eAAe;AAAA,IAC9B,QAAQ,CAAC,MAAM,aAAa,EAAE,SAAS,QAAQ,IAAI,EAAE,MAAM;AAAA,EAAA,CAC5D;AAGC,SAAAC,2BAAA;AAAA,IAACC,cAAA;AAAA,IAAA;AAAA,MACC,aAAa,MAAM;AAAA,MACnB,SAAS,CAAC,UAAU;;AACd,YAAA,WAAW,KAAK,GAAG;AACrB,sBAAM,YAAN,+BAAgB;AAAA,QAAK,OAChB;AACC,gBAAA;AAAA,QACR;AAAA,MACF;AAAA,MACA,gBAAgB,CAAC,EAAE,YACjB;;AAAA,2BAAM,aAAN,+BAAiB;AAAA;AAAA,MAGlB,UAAM,MAAA;AAAA,IAAA;AAAA,EAAA;AAGb;AAEO,SAAS,wBAAwB;AAC/B,SAAAD,2BAAA,IAAC,OAAE,UAAS,YAAA,CAAA;AACrB;;;;;"}
|
package/dist/cjs/not-found.d.cts
CHANGED
|
@@ -15,6 +15,7 @@ export type NotFoundError = {
|
|
|
15
15
|
data?: any;
|
|
16
16
|
throw?: boolean;
|
|
17
17
|
routeId?: RouteIds<RegisteredRouter['routeTree']>;
|
|
18
|
+
headers?: HeadersInit;
|
|
18
19
|
};
|
|
19
20
|
export declare function notFound(options?: NotFoundError): NotFoundError;
|
|
20
21
|
export declare function isNotFound(obj: any): obj is NotFoundError;
|
package/dist/cjs/redirects.cjs
CHANGED
|
@@ -3,7 +3,8 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
function redirect(opts) {
|
|
4
4
|
opts.isRedirect = true;
|
|
5
5
|
opts.statusCode = opts.statusCode || opts.code || 301;
|
|
6
|
-
|
|
6
|
+
opts.headers = opts.headers || {};
|
|
7
|
+
if (opts.throw) {
|
|
7
8
|
throw opts;
|
|
8
9
|
}
|
|
9
10
|
return opts;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redirects.cjs","sources":["../../src/redirects.ts"],"sourcesContent":["import { PickAsRequired } from '.'\nimport { NavigateOptions } from './link'\nimport { AnyRoute } from './route'\nimport { RoutePaths } from './routeInfo'\nimport { RegisteredRouter } from './router'\n\nexport type AnyRedirect = Redirect<any, any, any, any, any>\n\nexport type Redirect<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n> = {\n /**\n * @deprecated Use `statusCode` instead\n **/\n href?: string\n code?: number\n statusCode?: number\n throw?: any\n} & NavigateOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>\n\nexport type ResolvedRedirect<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n> = PickAsRequired<\n Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n 'code' | 'statusCode' | 'href'\n>\n\nexport function redirect<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n>(\n opts: Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n): Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo> {\n ;(opts as any).isRedirect = true\n opts.statusCode = opts.statusCode || opts.code || 301\n if (opts.throw
|
|
1
|
+
{"version":3,"file":"redirects.cjs","sources":["../../src/redirects.ts"],"sourcesContent":["import { PickAsRequired } from '.'\nimport { NavigateOptions } from './link'\nimport { AnyRoute } from './route'\nimport { RoutePaths } from './routeInfo'\nimport { RegisteredRouter } from './router'\n\nexport type AnyRedirect = Redirect<any, any, any, any, any>\n\nexport type Redirect<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n> = {\n /**\n * @deprecated Use `statusCode` instead\n **/\n href?: string\n code?: number\n statusCode?: number\n throw?: any\n headers?: HeadersInit\n} & NavigateOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>\n\nexport type ResolvedRedirect<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n> = PickAsRequired<\n Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n 'code' | 'statusCode' | 'href' | 'headers'\n>\n\nexport function redirect<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n>(\n opts: Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n): Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo> {\n ;(opts as any).isRedirect = true\n opts.statusCode = opts.statusCode || opts.code || 301\n opts.headers = opts.headers || {}\n if (opts.throw) {\n throw opts\n }\n\n return opts\n}\n\nexport function isRedirect(obj: any): obj is AnyRedirect {\n return !!obj?.isRedirect\n}\n"],"names":[],"mappings":";;AAoCO,SAAS,SAOd,MACsD;AACpD,OAAa,aAAa;AAC5B,OAAK,aAAa,KAAK,cAAc,KAAK,QAAQ;AAC7C,OAAA,UAAU,KAAK,WAAW,CAAA;AAC/B,MAAI,KAAK,OAAO;AACR,UAAA;AAAA,EACR;AAEO,SAAA;AACT;AAEO,SAAS,WAAW,KAA8B;AAChD,SAAA,CAAC,EAAC,2BAAK;AAChB;;;"}
|
package/dist/cjs/redirects.d.cts
CHANGED
|
@@ -12,7 +12,8 @@ export type Redirect<TRouteTree extends AnyRoute = RegisteredRouter['routeTree']
|
|
|
12
12
|
code?: number;
|
|
13
13
|
statusCode?: number;
|
|
14
14
|
throw?: any;
|
|
15
|
+
headers?: HeadersInit;
|
|
15
16
|
} & NavigateOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>;
|
|
16
|
-
export type ResolvedRedirect<TRouteTree extends AnyRoute = RegisteredRouter['routeTree'], TFrom extends RoutePaths<TRouteTree> = '/', TTo extends string = '', TMaskFrom extends RoutePaths<TRouteTree> = TFrom, TMaskTo extends string = ''> = PickAsRequired<Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>, 'code' | 'statusCode' | 'href'>;
|
|
17
|
+
export type ResolvedRedirect<TRouteTree extends AnyRoute = RegisteredRouter['routeTree'], TFrom extends RoutePaths<TRouteTree> = '/', TTo extends string = '', TMaskFrom extends RoutePaths<TRouteTree> = TFrom, TMaskTo extends string = ''> = PickAsRequired<Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>, 'code' | 'statusCode' | 'href' | 'headers'>;
|
|
17
18
|
export declare function redirect<TRouteTree extends AnyRoute = RegisteredRouter['routeTree'], TFrom extends RoutePaths<TRouteTree> = '/', TTo extends string = '', TMaskFrom extends RoutePaths<TRouteTree> = TFrom, TMaskTo extends string = ''>(opts: Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>): Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>;
|
|
18
19
|
export declare function isRedirect(obj: any): obj is AnyRedirect;
|
package/dist/cjs/routeInfo.d.cts
CHANGED
|
@@ -17,7 +17,7 @@ export type RoutesByPath<TRouteTree extends AnyRoute> = {
|
|
|
17
17
|
} & Record<'.' | '..', ParseRoute<TRouteTree>>;
|
|
18
18
|
export type RouteByPath<TRouteTree extends AnyRoute, TPath> = Extract<string extends TPath ? ParseRoute<TRouteTree> : RoutesByPath<TRouteTree>[TPath], AnyRoute>;
|
|
19
19
|
export type RoutePaths<TRouteTree extends AnyRoute> = ParseRoute<TRouteTree>['fullPath'] | '/';
|
|
20
|
-
export type RoutePathsAutoComplete<TRouteTree extends AnyRoute, T> =
|
|
20
|
+
export type RoutePathsAutoComplete<TRouteTree extends AnyRoute, T> = (string extends T ? T & {} : T) | RoutePaths<TRouteTree>;
|
|
21
21
|
type UnionizeCollisions<T, U> = {
|
|
22
22
|
[P in keyof T & keyof U]: T[P] extends U[P] ? T[P] : T[P] | U[P];
|
|
23
23
|
};
|
package/dist/esm/index.d.ts
CHANGED
package/dist/esm/index.js
CHANGED
|
@@ -26,7 +26,6 @@ import { useRouter } from "./useRouter.js";
|
|
|
26
26
|
import { useRouterState } from "./useRouterState.js";
|
|
27
27
|
import { deepEqual, escapeJSON, functionalUpdate, isPlainArray, isPlainObject, isServer, last, pick, replaceEqualDeep, shallow, useLayoutEffect, useStableCallback } from "./utils.js";
|
|
28
28
|
import { CatchNotFound, DefaultGlobalNotFound, isNotFound, notFound } from "./not-found.js";
|
|
29
|
-
import { createServerFn, json, serverFnPayloadTypeHeader, serverFnReturnTypeHeader } from "./createServerFn.js";
|
|
30
29
|
export {
|
|
31
30
|
Await,
|
|
32
31
|
Block,
|
|
@@ -64,7 +63,6 @@ export {
|
|
|
64
63
|
createRoute,
|
|
65
64
|
createRouteMask,
|
|
66
65
|
createRouter,
|
|
67
|
-
createServerFn,
|
|
68
66
|
decode,
|
|
69
67
|
deepEqual,
|
|
70
68
|
defaultDeserializeError,
|
|
@@ -90,7 +88,6 @@ export {
|
|
|
90
88
|
isServer,
|
|
91
89
|
isServerSideError,
|
|
92
90
|
joinPaths,
|
|
93
|
-
json,
|
|
94
91
|
last,
|
|
95
92
|
lazyFn,
|
|
96
93
|
lazyRouteComponent,
|
|
@@ -107,8 +104,6 @@ export {
|
|
|
107
104
|
resolvePath,
|
|
108
105
|
rootRouteId,
|
|
109
106
|
rootRouteWithContext,
|
|
110
|
-
serverFnPayloadTypeHeader,
|
|
111
|
-
serverFnReturnTypeHeader,
|
|
112
107
|
shallow,
|
|
113
108
|
stringifySearchWith,
|
|
114
109
|
trimPath,
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/esm/not-found.d.ts
CHANGED
|
@@ -15,6 +15,7 @@ export type NotFoundError = {
|
|
|
15
15
|
data?: any;
|
|
16
16
|
throw?: boolean;
|
|
17
17
|
routeId?: RouteIds<RegisteredRouter['routeTree']>;
|
|
18
|
+
headers?: HeadersInit;
|
|
18
19
|
};
|
|
19
20
|
export declare function notFound(options?: NotFoundError): NotFoundError;
|
|
20
21
|
export declare function isNotFound(obj: any): obj is NotFoundError;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"not-found.js","sources":["../../src/not-found.tsx"],"sourcesContent":["import * as React from 'react'\nimport { CatchBoundary } from './CatchBoundary'\nimport { useRouterState } from './useRouterState'\nimport { RegisteredRouter } from './router'\nimport { RouteIds } from './routeInfo'\n\nexport type NotFoundError = {\n /**\n @deprecated\n Use `routeId: rootRouteId` instead\n */\n global?: boolean\n /**\n @private\n Do not use this. It's used internally to indicate a path matching error\n */\n _global?: boolean\n data?: any\n throw?: boolean\n routeId?: RouteIds<RegisteredRouter['routeTree']>\n}\n\nexport function notFound(options: NotFoundError = {}) {\n ;(options as any).isNotFound = true\n if (options.throw) throw options\n return options\n}\n\nexport function isNotFound(obj: any): obj is NotFoundError {\n return !!obj?.isNotFound\n}\n\nexport function CatchNotFound(props: {\n fallback?: (error: NotFoundError) => React.ReactElement\n onCatch?: (error: any) => void\n children: React.ReactNode\n}) {\n // TODO: Some way for the user to programmatically reset the not-found boundary?\n const resetKey = useRouterState({\n select: (s) => `not-found-${s.location.pathname}-${s.status}`,\n })\n\n return (\n <CatchBoundary\n getResetKey={() => resetKey}\n onCatch={(error) => {\n if (isNotFound(error)) {\n props.onCatch?.(error)\n } else {\n throw error\n }\n }}\n errorComponent={({ error }: { error: NotFoundError }) =>\n props.fallback?.(error)\n }\n >\n {props.children}\n </CatchBoundary>\n )\n}\n\nexport function DefaultGlobalNotFound() {\n return <p>Not Found</p>\n}\n"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"not-found.js","sources":["../../src/not-found.tsx"],"sourcesContent":["import * as React from 'react'\nimport { CatchBoundary } from './CatchBoundary'\nimport { useRouterState } from './useRouterState'\nimport { RegisteredRouter } from './router'\nimport { RouteIds } from './routeInfo'\n\nexport type NotFoundError = {\n /**\n @deprecated\n Use `routeId: rootRouteId` instead\n */\n global?: boolean\n /**\n @private\n Do not use this. It's used internally to indicate a path matching error\n */\n _global?: boolean\n data?: any\n throw?: boolean\n routeId?: RouteIds<RegisteredRouter['routeTree']>\n headers?: HeadersInit\n}\n\nexport function notFound(options: NotFoundError = {}) {\n ;(options as any).isNotFound = true\n if (options.throw) throw options\n return options\n}\n\nexport function isNotFound(obj: any): obj is NotFoundError {\n return !!obj?.isNotFound\n}\n\nexport function CatchNotFound(props: {\n fallback?: (error: NotFoundError) => React.ReactElement\n onCatch?: (error: any) => void\n children: React.ReactNode\n}) {\n // TODO: Some way for the user to programmatically reset the not-found boundary?\n const resetKey = useRouterState({\n select: (s) => `not-found-${s.location.pathname}-${s.status}`,\n })\n\n return (\n <CatchBoundary\n getResetKey={() => resetKey}\n onCatch={(error) => {\n if (isNotFound(error)) {\n props.onCatch?.(error)\n } else {\n throw error\n }\n }}\n errorComponent={({ error }: { error: NotFoundError }) =>\n props.fallback?.(error)\n }\n >\n {props.children}\n </CatchBoundary>\n )\n}\n\nexport function DefaultGlobalNotFound() {\n return <p>Not Found</p>\n}\n"],"names":[],"mappings":";;;AAuBgB,SAAA,SAAS,UAAyB,IAAI;AAClD,UAAgB,aAAa;AAC/B,MAAI,QAAQ;AAAa,UAAA;AAClB,SAAA;AACT;AAEO,SAAS,WAAW,KAAgC;AAClD,SAAA,CAAC,EAAC,2BAAK;AAChB;AAEO,SAAS,cAAc,OAI3B;AAED,QAAM,WAAW,eAAe;AAAA,IAC9B,QAAQ,CAAC,MAAM,aAAa,EAAE,SAAS,QAAQ,IAAI,EAAE,MAAM;AAAA,EAAA,CAC5D;AAGC,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,aAAa,MAAM;AAAA,MACnB,SAAS,CAAC,UAAU;;AACd,YAAA,WAAW,KAAK,GAAG;AACrB,sBAAM,YAAN,+BAAgB;AAAA,QAAK,OAChB;AACC,gBAAA;AAAA,QACR;AAAA,MACF;AAAA,MACA,gBAAgB,CAAC,EAAE,YACjB;;AAAA,2BAAM,aAAN,+BAAiB;AAAA;AAAA,MAGlB,UAAM,MAAA;AAAA,IAAA;AAAA,EAAA;AAGb;AAEO,SAAS,wBAAwB;AAC/B,SAAA,oBAAC,OAAE,UAAS,YAAA,CAAA;AACrB;"}
|
package/dist/esm/redirects.d.ts
CHANGED
|
@@ -12,7 +12,8 @@ export type Redirect<TRouteTree extends AnyRoute = RegisteredRouter['routeTree']
|
|
|
12
12
|
code?: number;
|
|
13
13
|
statusCode?: number;
|
|
14
14
|
throw?: any;
|
|
15
|
+
headers?: HeadersInit;
|
|
15
16
|
} & NavigateOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>;
|
|
16
|
-
export type ResolvedRedirect<TRouteTree extends AnyRoute = RegisteredRouter['routeTree'], TFrom extends RoutePaths<TRouteTree> = '/', TTo extends string = '', TMaskFrom extends RoutePaths<TRouteTree> = TFrom, TMaskTo extends string = ''> = PickAsRequired<Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>, 'code' | 'statusCode' | 'href'>;
|
|
17
|
+
export type ResolvedRedirect<TRouteTree extends AnyRoute = RegisteredRouter['routeTree'], TFrom extends RoutePaths<TRouteTree> = '/', TTo extends string = '', TMaskFrom extends RoutePaths<TRouteTree> = TFrom, TMaskTo extends string = ''> = PickAsRequired<Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>, 'code' | 'statusCode' | 'href' | 'headers'>;
|
|
17
18
|
export declare function redirect<TRouteTree extends AnyRoute = RegisteredRouter['routeTree'], TFrom extends RoutePaths<TRouteTree> = '/', TTo extends string = '', TMaskFrom extends RoutePaths<TRouteTree> = TFrom, TMaskTo extends string = ''>(opts: Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>): Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>;
|
|
18
19
|
export declare function isRedirect(obj: any): obj is AnyRedirect;
|
package/dist/esm/redirects.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redirects.js","sources":["../../src/redirects.ts"],"sourcesContent":["import { PickAsRequired } from '.'\nimport { NavigateOptions } from './link'\nimport { AnyRoute } from './route'\nimport { RoutePaths } from './routeInfo'\nimport { RegisteredRouter } from './router'\n\nexport type AnyRedirect = Redirect<any, any, any, any, any>\n\nexport type Redirect<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n> = {\n /**\n * @deprecated Use `statusCode` instead\n **/\n href?: string\n code?: number\n statusCode?: number\n throw?: any\n} & NavigateOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>\n\nexport type ResolvedRedirect<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n> = PickAsRequired<\n Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n 'code' | 'statusCode' | 'href'\n>\n\nexport function redirect<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n>(\n opts: Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n): Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo> {\n ;(opts as any).isRedirect = true\n opts.statusCode = opts.statusCode || opts.code || 301\n if (opts.throw
|
|
1
|
+
{"version":3,"file":"redirects.js","sources":["../../src/redirects.ts"],"sourcesContent":["import { PickAsRequired } from '.'\nimport { NavigateOptions } from './link'\nimport { AnyRoute } from './route'\nimport { RoutePaths } from './routeInfo'\nimport { RegisteredRouter } from './router'\n\nexport type AnyRedirect = Redirect<any, any, any, any, any>\n\nexport type Redirect<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n> = {\n /**\n * @deprecated Use `statusCode` instead\n **/\n href?: string\n code?: number\n statusCode?: number\n throw?: any\n headers?: HeadersInit\n} & NavigateOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>\n\nexport type ResolvedRedirect<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n> = PickAsRequired<\n Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n 'code' | 'statusCode' | 'href' | 'headers'\n>\n\nexport function redirect<\n TRouteTree extends AnyRoute = RegisteredRouter['routeTree'],\n TFrom extends RoutePaths<TRouteTree> = '/',\n TTo extends string = '',\n TMaskFrom extends RoutePaths<TRouteTree> = TFrom,\n TMaskTo extends string = '',\n>(\n opts: Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,\n): Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo> {\n ;(opts as any).isRedirect = true\n opts.statusCode = opts.statusCode || opts.code || 301\n opts.headers = opts.headers || {}\n if (opts.throw) {\n throw opts\n }\n\n return opts\n}\n\nexport function isRedirect(obj: any): obj is AnyRedirect {\n return !!obj?.isRedirect\n}\n"],"names":[],"mappings":"AAoCO,SAAS,SAOd,MACsD;AACpD,OAAa,aAAa;AAC5B,OAAK,aAAa,KAAK,cAAc,KAAK,QAAQ;AAC7C,OAAA,UAAU,KAAK,WAAW,CAAA;AAC/B,MAAI,KAAK,OAAO;AACR,UAAA;AAAA,EACR;AAEO,SAAA;AACT;AAEO,SAAS,WAAW,KAA8B;AAChD,SAAA,CAAC,EAAC,2BAAK;AAChB;"}
|
package/dist/esm/routeInfo.d.ts
CHANGED
|
@@ -17,7 +17,7 @@ export type RoutesByPath<TRouteTree extends AnyRoute> = {
|
|
|
17
17
|
} & Record<'.' | '..', ParseRoute<TRouteTree>>;
|
|
18
18
|
export type RouteByPath<TRouteTree extends AnyRoute, TPath> = Extract<string extends TPath ? ParseRoute<TRouteTree> : RoutesByPath<TRouteTree>[TPath], AnyRoute>;
|
|
19
19
|
export type RoutePaths<TRouteTree extends AnyRoute> = ParseRoute<TRouteTree>['fullPath'] | '/';
|
|
20
|
-
export type RoutePathsAutoComplete<TRouteTree extends AnyRoute, T> =
|
|
20
|
+
export type RoutePathsAutoComplete<TRouteTree extends AnyRoute, T> = (string extends T ? T & {} : T) | RoutePaths<TRouteTree>;
|
|
21
21
|
type UnionizeCollisions<T, U> = {
|
|
22
22
|
[P in keyof T & keyof U]: T[P] extends U[P] ? T[P] : T[P] | U[P];
|
|
23
23
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/react-router",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.21.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"author": "Tanner Linsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
"scripts": {
|
|
68
68
|
"clean": "rimraf ./dist && rimraf ./coverage",
|
|
69
69
|
"test:types": "tsc",
|
|
70
|
-
"test:lib": "vitest",
|
|
70
|
+
"test:lib": "vitest --typecheck",
|
|
71
71
|
"test:lib:dev": "pnpm run test:lib --watch",
|
|
72
72
|
"test:build": "publint --strict",
|
|
73
73
|
"build": "vite build"
|
package/src/index.tsx
CHANGED
package/src/not-found.tsx
CHANGED
package/src/redirects.ts
CHANGED
|
@@ -20,6 +20,7 @@ export type Redirect<
|
|
|
20
20
|
code?: number
|
|
21
21
|
statusCode?: number
|
|
22
22
|
throw?: any
|
|
23
|
+
headers?: HeadersInit
|
|
23
24
|
} & NavigateOptions<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>
|
|
24
25
|
|
|
25
26
|
export type ResolvedRedirect<
|
|
@@ -30,7 +31,7 @@ export type ResolvedRedirect<
|
|
|
30
31
|
TMaskTo extends string = '',
|
|
31
32
|
> = PickAsRequired<
|
|
32
33
|
Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo>,
|
|
33
|
-
'code' | 'statusCode' | 'href'
|
|
34
|
+
'code' | 'statusCode' | 'href' | 'headers'
|
|
34
35
|
>
|
|
35
36
|
|
|
36
37
|
export function redirect<
|
|
@@ -44,7 +45,8 @@ export function redirect<
|
|
|
44
45
|
): Redirect<TRouteTree, TFrom, TTo, TMaskFrom, TMaskTo> {
|
|
45
46
|
;(opts as any).isRedirect = true
|
|
46
47
|
opts.statusCode = opts.statusCode || opts.code || 301
|
|
47
|
-
|
|
48
|
+
opts.headers = opts.headers || {}
|
|
49
|
+
if (opts.throw) {
|
|
48
50
|
throw opts
|
|
49
51
|
}
|
|
50
52
|
|
package/src/routeInfo.ts
CHANGED
|
@@ -36,9 +36,8 @@ export type RoutePaths<TRouteTree extends AnyRoute> =
|
|
|
36
36
|
| '/'
|
|
37
37
|
|
|
38
38
|
export type RoutePathsAutoComplete<TRouteTree extends AnyRoute, T> =
|
|
39
|
-
| T
|
|
39
|
+
| (string extends T ? T & {} : T)
|
|
40
40
|
| RoutePaths<TRouteTree>
|
|
41
|
-
| (string & {})
|
|
42
41
|
|
|
43
42
|
type UnionizeCollisions<T, U> = {
|
|
44
43
|
[P in keyof T & keyof U]: T[P] extends U[P] ? T[P] : T[P] | U[P]
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const invariant = require("tiny-invariant");
|
|
4
|
-
const serverFnReturnTypeHeader = "server-fn-return-type";
|
|
5
|
-
const serverFnPayloadTypeHeader = "server-fn-payload-type";
|
|
6
|
-
function createServerFn(method, fn) {
|
|
7
|
-
const compiledFn = fn;
|
|
8
|
-
invariant(
|
|
9
|
-
compiledFn.url,
|
|
10
|
-
`createServerFn must be called with a function that is marked with the 'use server' pragma.`
|
|
11
|
-
);
|
|
12
|
-
return Object.assign(
|
|
13
|
-
async (payload, opts) => {
|
|
14
|
-
return compiledFn({
|
|
15
|
-
method,
|
|
16
|
-
payload: payload || void 0,
|
|
17
|
-
requestInit: opts == null ? void 0 : opts.requestInit
|
|
18
|
-
});
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
url: fn.url
|
|
22
|
-
}
|
|
23
|
-
);
|
|
24
|
-
}
|
|
25
|
-
function json(payload, opts) {
|
|
26
|
-
return new Response(JSON.stringify(payload), {
|
|
27
|
-
status: (opts == null ? void 0 : opts.status) || 200,
|
|
28
|
-
statusText: (opts == null ? void 0 : opts.statusText) || (opts == null ? void 0 : opts.status) === 200 ? "OK" : "Error",
|
|
29
|
-
headers: {
|
|
30
|
-
"Content-Type": "application/json",
|
|
31
|
-
[serverFnReturnTypeHeader]: "json",
|
|
32
|
-
...opts == null ? void 0 : opts.headers
|
|
33
|
-
}
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
exports.createServerFn = createServerFn;
|
|
37
|
-
exports.json = json;
|
|
38
|
-
exports.serverFnPayloadTypeHeader = serverFnPayloadTypeHeader;
|
|
39
|
-
exports.serverFnReturnTypeHeader = serverFnReturnTypeHeader;
|
|
40
|
-
//# sourceMappingURL=createServerFn.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createServerFn.cjs","sources":["../../src/createServerFn.ts"],"sourcesContent":["import invariant from 'tiny-invariant'\n\nexport const serverFnReturnTypeHeader = 'server-fn-return-type'\nexport const serverFnPayloadTypeHeader = 'server-fn-payload-type'\n\nexport interface JsonResponse<TData> extends Response {\n json(): Promise<TData>\n}\n\nexport type FetcherOptionsBase = {\n method?: 'GET' | 'POST'\n}\n\nexport type FetcherOptions = FetcherOptionsBase & {\n requestInit?: RequestInit\n}\n\nexport type FetchFnCtx = {\n method: 'GET' | 'POST'\n request: Request\n}\n\nexport type FetchFn<TPayload, TResponse> = {\n (payload: TPayload, ctx: FetchFnCtx): Promise<TResponse> | TResponse\n url?: string\n}\n\nexport type CompiledFetcherFnOptions<TPayload> = {\n method: 'GET' | 'POST'\n payload: TPayload | undefined\n requestInit?: RequestInit\n}\n\nexport type CompiledFetcherFn<TPayload, TResponse> = {\n (opts: CompiledFetcherFnOptions<TPayload>): Promise<TResponse>\n url: string\n}\n\ntype IsPayloadOptional<T> = [T] extends [undefined] ? true : false\n\nexport type Fetcher<TPayload, TResponse> =\n (IsPayloadOptional<TPayload> extends true\n ? {\n (\n payload?: TPayload,\n opts?: FetcherOptions,\n ): Promise<JsonResponseOrPayload<TResponse>>\n }\n : {\n (\n payload: TPayload,\n opts?: FetcherOptions,\n ): Promise<JsonResponseOrPayload<TResponse>>\n }) & {\n url: string\n }\n\nexport type JsonResponseOrPayload<TResponse> =\n TResponse extends JsonResponse<infer TData> ? TData : TResponse\n\nexport function createServerFn<\n TPayload extends any = undefined,\n TResponse = unknown,\n>(\n method: 'GET' | 'POST',\n fn: FetchFn<TPayload, TResponse>,\n): Fetcher<TPayload, TResponse> {\n // Cast the compiled function that will be injected by vinxi\n const compiledFn = fn as unknown as CompiledFetcherFn<TPayload, TResponse>\n\n invariant(\n compiledFn.url,\n `createServerFn must be called with a function that is marked with the 'use server' pragma.`,\n )\n\n return Object.assign(\n async (payload: TPayload, opts?: FetcherOptions) => {\n return compiledFn({\n method,\n payload: payload || undefined,\n requestInit: opts?.requestInit,\n })\n },\n {\n url: fn.url!,\n },\n ) as Fetcher<TPayload, TResponse>\n}\n\nexport function json<TData>(\n payload: TData,\n opts?: {\n status?: number\n statusText?: string\n headers?: HeadersInit\n },\n): JsonResponse<TData> {\n return new Response(JSON.stringify(payload), {\n status: opts?.status || 200,\n statusText: opts?.statusText || opts?.status === 200 ? 'OK' : 'Error',\n headers: {\n 'Content-Type': 'application/json',\n [serverFnReturnTypeHeader]: 'json',\n ...opts?.headers,\n },\n })\n}\n"],"names":[],"mappings":";;;AAEO,MAAM,2BAA2B;AACjC,MAAM,4BAA4B;AAyDzB,SAAA,eAId,QACA,IAC8B;AAE9B,QAAM,aAAa;AAEnB;AAAA,IACE,WAAW;AAAA,IACX;AAAA,EAAA;AAGF,SAAO,OAAO;AAAA,IACZ,OAAO,SAAmB,SAA0B;AAClD,aAAO,WAAW;AAAA,QAChB;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,aAAa,6BAAM;AAAA,MAAA,CACpB;AAAA,IACH;AAAA,IACA;AAAA,MACE,KAAK,GAAG;AAAA,IACV;AAAA,EAAA;AAEJ;AAEgB,SAAA,KACd,SACA,MAKqB;AACrB,SAAO,IAAI,SAAS,KAAK,UAAU,OAAO,GAAG;AAAA,IAC3C,SAAQ,6BAAM,WAAU;AAAA,IACxB,aAAY,6BAAM,gBAAc,6BAAM,YAAW,MAAM,OAAO;AAAA,IAC9D,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,CAAC,wBAAwB,GAAG;AAAA,MAC5B,GAAG,6BAAM;AAAA,IACX;AAAA,EAAA,CACD;AACH;;;;;"}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
export declare const serverFnReturnTypeHeader = "server-fn-return-type";
|
|
2
|
-
export declare const serverFnPayloadTypeHeader = "server-fn-payload-type";
|
|
3
|
-
export interface JsonResponse<TData> extends Response {
|
|
4
|
-
json(): Promise<TData>;
|
|
5
|
-
}
|
|
6
|
-
export type FetcherOptionsBase = {
|
|
7
|
-
method?: 'GET' | 'POST';
|
|
8
|
-
};
|
|
9
|
-
export type FetcherOptions = FetcherOptionsBase & {
|
|
10
|
-
requestInit?: RequestInit;
|
|
11
|
-
};
|
|
12
|
-
export type FetchFnCtx = {
|
|
13
|
-
method: 'GET' | 'POST';
|
|
14
|
-
request: Request;
|
|
15
|
-
};
|
|
16
|
-
export type FetchFn<TPayload, TResponse> = {
|
|
17
|
-
(payload: TPayload, ctx: FetchFnCtx): Promise<TResponse> | TResponse;
|
|
18
|
-
url?: string;
|
|
19
|
-
};
|
|
20
|
-
export type CompiledFetcherFnOptions<TPayload> = {
|
|
21
|
-
method: 'GET' | 'POST';
|
|
22
|
-
payload: TPayload | undefined;
|
|
23
|
-
requestInit?: RequestInit;
|
|
24
|
-
};
|
|
25
|
-
export type CompiledFetcherFn<TPayload, TResponse> = {
|
|
26
|
-
(opts: CompiledFetcherFnOptions<TPayload>): Promise<TResponse>;
|
|
27
|
-
url: string;
|
|
28
|
-
};
|
|
29
|
-
type IsPayloadOptional<T> = [T] extends [undefined] ? true : false;
|
|
30
|
-
export type Fetcher<TPayload, TResponse> = (IsPayloadOptional<TPayload> extends true ? {
|
|
31
|
-
(payload?: TPayload, opts?: FetcherOptions): Promise<JsonResponseOrPayload<TResponse>>;
|
|
32
|
-
} : {
|
|
33
|
-
(payload: TPayload, opts?: FetcherOptions): Promise<JsonResponseOrPayload<TResponse>>;
|
|
34
|
-
}) & {
|
|
35
|
-
url: string;
|
|
36
|
-
};
|
|
37
|
-
export type JsonResponseOrPayload<TResponse> = TResponse extends JsonResponse<infer TData> ? TData : TResponse;
|
|
38
|
-
export declare function createServerFn<TPayload extends any = undefined, TResponse = unknown>(method: 'GET' | 'POST', fn: FetchFn<TPayload, TResponse>): Fetcher<TPayload, TResponse>;
|
|
39
|
-
export declare function json<TData>(payload: TData, opts?: {
|
|
40
|
-
status?: number;
|
|
41
|
-
statusText?: string;
|
|
42
|
-
headers?: HeadersInit;
|
|
43
|
-
}): JsonResponse<TData>;
|
|
44
|
-
export {};
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
export declare const serverFnReturnTypeHeader = "server-fn-return-type";
|
|
2
|
-
export declare const serverFnPayloadTypeHeader = "server-fn-payload-type";
|
|
3
|
-
export interface JsonResponse<TData> extends Response {
|
|
4
|
-
json(): Promise<TData>;
|
|
5
|
-
}
|
|
6
|
-
export type FetcherOptionsBase = {
|
|
7
|
-
method?: 'GET' | 'POST';
|
|
8
|
-
};
|
|
9
|
-
export type FetcherOptions = FetcherOptionsBase & {
|
|
10
|
-
requestInit?: RequestInit;
|
|
11
|
-
};
|
|
12
|
-
export type FetchFnCtx = {
|
|
13
|
-
method: 'GET' | 'POST';
|
|
14
|
-
request: Request;
|
|
15
|
-
};
|
|
16
|
-
export type FetchFn<TPayload, TResponse> = {
|
|
17
|
-
(payload: TPayload, ctx: FetchFnCtx): Promise<TResponse> | TResponse;
|
|
18
|
-
url?: string;
|
|
19
|
-
};
|
|
20
|
-
export type CompiledFetcherFnOptions<TPayload> = {
|
|
21
|
-
method: 'GET' | 'POST';
|
|
22
|
-
payload: TPayload | undefined;
|
|
23
|
-
requestInit?: RequestInit;
|
|
24
|
-
};
|
|
25
|
-
export type CompiledFetcherFn<TPayload, TResponse> = {
|
|
26
|
-
(opts: CompiledFetcherFnOptions<TPayload>): Promise<TResponse>;
|
|
27
|
-
url: string;
|
|
28
|
-
};
|
|
29
|
-
type IsPayloadOptional<T> = [T] extends [undefined] ? true : false;
|
|
30
|
-
export type Fetcher<TPayload, TResponse> = (IsPayloadOptional<TPayload> extends true ? {
|
|
31
|
-
(payload?: TPayload, opts?: FetcherOptions): Promise<JsonResponseOrPayload<TResponse>>;
|
|
32
|
-
} : {
|
|
33
|
-
(payload: TPayload, opts?: FetcherOptions): Promise<JsonResponseOrPayload<TResponse>>;
|
|
34
|
-
}) & {
|
|
35
|
-
url: string;
|
|
36
|
-
};
|
|
37
|
-
export type JsonResponseOrPayload<TResponse> = TResponse extends JsonResponse<infer TData> ? TData : TResponse;
|
|
38
|
-
export declare function createServerFn<TPayload extends any = undefined, TResponse = unknown>(method: 'GET' | 'POST', fn: FetchFn<TPayload, TResponse>): Fetcher<TPayload, TResponse>;
|
|
39
|
-
export declare function json<TData>(payload: TData, opts?: {
|
|
40
|
-
status?: number;
|
|
41
|
-
statusText?: string;
|
|
42
|
-
headers?: HeadersInit;
|
|
43
|
-
}): JsonResponse<TData>;
|
|
44
|
-
export {};
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import invariant from "tiny-invariant";
|
|
2
|
-
const serverFnReturnTypeHeader = "server-fn-return-type";
|
|
3
|
-
const serverFnPayloadTypeHeader = "server-fn-payload-type";
|
|
4
|
-
function createServerFn(method, fn) {
|
|
5
|
-
const compiledFn = fn;
|
|
6
|
-
invariant(
|
|
7
|
-
compiledFn.url,
|
|
8
|
-
`createServerFn must be called with a function that is marked with the 'use server' pragma.`
|
|
9
|
-
);
|
|
10
|
-
return Object.assign(
|
|
11
|
-
async (payload, opts) => {
|
|
12
|
-
return compiledFn({
|
|
13
|
-
method,
|
|
14
|
-
payload: payload || void 0,
|
|
15
|
-
requestInit: opts == null ? void 0 : opts.requestInit
|
|
16
|
-
});
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
url: fn.url
|
|
20
|
-
}
|
|
21
|
-
);
|
|
22
|
-
}
|
|
23
|
-
function json(payload, opts) {
|
|
24
|
-
return new Response(JSON.stringify(payload), {
|
|
25
|
-
status: (opts == null ? void 0 : opts.status) || 200,
|
|
26
|
-
statusText: (opts == null ? void 0 : opts.statusText) || (opts == null ? void 0 : opts.status) === 200 ? "OK" : "Error",
|
|
27
|
-
headers: {
|
|
28
|
-
"Content-Type": "application/json",
|
|
29
|
-
[serverFnReturnTypeHeader]: "json",
|
|
30
|
-
...opts == null ? void 0 : opts.headers
|
|
31
|
-
}
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
export {
|
|
35
|
-
createServerFn,
|
|
36
|
-
json,
|
|
37
|
-
serverFnPayloadTypeHeader,
|
|
38
|
-
serverFnReturnTypeHeader
|
|
39
|
-
};
|
|
40
|
-
//# sourceMappingURL=createServerFn.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createServerFn.js","sources":["../../src/createServerFn.ts"],"sourcesContent":["import invariant from 'tiny-invariant'\n\nexport const serverFnReturnTypeHeader = 'server-fn-return-type'\nexport const serverFnPayloadTypeHeader = 'server-fn-payload-type'\n\nexport interface JsonResponse<TData> extends Response {\n json(): Promise<TData>\n}\n\nexport type FetcherOptionsBase = {\n method?: 'GET' | 'POST'\n}\n\nexport type FetcherOptions = FetcherOptionsBase & {\n requestInit?: RequestInit\n}\n\nexport type FetchFnCtx = {\n method: 'GET' | 'POST'\n request: Request\n}\n\nexport type FetchFn<TPayload, TResponse> = {\n (payload: TPayload, ctx: FetchFnCtx): Promise<TResponse> | TResponse\n url?: string\n}\n\nexport type CompiledFetcherFnOptions<TPayload> = {\n method: 'GET' | 'POST'\n payload: TPayload | undefined\n requestInit?: RequestInit\n}\n\nexport type CompiledFetcherFn<TPayload, TResponse> = {\n (opts: CompiledFetcherFnOptions<TPayload>): Promise<TResponse>\n url: string\n}\n\ntype IsPayloadOptional<T> = [T] extends [undefined] ? true : false\n\nexport type Fetcher<TPayload, TResponse> =\n (IsPayloadOptional<TPayload> extends true\n ? {\n (\n payload?: TPayload,\n opts?: FetcherOptions,\n ): Promise<JsonResponseOrPayload<TResponse>>\n }\n : {\n (\n payload: TPayload,\n opts?: FetcherOptions,\n ): Promise<JsonResponseOrPayload<TResponse>>\n }) & {\n url: string\n }\n\nexport type JsonResponseOrPayload<TResponse> =\n TResponse extends JsonResponse<infer TData> ? TData : TResponse\n\nexport function createServerFn<\n TPayload extends any = undefined,\n TResponse = unknown,\n>(\n method: 'GET' | 'POST',\n fn: FetchFn<TPayload, TResponse>,\n): Fetcher<TPayload, TResponse> {\n // Cast the compiled function that will be injected by vinxi\n const compiledFn = fn as unknown as CompiledFetcherFn<TPayload, TResponse>\n\n invariant(\n compiledFn.url,\n `createServerFn must be called with a function that is marked with the 'use server' pragma.`,\n )\n\n return Object.assign(\n async (payload: TPayload, opts?: FetcherOptions) => {\n return compiledFn({\n method,\n payload: payload || undefined,\n requestInit: opts?.requestInit,\n })\n },\n {\n url: fn.url!,\n },\n ) as Fetcher<TPayload, TResponse>\n}\n\nexport function json<TData>(\n payload: TData,\n opts?: {\n status?: number\n statusText?: string\n headers?: HeadersInit\n },\n): JsonResponse<TData> {\n return new Response(JSON.stringify(payload), {\n status: opts?.status || 200,\n statusText: opts?.statusText || opts?.status === 200 ? 'OK' : 'Error',\n headers: {\n 'Content-Type': 'application/json',\n [serverFnReturnTypeHeader]: 'json',\n ...opts?.headers,\n },\n })\n}\n"],"names":[],"mappings":";AAEO,MAAM,2BAA2B;AACjC,MAAM,4BAA4B;AAyDzB,SAAA,eAId,QACA,IAC8B;AAE9B,QAAM,aAAa;AAEnB;AAAA,IACE,WAAW;AAAA,IACX;AAAA,EAAA;AAGF,SAAO,OAAO;AAAA,IACZ,OAAO,SAAmB,SAA0B;AAClD,aAAO,WAAW;AAAA,QAChB;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,aAAa,6BAAM;AAAA,MAAA,CACpB;AAAA,IACH;AAAA,IACA;AAAA,MACE,KAAK,GAAG;AAAA,IACV;AAAA,EAAA;AAEJ;AAEgB,SAAA,KACd,SACA,MAKqB;AACrB,SAAO,IAAI,SAAS,KAAK,UAAU,OAAO,GAAG;AAAA,IAC3C,SAAQ,6BAAM,WAAU;AAAA,IACxB,aAAY,6BAAM,gBAAc,6BAAM,YAAW,MAAM,OAAO;AAAA,IAC9D,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,CAAC,wBAAwB,GAAG;AAAA,MAC5B,GAAG,6BAAM;AAAA,IACX;AAAA,EAAA,CACD;AACH;"}
|
package/src/createServerFn.ts
DELETED
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import invariant from 'tiny-invariant'
|
|
2
|
-
|
|
3
|
-
export const serverFnReturnTypeHeader = 'server-fn-return-type'
|
|
4
|
-
export const serverFnPayloadTypeHeader = 'server-fn-payload-type'
|
|
5
|
-
|
|
6
|
-
export interface JsonResponse<TData> extends Response {
|
|
7
|
-
json(): Promise<TData>
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export type FetcherOptionsBase = {
|
|
11
|
-
method?: 'GET' | 'POST'
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export type FetcherOptions = FetcherOptionsBase & {
|
|
15
|
-
requestInit?: RequestInit
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export type FetchFnCtx = {
|
|
19
|
-
method: 'GET' | 'POST'
|
|
20
|
-
request: Request
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export type FetchFn<TPayload, TResponse> = {
|
|
24
|
-
(payload: TPayload, ctx: FetchFnCtx): Promise<TResponse> | TResponse
|
|
25
|
-
url?: string
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export type CompiledFetcherFnOptions<TPayload> = {
|
|
29
|
-
method: 'GET' | 'POST'
|
|
30
|
-
payload: TPayload | undefined
|
|
31
|
-
requestInit?: RequestInit
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export type CompiledFetcherFn<TPayload, TResponse> = {
|
|
35
|
-
(opts: CompiledFetcherFnOptions<TPayload>): Promise<TResponse>
|
|
36
|
-
url: string
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
type IsPayloadOptional<T> = [T] extends [undefined] ? true : false
|
|
40
|
-
|
|
41
|
-
export type Fetcher<TPayload, TResponse> =
|
|
42
|
-
(IsPayloadOptional<TPayload> extends true
|
|
43
|
-
? {
|
|
44
|
-
(
|
|
45
|
-
payload?: TPayload,
|
|
46
|
-
opts?: FetcherOptions,
|
|
47
|
-
): Promise<JsonResponseOrPayload<TResponse>>
|
|
48
|
-
}
|
|
49
|
-
: {
|
|
50
|
-
(
|
|
51
|
-
payload: TPayload,
|
|
52
|
-
opts?: FetcherOptions,
|
|
53
|
-
): Promise<JsonResponseOrPayload<TResponse>>
|
|
54
|
-
}) & {
|
|
55
|
-
url: string
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export type JsonResponseOrPayload<TResponse> =
|
|
59
|
-
TResponse extends JsonResponse<infer TData> ? TData : TResponse
|
|
60
|
-
|
|
61
|
-
export function createServerFn<
|
|
62
|
-
TPayload extends any = undefined,
|
|
63
|
-
TResponse = unknown,
|
|
64
|
-
>(
|
|
65
|
-
method: 'GET' | 'POST',
|
|
66
|
-
fn: FetchFn<TPayload, TResponse>,
|
|
67
|
-
): Fetcher<TPayload, TResponse> {
|
|
68
|
-
// Cast the compiled function that will be injected by vinxi
|
|
69
|
-
const compiledFn = fn as unknown as CompiledFetcherFn<TPayload, TResponse>
|
|
70
|
-
|
|
71
|
-
invariant(
|
|
72
|
-
compiledFn.url,
|
|
73
|
-
`createServerFn must be called with a function that is marked with the 'use server' pragma.`,
|
|
74
|
-
)
|
|
75
|
-
|
|
76
|
-
return Object.assign(
|
|
77
|
-
async (payload: TPayload, opts?: FetcherOptions) => {
|
|
78
|
-
return compiledFn({
|
|
79
|
-
method,
|
|
80
|
-
payload: payload || undefined,
|
|
81
|
-
requestInit: opts?.requestInit,
|
|
82
|
-
})
|
|
83
|
-
},
|
|
84
|
-
{
|
|
85
|
-
url: fn.url!,
|
|
86
|
-
},
|
|
87
|
-
) as Fetcher<TPayload, TResponse>
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
export function json<TData>(
|
|
91
|
-
payload: TData,
|
|
92
|
-
opts?: {
|
|
93
|
-
status?: number
|
|
94
|
-
statusText?: string
|
|
95
|
-
headers?: HeadersInit
|
|
96
|
-
},
|
|
97
|
-
): JsonResponse<TData> {
|
|
98
|
-
return new Response(JSON.stringify(payload), {
|
|
99
|
-
status: opts?.status || 200,
|
|
100
|
-
statusText: opts?.statusText || opts?.status === 200 ? 'OK' : 'Error',
|
|
101
|
-
headers: {
|
|
102
|
-
'Content-Type': 'application/json',
|
|
103
|
-
[serverFnReturnTypeHeader]: 'json',
|
|
104
|
-
...opts?.headers,
|
|
105
|
-
},
|
|
106
|
-
})
|
|
107
|
-
}
|