1
+ import { isDataWithResponseInit } from "../router/router" ;
2
+ import { isRedirectStatusCode } from "./responses" ;
1
3
import type {
2
4
ActionFunction ,
3
5
ActionFunctionArgs ,
@@ -20,60 +22,37 @@ export interface AppLoadContext {
20
22
*/
21
23
export type AppData = unknown ;
22
24
23
- export async function callRouteAction ( {
24
- loadContext,
25
- action,
26
- params,
27
- request,
28
- routeId,
29
- } : {
30
- request : Request ;
31
- action : ActionFunction ;
32
- params : ActionFunctionArgs [ "params" ] ;
33
- loadContext : AppLoadContext ;
34
- routeId : string ;
35
- } ) {
36
- let result = await action ( {
37
- request : stripRoutesParam ( stripIndexParam ( request ) ) ,
38
- context : loadContext ,
39
- params,
40
- } ) ;
41
-
42
- if ( result === undefined ) {
43
- throw new Error (
44
- `You defined an action for route "${ routeId } " but didn't return ` +
45
- `anything from your \`action\` function. Please return a value or \`null\`.`
25
+ function checkRedirect ( result : ReturnType < LoaderFunction | ActionFunction > ) {
26
+ if (
27
+ isDataWithResponseInit ( result ) &&
28
+ result . init &&
29
+ isRedirectStatusCode ( result . init . status || 200 )
30
+ ) {
31
+ throw new Response (
32
+ new Headers ( result . init . headers ) . get ( "Location" ) ! ,
33
+ result . init
46
34
) ;
47
35
}
48
-
49
- return result ;
50
36
}
51
37
52
- export async function callRouteLoader ( {
38
+ export async function callRouteHandler ( {
53
39
loadContext,
54
- loader ,
40
+ handler ,
55
41
params,
56
42
request,
57
- routeId,
58
43
} : {
59
44
request : Request ;
60
- loader : LoaderFunction ;
61
- params : LoaderFunctionArgs [ "params" ] ;
45
+ handler : LoaderFunction | ActionFunction ;
46
+ params : LoaderFunctionArgs [ "params" ] | ActionFunctionArgs [ "params" ] ;
62
47
loadContext : AppLoadContext ;
63
- routeId : string ;
64
48
} ) {
65
- let result = await loader ( {
49
+ let result = await handler ( {
66
50
request : stripRoutesParam ( stripIndexParam ( request ) ) ,
67
51
context : loadContext ,
68
52
params,
69
53
} ) ;
70
54
71
- if ( result === undefined ) {
72
- throw new Error (
73
- `You defined a loader for route "${ routeId } " but didn't return ` +
74
- `anything from your \`loader\` function. Please return a value or \`null\`.`
75
- ) ;
76
- }
55
+ checkRedirect ( result ) ;
77
56
78
57
return result ;
79
58
}
0 commit comments