effect-start 0.34.0 → 0.35.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/README.md +303 -36
- package/dist/Fetch.d.ts +1 -1
- package/dist/FileRouter.d.ts +1 -1
- package/dist/FileRouterCodegen.d.ts.map +1 -1
- package/dist/FileRouterCodegen.js +8 -2
- package/dist/FileRouterCodegen.js.map +1 -1
- package/dist/Job.d.ts +94 -0
- package/dist/Job.d.ts.map +1 -0
- package/dist/Job.js +157 -0
- package/dist/Job.js.map +1 -0
- package/dist/Password.d.ts +1 -1
- package/dist/Route.d.ts +20 -15
- package/dist/Route.d.ts.map +1 -1
- package/dist/Route.js +12 -0
- package/dist/Route.js.map +1 -1
- package/dist/RouteBody.d.ts +7 -7
- package/dist/RouteBody.d.ts.map +1 -1
- package/dist/RouteBody.js.map +1 -1
- package/dist/RouteHook.d.ts +1 -1
- package/dist/RouteHook.d.ts.map +1 -1
- package/dist/RouteHook.js.map +1 -1
- package/dist/RouteHttp.d.ts.map +1 -1
- package/dist/RouteHttp.js +10 -4
- package/dist/RouteHttp.js.map +1 -1
- package/dist/RouteLink.d.ts +16 -0
- package/dist/RouteLink.d.ts.map +1 -0
- package/dist/RouteLink.js +23 -0
- package/dist/RouteLink.js.map +1 -0
- package/dist/RouteMount.d.ts +29 -32
- package/dist/RouteMount.d.ts.map +1 -1
- package/dist/RouteMount.js.map +1 -1
- package/dist/RouteSchema.d.ts +81 -28
- package/dist/RouteSchema.d.ts.map +1 -1
- package/dist/RouteSchema.js +56 -101
- package/dist/RouteSchema.js.map +1 -1
- package/dist/RouteSse.d.ts +1 -1
- package/dist/RouteSse.d.ts.map +1 -1
- package/dist/RouteSse.js.map +1 -1
- package/dist/Socket.d.ts +1 -1
- package/dist/Start.js +1 -1
- package/dist/Start.js.map +1 -1
- package/dist/StaticFiles.d.ts +4 -10
- package/dist/StaticFiles.d.ts.map +1 -1
- package/dist/StaticFiles.js +3 -10
- package/dist/StaticFiles.js.map +1 -1
- package/dist/System.d.ts +1 -1
- package/dist/_Docker.d.ts +1 -1
- package/dist/_HtmlScanner.d.ts +42 -0
- package/dist/_HtmlScanner.d.ts.map +1 -0
- package/dist/_HtmlScanner.js +385 -0
- package/dist/_HtmlScanner.js.map +1 -0
- package/dist/_RouteLink.d.ts +16 -0
- package/dist/_RouteLink.d.ts.map +1 -0
- package/dist/_RouteLink.js +22 -0
- package/dist/_RouteLink.js.map +1 -0
- package/dist/bun/BunRoute.d.ts +4 -6
- package/dist/bun/BunRoute.d.ts.map +1 -1
- package/dist/bun/BunRoute.js +1 -1
- package/dist/bun/BunRoute.js.map +1 -1
- package/dist/bundler/Bundle.d.ts +1 -1
- package/dist/bundler/BundleRoute.d.ts +5 -6
- package/dist/bundler/BundleRoute.d.ts.map +1 -1
- package/dist/bundler/BundleRoute.js +5 -11
- package/dist/bundler/BundleRoute.js.map +1 -1
- package/dist/datastar/watchers/patchElements.js +1 -1
- package/dist/datastar/watchers/patchElements.js.map +1 -1
- package/dist/experimental/CsrfProtection.d.ts +67 -0
- package/dist/experimental/CsrfProtection.d.ts.map +1 -0
- package/dist/experimental/CsrfProtection.js +100 -0
- package/dist/experimental/CsrfProtection.js.map +1 -0
- package/dist/experimental/EncryptedCookies.d.ts +1 -1
- package/dist/experimental/KeyValueStore.d.ts +1 -1
- package/dist/lint/plugin.js +4 -0
- package/dist/lint/plugin.js.map +1 -1
- package/dist/sql/SqlClient.d.ts +1 -1
- package/dist/studio/Studio.d.ts +1 -1
- package/dist/studio/Studio.d.ts.map +1 -1
- package/dist/studio/Studio.js +4 -10
- package/dist/studio/Studio.js.map +1 -1
- package/dist/studio/routes/errors/route.d.ts +3 -3
- package/dist/studio/routes/errors/route.d.ts.map +1 -1
- package/dist/studio/routes/errors/route.js +3 -2
- package/dist/studio/routes/errors/route.js.map +1 -1
- package/dist/studio/routes/fiberDetail.d.ts +3 -7
- package/dist/studio/routes/fiberDetail.d.ts.map +1 -1
- package/dist/studio/routes/fibers/route.d.ts +3 -3
- package/dist/studio/routes/layout.d.ts +3 -3
- package/dist/studio/routes/logs/route.d.ts +3 -3
- package/dist/studio/routes/logs/route.d.ts.map +1 -1
- package/dist/studio/routes/logs/route.js +3 -2
- package/dist/studio/routes/logs/route.js.map +1 -1
- package/dist/studio/routes/metrics/route.d.ts +3 -3
- package/dist/studio/routes/route.d.ts +2 -2
- package/dist/studio/routes/routes/route.d.ts +2 -2
- package/dist/studio/routes/services/route.d.ts +2 -2
- package/dist/studio/routes/system/route.d.ts +3 -3
- package/dist/studio/routes/traceDetail.d.ts +3 -7
- package/dist/studio/routes/traceDetail.d.ts.map +1 -1
- package/dist/studio/routes/traces/route.d.ts +3 -3
- package/dist/studio/routes/traces/route.d.ts.map +1 -1
- package/dist/studio/routes/traces/route.js +3 -2
- package/dist/studio/routes/traces/route.js.map +1 -1
- package/dist/studio/routes/tree.d.ts +43 -51
- package/dist/studio/routes/tree.d.ts.map +1 -1
- package/package.json +4 -3
- package/src/FileRouterCodegen.ts +8 -2
- package/src/Route.ts +55 -34
- package/src/RouteBody.ts +15 -15
- package/src/RouteHook.ts +3 -3
- package/src/RouteHttp.ts +10 -4
- package/src/RouteLink.ts +56 -0
- package/src/RouteMount.ts +43 -48
- package/src/RouteSchema.ts +299 -166
- package/src/RouteSse.ts +3 -3
- package/src/Start.ts +1 -1
- package/src/StaticFiles.ts +10 -24
- package/src/_HtmlScanner.ts +415 -0
- package/src/bun/BunRoute.ts +11 -11
- package/src/bundler/BundleRoute.ts +8 -19
- package/src/datastar/watchers/patchElements.ts +1 -1
- package/src/dev.d.ts +3 -0
- package/src/experimental/CsrfProtection.ts +153 -0
- package/src/lint/plugin.js +2 -0
- package/src/studio/Studio.ts +4 -14
- package/src/studio/routes/errors/route.tsx +3 -2
- package/src/studio/routes/logs/route.tsx +3 -2
- package/src/studio/routes/traces/route.tsx +3 -2
package/src/RouteBody.ts
CHANGED
|
@@ -111,13 +111,13 @@ export interface BuildReturn<Value, F extends Format, Body = never> {
|
|
|
111
111
|
>(
|
|
112
112
|
handler: GeneratorHandler<NoInfer<D & B & Route.ExtractBindings<I> & { format: F }>, A, Y>,
|
|
113
113
|
): (
|
|
114
|
-
self: Route.RouteSet
|
|
115
|
-
) => Route.RouteSet
|
|
114
|
+
self: Route.RouteSet<D, B, I>,
|
|
115
|
+
) => Route.RouteSet<
|
|
116
116
|
D,
|
|
117
117
|
B,
|
|
118
118
|
[
|
|
119
119
|
...I,
|
|
120
|
-
Route.Route
|
|
120
|
+
Route.Route<
|
|
121
121
|
{ format: F },
|
|
122
122
|
{},
|
|
123
123
|
[Body] extends [never] ? A : Body,
|
|
@@ -137,11 +137,11 @@ export interface BuildReturn<Value, F extends Format, Body = never> {
|
|
|
137
137
|
>(
|
|
138
138
|
handler: HandlerInput<NoInfer<D & B & Route.ExtractBindings<I> & { format: F }>, A, E, R>,
|
|
139
139
|
): (
|
|
140
|
-
self: Route.RouteSet
|
|
141
|
-
) => Route.RouteSet
|
|
140
|
+
self: Route.RouteSet<D, B, I>,
|
|
141
|
+
) => Route.RouteSet<
|
|
142
142
|
D,
|
|
143
143
|
B,
|
|
144
|
-
[...I, Route.Route
|
|
144
|
+
[...I, Route.Route<{ format: F }, {}, [Body] extends [never] ? A : Body, E, R>]
|
|
145
145
|
>
|
|
146
146
|
}
|
|
147
147
|
|
|
@@ -163,7 +163,7 @@ export function build<Value, F extends Format>(options: {
|
|
|
163
163
|
E = never,
|
|
164
164
|
R = never,
|
|
165
165
|
>(handler: HandlerInput<NoInfer<D & B & Route.ExtractBindings<I> & { format: F }>, A, E, R>) {
|
|
166
|
-
return (self: Route.RouteSet
|
|
166
|
+
return (self: Route.RouteSet<D, B, I>) => {
|
|
167
167
|
const contentType = formatToContentType[descriptors.format]
|
|
168
168
|
const baseHandler = handle(handler)
|
|
169
169
|
const wrappedHandler: Route.Route.Handler<{ format: F }, A, E, R> = (ctx, next) =>
|
|
@@ -191,7 +191,7 @@ export function build<Value, F extends Format>(options: {
|
|
|
191
191
|
|
|
192
192
|
const route = Route.make<{ format: F }, {}, A, E, R>(wrappedHandler, descriptors)
|
|
193
193
|
|
|
194
|
-
return Route.set<D, B, [...I, Route.Route
|
|
194
|
+
return Route.set<D, B, [...I, Route.Route<{ format: F }, {}, A, E, R>]>(
|
|
195
195
|
[...Route.items(self), route],
|
|
196
196
|
Route.descriptor(self),
|
|
197
197
|
)
|
|
@@ -210,11 +210,11 @@ export function render<
|
|
|
210
210
|
>(
|
|
211
211
|
handler: GeneratorHandler<NoInfer<D & B & Route.ExtractBindings<I> & { format: "*" }>, A, Y>,
|
|
212
212
|
): (
|
|
213
|
-
self: Route.RouteSet
|
|
214
|
-
) => Route.RouteSet
|
|
213
|
+
self: Route.RouteSet<D, B, I>,
|
|
214
|
+
) => Route.RouteSet<
|
|
215
215
|
D,
|
|
216
216
|
B,
|
|
217
|
-
[...I, Route.Route
|
|
217
|
+
[...I, Route.Route<{ format: "*" }, {}, A, YieldError<Y>, YieldContext<Y>>]
|
|
218
218
|
>
|
|
219
219
|
export function render<
|
|
220
220
|
D extends Route.RouteDescriptor.Any,
|
|
@@ -226,8 +226,8 @@ export function render<
|
|
|
226
226
|
>(
|
|
227
227
|
handler: HandlerInput<NoInfer<D & B & Route.ExtractBindings<I> & { format: "*" }>, A, E, R>,
|
|
228
228
|
): (
|
|
229
|
-
self: Route.RouteSet
|
|
230
|
-
) => Route.RouteSet
|
|
229
|
+
self: Route.RouteSet<D, B, I>,
|
|
230
|
+
) => Route.RouteSet<D, B, [...I, Route.Route<{ format: "*" }, {}, A, E, R>]>
|
|
231
231
|
export function render<
|
|
232
232
|
D extends Route.RouteDescriptor.Any,
|
|
233
233
|
B extends {},
|
|
@@ -236,14 +236,14 @@ export function render<
|
|
|
236
236
|
E = never,
|
|
237
237
|
R = never,
|
|
238
238
|
>(handler: HandlerInput<NoInfer<D & B & Route.ExtractBindings<I> & { format: "*" }>, A, E, R>) {
|
|
239
|
-
return (self: Route.RouteSet
|
|
239
|
+
return (self: Route.RouteSet<D, B, I>) => {
|
|
240
240
|
const baseHandler = handle(handler)
|
|
241
241
|
const route = Route.make<{ format: "*" }, {}, A, E, R>(
|
|
242
242
|
(ctx, next) => baseHandler(ctx as D & B & Route.ExtractBindings<I> & { format: "*" }, next),
|
|
243
243
|
{ format: "*" },
|
|
244
244
|
)
|
|
245
245
|
|
|
246
|
-
return Route.set<D, B, [...I, Route.Route
|
|
246
|
+
return Route.set<D, B, [...I, Route.Route<{ format: "*" }, {}, A, E, R>]>(
|
|
247
247
|
[...Route.items(self), route],
|
|
248
248
|
Route.descriptor(self),
|
|
249
249
|
)
|
package/src/RouteHook.ts
CHANGED
|
@@ -25,8 +25,8 @@ export function filter<
|
|
|
25
25
|
const normalized = normalizeFilterHandler(filterHandler)
|
|
26
26
|
|
|
27
27
|
return function (
|
|
28
|
-
self: Route.RouteSet
|
|
29
|
-
): Route.RouteSet
|
|
28
|
+
self: Route.RouteSet<D, SB, P>,
|
|
29
|
+
): Route.RouteSet<D, SB, [...P, Route.Route<{}, BOut, unknown, E, R>]> {
|
|
30
30
|
const route = Route.make<{}, BOut, unknown, E, R>(
|
|
31
31
|
(context: BOut, next: (ctx?: Partial<BOut>) => Entity.Entity<unknown>) =>
|
|
32
32
|
Effect.gen(function* () {
|
|
@@ -39,7 +39,7 @@ export function filter<
|
|
|
39
39
|
)
|
|
40
40
|
|
|
41
41
|
return Route.set(
|
|
42
|
-
[...Route.items(self), route] as [...P, Route.Route
|
|
42
|
+
[...Route.items(self), route] as [...P, Route.Route<{}, BOut, unknown, E, R>],
|
|
43
43
|
Route.descriptor(self),
|
|
44
44
|
)
|
|
45
45
|
}
|
package/src/RouteHttp.ts
CHANGED
|
@@ -185,6 +185,8 @@ function determineSelectedFormat(
|
|
|
185
185
|
|
|
186
186
|
export const toWebHandlerRuntime = <R>(runtime: Runtime.Runtime<R>) => {
|
|
187
187
|
const runFork = Runtime.runFork(runtime)
|
|
188
|
+
const runSync = Runtime.runSync(runtime)
|
|
189
|
+
const inDevelopment = Option.isSome(runSync(Development.option))
|
|
188
190
|
|
|
189
191
|
return (routes: Iterable<UnboundedRouteWithMethod>): Http.WebHandler => {
|
|
190
192
|
const allRoutes = Array.from(routes)
|
|
@@ -290,7 +292,7 @@ export const toWebHandlerRuntime = <R>(runtime: Runtime.Runtime<R>) => {
|
|
|
290
292
|
|
|
291
293
|
const url = new URL(request.url)
|
|
292
294
|
|
|
293
|
-
const innerEffect = Effect.gen(function* () {
|
|
295
|
+
const innerEffect = Effect.provideService(Effect.gen(function* () {
|
|
294
296
|
const result = yield* createChain({ request, selectedFormat })
|
|
295
297
|
|
|
296
298
|
const entity = Entity.isEntity(result) ? result : Entity.make(result, { status: 200 })
|
|
@@ -304,7 +306,7 @@ export const toWebHandlerRuntime = <R>(runtime: Runtime.Runtime<R>) => {
|
|
|
304
306
|
response.headers.set("vary", "Accept")
|
|
305
307
|
}
|
|
306
308
|
return response
|
|
307
|
-
})
|
|
309
|
+
}), Route.Request, request)
|
|
308
310
|
|
|
309
311
|
if (tracerDisabled) {
|
|
310
312
|
return innerEffect
|
|
@@ -354,7 +356,9 @@ export const toWebHandlerRuntime = <R>(runtime: Runtime.Runtime<R>) => {
|
|
|
354
356
|
Effect.gen(function* () {
|
|
355
357
|
yield* Effect.logError(cause)
|
|
356
358
|
const status = getStatusFromCause(cause)
|
|
357
|
-
const message =
|
|
359
|
+
const message = inDevelopment
|
|
360
|
+
? Cause.pretty(cause, { renderErrorCause: true })
|
|
361
|
+
: "Internal Server Error"
|
|
358
362
|
return respondError({ status, message })
|
|
359
363
|
}),
|
|
360
364
|
),
|
|
@@ -382,7 +386,9 @@ export const toWebHandlerRuntime = <R>(runtime: Runtime.Runtime<R>) => {
|
|
|
382
386
|
resolve(respondError({ status: 499, message: "client closed request" }))
|
|
383
387
|
} else {
|
|
384
388
|
const status = getStatusFromCause(exit.cause)
|
|
385
|
-
const message =
|
|
389
|
+
const message = inDevelopment
|
|
390
|
+
? Cause.pretty(exit.cause, { renderErrorCause: true })
|
|
391
|
+
: "Internal Server Error"
|
|
386
392
|
resolve(respondError({ status, message }))
|
|
387
393
|
}
|
|
388
394
|
})
|
package/src/RouteLink.ts
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type * as PathPattern from "./_PathPattern.ts"
|
|
2
|
+
import type * as Route from "./Route.ts"
|
|
3
|
+
import type { Routes as DevRoutes } from "effect-start/dev"
|
|
4
|
+
|
|
5
|
+
export type LinkParams<
|
|
6
|
+
Routes,
|
|
7
|
+
P extends string,
|
|
8
|
+
B = P extends keyof Routes
|
|
9
|
+
? Routes[P] extends [...any[], infer L] // last route
|
|
10
|
+
? L extends () => Promise<{ default: infer R extends Route.RouteSet.Any }>
|
|
11
|
+
? Route.Route.Bindings<R>
|
|
12
|
+
: {}
|
|
13
|
+
: {}
|
|
14
|
+
: {},
|
|
15
|
+
> = {
|
|
16
|
+
[K in keyof PathPattern.Params<P>]: B extends { pathParams: infer S }
|
|
17
|
+
? K extends keyof S
|
|
18
|
+
? S[K]
|
|
19
|
+
: string | number
|
|
20
|
+
: string | number
|
|
21
|
+
} & (B extends { searchParams: infer S } ? { [K in keyof S]?: S[K] } : {})
|
|
22
|
+
|
|
23
|
+
export function link<
|
|
24
|
+
Routes = DevRoutes,
|
|
25
|
+
P extends keyof Routes extends never
|
|
26
|
+
? // Falls back to any string when no routes are registered
|
|
27
|
+
string
|
|
28
|
+
: keyof Routes & string = keyof Routes extends never ? string : keyof Routes & string,
|
|
29
|
+
>(
|
|
30
|
+
...args: {} extends LinkParams<Routes, P>
|
|
31
|
+
? [path: P, params?: LinkParams<Routes, P>]
|
|
32
|
+
: [path: P, params: LinkParams<Routes, P>]
|
|
33
|
+
): string {
|
|
34
|
+
const path = args[0] as string
|
|
35
|
+
// Substitute path params, deleting used keys so the rest become search params
|
|
36
|
+
const remaining = { ...args[1] } as Record<string, string | number | undefined>
|
|
37
|
+
const result = path.replace(
|
|
38
|
+
/\/:(\w+)([?*+])?/g,
|
|
39
|
+
(_, name: string, modifier: string | undefined) => {
|
|
40
|
+
const value = remaining[name]
|
|
41
|
+
delete remaining[name]
|
|
42
|
+
if (value == null) {
|
|
43
|
+
if (modifier === "?" || modifier === "*") return ""
|
|
44
|
+
return "/"
|
|
45
|
+
}
|
|
46
|
+
return "/" + encodeURIComponent(String(value))
|
|
47
|
+
},
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
const search = new URLSearchParams()
|
|
51
|
+
for (const key in remaining) {
|
|
52
|
+
if (remaining[key] != null) search.set(key, String(remaining[key]))
|
|
53
|
+
}
|
|
54
|
+
const qs = search.toString()
|
|
55
|
+
return qs ? result + "?" + qs : result
|
|
56
|
+
}
|
package/src/RouteMount.ts
CHANGED
|
@@ -7,10 +7,7 @@ import type * as RouteBody from "./RouteBody.ts"
|
|
|
7
7
|
|
|
8
8
|
const RouteSetTypeId = "~effect-start/RouteSet" as const
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
type Module = typeof import("./RouteMount.ts")
|
|
12
|
-
|
|
13
|
-
export type Self = RouteMount.Builder<any, any> | Omit<RouteMount.Builder<any, any>, "use"> | Module
|
|
10
|
+
export type Self = RouteMount.Builder<any, any> | typeof import("./RouteMount.ts")
|
|
14
11
|
|
|
15
12
|
export const use = makeMethodDescriber("*")
|
|
16
13
|
export const get = makeMethodDescriber("GET")
|
|
@@ -65,7 +62,7 @@ function makeMethodDescriber<M extends RouteMount.Method>(method: M): RouteMount
|
|
|
65
62
|
const itemDescriptor = Route.descriptor(item)
|
|
66
63
|
const newDescriptor = { method, ...itemDescriptor }
|
|
67
64
|
return Route.make(
|
|
68
|
-
(item as Route.Route
|
|
65
|
+
(item as Route.Route).handler as Route.Route.Handler<any, any, any, any>,
|
|
69
66
|
newDescriptor,
|
|
70
67
|
)
|
|
71
68
|
})
|
|
@@ -75,7 +72,7 @@ function makeMethodDescriber<M extends RouteMount.Method>(method: M): RouteMount
|
|
|
75
72
|
return describeMethod as RouteMount.Describer<M>
|
|
76
73
|
}
|
|
77
74
|
|
|
78
|
-
export type MountedRoute = Route.Route
|
|
75
|
+
export type MountedRoute = Route.Route<
|
|
79
76
|
{
|
|
80
77
|
method: RouteMount.Method
|
|
81
78
|
path: PathPattern.PathPattern
|
|
@@ -90,34 +87,43 @@ export type MountedRoute = Route.Route.Route<
|
|
|
90
87
|
export namespace RouteMount {
|
|
91
88
|
export type Method = "*" | Http.Method
|
|
92
89
|
|
|
93
|
-
export type MountSet = Route.RouteSet
|
|
90
|
+
export type MountSet = Route.RouteSet<{ method: Method }, {}, Route.Route.Tuple>
|
|
94
91
|
|
|
95
|
-
export
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
92
|
+
export type Builder<D extends {} = {}, I extends Route.Route.Tuple = []> = Route.RouteSet<
|
|
93
|
+
D,
|
|
94
|
+
{},
|
|
95
|
+
I
|
|
96
|
+
> &
|
|
97
|
+
(HasMethod<I> extends true ? {} : { use: Describer<"*"> }) & {
|
|
98
|
+
get: Describer<"GET">
|
|
99
|
+
post: Describer<"POST">
|
|
100
|
+
put: Describer<"PUT">
|
|
101
|
+
del: Describer<"DELETE">
|
|
102
|
+
patch: Describer<"PATCH">
|
|
103
|
+
head: Describer<"HEAD">
|
|
104
|
+
options: Describer<"OPTIONS">
|
|
105
|
+
}
|
|
106
106
|
|
|
107
|
-
|
|
108
|
-
|
|
107
|
+
type HasMethod<I extends Route.Route.Tuple> = I extends [
|
|
108
|
+
infer Head,
|
|
109
|
+
...infer Tail extends Route.Route.Tuple,
|
|
110
|
+
]
|
|
111
|
+
? Head extends Route.Route<{ method: infer M }, any, any, any, any>
|
|
112
|
+
? M extends Http.Method
|
|
113
|
+
? true
|
|
114
|
+
: HasMethod<Tail>
|
|
115
|
+
: HasMethod<Tail>
|
|
116
|
+
: false
|
|
109
117
|
|
|
110
|
-
export type EmptySet<M extends Method, B = {}> = Route.RouteSet
|
|
118
|
+
export type EmptySet<M extends Method, B = {}> = Route.RouteSet<{ method: M }, B, []>
|
|
111
119
|
|
|
112
120
|
export type Items<S> = S extends Builder<any, infer I> ? I : []
|
|
113
121
|
|
|
114
122
|
export type BuilderBindings<S> =
|
|
115
|
-
S extends Builder<any, infer I>
|
|
116
|
-
? Types.Simplify<WildcardBindings<I>> & { request: Request }
|
|
117
|
-
: { request: Request }
|
|
123
|
+
S extends Builder<any, infer I> ? Types.Simplify<WildcardBindings<I>> : {}
|
|
118
124
|
|
|
119
125
|
type WildcardBindingsItem<T> =
|
|
120
|
-
T extends Route.Route
|
|
126
|
+
T extends Route.Route<{ method: "*" }, infer B, any, any, any> ? B : {}
|
|
121
127
|
|
|
122
128
|
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
|
|
123
129
|
k: infer I,
|
|
@@ -131,35 +137,24 @@ export namespace RouteMount {
|
|
|
131
137
|
}[number]
|
|
132
138
|
>
|
|
133
139
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
export type FlattenItems<M extends Method, B, I extends Route.Route.Tuple> = I extends [
|
|
137
|
-
Route.Route.Route<infer D, infer RB, infer A, infer E, infer R>,
|
|
140
|
+
export type FlattenItems<M extends Method, I extends Route.Route.Tuple> = I extends [
|
|
141
|
+
Route.Route<infer D, infer RB, infer A, infer E, infer R>,
|
|
138
142
|
...infer Tail extends Route.Route.Tuple,
|
|
139
143
|
]
|
|
140
|
-
? [
|
|
141
|
-
Route.Route.Route<
|
|
142
|
-
Types.Simplify<{ method: M } & D> & {},
|
|
143
|
-
Types.Simplify<Omit<B & RB, "request">>,
|
|
144
|
-
A,
|
|
145
|
-
E,
|
|
146
|
-
R
|
|
147
|
-
>,
|
|
148
|
-
...FlattenItems<M, Types.Simplify<B & RB>, Tail>,
|
|
149
|
-
]
|
|
144
|
+
? [Route.Route<Types.Simplify<{ method: M } & D> & {}, RB, A, E, R>, ...FlattenItems<M, Tail>]
|
|
150
145
|
: []
|
|
151
146
|
|
|
152
147
|
export interface Describer<M extends Method> {
|
|
153
148
|
<S extends Self, A extends Route.RouteSet.Any>(
|
|
154
149
|
this: S,
|
|
155
150
|
ab: (a: EmptySet<M, BuilderBindings<S>>) => A,
|
|
156
|
-
):
|
|
151
|
+
): Builder<{}, [...Items<S>, ...FlattenItems<M, Route.RouteSet.Items<A>>]>
|
|
157
152
|
|
|
158
153
|
<S extends Self, A extends Route.RouteSet.Any, B extends Route.RouteSet.Any>(
|
|
159
154
|
this: S,
|
|
160
155
|
ab: (a: EmptySet<M, BuilderBindings<S>>) => A,
|
|
161
156
|
bc: (b: A) => B,
|
|
162
|
-
):
|
|
157
|
+
): Builder<{}, [...Items<S>, ...FlattenItems<M, Route.RouteSet.Items<B>>]>
|
|
163
158
|
|
|
164
159
|
<
|
|
165
160
|
S extends Self,
|
|
@@ -171,7 +166,7 @@ export namespace RouteMount {
|
|
|
171
166
|
ab: (a: EmptySet<M, BuilderBindings<S>>) => A,
|
|
172
167
|
bc: (b: A) => B,
|
|
173
168
|
cd: (c: B) => C,
|
|
174
|
-
):
|
|
169
|
+
): Builder<{}, [...Items<S>, ...FlattenItems<M, Route.RouteSet.Items<C>>]>
|
|
175
170
|
|
|
176
171
|
<
|
|
177
172
|
S extends Self,
|
|
@@ -185,7 +180,7 @@ export namespace RouteMount {
|
|
|
185
180
|
bc: (b: A) => B,
|
|
186
181
|
cd: (c: B) => C,
|
|
187
182
|
de: (d: C) => D,
|
|
188
|
-
):
|
|
183
|
+
): Builder<{}, [...Items<S>, ...FlattenItems<M, Route.RouteSet.Items<D>>]>
|
|
189
184
|
|
|
190
185
|
<
|
|
191
186
|
S extends Self,
|
|
@@ -201,7 +196,7 @@ export namespace RouteMount {
|
|
|
201
196
|
cd: (c: B) => C,
|
|
202
197
|
de: (d: C) => D,
|
|
203
198
|
ef: (e: D) => E,
|
|
204
|
-
):
|
|
199
|
+
): Builder<{}, [...Items<S>, ...FlattenItems<M, Route.RouteSet.Items<E>>]>
|
|
205
200
|
|
|
206
201
|
<
|
|
207
202
|
S extends Self,
|
|
@@ -219,7 +214,7 @@ export namespace RouteMount {
|
|
|
219
214
|
de: (d: C) => D,
|
|
220
215
|
ef: (e: D) => E,
|
|
221
216
|
fg: (f: E) => F,
|
|
222
|
-
):
|
|
217
|
+
): Builder<{}, [...Items<S>, ...FlattenItems<M, Route.RouteSet.Items<F>>]>
|
|
223
218
|
|
|
224
219
|
<
|
|
225
220
|
S extends Self,
|
|
@@ -239,7 +234,7 @@ export namespace RouteMount {
|
|
|
239
234
|
ef: (e: D) => E,
|
|
240
235
|
fg: (f: E) => F,
|
|
241
236
|
gh: (g: F) => G,
|
|
242
|
-
):
|
|
237
|
+
): Builder<{}, [...Items<S>, ...FlattenItems<M, Route.RouteSet.Items<G>>]>
|
|
243
238
|
|
|
244
239
|
<
|
|
245
240
|
S extends Self,
|
|
@@ -261,7 +256,7 @@ export namespace RouteMount {
|
|
|
261
256
|
fg: (f: E) => F,
|
|
262
257
|
gh: (g: F) => G,
|
|
263
258
|
hi: (h: G) => H,
|
|
264
|
-
):
|
|
259
|
+
): Builder<{}, [...Items<S>, ...FlattenItems<M, Route.RouteSet.Items<H>>]>
|
|
265
260
|
|
|
266
261
|
<
|
|
267
262
|
S extends Self,
|
|
@@ -285,6 +280,6 @@ export namespace RouteMount {
|
|
|
285
280
|
gh: (g: F) => G,
|
|
286
281
|
hi: (h: G) => H,
|
|
287
282
|
ij: (i: H) => I,
|
|
288
|
-
):
|
|
283
|
+
): Builder<{}, [...Items<S>, ...FlattenItems<M, Route.RouteSet.Items<I>>]>
|
|
289
284
|
}
|
|
290
285
|
}
|