@effect-app/infra 1.12.1 → 1.13.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 CHANGED
@@ -1,5 +1,30 @@
1
1
  # @effect-app/infra
2
2
 
3
+ ## 1.13.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 24f0c0f: feat: allow custom errors per endpoint.
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [24f0c0f]
12
+ - effect-app@1.11.0
13
+ - @effect-app/schema@1.8.0
14
+ - @effect-app/infra-adapters@1.8.3
15
+
16
+ ## 1.12.2
17
+
18
+ ### Patch Changes
19
+
20
+ - 0b399ce: update packages
21
+ - Updated dependencies [1ac74ec]
22
+ - Updated dependencies [0b399ce]
23
+ - effect-app@1.10.2
24
+ - @effect-app/infra-adapters@1.8.2
25
+ - @effect-app/schema@1.7.1
26
+ - @effect-app/core@1.7.1
27
+
3
28
  ## 1.12.1
4
29
 
5
30
  ### Patch Changes
@@ -21,7 +21,7 @@ function defaultBasicErrorHandler(_req, res, r2) {
21
21
  .catchAll(err => _effectApp.Effect.logError("Program error, compiler probably silenced, got an unsupported Error in Error Channel of Effect" + err).pipe(_effectApp.Effect.map(() => err), _effectApp.Effect.flatMap(_effectApp.Effect.die))));
22
22
  }
23
23
  const optimisticConcurrencySchedule = _effectApp.Schedule.once && _effectApp.Schedule.recurWhile(a => a._tag === "OptimisticConcurrencyException");
24
- function defaultErrorHandler(req, res, r2) {
24
+ function defaultErrorHandler(req, res, r2, customErrorSchema) {
25
25
  const r3 = req.method === "PATCH" ? _effectApp.Effect.retry(r2, optimisticConcurrencySchedule) : r2;
26
26
  const sendError = (code, schema) => body => _effectApp.S.encode(schema)(body).pipe(_effectApp.Effect.orDie, _effectApp.Effect.andThen(body => res.pipe((0, _HttpServerResponse.setStatus)(code), (0, _HttpServerResponse.setBody)(_http.HttpBody.unsafeJson(body)))));
27
27
  return r3.pipe(_effectApp.Effect.tapErrorCause(cause => _effectApp.Cause.isFailure(cause) ? logRequestError(cause) : _effectApp.Effect.void), _effectApp.Effect.tapErrorCause(cause => _effectApp.Effect.annotateCurrentSpan({
@@ -52,7 +52,9 @@ function defaultErrorHandler(req, res, r2) {
52
52
  "ServiceUnavailableError": sendError(503, _errors.ServiceUnavailableError),
53
53
  // 412 or 409.. https://stackoverflow.com/questions/19122088/which-http-status-code-to-use-to-reject-a-put-due-to-optimistic-locking-failure
54
54
  "OptimisticConcurrencyException": sendError(412, _errors.OptimisticConcurrencyException)
55
- }), _effectApp.Effect
55
+ }), customErrorSchema ? _effectApp.Effect.catchAll(x => _effectApp.S.is(customErrorSchema)(x)
56
+ // TODO: customize error code
57
+ ? sendError(422, customErrorSchema)(x) : _effectApp.Effect.fail(x)) : x => x, _effectApp.Effect
56
58
  // final catch all; expecting never so that unhandled known errors will show up
57
59
  .catchAll(err => _effectApp.Effect.logError("Program error, compiler probably silenced, got an unsupported Error in Error Channel of Effect" + err).pipe(_effectApp.Effect.map(() => err), _effectApp.Effect.flatMap(_effectApp.Effect.die))));
58
60
  }
@@ -1 +1 @@
1
- {"version":3,"file":"defaultErrorHandler.cjs","names":["_errorReporter","require","_HttpServerResponse","_effectApp","_errors","_http","JWTError","Data","TaggedClass","exports","logRequestError","logError","defaultBasicErrorHandler","_req","res","r2","sendError","code","body","Effect","sync","setBody","HttpBody","unsafeJson","pipe","setStatus","tapErrorCause","cause","Cause","isFailure","void","catchTag","err","errors","catchAll","map","flatMap","die","optimisticConcurrencySchedule","Schedule","once","recurWhile","a","_tag","defaultErrorHandler","req","r3","method","retry","schema","S","encode","orDie","andThen","annotateCurrentSpan","pretty","squashWith","_","catchTags","succeed","HttpServerResponse","message","error","status","headers","HttpHeaders","fromInput","ValidationError","NotFoundError","NotLoggedInError","UnauthorizedError","InvalidStateError","ServiceUnavailableError","OptimisticConcurrencyException"],"sources":["../../../src/api/routing/defaultErrorHandler.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"defaultErrorHandler.cjs","names":["_errorReporter","require","_HttpServerResponse","_effectApp","_errors","_http","JWTError","Data","TaggedClass","exports","logRequestError","logError","defaultBasicErrorHandler","_req","res","r2","sendError","code","body","Effect","sync","setBody","HttpBody","unsafeJson","pipe","setStatus","tapErrorCause","cause","Cause","isFailure","void","catchTag","err","errors","catchAll","map","flatMap","die","optimisticConcurrencySchedule","Schedule","once","recurWhile","a","_tag","defaultErrorHandler","req","customErrorSchema","r3","method","retry","schema","S","encode","orDie","andThen","annotateCurrentSpan","pretty","squashWith","_","catchTags","succeed","HttpServerResponse","message","error","status","headers","HttpHeaders","fromInput","ValidationError","NotFoundError","NotLoggedInError","UnauthorizedError","InvalidStateError","ServiceUnavailableError","OptimisticConcurrencyException","x","is","fail"],"sources":["../../../src/api/routing/defaultErrorHandler.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -1,3 +1,4 @@
1
+ import type { Schema } from "@effect-app/schema";
1
2
  import { Effect } from "effect-app";
2
3
  import type { SupportedErrors } from "effect-app/client/errors";
3
4
  import { ValidationError } from "effect-app/client/errors";
@@ -11,6 +12,8 @@ export declare class JWTError extends JWTError_base<{
11
12
  }> {
12
13
  }
13
14
  export declare function defaultBasicErrorHandler<R>(_req: HttpServerRequest.HttpServerRequest, res: HttpServerResponse.HttpServerResponse, r2: Effect<HttpServerResponse.HttpServerResponse, ValidationError, R>): Effect.Effect<HttpServerResponse.HttpServerResponse, never, R>;
14
- export declare function defaultErrorHandler<R>(req: HttpServerRequest.HttpServerRequest, res: HttpServerResponse.HttpServerResponse, r2: Effect<HttpServerResponse.HttpServerResponse, SupportedErrors | JWTError, R>): Effect.Effect<HttpServerResponse.HttpServerResponse, never, R>;
15
+ export declare function defaultErrorHandler<R, A extends {
16
+ _tag: string;
17
+ } = never>(req: HttpServerRequest.HttpServerRequest, res: HttpServerResponse.HttpServerResponse, r2: Effect<HttpServerResponse.HttpServerResponse, SupportedErrors | JWTError, R>, customErrorSchema?: Schema<A, unknown>): Effect.Effect<HttpServerResponse.HttpServerResponse, never, R>;
15
18
  export {};
16
19
  //# sourceMappingURL=defaultErrorHandler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaultErrorHandler.d.ts","sourceRoot":"","sources":["../../../src/api/routing/defaultErrorHandler.ts"],"names":[],"mappings":"AAGA,OAAO,EAAe,MAAM,EAAe,MAAM,YAAY,CAAA;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC/D,OAAO,EAOL,eAAe,EAChB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAyB,KAAK,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACnG,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,CAAC,iBAAiB,EACzC,GAAG,EAAE,kBAAkB,CAAC,kBAAkB,EAC1C,EAAE,EAAE,MAAM,CAAC,kBAAkB,CAAC,kBAAkB,EAAE,eAAe,EAAE,CAAC,CAAC,kEAoBtE;AAKD,wBAAgB,mBAAmB,CAAC,CAAC,EACnC,GAAG,EAAE,iBAAiB,CAAC,iBAAiB,EACxC,GAAG,EAAE,kBAAkB,CAAC,kBAAkB,EAC1C,EAAE,EAAE,MAAM,CAAC,kBAAkB,CAAC,kBAAkB,EAAE,eAAe,GAAG,QAAQ,EAAE,CAAC,CAAC,kEAkEjF"}
1
+ {"version":3,"file":"defaultErrorHandler.d.ts","sourceRoot":"","sources":["../../../src/api/routing/defaultErrorHandler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,EAAe,MAAM,EAAe,MAAM,YAAY,CAAA;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC/D,OAAO,EAOL,eAAe,EAChB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAyB,KAAK,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACnG,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,CAAC,iBAAiB,EACzC,GAAG,EAAE,kBAAkB,CAAC,kBAAkB,EAC1C,EAAE,EAAE,MAAM,CAAC,kBAAkB,CAAC,kBAAkB,EAAE,eAAe,EAAE,CAAC,CAAC,kEAoBtE;AAKD,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,KAAK,EACvE,GAAG,EAAE,iBAAiB,CAAC,iBAAiB,EACxC,GAAG,EAAE,kBAAkB,CAAC,kBAAkB,EAC1C,EAAE,EAAE,MAAM,CAAC,kBAAkB,CAAC,kBAAkB,EAAE,eAAe,GAAG,QAAQ,EAAE,CAAC,CAAC,EAChF,iBAAiB,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,kEA0EvC"}
@@ -16,7 +16,7 @@ export function defaultBasicErrorHandler(_req, res, r2) {
16
16
  }
17
17
  const optimisticConcurrencySchedule = Schedule.once
18
18
  && Schedule.recurWhile((a) => a._tag === "OptimisticConcurrencyException");
19
- export function defaultErrorHandler(req, res, r2) {
19
+ export function defaultErrorHandler(req, res, r2, customErrorSchema) {
20
20
  const r3 = req.method === "PATCH"
21
21
  ? Effect.retry(r2, optimisticConcurrencySchedule)
22
22
  : r2;
@@ -53,10 +53,15 @@ export function defaultErrorHandler(req, res, r2) {
53
53
  "ServiceUnavailableError": sendError(503, ServiceUnavailableError),
54
54
  // 412 or 409.. https://stackoverflow.com/questions/19122088/which-http-status-code-to-use-to-reject-a-put-due-to-optimistic-locking-failure
55
55
  "OptimisticConcurrencyException": sendError(412, OptimisticConcurrencyException)
56
- }), Effect
56
+ }), customErrorSchema
57
+ ? Effect.catchAll((x) => S.is(customErrorSchema)(x)
58
+ // TODO: customize error code
59
+ ? sendError(422, customErrorSchema)(x)
60
+ : Effect.fail(x))
61
+ : (x) => x, Effect
57
62
  // final catch all; expecting never so that unhandled known errors will show up
58
63
  .catchAll((err) => Effect
59
64
  .logError("Program error, compiler probably silenced, got an unsupported Error in Error Channel of Effect" + err)
60
65
  .pipe(Effect.map(() => err), Effect.flatMap(Effect.die))));
61
66
  }
62
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdEVycm9ySGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvcm91dGluZy9kZWZhdWx0RXJyb3JIYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQTtBQUUxRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFDQUFxQyxDQUFBO0FBQ3hFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBRTdELE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsYUFBYSxFQUNiLGdCQUFnQixFQUNoQiw4QkFBOEIsRUFDOUIsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixlQUFlLEVBQ2hCLE1BQU0sMEJBQTBCLENBQUE7QUFDakMsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQTBCLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFRbkcsTUFBTSxPQUFPLFFBQVMsU0FBUSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FNdkQ7Q0FBRztBQUVMLE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUUzQyxNQUFNLFVBQVUsd0JBQXdCLENBQ3RDLElBQXlDLEVBQ3pDLEdBQTBDLEVBQzFDLEVBQXFFO0lBRXJFLE1BQU0sU0FBUyxHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQWEsRUFBRSxFQUFFLENBQ3BELE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDbEYsT0FBTyxFQUFF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
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdEVycm9ySGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvcm91dGluZy9kZWZhdWx0RXJyb3JIYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQTtBQUUxRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFDQUFxQyxDQUFBO0FBQ3hFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBRTdELE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsYUFBYSxFQUNiLGdCQUFnQixFQUNoQiw4QkFBOEIsRUFDOUIsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixlQUFlLEVBQ2hCLE1BQU0sMEJBQTBCLENBQUE7QUFDakMsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQTBCLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFRbkcsTUFBTSxPQUFPLFFBQVMsU0FBUSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FNdkQ7Q0FBRztBQUVMLE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUUzQyxNQUFNLFVBQVUsd0JBQXdCLENBQ3RDLElBQXlDLEVBQ3pDLEdBQTBDLEVBQzFDLEVBQXFFO0lBRXJFLE1BQU0sU0FBUyxHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQWEsRUFBRSxFQUFFLENBQ3BELE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDbEYsT0FBTyxFQUFF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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect-app/infra",
3
- "version": "1.12.1",
3
+ "version": "1.13.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -18,16 +18,16 @@
18
18
  "proper-lockfile": "^4.1.2",
19
19
  "pure-rand": "6.1.0",
20
20
  "redlock": "^4.2.0",
21
- "@effect-app/core": "1.7.0",
22
- "@effect-app/infra-adapters": "1.8.1",
23
- "effect-app": "1.10.1",
24
- "@effect-app/schema": "1.7.0"
21
+ "@effect-app/core": "1.7.1",
22
+ "@effect-app/infra-adapters": "1.8.3",
23
+ "effect-app": "1.11.0",
24
+ "@effect-app/schema": "1.8.0"
25
25
  },
26
26
  "devDependencies": {
27
27
  "@babel/cli": "^7.25.6",
28
28
  "@sentry/node": "^8.28.0",
29
29
  "@types/express": "^4.17.21",
30
- "@types/node": "~22.5.3",
30
+ "@types/node": "~22.5.4",
31
31
  "@types/proper-lockfile": "^4.1.4",
32
32
  "@types/redis": "^2.8.32",
33
33
  "@types/redlock": "^4.0.7",
@@ -42,9 +42,9 @@
42
42
  },
43
43
  "peerDependencies": {
44
44
  "express": "^4.19.2",
45
- "@effect/platform": "^0.63.1",
46
- "@effect/schema": "^0.72.1",
47
- "effect": "^3.7.1"
45
+ "@effect/platform": "^0.63.3",
46
+ "@effect/schema": "^0.72.2",
47
+ "effect": "^3.7.2"
48
48
  },
49
49
  "typesVersions": {
50
50
  "*": {
@@ -56,12 +56,13 @@ export function defaultBasicErrorHandler<R>(
56
56
  }
57
57
 
58
58
  const optimisticConcurrencySchedule = Schedule.once
59
- && Schedule.recurWhile<SupportedErrors | JWTError>((a) => a._tag === "OptimisticConcurrencyException")
59
+ && Schedule.recurWhile<{ _tag: string }>((a) => a._tag === "OptimisticConcurrencyException")
60
60
 
61
- export function defaultErrorHandler<R>(
61
+ export function defaultErrorHandler<R, A extends { _tag: string } = never>(
62
62
  req: HttpServerRequest.HttpServerRequest,
63
63
  res: HttpServerResponse.HttpServerResponse,
64
- r2: Effect<HttpServerResponse.HttpServerResponse, SupportedErrors | JWTError, R>
64
+ r2: Effect<HttpServerResponse.HttpServerResponse, SupportedErrors | JWTError, R>,
65
+ customErrorSchema?: Schema<A, unknown>
65
66
  ) {
66
67
  const r3 = req.method === "PATCH"
67
68
  ? Effect.retry(r2, optimisticConcurrencySchedule)
@@ -114,6 +115,14 @@ export function defaultErrorHandler<R>(
114
115
  // 412 or 409.. https://stackoverflow.com/questions/19122088/which-http-status-code-to-use-to-reject-a-put-due-to-optimistic-locking-failure
115
116
  "OptimisticConcurrencyException": sendError(412, OptimisticConcurrencyException)
116
117
  }),
118
+ customErrorSchema
119
+ ? Effect.catchAll((x) =>
120
+ S.is(customErrorSchema)(x)
121
+ // TODO: customize error code
122
+ ? sendError(422, customErrorSchema)(x)
123
+ : Effect.fail(x)
124
+ )
125
+ : (x) => x,
117
126
  Effect
118
127
  // final catch all; expecting never so that unhandled known errors will show up
119
128
  .catchAll((err: never) =>