@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.
@@ -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, {
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -29,4 +29,3 @@ export * from './useRouter.cjs';
29
29
  export * from './useRouterState.cjs';
30
30
  export * from './utils.cjs';
31
31
  export * from './not-found.cjs';
32
- export * from './createServerFn.cjs';
@@ -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":";;;;;AAsBgB,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;;;;;"}
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;;;;;"}
@@ -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;
@@ -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
- if (opts.throw ?? true) {
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 ?? true) {\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":";;AAmCO,SAAS,SAOd,MACsD;AACpD,OAAa,aAAa;AAC5B,OAAK,aAAa,KAAK,cAAc,KAAK,QAAQ;AAC9C,MAAA,KAAK,SAAS,MAAM;AAChB,UAAA;AAAA,EACR;AAEO,SAAA;AACT;AAEO,SAAS,WAAW,KAA8B;AAChD,SAAA,CAAC,EAAC,2BAAK;AAChB;;;"}
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;;;"}
@@ -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;
@@ -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> = T | RoutePaths<TRouteTree> | (string & {});
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
  };
@@ -29,4 +29,3 @@ export * from './useRouter.js';
29
29
  export * from './useRouterState.js';
30
30
  export * from './utils.js';
31
31
  export * from './not-found.js';
32
- export * from './createServerFn.js';
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,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -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":";;;AAsBgB,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;"}
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;"}
@@ -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;
@@ -1,7 +1,8 @@
1
1
  function redirect(opts) {
2
2
  opts.isRedirect = true;
3
3
  opts.statusCode = opts.statusCode || opts.code || 301;
4
- if (opts.throw ?? true) {
4
+ opts.headers = opts.headers || {};
5
+ if (opts.throw) {
5
6
  throw opts;
6
7
  }
7
8
  return opts;
@@ -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 ?? true) {\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":"AAmCO,SAAS,SAOd,MACsD;AACpD,OAAa,aAAa;AAC5B,OAAK,aAAa,KAAK,cAAc,KAAK,QAAQ;AAC9C,MAAA,KAAK,SAAS,MAAM;AAChB,UAAA;AAAA,EACR;AAEO,SAAA;AACT;AAEO,SAAS,WAAW,KAA8B;AAChD,SAAA,CAAC,EAAC,2BAAK;AAChB;"}
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;"}
@@ -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> = T | RoutePaths<TRouteTree> | (string & {});
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.20.6",
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
@@ -30,4 +30,3 @@ export * from './useRouter'
30
30
  export * from './useRouterState'
31
31
  export * from './utils'
32
32
  export * from './not-found'
33
- export * from './createServerFn'
package/src/not-found.tsx CHANGED
@@ -18,6 +18,7 @@ export type NotFoundError = {
18
18
  data?: any
19
19
  throw?: boolean
20
20
  routeId?: RouteIds<RegisteredRouter['routeTree']>
21
+ headers?: HeadersInit
21
22
  }
22
23
 
23
24
  export function notFound(options: NotFoundError = {}) {
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
- if (opts.throw ?? true) {
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;"}
@@ -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
- }