effect 4.0.0-beta.34 → 4.0.0-beta.36

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 (84) hide show
  1. package/dist/Channel.d.ts +10 -1
  2. package/dist/Channel.d.ts.map +1 -1
  3. package/dist/Channel.js +14 -8
  4. package/dist/Channel.js.map +1 -1
  5. package/dist/Config.d.ts +4 -0
  6. package/dist/Config.d.ts.map +1 -1
  7. package/dist/Config.js.map +1 -1
  8. package/dist/Cron.d.ts +7 -0
  9. package/dist/Cron.d.ts.map +1 -1
  10. package/dist/Cron.js +109 -45
  11. package/dist/Cron.js.map +1 -1
  12. package/dist/Effect.d.ts +2 -2
  13. package/dist/Effect.d.ts.map +1 -1
  14. package/dist/Effect.js.map +1 -1
  15. package/dist/Equivalence.d.ts +52 -0
  16. package/dist/Equivalence.d.ts.map +1 -1
  17. package/dist/Equivalence.js +52 -0
  18. package/dist/Equivalence.js.map +1 -1
  19. package/dist/Layer.d.ts +5 -2
  20. package/dist/Layer.d.ts.map +1 -1
  21. package/dist/Layer.js +14 -1
  22. package/dist/Layer.js.map +1 -1
  23. package/dist/LayerMap.d.ts +5 -4
  24. package/dist/LayerMap.d.ts.map +1 -1
  25. package/dist/LayerMap.js.map +1 -1
  26. package/dist/PubSub.d.ts.map +1 -1
  27. package/dist/PubSub.js +9 -3
  28. package/dist/PubSub.js.map +1 -1
  29. package/dist/Schema.d.ts +50 -5
  30. package/dist/Schema.d.ts.map +1 -1
  31. package/dist/Schema.js +40 -0
  32. package/dist/Schema.js.map +1 -1
  33. package/dist/SchemaParser.d.ts +29 -0
  34. package/dist/SchemaParser.d.ts.map +1 -1
  35. package/dist/SchemaParser.js +38 -0
  36. package/dist/SchemaParser.js.map +1 -1
  37. package/dist/Stream.d.ts +10 -1
  38. package/dist/Stream.d.ts.map +1 -1
  39. package/dist/Stream.js +5 -1
  40. package/dist/Stream.js.map +1 -1
  41. package/dist/internal/dateTime.js +8 -1
  42. package/dist/internal/dateTime.js.map +1 -1
  43. package/dist/internal/effect.js +4 -3
  44. package/dist/internal/effect.js.map +1 -1
  45. package/dist/unstable/ai/AiError.d.ts +1 -0
  46. package/dist/unstable/ai/AiError.d.ts.map +1 -1
  47. package/dist/unstable/ai/AiError.js +7 -3
  48. package/dist/unstable/ai/AiError.js.map +1 -1
  49. package/dist/unstable/ai/LanguageModel.d.ts.map +1 -1
  50. package/dist/unstable/ai/LanguageModel.js +49 -21
  51. package/dist/unstable/ai/LanguageModel.js.map +1 -1
  52. package/dist/unstable/cli/CliOutput.js +4 -3
  53. package/dist/unstable/cli/CliOutput.js.map +1 -1
  54. package/dist/unstable/cli/Prompt.js +146 -13
  55. package/dist/unstable/cli/Prompt.js.map +1 -1
  56. package/dist/unstable/httpapi/HttpApiEndpoint.js +2 -2
  57. package/dist/unstable/httpapi/HttpApiEndpoint.js.map +1 -1
  58. package/dist/unstable/httpapi/HttpApiMiddleware.d.ts +15 -13
  59. package/dist/unstable/httpapi/HttpApiMiddleware.d.ts.map +1 -1
  60. package/dist/unstable/httpapi/HttpApiMiddleware.js +5 -3
  61. package/dist/unstable/httpapi/HttpApiMiddleware.js.map +1 -1
  62. package/dist/unstable/rpc/RpcSerialization.js +1 -1
  63. package/dist/unstable/rpc/RpcSerialization.js.map +1 -1
  64. package/package.json +1 -1
  65. package/src/Channel.ts +23 -11
  66. package/src/Config.ts +5 -0
  67. package/src/Cron.ts +142 -45
  68. package/src/Effect.ts +3 -3
  69. package/src/Equivalence.ts +56 -0
  70. package/src/Layer.ts +27 -9
  71. package/src/LayerMap.ts +7 -5
  72. package/src/PubSub.ts +13 -5
  73. package/src/Schema.ts +62 -8
  74. package/src/SchemaParser.ts +53 -0
  75. package/src/Stream.ts +11 -1
  76. package/src/internal/dateTime.ts +8 -1
  77. package/src/internal/effect.ts +16 -13
  78. package/src/unstable/ai/AiError.ts +4 -2
  79. package/src/unstable/ai/LanguageModel.ts +59 -40
  80. package/src/unstable/cli/CliOutput.ts +5 -4
  81. package/src/unstable/cli/Prompt.ts +147 -14
  82. package/src/unstable/httpapi/HttpApiEndpoint.ts +2 -2
  83. package/src/unstable/httpapi/HttpApiMiddleware.ts +36 -20
  84. package/src/unstable/rpc/RpcSerialization.ts +1 -1
@@ -27,17 +27,23 @@ const SecurityTypeId = "~effect/httpapi/HttpApiMiddleware/Security"
27
27
  */
28
28
  export const isSecurity = (u: AnyService): u is AnyServiceSecurity => hasProperty(u, SecurityTypeId)
29
29
 
30
+ type ErrorConstraint = Schema.Top | ReadonlyArray<Schema.Top>
31
+
32
+ type ErrorSchemaFromConstraint<E> = E extends ReadonlyArray<Schema.Top> ? E[number]
33
+ : E extends Schema.Top ? E
34
+ : never
35
+
30
36
  /**
31
37
  * @since 4.0.0
32
38
  * @category models
33
39
  */
34
- export type HttpApiMiddleware<Provides, E extends Schema.Top, Requires> = (
40
+ export type HttpApiMiddleware<Provides, E extends ErrorConstraint, Requires> = (
35
41
  httpEffect: Effect.Effect<HttpServerResponse, unhandled, Provides>,
36
42
  options: {
37
43
  readonly endpoint: HttpApiEndpoint.AnyWithProps
38
44
  readonly group: HttpApiGroup.AnyWithProps
39
45
  }
40
- ) => Effect.Effect<HttpServerResponse, unhandled | E["Type"], Requires | HttpRouter.Provided>
46
+ ) => Effect.Effect<HttpServerResponse, unhandled | ErrorSchemaFromConstraint<E>["Type"], Requires | HttpRouter.Provided>
41
47
 
42
48
  /**
43
49
  * @since 4.0.0
@@ -46,7 +52,7 @@ export type HttpApiMiddleware<Provides, E extends Schema.Top, Requires> = (
46
52
  export type HttpApiMiddlewareSecurity<
47
53
  Security extends Record<string, HttpApiSecurity.HttpApiSecurity>,
48
54
  Provides,
49
- E extends Schema.Top,
55
+ E extends ErrorConstraint,
50
56
  Requires
51
57
  > = {
52
58
  readonly [K in keyof Security]: (
@@ -56,7 +62,11 @@ export type HttpApiMiddlewareSecurity<
56
62
  readonly endpoint: HttpApiEndpoint.AnyWithProps
57
63
  readonly group: HttpApiGroup.AnyWithProps
58
64
  }
59
- ) => Effect.Effect<HttpServerResponse, unhandled | E["Type"], Requires | HttpRouter.Provided>
65
+ ) => Effect.Effect<
66
+ HttpServerResponse,
67
+ unhandled | ErrorSchemaFromConstraint<E>["Type"],
68
+ Requires | HttpRouter.Provided
69
+ >
60
70
  }
61
71
 
62
72
  /**
@@ -90,7 +100,7 @@ export interface ForClient<Id> {
90
100
  export interface AnyService extends ServiceMap.Key<any, any> {
91
101
  readonly [TypeId]: typeof TypeId
92
102
  readonly provides: any
93
- readonly error: Schema.Top
103
+ readonly error: ReadonlySet<Schema.Top>
94
104
  readonly requiredForClient: boolean
95
105
  readonly "~ClientError": any
96
106
  }
@@ -112,7 +122,7 @@ export interface AnyId {
112
122
  readonly [TypeId]: {
113
123
  readonly provides: any
114
124
  readonly requires: any
115
- readonly error: Schema.Top
125
+ readonly error: ErrorConstraint
116
126
  readonly clientError: any
117
127
  readonly requiredForClient: boolean
118
128
  }
@@ -140,8 +150,7 @@ export type ApplyServices<A extends AnyId, R> = Exclude<R, Provides<A>> | Requir
140
150
  * @since 4.0.0
141
151
  * @category models
142
152
  */
143
- export type ErrorSchema<A> = A extends { readonly [TypeId]: { readonly error: infer E } }
144
- ? E extends Schema.Top ? E : never
153
+ export type ErrorSchema<A> = A extends { readonly [TypeId]: { readonly error: infer E } } ? ErrorSchemaFromConstraint<E>
145
154
  : never
146
155
 
147
156
  /**
@@ -195,7 +204,7 @@ export type ServiceClass<
195
204
  Config extends {
196
205
  requires: any
197
206
  provides: any
198
- error: Schema.Top
207
+ error: ErrorConstraint
199
208
  clientError: any
200
209
  requiredForClient: boolean
201
210
  security: Record<string, HttpApiSecurity.HttpApiSecurity>
@@ -216,7 +225,7 @@ export type ServiceClass<
216
225
  }
217
226
  }
218
227
  readonly [TypeId]: typeof TypeId
219
- readonly error: Config["error"]
228
+ readonly error: ReadonlySet<Schema.Top>
220
229
  readonly requiredForClient: Config["requiredForClient"]
221
230
  readonly "~ClientError": Config["clientError"]
222
231
  }
@@ -238,7 +247,7 @@ export const Service = <
238
247
  } = { requires: never; provides: never; clientError: never }
239
248
  >(): <
240
249
  const Id extends string,
241
- Error extends Schema.Top = never,
250
+ const Error extends ErrorConstraint = never,
242
251
  const Security extends Record<string, HttpApiSecurity.HttpApiSecurity> = never,
243
252
  RequiredForClient extends boolean = false
244
253
  >(
@@ -260,7 +269,7 @@ export const Service = <
260
269
  id: string,
261
270
  options?: {
262
271
  readonly security?: Record<string, HttpApiSecurity.HttpApiSecurity> | undefined
263
- readonly error?: Schema.Top | undefined
272
+ readonly error?: ErrorConstraint | undefined
264
273
  readonly requiredForClient?: boolean | undefined
265
274
  } | undefined
266
275
  ) => {
@@ -278,10 +287,8 @@ export const Service = <
278
287
  }
279
288
  })
280
289
  self[TypeId] = TypeId
290
+ self.error = getError(options?.error)
281
291
  self.requiredForClient = options?.requiredForClient ?? false
282
- if (options?.error !== undefined) {
283
- self.error = options.error
284
- }
285
292
  if (options?.security !== undefined) {
286
293
  if (Object.keys(options.security).length === 0) {
287
294
  throw new Error("HttpApiMiddleware.Service: security object must not be empty")
@@ -292,6 +299,11 @@ export const Service = <
292
299
  return self
293
300
  }
294
301
 
302
+ function getError(error: ErrorConstraint | undefined): ReadonlySet<Schema.Top> {
303
+ if (error === undefined) return new Set()
304
+ return new Set(Array.isArray(error) ? error : [error])
305
+ }
306
+
295
307
  /**
296
308
  * Implement a middleware Layer that transforms `SchemaError`'s.
297
309
  *
@@ -317,12 +329,16 @@ export const Service = <
317
329
  * @since 4.0.0
318
330
  * @category SchemaError transform
319
331
  */
320
- export const layerSchemaErrorTransform = <Id, E extends Schema.Top, Requires>(
332
+ export const layerSchemaErrorTransform = <Id, E extends ErrorConstraint, Requires>(
321
333
  service: ServiceMap.Service<Id, HttpApiMiddleware<never, E, Requires>>,
322
334
  transform: (
323
335
  error: Schema.SchemaError,
324
336
  context: { readonly endpoint: HttpApiEndpoint.AnyWithProps; readonly group: HttpApiGroup.AnyWithProps }
325
- ) => Effect.Effect<HttpServerResponse, E["Type"] | Schema.SchemaError, Requires | HttpRouter.Provided>
337
+ ) => Effect.Effect<
338
+ HttpServerResponse,
339
+ ErrorSchemaFromConstraint<E>["Type"] | Schema.SchemaError,
340
+ Requires | HttpRouter.Provided
341
+ >
326
342
  ): Layer.Layer<Id> =>
327
343
  Layer.succeed(
328
344
  service,
@@ -331,7 +347,7 @@ export const layerSchemaErrorTransform = <Id, E extends Schema.Top, Requires>(
331
347
  httpEffect,
332
348
  (e): Effect.Effect<
333
349
  HttpServerResponse,
334
- unhandled | Schema.SchemaError | E["Type"],
350
+ unhandled | Schema.SchemaError | ErrorSchemaFromConstraint<E>["Type"],
335
351
  Requires | HttpRouter.Provided
336
352
  > => Schema.isSchemaError(e) ? transform(e, options) : Effect.fail(e)
337
353
  )
@@ -344,9 +360,9 @@ export const layerSchemaErrorTransform = <Id, E extends Schema.Top, Requires>(
344
360
  export const layerClient = <Id extends AnyId, S, R, EX = never, RX = never>(
345
361
  tag: ServiceMap.Key<Id, S>,
346
362
  service:
347
- | HttpApiMiddlewareClient<Id[typeof TypeId]["error"]["Type"], Id[typeof TypeId]["clientError"], R>
363
+ | HttpApiMiddlewareClient<Error<Id>, Id[typeof TypeId]["clientError"], R>
348
364
  | Effect.Effect<
349
- HttpApiMiddlewareClient<Id[typeof TypeId]["error"]["Type"], Id[typeof TypeId]["clientError"], R>,
365
+ HttpApiMiddlewareClient<Error<Id>, Id[typeof TypeId]["clientError"], R>,
350
366
  EX,
351
367
  RX
352
368
  >
@@ -175,7 +175,7 @@ function decodeJsonRpcRaw(
175
175
  }
176
176
  return messages
177
177
  }
178
- return Array.isArray(decoded) ? decoded.map(decodeJsonRpcMessage) : [decodeJsonRpcMessage(decoded)]
178
+ return [decodeJsonRpcMessage(decoded)]
179
179
  }
180
180
 
181
181
  function decodeJsonRpcMessage(decoded: JsonRpcMessage): RpcMessage.FromClientEncoded | RpcMessage.FromServerEncoded {