Skip to content

Commit ad49367

Browse files
result()
1 parent 983b431 commit ad49367

10 files changed

Lines changed: 597 additions & 177 deletions

File tree

e2e/react-start/server-functions/src/routes/middleware/client-conditional.tsx

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,16 @@ const clientConditionalMiddleware = createMiddleware({
1313
.inputValidator(
1414
(input: { shouldShortCircuit: boolean; value: string }) => input,
1515
)
16-
.client(async ({ data, next }) => {
16+
.client(async ({ data, next, result }) => {
1717
if (data.shouldShortCircuit) {
18-
return {
19-
source: 'client-middleware',
20-
message: 'Conditional early return from client middleware',
21-
condition: 'shouldShortCircuit=true',
22-
timestamp: Date.now(),
23-
}
18+
return result({
19+
data: {
20+
source: 'client-middleware',
21+
message: 'Conditional early return from client middleware',
22+
condition: 'shouldShortCircuit=true',
23+
timestamp: Date.now(),
24+
},
25+
})
2426
}
2527
// Proceed to server
2628
return next({

e2e/react-start/server-functions/src/routes/middleware/client-early-return.tsx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,14 @@ import React from 'react'
1313
*/
1414
const clientEarlyReturnMiddleware = createMiddleware({
1515
type: 'function',
16-
}).client(async () => {
17-
return {
18-
source: 'client-middleware',
19-
message: 'Early return from client middleware',
20-
timestamp: Date.now(),
21-
}
16+
}).client(async ({ result }) => {
17+
return result({
18+
data: {
19+
source: 'client-middleware',
20+
message: 'Early return from client middleware',
21+
timestamp: Date.now(),
22+
},
23+
})
2224
})
2325

2426
const serverFn = createServerFn()

e2e/react-start/server-functions/src/routes/middleware/nested-early-return.tsx

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,15 @@ type EarlyReturnInput = {
2323
// Deepest level - conditionally returns early based on input
2424
const deepMiddleware = createMiddleware({ type: 'function' })
2525
.inputValidator((input: EarlyReturnInput) => input)
26-
.server(async ({ data, next }) => {
26+
.server(async ({ data, next, result }) => {
2727
if (data.earlyReturnLevel === 'deep') {
28-
return {
29-
returnedFrom: 'deepMiddleware',
30-
message: 'Early return from deepest middleware',
31-
level: 3,
32-
}
28+
return result({
29+
data: {
30+
returnedFrom: 'deepMiddleware',
31+
message: 'Early return from deepest middleware',
32+
level: 3,
33+
},
34+
})
3335
}
3436
return next({
3537
context: {
@@ -41,14 +43,16 @@ const deepMiddleware = createMiddleware({ type: 'function' })
4143
// Middle level - wraps deep middleware, may also return early
4244
const middleMiddleware = createMiddleware({ type: 'function' })
4345
.middleware([deepMiddleware])
44-
.server(async ({ data, next, context }) => {
46+
.server(async ({ data, next, context, result }) => {
4547
if (data.earlyReturnLevel === 'middle') {
46-
return {
47-
returnedFrom: 'middleMiddleware',
48-
message: 'Early return from middle middleware',
49-
level: 2,
50-
deepContext: context,
51-
}
48+
return result({
49+
data: {
50+
returnedFrom: 'middleMiddleware',
51+
message: 'Early return from middle middleware',
52+
level: 2,
53+
deepContext: context,
54+
},
55+
})
5256
}
5357
return next({
5458
context: {
@@ -60,14 +64,16 @@ const middleMiddleware = createMiddleware({ type: 'function' })
6064
// Outer level - wraps middle middleware, may also return early
6165
const outerMiddleware = createMiddleware({ type: 'function' })
6266
.middleware([middleMiddleware])
63-
.server(async ({ data, next, context }) => {
67+
.server(async ({ data, next, context, result }) => {
6468
if (data.earlyReturnLevel === 'outer') {
65-
return {
66-
returnedFrom: 'outerMiddleware',
67-
message: 'Early return from outer middleware',
68-
level: 1,
69-
middleContext: context,
70-
}
69+
return result({
70+
data: {
71+
returnedFrom: 'outerMiddleware',
72+
message: 'Early return from outer middleware',
73+
level: 1,
74+
middleContext: context,
75+
},
76+
})
7177
}
7278
return next({
7379
context: {

e2e/react-start/server-functions/src/routes/middleware/server-conditional.tsx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,15 @@ const serverConditionalMiddleware = createMiddleware({
1313
.inputValidator(
1414
(input: { shouldShortCircuit: boolean; value: string }) => input,
1515
)
16-
.server(async ({ data, next }) => {
16+
.server(async ({ data, next, result }) => {
1717
if (data.shouldShortCircuit) {
18-
return {
19-
source: 'middleware',
20-
message: 'Conditional early return from server middleware',
21-
condition: 'shouldShortCircuit=true',
22-
}
18+
return result({
19+
data: {
20+
source: 'middleware',
21+
message: 'Conditional early return from server middleware',
22+
condition: 'shouldShortCircuit=true',
23+
},
24+
})
2325
}
2426
return next({
2527
context: {

e2e/react-start/server-functions/src/routes/middleware/server-early-return.tsx

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@ import React from 'react'
1111
*/
1212
const serverEarlyReturnMiddleware = createMiddleware({
1313
type: 'function',
14-
}).server(async () => {
15-
return {
16-
source: 'middleware',
17-
message: 'Early return from server middleware',
18-
}
14+
}).server(async ({ result }) => {
15+
return result({
16+
data: {
17+
source: 'middleware',
18+
message: 'Early return from server middleware',
19+
},
20+
})
1921
})
2022

2123
const serverFn = createServerFn()
@@ -35,13 +37,15 @@ const serverFn = createServerFn()
3537
*/
3638
const methodPropertyMiddleware = createMiddleware({
3739
type: 'function',
38-
}).server(async () => {
39-
return {
40-
source: 'middleware',
41-
method: 'GET',
42-
headers: { 'Content-Type': 'application/json' },
43-
message: 'Early return with method property',
44-
}
40+
}).server(async ({ result }) => {
41+
return result({
42+
data: {
43+
source: 'middleware',
44+
method: 'GET',
45+
headers: { 'Content-Type': 'application/json' },
46+
message: 'Early return with method property',
47+
},
48+
})
4549
})
4650

4751
const serverFnWithMethodProperty = createServerFn()

packages/start-client-core/src/constants.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,15 @@ export const TSS_SERVER_FUNCTION_FACTORY = Symbol.for(
1111
*/
1212
export const TSS_MIDDLEWARE_RESULT = Symbol.for('TSS_MIDDLEWARE_RESULT')
1313

14+
/**
15+
* Symbol used to mark middleware results that came from calling result().
16+
* This allows middleware to explicitly short-circuit the chain with a typed
17+
* early return value that gets tracked through the type system.
18+
*/
19+
export const TSS_MIDDLEWARE_EARLY_RESULT = Symbol.for(
20+
'TSS_MIDDLEWARE_EARLY_RESULT',
21+
)
22+
1423
export const X_TSS_SERIALIZED = 'x-tss-serialized'
1524
export const X_TSS_RAW_RESPONSE = 'x-tss-raw'
1625
export const X_TSS_CONTEXT = 'x-tss-context'

0 commit comments

Comments
 (0)