@thisisagile/easy-express 19.1.4 → 20.0.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.
Files changed (74) hide show
  1. package/dist/express/AuthError.d.ts +6 -3
  2. package/dist/express/AuthError.js +16 -0
  3. package/dist/express/AuthError.js.map +1 -0
  4. package/dist/express/CorrelationHandler.d.ts +4 -1
  5. package/dist/express/CorrelationHandler.js +10 -0
  6. package/dist/express/CorrelationHandler.js.map +1 -0
  7. package/dist/express/ErrorHandler.d.ts +4 -1
  8. package/dist/express/ErrorHandler.js +19 -0
  9. package/dist/express/ErrorHandler.js.map +1 -0
  10. package/dist/express/ExpressProvider.d.ts +17 -14
  11. package/dist/express/ExpressProvider.js +68 -0
  12. package/dist/express/ExpressProvider.js.map +1 -0
  13. package/dist/express/NotFoundHandler.d.ts +4 -1
  14. package/dist/express/NotFoundHandler.js +10 -0
  15. package/dist/express/NotFoundHandler.js.map +1 -0
  16. package/dist/express/RequestContextHandler.d.ts +4 -1
  17. package/dist/express/RequestContextHandler.js +7 -0
  18. package/dist/express/RequestContextHandler.js.map +1 -0
  19. package/dist/express/SecurityHandler.d.ts +13 -10
  20. package/dist/express/SecurityHandler.js +37 -0
  21. package/dist/express/SecurityHandler.js.map +1 -0
  22. package/dist/express/index.d.ts +8 -7
  23. package/dist/express/index.js +8 -0
  24. package/dist/index.d.ts +11 -2
  25. package/dist/index.js +9 -238
  26. package/dist/types/NamespaceContext.d.ts +8 -5
  27. package/dist/types/NamespaceContext.js +17 -0
  28. package/dist/types/NamespaceContext.js.map +1 -0
  29. package/dist/types/index.d.ts +2 -1
  30. package/dist/types/index.js +1 -0
  31. package/package.json +20 -18
  32. package/dist/chunk-33OQAPCM.mjs +0 -11
  33. package/dist/chunk-33OQAPCM.mjs.map +0 -1
  34. package/dist/chunk-6TBWUXPT.mjs +0 -1
  35. package/dist/chunk-6TBWUXPT.mjs.map +0 -1
  36. package/dist/chunk-C7NPSRIT.mjs +0 -8
  37. package/dist/chunk-C7NPSRIT.mjs.map +0 -1
  38. package/dist/chunk-GEFXEGJW.mjs +0 -94
  39. package/dist/chunk-GEFXEGJW.mjs.map +0 -1
  40. package/dist/chunk-N2UP7WFM.mjs +0 -38
  41. package/dist/chunk-N2UP7WFM.mjs.map +0 -1
  42. package/dist/chunk-RL5ICAHT.mjs +0 -19
  43. package/dist/chunk-RL5ICAHT.mjs.map +0 -1
  44. package/dist/chunk-T4G4HIZT.mjs +0 -43
  45. package/dist/chunk-T4G4HIZT.mjs.map +0 -1
  46. package/dist/chunk-U2UXWL6X.mjs +0 -18
  47. package/dist/chunk-U2UXWL6X.mjs.map +0 -1
  48. package/dist/chunk-UQNJLY2I.mjs +0 -11
  49. package/dist/chunk-UQNJLY2I.mjs.map +0 -1
  50. package/dist/chunk-YPBKY4KY.mjs +0 -1
  51. package/dist/chunk-YPBKY4KY.mjs.map +0 -1
  52. package/dist/express/AuthError.mjs +0 -11
  53. package/dist/express/AuthError.mjs.map +0 -1
  54. package/dist/express/CorrelationHandler.mjs +0 -7
  55. package/dist/express/CorrelationHandler.mjs.map +0 -1
  56. package/dist/express/ErrorHandler.mjs +0 -8
  57. package/dist/express/ErrorHandler.mjs.map +0 -1
  58. package/dist/express/ExpressProvider.mjs +0 -11
  59. package/dist/express/ExpressProvider.mjs.map +0 -1
  60. package/dist/express/NotFoundHandler.mjs +0 -7
  61. package/dist/express/NotFoundHandler.mjs.map +0 -1
  62. package/dist/express/RequestContextHandler.mjs +0 -7
  63. package/dist/express/RequestContextHandler.mjs.map +0 -1
  64. package/dist/express/SecurityHandler.mjs +0 -16
  65. package/dist/express/SecurityHandler.mjs.map +0 -1
  66. package/dist/express/index.mjs +0 -46
  67. package/dist/express/index.mjs.map +0 -1
  68. package/dist/index.js.map +0 -1
  69. package/dist/index.mjs +0 -51
  70. package/dist/index.mjs.map +0 -1
  71. package/dist/types/NamespaceContext.mjs +0 -7
  72. package/dist/types/NamespaceContext.mjs.map +0 -1
  73. package/dist/types/index.mjs +0 -8
  74. package/dist/types/index.mjs.map +0 -1
package/dist/index.js CHANGED
@@ -1,238 +1,9 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
-
30
- // src/index.ts
31
- var src_exports = {};
32
- __export(src_exports, {
33
- AuthError: () => AuthError,
34
- ExpressProvider: () => ExpressProvider,
35
- NamespaceContext: () => NamespaceContext,
36
- authError: () => authError,
37
- checkLabCoat: () => checkLabCoat,
38
- checkScope: () => checkScope,
39
- checkToken: () => checkToken,
40
- checkUseCase: () => checkUseCase,
41
- correlation: () => correlation,
42
- error: () => error,
43
- isAuthError: () => isAuthError,
44
- notFound: () => notFound,
45
- requestContext: () => requestContext,
46
- security: () => security,
47
- service: () => service
48
- });
49
- module.exports = __toCommonJS(src_exports);
50
-
51
- // src/express/AuthError.ts
52
- var import_easy = require("@thisisagile/easy");
53
- var AuthError = class extends Error {
54
- status;
55
- constructor({ name, status }) {
56
- super(name);
57
- this.name = "AuthenticationError";
58
- this.status = status;
59
- }
60
- };
61
- var authError = (status) => new AuthError(status);
62
- var isAuthError = (e) => (0, import_easy.isError)(e) && e.name === "AuthenticationError";
63
-
64
- // src/express/CorrelationHandler.ts
65
- var import_easy2 = require("@thisisagile/easy");
66
- var correlation = (req, res, next) => {
67
- res.setHeader(import_easy2.HttpHeader.Correlation, import_easy2.ctx.request.correlationId = req?.header(import_easy2.HttpHeader.Correlation) ?? (0, import_easy2.toUuid)());
68
- next();
69
- };
70
-
71
- // src/express/ErrorHandler.ts
72
- var import_easy3 = require("@thisisagile/easy");
73
- var import_easy_service = require("@thisisagile/easy-service");
74
- var toResponse = (status, errors = []) => ({
75
- status,
76
- body: import_easy3.rest.toError(status, errors)
77
- });
78
- var toBody = ({ origin, options }) => {
79
- return (0, import_easy3.choose)(origin).type(isAuthError, (ae) => toResponse((0, import_easy3.toHttpStatus)(ae.status), [(0, import_easy3.toResult)(ae.message)])).type(import_easy3.isDoesNotExist, (e) => toResponse(options?.onNotFound ?? import_easy3.HttpStatus.NotFound, [(0, import_easy3.toResult)(e.reason ?? e.message)])).type(import_easy3.isError, (e) => toResponse(import_easy3.HttpStatus.InternalServerError, [(0, import_easy3.toResult)(e.message)])).type(import_easy3.isResults, (r) => toResponse(options?.onError ?? import_easy3.HttpStatus.BadRequest, r.results)).type(import_easy3.isResponse, (r) => toResponse(import_easy3.HttpStatus.InternalServerError, r.body.error?.errors)).type(import_easy3.isException, (e) => toResponse(options?.onError ?? import_easy3.HttpStatus.BadRequest, [(0, import_easy3.toResult)(e.reason ?? e.message)])).type(import_easy3.isText, (t) => toResponse(options?.onError ?? import_easy3.HttpStatus.BadRequest, [(0, import_easy3.toResult)((0, import_easy3.asString)(t))])).else(() => toResponse(import_easy3.HttpStatus.InternalServerError, [(0, import_easy3.toResult)("Unknown error")]));
80
- };
81
- var error = (e, req, res, _next) => {
82
- let response;
83
- (0, import_easy3.tryTo)(() => (0, import_easy_service.toOriginatedError)(e)).map((oe) => toBody(oe)).accept((r) => response = r).accept((r) => import_easy3.ctx.request.lastError = r.status.isServerError ? r.body.error?.errors[0]?.message : void 0).accept((r) => import_easy3.ctx.request.lastErrorStack = r.status.isServerError ? e.stack : void 0).recover(() => response).accept((r) => res.status(r.status.status).json(r.body));
84
- };
85
-
86
- // src/express/ExpressProvider.ts
87
- var import_express = __toESM(require("express"));
88
-
89
- // src/express/SecurityHandler.ts
90
- var import_passport = __toESM(require("passport"));
91
- var import_passport_jwt = require("passport-jwt");
92
- var import_easy4 = require("@thisisagile/easy");
93
- var checkLabCoat = () => (req, res, next) => next((0, import_easy4.ifFalse)([import_easy4.Environment.Dev, import_easy4.Environment.Tst, import_easy4.Environment.Acc].some((e) => e.equals(import_easy4.ctx.env.name)), authError(import_easy4.HttpStatus.Forbidden)));
94
- var checkToken = () => import_passport.default.authenticate("jwt", { session: false, failWithError: true });
95
- var checkScope = (scope) => (req, res, next) => next((0, import_easy4.ifFalse)(req.user?.scopes?.includes(scope.id), authError(import_easy4.HttpStatus.Forbidden)));
96
- var checkUseCase = (uc) => (req, res, next) => next((0, import_easy4.ifFalse)(req.user?.usecases?.includes(uc.id), authError(import_easy4.HttpStatus.Forbidden)));
97
- var wrapSecretOrKeyProvider = (p) => p ? (request, rawJwtToken, done) => p(request, rawJwtToken).then((t) => done(null, t)).catch((e) => done(e)) : void 0;
98
- var security = ({ jwtStrategyOptions } = {}) => {
99
- jwtStrategyOptions ??= {};
100
- if ("secretOrKeyProvider" in jwtStrategyOptions)
101
- jwtStrategyOptions.secretOrKeyProvider = wrapSecretOrKeyProvider(jwtStrategyOptions.secretOrKeyProvider);
102
- else if (!("secretOrKey" in jwtStrategyOptions))
103
- jwtStrategyOptions.secretOrKey = import_easy4.ctx.env.get("tokenPublicKey");
104
- const strategy = new import_passport_jwt.Strategy(
105
- {
106
- jwtFromRequest: import_passport_jwt.ExtractJwt.fromAuthHeaderAsBearerToken(),
107
- passReqToCallback: true,
108
- ...jwtStrategyOptions
109
- },
110
- (req, payload, done) => {
111
- import_easy4.ctx.request.token = payload;
112
- import_easy4.ctx.request.jwt = import_passport_jwt.ExtractJwt.fromAuthHeaderAsBearerToken()(req) ?? "";
113
- done(null, payload);
114
- }
115
- );
116
- import_passport.default.use(strategy);
117
- return import_passport.default.initialize();
118
- };
119
-
120
- // src/express/ExpressProvider.ts
121
- var import_easy5 = require("@thisisagile/easy");
122
- var import_easy_service2 = require("@thisisagile/easy-service");
123
- var ExpressProvider = class {
124
- constructor(app = (0, import_express.default)()) {
125
- this.app = app;
126
- this.app.set("trust proxy", ["loopback", "linklocal", "uniquelocal"]);
127
- }
128
- use = (handler) => {
129
- this.app.use(handler);
130
- };
131
- route = (service2, resource) => {
132
- const { route, endpoints, middleware } = (0, import_easy_service2.routes)(resource);
133
- const router = import_express.default.Router({ mergeParams: true });
134
- if (!(0, import_easy5.isEmpty)(middleware))
135
- router.all(route.route(service2.name), middleware);
136
- endpoints.forEach(({ endpoint, verb, requires, middleware: middleware2 }) => {
137
- console.log(verb.verb.code, route.route(service2.name));
138
- router[verb.verb.toString()](
139
- route.route(service2.name),
140
- ...this.addSecurityMiddleware(requires),
141
- ...middleware2,
142
- this.handle(endpoint, verb.options, requires)
143
- );
144
- });
145
- this.app.use(router);
146
- };
147
- listen = (port, message = `Service is listening on port ${port}.`) => {
148
- this.app.listen(port, () => {
149
- console.log(message);
150
- });
151
- };
152
- addSecurityMiddleware(requires) {
153
- const middleware = [];
154
- if (requires.labCoat)
155
- middleware.push(checkLabCoat());
156
- if (requires.token)
157
- middleware.push(checkToken());
158
- if (requires.scope)
159
- middleware.push(checkScope(requires.scope));
160
- if (requires.uc)
161
- middleware.push(checkUseCase(requires.uc));
162
- return middleware;
163
- }
164
- handle = (endpoint, options, requires) => (req, res, next) => endpoint((0, import_easy5.toReq)(req)).then((r) => this.toResponse(res, r, (0, import_easy_service2.toVerbOptions)(options))).catch((error2) => next((0, import_easy_service2.toOriginatedError)(error2, options)));
165
- toResponse(res, result, options) {
166
- res.status(options.onOk.status);
167
- res.type(options.type.code);
168
- if (options.cache.enabled)
169
- res.setHeader(options.cache.name, options.cache.value());
170
- (this[options.type.name] ?? this.json)(res, result, options);
171
- }
172
- // Handling responses depending on content type
173
- json(res, result, options) {
174
- if (import_easy5.HttpStatus.NoContent.equals(options.onOk)) {
175
- res.send();
176
- } else {
177
- res.json(import_easy5.rest.toData(options.onOk, (0, import_easy5.toList)(result), result?.total, result?.meta));
178
- }
179
- }
180
- rawJson(res, result, options) {
181
- if (import_easy5.HttpStatus.NoContent.equals(options.onOk)) {
182
- res.send();
183
- } else {
184
- res.json(result);
185
- }
186
- }
187
- stream(res, result) {
188
- res.end(result);
189
- }
190
- text(res, data) {
191
- res.send(data);
192
- }
193
- };
194
- var service = (name) => new import_easy_service2.Service(name, new ExpressProvider());
195
-
196
- // src/express/NotFoundHandler.ts
197
- var import_easy6 = require("@thisisagile/easy");
198
- var import_easy_service3 = require("@thisisagile/easy-service");
199
- var notFound = (req, res, next) => {
200
- next((0, import_easy_service3.toOriginatedError)(import_easy6.Exception.DoesNotExist));
201
- };
202
-
203
- // src/express/RequestContextHandler.ts
204
- var import_easy7 = require("@thisisagile/easy");
205
- var requestContext = (req, res, next) => import_easy7.ctx.request.create(() => next());
206
-
207
- // src/types/NamespaceContext.ts
208
- var import_cls_hooked = require("cls-hooked");
209
- var import_easy8 = require("@thisisagile/easy");
210
- var NamespaceContext = class extends import_easy8.BaseRequestContext {
211
- namespace = (0, import_cls_hooked.createNamespace)("context");
212
- get(key) {
213
- return this.namespace.get(key);
214
- }
215
- set(key, value) {
216
- return this.namespace.set(key, value);
217
- }
218
- create = (f) => this.namespace.run(f);
219
- };
220
- // Annotate the CommonJS export names for ESM import in node:
221
- 0 && (module.exports = {
222
- AuthError,
223
- ExpressProvider,
224
- NamespaceContext,
225
- authError,
226
- checkLabCoat,
227
- checkScope,
228
- checkToken,
229
- checkUseCase,
230
- correlation,
231
- error,
232
- isAuthError,
233
- notFound,
234
- requestContext,
235
- security,
236
- service
237
- });
238
- //# sourceMappingURL=index.js.map
1
+ import { AuthError, authError, isAuthError } from "./express/AuthError.js";
2
+ import { correlation } from "./express/CorrelationHandler.js";
3
+ import { error } from "./express/ErrorHandler.js";
4
+ import { checkLabCoat, checkScope, checkToken, checkUseCase, security } from "./express/SecurityHandler.js";
5
+ import { ExpressProvider, service } from "./express/ExpressProvider.js";
6
+ import { notFound } from "./express/NotFoundHandler.js";
7
+ import { requestContext } from "./express/RequestContextHandler.js";
8
+ import { NamespaceContext } from "./types/NamespaceContext.js";
9
+ export { AuthError, ExpressProvider, NamespaceContext, authError, checkLabCoat, checkScope, checkToken, checkUseCase, correlation, error, isAuthError, notFound, requestContext, security, service };
@@ -1,7 +1,10 @@
1
- import { BaseRequestContext } from '@thisisagile/easy';
1
+ import { BaseRequestContext } from "@thisisagile/easy";
2
+ //#region src/types/NamespaceContext.d.ts
2
3
  export declare class NamespaceContext extends BaseRequestContext {
3
- protected readonly namespace: import("cls-hooked").Namespace<Record<string, any>>;
4
- get<T>(key: string): T;
5
- set<T>(key: string, value: T): T;
6
- readonly create: (f: () => void) => void;
4
+ protected readonly namespace: import("cls-hooked").Namespace<Record<string, any>>;
5
+ get<T>(key: string): T;
6
+ set<T>(key: string, value: T): T;
7
+ readonly create: (f: () => void) => void;
7
8
  }
9
+ //#endregion
10
+ //# sourceMappingURL=NamespaceContext.d.ts.map
@@ -0,0 +1,17 @@
1
+ import { BaseRequestContext } from "@thisisagile/easy";
2
+ import { createNamespace } from "cls-hooked";
3
+ //#region src/types/NamespaceContext.ts
4
+ var NamespaceContext = class extends BaseRequestContext {
5
+ namespace = createNamespace("context");
6
+ get(key) {
7
+ return this.namespace.get(key);
8
+ }
9
+ set(key, value) {
10
+ return this.namespace.set(key, value);
11
+ }
12
+ create = (f) => this.namespace.run(f);
13
+ };
14
+ //#endregion
15
+ export { NamespaceContext };
16
+
17
+ //# sourceMappingURL=NamespaceContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NamespaceContext.js","names":[],"sources":["../../src/types/NamespaceContext.ts"],"sourcesContent":["import { createNamespace } from 'cls-hooked';\nimport { BaseRequestContext } from '@thisisagile/easy';\n\nexport class NamespaceContext extends BaseRequestContext {\n protected readonly namespace = createNamespace('context');\n\n public get<T>(key: string): T {\n return this.namespace.get(key) as T;\n }\n\n public set<T>(key: string, value: T): T {\n return this.namespace.set(key, value);\n }\n\n public readonly create = (f: () => void): void => this.namespace.run(f);\n}\n"],"mappings":";;;AAGA,IAAa,mBAAb,cAAsC,mBAAmB;CACvD,YAA+B,gBAAgB,SAAS;CAExD,IAAc,KAAgB;EAC5B,OAAO,KAAK,UAAU,IAAI,GAAG;CAC/B;CAEA,IAAc,KAAa,OAAa;EACtC,OAAO,KAAK,UAAU,IAAI,KAAK,KAAK;CACtC;CAEA,UAA0B,MAAwB,KAAK,UAAU,IAAI,CAAC;AACxE"}
@@ -1 +1,2 @@
1
- export * from './NamespaceContext';
1
+ import { NamespaceContext } from "./NamespaceContext.js";
2
+ export { NamespaceContext };
@@ -0,0 +1 @@
1
+ export { NamespaceContext } from "./NamespaceContext.js";
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "@thisisagile/easy-express",
3
- "version": "19.1.4",
3
+ "version": "20.0.0",
4
4
  "description": "Straightforward library for building domain-driven microservice architectures",
5
5
  "author": "Sander Hoogendoorn",
6
6
  "license": "MIT",
7
+ "type": "module",
7
8
  "main": "dist/index.js",
8
- "module": "dist/index.mjs",
9
+ "module": "dist/index.js",
9
10
  "types": "dist/index.d.ts",
10
11
  "repository": {
11
12
  "type": "git",
@@ -20,8 +21,7 @@
20
21
  "scripts": {
21
22
  "lint": "yarn g:eslint . --ext .js,.jsx,.ts,.tsx --fix",
22
23
  "format": "yarn g:prettier --check --write src test *.json",
23
- "build": "yarn build:tsup",
24
- "build:tsup": "yarn g:tsup && yarn g:tsc --emitDeclarationOnly --declaration",
24
+ "build": "yarn g:tsdown && yarn g:exports",
25
25
  "test": "yarn g:jest --coverage",
26
26
  "prepack": "yarn g:copy-readme"
27
27
  },
@@ -33,6 +33,9 @@
33
33
  "publishConfig": {
34
34
  "access": "public"
35
35
  },
36
+ "engines": {
37
+ "node": ">=20.19.0"
38
+ },
36
39
  "devDependencies": {
37
40
  "@thisisagile/easy-test": "*",
38
41
  "@types/cls-hooked": "^4.3.9",
@@ -44,8 +47,8 @@
44
47
  "@types/validator": "^13.12.2"
45
48
  },
46
49
  "dependencies": {
47
- "@thisisagile/easy": "^19.1.4",
48
- "@thisisagile/easy-service": "^19.1.4",
50
+ "@thisisagile/easy": "^20.0.0",
51
+ "@thisisagile/easy-service": "^20.0.0",
49
52
  "@types/express": "^4.17.21",
50
53
  "cls-hooked": "^4.2.2",
51
54
  "express": "^4.22.3",
@@ -57,48 +60,47 @@
57
60
  "exports": {
58
61
  ".": {
59
62
  "types": "./dist/index.d.ts",
60
- "import": "./dist/index.mjs",
61
- "require": "./dist/index.js"
63
+ "default": "./dist/index.js"
62
64
  },
63
65
  "./express/AuthError": {
64
66
  "types": "./dist/express/AuthError.d.ts",
65
- "import": "./dist/express/AuthError.mjs"
67
+ "default": "./dist/express/AuthError.js"
66
68
  },
67
69
  "./express/CorrelationHandler": {
68
70
  "types": "./dist/express/CorrelationHandler.d.ts",
69
- "import": "./dist/express/CorrelationHandler.mjs"
71
+ "default": "./dist/express/CorrelationHandler.js"
70
72
  },
71
73
  "./express/ErrorHandler": {
72
74
  "types": "./dist/express/ErrorHandler.d.ts",
73
- "import": "./dist/express/ErrorHandler.mjs"
75
+ "default": "./dist/express/ErrorHandler.js"
74
76
  },
75
77
  "./express/ExpressProvider": {
76
78
  "types": "./dist/express/ExpressProvider.d.ts",
77
- "import": "./dist/express/ExpressProvider.mjs"
79
+ "default": "./dist/express/ExpressProvider.js"
78
80
  },
79
81
  "./express/NotFoundHandler": {
80
82
  "types": "./dist/express/NotFoundHandler.d.ts",
81
- "import": "./dist/express/NotFoundHandler.mjs"
83
+ "default": "./dist/express/NotFoundHandler.js"
82
84
  },
83
85
  "./express/RequestContextHandler": {
84
86
  "types": "./dist/express/RequestContextHandler.d.ts",
85
- "import": "./dist/express/RequestContextHandler.mjs"
87
+ "default": "./dist/express/RequestContextHandler.js"
86
88
  },
87
89
  "./express/SecurityHandler": {
88
90
  "types": "./dist/express/SecurityHandler.d.ts",
89
- "import": "./dist/express/SecurityHandler.mjs"
91
+ "default": "./dist/express/SecurityHandler.js"
90
92
  },
91
93
  "./express/index": {
92
94
  "types": "./dist/express/index.d.ts",
93
- "import": "./dist/express/index.mjs"
95
+ "default": "./dist/express/index.js"
94
96
  },
95
97
  "./types/NamespaceContext": {
96
98
  "types": "./dist/types/NamespaceContext.d.ts",
97
- "import": "./dist/types/NamespaceContext.mjs"
99
+ "default": "./dist/types/NamespaceContext.js"
98
100
  },
99
101
  "./types/index": {
100
102
  "types": "./dist/types/index.d.ts",
101
- "import": "./dist/types/index.mjs"
103
+ "default": "./dist/types/index.js"
102
104
  },
103
105
  "./src/*": "./src/*",
104
106
  "./dist/*": "./dist/*",
@@ -1,11 +0,0 @@
1
- // src/express/NotFoundHandler.ts
2
- import { Exception } from "@thisisagile/easy";
3
- import { toOriginatedError } from "@thisisagile/easy-service";
4
- var notFound = (req, res, next) => {
5
- next(toOriginatedError(Exception.DoesNotExist));
6
- };
7
-
8
- export {
9
- notFound
10
- };
11
- //# sourceMappingURL=chunk-33OQAPCM.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/express/NotFoundHandler.ts"],"sourcesContent":["import { NextFunction, Request, Response } from 'express';\nimport { Exception } from '@thisisagile/easy';\nimport { toOriginatedError } from '@thisisagile/easy-service';\n\nexport const notFound = (req: Request, res: Response, next: NextFunction): void => {\n next(toOriginatedError(Exception.DoesNotExist));\n};\n"],"mappings":";AACA,SAAS,iBAAiB;AAC1B,SAAS,yBAAyB;AAE3B,IAAM,WAAW,CAAC,KAAc,KAAe,SAA6B;AACjF,OAAK,kBAAkB,UAAU,YAAY,CAAC;AAChD;","names":[]}
@@ -1 +0,0 @@
1
- //# sourceMappingURL=chunk-6TBWUXPT.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,8 +0,0 @@
1
- // src/express/RequestContextHandler.ts
2
- import { ctx } from "@thisisagile/easy";
3
- var requestContext = (req, res, next) => ctx.request.create(() => next());
4
-
5
- export {
6
- requestContext
7
- };
8
- //# sourceMappingURL=chunk-C7NPSRIT.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/express/RequestContextHandler.ts"],"sourcesContent":["import express from 'express';\nimport { ctx } from '@thisisagile/easy';\n\nexport const requestContext = (req: express.Request, res: express.Response, next: express.NextFunction): void => ctx.request.create(() => next());\n"],"mappings":";AACA,SAAS,WAAW;AAEb,IAAM,iBAAiB,CAAC,KAAsB,KAAuB,SAAqC,IAAI,QAAQ,OAAO,MAAM,KAAK,CAAC;","names":[]}
@@ -1,94 +0,0 @@
1
- import {
2
- checkLabCoat,
3
- checkScope,
4
- checkToken,
5
- checkUseCase
6
- } from "./chunk-T4G4HIZT.mjs";
7
-
8
- // src/express/ExpressProvider.ts
9
- import express from "express";
10
- import { HttpStatus, isEmpty, rest, toList, toReq } from "@thisisagile/easy";
11
- import {
12
- routes,
13
- Service,
14
- toOriginatedError,
15
- toVerbOptions
16
- } from "@thisisagile/easy-service";
17
- var ExpressProvider = class {
18
- constructor(app = express()) {
19
- this.app = app;
20
- this.app.set("trust proxy", ["loopback", "linklocal", "uniquelocal"]);
21
- }
22
- use = (handler) => {
23
- this.app.use(handler);
24
- };
25
- route = (service2, resource) => {
26
- const { route, endpoints, middleware } = routes(resource);
27
- const router = express.Router({ mergeParams: true });
28
- if (!isEmpty(middleware))
29
- router.all(route.route(service2.name), middleware);
30
- endpoints.forEach(({ endpoint, verb, requires, middleware: middleware2 }) => {
31
- console.log(verb.verb.code, route.route(service2.name));
32
- router[verb.verb.toString()](
33
- route.route(service2.name),
34
- ...this.addSecurityMiddleware(requires),
35
- ...middleware2,
36
- this.handle(endpoint, verb.options, requires)
37
- );
38
- });
39
- this.app.use(router);
40
- };
41
- listen = (port, message = `Service is listening on port ${port}.`) => {
42
- this.app.listen(port, () => {
43
- console.log(message);
44
- });
45
- };
46
- addSecurityMiddleware(requires) {
47
- const middleware = [];
48
- if (requires.labCoat)
49
- middleware.push(checkLabCoat());
50
- if (requires.token)
51
- middleware.push(checkToken());
52
- if (requires.scope)
53
- middleware.push(checkScope(requires.scope));
54
- if (requires.uc)
55
- middleware.push(checkUseCase(requires.uc));
56
- return middleware;
57
- }
58
- handle = (endpoint, options, requires) => (req, res, next) => endpoint(toReq(req)).then((r) => this.toResponse(res, r, toVerbOptions(options))).catch((error) => next(toOriginatedError(error, options)));
59
- toResponse(res, result, options) {
60
- res.status(options.onOk.status);
61
- res.type(options.type.code);
62
- if (options.cache.enabled)
63
- res.setHeader(options.cache.name, options.cache.value());
64
- (this[options.type.name] ?? this.json)(res, result, options);
65
- }
66
- // Handling responses depending on content type
67
- json(res, result, options) {
68
- if (HttpStatus.NoContent.equals(options.onOk)) {
69
- res.send();
70
- } else {
71
- res.json(rest.toData(options.onOk, toList(result), result?.total, result?.meta));
72
- }
73
- }
74
- rawJson(res, result, options) {
75
- if (HttpStatus.NoContent.equals(options.onOk)) {
76
- res.send();
77
- } else {
78
- res.json(result);
79
- }
80
- }
81
- stream(res, result) {
82
- res.end(result);
83
- }
84
- text(res, data) {
85
- res.send(data);
86
- }
87
- };
88
- var service = (name) => new Service(name, new ExpressProvider());
89
-
90
- export {
91
- ExpressProvider,
92
- service
93
- };
94
- //# sourceMappingURL=chunk-GEFXEGJW.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/express/ExpressProvider.ts"],"sourcesContent":["import express, { Express, NextFunction, Request, RequestHandler, Response } from 'express';\nimport { checkLabCoat, checkScope, checkToken, checkUseCase } from './SecurityHandler';\nimport { HttpStatus, isEmpty, PageList, rest, toList, toReq } from '@thisisagile/easy';\nimport {\n AppProvider,\n Endpoint,\n Handler,\n Resource,\n Route,\n RouteRequires,\n routes,\n Service,\n toOriginatedError,\n toVerbOptions,\n VerbOptions,\n} from '@thisisagile/easy-service';\n\nexport type ExpressVerb = 'get' | 'post' | 'put' | 'patch' | 'delete';\n\nexport class ExpressProvider implements AppProvider {\n constructor(protected app: Express = express()) {\n this.app.set('trust proxy', ['loopback', 'linklocal', 'uniquelocal']);\n }\n\n use = (handler: Handler): void => {\n this.app.use(handler);\n };\n\n route = (service: Service, resource: Resource): void => {\n const { route, endpoints, middleware } = routes(resource);\n const router = express.Router({ mergeParams: true });\n if (!isEmpty(middleware)) router.all(route.route(service.name), middleware);\n\n endpoints.forEach(({ endpoint, verb, requires, middleware }: Route) => {\n console.log(verb.verb.code, route.route(service.name));\n router[verb.verb.toString() as ExpressVerb](\n route.route(service.name),\n ...this.addSecurityMiddleware(requires),\n ...middleware,\n this.handle(endpoint, verb.options, requires)\n );\n });\n\n this.app.use(router);\n };\n\n listen = (port: number, message = `Service is listening on port ${port}.`): void => {\n this.app.listen(port, () => {\n console.log(message);\n });\n };\n\n protected addSecurityMiddleware(requires: RouteRequires): RequestHandler[] {\n const middleware: RequestHandler[] = [];\n if (requires.labCoat) middleware.push(checkLabCoat());\n if (requires.token) middleware.push(checkToken());\n if (requires.scope) middleware.push(checkScope(requires.scope));\n if (requires.uc) middleware.push(checkUseCase(requires.uc));\n return middleware;\n }\n\n protected handle =\n (endpoint: Endpoint, options?: VerbOptions, requires?: RouteRequires): RequestHandler =>\n (req: Request, res: Response, next: NextFunction) =>\n endpoint(toReq(req))\n .then((r: any) => this.toResponse(res, r, toVerbOptions(options)))\n .catch(error => next(toOriginatedError(error, options)));\n\n protected toResponse(res: Response, result: unknown, options: Required<VerbOptions>): void {\n res.status(options.onOk.status);\n res.type(options.type.code);\n if (options.cache.enabled) res.setHeader(options.cache.name, options.cache.value());\n\n ((this as any)[options.type.name] ?? this.json)(res, result, options);\n }\n\n // Handling responses depending on content type\n\n protected json(res: Response, result: unknown, options: Required<VerbOptions>): void {\n if (HttpStatus.NoContent.equals(options.onOk)) {\n res.send();\n } else {\n res.json(rest.toData(options.onOk, toList<any>(result), (result as PageList<any>)?.total, (result as PageList<any>)?.meta));\n }\n }\n\n protected rawJson(res: Response, result: unknown, options: Required<VerbOptions>): void {\n if (HttpStatus.NoContent.equals(options.onOk)) {\n res.send();\n } else {\n res.json(result);\n }\n }\n\n protected stream(res: Response, result: unknown): void {\n res.end(result);\n }\n\n protected text(res: Response, data: unknown): void {\n res.send(data);\n }\n}\n\nexport const service = (name: string): Service => new Service(name, new ExpressProvider());\n"],"mappings":"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","names":["service","middleware"]}
@@ -1,38 +0,0 @@
1
- import {
2
- isAuthError
3
- } from "./chunk-RL5ICAHT.mjs";
4
-
5
- // src/express/ErrorHandler.ts
6
- import {
7
- asString,
8
- choose,
9
- ctx,
10
- HttpStatus,
11
- isDoesNotExist,
12
- isError,
13
- isException,
14
- isResponse,
15
- isResults,
16
- isText,
17
- rest,
18
- toHttpStatus,
19
- toResult,
20
- tryTo
21
- } from "@thisisagile/easy";
22
- import { toOriginatedError } from "@thisisagile/easy-service";
23
- var toResponse = (status, errors = []) => ({
24
- status,
25
- body: rest.toError(status, errors)
26
- });
27
- var toBody = ({ origin, options }) => {
28
- return choose(origin).type(isAuthError, (ae) => toResponse(toHttpStatus(ae.status), [toResult(ae.message)])).type(isDoesNotExist, (e) => toResponse(options?.onNotFound ?? HttpStatus.NotFound, [toResult(e.reason ?? e.message)])).type(isError, (e) => toResponse(HttpStatus.InternalServerError, [toResult(e.message)])).type(isResults, (r) => toResponse(options?.onError ?? HttpStatus.BadRequest, r.results)).type(isResponse, (r) => toResponse(HttpStatus.InternalServerError, r.body.error?.errors)).type(isException, (e) => toResponse(options?.onError ?? HttpStatus.BadRequest, [toResult(e.reason ?? e.message)])).type(isText, (t) => toResponse(options?.onError ?? HttpStatus.BadRequest, [toResult(asString(t))])).else(() => toResponse(HttpStatus.InternalServerError, [toResult("Unknown error")]));
29
- };
30
- var error = (e, req, res, _next) => {
31
- let response;
32
- tryTo(() => toOriginatedError(e)).map((oe) => toBody(oe)).accept((r) => response = r).accept((r) => ctx.request.lastError = r.status.isServerError ? r.body.error?.errors[0]?.message : void 0).accept((r) => ctx.request.lastErrorStack = r.status.isServerError ? e.stack : void 0).recover(() => response).accept((r) => res.status(r.status.status).json(r.body));
33
- };
34
-
35
- export {
36
- error
37
- };
38
- //# sourceMappingURL=chunk-N2UP7WFM.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/express/ErrorHandler.ts"],"sourcesContent":["import express from 'express';\nimport { isAuthError } from './AuthError';\nimport {\n asString,\n choose,\n ctx,\n HttpStatus,\n isDoesNotExist,\n isError,\n isException,\n isResponse,\n isResults,\n isText,\n Response,\n rest,\n Result,\n toHttpStatus,\n toResult,\n tryTo,\n} from '@thisisagile/easy';\nimport { OriginatedError, toOriginatedError } from '@thisisagile/easy-service';\n\nconst toResponse = (status: HttpStatus, errors: Result[] = []): Response => ({\n status,\n body: rest.toError(status, errors),\n});\n\nconst toBody = ({ origin, options }: OriginatedError): Response => {\n return (\n choose(origin)\n .type(isAuthError, ae => toResponse(toHttpStatus(ae.status), [toResult(ae.message)]))\n .type(isDoesNotExist, e => toResponse(options?.onNotFound ?? HttpStatus.NotFound, [toResult(e.reason ?? e.message)]))\n // This service breaks with an error\n .type(isError, e => toResponse(HttpStatus.InternalServerError, [toResult(e.message)]))\n // This service fails\n .type(isResults, r => toResponse(options?.onError ?? HttpStatus.BadRequest, r.results))\n // Underlying service fails\n .type(isResponse, r => toResponse(HttpStatus.InternalServerError, r.body.error?.errors))\n .type(isException, e => toResponse(options?.onError ?? HttpStatus.BadRequest, [toResult(e.reason ?? e.message)]))\n // This service fails with a string\n .type(isText, t => toResponse(options?.onError ?? HttpStatus.BadRequest, [toResult(asString(t))]))\n .else(() => toResponse(HttpStatus.InternalServerError, [toResult('Unknown error')]))\n );\n};\n\nexport const error = (e: Error, req: express.Request, res: express.Response, _next: express.NextFunction): void => {\n let response: Response;\n tryTo(() => toOriginatedError(e))\n .map(oe => toBody(oe))\n .accept(r => (response = r))\n .accept(r => (ctx.request.lastError = r.status.isServerError ? r.body.error?.errors[0]?.message : undefined))\n .accept(r => (ctx.request.lastErrorStack = r.status.isServerError ? e.stack : undefined))\n .recover(() => response)\n .accept(r => res.status(r.status.status).json(r.body));\n};\n"],"mappings":";;;;;AAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAA0B,yBAAyB;AAEnD,IAAM,aAAa,CAAC,QAAoB,SAAmB,CAAC,OAAiB;AAAA,EAC3E;AAAA,EACA,MAAM,KAAK,QAAQ,QAAQ,MAAM;AACnC;AAEA,IAAM,SAAS,CAAC,EAAE,QAAQ,QAAQ,MAAiC;AACjE,SACE,OAAO,MAAM,EACV,KAAK,aAAa,QAAM,WAAW,aAAa,GAAG,MAAM,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,EACnF,KAAK,gBAAgB,OAAK,WAAW,SAAS,cAAc,WAAW,UAAU,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,EAEnH,KAAK,SAAS,OAAK,WAAW,WAAW,qBAAqB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,EAEpF,KAAK,WAAW,OAAK,WAAW,SAAS,WAAW,WAAW,YAAY,EAAE,OAAO,CAAC,EAErF,KAAK,YAAY,OAAK,WAAW,WAAW,qBAAqB,EAAE,KAAK,OAAO,MAAM,CAAC,EACtF,KAAK,aAAa,OAAK,WAAW,SAAS,WAAW,WAAW,YAAY,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,EAE/G,KAAK,QAAQ,OAAK,WAAW,SAAS,WAAW,WAAW,YAAY,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAChG,KAAK,MAAM,WAAW,WAAW,qBAAqB,CAAC,SAAS,eAAe,CAAC,CAAC,CAAC;AAEzF;AAEO,IAAM,QAAQ,CAAC,GAAU,KAAsB,KAAuB,UAAsC;AACjH,MAAI;AACJ,QAAM,MAAM,kBAAkB,CAAC,CAAC,EAC7B,IAAI,QAAM,OAAO,EAAE,CAAC,EACpB,OAAO,OAAM,WAAW,CAAE,EAC1B,OAAO,OAAM,IAAI,QAAQ,YAAY,EAAE,OAAO,gBAAgB,EAAE,KAAK,OAAO,OAAO,CAAC,GAAG,UAAU,MAAU,EAC3G,OAAO,OAAM,IAAI,QAAQ,iBAAiB,EAAE,OAAO,gBAAgB,EAAE,QAAQ,MAAU,EACvF,QAAQ,MAAM,QAAQ,EACtB,OAAO,OAAK,IAAI,OAAO,EAAE,OAAO,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC;AACzD;","names":[]}
@@ -1,19 +0,0 @@
1
- // src/express/AuthError.ts
2
- import { isError } from "@thisisagile/easy";
3
- var AuthError = class extends Error {
4
- status;
5
- constructor({ name, status }) {
6
- super(name);
7
- this.name = "AuthenticationError";
8
- this.status = status;
9
- }
10
- };
11
- var authError = (status) => new AuthError(status);
12
- var isAuthError = (e) => isError(e) && e.name === "AuthenticationError";
13
-
14
- export {
15
- AuthError,
16
- authError,
17
- isAuthError
18
- };
19
- //# sourceMappingURL=chunk-RL5ICAHT.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/express/AuthError.ts"],"sourcesContent":["import { HttpStatus, isError } from '@thisisagile/easy';\n\nexport class AuthError extends Error {\n status: number;\n\n constructor({ name, status }: HttpStatus) {\n super(name);\n this.name = 'AuthenticationError';\n this.status = status;\n }\n}\n\nexport const authError = (status: HttpStatus): AuthError => new AuthError(status);\n\nexport const isAuthError = (e?: unknown): e is AuthError => isError(e) && e.name === 'AuthenticationError';\n"],"mappings":";AAAA,SAAqB,eAAe;AAE7B,IAAM,YAAN,cAAwB,MAAM;AAAA,EACnC;AAAA,EAEA,YAAY,EAAE,MAAM,OAAO,GAAe;AACxC,UAAM,IAAI;AACV,SAAK,OAAO;AACZ,SAAK,SAAS;AAAA,EAChB;AACF;AAEO,IAAM,YAAY,CAAC,WAAkC,IAAI,UAAU,MAAM;AAEzE,IAAM,cAAc,CAAC,MAAgC,QAAQ,CAAC,KAAK,EAAE,SAAS;","names":[]}