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,232 +0,0 @@
1
- import * as test from "bun:test"
2
- import * as Context from "effect/Context"
3
- import * as Effect from "effect/Effect"
4
- import * as ParseResult from "effect/ParseResult"
5
- import * as Stream from "effect/Stream"
6
- import * as Entity from "./Entity.ts"
7
- import * as Route from "./Route.ts"
8
- import * as RouteBody from "./RouteBody.ts"
9
- import * as RouteMount from "./RouteMount.ts"
10
-
11
- test.it("infers parent descriptions", () => {
12
- RouteMount.get(
13
- Route.text((ctx) =>
14
- Effect.gen(function*() {
15
- test
16
- .expectTypeOf(ctx)
17
- .toExtend<{
18
- method: "GET"
19
- format: "text"
20
- }>()
21
-
22
- return "Hello, world!"
23
- })
24
- ),
25
- )
26
- })
27
-
28
- test.it("next is function returning Entity", () => {
29
- Route.text((ctx, next) =>
30
- Effect.gen(function*() {
31
- test
32
- .expectTypeOf(next)
33
- .toExtend<() => Entity.Entity<string>>()
34
-
35
- return "Hello, world!"
36
- })
37
- )
38
- })
39
-
40
- test.it("enforces result value", () => {
41
- // @ts-expect-error must return string
42
- Route.text((ctx, next) =>
43
- Effect.gen(function*() {
44
- return 1337
45
- })
46
- )
47
- })
48
-
49
- test.it("accepts text stream", () => {
50
- RouteMount.get(
51
- Route.text((ctx) =>
52
- Effect.gen(function*() {
53
- test
54
- .expectTypeOf(ctx)
55
- .toExtend<{
56
- method: "GET"
57
- format: "text"
58
- }>()
59
-
60
- return Stream.make("Hello", " ", "world!")
61
- })
62
- ),
63
- )
64
- })
65
-
66
- test.it("accepts Effect<Stream<string>> for html format", () => {
67
- RouteMount.get(
68
- Route.html(function*() {
69
- return Stream.make("<div>", "content", "</div>")
70
- }),
71
- )
72
- })
73
-
74
- test.it("accepts Effect<Stream<Uint8Array>> for bytes format", () => {
75
- const encoder = new TextEncoder()
76
-
77
- RouteMount.get(
78
- Route.bytes(function*() {
79
- return Stream.make(encoder.encode("chunk"))
80
- }),
81
- )
82
- })
83
-
84
- test.it("rejects Stream for json format", () => {
85
- // @ts-expect-error Stream not allowed for json format
86
- Route.json(function*() {
87
- return Stream.make({ msg: "hello" })
88
- })
89
- })
90
-
91
- test.it("accepts value directly", () => {
92
- const value = "Hello, world!"
93
-
94
- test
95
- .expectTypeOf(Route.text)
96
- .toBeCallableWith(value)
97
- })
98
-
99
- test.describe(`${RouteBody.handle.name}()`, () => {
100
- const ctx = {}
101
- const next = () => Entity.effect(Effect.succeed(Entity.make("next")))
102
-
103
- test.it("accepts all HandlerInput variants", () => {
104
- test
105
- .expectTypeOf<
106
- RouteBody.HandlerInput<{ foo: string }, string, Error, never>
107
- >()
108
- .toExtend<Parameters<typeof RouteBody.handle>[0]>()
109
- })
110
-
111
- test.it("handles plain value", async () => {
112
- const handler = RouteBody.handle<{}, string, never, never>("hello")
113
- const result = await Effect.runPromise(handler(ctx, next))
114
- test.expect(result.body).toBe("hello")
115
- test.expect(result.status).toBe(200)
116
- })
117
-
118
- test.it("handles Effect directly", async () => {
119
- const handler = RouteBody.handle<{}, string, never, never>(
120
- Effect.succeed("from effect"),
121
- )
122
- const result = await Effect.runPromise(handler(ctx, next))
123
- test.expect(result.body).toBe("from effect")
124
- })
125
-
126
- test.it("handles Effect with error", async () => {
127
- const handler = RouteBody.handle<{}, never, Error, never>(
128
- Effect.fail(new Error("oops")),
129
- )
130
-
131
- test
132
- .expectTypeOf(handler)
133
- .returns
134
- .toExtend<
135
- Effect.Effect<Entity.Entity<never>, Error, never>
136
- >()
137
- })
138
-
139
- test.it("handles function", async () => {
140
- const handler = RouteBody.handle<{ id: number }, number, never, never>(
141
- (ctx) => Effect.succeed(ctx.id),
142
- )
143
-
144
- test
145
- .expectTypeOf(handler)
146
- .parameters
147
- .toEqualTypeOf<
148
- [
149
- { id: number },
150
- (
151
- context?: Partial<{ id: number }> & Record<string, unknown>,
152
- ) => Entity.Entity<number>,
153
- ]
154
- >()
155
- test
156
- .expectTypeOf(handler)
157
- .returns
158
- .toEqualTypeOf<
159
- Effect.Effect<Entity.Entity<number>, never, never>
160
- >()
161
-
162
- const numNext = () => Entity.effect(Effect.succeed(Entity.make(23)))
163
- const result = await Effect.runPromise(handler({ id: 42 }, numNext))
164
-
165
- test.expect(result.body).toBe(42)
166
- })
167
-
168
- test.it("handles generator", async () => {
169
- const handler = RouteBody.handle<{ id: number }, number, never, never>(
170
- function*(ctx) {
171
- const n = yield* Effect.succeed(ctx.id)
172
- return n * 2
173
- },
174
- )
175
-
176
- test
177
- .expectTypeOf(handler)
178
- .parameters
179
- .toEqualTypeOf<
180
- [
181
- { id: number },
182
- (
183
- context?: Partial<{ id: number }> & Record<string, unknown>,
184
- ) => Entity.Entity<number>,
185
- ]
186
- >()
187
-
188
- test
189
- .expectTypeOf(handler)
190
- .returns
191
- .toEqualTypeOf<
192
- Effect.Effect<Entity.Entity<number>, never, never>
193
- >()
194
-
195
- const numNext = () => Entity.effect(Effect.succeed(Entity.make(23)))
196
- const result = await Effect.runPromise(handler({ id: 21 }, numNext))
197
-
198
- test.expect(result.body).toBe(42)
199
- })
200
-
201
- test.it("generator can call next", async () => {
202
- const handler = RouteBody.handle<{}, string, ParseResult.ParseError, never>(
203
- function*(_ctx, next) {
204
- const fromNext = yield* next().text
205
- return `got: ${fromNext}`
206
- },
207
- )
208
-
209
- const result = await Effect.runPromise(Effect.orDie(handler(ctx, next)))
210
-
211
- test
212
- .expect(result.body)
213
- .toBe("got: next")
214
- })
215
-
216
- test.it("generator type checks missing services", async () => {
217
- interface ServiceA {
218
- readonly _: unique symbol
219
- }
220
- const ServiceA = Context.GenericTag<ServiceA>("ServiceA")
221
-
222
- const handler = RouteBody.handle(function*() {
223
- yield* ServiceA
224
- return "ok"
225
- })
226
-
227
- // This should fail type checking because ServiceA is not provided
228
- // @ts-expect-error ServiceA is missing
229
- const promise = Effect.runPromise(handler(ctx, next))
230
- test.expect(promise).rejects.toThrow(/Service not found: ServiceA/)
231
- })
232
- })
@@ -1,40 +0,0 @@
1
- import * as test from "bun:test"
2
- import { Effect } from "effect"
3
- import * as Route from "./Route.ts"
4
-
5
- test.it("passes bindings", () => {
6
- const headers = {
7
- "origin": "nounder.org",
8
- }
9
- const filterResult = {
10
- context: {
11
- headers,
12
- },
13
- }
14
-
15
- const routes = Route.empty.pipe(
16
- Route.filter(() => Effect.succeed(filterResult)),
17
- Route.text(context => {
18
- test
19
- .expectTypeOf(context)
20
- .toExtend<typeof filterResult.context>()
21
-
22
- return Effect.succeed(
23
- `Origin: ${context.headers.origin}`,
24
- )
25
- }),
26
- )
27
-
28
- test
29
- .expectTypeOf(routes)
30
- .toExtend<
31
- Route.RouteSet.RouteSet<{}, {}, [
32
- Route.Route.Route<{}, typeof filterResult.context, any>,
33
- Route.Route.Route<{ format: "text" }, {}, string>,
34
- ]>
35
- >()
36
-
37
- test
38
- .expect(Route.items(routes))
39
- .toHaveLength(2)
40
- })