effect-start 0.21.0 → 0.22.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.
Files changed (94) hide show
  1. package/README.md +1 -4
  2. package/dist/Cookies.js +392 -0
  3. package/dist/FileSystem.js +131 -0
  4. package/dist/Socket.js +37 -0
  5. package/package.json +35 -36
  6. package/src/Commander.ts +73 -130
  7. package/src/ContentNegotiation.ts +64 -95
  8. package/src/Cookies.ts +36 -57
  9. package/src/Development.ts +47 -62
  10. package/src/Effectify.ts +222 -206
  11. package/src/Entity.ts +59 -86
  12. package/src/FilePathPattern.ts +5 -5
  13. package/src/FileRouter.ts +37 -62
  14. package/src/FileRouterCodegen.ts +63 -55
  15. package/src/FileSystem.ts +46 -59
  16. package/src/Http.ts +17 -50
  17. package/src/PathPattern.ts +33 -41
  18. package/src/PlatformError.ts +29 -50
  19. package/src/PlatformRuntime.ts +39 -47
  20. package/src/Route.ts +68 -187
  21. package/src/RouteBody.ts +45 -161
  22. package/src/RouteHook.ts +22 -45
  23. package/src/RouteHttp.ts +88 -142
  24. package/src/RouteHttpTracer.ts +25 -26
  25. package/src/RouteMount.ts +100 -238
  26. package/src/RouteSchema.ts +67 -201
  27. package/src/RouteSse.ts +28 -82
  28. package/src/RouteTree.ts +31 -79
  29. package/src/RouteTrie.ts +13 -32
  30. package/src/SchemaExtra.ts +3 -5
  31. package/src/Socket.ts +5 -2
  32. package/src/Start.ts +20 -21
  33. package/src/StreamExtra.ts +93 -96
  34. package/src/TuplePathPattern.ts +54 -43
  35. package/src/Unique.ts +9 -15
  36. package/src/Values.ts +26 -30
  37. package/src/bun/BunBundle.ts +27 -73
  38. package/src/bun/BunImportTrackerPlugin.ts +67 -65
  39. package/src/bun/BunRoute.ts +12 -31
  40. package/src/bun/BunRuntime.ts +3 -10
  41. package/src/bun/BunServer.ts +55 -91
  42. package/src/bun/BunVirtualFilesPlugin.ts +1 -4
  43. package/src/bun/_BunEnhancedResolve.ts +17 -42
  44. package/src/bun/_empty.html +0 -1
  45. package/src/bundler/Bundle.ts +20 -36
  46. package/src/bundler/BundleFiles.ts +35 -55
  47. package/src/client/Overlay.ts +1 -2
  48. package/src/client/ScrollState.ts +5 -9
  49. package/src/client/index.ts +10 -13
  50. package/src/datastar/actions/fetch.ts +29 -48
  51. package/src/datastar/actions/peek.ts +1 -5
  52. package/src/datastar/actions/setAll.ts +2 -2
  53. package/src/datastar/actions/toggleAll.ts +2 -2
  54. package/src/datastar/attributes/attr.ts +17 -18
  55. package/src/datastar/attributes/bind.ts +41 -61
  56. package/src/datastar/attributes/class.ts +2 -5
  57. package/src/datastar/attributes/computed.ts +2 -10
  58. package/src/datastar/attributes/effect.ts +1 -2
  59. package/src/datastar/attributes/indicator.ts +2 -8
  60. package/src/datastar/attributes/init.ts +2 -10
  61. package/src/datastar/attributes/jsonSignals.ts +1 -6
  62. package/src/datastar/attributes/on.ts +4 -13
  63. package/src/datastar/attributes/onIntersect.ts +10 -22
  64. package/src/datastar/attributes/onInterval.ts +2 -10
  65. package/src/datastar/attributes/onSignalPatch.ts +18 -28
  66. package/src/datastar/attributes/ref.ts +1 -2
  67. package/src/datastar/attributes/show.ts +1 -2
  68. package/src/datastar/attributes/signals.ts +1 -5
  69. package/src/datastar/attributes/style.ts +6 -12
  70. package/src/datastar/attributes/text.ts +1 -2
  71. package/src/datastar/engine.ts +102 -158
  72. package/src/datastar/index.ts +2 -2
  73. package/src/datastar/utils.ts +16 -51
  74. package/src/datastar/watchers/patchElements.ts +35 -93
  75. package/src/datastar/watchers/patchSignals.ts +1 -2
  76. package/src/experimental/EncryptedCookies.ts +79 -142
  77. package/src/hyper/Hyper.ts +14 -33
  78. package/src/hyper/HyperHtml.ts +9 -10
  79. package/src/hyper/HyperNode.ts +2 -7
  80. package/src/hyper/HyperRoute.ts +2 -5
  81. package/src/hyper/jsx-runtime.ts +2 -10
  82. package/src/hyper/jsx.d.ts +171 -440
  83. package/src/lint/plugin.js +276 -0
  84. package/src/node/NodeFileSystem.ts +138 -186
  85. package/src/node/NodeUtils.ts +1 -3
  86. package/src/testing/TestLogger.ts +9 -22
  87. package/src/testing/utils.ts +30 -31
  88. package/src/x/cloudflare/CloudflareTunnel.ts +37 -54
  89. package/src/x/datastar/Datastar.ts +3 -10
  90. package/src/x/datastar/index.ts +1 -3
  91. package/src/x/datastar/jsx-datastar.d.ts +1 -4
  92. package/src/x/tailwind/TailwindPlugin.ts +119 -112
  93. package/src/x/tailwind/compile.ts +10 -33
  94. package/src/x/tailwind/plugin.ts +2 -2
package/src/RouteMount.ts CHANGED
@@ -1,17 +1,16 @@
1
1
  import * as Function from "effect/Function"
2
- import * as Types from "effect/Types"
3
- import * as Http from "./Http.ts"
4
- import * as PathPattern from "./PathPattern.ts"
2
+ import type * as Types from "effect/Types"
3
+ import type * as Http from "./Http.ts"
4
+ import type * as PathPattern from "./PathPattern.ts"
5
5
  import * as Route from "./Route.ts"
6
- import * as RouteBody from "./RouteBody.ts"
6
+ import type * as RouteBody from "./RouteBody.ts"
7
7
 
8
8
  const RouteSetTypeId: unique symbol = Symbol.for("effect-start/RouteSet")
9
9
 
10
+ // oxlint-disable-next-line import/first, typescript/consistent-type-imports -- typeof import() is not an import statement
10
11
  type Module = typeof import("./RouteMount.ts")
11
12
 
12
- export type Self =
13
- | RouteMount.Builder
14
- | Module
13
+ export type Self = RouteMount.Builder | Module
15
14
 
16
15
  export const use = makeMethodDescriber("*")
17
16
  export const get = makeMethodDescriber("GET")
@@ -22,94 +21,65 @@ export const patch = makeMethodDescriber("PATCH")
22
21
  export const head = makeMethodDescriber("HEAD")
23
22
  export const options = makeMethodDescriber("OPTIONS")
24
23
 
25
- export const add: RouteMount.Add = function(
24
+ export const add: RouteMount.Add = function (
26
25
  this: Self,
27
26
  path: string,
28
- routes:
29
- | Route.RouteSet.Any
30
- | ((
31
- self: RouteMount.Builder<{}, []>,
32
- ) => Route.RouteSet.Any),
27
+ routes: Route.RouteSet.Any | ((self: RouteMount.Builder<{}, []>) => Route.RouteSet.Any),
33
28
  ) {
34
- const baseItems = Route.isRouteSet(this)
35
- ? Route.items(this)
36
- : [] as const
29
+ const baseItems = Route.isRouteSet(this) ? Route.items(this) : ([] as const)
37
30
 
38
- const routeSet = typeof routes === "function"
39
- ? routes(make<{}, []>([]))
40
- : routes
31
+ const routeSet = typeof routes === "function" ? routes(make<{}, []>([])) : routes
41
32
  const routeItems = Route.items(routeSet)
42
33
  const newItems = routeItems.map((item) => {
43
34
  const itemDescriptor = Route.descriptor(item) as { path?: string }
44
- const concatenatedPath = typeof itemDescriptor?.path === "string"
45
- ? path + itemDescriptor.path
46
- : path
35
+ const concatenatedPath =
36
+ typeof itemDescriptor?.path === "string" ? path + itemDescriptor.path : path
47
37
  const newDescriptor = { ...itemDescriptor, path: concatenatedPath }
48
38
  return Route.isRoute(item)
49
- ? Route.make(
50
- item.handler as Route.Route.Handler<any, any, any, any>,
51
- newDescriptor,
52
- )
39
+ ? Route.make(item.handler as Route.Route.Handler<any, any, any, any>, newDescriptor)
53
40
  : Route.set(Route.items(item), newDescriptor)
54
41
  })
55
42
 
56
- return make([
57
- ...baseItems,
58
- ...newItems,
59
- ] as any)
43
+ return make([...baseItems, ...newItems] as any)
60
44
  }
61
45
 
62
- const Proto = Object.assign(
63
- Object.create(null),
64
- {
65
- [RouteSetTypeId]: RouteSetTypeId,
66
- *[Symbol.iterator](this: Route.RouteSet.Any) {
67
- yield* Route.items(this)
68
- },
69
- use,
70
- get,
71
- post,
72
- put,
73
- del,
74
- patch,
75
- head,
76
- options,
77
- add,
46
+ const Proto = Object.assign(Object.create(null), {
47
+ [RouteSetTypeId]: RouteSetTypeId,
48
+ *[Symbol.iterator](this: Route.RouteSet.Any) {
49
+ yield* Route.items(this)
78
50
  },
79
- )
51
+ use,
52
+ get,
53
+ post,
54
+ put,
55
+ del,
56
+ patch,
57
+ head,
58
+ options,
59
+ add,
60
+ })
80
61
 
81
62
  function make<
82
63
  D extends {} = {},
83
64
  I extends Route.Route.Tuple<{
84
65
  method: string
85
66
  }> = [],
86
- >(
87
- items: I,
88
- ): RouteMount.Builder<D, I> {
89
- return Object.assign(
90
- Object.create(Proto),
91
- {
92
- [Route.RouteItems]: items,
93
- [Route.RouteDescriptor]: {},
94
- },
95
- )
67
+ >(items: I): RouteMount.Builder<D, I> {
68
+ return Object.assign(Object.create(Proto), {
69
+ [Route.RouteItems]: items,
70
+ [Route.RouteDescriptor]: {},
71
+ })
96
72
  }
97
73
 
98
- function makeMethodDescriber<M extends RouteMount.Method>(
99
- method: M,
100
- ): RouteMount.Describer<M> {
74
+ function makeMethodDescriber<M extends RouteMount.Method>(method: M): RouteMount.Describer<M> {
101
75
  function describeMethod(
102
76
  this: Self,
103
- ...fs: ((self: Route.RouteSet.Any) => Route.RouteSet.Any)[]
77
+ ...fs: Array<(self: Route.RouteSet.Any) => Route.RouteSet.Any>
104
78
  ): Route.RouteSet.Any {
105
- const baseItems = Route.isRouteSet(this)
106
- ? Route.items(this)
107
- : [] as const
79
+ const baseItems = Route.isRouteSet(this) ? Route.items(this) : ([] as const)
108
80
 
109
81
  const methodSet = Route.set<{ method: M }, []>([], { method })
110
- const f = Function.flow(
111
- ...fs as [(_: Route.RouteSet.Any) => Route.RouteSet.Any],
112
- )
82
+ const f = Function.flow(...(fs as [(_: Route.RouteSet.Any) => Route.RouteSet.Any]))
113
83
  const result = f(methodSet)
114
84
  const resultItems = Route.items(result)
115
85
 
@@ -118,22 +88,12 @@ function makeMethodDescriber<M extends RouteMount.Method>(
118
88
  const itemDescriptor = Route.descriptor(item)
119
89
  const newDescriptor = { method, ...itemDescriptor }
120
90
  return Route.make(
121
- (item as Route.Route.Route).handler as Route.Route.Handler<
122
- any,
123
- any,
124
- any,
125
- any
126
- >,
91
+ (item as Route.Route.Route).handler as Route.Route.Handler<any, any, any, any>,
127
92
  newDescriptor,
128
93
  )
129
94
  })
130
95
 
131
- return make(
132
- [
133
- ...baseItems,
134
- ...flattenedItems,
135
- ] as any,
136
- )
96
+ return make([...baseItems, ...flattenedItems] as any)
137
97
  }
138
98
  return describeMethod as RouteMount.Describer<M>
139
99
  }
@@ -151,87 +111,56 @@ export type MountedRoute = Route.Route.Route<
151
111
  >
152
112
 
153
113
  export namespace RouteMount {
154
- export type Method =
155
- | "*"
156
- | Http.Method
157
-
158
- export type MountSet = Route.RouteSet.RouteSet<
159
- { method: Method },
160
- {},
161
- Route.Route.Tuple
162
- >
114
+ export type Method = "*" | Http.Method
163
115
 
164
- export interface Builder<
165
- D extends {} = {},
166
- I extends Route.Route.Tuple = [],
167
- > extends Route.RouteSet.RouteSet<D, {}, I>, Module {
168
- }
116
+ export type MountSet = Route.RouteSet.RouteSet<{ method: Method }, {}, Route.Route.Tuple>
169
117
 
170
- export type EmptySet<
171
- M extends Method,
172
- B = {},
173
- > = Route.RouteSet.RouteSet<
174
- { method: M },
175
- B,
176
- []
177
- >
118
+ export interface Builder<D extends {} = {}, I extends Route.Route.Tuple = []>
119
+ extends Route.RouteSet.RouteSet<D, {}, I>, Module {}
120
+
121
+ export type EmptySet<M extends Method, B = {}> = Route.RouteSet.RouteSet<{ method: M }, B, []>
178
122
 
179
123
  export type Items<S> = S extends Builder<any, infer I> ? I : []
180
124
 
181
- export type BuilderBindings<S> = S extends Builder<any, infer I>
182
- ? Types.Simplify<WildcardBindings<I>> & { request: Request }
183
- : { request: Request }
184
-
185
- type WildcardBindingsItem<T> = T extends Route.Route.Route<
186
- { method: "*" },
187
- infer B,
188
- any,
189
- any,
190
- any
191
- > ? B
192
- : {}
193
-
194
- type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends
195
- (k: infer I) => void ? I : never
196
-
197
- export type WildcardBindings<I extends Route.Route.Tuple> =
198
- UnionToIntersection<
199
- {
200
- [K in keyof I]: WildcardBindingsItem<I[K]>
201
- }[number]
202
- >
203
-
204
- type PrefixPathItem<Prefix extends string, T> = T extends
205
- Route.Route.Route<infer D, infer B, infer A, infer E, infer R>
206
- ? D extends { path: infer P extends string } ? Route.Route.Route<
207
- Omit<D, "path"> & { path: `${Prefix}${P}` },
208
- B,
209
- A,
210
- E,
211
- R
212
- >
213
- : Route.Route.Route<D & { path: Prefix }, B, A, E, R>
214
- : T
215
-
216
- export type PrefixPath<
217
- Prefix extends string,
218
- I extends Route.Route.Tuple,
219
- > = {
125
+ export type BuilderBindings<S> =
126
+ S extends Builder<any, infer I>
127
+ ? Types.Simplify<WildcardBindings<I>> & { request: Request }
128
+ : { request: Request }
129
+
130
+ type WildcardBindingsItem<T> =
131
+ T extends Route.Route.Route<{ method: "*" }, infer B, any, any, any> ? B : {}
132
+
133
+ type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
134
+ k: infer I,
135
+ ) => void
136
+ ? I
137
+ : never
138
+
139
+ export type WildcardBindings<I extends Route.Route.Tuple> = UnionToIntersection<
140
+ {
141
+ [K in keyof I]: WildcardBindingsItem<I[K]>
142
+ }[number]
143
+ >
144
+
145
+ type PrefixPathItem<Prefix extends string, T> =
146
+ T extends Route.Route.Route<infer D, infer B, infer A, infer E, infer R>
147
+ ? D extends { path: infer P extends string }
148
+ ? Route.Route.Route<Omit<D, "path"> & { path: `${Prefix}${P}` }, B, A, E, R>
149
+ : Route.Route.Route<D & { path: Prefix }, B, A, E, R>
150
+ : T
151
+
152
+ export type PrefixPath<Prefix extends string, I extends Route.Route.Tuple> = {
220
153
  [K in keyof I]: PrefixPathItem<Prefix, I[K]>
221
- } extends infer R extends Route.Route.Tuple ? R : never
154
+ } extends infer R extends Route.Route.Tuple
155
+ ? R
156
+ : never
222
157
 
223
158
  export interface Add {
224
159
  <S extends Self, P extends string, R extends Route.RouteSet.Any>(
225
160
  this: S,
226
161
  path: P,
227
162
  routes: R,
228
- ): Builder<
229
- {},
230
- [
231
- ...Items<S>,
232
- ...PrefixPath<P, Route.RouteSet.Items<R>>,
233
- ]
234
- >
163
+ ): Builder<{}, [...Items<S>, ...PrefixPath<P, Route.RouteSet.Items<R>>]>
235
164
 
236
165
  <S extends Self, P extends string, R extends Route.RouteSet.Any>(
237
166
  this: S,
@@ -241,63 +170,38 @@ export namespace RouteMount {
241
170
  * nested routes can type-infer outer context when mounting.
242
171
  */
243
172
  routes: (self: Builder<{}, []>) => R,
244
- ): Builder<
245
- {},
246
- [
247
- ...Items<S>,
248
- ...PrefixPath<P, Route.RouteSet.Items<R>>,
249
- ]
250
- >
173
+ ): Builder<{}, [...Items<S>, ...PrefixPath<P, Route.RouteSet.Items<R>>]>
251
174
  }
252
175
 
253
176
  // Flatten items: merge method into descriptor and accumulate bindings through the chain
254
177
  // `request` is omitted from bindings since it's implicit (always available)
255
- export type FlattenItems<
256
- M extends Method,
257
- B,
258
- I extends Route.Route.Tuple,
259
- > = I extends [
178
+ export type FlattenItems<M extends Method, B, I extends Route.Route.Tuple> = I extends [
260
179
  Route.Route.Route<infer D, infer RB, infer A, infer E, infer R>,
261
180
  ...infer Tail extends Route.Route.Tuple,
262
- ] ? [
263
- Route.Route.Route<
264
- Types.Simplify<{ method: M } & D> & {},
265
- Types.Simplify<Omit<B & RB, "request">>,
266
- A,
267
- E,
268
- R
269
- >,
270
- ...FlattenItems<M, Types.Simplify<B & RB>, Tail>,
271
- ]
181
+ ]
182
+ ? [
183
+ Route.Route.Route<
184
+ Types.Simplify<{ method: M } & D> & {},
185
+ Types.Simplify<Omit<B & RB, "request">>,
186
+ A,
187
+ E,
188
+ R
189
+ >,
190
+ ...FlattenItems<M, Types.Simplify<B & RB>, Tail>,
191
+ ]
272
192
  : []
273
193
 
274
194
  export interface Describer<M extends Method> {
275
195
  <S extends Self, A extends Route.RouteSet.Any>(
276
196
  this: S,
277
197
  ab: (a: EmptySet<M, BuilderBindings<S>>) => A,
278
- ): Builder<
279
- {},
280
- [
281
- ...Items<S>,
282
- ...FlattenItems<M, BuilderBindings<S>, Route.RouteSet.Items<A>>,
283
- ]
284
- >
198
+ ): Builder<{}, [...Items<S>, ...FlattenItems<M, BuilderBindings<S>, Route.RouteSet.Items<A>>]>
285
199
 
286
- <
287
- S extends Self,
288
- A extends Route.RouteSet.Any,
289
- B extends Route.RouteSet.Any,
290
- >(
200
+ <S extends Self, A extends Route.RouteSet.Any, B extends Route.RouteSet.Any>(
291
201
  this: S,
292
202
  ab: (a: EmptySet<M, BuilderBindings<S>>) => A,
293
203
  bc: (b: A) => B,
294
- ): Builder<
295
- {},
296
- [
297
- ...Items<S>,
298
- ...FlattenItems<M, BuilderBindings<S>, Route.RouteSet.Items<B>>,
299
- ]
300
- >
204
+ ): Builder<{}, [...Items<S>, ...FlattenItems<M, BuilderBindings<S>, Route.RouteSet.Items<B>>]>
301
205
 
302
206
  <
303
207
  S extends Self,
@@ -309,13 +213,7 @@ export namespace RouteMount {
309
213
  ab: (a: EmptySet<M, BuilderBindings<S>>) => A,
310
214
  bc: (b: A) => B,
311
215
  cd: (c: B) => C,
312
- ): Builder<
313
- {},
314
- [
315
- ...Items<S>,
316
- ...FlattenItems<M, BuilderBindings<S>, Route.RouteSet.Items<C>>,
317
- ]
318
- >
216
+ ): Builder<{}, [...Items<S>, ...FlattenItems<M, BuilderBindings<S>, Route.RouteSet.Items<C>>]>
319
217
 
320
218
  <
321
219
  S extends Self,
@@ -329,13 +227,7 @@ export namespace RouteMount {
329
227
  bc: (b: A) => B,
330
228
  cd: (c: B) => C,
331
229
  de: (d: C) => D,
332
- ): Builder<
333
- {},
334
- [
335
- ...Items<S>,
336
- ...FlattenItems<M, BuilderBindings<S>, Route.RouteSet.Items<D>>,
337
- ]
338
- >
230
+ ): Builder<{}, [...Items<S>, ...FlattenItems<M, BuilderBindings<S>, Route.RouteSet.Items<D>>]>
339
231
 
340
232
  <
341
233
  S extends Self,
@@ -351,13 +243,7 @@ export namespace RouteMount {
351
243
  cd: (c: B) => C,
352
244
  de: (d: C) => D,
353
245
  ef: (e: D) => E,
354
- ): Builder<
355
- {},
356
- [
357
- ...Items<S>,
358
- ...FlattenItems<M, BuilderBindings<S>, Route.RouteSet.Items<E>>,
359
- ]
360
- >
246
+ ): Builder<{}, [...Items<S>, ...FlattenItems<M, BuilderBindings<S>, Route.RouteSet.Items<E>>]>
361
247
 
362
248
  <
363
249
  S extends Self,
@@ -375,13 +261,7 @@ export namespace RouteMount {
375
261
  de: (d: C) => D,
376
262
  ef: (e: D) => E,
377
263
  fg: (f: E) => F,
378
- ): Builder<
379
- {},
380
- [
381
- ...Items<S>,
382
- ...FlattenItems<M, BuilderBindings<S>, Route.RouteSet.Items<F>>,
383
- ]
384
- >
264
+ ): Builder<{}, [...Items<S>, ...FlattenItems<M, BuilderBindings<S>, Route.RouteSet.Items<F>>]>
385
265
 
386
266
  <
387
267
  S extends Self,
@@ -401,13 +281,7 @@ export namespace RouteMount {
401
281
  ef: (e: D) => E,
402
282
  fg: (f: E) => F,
403
283
  gh: (g: F) => G,
404
- ): Builder<
405
- {},
406
- [
407
- ...Items<S>,
408
- ...FlattenItems<M, BuilderBindings<S>, Route.RouteSet.Items<G>>,
409
- ]
410
- >
284
+ ): Builder<{}, [...Items<S>, ...FlattenItems<M, BuilderBindings<S>, Route.RouteSet.Items<G>>]>
411
285
 
412
286
  <
413
287
  S extends Self,
@@ -429,13 +303,7 @@ export namespace RouteMount {
429
303
  fg: (f: E) => F,
430
304
  gh: (g: F) => G,
431
305
  hi: (h: G) => H,
432
- ): Builder<
433
- {},
434
- [
435
- ...Items<S>,
436
- ...FlattenItems<M, BuilderBindings<S>, Route.RouteSet.Items<H>>,
437
- ]
438
- >
306
+ ): Builder<{}, [...Items<S>, ...FlattenItems<M, BuilderBindings<S>, Route.RouteSet.Items<H>>]>
439
307
 
440
308
  <
441
309
  S extends Self,
@@ -459,12 +327,6 @@ export namespace RouteMount {
459
327
  gh: (g: F) => G,
460
328
  hi: (h: G) => H,
461
329
  ij: (i: H) => I,
462
- ): Builder<
463
- {},
464
- [
465
- ...Items<S>,
466
- ...FlattenItems<M, BuilderBindings<S>, Route.RouteSet.Items<I>>,
467
- ]
468
- >
330
+ ): Builder<{}, [...Items<S>, ...FlattenItems<M, BuilderBindings<S>, Route.RouteSet.Items<I>>]>
469
331
  }
470
332
  }