effect 4.0.0-beta.1 → 4.0.0-beta.3

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 (39) hide show
  1. package/dist/Effect.d.ts +27 -0
  2. package/dist/Effect.d.ts.map +1 -1
  3. package/dist/Effect.js +27 -0
  4. package/dist/Effect.js.map +1 -1
  5. package/dist/Result.d.ts +12 -0
  6. package/dist/Result.d.ts.map +1 -1
  7. package/dist/Result.js +12 -0
  8. package/dist/Result.js.map +1 -1
  9. package/dist/internal/effect.js +6 -1
  10. package/dist/internal/effect.js.map +1 -1
  11. package/dist/unstable/http/HttpBody.d.ts +15 -0
  12. package/dist/unstable/http/HttpBody.d.ts.map +1 -1
  13. package/dist/unstable/http/HttpBody.js +27 -0
  14. package/dist/unstable/http/HttpBody.js.map +1 -1
  15. package/dist/unstable/http/HttpClientRequest.d.ts +16 -0
  16. package/dist/unstable/http/HttpClientRequest.d.ts.map +1 -1
  17. package/dist/unstable/http/HttpClientRequest.js +6 -1
  18. package/dist/unstable/http/HttpClientRequest.js.map +1 -1
  19. package/dist/unstable/schema/Model.d.ts +4 -4
  20. package/dist/unstable/schema/Model.d.ts.map +1 -1
  21. package/dist/unstable/schema/VariantSchema.d.ts +2 -2
  22. package/dist/unstable/schema/VariantSchema.d.ts.map +1 -1
  23. package/dist/unstable/schema/VariantSchema.js +13 -2
  24. package/dist/unstable/schema/VariantSchema.js.map +1 -1
  25. package/dist/unstable/sql/SqlModel.js +3 -3
  26. package/dist/unstable/sql/SqlModel.js.map +1 -1
  27. package/dist/unstable/sql/SqlSchema.d.ts +13 -1
  28. package/dist/unstable/sql/SqlSchema.d.ts.map +1 -1
  29. package/dist/unstable/sql/SqlSchema.js +12 -1
  30. package/dist/unstable/sql/SqlSchema.js.map +1 -1
  31. package/package.json +1 -1
  32. package/src/Effect.ts +30 -0
  33. package/src/Result.ts +13 -0
  34. package/src/internal/effect.ts +13 -0
  35. package/src/unstable/http/HttpBody.ts +41 -0
  36. package/src/unstable/http/HttpClientRequest.ts +22 -1
  37. package/src/unstable/schema/VariantSchema.ts +36 -7
  38. package/src/unstable/sql/SqlModel.ts +3 -3
  39. package/src/unstable/sql/SqlSchema.ts +34 -1
@@ -1 +1 @@
1
- {"version":3,"file":"SqlSchema.d.ts","sourceRoot":"","sources":["../../../src/unstable/sql/SqlSchema.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAA;AACrC,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAA;AAEzC;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,GAAI,GAAG,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,SAAS,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAC3E,SAAS;IACP,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAA;IACpB,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;CAC3F,MAKC,SAAS,GAAG,CAAC,SAAS,CAAC,KACtB,MAAM,CAAC,MAAM,CACd,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAC9B,CAAC,GAAG,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,kBAAkB,EACjD,GAAG,CAAC,kBAAkB,CAAC,GAAG,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAaxD,CAAA;AAED,QAAA,MAAM,KAAK,GAAI,GAAG,SAAS,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EACzC,SAAS;IACP,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;CAC5E,MAGO,SAAS,GAAG,CAAC,MAAM,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,GAAG,GAAG,CAAC,kBAAkB,CAAC,CAIvG,CAAA;AACD,OAAO;AACL;;;;;GAKG;AACH,KAAK,IAAI,IAAI,EACd,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,OAAO,GAAI,GAAG,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,SAAS,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAC1E,SAAS;IACP,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAA;IACpB,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;CAC3F,MAKC,SAAS,GAAG,CAAC,MAAM,CAAC,KACnB,MAAM,CAAC,MAAM,CACd,GAAG,CAAC,MAAM,CAAC,EACX,CAAC,GAAG,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,kBAAkB,EACjD,CAAC,GAAG,GAAG,CAAC,kBAAkB,CAAC,GAAG,GAAG,CAAC,kBAAkB,CAAC,CAUxD,CAAA"}
1
+ {"version":3,"file":"SqlSchema.d.ts","sourceRoot":"","sources":["../../../src/unstable/sql/SqlSchema.ts"],"names":[],"mappings":"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"}
@@ -29,12 +29,23 @@ export {
29
29
  */
30
30
  void_ as void };
31
31
  /**
32
- * Run a sql query with a request schema and a result schema and return the first result.
32
+ * Run a sql query with a request schema and a result schema and return the first result, if any.
33
33
  *
34
34
  * @since 4.0.0
35
35
  * @category constructor
36
36
  */
37
37
  export const findOne = options => {
38
+ const encodeRequest = Schema.encodeEffect(options.Request);
39
+ const decode = Schema.decodeUnknownEffect(options.Result);
40
+ return request => Effect.flatMap(Effect.flatMap(encodeRequest(request), options.execute), arr => Arr.isReadonlyArrayNonEmpty(arr) ? Effect.asSome(decode(arr[0])) : Effect.succeedNone);
41
+ };
42
+ /**
43
+ * Run a sql query with a request schema and a result schema and return the first result.
44
+ *
45
+ * @since 4.0.0
46
+ * @category constructor
47
+ */
48
+ export const single = options => {
38
49
  const encodeRequest = Schema.encodeEffect(options.Request);
39
50
  const decode = Schema.decodeUnknownEffect(options.Result);
40
51
  return request => Effect.flatMap(Effect.flatMap(encodeRequest(request), options.execute), arr => Arr.isReadonlyArrayNonEmpty(arr) ? decode(arr[0]) : Effect.fail(new Cause.NoSuchElementError()));
@@ -1 +1 @@
1
- {"version":3,"file":"SqlSchema.js","names":["Arr","Cause","Effect","Schema","findMany","options","encodeRequest","encodeEffect","Request","decode","decodeUnknownEffect","Array","Result","request","flatMap","execute","results","isReadonlyArrayNonEmpty","fail","NoSuchElementError","void_","encode","asVoid","void","findOne","arr"],"sources":["../../../src/unstable/sql/SqlSchema.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,OAAO,KAAKA,GAAG,MAAM,gBAAgB;AACrC,OAAO,KAAKC,KAAK,MAAM,gBAAgB;AACvC,OAAO,KAAKC,MAAM,MAAM,iBAAiB;AACzC,OAAO,KAAKC,MAAM,MAAM,iBAAiB;AAEzC;;;;;;AAMA,OAAO,MAAMC,QAAQ,GACnBC,OAIC,IACC;EACF,MAAMC,aAAa,GAAGH,MAAM,CAACI,YAAY,CAACF,OAAO,CAACG,OAAO,CAAC;EAC1D,MAAMC,MAAM,GAAGN,MAAM,CAACO,mBAAmB,CAACP,MAAM,CAACQ,KAAK,CAACN,OAAO,CAACO,MAAM,CAAC,CAAC;EACvE,OACEC,OAAuB,IAMvBX,MAAM,CAACY,OAAO,CACZZ,MAAM,CAACY,OAAO,CAACR,aAAa,CAACO,OAAO,CAAC,EAAER,OAAO,CAACU,OAAO,CAAC,EACtDC,OAAO,IAKNhB,GAAG,CAACiB,uBAAuB,CAACD,OAAO,CAAC,GAChCP,MAAM,CAACO,OAAO,CAAsE,GACpFd,MAAM,CAACgB,IAAI,CAAC,IAAIjB,KAAK,CAACkB,kBAAkB,EAAE,CAAC,CAClD;AACL,CAAC;AAED,MAAMC,KAAK,GACTf,OAGC,IACC;EACF,MAAMgB,MAAM,GAAGlB,MAAM,CAACI,YAAY,CAACF,OAAO,CAACG,OAAO,CAAC;EACnD,OAAQK,OAAoB,IAC1BX,MAAM,CAACoB,MAAM,CACXpB,MAAM,CAACY,OAAO,CAACO,MAAM,CAACR,OAAO,CAAC,EAAER,OAAO,CAACU,OAAO,CAAC,CACjD;AACL,CAAC;AACD;AACE;;;;;;AAMAK,KAAK,IAAIG,IAAI;AAGf;;;;;;AAMA,OAAO,MAAMC,OAAO,GAClBnB,OAIC,IACC;EACF,MAAMC,aAAa,GAAGH,MAAM,CAACI,YAAY,CAACF,OAAO,CAACG,OAAO,CAAC;EAC1D,MAAMC,MAAM,GAAGN,MAAM,CAACO,mBAAmB,CAACL,OAAO,CAACO,MAAM,CAAC;EACzD,OACEC,OAAoB,IAMpBX,MAAM,CAACY,OAAO,CACZZ,MAAM,CAACY,OAAO,CAACR,aAAa,CAACO,OAAO,CAAC,EAAER,OAAO,CAACU,OAAO,CAAC,EACtDU,GAAG,IAICzB,GAAG,CAACiB,uBAAuB,CAACQ,GAAG,CAAC,GAAGhB,MAAM,CAACgB,GAAG,CAAC,CAAC,CAAC,CAAC,GAAGvB,MAAM,CAACgB,IAAI,CAAC,IAAIjB,KAAK,CAACkB,kBAAkB,EAAE,CAAC,CACrG;AACL,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"SqlSchema.js","names":["Arr","Cause","Effect","Schema","findMany","options","encodeRequest","encodeEffect","Request","decode","decodeUnknownEffect","Array","Result","request","flatMap","execute","results","isReadonlyArrayNonEmpty","fail","NoSuchElementError","void_","encode","asVoid","void","findOne","arr","asSome","succeedNone","single"],"sources":["../../../src/unstable/sql/SqlSchema.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,OAAO,KAAKA,GAAG,MAAM,gBAAgB;AACrC,OAAO,KAAKC,KAAK,MAAM,gBAAgB;AACvC,OAAO,KAAKC,MAAM,MAAM,iBAAiB;AAEzC,OAAO,KAAKC,MAAM,MAAM,iBAAiB;AAEzC;;;;;;AAMA,OAAO,MAAMC,QAAQ,GACnBC,OAIC,IACC;EACF,MAAMC,aAAa,GAAGH,MAAM,CAACI,YAAY,CAACF,OAAO,CAACG,OAAO,CAAC;EAC1D,MAAMC,MAAM,GAAGN,MAAM,CAACO,mBAAmB,CAACP,MAAM,CAACQ,KAAK,CAACN,OAAO,CAACO,MAAM,CAAC,CAAC;EACvE,OACEC,OAAuB,IAMvBX,MAAM,CAACY,OAAO,CACZZ,MAAM,CAACY,OAAO,CAACR,aAAa,CAACO,OAAO,CAAC,EAAER,OAAO,CAACU,OAAO,CAAC,EACtDC,OAAO,IAKNhB,GAAG,CAACiB,uBAAuB,CAACD,OAAO,CAAC,GAChCP,MAAM,CAACO,OAAO,CAAsE,GACpFd,MAAM,CAACgB,IAAI,CAAC,IAAIjB,KAAK,CAACkB,kBAAkB,EAAE,CAAC,CAClD;AACL,CAAC;AAED,MAAMC,KAAK,GACTf,OAGC,IACC;EACF,MAAMgB,MAAM,GAAGlB,MAAM,CAACI,YAAY,CAACF,OAAO,CAACG,OAAO,CAAC;EACnD,OAAQK,OAAoB,IAC1BX,MAAM,CAACoB,MAAM,CACXpB,MAAM,CAACY,OAAO,CAACO,MAAM,CAACR,OAAO,CAAC,EAAER,OAAO,CAACU,OAAO,CAAC,CACjD;AACL,CAAC;AACD;AACE;;;;;;AAMAK,KAAK,IAAIG,IAAI;AAGf;;;;;;AAMA,OAAO,MAAMC,OAAO,GAClBnB,OAIC,IACC;EACF,MAAMC,aAAa,GAAGH,MAAM,CAACI,YAAY,CAACF,OAAO,CAACG,OAAO,CAAC;EAC1D,MAAMC,MAAM,GAAGN,MAAM,CAACO,mBAAmB,CAACL,OAAO,CAACO,MAAM,CAAC;EACzD,OACEC,OAAoB,IAMpBX,MAAM,CAACY,OAAO,CACZZ,MAAM,CAACY,OAAO,CAACR,aAAa,CAACO,OAAO,CAAC,EAAER,OAAO,CAACU,OAAO,CAAC,EACtDU,GAAG,IAICzB,GAAG,CAACiB,uBAAuB,CAACQ,GAAG,CAAC,GAAGvB,MAAM,CAACwB,MAAM,CAACjB,MAAM,CAACgB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAGvB,MAAM,CAACyB,WAAW,CAC3F;AACL,CAAC;AAED;;;;;;AAMA,OAAO,MAAMC,MAAM,GACjBvB,OAIC,IACC;EACF,MAAMC,aAAa,GAAGH,MAAM,CAACI,YAAY,CAACF,OAAO,CAACG,OAAO,CAAC;EAC1D,MAAMC,MAAM,GAAGN,MAAM,CAACO,mBAAmB,CAACL,OAAO,CAACO,MAAM,CAAC;EACzD,OACEC,OAAoB,IAMpBX,MAAM,CAACY,OAAO,CACZZ,MAAM,CAACY,OAAO,CAACR,aAAa,CAACO,OAAO,CAAC,EAAER,OAAO,CAACU,OAAO,CAAC,EACtDU,GAAG,IAICzB,GAAG,CAACiB,uBAAuB,CAACQ,GAAG,CAAC,GAAGhB,MAAM,CAACgB,GAAG,CAAC,CAAC,CAAC,CAAC,GAAGvB,MAAM,CAACgB,IAAI,CAAC,IAAIjB,KAAK,CAACkB,kBAAkB,EAAE,CAAC,CACrG;AACL,CAAC","ignoreList":[]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "effect",
3
3
  "type": "module",
4
- "version": "4.0.0-beta.1",
4
+ "version": "4.0.0-beta.3",
5
5
  "license": "MIT",
6
6
  "description": "The missing standard library for TypeScript, for writing production-grade software.",
7
7
  "homepage": "https://effect.website",
package/src/Effect.ts CHANGED
@@ -5124,6 +5124,36 @@ export const catchIf: {
5124
5124
  ): Effect<A | A2 | A3, E2 | E3, R | R2 | R3>
5125
5125
  } = internal.catchIf
5126
5126
 
5127
+ /**
5128
+ * Catches `NoSuchElementError` failures and converts them to `Option.none`.
5129
+ *
5130
+ * Success values become `Option.some`, `NoSuchElementError` becomes
5131
+ * `Option.none`, and all other errors are preserved.
5132
+ *
5133
+ * @example
5134
+ * ```ts
5135
+ * import { Effect, Option } from "effect"
5136
+ *
5137
+ * const some = Effect.fromNullishOr(1).pipe(Effect.catchNoSuchElement)
5138
+ * const none = Effect.fromNullishOr(null).pipe(Effect.catchNoSuchElement)
5139
+ *
5140
+ * Effect.runPromise(some).then(console.log) // { _id: 'Option', _tag: 'Some', value: 1 }
5141
+ * Effect.runPromise(none).then(console.log) // { _id: 'Option', _tag: 'None' }
5142
+ * ```
5143
+ *
5144
+ * **Previously Known As**
5145
+ *
5146
+ * This API replaces the following from Effect 3.x:
5147
+ *
5148
+ * - `Effect.optionFromOptional`
5149
+ *
5150
+ * @since 2.0.0
5151
+ * @category Error Handling
5152
+ */
5153
+ export const catchNoSuchElement: <A, E, R>(
5154
+ self: Effect<A, E, R>
5155
+ ) => Effect<Option<A>, Exclude<E, Cause.NoSuchElementError>, R> = internal.catchNoSuchElement
5156
+
5127
5157
  /**
5128
5158
  * Recovers from specific failures based on a predicate.
5129
5159
  *
package/src/Result.ts CHANGED
@@ -374,6 +374,19 @@ export {
374
374
  void_ as void
375
375
  }
376
376
 
377
+ /**
378
+ * A pre-built `Result<void>` holding `undefined` as its failure value.
379
+ *
380
+ * - Use when you need a `Result` that represents "failed with no meaningful value"
381
+ * - Equivalent to `Result.fail(undefined)` but avoids an extra allocation
382
+ *
383
+ * @see {@link fail}
384
+ *
385
+ * @category Constructors
386
+ * @since 4.0.0
387
+ */
388
+ export const failVoid: Result<never, void> = fail(void 0)
389
+
377
390
  /**
378
391
  * Converts a possibly `null` or `undefined` value into a `Result`.
379
392
  *
@@ -81,6 +81,7 @@ import {
81
81
  isEffect,
82
82
  isFailReason,
83
83
  isInterruptReason,
84
+ isNoSuchElementError,
84
85
  makePrimitive,
85
86
  makePrimitiveProto,
86
87
  NoSuchElementError,
@@ -2440,6 +2441,18 @@ export const catch_: {
2440
2441
  ): Effect.Effect<A | B, E2, R | R2> => catchCauseIf(self, findError as any, (e: any) => f(e)) as any
2441
2442
  )
2442
2443
 
2444
+ /** @internal */
2445
+ export const catchNoSuchElement = <A, E, R>(
2446
+ self: Effect.Effect<A, E, R>
2447
+ ): Effect.Effect<Option.Option<A>, Exclude<E, Cause.NoSuchElementError>, R> =>
2448
+ matchEffect(self, {
2449
+ onFailure: (error) =>
2450
+ isNoSuchElementError(error)
2451
+ ? succeedNone
2452
+ : fail(error as Exclude<E, Cause.NoSuchElementError>),
2453
+ onSuccess: succeedSome
2454
+ })
2455
+
2443
2456
  /** @internal */
2444
2457
  export const catchDefect: {
2445
2458
  <E, B, E2, R2>(
@@ -281,6 +281,47 @@ export class FormData extends Proto {
281
281
  */
282
282
  export const makeFormData = (body: globalThis.FormData): FormData => new FormData(body)
283
283
 
284
+ /**
285
+ * @since 4.0.0
286
+ * @category models
287
+ */
288
+ export type FormDataInput = Record<string, FormDataCoercible | ReadonlyArray<FormDataCoercible>>
289
+
290
+ /**
291
+ * @since 4.0.0
292
+ * @category models
293
+ */
294
+ export type FormDataCoercible = string | number | boolean | globalThis.File | globalThis.Blob | null | undefined
295
+
296
+ const appendFormDataValue = (formData: globalThis.FormData, key: string, value: FormDataCoercible): void => {
297
+ if (value == null) {
298
+ return
299
+ }
300
+ if (typeof value === "object") {
301
+ formData.append(key, value)
302
+ return
303
+ }
304
+ formData.append(key, String(value))
305
+ }
306
+
307
+ /**
308
+ * @since 4.0.0
309
+ * @category constructors
310
+ */
311
+ export const makeFormDataRecord = (entries: FormDataInput): FormData => {
312
+ const formData = new globalThis.FormData()
313
+ for (const [key, value] of Object.entries(entries)) {
314
+ if (Array.isArray(value)) {
315
+ for (const item of value) {
316
+ appendFormDataValue(formData, key, item)
317
+ }
318
+ } else {
319
+ appendFormDataValue(formData, key, value as FormDataCoercible)
320
+ }
321
+ }
322
+ return makeFormData(formData)
323
+ }
324
+
284
325
  /**
285
326
  * @since 4.0.0
286
327
  * @category models
@@ -661,7 +661,7 @@ export const setBody: {
661
661
  (self: HttpClientRequest, body: HttpBody.HttpBody): HttpClientRequest
662
662
  } = dual(2, (self: HttpClientRequest, body: HttpBody.HttpBody): HttpClientRequest => {
663
663
  let headers = self.headers
664
- if (body._tag === "Empty") {
664
+ if (body._tag === "Empty" || body._tag === "FormData") {
665
665
  headers = Headers.remove(Headers.remove(headers, "Content-Type"), "Content-length")
666
666
  } else {
667
667
  if (body.contentType) {
@@ -828,6 +828,27 @@ export const bodyFormData: {
828
828
  (self: HttpClientRequest, body: FormData): HttpClientRequest
829
829
  } = dual(2, (self: HttpClientRequest, body: FormData): HttpClientRequest => setBody(self, HttpBody.makeFormData(body)))
830
830
 
831
+ /**
832
+ * @since 4.0.0
833
+ * @category combinators
834
+ */
835
+ export const bodyFormDataRecord: {
836
+ /**
837
+ * @since 4.0.0
838
+ * @category combinators
839
+ */
840
+ (entries: HttpBody.FormDataInput): (self: HttpClientRequest) => HttpClientRequest
841
+ /**
842
+ * @since 4.0.0
843
+ * @category combinators
844
+ */
845
+ (self: HttpClientRequest, entries: HttpBody.FormDataInput): HttpClientRequest
846
+ } = dual(
847
+ 2,
848
+ (self: HttpClientRequest, entries: HttpBody.FormDataInput): HttpClientRequest =>
849
+ setBody(self, HttpBody.makeFormDataRecord(entries))
850
+ )
851
+
831
852
  /**
832
853
  * @since 4.0.0
833
854
  * @category combinators
@@ -3,11 +3,14 @@
3
3
  */
4
4
  import type { Brand } from "../../Brand.ts"
5
5
  import * as Effect from "../../Effect.ts"
6
- import { constant, dual } from "../../Function.ts"
6
+ import { dual } from "../../Function.ts"
7
+ import * as Option from "../../Option.ts"
7
8
  import { type Pipeable, pipeArguments } from "../../Pipeable.ts"
8
9
  import * as Predicate from "../../Predicate.ts"
9
10
  import * as Schema from "../../Schema.ts"
10
11
  import type * as AST from "../../SchemaAST.ts"
12
+ import * as Getter from "../../SchemaGetter.ts"
13
+ import * as Transformation from "../../SchemaTransformation.ts"
11
14
  import * as Struct_ from "../../Struct.ts"
12
15
 
13
16
  /**
@@ -465,8 +468,24 @@ export const Override = <A>(value: A): A & Brand<"Override"> => value as any
465
468
  * @since 4.0.0
466
469
  * @category overrideable
467
470
  */
468
- export interface Overrideable<S extends Schema.Top & Schema.WithoutConstructorDefault>
469
- extends Schema.brand<Schema.withConstructorDefault<S>, "Override">
471
+ export interface Overrideable<S extends Schema.Top & Schema.WithoutConstructorDefault> extends
472
+ Schema.Bottom<
473
+ (S["Type"] & Brand<"Override">) | undefined,
474
+ S["Encoded"],
475
+ S["DecodingServices"],
476
+ S["EncodingServices"],
477
+ S["ast"],
478
+ Overrideable<S>,
479
+ S["~type.make.in"],
480
+ (S["Type"] & Brand<"Override">) | undefined,
481
+ S["~type.parameters"],
482
+ (S["Type"] & Brand<"Override">) | undefined,
483
+ S["~type.mutability"],
484
+ "optional",
485
+ "with-default",
486
+ S["~encoded.mutability"],
487
+ S["~encoded.optionality"]
488
+ >
470
489
  {}
471
490
 
472
491
  /**
@@ -478,11 +497,21 @@ export const Overrideable = <S extends Schema.Top & Schema.WithoutConstructorDef
478
497
  options: {
479
498
  readonly defaultValue: Effect.Effect<S["~type.make.in"]>
480
499
  }
481
- ) =>
500
+ ): Overrideable<S> =>
482
501
  schema.pipe(
483
- Schema.withConstructorDefault(constant(Effect.asSome(options.defaultValue))),
484
- Schema.brand("Override")
485
- )
502
+ Schema.decodeTo(
503
+ Schema.optional(Schema.brand("Override")(Schema.toType(schema))),
504
+ Transformation.make({
505
+ decode: Getter.passthrough(),
506
+ encode: new Getter.Getter((o) => {
507
+ if (Option.isSome(o) && o.value !== undefined) {
508
+ return Effect.succeed(o)
509
+ }
510
+ return Effect.asSome(options.defaultValue)
511
+ })
512
+ })
513
+ )
514
+ ) as any
486
515
 
487
516
  const StructProto = {
488
517
  pipe() {
@@ -69,7 +69,7 @@ export const makeRepository = <
69
69
  const idSchema = Model.fields[options.idColumn] as Schema.Top
70
70
  const idColumn = options.idColumn as string
71
71
 
72
- const insertSchema = SqlSchema.findOne({
72
+ const insertSchema = SqlSchema.single({
73
73
  Request: Model.insert,
74
74
  Result: Model,
75
75
  execute: (request) =>
@@ -107,7 +107,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID(
107
107
  })
108
108
  ) as any
109
109
 
110
- const updateSchema = SqlSchema.findOne({
110
+ const updateSchema = SqlSchema.single({
111
111
  Request: Model.update,
112
112
  Result: Model,
113
113
  execute: (request: any) =>
@@ -159,7 +159,7 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${request[idCol
159
159
  })
160
160
  ) as any
161
161
 
162
- const findByIdSchema = SqlSchema.findOne({
162
+ const findByIdSchema = SqlSchema.single({
163
163
  Request: idSchema,
164
164
  Result: Model,
165
165
  execute: (id: any) => sql`select * from ${sql(options.tableName)} where ${sql(idColumn)} = ${id}`
@@ -4,6 +4,7 @@
4
4
  import * as Arr from "../../Array.ts"
5
5
  import * as Cause from "../../Cause.ts"
6
6
  import * as Effect from "../../Effect.ts"
7
+ import type * as Option from "../../Option.ts"
7
8
  import * as Schema from "../../Schema.ts"
8
9
 
9
10
  /**
@@ -64,7 +65,7 @@ export {
64
65
  }
65
66
 
66
67
  /**
67
- * Run a sql query with a request schema and a result schema and return the first result.
68
+ * Run a sql query with a request schema and a result schema and return the first result, if any.
68
69
  *
69
70
  * @since 4.0.0
70
71
  * @category constructor
@@ -75,6 +76,38 @@ export const findOne = <Req extends Schema.Top, Res extends Schema.Top, E, R>(
75
76
  readonly Result: Res
76
77
  readonly execute: (request: Req["Encoded"]) => Effect.Effect<ReadonlyArray<unknown>, E, R>
77
78
  }
79
+ ) => {
80
+ const encodeRequest = Schema.encodeEffect(options.Request)
81
+ const decode = Schema.decodeUnknownEffect(options.Result)
82
+ return (
83
+ request: Req["Type"]
84
+ ): Effect.Effect<
85
+ Option.Option<Res["Type"]>,
86
+ E | Schema.SchemaError,
87
+ R | Req["EncodingServices"] | Res["DecodingServices"]
88
+ > =>
89
+ Effect.flatMap(
90
+ Effect.flatMap(encodeRequest(request), options.execute),
91
+ (arr): Effect.Effect<
92
+ Option.Option<Res["Type"]>,
93
+ Schema.SchemaError,
94
+ Req["EncodingServices"] | Res["DecodingServices"]
95
+ > => Arr.isReadonlyArrayNonEmpty(arr) ? Effect.asSome(decode(arr[0])) : Effect.succeedNone
96
+ )
97
+ }
98
+
99
+ /**
100
+ * Run a sql query with a request schema and a result schema and return the first result.
101
+ *
102
+ * @since 4.0.0
103
+ * @category constructor
104
+ */
105
+ export const single = <Req extends Schema.Top, Res extends Schema.Top, E, R>(
106
+ options: {
107
+ readonly Request: Req
108
+ readonly Result: Res
109
+ readonly execute: (request: Req["Encoded"]) => Effect.Effect<ReadonlyArray<unknown>, E, R>
110
+ }
78
111
  ) => {
79
112
  const encodeRequest = Schema.encodeEffect(options.Request)
80
113
  const decode = Schema.decodeUnknownEffect(options.Result)