@thisisagile/easy-express 18.17.0 → 19.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 (35) hide show
  1. package/dist/chunk-33OQAPCM.mjs +11 -0
  2. package/dist/chunk-33OQAPCM.mjs.map +1 -0
  3. package/dist/chunk-6TBWUXPT.mjs +1 -0
  4. package/dist/chunk-6TBWUXPT.mjs.map +1 -0
  5. package/dist/chunk-C7NPSRIT.mjs +8 -0
  6. package/dist/chunk-C7NPSRIT.mjs.map +1 -0
  7. package/dist/chunk-GEFXEGJW.mjs +94 -0
  8. package/dist/chunk-GEFXEGJW.mjs.map +1 -0
  9. package/dist/chunk-N2UP7WFM.mjs +38 -0
  10. package/dist/chunk-N2UP7WFM.mjs.map +1 -0
  11. package/dist/chunk-U2UXWL6X.mjs +18 -0
  12. package/dist/chunk-U2UXWL6X.mjs.map +1 -0
  13. package/dist/chunk-UQNJLY2I.mjs +11 -0
  14. package/dist/chunk-UQNJLY2I.mjs.map +1 -0
  15. package/dist/chunk-YPBKY4KY.mjs +1 -0
  16. package/dist/chunk-YPBKY4KY.mjs.map +1 -0
  17. package/dist/express/CorrelationHandler.mjs +3 -6
  18. package/dist/express/CorrelationHandler.mjs.map +1 -1
  19. package/dist/express/ErrorHandler.mjs +3 -32
  20. package/dist/express/ErrorHandler.mjs.map +1 -1
  21. package/dist/express/ExpressProvider.mjs +4 -87
  22. package/dist/express/ExpressProvider.mjs.map +1 -1
  23. package/dist/express/NotFoundHandler.mjs +3 -6
  24. package/dist/express/NotFoundHandler.mjs.map +1 -1
  25. package/dist/express/RequestContextHandler.mjs +3 -3
  26. package/dist/express/RequestContextHandler.mjs.map +1 -1
  27. package/dist/express/index.mjs +45 -7
  28. package/dist/express/index.mjs.map +1 -1
  29. package/dist/index.mjs +50 -2
  30. package/dist/index.mjs.map +1 -1
  31. package/dist/types/NamespaceContext.mjs +3 -13
  32. package/dist/types/NamespaceContext.mjs.map +1 -1
  33. package/dist/types/index.mjs +7 -1
  34. package/dist/types/index.mjs.map +1 -1
  35. package/package.json +55 -5
@@ -0,0 +1,11 @@
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
@@ -0,0 +1 @@
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":[]}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-6TBWUXPT.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,8 @@
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
@@ -0,0 +1 @@
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":[]}
@@ -0,0 +1,94 @@
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
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,38 @@
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
@@ -0,0 +1 @@
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":[]}
@@ -0,0 +1,18 @@
1
+ // src/types/NamespaceContext.ts
2
+ import { createNamespace } from "cls-hooked";
3
+ import { BaseRequestContext } from "@thisisagile/easy";
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
+
15
+ export {
16
+ NamespaceContext
17
+ };
18
+ //# sourceMappingURL=chunk-U2UXWL6X.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"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":";AAAA,SAAS,uBAAuB;AAChC,SAAS,0BAA0B;AAE5B,IAAM,mBAAN,cAA+B,mBAAmB;AAAA,EACpC,YAAY,gBAAgB,SAAS;AAAA,EAEjD,IAAO,KAAgB;AAC5B,WAAO,KAAK,UAAU,IAAI,GAAG;AAAA,EAC/B;AAAA,EAEO,IAAO,KAAa,OAAa;AACtC,WAAO,KAAK,UAAU,IAAI,KAAK,KAAK;AAAA,EACtC;AAAA,EAEgB,SAAS,CAAC,MAAwB,KAAK,UAAU,IAAI,CAAC;AACxE;","names":[]}
@@ -0,0 +1,11 @@
1
+ // src/express/CorrelationHandler.ts
2
+ import { ctx, HttpHeader, toUuid } from "@thisisagile/easy";
3
+ var correlation = (req, res, next) => {
4
+ res.setHeader(HttpHeader.Correlation, ctx.request.correlationId = req?.header(HttpHeader.Correlation) ?? toUuid());
5
+ next();
6
+ };
7
+
8
+ export {
9
+ correlation
10
+ };
11
+ //# sourceMappingURL=chunk-UQNJLY2I.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/express/CorrelationHandler.ts"],"sourcesContent":["import express from 'express';\nimport { ctx, HttpHeader, toUuid } from '@thisisagile/easy';\n\nexport const correlation = (req: express.Request, res: express.Response, next: express.NextFunction): void => {\n res.setHeader(HttpHeader.Correlation, (ctx.request.correlationId = req?.header(HttpHeader.Correlation) ?? toUuid()));\n next();\n};\n"],"mappings":";AACA,SAAS,KAAK,YAAY,cAAc;AAEjC,IAAM,cAAc,CAAC,KAAsB,KAAuB,SAAqC;AAC5G,MAAI,UAAU,WAAW,aAAc,IAAI,QAAQ,gBAAgB,KAAK,OAAO,WAAW,WAAW,KAAK,OAAO,CAAE;AACnH,OAAK;AACP;","names":[]}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-YPBKY4KY.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,9 +1,6 @@
1
- // src/express/CorrelationHandler.ts
2
- import { ctx, HttpHeader, toUuid } from "@thisisagile/easy";
3
- var correlation = (req, res, next) => {
4
- res.setHeader(HttpHeader.Correlation, ctx.request.correlationId = req?.header(HttpHeader.Correlation) ?? toUuid());
5
- next();
6
- };
1
+ import {
2
+ correlation
3
+ } from "../chunk-UQNJLY2I.mjs";
7
4
  export {
8
5
  correlation
9
6
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/express/CorrelationHandler.ts"],"sourcesContent":["import express from 'express';\nimport { ctx, HttpHeader, toUuid } from '@thisisagile/easy';\n\nexport const correlation = (req: express.Request, res: express.Response, next: express.NextFunction): void => {\n res.setHeader(HttpHeader.Correlation, (ctx.request.correlationId = req?.header(HttpHeader.Correlation) ?? toUuid()));\n next();\n};\n"],"mappings":";AACA,SAAS,KAAK,YAAY,cAAc;AAEjC,IAAM,cAAc,CAAC,KAAsB,KAAuB,SAAqC;AAC5G,MAAI,UAAU,WAAW,aAAc,IAAI,QAAQ,gBAAgB,KAAK,OAAO,WAAW,WAAW,KAAK,OAAO,CAAE;AACnH,OAAK;AACP;","names":[]}
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,36 +1,7 @@
1
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
- };
2
+ error
3
+ } from "../chunk-N2UP7WFM.mjs";
4
+ import "../chunk-RL5ICAHT.mjs";
34
5
  export {
35
6
  error
36
7
  };
@@ -1 +1 @@
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
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,92 +1,9 @@
1
1
  import {
2
- checkLabCoat,
3
- checkScope,
4
- checkToken,
5
- checkUseCase
6
- } from "../chunk-T4G4HIZT.mjs";
2
+ ExpressProvider,
3
+ service
4
+ } from "../chunk-GEFXEGJW.mjs";
5
+ import "../chunk-T4G4HIZT.mjs";
7
6
  import "../chunk-RL5ICAHT.mjs";
8
-
9
- // src/express/ExpressProvider.ts
10
- import express from "express";
11
- import { HttpStatus, isEmpty, rest, toList, toReq } from "@thisisagile/easy";
12
- import {
13
- routes,
14
- Service,
15
- toOriginatedError,
16
- toVerbOptions
17
- } from "@thisisagile/easy-service";
18
- var ExpressProvider = class {
19
- constructor(app = express()) {
20
- this.app = app;
21
- this.app.set("trust proxy", ["loopback", "linklocal", "uniquelocal"]);
22
- }
23
- use = (handler) => {
24
- this.app.use(handler);
25
- };
26
- route = (service2, resource) => {
27
- const { route, endpoints, middleware } = routes(resource);
28
- const router = express.Router({ mergeParams: true });
29
- if (!isEmpty(middleware))
30
- router.all(route.route(service2.name), middleware);
31
- endpoints.forEach(({ endpoint, verb, requires, middleware: middleware2 }) => {
32
- console.log(verb.verb.code, route.route(service2.name));
33
- router[verb.verb.toString()](
34
- route.route(service2.name),
35
- ...this.addSecurityMiddleware(requires),
36
- ...middleware2,
37
- this.handle(endpoint, verb.options, requires)
38
- );
39
- });
40
- this.app.use(router);
41
- };
42
- listen = (port, message = `Service is listening on port ${port}.`) => {
43
- this.app.listen(port, () => {
44
- console.log(message);
45
- });
46
- };
47
- addSecurityMiddleware(requires) {
48
- const middleware = [];
49
- if (requires.labCoat)
50
- middleware.push(checkLabCoat());
51
- if (requires.token)
52
- middleware.push(checkToken());
53
- if (requires.scope)
54
- middleware.push(checkScope(requires.scope));
55
- if (requires.uc)
56
- middleware.push(checkUseCase(requires.uc));
57
- return middleware;
58
- }
59
- handle = (endpoint, options, requires) => (req, res, next) => endpoint(toReq(req)).then((r) => this.toResponse(res, r, toVerbOptions(options))).catch((error) => next(toOriginatedError(error, options)));
60
- toResponse(res, result, options) {
61
- res.status(options.onOk.status);
62
- res.type(options.type.code);
63
- if (options.cache.enabled)
64
- res.setHeader(options.cache.name, options.cache.value());
65
- (this[options.type.name] ?? this.json)(res, result, options);
66
- }
67
- // Handling responses depending on content type
68
- json(res, result, options) {
69
- if (HttpStatus.NoContent.equals(options.onOk)) {
70
- res.send();
71
- } else {
72
- res.json(rest.toData(options.onOk, toList(result), result?.total, result?.meta));
73
- }
74
- }
75
- rawJson(res, result, options) {
76
- if (HttpStatus.NoContent.equals(options.onOk)) {
77
- res.send();
78
- } else {
79
- res.json(result);
80
- }
81
- }
82
- stream(res, result) {
83
- res.end(result);
84
- }
85
- text(res, data) {
86
- res.send(data);
87
- }
88
- };
89
- var service = (name) => new Service(name, new ExpressProvider());
90
7
  export {
91
8
  ExpressProvider,
92
9
  service
@@ -1 +1 @@
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
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,9 +1,6 @@
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
- };
1
+ import {
2
+ notFound
3
+ } from "../chunk-33OQAPCM.mjs";
7
4
  export {
8
5
  notFound
9
6
  };
@@ -1 +1 @@
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
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,6 +1,6 @@
1
- // src/express/RequestContextHandler.ts
2
- import { ctx } from "@thisisagile/easy";
3
- var requestContext = (req, res, next) => ctx.request.create(() => next());
1
+ import {
2
+ requestContext
3
+ } from "../chunk-C7NPSRIT.mjs";
4
4
  export {
5
5
  requestContext
6
6
  };
@@ -1 +1 @@
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
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,8 +1,46 @@
1
- export * from "./AuthError";
2
- export * from "./CorrelationHandler";
3
- export * from "./ErrorHandler";
4
- export * from "./ExpressProvider";
5
- export * from "./NotFoundHandler";
6
- export * from "./RequestContextHandler";
7
- export * from "./SecurityHandler";
1
+ import "../chunk-6TBWUXPT.mjs";
2
+ import {
3
+ correlation
4
+ } from "../chunk-UQNJLY2I.mjs";
5
+ import {
6
+ error
7
+ } from "../chunk-N2UP7WFM.mjs";
8
+ import {
9
+ ExpressProvider,
10
+ service
11
+ } from "../chunk-GEFXEGJW.mjs";
12
+ import {
13
+ notFound
14
+ } from "../chunk-33OQAPCM.mjs";
15
+ import {
16
+ requestContext
17
+ } from "../chunk-C7NPSRIT.mjs";
18
+ import {
19
+ checkLabCoat,
20
+ checkScope,
21
+ checkToken,
22
+ checkUseCase,
23
+ security
24
+ } from "../chunk-T4G4HIZT.mjs";
25
+ import {
26
+ AuthError,
27
+ authError,
28
+ isAuthError
29
+ } from "../chunk-RL5ICAHT.mjs";
30
+ export {
31
+ AuthError,
32
+ ExpressProvider,
33
+ authError,
34
+ checkLabCoat,
35
+ checkScope,
36
+ checkToken,
37
+ checkUseCase,
38
+ correlation,
39
+ error,
40
+ isAuthError,
41
+ notFound,
42
+ requestContext,
43
+ security,
44
+ service
45
+ };
8
46
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/express/index.ts"],"sourcesContent":["export * from './AuthError';\nexport * from './CorrelationHandler';\nexport * from './ErrorHandler';\nexport * from './ExpressProvider';\nexport * from './NotFoundHandler';\nexport * from './RequestContextHandler';\nexport * from './SecurityHandler';\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/dist/index.mjs CHANGED
@@ -1,3 +1,51 @@
1
- export * from "./express";
2
- export * from "./types";
1
+ import "./chunk-6TBWUXPT.mjs";
2
+ import "./chunk-YPBKY4KY.mjs";
3
+ import {
4
+ NamespaceContext
5
+ } from "./chunk-U2UXWL6X.mjs";
6
+ import {
7
+ correlation
8
+ } from "./chunk-UQNJLY2I.mjs";
9
+ import {
10
+ error
11
+ } from "./chunk-N2UP7WFM.mjs";
12
+ import {
13
+ ExpressProvider,
14
+ service
15
+ } from "./chunk-GEFXEGJW.mjs";
16
+ import {
17
+ notFound
18
+ } from "./chunk-33OQAPCM.mjs";
19
+ import {
20
+ requestContext
21
+ } from "./chunk-C7NPSRIT.mjs";
22
+ import {
23
+ checkLabCoat,
24
+ checkScope,
25
+ checkToken,
26
+ checkUseCase,
27
+ security
28
+ } from "./chunk-T4G4HIZT.mjs";
29
+ import {
30
+ AuthError,
31
+ authError,
32
+ isAuthError
33
+ } from "./chunk-RL5ICAHT.mjs";
34
+ export {
35
+ AuthError,
36
+ ExpressProvider,
37
+ NamespaceContext,
38
+ authError,
39
+ checkLabCoat,
40
+ checkScope,
41
+ checkToken,
42
+ checkUseCase,
43
+ correlation,
44
+ error,
45
+ isAuthError,
46
+ notFound,
47
+ requestContext,
48
+ security,
49
+ service
50
+ };
3
51
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './express';\nexport * from './types';\n"],"mappings":"AAAA,cAAc;AACd,cAAc;","names":[]}
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,16 +1,6 @@
1
- // src/types/NamespaceContext.ts
2
- import { createNamespace } from "cls-hooked";
3
- import { BaseRequestContext } from "@thisisagile/easy";
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
- };
1
+ import {
2
+ NamespaceContext
3
+ } from "../chunk-U2UXWL6X.mjs";
14
4
  export {
15
5
  NamespaceContext
16
6
  };
@@ -1 +1 @@
1
- {"version":3,"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":";AAAA,SAAS,uBAAuB;AAChC,SAAS,0BAA0B;AAE5B,IAAM,mBAAN,cAA+B,mBAAmB;AAAA,EACpC,YAAY,gBAAgB,SAAS;AAAA,EAEjD,IAAO,KAAgB;AAC5B,WAAO,KAAK,UAAU,IAAI,GAAG;AAAA,EAC/B;AAAA,EAEO,IAAO,KAAa,OAAa;AACtC,WAAO,KAAK,UAAU,IAAI,KAAK,KAAK;AAAA,EACtC;AAAA,EAEgB,SAAS,CAAC,MAAwB,KAAK,UAAU,IAAI,CAAC;AACxE;","names":[]}
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,2 +1,8 @@
1
- export * from "./NamespaceContext";
1
+ import "../chunk-YPBKY4KY.mjs";
2
+ import {
3
+ NamespaceContext
4
+ } from "../chunk-U2UXWL6X.mjs";
5
+ export {
6
+ NamespaceContext
7
+ };
2
8
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/types/index.ts"],"sourcesContent":["export * from './NamespaceContext';\n"],"mappings":"AAAA,cAAc;","names":[]}
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thisisagile/easy-express",
3
- "version": "18.17.0",
3
+ "version": "19.0.0",
4
4
  "description": "Straightforward library for building domain-driven microservice architectures",
5
5
  "author": "Sander Hoogendoorn",
6
6
  "license": "MIT",
@@ -20,8 +20,8 @@
20
20
  "scripts": {
21
21
  "lint": "yarn g:eslint . --ext .js,.jsx,.ts,.tsx --fix",
22
22
  "format": "yarn g:prettier --check --write src test *.json",
23
- "build": "yarn g:tsc",
24
- "build:tsup": "yarn g:tsup --onSuccess \"yarn g:tsc --emitDeclarationOnly --declaration\"",
23
+ "build": "yarn build:tsup",
24
+ "build:tsup": "yarn g:tsup && yarn g:tsc --emitDeclarationOnly --declaration && node ../../scripts/check-exports.mjs",
25
25
  "test": "yarn g:jest --coverage",
26
26
  "prepack": "yarn g:copy-readme"
27
27
  },
@@ -44,8 +44,8 @@
44
44
  "@types/validator": "^13.12.2"
45
45
  },
46
46
  "dependencies": {
47
- "@thisisagile/easy": "^18.17.0",
48
- "@thisisagile/easy-service": "^18.17.0",
47
+ "@thisisagile/easy": "^19.0.0",
48
+ "@thisisagile/easy-service": "^19.0.0",
49
49
  "@types/express": "^4.17.21",
50
50
  "cls-hooked": "^4.2.2",
51
51
  "express": "^4.21.2",
@@ -53,5 +53,55 @@
53
53
  "jsonwebtoken": "^9.0.2",
54
54
  "passport": "^0.7.0",
55
55
  "passport-jwt": "^4.0.1"
56
+ },
57
+ "exports": {
58
+ ".": {
59
+ "types": "./dist/index.d.ts",
60
+ "import": "./dist/index.mjs",
61
+ "require": "./dist/index.js"
62
+ },
63
+ "./express/AuthError": {
64
+ "types": "./dist/express/AuthError.d.ts",
65
+ "import": "./dist/express/AuthError.mjs"
66
+ },
67
+ "./express/CorrelationHandler": {
68
+ "types": "./dist/express/CorrelationHandler.d.ts",
69
+ "import": "./dist/express/CorrelationHandler.mjs"
70
+ },
71
+ "./express/ErrorHandler": {
72
+ "types": "./dist/express/ErrorHandler.d.ts",
73
+ "import": "./dist/express/ErrorHandler.mjs"
74
+ },
75
+ "./express/ExpressProvider": {
76
+ "types": "./dist/express/ExpressProvider.d.ts",
77
+ "import": "./dist/express/ExpressProvider.mjs"
78
+ },
79
+ "./express/NotFoundHandler": {
80
+ "types": "./dist/express/NotFoundHandler.d.ts",
81
+ "import": "./dist/express/NotFoundHandler.mjs"
82
+ },
83
+ "./express/RequestContextHandler": {
84
+ "types": "./dist/express/RequestContextHandler.d.ts",
85
+ "import": "./dist/express/RequestContextHandler.mjs"
86
+ },
87
+ "./express/SecurityHandler": {
88
+ "types": "./dist/express/SecurityHandler.d.ts",
89
+ "import": "./dist/express/SecurityHandler.mjs"
90
+ },
91
+ "./express/index": {
92
+ "types": "./dist/express/index.d.ts",
93
+ "import": "./dist/express/index.mjs"
94
+ },
95
+ "./types/NamespaceContext": {
96
+ "types": "./dist/types/NamespaceContext.d.ts",
97
+ "import": "./dist/types/NamespaceContext.mjs"
98
+ },
99
+ "./types/index": {
100
+ "types": "./dist/types/index.d.ts",
101
+ "import": "./dist/types/index.mjs"
102
+ },
103
+ "./src/*": "./src/*",
104
+ "./dist/*": "./dist/*",
105
+ "./package.json": "./package.json"
56
106
  }
57
107
  }