effect-start 0.17.2 → 0.19.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 (80) hide show
  1. package/dist/Development.d.ts +7 -2
  2. package/dist/Development.js +12 -6
  3. package/dist/PlatformRuntime.d.ts +4 -0
  4. package/dist/PlatformRuntime.js +9 -0
  5. package/dist/Route.d.ts +6 -2
  6. package/dist/Route.js +22 -0
  7. package/dist/RouteHttp.d.ts +1 -1
  8. package/dist/RouteHttp.js +12 -19
  9. package/dist/RouteMount.d.ts +2 -1
  10. package/dist/Start.d.ts +1 -5
  11. package/dist/Start.js +1 -8
  12. package/dist/Unique.d.ts +50 -0
  13. package/dist/Unique.js +187 -0
  14. package/dist/bun/BunHttpServer.js +5 -6
  15. package/dist/bun/BunRoute.d.ts +1 -1
  16. package/dist/bun/BunRoute.js +2 -2
  17. package/dist/index.d.ts +1 -0
  18. package/dist/index.js +1 -0
  19. package/dist/node/Effectify.d.ts +209 -0
  20. package/dist/node/Effectify.js +19 -0
  21. package/dist/node/FileSystem.d.ts +3 -5
  22. package/dist/node/FileSystem.js +42 -62
  23. package/dist/node/PlatformError.d.ts +46 -0
  24. package/dist/node/PlatformError.js +43 -0
  25. package/dist/testing/TestLogger.js +1 -1
  26. package/package.json +10 -5
  27. package/src/Development.ts +13 -18
  28. package/src/PlatformRuntime.ts +11 -0
  29. package/src/Route.ts +31 -2
  30. package/src/RouteHttp.ts +15 -31
  31. package/src/RouteMount.ts +1 -1
  32. package/src/Start.ts +1 -15
  33. package/src/Unique.ts +232 -0
  34. package/src/bun/BunHttpServer.ts +6 -9
  35. package/src/bun/BunRoute.ts +3 -3
  36. package/src/index.ts +1 -0
  37. package/src/node/Effectify.ts +262 -0
  38. package/src/node/FileSystem.ts +59 -97
  39. package/src/node/PlatformError.ts +102 -0
  40. package/src/testing/TestLogger.ts +1 -1
  41. package/dist/Random.d.ts +0 -5
  42. package/dist/Random.js +0 -49
  43. package/src/Commander.test.ts +0 -1639
  44. package/src/ContentNegotiation.test.ts +0 -603
  45. package/src/Development.test.ts +0 -119
  46. package/src/Entity.test.ts +0 -592
  47. package/src/FileRouterPattern.test.ts +0 -147
  48. package/src/FileRouter_files.test.ts +0 -64
  49. package/src/FileRouter_path.test.ts +0 -145
  50. package/src/FileRouter_tree.test.ts +0 -132
  51. package/src/Http.test.ts +0 -319
  52. package/src/HttpAppExtra.test.ts +0 -103
  53. package/src/HttpUtils.test.ts +0 -85
  54. package/src/PathPattern.test.ts +0 -648
  55. package/src/Random.ts +0 -59
  56. package/src/RouteBody.test.ts +0 -232
  57. package/src/RouteHook.test.ts +0 -40
  58. package/src/RouteHttp.test.ts +0 -2909
  59. package/src/RouteMount.test.ts +0 -481
  60. package/src/RouteSchema.test.ts +0 -427
  61. package/src/RouteSse.test.ts +0 -249
  62. package/src/RouteTree.test.ts +0 -494
  63. package/src/RouteTrie.test.ts +0 -322
  64. package/src/RouterPattern.test.ts +0 -676
  65. package/src/Values.test.ts +0 -263
  66. package/src/bun/BunBundle.test.ts +0 -268
  67. package/src/bun/BunBundle_imports.test.ts +0 -48
  68. package/src/bun/BunHttpServer.test.ts +0 -251
  69. package/src/bun/BunImportTrackerPlugin.test.ts +0 -77
  70. package/src/bun/BunRoute.test.ts +0 -162
  71. package/src/bundler/BundleHttp.test.ts +0 -132
  72. package/src/effect/HttpRouter.test.ts +0 -548
  73. package/src/experimental/EncryptedCookies.test.ts +0 -488
  74. package/src/hyper/HyperHtml.test.ts +0 -209
  75. package/src/hyper/HyperRoute.test.tsx +0 -197
  76. package/src/middlewares/BasicAuthMiddleware.test.ts +0 -84
  77. package/src/testing/TestHttpClient.test.ts +0 -83
  78. package/src/testing/TestLogger.test.ts +0 -51
  79. package/src/x/datastar/Datastar.test.ts +0 -266
  80. package/src/x/tailwind/TailwindPlugin.test.ts +0 -333
@@ -1,548 +0,0 @@
1
- /**
2
- * This file tests `@effect/platform/HttpRouter`, not our code.
3
- * Since Platform code is still unstable and we relay heavily on its
4
- * chaining/fallback behavior in `BundleHttp`
5
- * We want to ensure the behavior doesn't change across versions.
6
- */
7
- import * as HttpRouter from "@effect/platform/HttpRouter"
8
- import * as HttpServerResponse from "@effect/platform/HttpServerResponse"
9
- import * as test from "bun:test"
10
- import {
11
- effectFn,
12
- TestHttpClient,
13
- } from "../testing"
14
-
15
- const effect = effectFn()
16
-
17
- test.it("Single app mounted on path", () =>
18
- effect(function*() {
19
- const app1 = HttpRouter.empty.pipe(
20
- HttpRouter.get("/hello", HttpServerResponse.text("Hello from app1")),
21
- )
22
-
23
- const router = HttpRouter.empty.pipe(
24
- HttpRouter.mount("/api", app1),
25
- )
26
-
27
- const client = TestHttpClient.make(router)
28
- const response = yield* client.get("/api/hello")
29
-
30
- test
31
- .expect(response.status)
32
- .toBe(200)
33
- test
34
- .expect(yield* response.text)
35
- .toBe("Hello from app1")
36
- }))
37
-
38
- test.it(
39
- "Multiple apps mounted on same path chain together",
40
- () =>
41
- effect(function*() {
42
- const app1 = HttpRouter.empty.pipe(
43
- HttpRouter.get("/hello", HttpServerResponse.text("Hello from app1")),
44
- )
45
-
46
- const app2 = HttpRouter.empty.pipe(
47
- HttpRouter.get("/world", HttpServerResponse.text("World from app2")),
48
- )
49
-
50
- const router = HttpRouter.empty.pipe(
51
- HttpRouter.mount("/api", app1),
52
- HttpRouter.mount("/api", app2),
53
- )
54
-
55
- const client = TestHttpClient.make(router)
56
-
57
- const response1 = yield* client.get("/api/hello")
58
-
59
- test
60
- .expect(response1.status)
61
- .toBe(200)
62
- test
63
- .expect(yield* response1.text)
64
- .toBe("Hello from app1")
65
-
66
- const response2 = yield* client.get("/api/world")
67
-
68
- test
69
- .expect(response2.status)
70
- .toBe(200)
71
- test
72
- .expect(yield* response2.text)
73
- .toBe("World from app2")
74
- }),
75
- )
76
-
77
- test.it(
78
- "First app has no matching route - second app should be called",
79
- () =>
80
- effect(function*() {
81
- const app1 = HttpRouter.empty.pipe(
82
- HttpRouter.get("/hello", HttpServerResponse.text("Hello from app1")),
83
- )
84
-
85
- const app2 = HttpRouter.empty.pipe(
86
- HttpRouter.get("/missing", HttpServerResponse.text("Found in app2")),
87
- )
88
-
89
- const router = HttpRouter.empty.pipe(
90
- HttpRouter.mount("/api", app1),
91
- HttpRouter.mount("/api", app2),
92
- )
93
-
94
- const client = TestHttpClient.make(router)
95
- const response = yield* client.get("/api/missing")
96
-
97
- test
98
- .expect(response.status)
99
- .toBe(200)
100
- test
101
- .expect(yield* response.text)
102
- .toBe("Found in app2")
103
- }),
104
- )
105
-
106
- test.it(
107
- "First app has no matching route - second app should be called",
108
- () =>
109
- effect(function*() {
110
- const app1 = HttpRouter.empty.pipe(
111
- HttpRouter.get("/specific", HttpServerResponse.text("Specific route")),
112
- )
113
-
114
- const app2 = HttpRouter.empty.pipe(
115
- HttpRouter.get(
116
- "/different",
117
- HttpServerResponse.text("Different route"),
118
- ),
119
- )
120
-
121
- const router = HttpRouter.empty.pipe(
122
- HttpRouter.mount("/api", app1),
123
- HttpRouter.mount("/api", app2),
124
- )
125
-
126
- const client = TestHttpClient.make(router)
127
- const response = yield* client.get("/api/different")
128
-
129
- test
130
- .expect(response.status)
131
- .toBe(200)
132
- test
133
- .expect(yield* response.text)
134
- .toBe("Different route")
135
- }),
136
- )
137
-
138
- test.it("Multiple mounts with different methods", () =>
139
- effect(function*() {
140
- const app1 = HttpRouter.empty.pipe(
141
- HttpRouter.get("/data", HttpServerResponse.text("GET data")),
142
- )
143
-
144
- const app2 = HttpRouter.empty.pipe(
145
- HttpRouter.post("/data", HttpServerResponse.text("POST data")),
146
- )
147
-
148
- const router = HttpRouter.empty.pipe(
149
- HttpRouter.mount("/api", app1),
150
- HttpRouter.mount("/api", app2),
151
- )
152
-
153
- const client = TestHttpClient.make(router)
154
-
155
- const getResponse = yield* client.get("/api/data")
156
-
157
- test
158
- .expect(getResponse.status)
159
- .toBe(200)
160
- test
161
- .expect(yield* getResponse.text)
162
- .toBe("GET data")
163
-
164
- const postResponse = yield* client.post("/api/data")
165
-
166
- test
167
- .expect(postResponse.status)
168
- .toBe(200)
169
- test
170
- .expect(yield* postResponse.text)
171
- .toBe("POST data")
172
- }))
173
-
174
- test.it(
175
- "Route chaining: RouteNotFound error chains to next router (root mount)",
176
- () =>
177
- effect(function*() {
178
- const subApp1 = HttpRouter.empty.pipe(
179
- HttpRouter.get(
180
- "/admin/dashboard",
181
- HttpServerResponse.text("Dashboard from subApp1"),
182
- ),
183
- )
184
-
185
- const subApp2 = HttpRouter.empty.pipe(
186
- HttpRouter.get(
187
- "/admin/page",
188
- HttpServerResponse.text("Page from subApp2"),
189
- ),
190
- )
191
-
192
- const router = HttpRouter.empty.pipe(
193
- HttpRouter.mount("/", subApp1),
194
- HttpRouter.mount("/", subApp2),
195
- )
196
-
197
- const client = TestHttpClient.make(router)
198
- const response = yield* client.get("/admin/page")
199
-
200
- test
201
- .expect(response.status)
202
- .toBe(200)
203
- test
204
- .expect(yield* response.text)
205
- .toBe("Page from subApp2")
206
- }),
207
- )
208
-
209
- test.it(
210
- "Route chaining: explicit 404 response does not chain to next router (root mount)",
211
- () =>
212
- effect(function*() {
213
- const subApp1 = HttpRouter.empty.pipe(
214
- HttpRouter.get(
215
- "/admin/page",
216
- HttpServerResponse.empty({ status: 404 }),
217
- ),
218
- )
219
-
220
- const subApp2 = HttpRouter.empty.pipe(
221
- HttpRouter.get(
222
- "/admin/fallback",
223
- HttpServerResponse.text("Fallback from subApp2"),
224
- ),
225
- )
226
-
227
- const router = HttpRouter.empty.pipe(
228
- HttpRouter.mount("/", subApp1),
229
- HttpRouter.mount("/", subApp2),
230
- )
231
-
232
- const client = TestHttpClient.make(router)
233
- const response = yield* client.get("/admin/page")
234
-
235
- test
236
- .expect(response.status)
237
- .toBe(404)
238
- test
239
- .expect(yield* response.text)
240
- .toBe("")
241
- }),
242
- )
243
-
244
- test.it(
245
- "Route conflicts: direct handlers win when defined before root mount",
246
- () =>
247
- effect(function*() {
248
- const subApp = HttpRouter.empty.pipe(
249
- HttpRouter.get(
250
- "/admin/dashboard",
251
- HttpServerResponse.text("Dashboard from subApp"),
252
- ),
253
- HttpRouter.get(
254
- "/admin/profile",
255
- HttpServerResponse.text("Profile from subApp"),
256
- ),
257
- )
258
-
259
- const router = HttpRouter.empty.pipe(
260
- HttpRouter.get(
261
- "/admin/settings",
262
- HttpServerResponse.text("Settings from direct handler"),
263
- ),
264
- HttpRouter.get(
265
- "/admin/users",
266
- HttpServerResponse.text("Users from direct handler"),
267
- ),
268
- HttpRouter.mount("/", subApp),
269
- )
270
-
271
- const client = TestHttpClient.make(router)
272
-
273
- const settingsResponse = yield* client.get("/admin/settings")
274
-
275
- test
276
- .expect(settingsResponse.status)
277
- .toBe(200)
278
- test
279
- .expect(yield* settingsResponse.text)
280
- .toBe("Settings from direct handler")
281
-
282
- const usersResponse = yield* client.get("/admin/users")
283
-
284
- test
285
- .expect(usersResponse.status)
286
- .toBe(200)
287
- test
288
- .expect(yield* usersResponse.text)
289
- .toBe("Users from direct handler")
290
-
291
- const dashboardResponse = yield* client.get("/admin/dashboard")
292
-
293
- test
294
- .expect(dashboardResponse.status)
295
- .toBe(200)
296
- test
297
- .expect(yield* dashboardResponse.text)
298
- .toBe("Dashboard from subApp")
299
- }),
300
- )
301
-
302
- test.it(
303
- "Route conflicts: root mount wins when defined before direct handlers",
304
- () =>
305
- effect(function*() {
306
- const subApp = HttpRouter.empty.pipe(
307
- HttpRouter.get(
308
- "/admin/dashboard",
309
- HttpServerResponse.text("Dashboard from subApp"),
310
- ),
311
- HttpRouter.get(
312
- "/admin/profile",
313
- HttpServerResponse.text("Profile from subApp"),
314
- ),
315
- )
316
-
317
- const router = HttpRouter.empty.pipe(
318
- HttpRouter.mount("/", subApp),
319
- HttpRouter.get(
320
- "/admin/settings",
321
- HttpServerResponse.text("Settings from direct handler"),
322
- ),
323
- HttpRouter.get(
324
- "/admin/users",
325
- HttpServerResponse.text("Users from direct handler"),
326
- ),
327
- )
328
-
329
- const client = TestHttpClient.make(router)
330
-
331
- const profileResponse = yield* client.get("/admin/profile")
332
-
333
- test
334
- .expect(profileResponse.status)
335
- .toBe(200)
336
- test
337
- .expect(yield* profileResponse.text)
338
- .toBe("Profile from subApp")
339
-
340
- const usersResponse = yield* client.get("/admin/users")
341
-
342
- test
343
- .expect(usersResponse.status)
344
- .toBe(200)
345
- test
346
- .expect(yield* usersResponse.text)
347
- .toBe("Users from direct handler")
348
-
349
- const dashboardResponse = yield* client.get("/admin/dashboard")
350
-
351
- test
352
- .expect(dashboardResponse.status)
353
- .toBe(200)
354
- test
355
- .expect(yield* dashboardResponse.text)
356
- .toBe("Dashboard from subApp")
357
- }),
358
- )
359
-
360
- test.it(
361
- "Route conflicts: mountApp does not chain with direct handlers defined before",
362
- () =>
363
- effect(function*() {
364
- const subApp = HttpRouter.empty.pipe(
365
- HttpRouter.get(
366
- "/admin/dashboard",
367
- HttpServerResponse.text("Dashboard from subApp"),
368
- ),
369
- HttpRouter.get(
370
- "/admin/profile",
371
- HttpServerResponse.text("Profile from subApp"),
372
- ),
373
- )
374
-
375
- const router = HttpRouter.empty.pipe(
376
- HttpRouter.get(
377
- "/admin/settings",
378
- HttpServerResponse.text("Settings from direct handler"),
379
- ),
380
- HttpRouter.get(
381
- "/admin/users",
382
- HttpServerResponse.text("Users from direct handler"),
383
- ),
384
- HttpRouter.mountApp("/", subApp),
385
- )
386
-
387
- const client = TestHttpClient.make(router)
388
-
389
- const settingsResponse = yield* client.get("/admin/settings")
390
-
391
- test
392
- .expect(settingsResponse.status)
393
- .toBe(404)
394
-
395
- const usersResponse = yield* client.get("/admin/users")
396
-
397
- test
398
- .expect(usersResponse.status)
399
- .toBe(404)
400
-
401
- const dashboardResponse = yield* client.get("/admin/dashboard")
402
-
403
- test
404
- .expect(dashboardResponse.status)
405
- .toBe(200)
406
- test
407
- .expect(yield* dashboardResponse.text)
408
- .toBe("Dashboard from subApp")
409
- }),
410
- )
411
-
412
- test.it(
413
- "Route conflicts: mountApp does not chain with direct handlers defined after",
414
- () =>
415
- effect(function*() {
416
- const subApp = HttpRouter.empty.pipe(
417
- HttpRouter.get(
418
- "/admin/dashboard",
419
- HttpServerResponse.text("Dashboard from subApp"),
420
- ),
421
- HttpRouter.get(
422
- "/admin/profile",
423
- HttpServerResponse.text("Profile from subApp"),
424
- ),
425
- )
426
-
427
- const router = HttpRouter.empty.pipe(
428
- HttpRouter.mountApp("/", subApp),
429
- HttpRouter.get(
430
- "/admin/settings",
431
- HttpServerResponse.text("Settings from direct handler"),
432
- ),
433
- HttpRouter.get(
434
- "/admin/users",
435
- HttpServerResponse.text("Users from direct handler"),
436
- ),
437
- )
438
-
439
- const client = TestHttpClient.make(router)
440
-
441
- const profileResponse = yield* client.get("/admin/profile")
442
-
443
- test
444
- .expect(profileResponse.status)
445
- .toBe(200)
446
- test
447
- .expect(yield* profileResponse.text)
448
- .toBe("Profile from subApp")
449
-
450
- const settingsResponse = yield* client.get("/admin/settings")
451
-
452
- test
453
- .expect(settingsResponse.status)
454
- .toBe(404)
455
-
456
- const dashboardResponse = yield* client.get("/admin/dashboard")
457
-
458
- test
459
- .expect(dashboardResponse.status)
460
- .toBe(200)
461
- test
462
- .expect(yield* dashboardResponse.text)
463
- .toBe("Dashboard from subApp")
464
- }),
465
- )
466
-
467
- test.it(
468
- "Wildcard routes: single asterisk wildcard handler",
469
- () =>
470
- effect(function*() {
471
- const router = HttpRouter.empty.pipe(
472
- HttpRouter.get("*", HttpServerResponse.text("Wildcard handler")),
473
- )
474
-
475
- const client = TestHttpClient.make(router)
476
-
477
- const response = yield* client.get("/anything")
478
-
479
- test
480
- .expect(response.status)
481
- .toBe(200)
482
- test
483
- .expect(yield* response.text)
484
- .toBe("Wildcard handler")
485
- }),
486
- )
487
-
488
- test.it(
489
- "Wildcard routes: wildcard defined before literal route",
490
- () =>
491
- effect(function*() {
492
- const router = HttpRouter.empty.pipe(
493
- HttpRouter.get("*", HttpServerResponse.text("Wildcard handler")),
494
- HttpRouter.get("/specific", HttpServerResponse.text("Literal handler")),
495
- )
496
-
497
- const client = TestHttpClient.make(router)
498
-
499
- const wildcardResponse = yield* client.get("/anything")
500
-
501
- test
502
- .expect(wildcardResponse.status)
503
- .toBe(200)
504
- test
505
- .expect(yield* wildcardResponse.text)
506
- .toBe("Wildcard handler")
507
-
508
- const literalResponse = yield* client.get("/specific")
509
-
510
- test
511
- .expect(literalResponse.status)
512
- .toBe(200)
513
- test
514
- .expect(yield* literalResponse.text)
515
- .toBe("Literal handler")
516
- }),
517
- )
518
-
519
- test.it(
520
- "Wildcard routes: literal route defined before wildcard",
521
- () =>
522
- effect(function*() {
523
- const router = HttpRouter.empty.pipe(
524
- HttpRouter.get("/specific", HttpServerResponse.text("Literal handler")),
525
- HttpRouter.get("*", HttpServerResponse.text("Wildcard handler")),
526
- )
527
-
528
- const client = TestHttpClient.make(router)
529
-
530
- const literalResponse = yield* client.get("/specific")
531
-
532
- test
533
- .expect(literalResponse.status)
534
- .toBe(200)
535
- test
536
- .expect(yield* literalResponse.text)
537
- .toBe("Literal handler")
538
-
539
- const wildcardResponse = yield* client.get("/anything")
540
-
541
- test
542
- .expect(wildcardResponse.status)
543
- .toBe(200)
544
- test
545
- .expect(yield* wildcardResponse.text)
546
- .toBe("Wildcard handler")
547
- }),
548
- )