@shrub/express 0.5.34 → 0.5.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app.d.ts +4 -0
- package/dist/app.js +6 -0
- package/dist/controller-invoker.d.ts +39 -0
- package/dist/controller-invoker.js +113 -0
- package/dist/controller.d.ts +1 -1
- package/dist/controller.js +21 -19
- package/dist/esm/app.js +3 -0
- package/dist/esm/controller-invoker.js +109 -0
- package/dist/esm/controller.js +19 -17
- package/dist/esm/factory.js +3 -2
- package/dist/esm/index.js +3 -1
- package/dist/esm/module.js +7 -31
- package/dist/esm/request-context.js +22 -52
- package/dist/factory.d.ts +1 -1
- package/dist/factory.js +3 -2
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -1
- package/dist/module.d.ts +0 -10
- package/dist/module.js +9 -33
- package/dist/request-context.d.ts +8 -39
- package/dist/request-context.js +23 -52
- package/package.json +4 -4
package/dist/app.d.ts
ADDED
package/dist/app.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IExpressApplication = void 0;
|
|
4
|
+
const core_1 = require("@shrub/core");
|
|
5
|
+
exports.IExpressApplication = core_1.createService("express-application");
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxzQ0FBNEM7QUFHL0IsUUFBQSxtQkFBbUIsR0FBRyxvQkFBYSxDQUFzQixxQkFBcUIsQ0FBQyxDQUFDIn0=
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { RequestHandler } from "express";
|
|
2
|
+
import { PathParams } from "express-serve-static-core";
|
|
3
|
+
import { IExpressApplication } from "./app";
|
|
4
|
+
import { Constructor } from "./controller";
|
|
5
|
+
export declare type ControllerInvokerConstructor<T> = {
|
|
6
|
+
new (options: IControllerInvokerOptions): T;
|
|
7
|
+
};
|
|
8
|
+
/** Defines options for a controller invoker. */
|
|
9
|
+
export interface IControllerInvokerOptions {
|
|
10
|
+
readonly app: IExpressApplication;
|
|
11
|
+
readonly handler?: RequestHandler;
|
|
12
|
+
}
|
|
13
|
+
/** A service for creating controller invokers. */
|
|
14
|
+
export interface IControllerInvokerService {
|
|
15
|
+
createControllerInvoker<T>(ctor: ControllerInvokerConstructor<T>, handler?: RequestHandler): T;
|
|
16
|
+
}
|
|
17
|
+
/** Defines options for invoking a controller action. */
|
|
18
|
+
export interface IControllerRequestOptions<TController> {
|
|
19
|
+
readonly controller: Constructor<TController>;
|
|
20
|
+
readonly method: "GET" | "PATCH" | "POST" | "PUT" | "DELETE";
|
|
21
|
+
readonly path: PathParams;
|
|
22
|
+
readonly body?: any;
|
|
23
|
+
}
|
|
24
|
+
/** Defines the response from invoking a controller action. */
|
|
25
|
+
export interface IControllerResponse {
|
|
26
|
+
readonly status: number;
|
|
27
|
+
readonly data: any;
|
|
28
|
+
}
|
|
29
|
+
export declare const IControllerInvokerService: import("@shrub/core").IService<IControllerInvokerService>;
|
|
30
|
+
/** A class that is responsible for exposing and invoking controller actions. */
|
|
31
|
+
export declare abstract class ControllerInvoker {
|
|
32
|
+
private readonly options;
|
|
33
|
+
private readonly handler;
|
|
34
|
+
constructor(options: IControllerInvokerOptions);
|
|
35
|
+
/** Invokes an express request handler directly which represents a single controller action and returns a result. */
|
|
36
|
+
protected invokeAction<TController>(options: IControllerRequestOptions<TController>): Promise<IControllerResponse>;
|
|
37
|
+
private createExpressRequest;
|
|
38
|
+
private createExpressResponse;
|
|
39
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
9
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ControllerInvokerService = exports.ControllerInvoker = exports.IControllerInvokerService = void 0;
|
|
13
|
+
const core_1 = require("@shrub/core");
|
|
14
|
+
const app_1 = require("./app");
|
|
15
|
+
const controller_1 = require("./controller");
|
|
16
|
+
exports.IControllerInvokerService = core_1.createService("controller-invoker-service");
|
|
17
|
+
/** A class that is responsible for exposing and invoking controller actions. */
|
|
18
|
+
class ControllerInvoker {
|
|
19
|
+
constructor(options) {
|
|
20
|
+
this.options = options;
|
|
21
|
+
this.handler = !options.handler ? (_, __, next) => next() : options.handler;
|
|
22
|
+
}
|
|
23
|
+
/** Invokes an express request handler directly which represents a single controller action and returns a result. */
|
|
24
|
+
invokeAction(options) {
|
|
25
|
+
const router = controller_1.controller(options.controller);
|
|
26
|
+
return new Promise((resolve, reject) => {
|
|
27
|
+
// create the express Request object to pass down the request chain
|
|
28
|
+
const req = this.createExpressRequest(options);
|
|
29
|
+
// create the express Response object that will resovle the Promise when the response has ended (i.e. when res.end is inovked)
|
|
30
|
+
const res = this.createExpressResponse(resolve);
|
|
31
|
+
// if an error is returned at any point reject the promise
|
|
32
|
+
const nextOrReject = (err, next) => {
|
|
33
|
+
if (err) {
|
|
34
|
+
reject(err);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
next();
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
this.options.app(req, res, (err) => nextOrReject(err, () => {
|
|
41
|
+
// the handler is the custom handler provided to the controller invoker, this allows configuring the express middleware before invoking the controller
|
|
42
|
+
// the router handles invoking the controller and if next is invoked assume an error or a 404
|
|
43
|
+
this.handler(req, res, (err) => nextOrReject(err, () => router(req, res, (err) => reject(err || new Error(`Path ${options.path} not found.`)))));
|
|
44
|
+
}));
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
createExpressRequest(options) {
|
|
48
|
+
return {
|
|
49
|
+
method: options.method,
|
|
50
|
+
body: options.body,
|
|
51
|
+
url: options.path
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
createExpressResponse(callback) {
|
|
55
|
+
let headers = {};
|
|
56
|
+
let status = 200;
|
|
57
|
+
return {
|
|
58
|
+
get statusCode() {
|
|
59
|
+
return status;
|
|
60
|
+
},
|
|
61
|
+
set statusCode(s) {
|
|
62
|
+
this.status(status);
|
|
63
|
+
},
|
|
64
|
+
end: function (data, _, cb) {
|
|
65
|
+
callback({ status, data });
|
|
66
|
+
if (cb) {
|
|
67
|
+
cb();
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
getHeader: name => headers[name],
|
|
71
|
+
json: function (data) {
|
|
72
|
+
return this.send(data);
|
|
73
|
+
},
|
|
74
|
+
send: function (data) {
|
|
75
|
+
this.end(data);
|
|
76
|
+
return this;
|
|
77
|
+
},
|
|
78
|
+
sendStatus: function (s) {
|
|
79
|
+
status = s;
|
|
80
|
+
return this.send();
|
|
81
|
+
},
|
|
82
|
+
setHeader: function (name, value) {
|
|
83
|
+
headers[name] = value;
|
|
84
|
+
},
|
|
85
|
+
status: function (s) {
|
|
86
|
+
status = s;
|
|
87
|
+
return this;
|
|
88
|
+
},
|
|
89
|
+
write: function (data, _, cb) {
|
|
90
|
+
this.end(data);
|
|
91
|
+
if (cb) {
|
|
92
|
+
cb(undefined);
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
exports.ControllerInvoker = ControllerInvoker;
|
|
99
|
+
/** @internal */
|
|
100
|
+
let ControllerInvokerService = class ControllerInvokerService {
|
|
101
|
+
constructor(app) {
|
|
102
|
+
this.app = app;
|
|
103
|
+
}
|
|
104
|
+
createControllerInvoker(ctor, handler) {
|
|
105
|
+
return new ctor({ app: this.app, handler });
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
ControllerInvokerService = __decorate([
|
|
109
|
+
core_1.Transient,
|
|
110
|
+
__param(0, app_1.IExpressApplication)
|
|
111
|
+
], ControllerInvokerService);
|
|
112
|
+
exports.ControllerInvokerService = ControllerInvokerService;
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci1pbnZva2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnRyb2xsZXItaW52b2tlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxzQ0FBdUQ7QUFHdkQsK0JBQTRDO0FBQzVDLDZDQUF1RDtBQTZCMUMsUUFBQSx5QkFBeUIsR0FBRyxvQkFBYSxDQUE0Qiw0QkFBNEIsQ0FBQyxDQUFDO0FBRWhILGdGQUFnRjtBQUNoRixNQUFzQixpQkFBaUI7SUFHbkMsWUFBNkIsT0FBa0M7UUFBbEMsWUFBTyxHQUFQLE9BQU8sQ0FBMkI7UUFDM0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO0lBQ2hGLENBQUM7SUFFRCxvSEFBb0g7SUFDMUcsWUFBWSxDQUFjLE9BQStDO1FBQy9FLE1BQU0sTUFBTSxHQUFHLHVCQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzlDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDbkMsbUVBQW1FO1lBQ25FLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMvQyw4SEFBOEg7WUFDOUgsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELDBEQUEwRDtZQUMxRCxNQUFNLFlBQVksR0FBRyxDQUFDLEdBQVEsRUFBRSxJQUFnQixFQUFFLEVBQUU7Z0JBQ2hELElBQUksR0FBRyxFQUFFO29CQUNMLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDZjtxQkFDSTtvQkFDRCxJQUFJLEVB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
|
package/dist/controller.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ export declare function Post(path?: PathParams, ...handlers: RequestHandler[]):
|
|
|
20
20
|
/** A function decorator identifying a request handler on a controller for a specific path and HTTP PUT method.*/
|
|
21
21
|
export declare function Put(path?: PathParams, ...handlers: RequestHandler[]): (target: any, propertyKey: string) => void;
|
|
22
22
|
/** Middleware that exposes the routes for a Controller. */
|
|
23
|
-
export declare function
|
|
23
|
+
export declare function controller<T>(ctor: Constructor<T>): RequestHandler;
|
|
24
24
|
/**
|
|
25
25
|
* Creates a route decorator for a controller function; the provided callback is responsible for
|
|
26
26
|
* registering a route with the provided router and the given handler is the controller handler
|
package/dist/controller.js
CHANGED
|
@@ -1,24 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createRouteDecorator = exports.
|
|
4
|
-
const express_1 = require("express");
|
|
3
|
+
exports.createRouteDecorator = exports.controller = exports.Put = exports.Post = exports.Patch = exports.Get = exports.Delete = exports.Route = void 0;
|
|
5
4
|
const core_1 = require("@shrub/core");
|
|
5
|
+
const express_1 = require("express");
|
|
6
6
|
const controllerKey = "__controller";
|
|
7
7
|
const routerKey = "__router";
|
|
8
8
|
const routesKey = "__routes";
|
|
9
|
-
const routeHandler = (proto, propertyKey) => (req, res, next) => {
|
|
10
|
-
const controller = req[controllerKey];
|
|
11
|
-
if (!controller) {
|
|
12
|
-
return next(new Error(`Controller '${proto.constructor.name}' not found for request '${req.path}'.`));
|
|
13
|
-
}
|
|
14
|
-
const handler = controller[propertyKey];
|
|
15
|
-
if (!handler) {
|
|
16
|
-
return next(new Error(`Request handler method '${propertyKey}' not found on controller '${proto.constructor.name}'.`));
|
|
17
|
-
}
|
|
18
|
-
// a request handler may return a promise or not; if the request handler is async capture unhandled errors and pass them to next
|
|
19
|
-
// this can easly be done by wrapping the result in a Promise.resolve() and handling catch
|
|
20
|
-
Promise.resolve(handler.call(controller, req, res, next)).catch(err => next(err));
|
|
21
|
-
};
|
|
22
9
|
/** A class decorator for a Controller identifying the request route the controller handles. */
|
|
23
10
|
const Route = function () {
|
|
24
11
|
const path = arguments.length && typeof arguments[0] !== "function" ? arguments[0] : undefined;
|
|
@@ -66,14 +53,14 @@ function Put(path, ...handlers) {
|
|
|
66
53
|
}
|
|
67
54
|
exports.Put = Put;
|
|
68
55
|
/** Middleware that exposes the routes for a Controller. */
|
|
69
|
-
function
|
|
56
|
+
function controller(ctor) {
|
|
70
57
|
const router = ctor.prototype[routerKey];
|
|
71
58
|
if (!router) {
|
|
72
59
|
throw new Error(`Invalid controller '${ctor.name}', class does not have a Route decorator.`);
|
|
73
60
|
}
|
|
74
61
|
return router;
|
|
75
62
|
}
|
|
76
|
-
exports.
|
|
63
|
+
exports.controller = controller;
|
|
77
64
|
/**
|
|
78
65
|
* Creates a route decorator for a controller function; the provided callback is responsible for
|
|
79
66
|
* registering a route with the provided router and the given handler is the controller handler
|
|
@@ -82,10 +69,25 @@ exports.useController = useController;
|
|
|
82
69
|
function createRouteDecorator(register) {
|
|
83
70
|
return (target, propertyKey) => {
|
|
84
71
|
target[routesKey] = target[routesKey] || express_1.Router();
|
|
85
|
-
register(target[routesKey],
|
|
72
|
+
register(target[routesKey], getControllerActionRouteHandler(target, propertyKey));
|
|
86
73
|
};
|
|
87
74
|
}
|
|
88
75
|
exports.createRouteDecorator = createRouteDecorator;
|
|
76
|
+
function getControllerActionRouteHandler(proto, propertyKey) {
|
|
77
|
+
return (req, res, next) => {
|
|
78
|
+
const controller = req[controllerKey];
|
|
79
|
+
if (!controller) {
|
|
80
|
+
return next(new Error(`Controller '${proto.constructor.name}' not found for request '${req.path}'.`));
|
|
81
|
+
}
|
|
82
|
+
const handler = controller[propertyKey];
|
|
83
|
+
if (!handler) {
|
|
84
|
+
return next(new Error(`Request handler method '${propertyKey}' not found on controller '${proto.constructor.name}'.`));
|
|
85
|
+
}
|
|
86
|
+
// a request handler may return a promise or not; if the request handler is async capture unhandled errors and pass them to next
|
|
87
|
+
// this can easly be done by wrapping the result in a Promise.resolve() and handling catch
|
|
88
|
+
Promise.resolve(handler.call(controller, req, res, next)).catch(err => next(err));
|
|
89
|
+
};
|
|
90
|
+
}
|
|
89
91
|
function registerRoute(path, handlers, cb) {
|
|
90
92
|
return (router, handler) => cb(router).call(router, path, ...[...handlers, handler]);
|
|
91
93
|
}
|
|
@@ -96,4 +98,4 @@ function createController(ctor) {
|
|
|
96
98
|
next();
|
|
97
99
|
};
|
|
98
100
|
}
|
|
99
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHNDQUFvRDtBQUNwRCxxQ0FBaUQ7QUFjakQsTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUFDO0FBQ3JDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQztBQUM3QixNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUM7QUFFN0IsK0ZBQStGO0FBQ3hGLE1BQU0sS0FBSyxHQUFvQjtJQUNsQyxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsTUFBTSxJQUFJLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDL0YsTUFBTSxRQUFRLEdBQUcsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTNGLE9BQU8sVUFBVSxJQUFjO1FBQzNCLHVFQUF1RTtRQUN2RSxNQUFNLEdBQUcsR0FBVyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDTixNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztTQUN6RTtRQUVELE1BQU0sTUFBTSxHQUFHLGdCQUFNLEVBQUUsQ0FBQztRQUV4QixJQUFJLElBQUksRUFBRTtZQUNOLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsUUFBUSxFQUFFLGdCQUFnQixDQUFtQixJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUNoRjthQUNJO1lBQ0QsTUFBTSxDQUFDLEdB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
|
package/dist/esm/app.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { createService } from "@shrub/core";
|
|
2
|
+
export const IExpressApplication = createService("express-application");
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRzVDLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLGFBQWEsQ0FBc0IscUJBQXFCLENBQUMsQ0FBQyJ9
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
8
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
|
+
};
|
|
10
|
+
import { createService, Transient } from "@shrub/core";
|
|
11
|
+
import { IExpressApplication } from "./app";
|
|
12
|
+
import { controller } from "./controller";
|
|
13
|
+
export const IControllerInvokerService = createService("controller-invoker-service");
|
|
14
|
+
/** A class that is responsible for exposing and invoking controller actions. */
|
|
15
|
+
export class ControllerInvoker {
|
|
16
|
+
constructor(options) {
|
|
17
|
+
this.options = options;
|
|
18
|
+
this.handler = !options.handler ? (_, __, next) => next() : options.handler;
|
|
19
|
+
}
|
|
20
|
+
/** Invokes an express request handler directly which represents a single controller action and returns a result. */
|
|
21
|
+
invokeAction(options) {
|
|
22
|
+
const router = controller(options.controller);
|
|
23
|
+
return new Promise((resolve, reject) => {
|
|
24
|
+
// create the express Request object to pass down the request chain
|
|
25
|
+
const req = this.createExpressRequest(options);
|
|
26
|
+
// create the express Response object that will resovle the Promise when the response has ended (i.e. when res.end is inovked)
|
|
27
|
+
const res = this.createExpressResponse(resolve);
|
|
28
|
+
// if an error is returned at any point reject the promise
|
|
29
|
+
const nextOrReject = (err, next) => {
|
|
30
|
+
if (err) {
|
|
31
|
+
reject(err);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
next();
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
this.options.app(req, res, (err) => nextOrReject(err, () => {
|
|
38
|
+
// the handler is the custom handler provided to the controller invoker, this allows configuring the express middleware before invoking the controller
|
|
39
|
+
// the router handles invoking the controller and if next is invoked assume an error or a 404
|
|
40
|
+
this.handler(req, res, (err) => nextOrReject(err, () => router(req, res, (err) => reject(err || new Error(`Path ${options.path} not found.`)))));
|
|
41
|
+
}));
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
createExpressRequest(options) {
|
|
45
|
+
return {
|
|
46
|
+
method: options.method,
|
|
47
|
+
body: options.body,
|
|
48
|
+
url: options.path
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
createExpressResponse(callback) {
|
|
52
|
+
let headers = {};
|
|
53
|
+
let status = 200;
|
|
54
|
+
return {
|
|
55
|
+
get statusCode() {
|
|
56
|
+
return status;
|
|
57
|
+
},
|
|
58
|
+
set statusCode(s) {
|
|
59
|
+
this.status(status);
|
|
60
|
+
},
|
|
61
|
+
end: function (data, _, cb) {
|
|
62
|
+
callback({ status, data });
|
|
63
|
+
if (cb) {
|
|
64
|
+
cb();
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
getHeader: name => headers[name],
|
|
68
|
+
json: function (data) {
|
|
69
|
+
return this.send(data);
|
|
70
|
+
},
|
|
71
|
+
send: function (data) {
|
|
72
|
+
this.end(data);
|
|
73
|
+
return this;
|
|
74
|
+
},
|
|
75
|
+
sendStatus: function (s) {
|
|
76
|
+
status = s;
|
|
77
|
+
return this.send();
|
|
78
|
+
},
|
|
79
|
+
setHeader: function (name, value) {
|
|
80
|
+
headers[name] = value;
|
|
81
|
+
},
|
|
82
|
+
status: function (s) {
|
|
83
|
+
status = s;
|
|
84
|
+
return this;
|
|
85
|
+
},
|
|
86
|
+
write: function (data, _, cb) {
|
|
87
|
+
this.end(data);
|
|
88
|
+
if (cb) {
|
|
89
|
+
cb(undefined);
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/** @internal */
|
|
96
|
+
let ControllerInvokerService = class ControllerInvokerService {
|
|
97
|
+
constructor(app) {
|
|
98
|
+
this.app = app;
|
|
99
|
+
}
|
|
100
|
+
createControllerInvoker(ctor, handler) {
|
|
101
|
+
return new ctor({ app: this.app, handler });
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
ControllerInvokerService = __decorate([
|
|
105
|
+
Transient,
|
|
106
|
+
__param(0, IExpressApplication)
|
|
107
|
+
], ControllerInvokerService);
|
|
108
|
+
export { ControllerInvokerService };
|
|
109
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci1pbnZva2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnRyb2xsZXItaW52b2tlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUd2RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDNUMsT0FBTyxFQUFFLFVBQVUsRUFBZSxNQUFNLGNBQWMsQ0FBQztBQTZCdkQsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsYUFBYSxDQUE0Qiw0QkFBNEIsQ0FBQyxDQUFDO0FBRWhILGdGQUFnRjtBQUNoRixNQUFNLE9BQWdCLGlCQUFpQjtJQUduQyxZQUE2QixPQUFrQztRQUFsQyxZQUFPLEdBQVAsT0FBTyxDQUEyQjtRQUMzRCxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7SUFDaEYsQ0FBQztJQUVELG9IQUFvSDtJQUMxRyxZQUFZLENBQWMsT0FBK0M7UUFDL0UsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5QyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ25DLG1FQUFtRTtZQUNuRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDL0MsOEhBQThIO1lBQzlILE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNoRCwwREFBMEQ7WUFDMUQsTUFBTSxZQUFZLEdBQUcs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
|
package/dist/esm/controller.js
CHANGED
|
@@ -1,21 +1,8 @@
|
|
|
1
|
-
import { Router } from "express";
|
|
2
1
|
import { IInstantiationService } from "@shrub/core";
|
|
2
|
+
import { Router } from "express";
|
|
3
3
|
const controllerKey = "__controller";
|
|
4
4
|
const routerKey = "__router";
|
|
5
5
|
const routesKey = "__routes";
|
|
6
|
-
const routeHandler = (proto, propertyKey) => (req, res, next) => {
|
|
7
|
-
const controller = req[controllerKey];
|
|
8
|
-
if (!controller) {
|
|
9
|
-
return next(new Error(`Controller '${proto.constructor.name}' not found for request '${req.path}'.`));
|
|
10
|
-
}
|
|
11
|
-
const handler = controller[propertyKey];
|
|
12
|
-
if (!handler) {
|
|
13
|
-
return next(new Error(`Request handler method '${propertyKey}' not found on controller '${proto.constructor.name}'.`));
|
|
14
|
-
}
|
|
15
|
-
// a request handler may return a promise or not; if the request handler is async capture unhandled errors and pass them to next
|
|
16
|
-
// this can easly be done by wrapping the result in a Promise.resolve() and handling catch
|
|
17
|
-
Promise.resolve(handler.call(controller, req, res, next)).catch(err => next(err));
|
|
18
|
-
};
|
|
19
6
|
/** A class decorator for a Controller identifying the request route the controller handles. */
|
|
20
7
|
export const Route = function () {
|
|
21
8
|
const path = arguments.length && typeof arguments[0] !== "function" ? arguments[0] : undefined;
|
|
@@ -57,7 +44,7 @@ export function Put(path, ...handlers) {
|
|
|
57
44
|
return createRouteDecorator(registerRoute(path || "/", handlers, router => router.put));
|
|
58
45
|
}
|
|
59
46
|
/** Middleware that exposes the routes for a Controller. */
|
|
60
|
-
export function
|
|
47
|
+
export function controller(ctor) {
|
|
61
48
|
const router = ctor.prototype[routerKey];
|
|
62
49
|
if (!router) {
|
|
63
50
|
throw new Error(`Invalid controller '${ctor.name}', class does not have a Route decorator.`);
|
|
@@ -72,7 +59,22 @@ export function useController(ctor) {
|
|
|
72
59
|
export function createRouteDecorator(register) {
|
|
73
60
|
return (target, propertyKey) => {
|
|
74
61
|
target[routesKey] = target[routesKey] || Router();
|
|
75
|
-
register(target[routesKey],
|
|
62
|
+
register(target[routesKey], getControllerActionRouteHandler(target, propertyKey));
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function getControllerActionRouteHandler(proto, propertyKey) {
|
|
66
|
+
return (req, res, next) => {
|
|
67
|
+
const controller = req[controllerKey];
|
|
68
|
+
if (!controller) {
|
|
69
|
+
return next(new Error(`Controller '${proto.constructor.name}' not found for request '${req.path}'.`));
|
|
70
|
+
}
|
|
71
|
+
const handler = controller[propertyKey];
|
|
72
|
+
if (!handler) {
|
|
73
|
+
return next(new Error(`Request handler method '${propertyKey}' not found on controller '${proto.constructor.name}'.`));
|
|
74
|
+
}
|
|
75
|
+
// a request handler may return a promise or not; if the request handler is async capture unhandled errors and pass them to next
|
|
76
|
+
// this can easly be done by wrapping the result in a Promise.resolve() and handling catch
|
|
77
|
+
Promise.resolve(handler.call(controller, req, res, next)).catch(err => next(err));
|
|
76
78
|
};
|
|
77
79
|
}
|
|
78
80
|
function registerRoute(path, handlers, cb) {
|
|
@@ -85,4 +87,4 @@ function createController(ctor) {
|
|
|
85
87
|
next();
|
|
86
88
|
};
|
|
87
89
|
}
|
|
88
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNwRCxPQUFPLEVBQWtCLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQWNqRCxNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUM7QUFDckMsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDO0FBQzdCLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQztBQUU3QiwrRkFBK0Y7QUFDL0YsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFvQjtJQUNsQyxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsTUFBTSxJQUFJLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDL0YsTUFBTSxRQUFRLEdBQUcsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTNGLE9BQU8sVUFBVSxJQUFjO1FBQzNCLHVFQUF1RTtRQUN2RSxNQUFNLEdBQUcsR0FBVyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDTixNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztTQUN6RTtRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxDQUFDO1FBRXhCLElBQUksSUFBSSxFQUFFO1lBQ04sTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxRQUFRLEVBQUUsZ0JB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
|
package/dist/esm/factory.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ModuleLoader } from "@shrub/core";
|
|
2
|
-
import {
|
|
2
|
+
import { IExpressApplication } from "./app";
|
|
3
|
+
import { ExpressModule } from "./module";
|
|
3
4
|
/** A factory class for registering modules within an Express application context. */
|
|
4
5
|
export class ExpressFactory {
|
|
5
6
|
constructor() {
|
|
@@ -45,4 +46,4 @@ export class ExpressFactory {
|
|
|
45
46
|
return this;
|
|
46
47
|
}
|
|
47
48
|
}
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0YsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXpDLHFGQUFxRjtBQUNyRixNQUFNLE9BQU8sY0FBYztJQUEzQjtRQUNxQixZQUFPLEdBQWtDLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDekQsYUFBUSxHQUFnQyxFQUFFLENBQUM7UUFDcEQsc0JBQWlCLEdBQWlELEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztJQWlEdkYsQ0FBQztJQTlDRyxzQ0FBc0M7SUFDdEMsTUFBTSxDQUFDLE1BQU07UUFDVCxPQUFPLElBQUksY0FBYyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVELE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxRQUFzRDtRQUMzRSxPQUFPLElBQUksY0FBYyxFQUFFLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBc0M7UUFDcEQsT0FBTyxJQUFJLGNBQWMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxRQUFtQztRQUNsRCxPQUFPLElBQUksY0FBYyxFQUFFLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCw2SEFBNkg7SUFDN0gsTUFBTTtRQUNGLE1BQU0sTUFBTSxHQUFHLElBQUksWUFBWSxFQUFFO2FBQzVCLGlCQUFpQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQzthQUN6QyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTlCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RELE9BQU8sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBRUQsaUJBQWlCLENBQUMsUUFBc0Q7UUFDcEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQ3BDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxZQUFZLENBQUMsRUFBRTtZQUNwQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxVQUFVLENBQUMsT0FBc0M7UUFDN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUM5QixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsV0FBVyxDQUFDLFFBQW1DO1FBQzNDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FDSiJ9
|
package/dist/esm/index.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
export * from "./app";
|
|
1
2
|
export * from "./controller";
|
|
3
|
+
export * from "./controller-invoker";
|
|
2
4
|
export * from "./factory";
|
|
3
5
|
export * from "./module";
|
|
4
6
|
export * from "./request-context";
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxPQUFPLENBQUM7QUFDdEIsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLFdBQVcsQ0FBQztBQUMxQixjQUFjLFVBQVUsQ0FBQztBQUN6QixjQUFjLG1CQUFtQixDQUFDIn0=
|
package/dist/esm/module.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import express from "express";
|
|
2
|
-
import { createConfig
|
|
2
|
+
import { createConfig } from "@shrub/core";
|
|
3
3
|
import { HttpModule, IHttpModuleConfiguration, IHttpServer } from "@shrub/http";
|
|
4
|
-
import {
|
|
4
|
+
import { ControllerInvokerService, IControllerInvokerService } from "./controller-invoker";
|
|
5
|
+
import { IRequestContextService, requestContext, RequestContextService } from "./request-context";
|
|
6
|
+
import { IExpressApplication } from "./app";
|
|
5
7
|
export const IExpressConfiguration = createConfig();
|
|
6
|
-
export const IExpressApplication = createService("express-application");
|
|
7
8
|
export class ExpressModule {
|
|
8
9
|
constructor() {
|
|
9
10
|
this.name = "express";
|
|
@@ -13,38 +14,13 @@ export class ExpressModule {
|
|
|
13
14
|
init.config(IExpressConfiguration).register(({ services }) => services.get(IExpressApplication));
|
|
14
15
|
}
|
|
15
16
|
configureServices(registration) {
|
|
16
|
-
registration.register(
|
|
17
|
+
registration.register(IControllerInvokerService, ControllerInvokerService);
|
|
17
18
|
registration.register(IRequestContextService, RequestContextService, { sealed: true });
|
|
18
|
-
registration.register(IRequestContextBuilder, RequestContextBuilder, { sealed: true });
|
|
19
19
|
registration.registerSingleton(IExpressApplication, {
|
|
20
20
|
create: services => {
|
|
21
21
|
const app = express();
|
|
22
|
+
app.use(requestContext(services));
|
|
22
23
|
this.overrideListen(services, app);
|
|
23
|
-
app.use((req, res, next) => {
|
|
24
|
-
// use a scoped service collection for the request
|
|
25
|
-
const requestServices = services.createScope();
|
|
26
|
-
const requestContextService = requestServices.get(IRequestContextService);
|
|
27
|
-
const requestContextBuilder = requestServices.get(IRequestContextBuilder);
|
|
28
|
-
res.on("finish", () => requestServices.dispose());
|
|
29
|
-
// note: these properties need to be configurable to support express sub apps
|
|
30
|
-
// when loading a set of modules as an independent sub app the root app will
|
|
31
|
-
// have defined a context on the request but for sub apps we need to overwrite
|
|
32
|
-
// it using the context configured for this specific domain
|
|
33
|
-
Object.defineProperty(req, "context", {
|
|
34
|
-
configurable: true,
|
|
35
|
-
get() { return requestContextService.context; }
|
|
36
|
-
});
|
|
37
|
-
Object.defineProperty(req, "contextBuilder", {
|
|
38
|
-
configurable: true,
|
|
39
|
-
get() { return requestContextBuilder; }
|
|
40
|
-
});
|
|
41
|
-
next();
|
|
42
|
-
});
|
|
43
|
-
// the express app gets returned as the express configuration object so add the extended
|
|
44
|
-
// configuration functions to the express app here
|
|
45
|
-
app.useRequestBuilder = (name, callback) => {
|
|
46
|
-
services.get(IRequestContextBuilderRegistration).register(name, callback);
|
|
47
|
-
};
|
|
48
24
|
return app;
|
|
49
25
|
}
|
|
50
26
|
});
|
|
@@ -63,4 +39,4 @@ export class ExpressModule {
|
|
|
63
39
|
};
|
|
64
40
|
}
|
|
65
41
|
}
|
|
66
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFFLFlBQVksRUFBOEYsTUFBTSxhQUFhLENBQUM7QUFDdkksT0FBTyxFQUFFLFVBQVUsRUFBRSx3QkFBd0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLHlCQUF5QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0YsT0FBTyxFQUFFLHNCQUFzQixFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xHLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUU1QyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxZQUFZLEVBQXlCLENBQUM7QUFJM0UsTUFBTSxPQUFPLGFBQWE7SUFBMUI7UUFDYSxTQUFJLEdBQUcsU0FBUyxDQUFDO1FBQ2pCLGlCQUFZLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQWlDekMsQ0FBQztJQS9CRyxVQUFVLENBQUMsSUFBd0I7UUFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUF3QixRQUFRLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztJQUM1SCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsWUFBa0M7UUFDaEQsWUFBWSxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO1FBQzNFLFlBQVksQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEVBQUUscUJBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN2RixZQUFZLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLEVBQUU7WUFDaEQsTUFBTSxFQUFFLFFBQVEsQ0FBQyxFQUFFO2dCQUNmLE1BQU0sR0FBRyxHQUFHLE9BQU8sRUFBRSxDQUFDO2dCQUN0QixHQUFHLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUNsQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDbkMsT0FBTyxHQUFHLENBQUM7WUFDZixDQUFDO1NBQ0osQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQXVCO1FBQy9DLE1BQU0sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBRU8sY0FBYyxDQUFDLFFBQTRCLEVBQUUsR0FBb0I7UUFDckUsMEVBQTBFO1FBQzFFLG1GQUFtRjtRQUNuRiw0RUFBNEU7UUFDNUUsc0NBQXNDO1FBQ3RDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsU0FBUyxNQUFNO1lBQ3hCLE1BQU0sTUFBTSxHQUFRLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDOUMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFBO0lBQ0wsQ0FBQztDQUNKIn0=
|
|
@@ -7,42 +7,32 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
8
8
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
9
|
};
|
|
10
|
-
import { createService, IServiceCollection, Scoped
|
|
11
|
-
/** @internal */
|
|
12
|
-
export const IRequestContextBuilder = createService("request-context-builder");
|
|
13
|
-
/** @internal */
|
|
14
|
-
export const IRequestContextBuilderRegistration = createService("request-context-registration");
|
|
10
|
+
import { createService, IServiceCollection, Scoped } from "@shrub/core";
|
|
15
11
|
export const IRequestContextService = createService("request-context-service");
|
|
16
|
-
/** @internal */
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
12
|
+
/** @internal Express middleware that creates and installs the request context; the provided service collection should be the root collection in which a scoped collection will be created from. */
|
|
13
|
+
export const requestContext = services => (req, res, next) => {
|
|
14
|
+
// use a scoped service collection for the request
|
|
15
|
+
const requestServices = services.createScope();
|
|
16
|
+
const requestContextService = requestServices.get(IRequestContextService);
|
|
17
|
+
res.on("finish", () => requestServices.dispose());
|
|
18
|
+
// note: this needs to be configurable to support express sub apps
|
|
19
|
+
// when loading a set of modules as an independent sub app the root app will
|
|
20
|
+
// have defined a context on the request but for sub apps we need to overwrite
|
|
21
|
+
// it using the context configured for this specific domain
|
|
22
|
+
Object.defineProperty(req, "context", {
|
|
23
|
+
configurable: true,
|
|
24
|
+
get() { return requestContextService.context; }
|
|
25
|
+
});
|
|
26
|
+
Object.defineProperty(req, "services", {
|
|
27
|
+
configurable: true,
|
|
28
|
+
get() { return requestServices; }
|
|
29
|
+
});
|
|
30
|
+
next();
|
|
27
31
|
};
|
|
28
|
-
RequestContextBuilderRegistration = __decorate([
|
|
29
|
-
Singleton
|
|
30
|
-
], RequestContextBuilderRegistration);
|
|
31
|
-
export { RequestContextBuilderRegistration };
|
|
32
|
-
// the request context service is responsible for holding a reference to the current request context
|
|
33
|
-
// and making it available publicly through the service
|
|
34
|
-
// the request builder is responsible for building/modifying the request context and is used by
|
|
35
|
-
// express middleware that handle extending the request context
|
|
36
32
|
/** @internal */
|
|
37
33
|
let RequestContextService = class RequestContextService {
|
|
38
34
|
constructor(services) {
|
|
39
|
-
this.
|
|
40
|
-
}
|
|
41
|
-
get context() {
|
|
42
|
-
return this.current;
|
|
43
|
-
}
|
|
44
|
-
setCurrentContext(current) {
|
|
45
|
-
this.current = current;
|
|
35
|
+
this.context = { bag: {}, services };
|
|
46
36
|
}
|
|
47
37
|
};
|
|
48
38
|
RequestContextService = __decorate([
|
|
@@ -50,24 +40,4 @@ RequestContextService = __decorate([
|
|
|
50
40
|
__param(0, IServiceCollection)
|
|
51
41
|
], RequestContextService);
|
|
52
42
|
export { RequestContextService };
|
|
53
|
-
|
|
54
|
-
let RequestContextBuilder = class RequestContextBuilder {
|
|
55
|
-
constructor(builders, service) {
|
|
56
|
-
const map = builders.getCallbacks();
|
|
57
|
-
// TODO: can this be more efficient? -- is there a better way than to loop through and copy each function?
|
|
58
|
-
// extend the current instance to include the registered builder callbacks
|
|
59
|
-
for (const name in map) {
|
|
60
|
-
this[name] = (...args) => {
|
|
61
|
-
service.setCurrentContext(map[name](service.context, ...args));
|
|
62
|
-
return this;
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
};
|
|
67
|
-
RequestContextBuilder = __decorate([
|
|
68
|
-
Scoped,
|
|
69
|
-
__param(0, IRequestContextBuilderRegistration),
|
|
70
|
-
__param(1, IRequestContextService)
|
|
71
|
-
], RequestContextBuilder);
|
|
72
|
-
export { RequestContextBuilder };
|
|
73
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1jb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlcXVlc3QtY29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFvRm5GLGdCQUFnQjtBQUNoQixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxhQUFhLENBQXlCLHlCQUF5QixDQUFDLENBQUM7QUFDdkcsZ0JBQWdCO0FBQ2hCLE1BQU0sQ0FBQyxNQUFNLGtDQUFrQyxHQUFHLGFBQWEsQ0FBcUMsOEJBQThCLENBQUMsQ0FBQztBQUNwSSxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxhQUFhLENBQXlCLHlCQUF5QixDQUFDLENBQUM7QUFFdkcsZ0JBQWdCO0FBRWhCLElBQWEsaUNBQWlDLEdBQTlDLE1BQWEsaUNBQWlDO0lBQTlDO1FBQ3FCLFFBQUcsR0FBdUMsRUFBRSxDQUFDO0lBU2xFLENBQUM7SUFQRyxZQUFZO1FBQ1IsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxRQUFRLENBQUMsSUFBWSxFQUFFLFFBQXdDO1FBQzNELElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDO0lBQzlCLENBQUM7Q0FDSixDQUFBO0FBVlksaUNBQWlDO0lBRDdDLFNBQVM7R0FDRyxpQ0FBaUMsQ0FVN0M7U0FWWSxpQ0FBaUM7QUFZOUMsb0dBQW9HO0FBQ3BHLHVEQUF1RDtBQUV2RCwrRkFBK0Y7QUFDL0YsK0RBQStEO0FBRS9ELGdCQUFnQjtBQUVoQixJQUFhLHFCQUFxQixHQUFsQyxNQUFhLHFCQUFxQjtJQUc5QixZQUFnQyxRQUE0QjtRQUN4RCxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1AsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxPQUF3QjtRQUN0QyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUMzQixDQUFDO0NBQ0osQ0FBQTtBQWRZLHFCQUFxQjtJQURqQyxNQUFNO0lBSVUsV0FBQSxrQkFBa0IsQ0FBQTtHQUh0QixxQkFBcUIsQ0FjakM7U0FkWSxxQkFBcUI7QUFnQmxDLGdCQUFnQjtBQUVoQixJQUFhLHFCQUFxQixHQUFsQyxNQUFhLHFCQUFxQjtJQUM5QixZQUN3QyxRQUE0QyxFQUN4RCxPQUE4QjtRQUNsRCxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFcEMsMEdBQTBHO1FBQzFHLDBFQUEwRTtRQUMxRSxLQUFLLE1BQU0sSUFBSSxJQUFJLEdBQUcsRUFBRTtZQUNkLElBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBVyxFQUFFLEVBQUU7Z0JBQ25DLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQy9ELE9BQU8sSUFBSSxDQUFDO1lBQ2hCLENBQUMsQ0FBQztTQUNMO0lBQ1QsQ0FBQztDQUNKLENBQUE7QUFmWSxxQkFBcUI7SUFEakMsTUFBTTtJQUdFLFdBQUEsa0NBQWtDLENBQUE7SUFDbEMsV0FBQSxzQkFBc0IsQ0FBQTtHQUhsQixxQkFBcUIsQ0FlakM7U0FmWSxxQkFBcUIifQ==
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1jb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlcXVlc3QtY29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQXVDeEUsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsYUFBYSxDQUF5Qix5QkFBeUIsQ0FBQyxDQUFDO0FBRXZHLG1NQUFtTTtBQUNuTSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQXFELFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFO0lBQzNHLGtEQUFrRDtJQUNsRCxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDL0MsTUFBTSxxQkFBcUIsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFFMUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFFbEQsa0VBQWtFO0lBQ2xFLDRFQUE0RTtJQUM1RSw4RUFBOEU7SUFDOUUsMkRBQTJEO0lBQzNELE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRTtRQUNsQyxZQUFZLEVBQUUsSUFBSTtRQUNsQixHQUFHLEtBQUssT0FBTyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0tBQ2xELENBQUMsQ0FBQztJQUVILE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRTtRQUNuQyxZQUFZLEVBQUUsSUFBSTtRQUNsQixHQUFHLEtBQUssT0FBTyxlQUFlLENBQUMsQ0FBQyxDQUFDO0tBQ3BDLENBQUMsQ0FBQztJQUVILElBQUksRUFBRSxDQUFDO0FBQ1gsQ0FBQyxDQUFDO0FBRUYsZ0JBQWdCO0FBRWhCLElBQWEscUJBQXFCLEdBQWxDLE1BQWEscUJBQXFCO0lBRzlCLFlBQWdDLFFBQTRCO1FBQ3hELElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQ3pDLENBQUM7Q0FDSixDQUFBO0FBTlkscUJBQXFCO0lBRGpDLE1BQU07SUFJVSxXQUFBLGtCQUFrQixDQUFBO0dBSHRCLHFCQUFxQixDQU1qQztTQU5ZLHFCQUFxQiJ9
|
package/dist/factory.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { IModuleSettingsCollection, IServiceRegistration, ModuleInstanceOrConstructor } from "@shrub/core";
|
|
2
|
-
import { IExpressApplication } from "./
|
|
2
|
+
import { IExpressApplication } from "./app";
|
|
3
3
|
/** A factory class for registering modules within an Express application context. */
|
|
4
4
|
export declare class ExpressFactory {
|
|
5
5
|
private readonly modules;
|
package/dist/factory.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ExpressFactory = void 0;
|
|
4
4
|
const core_1 = require("@shrub/core");
|
|
5
|
+
const app_1 = require("./app");
|
|
5
6
|
const module_1 = require("./module");
|
|
6
7
|
/** A factory class for registering modules within an Express application context. */
|
|
7
8
|
class ExpressFactory {
|
|
@@ -29,7 +30,7 @@ class ExpressFactory {
|
|
|
29
30
|
.configureServices(this.configureCallback)
|
|
30
31
|
.useModules(this.modules);
|
|
31
32
|
this.settings.forEach(cur => loader.useSettings(cur));
|
|
32
|
-
return loader.load().then(modules => modules.services.get(
|
|
33
|
+
return loader.load().then(modules => modules.services.get(app_1.IExpressApplication));
|
|
33
34
|
}
|
|
34
35
|
configureServices(callback) {
|
|
35
36
|
const base = this.configureCallback;
|
|
@@ -49,4 +50,4 @@ class ExpressFactory {
|
|
|
49
50
|
}
|
|
50
51
|
}
|
|
51
52
|
exports.ExpressFactory = ExpressFactory;
|
|
52
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHNDQUF5SDtBQUN6SCwrQkFBNEM7QUFDNUMscUNBQXlDO0FBRXpDLHFGQUFxRjtBQUNyRixNQUFhLGNBQWM7SUFBM0I7UUFDcUIsWUFBTyxHQUFrQyxDQUFDLHNCQUFhLENBQUMsQ0FBQztRQUN6RCxhQUFRLEdBQWdDLEVBQUUsQ0FBQztRQUNwRCxzQkFBaUIsR0FBaUQsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0lBaUR2RixDQUFDO0lBOUNHLHNDQUFzQztJQUN0QyxNQUFNLENBQUMsTUFBTTtRQUNULE9BQU8sSUFBSSxjQUFjLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFFBQXNEO1FBQzNFLE9BQU8sSUFBSSxjQUFjLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFzQztRQUNwRCxPQUFPLElBQUksY0FBYyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQW1DO1FBQ2xELE9BQU8sSUFBSSxjQUFjLEVBQUUsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELDZIQUE2SDtJQUM3SCxNQUFNO1FBQ0YsTUFBTSxNQUFNLEdBQUcsSUFBSSxtQkFBWSxFQUFFO2FBQzVCLGlCQUFpQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQzthQUN6QyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTlCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RELE9BQU8sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLHlCQUFtQixDQUFDLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBRUQsaUJBQWlCLENBQUMsUUFBc0Q7UUFDcEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQ3BDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxZQUFZLENBQUMsRUFBRTtZQUNwQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxVQUFVLENBQUMsT0FBc0M7UUFDN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUM5QixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsV0FBVyxDQUFDLFFBQW1DO1FBQzNDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FDSjtBQXBERCx3Q0FvREMifQ==
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -10,8 +10,10 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
10
10
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
11
11
|
};
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
__exportStar(require("./app"), exports);
|
|
13
14
|
__exportStar(require("./controller"), exports);
|
|
15
|
+
__exportStar(require("./controller-invoker"), exports);
|
|
14
16
|
__exportStar(require("./factory"), exports);
|
|
15
17
|
__exportStar(require("./module"), exports);
|
|
16
18
|
__exportStar(require("./request-context"), exports);
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsd0NBQXNCO0FBQ3RCLCtDQUE2QjtBQUM3Qix1REFBcUM7QUFDckMsNENBQTBCO0FBQzFCLDJDQUF5QjtBQUN6QixvREFBa0MifQ==
|
package/dist/module.d.ts
CHANGED
|
@@ -1,18 +1,8 @@
|
|
|
1
1
|
import express from "express";
|
|
2
2
|
import { IModule, IModuleConfigurator, IModuleInitializer, IServiceRegistration } from "@shrub/core";
|
|
3
3
|
import { HttpModule } from "@shrub/http";
|
|
4
|
-
import { IRequestContextBuilderCallback } from "./request-context";
|
|
5
4
|
export declare const IExpressConfiguration: import("@shrub/core").IModuleConfigurationType<IExpressConfiguration>;
|
|
6
5
|
export interface IExpressConfiguration extends express.Application {
|
|
7
|
-
/**
|
|
8
|
-
* Registers a callback to use with the IRequestBuilder; the name of the builder is used
|
|
9
|
-
* as the name of the function that gets created on the IRequestBuilder and the callback
|
|
10
|
-
* is the function that will get invoked internally when called by an external user.
|
|
11
|
-
*/
|
|
12
|
-
useRequestBuilder(name: string, callback: IRequestContextBuilderCallback): void;
|
|
13
|
-
}
|
|
14
|
-
export declare const IExpressApplication: import("@shrub/core").IService<IExpressApplication>;
|
|
15
|
-
export interface IExpressApplication extends express.Application {
|
|
16
6
|
}
|
|
17
7
|
export declare class ExpressModule implements IModule {
|
|
18
8
|
readonly name = "express";
|
package/dist/module.js
CHANGED
|
@@ -3,60 +3,36 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.ExpressModule = exports.
|
|
6
|
+
exports.ExpressModule = exports.IExpressConfiguration = void 0;
|
|
7
7
|
const express_1 = __importDefault(require("express"));
|
|
8
8
|
const core_1 = require("@shrub/core");
|
|
9
9
|
const http_1 = require("@shrub/http");
|
|
10
|
+
const controller_invoker_1 = require("./controller-invoker");
|
|
10
11
|
const request_context_1 = require("./request-context");
|
|
12
|
+
const app_1 = require("./app");
|
|
11
13
|
exports.IExpressConfiguration = core_1.createConfig();
|
|
12
|
-
exports.IExpressApplication = core_1.createService("express-application");
|
|
13
14
|
class ExpressModule {
|
|
14
15
|
constructor() {
|
|
15
16
|
this.name = "express";
|
|
16
17
|
this.dependencies = [http_1.HttpModule];
|
|
17
18
|
}
|
|
18
19
|
initialize(init) {
|
|
19
|
-
init.config(exports.IExpressConfiguration).register(({ services }) => services.get(
|
|
20
|
+
init.config(exports.IExpressConfiguration).register(({ services }) => services.get(app_1.IExpressApplication));
|
|
20
21
|
}
|
|
21
22
|
configureServices(registration) {
|
|
22
|
-
registration.register(
|
|
23
|
+
registration.register(controller_invoker_1.IControllerInvokerService, controller_invoker_1.ControllerInvokerService);
|
|
23
24
|
registration.register(request_context_1.IRequestContextService, request_context_1.RequestContextService, { sealed: true });
|
|
24
|
-
registration.
|
|
25
|
-
registration.registerSingleton(exports.IExpressApplication, {
|
|
25
|
+
registration.registerSingleton(app_1.IExpressApplication, {
|
|
26
26
|
create: services => {
|
|
27
27
|
const app = express_1.default();
|
|
28
|
+
app.use(request_context_1.requestContext(services));
|
|
28
29
|
this.overrideListen(services, app);
|
|
29
|
-
app.use((req, res, next) => {
|
|
30
|
-
// use a scoped service collection for the request
|
|
31
|
-
const requestServices = services.createScope();
|
|
32
|
-
const requestContextService = requestServices.get(request_context_1.IRequestContextService);
|
|
33
|
-
const requestContextBuilder = requestServices.get(request_context_1.IRequestContextBuilder);
|
|
34
|
-
res.on("finish", () => requestServices.dispose());
|
|
35
|
-
// note: these properties need to be configurable to support express sub apps
|
|
36
|
-
// when loading a set of modules as an independent sub app the root app will
|
|
37
|
-
// have defined a context on the request but for sub apps we need to overwrite
|
|
38
|
-
// it using the context configured for this specific domain
|
|
39
|
-
Object.defineProperty(req, "context", {
|
|
40
|
-
configurable: true,
|
|
41
|
-
get() { return requestContextService.context; }
|
|
42
|
-
});
|
|
43
|
-
Object.defineProperty(req, "contextBuilder", {
|
|
44
|
-
configurable: true,
|
|
45
|
-
get() { return requestContextBuilder; }
|
|
46
|
-
});
|
|
47
|
-
next();
|
|
48
|
-
});
|
|
49
|
-
// the express app gets returned as the express configuration object so add the extended
|
|
50
|
-
// configuration functions to the express app here
|
|
51
|
-
app.useRequestBuilder = (name, callback) => {
|
|
52
|
-
services.get(request_context_1.IRequestContextBuilderRegistration).register(name, callback);
|
|
53
|
-
};
|
|
54
30
|
return app;
|
|
55
31
|
}
|
|
56
32
|
});
|
|
57
33
|
}
|
|
58
34
|
configure({ config, services }) {
|
|
59
|
-
config.get(http_1.IHttpModuleConfiguration).useRequestListener(services.get(
|
|
35
|
+
config.get(http_1.IHttpModuleConfiguration).useRequestListener(services.get(app_1.IExpressApplication));
|
|
60
36
|
}
|
|
61
37
|
overrideListen(services, app) {
|
|
62
38
|
// The express.listen function creates a new http.Server so this overrides
|
|
@@ -70,4 +46,4 @@ class ExpressModule {
|
|
|
70
46
|
}
|
|
71
47
|
}
|
|
72
48
|
exports.ExpressModule = ExpressModule;
|
|
73
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxzREFBOEI7QUFDOUIsc0NBQXVJO0FBQ3ZJLHNDQUFnRjtBQUNoRiw2REFBMkY7QUFDM0YsdURBQWtHO0FBQ2xHLCtCQUE0QztBQUUvQixRQUFBLHFCQUFxQixHQUFHLG1CQUFZLEVBQXlCLENBQUM7QUFJM0UsTUFBYSxhQUFhO0lBQTFCO1FBQ2EsU0FBSSxHQUFHLFNBQVMsQ0FBQztRQUNqQixpQkFBWSxHQUFHLENBQUMsaUJBQVUsQ0FBQyxDQUFDO0lBaUN6QyxDQUFDO0lBL0JHLFVBQVUsQ0FBQyxJQUF3QjtRQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLDZCQUFxQixDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQXdCLFFBQVEsQ0FBQyxHQUFHLENBQUMseUJBQW1CLENBQUMsQ0FBQyxDQUFDO0lBQzVILENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxZQUFrQztRQUNoRCxZQUFZLENBQUMsUUFBUSxDQUFDLDhDQUF5QixFQUFFLDZDQUF3QixDQUFDLENBQUM7UUFDM0UsWUFBWSxDQUFDLFFBQVEsQ0FBQyx3Q0FBc0IsRUFBRSx1Q0FBcUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZGLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyx5QkFBbUIsRUFBRTtZQUNoRCxNQUFNLEVBQUUsUUFBUSxDQUFDLEVBQUU7Z0JBQ2YsTUFBTSxHQUFHLEdBQUcsaUJBQU8sRUFBRSxDQUFDO2dCQUN0QixHQUFHLENBQUMsR0FBRyxDQUFDLGdDQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ25DLE9BQU8sR0FBRyxDQUFDO1lBQ2YsQ0FBQztTQUNKLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxTQUFTLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUF1QjtRQUMvQyxNQUFNLENBQUMsR0FBRyxDQUFDLCtCQUF3QixDQUFDLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyx5QkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUVPLGNBQWMsQ0FBQyxRQUE0QixFQUFFLEdBQW9CO1FBQ3JFLDBFQUEwRTtRQUMxRSxtRkFBbUY7UUFDbkYsNEVBQTRFO1FBQzVFLHNDQUFzQztRQUN0QyxHQUFHLENBQUMsTUFBTSxHQUFHLFNBQVMsTUFBTTtZQUN4QixNQUFNLE1BQU0sR0FBUSxRQUFRLENBQUMsR0FBRyxDQUFDLGtCQUFXLENBQUMsQ0FBQztZQUM5QyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUE7SUFDTCxDQUFDO0NBQ0o7QUFuQ0Qsc0NBbUNDIn0=
|
|
@@ -4,21 +4,22 @@ declare global {
|
|
|
4
4
|
interface Request {
|
|
5
5
|
/** Gets the current request context. */
|
|
6
6
|
readonly context: IRequestContext;
|
|
7
|
-
/** Gets the
|
|
8
|
-
readonly
|
|
7
|
+
/** Gets the scoped service collection for the request. */
|
|
8
|
+
readonly services: IServiceCollection;
|
|
9
9
|
}
|
|
10
10
|
}
|
|
11
11
|
}
|
|
12
12
|
/**
|
|
13
13
|
* Defines a context representing the current request.
|
|
14
|
-
*
|
|
15
|
-
* context
|
|
16
|
-
*
|
|
17
|
-
*
|
|
14
|
+
* It's recommended that express modules extend the request
|
|
15
|
+
* context instead of the express Request object. This helps
|
|
16
|
+
* avoid conflict with other libraries that extend express and
|
|
17
|
+
* also allows services outside of express middleware the ability
|
|
18
|
+
* to access the request context via the request context service.
|
|
18
19
|
*
|
|
19
20
|
* declare module "@shrub/express/dist/request-context" {
|
|
20
21
|
* interface IRequestContext {
|
|
21
|
-
*
|
|
22
|
+
* customProperty?: any;
|
|
22
23
|
* }
|
|
23
24
|
* }
|
|
24
25
|
*/
|
|
@@ -30,38 +31,6 @@ export interface IRequestContext {
|
|
|
30
31
|
/** A reference to the service collection available to the request. */
|
|
31
32
|
readonly services: IServiceCollection;
|
|
32
33
|
}
|
|
33
|
-
/**
|
|
34
|
-
* Defines a builder used to create/build request contexts.
|
|
35
|
-
* This is mainly useful when there is a need to build a
|
|
36
|
-
* request context outside of the express request pipeline.
|
|
37
|
-
* The express request pipeline uses the builder to construct
|
|
38
|
-
* the request context.
|
|
39
|
-
*
|
|
40
|
-
* Modules that extend the request context should also consider
|
|
41
|
-
* extending the request context builder. Note, it may not always
|
|
42
|
-
* be possible for a request context to exist outside the express
|
|
43
|
-
* request pipeline.
|
|
44
|
-
*
|
|
45
|
-
* declare module "@shrub/express/dist/request-context" {
|
|
46
|
-
* interface IRequestContextBuilder {
|
|
47
|
-
* addCustomProperty(...args): IRequestBuilder;
|
|
48
|
-
* }
|
|
49
|
-
* }
|
|
50
|
-
*
|
|
51
|
-
* Modules then should register the builder callback/function with the
|
|
52
|
-
* express module. See IRequestContextBuilderCallback for more details.
|
|
53
|
-
*/
|
|
54
|
-
export interface IRequestContextBuilder {
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Defines a request context builder callback that is registered with the express module.
|
|
58
|
-
* The first parameter is expected to be a request context and the rest of the parameters
|
|
59
|
-
* are expected to match the parameters for the function declared in the IRequestContextBuilder
|
|
60
|
-
* interface..
|
|
61
|
-
*/
|
|
62
|
-
export interface IRequestContextBuilderCallback {
|
|
63
|
-
(context: IRequestContext, ...args: any[]): IRequestContext;
|
|
64
|
-
}
|
|
65
34
|
export interface IRequestContextService {
|
|
66
35
|
readonly context: IRequestContext;
|
|
67
36
|
}
|
package/dist/request-context.js
CHANGED
|
@@ -9,43 +9,34 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
9
9
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.
|
|
12
|
+
exports.RequestContextService = exports.requestContext = exports.IRequestContextService = void 0;
|
|
13
13
|
const core_1 = require("@shrub/core");
|
|
14
|
-
/** @internal */
|
|
15
|
-
exports.IRequestContextBuilder = core_1.createService("request-context-builder");
|
|
16
|
-
/** @internal */
|
|
17
|
-
exports.IRequestContextBuilderRegistration = core_1.createService("request-context-registration");
|
|
18
14
|
exports.IRequestContextService = core_1.createService("request-context-service");
|
|
19
|
-
/** @internal */
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
15
|
+
/** @internal Express middleware that creates and installs the request context; the provided service collection should be the root collection in which a scoped collection will be created from. */
|
|
16
|
+
const requestContext = services => (req, res, next) => {
|
|
17
|
+
// use a scoped service collection for the request
|
|
18
|
+
const requestServices = services.createScope();
|
|
19
|
+
const requestContextService = requestServices.get(exports.IRequestContextService);
|
|
20
|
+
res.on("finish", () => requestServices.dispose());
|
|
21
|
+
// note: this needs to be configurable to support express sub apps
|
|
22
|
+
// when loading a set of modules as an independent sub app the root app will
|
|
23
|
+
// have defined a context on the request but for sub apps we need to overwrite
|
|
24
|
+
// it using the context configured for this specific domain
|
|
25
|
+
Object.defineProperty(req, "context", {
|
|
26
|
+
configurable: true,
|
|
27
|
+
get() { return requestContextService.context; }
|
|
28
|
+
});
|
|
29
|
+
Object.defineProperty(req, "services", {
|
|
30
|
+
configurable: true,
|
|
31
|
+
get() { return requestServices; }
|
|
32
|
+
});
|
|
33
|
+
next();
|
|
30
34
|
};
|
|
31
|
-
|
|
32
|
-
core_1.Singleton
|
|
33
|
-
], RequestContextBuilderRegistration);
|
|
34
|
-
exports.RequestContextBuilderRegistration = RequestContextBuilderRegistration;
|
|
35
|
-
// the request context service is responsible for holding a reference to the current request context
|
|
36
|
-
// and making it available publicly through the service
|
|
37
|
-
// the request builder is responsible for building/modifying the request context and is used by
|
|
38
|
-
// express middleware that handle extending the request context
|
|
35
|
+
exports.requestContext = requestContext;
|
|
39
36
|
/** @internal */
|
|
40
37
|
let RequestContextService = class RequestContextService {
|
|
41
38
|
constructor(services) {
|
|
42
|
-
this.
|
|
43
|
-
}
|
|
44
|
-
get context() {
|
|
45
|
-
return this.current;
|
|
46
|
-
}
|
|
47
|
-
setCurrentContext(current) {
|
|
48
|
-
this.current = current;
|
|
39
|
+
this.context = { bag: {}, services };
|
|
49
40
|
}
|
|
50
41
|
};
|
|
51
42
|
RequestContextService = __decorate([
|
|
@@ -53,24 +44,4 @@ RequestContextService = __decorate([
|
|
|
53
44
|
__param(0, core_1.IServiceCollection)
|
|
54
45
|
], RequestContextService);
|
|
55
46
|
exports.RequestContextService = RequestContextService;
|
|
56
|
-
|
|
57
|
-
let RequestContextBuilder = class RequestContextBuilder {
|
|
58
|
-
constructor(builders, service) {
|
|
59
|
-
const map = builders.getCallbacks();
|
|
60
|
-
// TODO: can this be more efficient? -- is there a better way than to loop through and copy each function?
|
|
61
|
-
// extend the current instance to include the registered builder callbacks
|
|
62
|
-
for (const name in map) {
|
|
63
|
-
this[name] = (...args) => {
|
|
64
|
-
service.setCurrentContext(map[name](service.context, ...args));
|
|
65
|
-
return this;
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
};
|
|
70
|
-
RequestContextBuilder = __decorate([
|
|
71
|
-
core_1.Scoped,
|
|
72
|
-
__param(0, exports.IRequestContextBuilderRegistration),
|
|
73
|
-
__param(1, exports.IRequestContextService)
|
|
74
|
-
], RequestContextBuilder);
|
|
75
|
-
exports.RequestContextBuilder = RequestContextBuilder;
|
|
76
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1jb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JlcXVlc3QtY29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxzQ0FBbUY7QUFvRm5GLGdCQUFnQjtBQUNILFFBQUEsc0JBQXNCLEdBQUcsb0JBQWEsQ0FBeUIseUJBQXlCLENBQUMsQ0FBQztBQUN2RyxnQkFBZ0I7QUFDSCxRQUFBLGtDQUFrQyxHQUFHLG9CQUFhLENBQXFDLDhCQUE4QixDQUFDLENBQUM7QUFDdkgsUUFBQSxzQkFBc0IsR0FBRyxvQkFBYSxDQUF5Qix5QkFBeUIsQ0FBQyxDQUFDO0FBRXZHLGdCQUFnQjtBQUVoQixJQUFhLGlDQUFpQyxHQUE5QyxNQUFhLGlDQUFpQztJQUE5QztRQUNxQixRQUFHLEdBQXVDLEVBQUUsQ0FBQztJQVNsRSxDQUFDO0lBUEcsWUFBWTtRQUNSLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNwQixDQUFDO0lBRUQsUUFBUSxDQUFDLElBQVksRUFBRSxRQUF3QztRQUMzRCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQztJQUM5QixDQUFDO0NBQ0osQ0FBQTtBQVZZLGlDQUFpQztJQUQ3QyxnQkFBUztHQUNHLGlDQUFpQyxDQVU3QztBQVZZLDhFQUFpQztBQVk5QyxvR0FBb0c7QUFDcEcsdURBQXVEO0FBRXZELCtGQUErRjtBQUMvRiwrREFBK0Q7QUFFL0QsZ0JBQWdCO0FBRWhCLElBQWEscUJBQXFCLEdBQWxDLE1BQWEscUJBQXFCO0lBRzlCLFlBQWdDLFFBQTRCO1FBQ3hELElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDUCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEIsQ0FBQztJQUVELGlCQUFpQixDQUFDLE9BQXdCO1FBQ3RDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQzNCLENBQUM7Q0FDSixDQUFBO0FBZFkscUJBQXFCO0lBRGpDLGFBQU07SUFJVSxXQUFBLHlCQUFrQixDQUFBO0dBSHRCLHFCQUFxQixDQWNqQztBQWRZLHNEQUFxQjtBQWdCbEMsZ0JBQWdCO0FBRWhCLElBQWEscUJBQXFCLEdBQWxDLE1BQWEscUJBQXFCO0lBQzlCLFlBQ3dDLFFBQTRDLEVBQ3hELE9BQThCO1FBQ2xELE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVwQywwR0FBMEc7UUFDMUcsMEVBQTBFO1FBQzFFLEtBQUssTUFBTSxJQUFJLElBQUksR0FBRyxFQUFFO1lBQ2QsSUFBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFXLEVBQUUsRUFBRTtnQkFDbkMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDL0QsT0FBTyxJQUFJLENBQUM7WUFDaEIsQ0FBQyxDQUFDO1NBQ0w7SUFDVCxDQUFDO0NBQ0osQ0FBQTtBQWZZLHFCQUFxQjtJQURqQyxhQUFNO0lBR0UsV0FBQSwwQ0FBa0MsQ0FBQTtJQUNsQyxXQUFBLDhCQUFzQixDQUFBO0dBSGxCLHFCQUFxQixDQWVqQztBQWZZLHNEQUFxQiJ9
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1jb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JlcXVlc3QtY29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxzQ0FBd0U7QUF1QzNELFFBQUEsc0JBQXNCLEdBQUcsb0JBQWEsQ0FBeUIseUJBQXlCLENBQUMsQ0FBQztBQUV2RyxtTUFBbU07QUFDNUwsTUFBTSxjQUFjLEdBQXFELFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFO0lBQzNHLGtEQUFrRDtJQUNsRCxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDL0MsTUFBTSxxQkFBcUIsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLDhCQUFzQixDQUFDLENBQUM7SUFFMUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFFbEQsa0VBQWtFO0lBQ2xFLDRFQUE0RTtJQUM1RSw4RUFBOEU7SUFDOUUsMkRBQTJEO0lBQzNELE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRTtRQUNsQyxZQUFZLEVBQUUsSUFBSTtRQUNsQixHQUFHLEtBQUssT0FBTyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0tBQ2xELENBQUMsQ0FBQztJQUVILE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRTtRQUNuQyxZQUFZLEVBQUUsSUFBSTtRQUNsQixHQUFHLEtBQUssT0FBTyxlQUFlLENBQUMsQ0FBQyxDQUFDO0tBQ3BDLENBQUMsQ0FBQztJQUVILElBQUksRUFBRSxDQUFDO0FBQ1gsQ0FBQyxDQUFDO0FBdEJXLFFBQUEsY0FBYyxrQkFzQnpCO0FBRUYsZ0JBQWdCO0FBRWhCLElBQWEscUJBQXFCLEdBQWxDLE1BQWEscUJBQXFCO0lBRzlCLFlBQWdDLFFBQTRCO1FBQ3hELElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQ3pDLENBQUM7Q0FDSixDQUFBO0FBTlkscUJBQXFCO0lBRGpDLGFBQU07SUFJVSxXQUFBLHlCQUFrQixDQUFBO0dBSHRCLHFCQUFxQixDQU1qQztBQU5ZLHNEQUFxQiJ9
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shrub/express",
|
|
3
3
|
"description": "A module that adds support for Express based apps.",
|
|
4
|
-
"version": "0.5.
|
|
4
|
+
"version": "0.5.35",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -25,12 +25,12 @@
|
|
|
25
25
|
"test": "jest"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@shrub/core": "0.5.
|
|
29
|
-
"@shrub/http": "0.5.
|
|
28
|
+
"@shrub/core": "0.5.35",
|
|
29
|
+
"@shrub/http": "0.5.35",
|
|
30
30
|
"express": "^4.17.1"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@types/express": "4.17.9"
|
|
34
34
|
},
|
|
35
|
-
"gitHead": "
|
|
35
|
+
"gitHead": "c10d4d9a1aa5f28454b4921e1bb5887abd9447b1"
|
|
36
36
|
}
|