effect-start 0.20.1 → 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 (105) 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 +39 -40
  6. package/src/Commander.ts +73 -130
  7. package/src/ContentNegotiation.ts +68 -100
  8. package/src/Cookies.ts +408 -0
  9. package/src/Development.ts +48 -63
  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 +38 -63
  14. package/src/FileRouterCodegen.ts +64 -56
  15. package/src/FileSystem.ts +390 -0
  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 +51 -0
  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 +50 -60
  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 +36 -56
  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 +81 -175
  77. package/src/experimental/index.ts +0 -1
  78. package/src/hyper/Hyper.ts +14 -33
  79. package/src/hyper/HyperHtml.ts +13 -10
  80. package/src/hyper/HyperNode.ts +2 -7
  81. package/src/hyper/HyperRoute.ts +2 -5
  82. package/src/hyper/jsx-runtime.ts +2 -10
  83. package/src/hyper/jsx.d.ts +171 -440
  84. package/src/lint/plugin.js +276 -0
  85. package/src/node/NodeFileSystem.ts +140 -202
  86. package/src/node/NodeUtils.ts +1 -3
  87. package/src/testing/TestLogger.ts +9 -22
  88. package/src/testing/index.ts +0 -1
  89. package/src/testing/utils.ts +30 -31
  90. package/src/x/cloudflare/CloudflareTunnel.ts +53 -65
  91. package/src/x/datastar/Datastar.ts +3 -10
  92. package/src/x/datastar/index.ts +1 -3
  93. package/src/x/datastar/jsx-datastar.d.ts +1 -4
  94. package/src/x/tailwind/TailwindPlugin.ts +119 -112
  95. package/src/x/tailwind/compile.ts +10 -33
  96. package/src/x/tailwind/plugin.ts +2 -2
  97. package/src/HttpAppExtra.ts +0 -478
  98. package/src/HttpUtils.ts +0 -17
  99. package/src/bun/BunPlatformHttpServer.ts +0 -88
  100. package/src/bun/BunServerRequest.ts +0 -396
  101. package/src/bundler/BundleHttp.ts +0 -259
  102. package/src/experimental/SseHttpResponse.ts +0 -55
  103. package/src/middlewares/BasicAuthMiddleware.ts +0 -36
  104. package/src/middlewares/index.ts +0 -1
  105. package/src/testing/TestHttpClient.ts +0 -148
package/src/Route.ts CHANGED
@@ -6,7 +6,7 @@ import * as Predicate from "effect/Predicate"
6
6
  import * as Entity from "./Entity.ts"
7
7
  import * as RouteBody from "./RouteBody.ts"
8
8
  import * as RouteTree from "./RouteTree.ts"
9
- import * as Values from "./Values.ts"
9
+ import type * as Values from "./Values.ts"
10
10
 
11
11
  export const RouteItems: unique symbol = Symbol()
12
12
  export const RouteDescriptor: unique symbol = Symbol()
@@ -26,49 +26,30 @@ export namespace RouteSet {
26
26
  D extends RouteDescriptor.Any = {},
27
27
  B = {},
28
28
  M extends Route.Tuple = [],
29
- > =
30
- & Data<D, B, M>
31
- & {
32
- [TypeId]: typeof TypeId
33
- }
34
- & Pipeable.Pipeable
35
- & Iterable<M[number]>
29
+ > = Data<D, B, M> & {
30
+ [TypeId]: typeof TypeId
31
+ } & Pipeable.Pipeable &
32
+ Iterable<M[number]>
36
33
 
37
- export type Data<
38
- D extends RouteDescriptor.Any = {},
39
- B = {},
40
- M extends Route.Tuple = [],
41
- > = {
34
+ export type Data<D extends RouteDescriptor.Any = {}, B = {}, M extends Route.Tuple = []> = {
42
35
  [RouteItems]: M
43
36
  [RouteDescriptor]: D
44
37
  [RouteBindings]: B
45
38
  }
46
39
 
47
- export type Proto =
48
- & Pipeable.Pipeable
49
- & Iterable<Route.Route<any, any, any, any, any>>
50
- & {
40
+ export type Proto = Pipeable.Pipeable &
41
+ Iterable<Route.Route<any, any, any, any, any>> & {
51
42
  [TypeId]: typeof TypeId
52
43
  }
53
44
 
54
45
  export type Any = RouteSet<{}, {}, Route.Tuple>
55
46
 
56
- export type Infer<R> = R extends RouteSet<infer D, infer B, infer I>
57
- ? RouteSet<D, B, I>
58
- : R
59
-
60
- export type Items<
61
- T extends Data<any, any, any>,
62
- > = T extends Data<
63
- any,
64
- any,
65
- infer M
66
- > ? M
67
- : never
68
-
69
- export type Descriptor<
70
- T extends Data<any, any, any>,
71
- > = T extends Data<infer D, any, any> ? D : never
47
+ export type Infer<R> = R extends RouteSet<infer D, infer B, infer I> ? RouteSet<D, B, I> : R
48
+
49
+ export type Items<T extends Data<any, any, any>> = T extends Data<any, any, infer M> ? M : never
50
+
51
+ export type Descriptor<T extends Data<any, any, any>> =
52
+ T extends Data<infer D, any, any> ? D : never
72
53
  }
73
54
 
74
55
  export namespace Route {
@@ -78,25 +59,15 @@ export namespace Route {
78
59
  A = any,
79
60
  E = never,
80
61
  R = never,
81
- > extends
82
- RouteSet.RouteSet<D, {}, [
83
- Route<D, B, A, E, R>,
84
- ]>
85
- {
62
+ > extends RouteSet.RouteSet<D, {}, [Route<D, B, A, E, R>]> {
86
63
  readonly handler: Handler<B & D, A, E, R>
87
64
  }
88
65
 
89
- export type With<D extends RouteDescriptor.Any> =
90
- & Route<any, any, any, any, any>
91
- & {
92
- [RouteDescriptor]: D
93
- }
66
+ export type With<D extends RouteDescriptor.Any> = Route<any, any, any, any, any> & {
67
+ [RouteDescriptor]: D
68
+ }
94
69
 
95
- export type Tuple<
96
- _D extends RouteDescriptor.Any = {},
97
- > = [
98
- ...Route<any, any, any, any, any>[],
99
- ]
70
+ export type Tuple<_D extends RouteDescriptor.Any = {}> = [...Route<any, any, any, any, any>[]]
100
71
 
101
72
  export type Handler<B, A, E, R> = (
102
73
  context: B,
@@ -106,17 +77,13 @@ export namespace Route {
106
77
  /**
107
78
  * Extracts only the bindings (B) from routes, excluding descriptors.
108
79
  */
109
- export type Bindings<
110
- T extends RouteSet.Any,
111
- M extends Tuple = RouteSet.Items<T>,
112
- > = M extends [
80
+ export type Bindings<T extends RouteSet.Any, M extends Tuple = RouteSet.Items<T>> = M extends [
113
81
  infer Head,
114
82
  ...infer Tail extends Tuple,
115
- ] ? (
116
- Head extends Route<any, infer B, any, any, any>
117
- ? ShallowMerge<B, Bindings<T, Tail>>
118
- : Bindings<T, Tail>
119
- )
83
+ ]
84
+ ? Head extends Route<any, infer B, any, any, any>
85
+ ? ShallowMerge<B, Bindings<T, Tail>>
86
+ : Bindings<T, Tail>
120
87
  : {}
121
88
 
122
89
  /**
@@ -125,32 +92,16 @@ export namespace Route {
125
92
  * taking precedence via ShallowMerge to avoid `never` from conflicting
126
93
  * literal types (e.g. `{ method: "*" } & { method: "GET" }`).
127
94
  */
128
- export type Context<T extends RouteSet.Any> =
129
- & Omit<
130
- RouteSet.Descriptor<T>,
131
- keyof ExtractContext<RouteSet.Items<T>>
132
- >
133
- & ExtractContext<RouteSet.Items<T>>
134
-
135
- type ExtractContext<
136
- M extends Tuple,
137
- > = M extends [
138
- infer Head,
139
- ...infer Tail extends Tuple,
140
- ] ? (
141
- Head extends Route<
142
- infer D,
143
- infer B,
144
- any,
145
- any,
146
- any
147
- > ? ShallowMerge<
148
- & Omit<D, keyof B>
149
- & B,
150
- ExtractContext<Tail>
151
- >
152
- : ExtractContext<Tail>
153
- )
95
+ export type Context<T extends RouteSet.Any> = Omit<
96
+ RouteSet.Descriptor<T>,
97
+ keyof ExtractContext<RouteSet.Items<T>>
98
+ > &
99
+ ExtractContext<RouteSet.Items<T>>
100
+
101
+ type ExtractContext<M extends Tuple> = M extends [infer Head, ...infer Tail extends Tuple]
102
+ ? Head extends Route<infer D, infer B, any, any, any>
103
+ ? ShallowMerge<Omit<D, keyof B> & B, ExtractContext<Tail>>
104
+ : ExtractContext<Tail>
154
105
  : {}
155
106
  }
156
107
 
@@ -164,55 +115,34 @@ const Proto: RouteSet.Proto = {
164
115
  },
165
116
  }
166
117
 
167
- export function isRouteSet(
168
- input: unknown,
169
- ): input is RouteSet.Any {
118
+ export function isRouteSet(input: unknown): input is RouteSet.Any {
170
119
  return Predicate.hasProperty(input, TypeId)
171
120
  }
172
121
 
173
- export function isRoute(
174
- input: unknown,
175
- ): input is Route.Route {
176
- return isRouteSet(input)
177
- && Predicate.hasProperty(input, "handler")
122
+ export function isRoute(input: unknown): input is Route.Route {
123
+ return isRouteSet(input) && Predicate.hasProperty(input, "handler")
178
124
  }
179
125
 
180
- export function set<
181
- D extends RouteDescriptor.Any = {},
182
- B = {},
183
- I extends Route.Tuple = [],
184
- >(
126
+ export function set<D extends RouteDescriptor.Any = {}, B = {}, I extends Route.Tuple = []>(
185
127
  items: I = [] as unknown as I,
186
128
  descriptor: D = {} as D,
187
129
  ): RouteSet.RouteSet<D, B, I> {
188
- return Object.assign(
189
- Object.create(Proto),
190
- {
191
- [RouteItems]: items,
192
- [RouteDescriptor]: descriptor,
193
- },
194
- ) as RouteSet.RouteSet<D, B, I>
130
+ return Object.assign(Object.create(Proto), {
131
+ [RouteItems]: items,
132
+ [RouteDescriptor]: descriptor,
133
+ }) as RouteSet.RouteSet<D, B, I>
195
134
  }
196
135
 
197
- export function make<
198
- D extends RouteDescriptor.Any,
199
- B,
200
- A,
201
- E = never,
202
- R = never,
203
- >(
136
+ export function make<D extends RouteDescriptor.Any, B, A, E = never, R = never>(
204
137
  handler: Route.Handler<B & D, A, E, R>,
205
138
  descriptor?: D,
206
139
  ): Route.Route<D, B, A, E, R> {
207
140
  const items: any = []
208
- const route: Route.Route<D, B, A, E, R> = Object.assign(
209
- Object.create(Proto),
210
- {
211
- [RouteItems]: items,
212
- [RouteDescriptor]: descriptor,
213
- handler,
214
- },
215
- )
141
+ const route: Route.Route<D, B, A, E, R> = Object.assign(Object.create(Proto), {
142
+ [RouteItems]: items,
143
+ [RouteDescriptor]: descriptor,
144
+ handler,
145
+ })
216
146
 
217
147
  items.push(route)
218
148
 
@@ -221,36 +151,22 @@ export function make<
221
151
 
222
152
  export const empty = set()
223
153
 
224
- export function describe<
225
- D extends RouteDescriptor.Any,
226
- >(
227
- descriptor: D,
228
- ) {
154
+ export function describe<D extends RouteDescriptor.Any>(descriptor: D) {
229
155
  return set([], descriptor)
230
156
  }
231
157
 
232
- export function items<
233
- T extends RouteSet.Data<any, any, any>,
234
- >(
235
- self: T,
236
- ): RouteSet.Items<T> {
158
+ export function items<T extends RouteSet.Data<any, any, any>>(self: T): RouteSet.Items<T> {
237
159
  return self[RouteItems]
238
160
  }
239
161
 
240
- export function descriptor<
241
- T extends RouteSet.Data<any, any, any>,
242
- >(
162
+ export function descriptor<T extends RouteSet.Data<any, any, any>>(
243
163
  self: T,
244
164
  ): T[typeof RouteDescriptor]
245
- export function descriptor<
246
- T extends RouteSet.Data<any, any, any>,
247
- >(
165
+ export function descriptor<T extends RouteSet.Data<any, any, any>>(
248
166
  self: Iterable<T>,
249
- ): T[typeof RouteDescriptor][]
167
+ ): Array<T[typeof RouteDescriptor]>
250
168
  export function descriptor(
251
- self:
252
- | RouteSet.Data<any, any, any>
253
- | Iterable<RouteSet.Data<any, any, any>>,
169
+ self: RouteSet.Data<any, any, any> | Iterable<RouteSet.Data<any, any, any>>,
254
170
  ): RouteDescriptor.Any | RouteDescriptor.Any[] {
255
171
  if (RouteDescriptor in self) {
256
172
  return self[RouteDescriptor]
@@ -258,30 +174,20 @@ export function descriptor(
258
174
  return [...self].map((r) => r[RouteDescriptor])
259
175
  }
260
176
 
261
- export type ExtractBindings<
262
- M extends Route.Tuple,
263
- > = M extends [
177
+ export type ExtractBindings<M extends Route.Tuple> = M extends [
264
178
  infer Head,
265
179
  ...infer Tail extends Route.Tuple,
266
- ] ? (
267
- Head extends Route.Route<
268
- any,
269
- infer B,
270
- any,
271
- any,
272
- any
273
- > ? ShallowMerge<B, ExtractBindings<Tail>>
274
- : ExtractBindings<Tail>
275
- )
180
+ ]
181
+ ? Head extends Route.Route<any, infer B, any, any, any>
182
+ ? ShallowMerge<B, ExtractBindings<Tail>>
183
+ : ExtractBindings<Tail>
276
184
  : {}
277
185
 
278
186
  // Shallow merge two object types.
279
187
  // For overlapping keys, intersect the values.
280
- type ShallowMerge<A, B> =
281
- & Omit<A, keyof B>
282
- & {
283
- [K in keyof B]: K extends keyof A ? A[K] & B[K] : B[K]
284
- }
188
+ type ShallowMerge<A, B> = Omit<A, keyof B> & {
189
+ [K in keyof B]: K extends keyof A ? A[K] & B[K] : B[K]
190
+ }
285
191
 
286
192
  export type ExtractContext<
287
193
  Items extends Route.Tuple,
@@ -291,17 +197,7 @@ export type ExtractContext<
291
197
  export * from "./RouteHook.ts"
292
198
  export * from "./RouteSchema.ts"
293
199
 
294
- export {
295
- add,
296
- del,
297
- get,
298
- head,
299
- options,
300
- patch,
301
- post,
302
- put,
303
- use,
304
- } from "./RouteMount.ts"
200
+ export { add, del, get, head, options, patch, post, put, use } from "./RouteMount.ts"
305
201
 
306
202
  export const text = RouteBody.build<string, "text">({
307
203
  format: "text",
@@ -319,13 +215,9 @@ export const bytes = RouteBody.build<Uint8Array, "bytes">({
319
215
  format: "bytes",
320
216
  })
321
217
 
322
- export {
323
- render,
324
- } from "./RouteBody.ts"
218
+ export { render } from "./RouteBody.ts"
325
219
 
326
- export {
327
- sse,
328
- } from "./RouteSse.ts"
220
+ export { sse } from "./RouteSse.ts"
329
221
 
330
222
  export function redirect(
331
223
  url: string | URL,
@@ -339,24 +231,13 @@ export function redirect(
339
231
  })
340
232
  }
341
233
 
342
- export class Routes extends Context.Tag("effect-start/Routes")<
343
- Routes,
344
- RouteTree.RouteTree
345
- >() {}
234
+ export class Routes extends Context.Tag("effect-start/Routes")<Routes, RouteTree.RouteTree>() {}
346
235
 
347
236
  export function layer(routes: RouteTree.RouteMap | RouteTree.RouteTree) {
348
- return Layer.sync(
349
- Routes,
350
- () =>
351
- RouteTree.isRouteTree(routes)
352
- ? routes
353
- : RouteTree.make(routes),
354
- )
237
+ return Layer.sync(Routes, () => (RouteTree.isRouteTree(routes) ? routes : RouteTree.make(routes)))
355
238
  }
356
239
 
357
- export {
358
- make as tree,
359
- } from "./RouteTree.ts"
240
+ export { make as tree } from "./RouteTree.ts"
360
241
 
361
242
  export function lazy<T extends RouteSet.Any>(
362
243
  load: () => Promise<{ default: T }>,