@shrub/express 0.5.31 → 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 ADDED
@@ -0,0 +1,4 @@
1
+ import { Application } from "express";
2
+ export declare const IExpressApplication: import("@shrub/core").IService<IExpressApplication>;
3
+ export interface IExpressApplication extends Application {
4
+ }
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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
@@ -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 useController<T>(ctor: Constructor<T>): RequestHandler;
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
@@ -1,24 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createRouteDecorator = exports.useController = exports.Put = exports.Post = exports.Patch = exports.Get = exports.Delete = exports.Route = void 0;
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 useController(ctor) {
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.useController = useController;
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], routeHandler(target, propertyKey));
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFDQUFpRDtBQUVqRCxzQ0FBb0Q7QUFhcEQsTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUFDO0FBQ3JDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQztBQUM3QixNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUM7QUFFN0IsTUFBTSxZQUFZLEdBQXdELENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFO0lBQ2pILE1BQU0sVUFBVSxHQUFTLEdBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM3QyxJQUFJLENBQUMsVUFBVSxFQUFFO1FBQ2IsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsZUFBZSxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksNEJBQTRCLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7S0FDekc7SUFFRCxNQUFNLE9BQU8sR0FBbUIsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3hELElBQUksQ0FBQyxPQUFPLEVBQUU7UUFDVixPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQywyQkFBMkIsV0FBVyw4QkFBOEIsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7S0FDMUg7SUFFRCxnSUFBZ0k7SUFDaEksMkZBQTJGO0lBQzNGLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3RGLENBQUMsQ0FBQztBQUVGLCtGQUErRjtB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
101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHNDQUFvRDtBQUNwRCxxQ0FBaUQ7QUFjakQsTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUFDO0FBQ3JDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQztBQUM3QixNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUM7QUFFN0IsK0ZBQStGO0FBQ3hGLE1BQU0sS0FBSyxHQUFvQjtJQUNsQyxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsTUFBTSxJQUFJLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDL0YsTUFBTSxRQUFRLEdBQUcsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTNGLE9BQU8sVUFBVSxJQUFjO1FBQzNCLHVFQUF1RTtRQUN2RSxNQUFNLEdBQUcsR0FBVyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDTixNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztTQUN6RTtRQUVELE1BQU0sTUFBTSxHQUFHLGdCQUFNLEVBQUUsQ0FBQztRQUV4QixJQUFJLElBQUksRUFBRTtZQUNOLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsUUFBUSxFQUFFLGdCQUFnQixDQUFtQixJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUNoRjthQUNJO1lBQ0QsTUFBTSxDQUFDLEdB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
@@ -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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
@@ -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 useController(ctor) {
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], routeHandler(target, propertyKey));
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBa0IsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWpELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQWFwRCxNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUM7QUFDckMsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDO0FBQzdCLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQztBQUU3QixNQUFNLFlBQVksR0FBd0QsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUU7SUFDakgsTUFBTSxVQUFVLEdBQVMsR0FBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzdDLElBQUksQ0FBQyxVQUFVLEVBQUU7UUFDYixPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxlQUFlLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSw0QkFBNEIsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztLQUN6RztJQUVELE1BQU0sT0FBTyxHQUFtQixVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDeEQsSUFBSSxDQUFDLE9BQU8sRUFBRTtRQUNWLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLDJCQUEyQixXQUFXLDhCQUE4QixLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztLQUMxSDtJQUVELGdJQUFnSTtJQUNoSSwyRkFBMkY7SUFDM0YsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMs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
90
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNwRCxPQUFPLEVBQWtCLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQWNqRCxNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUM7QUFDckMsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDO0FBQzdCLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQztBQUU3QiwrRkFBK0Y7QUFDL0YsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFvQjtJQUNsQyxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsTUFBTSxJQUFJLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDL0YsTUFBTSxRQUFRLEdBQUcsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTNGLE9BQU8sVUFBVSxJQUFjO1FBQzNCLHVFQUF1RTtRQUN2RSxNQUFNLEdBQUcsR0FBVyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDTixNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztTQUN6RTtRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxDQUFDO1FBRXhCLElBQUksSUFBSSxFQUFFO1lBQ04sTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxRQUFRLEVBQUUsZ0JB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
@@ -1,5 +1,6 @@
1
1
  import { ModuleLoader } from "@shrub/core";
2
- import { ExpressModule, IExpressApplication } from "./module";
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0YsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pILE9BQU8sRUFBRSxhQUFhLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFOUQscUZBQXFGO0FBQ3JGLE1BQU0sT0FBTyxjQUFjO0lBQTNCO1FBQ3FCLFlBQU8sR0FBa0MsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN6RCxhQUFRLEdBQWdDLEVBQUUsQ0FBQztRQUNwRCxzQkFBaUIsR0FBaUQsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0lBaUR2RixDQUFDO0lBOUNHLHNDQUFzQztJQUN0QyxNQUFNLENBQUMsTUFBTTtRQUNULE9BQU8sSUFBSSxjQUFjLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFFBQXNEO1FBQzNFLE9BQU8sSUFBSSxjQUFjLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFzQztRQUNwRCxPQUFPLElBQUksY0FBYyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQW1DO1FBQ2xELE9BQU8sSUFBSSxjQUFjLEVBQUUsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELDZIQUE2SDtJQUM3SCxNQUFNO1FBQ0YsTUFBTSxNQUFNLEdBQUcsSUFBSSxZQUFZLEVBQUU7YUFDNUIsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO2FBQ3pDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEQsT0FBTyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxRQUFzRDtRQUNwRSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDcEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFlBQVksQ0FBQyxFQUFFO1lBQ3BDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdkIsQ0FBQyxDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELFVBQVUsQ0FBQyxPQUFzQztRQUM3QyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBQzlCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxXQUFXLENBQUMsUUFBbUM7UUFDM0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0IsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztDQUNKIn0=
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYyxtQkFBbUIsQ0FBQyJ9
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxPQUFPLENBQUM7QUFDdEIsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLFdBQVcsQ0FBQztBQUMxQixjQUFjLFVBQVUsQ0FBQztBQUN6QixjQUFjLG1CQUFtQixDQUFDIn0=
@@ -1,9 +1,10 @@
1
1
  import express from "express";
2
- import { createConfig, createService } from "@shrub/core";
2
+ import { createConfig } from "@shrub/core";
3
3
  import { HttpModule, IHttpModuleConfiguration, IHttpServer } from "@shrub/http";
4
- import { IRequestContextBuilder, IRequestContextBuilderRegistration, IRequestContextService, RequestContextBuilder, RequestContextBuilderRegistration, RequestContextService } from "./request-context";
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(IRequestContextBuilderRegistration, RequestContextBuilderRegistration);
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQThGLE1BQU0sYUFBYSxDQUFDO0FBQ3RKLE9BQU8sRUFBRSxVQUFVLEVBQUUsd0JBQXdCLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2hGLE9BQU8sRUFDSCxzQkFBc0IsRUFBa0Msa0NBQWtDLEVBQUUsc0JBQXNCLEVBQ2xILHFCQUFxQixFQUFFLGlDQUFpQyxFQUFFLHFCQUFxQixFQUNsRixNQUFNLG1CQUFtQixDQUFDO0FBRTNCLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLFlBQVksRUFBeUIsQ0FBQztBQVUzRSxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxhQUFhLENBQXNCLHFCQUFxQixDQUFDLENBQUM7QUFJN0YsTUFBTSxPQUFPLGFBQWE7SUFBMUI7UUFDYSxTQUFJLEdBQUcsU0FBUyxDQUFDO1FBQ2pCLGlCQUFZLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQWtFekMsQ0FBQztJQWhFRyxVQUFVLENBQUMsSUFBd0I7UUFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUF3QixRQUFRLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztJQUM1SCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsWUFBa0M7UUFDaEQsWUFBWSxDQUFDLFFBQVEsQ0FBQyxrQ0FBa0MsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBQzdGLFlBQVksQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEVBQUUscUJBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN2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
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, Singleton } from "@shrub/core";
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
- let RequestContextBuilderRegistration = class RequestContextBuilderRegistration {
18
- constructor() {
19
- this.map = {};
20
- }
21
- getCallbacks() {
22
- return this.map;
23
- }
24
- register(name, callback) {
25
- this.map[name] = callback;
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.current = { bag: {}, services };
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
- /** @internal */
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 "./module";
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(module_1.IExpressApplication));
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHNDQUF5SDtBQUN6SCxxQ0FBOEQ7QUFFOUQscUZBQXFGO0FBQ3JGLE1BQWEsY0FBYztJQUEzQjtRQUNxQixZQUFPLEdBQWtDLENBQUMsc0JBQWEsQ0FBQyxDQUFDO1FBQ3pELGFBQVEsR0FBZ0MsRUFBRSxDQUFDO1FBQ3BELHNCQUFpQixHQUFpRCxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7SUFpRHZGLENBQUM7SUE5Q0csc0NBQXNDO0lBQ3RDLE1BQU0sQ0FBQyxNQUFNO1FBQ1QsT0FBTyxJQUFJLGNBQWMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFFRCxNQUFNLENBQUMsaUJBQWlCLENBQUMsUUFBc0Q7UUFDM0UsT0FBTyxJQUFJLGNBQWMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQXNDO1FBQ3BELE9BQU8sSUFBSSxjQUFjLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBbUM7UUFDbEQsT0FBTyxJQUFJLGNBQWMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsNkhBQTZIO0lBQzdILE1BQU07UUFDRixNQUFNLE1BQU0sR0FBRyxJQUFJLG1CQUFZLEVBQUU7YUFDNUIsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO2FBQ3pDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEQsT0FBTyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsNEJBQW1CLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxRQUFzRDtRQUNwRSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDcEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFlBQVksQ0FBQyxFQUFFO1lBQ3BDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdkIsQ0FBQyxDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELFVBQVUsQ0FBQyxPQUFzQztRQUM3QyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBQzlCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxXQUFXLENBQUMsUUFBbUM7UUFDM0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0IsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztDQUNKO0FBcERELHdDQW9EQyJ9
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHNDQUF5SDtBQUN6SCwrQkFBNEM7QUFDNUMscUNBQXlDO0FBRXpDLHFGQUFxRjtBQUNyRixNQUFhLGNBQWM7SUFBM0I7UUFDcUIsWUFBTyxHQUFrQyxDQUFDLHNCQUFhLENBQUMsQ0FBQztRQUN6RCxhQUFRLEdBQWdDLEVBQUUsQ0FBQztRQUNwRCxzQkFBaUIsR0FBaUQsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0lBaUR2RixDQUFDO0lBOUNHLHNDQUFzQztJQUN0QyxNQUFNLENBQUMsTUFBTTtRQUNULE9BQU8sSUFBSSxjQUFjLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFFBQXNEO1FBQzNFLE9BQU8sSUFBSSxjQUFjLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFzQztRQUNwRCxPQUFPLElBQUksY0FBYyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQW1DO1FBQ2xELE9BQU8sSUFBSSxjQUFjLEVBQUUsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELDZIQUE2SDtJQUM3SCxNQUFNO1FBQ0YsTUFBTSxNQUFNLEdBQUcsSUFBSSxtQkFBWSxFQUFFO2FBQzVCLGlCQUFpQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQzthQUN6QyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTlCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RELE9BQU8sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLHlCQUFtQixDQUFDLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBRUQsaUJBQWlCLENBQUMsUUFBc0Q7UUFDcEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQ3BDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxZQUFZLENBQUMsRUFBRTtZQUNwQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxVQUFVLENBQUMsT0FBc0M7UUFDN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUM5QixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsV0FBVyxDQUFDLFFBQW1DO1FBQzNDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FDSjtBQXBERCx3Q0FvREMifQ==
package/dist/index.d.ts CHANGED
@@ -1,4 +1,6 @@
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";
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsK0NBQTZCO0FBQzdCLDRDQUEwQjtBQUMxQiwyQ0FBeUI7QUFDekIsb0RBQWtDIn0=
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.IExpressApplication = exports.IExpressConfiguration = void 0;
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(exports.IExpressApplication));
20
+ init.config(exports.IExpressConfiguration).register(({ services }) => services.get(app_1.IExpressApplication));
20
21
  }
21
22
  configureServices(registration) {
22
- registration.register(request_context_1.IRequestContextBuilderRegistration, request_context_1.RequestContextBuilderRegistration);
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.register(request_context_1.IRequestContextBuilder, request_context_1.RequestContextBuilder, { sealed: true });
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(exports.IExpressApplication));
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxzREFBOEI7QUFDOUIsc0NBQXNKO0FBQ3RKLHNDQUFnRjtBQUNoRix1REFHMkI7QUFFZCxRQUFBLHFCQUFxQixHQUFHLG1CQUFZLEVBQXlCLENBQUM7QUFVOUQsUUFBQSxtQkFBbUIsR0FBRyxvQkFBYSxDQUFzQixxQkFBcUIsQ0FBQyxDQUFDO0FBSTdGLE1BQWEsYUFBYTtJQUExQjtRQUNhLFNBQUksR0FBRyxTQUFTLENBQUM7UUFDakIsaUJBQVksR0FBRyxDQUFDLGlCQUFVLENBQUMsQ0FBQztJQWtFekMsQ0FBQztJQWhFRyxVQUFVLENBQUMsSUFBd0I7UUFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyw2QkFBcUIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUF3QixRQUFRLENBQUMsR0FBRyxDQUFDLDJCQUFtQixDQUFDLENBQUMsQ0FBQztJQUM1SCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsWUFBa0M7UUFDaEQsWUFBWSxDQUFDLFFBQVEsQ0FBQyxvREFBa0MsRUFBRSxtREFBaUMsQ0FBQyxDQUFDO1FBQzdGLFlBQVksQ0FBQyxRQUFRLENBQUMsd0NBQXNCLEVBQUUsdUNBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN2RixZQUFZLENBQUMsUUFBUSxDQUFDLHdDQUFzQixFQUFFLHVDQUFxQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFdkYsWUFBWSxDQUFDLGlCQUFpQixDQUFDLDJCQUFtQixFQUFFO1lBQ2hELE1BQU0sRUFBRSxRQUFRLENBQUMsRUFBRTtnQkFDZixNQUFNLEdBQUcsR0FBRyxpQkFBTyxFQUFFLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUVuQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRTtvQkFDdkIsa0RBQWtEO29CQUNsRCxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQy9DLE1BQU0scUJBQXFCLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyx3Q0FBc0IsQ0FBQyxDQUFDO29CQUMxRSxNQUFNLHFCQUFxQixHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsd0NBQXNCLENBQUMsQ0FBQztvQkFFMUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7b0JBRWxELDZFQUE2RTtvQkFDN0UsNEVBQTRFO29CQUM1RSw4RUFBOEU7b0JBQzlFLDJEQUEyRDtvQkFDM0QsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFO3dCQUNsQyxZQUFZLEVBQUUsSUFBSTt3QkFDbEIsR0FBRyxLQUFLLE9BQU8scUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztxQkFDbEQsQ0FBQyxDQUFDO29CQUVILE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLGdCQUFnQixFQUFFO3dCQUN6QyxZQUFZLEVBQUUsSUFBSTt3QkFDbEIsR0FBRyxLQUFLLE9BQU8scUJBQXFCLENBQUMsQ0FBQyxDQUFDO3FCQUMxQyxDQUFDLENBQUM7b0JBRUgsSUFBSSxFQUFFLENBQUM7Z0JBQ1gsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsd0ZBQXdGO2dCQUN4RixrREFBa0Q7Z0JBQ3BCLEdBQUssQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRTtvQkFDdkUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxvREFBa0MsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQzlFLENBQUMsQ0FBQztnQkFFRixPQUFPLEdBQUcsQ0FBQztZQUNmLENBQUM7U0FDSixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsU0FBUyxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBdUI7UUFDL0MsTUFBTSxDQUFDLEdBQUcsQ0FBQywrQkFBd0IsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsMkJBQW1CLENBQUMsQ0FBQyxDQUFDO0lBQy9GLENBQUM7SUFFTyxjQUFjLENBQUMsUUFBNEIsRUFBRSxHQUFvQjtRQUNyRSwwRUFBMEU7UUFDMUUsbUZBQW1GO1FBQ25GLDRFQUE0RTtRQUM1RSxzQ0FBc0M7UUFDdEMsR0FBRyxDQUFDLE1BQU0sR0FBRyxTQUFTLE1BQU07WUFDeEIsTUFBTSxNQUFNLEdBQVEsUUFBUSxDQUFDLEdBQUcsQ0FBQyxrQkFBVyxDQUFDLENBQUM7WUFDOUMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFBO0lBQ0wsQ0FBQztDQUNKO0FBcEVELHNDQW9FQyJ9
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 builder for the current request context. This is intended for use by upstream middleware to extend the request context and should not be used directly. */
8
- readonly contextBuilder: IRequestContextBuilder;
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
- * All express modules that want to extend a request
15
- * context should register a request context builder instead
16
- * of trying to extend the express Request object. This helps
17
- * avoid conflict with other libraries that extend express.
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
- * readonly customProperty?: any;
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
  }
@@ -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.RequestContextBuilder = exports.RequestContextService = exports.RequestContextBuilderRegistration = exports.IRequestContextService = exports.IRequestContextBuilderRegistration = exports.IRequestContextBuilder = void 0;
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
- let RequestContextBuilderRegistration = class RequestContextBuilderRegistration {
21
- constructor() {
22
- this.map = {};
23
- }
24
- getCallbacks() {
25
- return this.map;
26
- }
27
- register(name, callback) {
28
- this.map[name] = callback;
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
- RequestContextBuilderRegistration = __decorate([
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.current = { bag: {}, services };
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
- /** @internal */
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.31",
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.31",
29
- "@shrub/http": "0.5.31",
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": "abeed709101e03dccc83d7f43eab20e1270d72d8"
35
+ "gitHead": "c10d4d9a1aa5f28454b4921e1bb5887abd9447b1"
36
36
  }