@effect-app/infra 0.154.7 → 0.155.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.
- package/CHANGELOG.md +16 -0
- package/_cjs/api/routing/defaultErrorHandler.cjs +9 -7
- package/_cjs/api/routing/defaultErrorHandler.cjs.map +1 -1
- package/_src/api/routing/defaultErrorHandler.ts +26 -9
- package/dist/api/routing/defaultErrorHandler.d.ts +3 -1
- package/dist/api/routing/defaultErrorHandler.d.ts.map +1 -1
- package/dist/api/routing/defaultErrorHandler.js +10 -8
- package/dist/services/simpledb/redisdb.d.ts +3 -3
- package/dist/services/simpledb/shared.d.ts +5 -5
- package/package.json +8 -8
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# @effect-app/infra
|
|
2
2
|
|
|
3
|
+
## 0.155.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 99f79ab: update packages
|
|
8
|
+
- cd25b5f: improve: typed error handling
|
|
9
|
+
|
|
10
|
+
### Patch Changes
|
|
11
|
+
|
|
12
|
+
- Updated dependencies [99f79ab]
|
|
13
|
+
- Updated dependencies [cd25b5f]
|
|
14
|
+
- @effect-app/infra-adapters@0.105.0
|
|
15
|
+
- @effect-app/prelude@0.132.0
|
|
16
|
+
- @effect-app/schema@0.170.0
|
|
17
|
+
- @effect-app/core@0.116.0
|
|
18
|
+
|
|
3
19
|
## 0.154.7
|
|
4
20
|
|
|
5
21
|
### Patch Changes
|
|
@@ -12,7 +12,9 @@ var tsplus_module_3 = _interopRequireWildcard(require("@effect/platform/Http/Ser
|
|
|
12
12
|
var tsplus_module_4 = _interopRequireWildcard(require("effect/Effect"));
|
|
13
13
|
var tsplus_module_5 = _interopRequireWildcard(require("effect/Cause"));
|
|
14
14
|
var tsplus_module_6 = _interopRequireWildcard(require("effect/Schedule"));
|
|
15
|
+
var tsplus_module_7 = _interopRequireWildcard(require("@effect/schema/Parser"));
|
|
15
16
|
var _errorReporter = require("@effect-app/infra/errorReporter");
|
|
17
|
+
var _errors = require("@effect-app/prelude/client/errors");
|
|
16
18
|
var _http = require("../http.cjs");
|
|
17
19
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
18
20
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
@@ -28,7 +30,7 @@ function defaultBasicErrorHandler(_req, res, r2) {
|
|
|
28
30
|
const optimisticConcurrencySchedule = tsplus_module_6.once && tsplus_module_6.recurWhile(a => a._tag === "OptimisticConcurrencyException");
|
|
29
31
|
function defaultErrorHandler(req, res, r2) {
|
|
30
32
|
const r3 = req.method === "PATCH" ? tsplus_module_4.retry(r2, optimisticConcurrencySchedule) : r2;
|
|
31
|
-
const sendError = code => body => tsplus_module_4.
|
|
33
|
+
const sendError = (code, schema) => body => tsplus_module_4.andThen(tsplus_module_4.orDie(tsplus_module_7.encode(schema)(body)), body => tsplus_module_3.setBody(tsplus_module_3.setStatus(code)(res), tsplus_module_2.unsafeJson(body)));
|
|
32
34
|
return tsplus_module_4.catchAll(tsplus_module_4.catchTags(tsplus_module_4.tapErrorCause(r3, cause => tsplus_module_5.isFailure(cause) ? logRequestError(cause) : tsplus_module_4.unit), {
|
|
33
35
|
"JWTError": err => tsplus_module_4.succeed(tsplus_module_3.unsafeJson({
|
|
34
36
|
message: err.error.message
|
|
@@ -36,13 +38,13 @@ function defaultErrorHandler(req, res, r2) {
|
|
|
36
38
|
status: err.error.status,
|
|
37
39
|
headers: _http.HttpHeaders.fromInput(err.error.headers)
|
|
38
40
|
})),
|
|
39
|
-
"ValidationError":
|
|
40
|
-
"NotFoundError": sendError(404),
|
|
41
|
-
"NotLoggedInError": sendError(401),
|
|
42
|
-
"UnauthorizedError": sendError(403),
|
|
43
|
-
"InvalidStateError": sendError(422),
|
|
41
|
+
"ValidationError": sendError(400, _errors.ValidationError),
|
|
42
|
+
"NotFoundError": sendError(404, _errors.NotFoundError),
|
|
43
|
+
"NotLoggedInError": sendError(401, _errors.NotLoggedInError),
|
|
44
|
+
"UnauthorizedError": sendError(403, _errors.UnauthorizedError),
|
|
45
|
+
"InvalidStateError": sendError(422, _errors.InvalidStateError),
|
|
44
46
|
// 412 or 409.. https://stackoverflow.com/questions/19122088/which-http-status-code-to-use-to-reject-a-put-due-to-optimistic-locking-failure
|
|
45
|
-
"OptimisticConcurrencyException": sendError(412)
|
|
47
|
+
"OptimisticConcurrencyException": sendError(412, _errors.OptimisticConcurrencyException)
|
|
46
48
|
})
|
|
47
49
|
// final catch all; expecting never so that unhandled known errors will show up
|
|
48
50
|
, err => tsplus_module_4.flatMap(tsplus_module_4.map(tsplus_module_4.logError("Program error, compiler probably silenced, got an unsupported Error in Error Channel of Effect" + err), () => err), tsplus_module_4.die));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaultErrorHandler.cjs","names":["_errorReporter","require","_http","_getRequireWildcardCache","e","WeakMap","r","t","_interopRequireWildcard","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","JWTError","tsplus_module_1","TaggedClass","exports","logRequestError","logError","defaultBasicErrorHandler","_req","res","r2","sendError","code","body","tsplus_module_4","sync","tsplus_module_3","setStatus","setBody","tsplus_module_2","unsafeJson","catchAll","catchTag","tapErrorCause","cause","tsplus_module_5","isFailure","unit","err","errors","flatMap","map","die","optimisticConcurrencySchedule","tsplus_module_6","once","recurWhile","_tag","defaultErrorHandler","req","r3","method","retry","catchTags","succeed","message","error","status","headers","HttpHeaders","fromInput"],"sources":["../../../_src/api/routing/defaultErrorHandler.ts"],"sourcesContent":[null],"mappings":"
|
|
1
|
+
{"version":3,"file":"defaultErrorHandler.cjs","names":["_errorReporter","require","_errors","_http","_getRequireWildcardCache","e","WeakMap","r","t","_interopRequireWildcard","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","JWTError","tsplus_module_1","TaggedClass","exports","logRequestError","logError","defaultBasicErrorHandler","_req","res","r2","sendError","code","body","tsplus_module_4","sync","tsplus_module_3","setStatus","setBody","tsplus_module_2","unsafeJson","catchAll","catchTag","tapErrorCause","cause","tsplus_module_5","isFailure","unit","err","errors","flatMap","map","die","optimisticConcurrencySchedule","tsplus_module_6","once","recurWhile","_tag","defaultErrorHandler","req","r3","method","retry","schema","andThen","orDie","tsplus_module_7","encode","catchTags","succeed","message","error","status","headers","HttpHeaders","fromInput","ValidationError","NotFoundError","NotLoggedInError","UnauthorizedError","InvalidStateError","OptimisticConcurrencyException"],"sources":["../../../_src/api/routing/defaultErrorHandler.ts"],"sourcesContent":[null],"mappings":"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"}
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import { logError } from "@effect-app/infra/errorReporter"
|
|
2
|
-
import type { SupportedErrors
|
|
2
|
+
import type { SupportedErrors } from "@effect-app/prelude/client/errors"
|
|
3
|
+
import {
|
|
4
|
+
InvalidStateError,
|
|
5
|
+
NotFoundError,
|
|
6
|
+
NotLoggedInError,
|
|
7
|
+
OptimisticConcurrencyException,
|
|
8
|
+
UnauthorizedError,
|
|
9
|
+
ValidationError
|
|
10
|
+
} from "@effect-app/prelude/client/errors"
|
|
3
11
|
import { HttpBody, HttpHeaders, type HttpServerRequest, type HttpServerResponse } from "../http.js"
|
|
4
12
|
|
|
5
13
|
import type {
|
|
@@ -24,7 +32,8 @@ export function defaultBasicErrorHandler<R>(
|
|
|
24
32
|
res: HttpServerResponse,
|
|
25
33
|
r2: Effect<R, ValidationError, HttpServerResponse>
|
|
26
34
|
) {
|
|
27
|
-
const sendError = (code: number) => (body: unknown) =>
|
|
35
|
+
const sendError = (code: number) => (body: unknown) =>
|
|
36
|
+
Effect.sync(() => res.setBody(HttpBody.unsafeJson(body)).setStatus(code))
|
|
28
37
|
return r2
|
|
29
38
|
.tapErrorCause((cause) => cause.isFailure() ? logRequestError(cause) : Effect.unit)
|
|
30
39
|
.catchTag("ValidationError", (err) => sendError(400)(err.errors))
|
|
@@ -50,7 +59,15 @@ export function defaultErrorHandler<R>(
|
|
|
50
59
|
const r3 = req.method === "PATCH"
|
|
51
60
|
? r2.retry(optimisticConcurrencySchedule)
|
|
52
61
|
: r2
|
|
53
|
-
const sendError = (code: number
|
|
62
|
+
const sendError = <R, From, To>(code: number, schema: Schema<R, From, To>) => (body: To) =>
|
|
63
|
+
schema
|
|
64
|
+
.encode(body)
|
|
65
|
+
.orDie
|
|
66
|
+
.andThen((body) =>
|
|
67
|
+
res
|
|
68
|
+
.setStatus(code)
|
|
69
|
+
.setBody(HttpBody.unsafeJson(body))
|
|
70
|
+
)
|
|
54
71
|
return r3
|
|
55
72
|
.tapErrorCause((cause) => cause.isFailure() ? logRequestError(cause) : Effect.unit)
|
|
56
73
|
.catchTags({
|
|
@@ -63,13 +80,13 @@ export function defaultErrorHandler<R>(
|
|
|
63
80
|
headers: HttpHeaders.fromInput(err.error.headers)
|
|
64
81
|
})
|
|
65
82
|
),
|
|
66
|
-
"ValidationError":
|
|
67
|
-
"NotFoundError": sendError(404),
|
|
68
|
-
"NotLoggedInError": sendError(401),
|
|
69
|
-
"UnauthorizedError": sendError(403),
|
|
70
|
-
"InvalidStateError": sendError(422),
|
|
83
|
+
"ValidationError": sendError(400, ValidationError),
|
|
84
|
+
"NotFoundError": sendError(404, NotFoundError),
|
|
85
|
+
"NotLoggedInError": sendError(401, NotLoggedInError),
|
|
86
|
+
"UnauthorizedError": sendError(403, UnauthorizedError),
|
|
87
|
+
"InvalidStateError": sendError(422, InvalidStateError),
|
|
71
88
|
// 412 or 409.. https://stackoverflow.com/questions/19122088/which-http-status-code-to-use-to-reject-a-put-due-to-optimistic-locking-failure
|
|
72
|
-
"OptimisticConcurrencyException": sendError(412)
|
|
89
|
+
"OptimisticConcurrencyException": sendError(412, OptimisticConcurrencyException)
|
|
73
90
|
})
|
|
74
91
|
// final catch all; expecting never so that unhandled known errors will show up
|
|
75
92
|
.catchAll((err: never) =>
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { Data } from "effect/Data";
|
|
2
2
|
import { Effect } from "effect/Effect";
|
|
3
|
-
import
|
|
3
|
+
import { Schema } from "@effect-app/prelude/schema";
|
|
4
|
+
import type { SupportedErrors } from "@effect-app/prelude/client/errors";
|
|
5
|
+
import { ValidationError } from "@effect-app/prelude/client/errors";
|
|
4
6
|
import { type HttpServerRequest, type HttpServerResponse } from "../http.js";
|
|
5
7
|
import type { InsufficientScopeError, InvalidRequestError, InvalidTokenError, UnauthorizedError as JWTUnauthorizedError } from "express-oauth2-jwt-bearer";
|
|
6
8
|
declare const JWTError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<Omit<A, keyof import("effect/Equal").Equal>, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" | keyof import("effect/Equal").Equal ? never : P]: A[P]; }) => import("effect/Data").Data<Readonly<A> & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaultErrorHandler.d.ts","sourceRoot":"","sources":["../../../_src/api/routing/defaultErrorHandler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"defaultErrorHandler.d.ts","sourceRoot":"","sources":["../../../_src/api/routing/defaultErrorHandler.ts"],"names":[],"mappings":";;;AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAA;AACxE,OAAO,EAML,eAAe,EAChB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAyB,KAAK,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAEnG,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,IAAI,oBAAoB,EAC1C,MAAM,2BAA2B,CAAA;;;;AAElC,qBAAa,QAAS,SAAQ,cAA6B;IACzD,KAAK,EACD,sBAAsB,GACtB,mBAAmB,GACnB,iBAAiB,GACjB,oBAAoB,CAAA;CACzB,CAAC;CAAG;AAIL,wBAAgB,wBAAwB,CAAC,CAAC,EACxC,IAAI,EAAE,iBAAiB,EACvB,GAAG,EAAE,kBAAkB,EACvB,EAAE,EAAE,MAAM,CAAC,CAAC,EAAE,eAAe,EAAE,kBAAkB,CAAC,gEAgBnD;AAKD,wBAAgB,mBAAmB,CAAC,CAAC,EACnC,GAAG,EAAE,iBAAiB,EACtB,GAAG,EAAE,kBAAkB,EACvB,EAAE,EAAE,MAAM,CAAC,CAAC,EAAE,eAAe,GAAG,QAAQ,EAAE,kBAAkB,CAAC,gEA2C9D"}
|
|
@@ -4,7 +4,9 @@ import * as tsplus_module_3 from "@effect/platform/Http/ServerResponse";
|
|
|
4
4
|
import * as tsplus_module_4 from "effect/Effect";
|
|
5
5
|
import * as tsplus_module_5 from "effect/Cause";
|
|
6
6
|
import * as tsplus_module_6 from "effect/Schedule";
|
|
7
|
+
import * as tsplus_module_7 from "@effect/schema/Parser";
|
|
7
8
|
import { logError } from "@effect-app/infra/errorReporter";
|
|
9
|
+
import { InvalidStateError, NotFoundError, NotLoggedInError, OptimisticConcurrencyException, UnauthorizedError, ValidationError } from "@effect-app/prelude/client/errors";
|
|
8
10
|
import { HttpHeaders } from "../http.js";
|
|
9
11
|
export class JWTError extends tsplus_module_1.TaggedClass("JWTError") {
|
|
10
12
|
}
|
|
@@ -20,7 +22,7 @@ export function defaultErrorHandler(req, res, r2) {
|
|
|
20
22
|
const r3 = req.method === "PATCH"
|
|
21
23
|
? tsplus_module_4.retry(r2, optimisticConcurrencySchedule)
|
|
22
24
|
: r2;
|
|
23
|
-
const sendError = (code) => (body) => tsplus_module_4.
|
|
25
|
+
const sendError = (code, schema) => (body) => tsplus_module_4.andThen(tsplus_module_4.orDie(tsplus_module_7.encode(schema)(body)), (body) => tsplus_module_3.setBody(tsplus_module_3.setStatus(code)(res), tsplus_module_2.unsafeJson(body)));
|
|
24
26
|
return tsplus_module_4.catchAll(tsplus_module_4.catchTags(tsplus_module_4.tapErrorCause(r3, (cause) => tsplus_module_5.isFailure(cause) ? logRequestError(cause) : tsplus_module_4.unit), {
|
|
25
27
|
"JWTError": (err) => tsplus_module_4.succeed(tsplus_module_3.unsafeJson({ message: err.error.message }, {
|
|
26
28
|
status: err
|
|
@@ -28,15 +30,15 @@ export function defaultErrorHandler(req, res, r2) {
|
|
|
28
30
|
.status,
|
|
29
31
|
headers: HttpHeaders.fromInput(err.error.headers)
|
|
30
32
|
})),
|
|
31
|
-
"ValidationError":
|
|
32
|
-
"NotFoundError": sendError(404),
|
|
33
|
-
"NotLoggedInError": sendError(401),
|
|
34
|
-
"UnauthorizedError": sendError(403),
|
|
35
|
-
"InvalidStateError": sendError(422),
|
|
33
|
+
"ValidationError": sendError(400, ValidationError),
|
|
34
|
+
"NotFoundError": sendError(404, NotFoundError),
|
|
35
|
+
"NotLoggedInError": sendError(401, NotLoggedInError),
|
|
36
|
+
"UnauthorizedError": sendError(403, UnauthorizedError),
|
|
37
|
+
"InvalidStateError": sendError(422, InvalidStateError),
|
|
36
38
|
// 412 or 409.. https://stackoverflow.com/questions/19122088/which-http-status-code-to-use-to-reject-a-put-due-to-optimistic-locking-failure
|
|
37
|
-
"OptimisticConcurrencyException": sendError(412)
|
|
39
|
+
"OptimisticConcurrencyException": sendError(412, OptimisticConcurrencyException)
|
|
38
40
|
})
|
|
39
41
|
// final catch all; expecting never so that unhandled known errors will show up
|
|
40
42
|
, (err) => tsplus_module_4.flatMap(tsplus_module_4.map(tsplus_module_4.logError("Program error, compiler probably silenced, got an unsupported Error in Error Channel of Effect" + err), () => err), tsplus_module_4.die));
|
|
41
43
|
}
|
|
42
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdEVycm9ySGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL19zcmMvYXBpL3JvdXRpbmcvZGVmYXVsdEVycm9ySGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlDQUFpQyxDQUFBO0FBRTFELE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsYUFBYSxFQUNiLGdCQUFnQixFQUNoQiw4QkFBOEIsRUFDOUIsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDaEIsTUFBTSxtQ0FBbUMsQ0FBQTtBQUMxQyxPQUFPLEVBQVksV0FBVyxFQUFtRCxNQUFNLFlBQVksQ0FBQTtBQVNuRyxNQUFNLE9BQU8sUUFBUyxTQUFRLDRCQUFpQixVQUFVLENBTXZEO0NBQUc7QUFFTCxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUE7QUFFM0MsTUFBTSxVQUFVLHdCQUF3QixDQUN0QyxJQUF1QixFQUN2QixHQUF1QixFQUN2QixFQUFrRDtJQUVsRCxNQUFNLFNBQVMsR0FBRyxDQUFDLElBQVksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFhLEVBQUUsRUFBRSxDQUNwRCxxQkFBWSxHQUFHLEVBQUUsQ0FBQywwQkFBaUQsSUFBSSxFQUFyRCx3QkFBQSxHQUFHLEVBQVMsMkJBQW9CLElBQUksQ0FBQyxDQUFDLENBQWdCLENBQUMsQ0FBQTtJQUMzRSxPQUFPLHlCQUFBLHlCQUFBLDhCQUFBLEVBQUUsRUFDUSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsMEJBQUEsS0FBSyxDQUFZLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLHFCQUFZLENBQUMsRUFDekUsaUJBQWlCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakUsK0VBQStFO01BQ3JFLENBQUMsR0FBVSxFQUFFLEVBQUUsQ0FDdkIsd0JBQUEsb0JBQUEseUJBRUksZ0dBQWdHLEdBQUcsR0FBRyxDQUN2RyxFQUNJLEdBQUcsRUFBRSxDQUFDLEdBQWMsQ0FBQyxzQkFDTixDQUN2QixDQUFBO0FBQ0wsQ0FBQztBQUVELE1BQU0sNkJBQTZCLEdBQUcsd0JBQ2pDLDJCQUFnRCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxnQ0FBZ0MsQ0FBQyxDQUFBO0FBRXhHLE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsR0FBc0IsRUFDdEIsR0FBdUIsRUFDdkIsRUFBNkQ7SUFFN0QsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sS0FBSyxPQUFPO1FBQy9CLENBQUMsQ0FBQyxzQkFBQSxFQUFFLEVBQU8sNkJBQTZCLENBQUM7UUFDekMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUNOLE1BQU0sU0FBUyxHQUFHLENBQWMsSUFBWSxFQUFFLE1BQTJCLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBUSxFQUFFLEVBQUUsQ0FDekYsOENBQUEsdUJBQUEsTUFBTSxFQUNJLElBQUksQ0FBQyxHQUVKLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDaEIsd0JBQUEsMEJBQ2EsSUFBSSxFQURqQixHQUFHLENBQ2UsRUFDUCwyQkFBb0IsSUFBSSxDQUFDLENBQUMsQ0FDdEMsQ0FBQTtJQUNMLE9BQU8seUJBQUEsMEJBQUEsOEJBQUEsRUFBRSxFQUNRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQywwQkFBQSxLQUFLLENBQVksQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMscUJBQVksQ0FBQyxFQUN4RTtRQUNULFVBQVUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQ2xCLHdCQUNFLDJCQUE4QixFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzVELE1BQU0sRUFBRSxHQUFHO2lCQUNSLEtBQUs7aUJBQ0wsTUFBTTtZQUNULE9BQU8sRUFBRSxXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO1NBQ2xELENBQUMsQ0FDSDtRQUNILGlCQUFpQixFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsZUFBZSxDQUFDO1FBQ2xELGVBQWUsRUFBRSxTQUFTLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQztRQUM5QyxrQkFBa0IsRUFBRSxTQUFTLENBQUMsR0FBRyxFQUFFLGdCQUFnQixDQUFDO1FBQ3BELG1CQUFtQixFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLENBQUM7UUFDdEQsbUJBQW1CLEVBQUUsU0FBUyxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQztRQUN0RCw0SUFBNEk7UUFDNUksZ0NBQWdDLEVBQUUsU0FBUyxDQUFDLEdBQUcsRUFBRSw4QkFBOEIsQ0FBQztLQUNqRixDQUFDO0lBQ0YsK0VBQStFO01BQ3JFLENBQUMsR0FBVSxFQUFFLEVBQUUsQ0FDdkIsd0JBQUEsb0JBQUEseUJBRUksZ0dBQWdHLEdBQUcsR0FBRyxDQUN2RyxFQUNJLEdBQUcsRUFBRSxDQUFDLEdBQWMsQ0FBQyxzQkFDTixDQUN2QixDQUFBO0FBQ0wsQ0FBQyJ9
|
|
@@ -12,16 +12,16 @@ export declare function createContext<TKey extends string, EA, A extends DBRecor
|
|
|
12
12
|
};
|
|
13
13
|
declare const RedisSerializedDBRecord_base: S.Class<never, {
|
|
14
14
|
readonly data: string;
|
|
15
|
-
readonly version: string;
|
|
16
15
|
readonly timestamp: string;
|
|
16
|
+
readonly version: string;
|
|
17
17
|
}, {
|
|
18
18
|
readonly data: string;
|
|
19
|
-
readonly version: string;
|
|
20
19
|
readonly timestamp: Date;
|
|
20
|
+
readonly version: string;
|
|
21
21
|
}, {
|
|
22
22
|
readonly data: string;
|
|
23
|
-
readonly version: string;
|
|
24
23
|
readonly timestamp: Date;
|
|
24
|
+
readonly version: string;
|
|
25
25
|
}, RedisSerializedDBRecord, {
|
|
26
26
|
version: S.Schema<never, string, string>;
|
|
27
27
|
timestamp: S.Schema<never, string, Date>;
|
|
@@ -39,16 +39,16 @@ export interface DBRecord<TKey extends string> {
|
|
|
39
39
|
}
|
|
40
40
|
declare const SerializedDBRecord_base: S.Class<never, {
|
|
41
41
|
readonly data: string;
|
|
42
|
-
readonly version: string;
|
|
43
42
|
readonly timestamp: string;
|
|
43
|
+
readonly version: string;
|
|
44
44
|
}, {
|
|
45
45
|
readonly data: string;
|
|
46
|
-
readonly version: string;
|
|
47
46
|
readonly timestamp: Date;
|
|
47
|
+
readonly version: string;
|
|
48
48
|
}, {
|
|
49
49
|
readonly data: string;
|
|
50
|
-
readonly version: string;
|
|
51
50
|
readonly timestamp: Date;
|
|
51
|
+
readonly version: string;
|
|
52
52
|
}, SerializedDBRecord, {
|
|
53
53
|
version: S.Schema<never, string, string>;
|
|
54
54
|
timestamp: S.Schema<never, string, Date>;
|
|
@@ -58,12 +58,12 @@ export declare class SerializedDBRecord extends SerializedDBRecord_base {
|
|
|
58
58
|
}
|
|
59
59
|
export declare function makeSerialisedDBRecord(s: Schema<never, any>): S.Schema<never, {
|
|
60
60
|
readonly data: any;
|
|
61
|
-
readonly version: number;
|
|
62
61
|
readonly timestamp: string;
|
|
62
|
+
readonly version: number;
|
|
63
63
|
}, {
|
|
64
64
|
readonly data: any;
|
|
65
|
-
readonly version: number;
|
|
66
65
|
readonly timestamp: Date;
|
|
66
|
+
readonly version: number;
|
|
67
67
|
}>;
|
|
68
68
|
export interface CachedRecord<T> {
|
|
69
69
|
version: string;
|
package/package.json
CHANGED
|
@@ -1,30 +1,30 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect-app/infra",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.155.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"dependencies": {
|
|
7
7
|
"@azure/cosmos": "^4.0.0",
|
|
8
8
|
"@azure/service-bus": "^7.9.3",
|
|
9
|
-
"@effect/platform": "^0.43.
|
|
10
|
-
"@effect/schema": "npm:@effect-app/schema-fork@0.0.0-
|
|
9
|
+
"@effect/platform": "^0.43.4",
|
|
10
|
+
"@effect/schema": "npm:@effect-app/schema-fork@0.0.0-20240129113320",
|
|
11
11
|
"express-oauth2-jwt-bearer": "^1.6.0",
|
|
12
12
|
"@faker-js/faker": "^8.4.0",
|
|
13
13
|
"@sendgrid/helpers": "^8.0.0",
|
|
14
14
|
"@sendgrid/mail": "^8.1.0",
|
|
15
15
|
"change-case": "^5.4.2",
|
|
16
16
|
"cross-fetch": "^4.0.0",
|
|
17
|
-
"effect": "^2.2.
|
|
17
|
+
"effect": "^2.2.3",
|
|
18
18
|
"fast-check": "~3.15.0",
|
|
19
19
|
"object-hash": "^3.0.0",
|
|
20
20
|
"path-parser": "^6.1.0",
|
|
21
21
|
"proper-lockfile": "^4.1.2",
|
|
22
22
|
"pure-rand": "6.0.4",
|
|
23
23
|
"redlock": "^4.2.0",
|
|
24
|
-
"@effect-app/
|
|
25
|
-
"@effect-app/
|
|
26
|
-
"@effect-app/
|
|
27
|
-
"@effect-app/
|
|
24
|
+
"@effect-app/core": "0.116.0",
|
|
25
|
+
"@effect-app/schema": "0.170.0",
|
|
26
|
+
"@effect-app/infra-adapters": "0.105.0",
|
|
27
|
+
"@effect-app/prelude": "0.132.0"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@babel/cli": "^7.23.9",
|