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.
- package/dist/Effect.d.ts +27 -0
- package/dist/Effect.d.ts.map +1 -1
- package/dist/Effect.js +27 -0
- package/dist/Effect.js.map +1 -1
- package/dist/Result.d.ts +12 -0
- package/dist/Result.d.ts.map +1 -1
- package/dist/Result.js +12 -0
- package/dist/Result.js.map +1 -1
- package/dist/internal/effect.js +6 -1
- package/dist/internal/effect.js.map +1 -1
- package/dist/unstable/http/HttpBody.d.ts +15 -0
- package/dist/unstable/http/HttpBody.d.ts.map +1 -1
- package/dist/unstable/http/HttpBody.js +27 -0
- package/dist/unstable/http/HttpBody.js.map +1 -1
- package/dist/unstable/http/HttpClientRequest.d.ts +16 -0
- package/dist/unstable/http/HttpClientRequest.d.ts.map +1 -1
- package/dist/unstable/http/HttpClientRequest.js +6 -1
- package/dist/unstable/http/HttpClientRequest.js.map +1 -1
- package/dist/unstable/schema/Model.d.ts +4 -4
- package/dist/unstable/schema/Model.d.ts.map +1 -1
- package/dist/unstable/schema/VariantSchema.d.ts +2 -2
- package/dist/unstable/schema/VariantSchema.d.ts.map +1 -1
- package/dist/unstable/schema/VariantSchema.js +13 -2
- package/dist/unstable/schema/VariantSchema.js.map +1 -1
- package/dist/unstable/sql/SqlModel.js +3 -3
- package/dist/unstable/sql/SqlModel.js.map +1 -1
- package/dist/unstable/sql/SqlSchema.d.ts +13 -1
- package/dist/unstable/sql/SqlSchema.d.ts.map +1 -1
- package/dist/unstable/sql/SqlSchema.js +12 -1
- package/dist/unstable/sql/SqlSchema.js.map +1 -1
- package/package.json +1 -1
- package/src/Effect.ts +30 -0
- package/src/Result.ts +13 -0
- package/src/internal/effect.ts +13 -0
- package/src/unstable/http/HttpBody.ts +41 -0
- package/src/unstable/http/HttpClientRequest.ts +22 -1
- package/src/unstable/schema/VariantSchema.ts +36 -7
- package/src/unstable/sql/SqlModel.ts +3 -3
- 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;
|
|
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
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
|
*
|
package/src/internal/effect.ts
CHANGED
|
@@ -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 {
|
|
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
|
-
|
|
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.
|
|
484
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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)
|