@tsed/platform-express 7.0.0-beta.2 → 7.0.0-beta.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/coverage.json +6 -0
  2. package/jest.config.js +9 -0
  3. package/lib/cjs/components/PlatformExpress.js +126 -66
  4. package/lib/cjs/components/PlatformExpress.js.map +1 -1
  5. package/lib/cjs/exports.js +7 -0
  6. package/lib/cjs/exports.js.map +1 -0
  7. package/lib/cjs/index.js +9 -12
  8. package/lib/cjs/index.js.map +1 -1
  9. package/lib/cjs/interfaces/PlatformExpressSettings.js.map +1 -1
  10. package/lib/cjs/interfaces/interfaces.js +3 -0
  11. package/lib/cjs/interfaces/interfaces.js.map +1 -0
  12. package/lib/cjs/middlewares/staticsMiddleware.js +1 -1
  13. package/lib/cjs/middlewares/staticsMiddleware.js.map +1 -1
  14. package/lib/cjs/package.json +3 -0
  15. package/lib/esm/components/PlatformExpress.js +126 -48
  16. package/lib/esm/components/PlatformExpress.js.map +1 -1
  17. package/lib/esm/exports.js +5 -0
  18. package/lib/esm/exports.js.map +1 -0
  19. package/lib/esm/index.js +9 -12
  20. package/lib/esm/index.js.map +1 -1
  21. package/lib/esm/interfaces/PlatformExpressSettings.js.map +1 -1
  22. package/lib/esm/interfaces/interfaces.js +2 -0
  23. package/lib/esm/interfaces/interfaces.js.map +1 -0
  24. package/lib/esm/package.json +3 -0
  25. package/lib/types/components/PlatformExpress.d.ts +40 -22
  26. package/lib/types/exports.d.ts +1 -0
  27. package/lib/types/index.d.ts +8 -3
  28. package/lib/types/interfaces/PlatformExpressSettings.d.ts +15 -1
  29. package/lib/types/interfaces/{index.d.ts → interfaces.d.ts} +6 -4
  30. package/package.json +64 -26
  31. package/readme.md +3 -4
  32. package/tsconfig.compile.esm.json +1 -12
  33. package/lib/cjs/decorators/caseSensitive.js +0 -31
  34. package/lib/cjs/decorators/caseSensitive.js.map +0 -1
  35. package/lib/cjs/decorators/index.js +0 -8
  36. package/lib/cjs/decorators/index.js.map +0 -1
  37. package/lib/cjs/decorators/mergeParams.js +0 -31
  38. package/lib/cjs/decorators/mergeParams.js.map +0 -1
  39. package/lib/cjs/decorators/routerSettings.js +0 -32
  40. package/lib/cjs/decorators/routerSettings.js.map +0 -1
  41. package/lib/cjs/decorators/strict.js +0 -31
  42. package/lib/cjs/decorators/strict.js.map +0 -1
  43. package/lib/cjs/interfaces/index.js +0 -6
  44. package/lib/cjs/interfaces/index.js.map +0 -1
  45. package/lib/cjs/middlewares/rawBodyMiddleware.js +0 -27
  46. package/lib/cjs/middlewares/rawBodyMiddleware.js.map +0 -1
  47. package/lib/cjs/services/PlatformExpressApplication.js +0 -32
  48. package/lib/cjs/services/PlatformExpressApplication.js.map +0 -1
  49. package/lib/cjs/services/PlatformExpressHandler.js +0 -31
  50. package/lib/cjs/services/PlatformExpressHandler.js.map +0 -1
  51. package/lib/cjs/services/PlatformExpressRequest.js +0 -12
  52. package/lib/cjs/services/PlatformExpressRequest.js.map +0 -1
  53. package/lib/cjs/services/PlatformExpressResponse.js +0 -12
  54. package/lib/cjs/services/PlatformExpressResponse.js.map +0 -1
  55. package/lib/cjs/services/PlatformExpressRouter.js +0 -34
  56. package/lib/cjs/services/PlatformExpressRouter.js.map +0 -1
  57. package/lib/cjs/services/index.js +0 -9
  58. package/lib/cjs/services/index.js.map +0 -1
  59. package/lib/esm/decorators/caseSensitive.js +0 -27
  60. package/lib/esm/decorators/caseSensitive.js.map +0 -1
  61. package/lib/esm/decorators/index.js +0 -5
  62. package/lib/esm/decorators/index.js.map +0 -1
  63. package/lib/esm/decorators/mergeParams.js +0 -27
  64. package/lib/esm/decorators/mergeParams.js.map +0 -1
  65. package/lib/esm/decorators/routerSettings.js +0 -28
  66. package/lib/esm/decorators/routerSettings.js.map +0 -1
  67. package/lib/esm/decorators/strict.js +0 -27
  68. package/lib/esm/decorators/strict.js.map +0 -1
  69. package/lib/esm/interfaces/index.js +0 -3
  70. package/lib/esm/interfaces/index.js.map +0 -1
  71. package/lib/esm/middlewares/rawBodyMiddleware.js +0 -22
  72. package/lib/esm/middlewares/rawBodyMiddleware.js.map +0 -1
  73. package/lib/esm/services/PlatformExpressApplication.js +0 -29
  74. package/lib/esm/services/PlatformExpressApplication.js.map +0 -1
  75. package/lib/esm/services/PlatformExpressHandler.js +0 -27
  76. package/lib/esm/services/PlatformExpressHandler.js.map +0 -1
  77. package/lib/esm/services/PlatformExpressRequest.js +0 -8
  78. package/lib/esm/services/PlatformExpressRequest.js.map +0 -1
  79. package/lib/esm/services/PlatformExpressResponse.js +0 -8
  80. package/lib/esm/services/PlatformExpressResponse.js.map +0 -1
  81. package/lib/esm/services/PlatformExpressRouter.js +0 -31
  82. package/lib/esm/services/PlatformExpressRouter.js.map +0 -1
  83. package/lib/esm/services/index.js +0 -6
  84. package/lib/esm/services/index.js.map +0 -1
  85. package/lib/types/decorators/caseSensitive.d.ts +0 -23
  86. package/lib/types/decorators/index.d.ts +0 -4
  87. package/lib/types/decorators/mergeParams.d.ts +0 -23
  88. package/lib/types/decorators/routerSettings.d.ts +0 -24
  89. package/lib/types/decorators/strict.d.ts +0 -23
  90. package/lib/types/middlewares/rawBodyMiddleware.d.ts +0 -4
  91. package/lib/types/services/PlatformExpressApplication.d.ts +0 -24
  92. package/lib/types/services/PlatformExpressHandler.d.ts +0 -9
  93. package/lib/types/services/PlatformExpressRequest.d.ts +0 -22
  94. package/lib/types/services/PlatformExpressResponse.d.ts +0 -14
  95. package/lib/types/services/PlatformExpressRouter.d.ts +0 -18
  96. package/lib/types/services/index.d.ts +0 -5
package/coverage.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "statements": 100,
3
+ "branches": 80.64,
4
+ "functions": 100,
5
+ "lines": 100
6
+ }
package/jest.config.js ADDED
@@ -0,0 +1,9 @@
1
+ // For a detailed explanation regarding each configuration property, visit:
2
+ // https://jestjs.io/docs/en/configuration.html
3
+
4
+ module.exports = {
5
+ ...require("@tsed/jest-config")(__dirname, "platform-express"),
6
+ coverageThreshold: {
7
+ global: require("./coverage.json")
8
+ }
9
+ };
@@ -1,58 +1,23 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
- }) : (function(o, m, k, k2) {
6
- if (k2 === undefined) k2 = k;
7
- o[k2] = m[k];
8
- }));
9
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
- Object.defineProperty(o, "default", { enumerable: true, value: v });
11
- }) : function(o, v) {
12
- o["default"] = v;
13
- });
14
- var __importStar = (this && this.__importStar) || function (mod) {
15
- if (mod && mod.__esModule) return mod;
16
- var result = {};
17
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
- __setModuleDefault(result, mod);
19
- return result;
20
- };
21
2
  Object.defineProperty(exports, "__esModule", { value: true });
22
3
  exports.PlatformExpress = void 0;
4
+ const tslib_1 = require("tslib");
23
5
  const common_1 = require("@tsed/common");
24
6
  const core_1 = require("@tsed/core");
25
- const rawBodyMiddleware_1 = require("../middlewares/rawBodyMiddleware");
26
- const services_1 = require("../services");
7
+ const express_1 = tslib_1.__importDefault(require("express"));
8
+ const util_1 = require("util");
9
+ const staticsMiddleware_1 = require("../middlewares/staticsMiddleware");
27
10
  /**
28
11
  * @platform
29
12
  * @express
30
13
  */
31
14
  class PlatformExpress {
32
- constructor(platform) {
33
- this.platform = platform;
34
- this.providers = [
35
- {
36
- provide: common_1.PlatformApplication,
37
- useClass: services_1.PlatformExpressApplication
38
- },
39
- {
40
- provide: common_1.PlatformRouter,
41
- useClass: services_1.PlatformExpressRouter
42
- },
43
- {
44
- provide: common_1.PlatformHandler,
45
- useClass: services_1.PlatformExpressHandler
46
- },
47
- {
48
- provide: common_1.PlatformResponse,
49
- useClass: services_1.PlatformExpressResponse
50
- },
51
- {
52
- provide: common_1.PlatformRequest,
53
- useClass: services_1.PlatformExpressRequest
54
- }
55
- ];
15
+ injector;
16
+ providers = [];
17
+ #multer;
18
+ constructor(injector) {
19
+ this.injector = injector;
20
+ Promise.resolve().then(() => tslib_1.__importStar(require("multer"))).then(({ default: multer }) => (this.#multer = multer));
56
21
  }
57
22
  /**
58
23
  * Create new serverless application. In this mode, the component scan are disabled.
@@ -76,48 +41,143 @@ class PlatformExpress {
76
41
  adapter: PlatformExpress
77
42
  });
78
43
  }
79
- useRouter() {
80
- const { logger, app } = this.platform;
81
- logger.debug("Mount app router");
82
- app.getApp().use(rawBodyMiddleware_1.rawBodyMiddleware);
83
- app.getApp().use(app.getRouter());
84
- return this;
44
+ onInit() {
45
+ const middlewares = this.injector.settings.get("middlewares", []);
46
+ this.injector.settings.set("middlewares", middlewares.filter((middleware) => {
47
+ const name = (0, core_1.nameOf)(middleware);
48
+ if (["textParser", "jsonParser", "rawParser", "urlencodedParser"].includes(name)) {
49
+ this.injector.settings.set(`express.bodyParser.${name.replace("Parser", "")}`, () => middleware);
50
+ return false;
51
+ }
52
+ return true;
53
+ }));
85
54
  }
86
55
  async beforeLoadRoutes() {
87
- const { injector, app } = this.platform;
56
+ const injector = this.injector;
57
+ const app = this.injector.get(common_1.PlatformApplication);
88
58
  // disable x-powered-by header
89
59
  injector.settings.get("env") === core_1.Env.PROD && app.getApp().disable("x-powered-by");
90
60
  await this.configureViewsEngine();
91
61
  }
92
62
  async afterLoadRoutes() {
93
- const { injector, app } = this.platform;
63
+ const app = this.injector.get(common_1.PlatformApplication);
64
+ const platformExceptions = this.injector.get(common_1.PlatformExceptions);
94
65
  // NOT FOUND
95
66
  app.use((req, res, next) => {
96
- var _a;
97
- !res.headersSent && ((_a = injector.get(common_1.PlatformExceptions)) === null || _a === void 0 ? void 0 : _a.resourceNotFound(req.$ctx));
67
+ const { $ctx } = req;
68
+ !$ctx.isDone() && platformExceptions?.resourceNotFound(req.$ctx);
98
69
  });
99
70
  // EXCEPTION FILTERS
100
71
  app.use((err, req, res, next) => {
101
- var _a;
102
- !res.headersSent && ((_a = injector.get(common_1.PlatformExceptions)) === null || _a === void 0 ? void 0 : _a.catch(err, req.$ctx));
72
+ const { $ctx } = req;
73
+ !$ctx.isDone() && platformExceptions?.catch(err, $ctx);
74
+ });
75
+ }
76
+ mapLayers(layers) {
77
+ const app = this.getPlatformApplication();
78
+ const rawApp = app.getApp();
79
+ layers.forEach((layer) => {
80
+ switch (layer.method) {
81
+ case "statics":
82
+ rawApp.use(layer.path, this.statics(layer.path, layer.opts));
83
+ return;
84
+ }
85
+ rawApp[layer.method](...layer.getArgs());
103
86
  });
104
87
  }
88
+ mapHandler(handler, metadata) {
89
+ switch (metadata.type) {
90
+ case common_1.PlatformHandlerType.RAW_FN:
91
+ case common_1.PlatformHandlerType.RAW_ERR_FN:
92
+ return handler;
93
+ case common_1.PlatformHandlerType.ERR_MIDDLEWARE:
94
+ return async (error, req, res, next) => {
95
+ return (0, common_1.runInContext)(req.$ctx, () => {
96
+ const { $ctx } = req;
97
+ $ctx.next = next;
98
+ $ctx.error = error;
99
+ return handler($ctx);
100
+ });
101
+ };
102
+ default:
103
+ return (req, res, next) => {
104
+ return (0, common_1.runInContext)(req.$ctx, () => {
105
+ req.$ctx.next = next;
106
+ handler(req.$ctx);
107
+ });
108
+ };
109
+ }
110
+ }
105
111
  useContext() {
106
- const { logger, app, injector } = this.platform;
107
- logger.debug("Mount app context");
108
- const invoke = (0, common_1.createContext)(injector);
109
- app.getApp().use(async (request, response, next) => {
110
- await invoke({ request, response });
111
- return next();
112
+ const app = this.getPlatformApplication();
113
+ const invoke = (0, common_1.createContext)(this.injector);
114
+ this.injector.logger.debug("Mount app context");
115
+ app.use(async (request, response, next) => {
116
+ const $ctx = await invoke({ request, response });
117
+ await $ctx.start();
118
+ $ctx.response.getRes().on("finish", () => $ctx.finish());
119
+ return (0, common_1.runInContext)($ctx, next);
112
120
  });
113
121
  return this;
114
122
  }
123
+ app() {
124
+ const app = this.injector.settings.get("express.app") || (0, express_1.default)();
125
+ return {
126
+ app,
127
+ callback: () => app
128
+ };
129
+ }
130
+ multipart(options) {
131
+ const m = this.#multer(options);
132
+ const makePromise = (multer, name) => {
133
+ // istanbul ignore next
134
+ if (!multer[name])
135
+ return;
136
+ const fn = multer[name];
137
+ multer[name] = function apply(...args) {
138
+ const middleware = Reflect.apply(fn, this, args);
139
+ return (req, res) => (0, util_1.promisify)(middleware)(req, res);
140
+ };
141
+ };
142
+ makePromise(m, "any");
143
+ makePromise(m, "array");
144
+ makePromise(m, "fields");
145
+ makePromise(m, "none");
146
+ makePromise(m, "single");
147
+ return m;
148
+ }
149
+ statics(endpoint, options) {
150
+ const { root, ...props } = options;
151
+ return (0, staticsMiddleware_1.staticsMiddleware)(root, props);
152
+ }
153
+ bodyParser(type, additionalOptions = {}) {
154
+ const opts = this.injector.settings.get(`express.bodyParser.${type}`);
155
+ let parser = express_1.default[type];
156
+ let options = {};
157
+ if ((0, core_1.isFunction)(opts)) {
158
+ parser = opts;
159
+ options = {};
160
+ }
161
+ switch (type) {
162
+ case "urlencoded":
163
+ options.extended = true;
164
+ break;
165
+ case "raw":
166
+ options.type = () => true;
167
+ break;
168
+ }
169
+ return parser({ ...options, ...additionalOptions });
170
+ }
171
+ getPlatformApplication() {
172
+ return this.injector.get(common_1.PlatformApplication);
173
+ }
115
174
  async configureViewsEngine() {
116
- const { settings, injector, app } = this.platform;
175
+ const injector = this.injector;
176
+ const app = this.injector.get(common_1.PlatformApplication);
117
177
  try {
118
- const { exists, disabled } = settings.get("views") || {};
178
+ const { exists, disabled } = this.injector.settings.get("views") || {};
119
179
  if (exists && !disabled) {
120
- const { PlatformViews } = await Promise.resolve().then(() => __importStar(require("@tsed/platform-views")));
180
+ const { PlatformViews } = await Promise.resolve().then(() => tslib_1.__importStar(require("@tsed/platform-views")));
121
181
  const platformViews = injector.get(PlatformViews);
122
182
  const express = app.getApp();
123
183
  platformViews.getEngines().forEach(({ extension, engine }) => {
@@ -1 +1 @@
1
- {"version":3,"file":"PlatformExpress.js","sourceRoot":"","sources":["../../../src/components/PlatformExpress.ts"],"names":[],"mappings":"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","sourcesContent":["import Express from \"express\";\nimport type {PlatformViews} from \"@tsed/platform-views\";\nimport {\n createContext,\n PlatformAdapter,\n PlatformApplication,\n PlatformBuilder,\n PlatformExceptions,\n PlatformHandler,\n PlatformRequest,\n PlatformResponse,\n PlatformRouter\n} from \"@tsed/common\";\nimport {Env, Type} from \"@tsed/core\";\nimport {rawBodyMiddleware} from \"../middlewares/rawBodyMiddleware\";\nimport {\n PlatformExpressApplication,\n PlatformExpressHandler,\n PlatformExpressRequest,\n PlatformExpressResponse,\n PlatformExpressRouter\n} from \"../services\";\n\n/**\n * @platform\n * @express\n */\nexport class PlatformExpress implements PlatformAdapter<Express.Application, Express.Router> {\n readonly providers = [\n {\n provide: PlatformApplication,\n useClass: PlatformExpressApplication\n },\n {\n provide: PlatformRouter,\n useClass: PlatformExpressRouter\n },\n {\n provide: PlatformHandler,\n useClass: PlatformExpressHandler\n },\n {\n provide: PlatformResponse,\n useClass: PlatformExpressResponse\n },\n {\n provide: PlatformRequest,\n useClass: PlatformExpressRequest\n }\n ];\n\n constructor(private platform: PlatformBuilder<Express.Application, Express.Router>) {}\n\n /**\n * Create new serverless application. In this mode, the component scan are disabled.\n * @param module\n * @param settings\n */\n static create(module: Type<any>, settings: Partial<TsED.Configuration> = {}) {\n return PlatformBuilder.create<Express.Application, Express.Router>(module, {\n ...settings,\n adapter: PlatformExpress\n });\n }\n\n /**\n * Bootstrap a server application\n * @param module\n * @param settings\n */\n static async bootstrap(module: Type<any>, settings: Partial<TsED.Configuration> = {}) {\n return PlatformBuilder.bootstrap<Express.Application, Express.Router>(module, {\n ...settings,\n adapter: PlatformExpress\n });\n }\n\n useRouter(): this {\n const {logger, app} = this.platform;\n\n logger.debug(\"Mount app router\");\n app.getApp().use(rawBodyMiddleware);\n app.getApp().use(app.getRouter());\n\n return this;\n }\n\n async beforeLoadRoutes() {\n const {injector, app} = this.platform;\n // disable x-powered-by header\n injector.settings.get(\"env\") === Env.PROD && app.getApp().disable(\"x-powered-by\");\n\n await this.configureViewsEngine();\n }\n\n async afterLoadRoutes() {\n const {injector, app} = this.platform;\n // NOT FOUND\n app.use((req: any, res: any, next: any) => {\n !res.headersSent && injector.get<PlatformExceptions>(PlatformExceptions)?.resourceNotFound(req.$ctx);\n });\n\n // EXCEPTION FILTERS\n app.use((err: any, req: any, res: any, next: any) => {\n !res.headersSent && injector.get<PlatformExceptions>(PlatformExceptions)?.catch(err, req.$ctx);\n });\n }\n\n useContext(): this {\n const {logger, app, injector} = this.platform;\n\n logger.debug(\"Mount app context\");\n\n const invoke = createContext(injector);\n\n app.getApp().use(async (request: any, response: any, next: any) => {\n await invoke({request, response});\n\n return next();\n });\n\n return this;\n }\n\n private async configureViewsEngine() {\n const {settings, injector, app} = this.platform;\n try {\n const {exists, disabled} = settings.get(\"views\") || {};\n\n if (exists && !disabled) {\n const {PlatformViews} = await import(\"@tsed/platform-views\");\n const platformViews = injector.get<PlatformViews>(PlatformViews)!;\n const express = app.getApp();\n\n platformViews.getEngines().forEach(({extension, engine}) => {\n express.engine(extension, engine.render);\n });\n\n platformViews.viewEngine && express.set(\"view engine\", platformViews.viewEngine);\n platformViews.root && express.set(\"views\", platformViews.root);\n }\n } catch (error) {\n // istanbul ignore next\n injector.logger.warn({\n event: \"PLATFORM_VIEWS_ERROR\",\n message: \"Unable to configure the PlatformViews service on your environment.\",\n error\n });\n }\n }\n}\n"]}
1
+ {"version":3,"file":"PlatformExpress.js","sourceRoot":"","sources":["../../../src/components/PlatformExpress.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createContext,\n InjectorService,\n PlatformAdapter,\n PlatformApplication,\n PlatformBuilder,\n PlatformContext,\n PlatformExceptions,\n PlatformHandlerType,\n PlatformMulter,\n PlatformMulterSettings,\n PlatformStaticsOptions,\n runInContext\n} from \"@tsed/common\";\nimport {Env, isFunction, nameOf, Type} from \"@tsed/core\";\nimport {PlatformHandlerMetadata, PlatformLayer} from \"@tsed/platform-router\";\nimport type {PlatformViews} from \"@tsed/platform-views\";\nimport {OptionsJson, OptionsText, OptionsUrlencoded} from \"body-parser\";\nimport Express from \"express\";\nimport type multer from \"multer\";\nimport {promisify} from \"util\";\nimport {PlatformExpressStaticsOptions} from \"../interfaces/PlatformExpressStaticsOptions\";\nimport {staticsMiddleware} from \"../middlewares/staticsMiddleware\";\n\ndeclare module \"express\" {\n export interface Request {\n id: string;\n $ctx: PlatformContext;\n }\n}\n\ndeclare global {\n namespace TsED {\n // export interface Router extends Express.Router {}\n\n export interface Application extends Express.Application {}\n\n export interface StaticsOptions extends PlatformExpressStaticsOptions {}\n\n export interface Request extends Express.Request {\n id: string;\n $ctx: PlatformContext;\n }\n }\n}\n\n/**\n * @platform\n * @express\n */\nexport class PlatformExpress implements PlatformAdapter<Express.Application> {\n readonly providers = [];\n #multer: typeof multer;\n\n constructor(protected injector: InjectorService) {\n import(\"multer\").then(({default: multer}) => (this.#multer = multer));\n }\n\n /**\n * Create new serverless application. In this mode, the component scan are disabled.\n * @param module\n * @param settings\n */\n static create(module: Type<any>, settings: Partial<TsED.Configuration> = {}) {\n return PlatformBuilder.create<Express.Application>(module, {\n ...settings,\n adapter: PlatformExpress\n });\n }\n\n /**\n * Bootstrap a server application\n * @param module\n * @param settings\n */\n static async bootstrap(module: Type<any>, settings: Partial<TsED.Configuration> = {}) {\n return PlatformBuilder.bootstrap<Express.Application>(module, {\n ...settings,\n adapter: PlatformExpress\n });\n }\n\n onInit() {\n const middlewares = this.injector.settings.get(\"middlewares\", []);\n\n this.injector.settings.set(\n \"middlewares\",\n middlewares.filter((middleware) => {\n const name = nameOf(middleware);\n if ([\"textParser\", \"jsonParser\", \"rawParser\", \"urlencodedParser\"].includes(name)) {\n this.injector.settings.set(`express.bodyParser.${name.replace(\"Parser\", \"\")}`, () => middleware);\n return false;\n }\n\n return true;\n })\n );\n }\n\n async beforeLoadRoutes() {\n const injector = this.injector;\n const app = this.injector.get<PlatformApplication<Express.Application>>(PlatformApplication)!;\n\n // disable x-powered-by header\n injector.settings.get(\"env\") === Env.PROD && app.getApp().disable(\"x-powered-by\");\n\n await this.configureViewsEngine();\n }\n\n async afterLoadRoutes() {\n const app = this.injector.get<PlatformApplication<Express.Application>>(PlatformApplication)!;\n const platformExceptions = this.injector.get<PlatformExceptions>(PlatformExceptions)!;\n\n // NOT FOUND\n app.use((req: any, res: any, next: any) => {\n const {$ctx} = req;\n !$ctx.isDone() && platformExceptions?.resourceNotFound(req.$ctx);\n });\n\n // EXCEPTION FILTERS\n app.use((err: any, req: any, res: any, next: any) => {\n const {$ctx} = req;\n !$ctx.isDone() && platformExceptions?.catch(err, $ctx);\n });\n }\n\n mapLayers(layers: PlatformLayer[]) {\n const app = this.getPlatformApplication();\n const rawApp: any = app.getApp();\n\n layers.forEach((layer) => {\n switch (layer.method) {\n case \"statics\":\n rawApp.use(layer.path, this.statics(layer.path as string, layer.opts as any));\n return;\n }\n\n rawApp[layer.method](...layer.getArgs());\n });\n }\n\n mapHandler(handler: Function, metadata: PlatformHandlerMetadata) {\n switch (metadata.type) {\n case PlatformHandlerType.RAW_FN:\n case PlatformHandlerType.RAW_ERR_FN:\n return handler;\n case PlatformHandlerType.ERR_MIDDLEWARE:\n return async (error: unknown, req: any, res: any, next: any) => {\n return runInContext(req.$ctx, () => {\n const {$ctx} = req;\n\n $ctx.next = next;\n $ctx.error = error;\n\n return handler($ctx);\n });\n };\n default:\n return (req: any, res: any, next: any) => {\n return runInContext(req.$ctx, () => {\n req.$ctx.next = next;\n handler(req.$ctx);\n });\n };\n }\n }\n\n useContext(): this {\n const app = this.getPlatformApplication();\n const invoke = createContext(this.injector);\n\n this.injector.logger.debug(\"Mount app context\");\n\n app.use(async (request: any, response: any, next: any) => {\n const $ctx = await invoke({request, response});\n await $ctx.start();\n\n $ctx.response.getRes().on(\"finish\", () => $ctx.finish());\n\n return runInContext($ctx, next);\n });\n\n return this;\n }\n\n app() {\n const app = this.injector.settings.get(\"express.app\") || Express();\n\n return {\n app,\n callback: () => app\n };\n }\n\n multipart(options: PlatformMulterSettings): PlatformMulter {\n const m = this.#multer(options);\n\n const makePromise = (multer: any, name: string) => {\n // istanbul ignore next\n if (!multer[name]) return;\n\n const fn = multer[name];\n\n multer[name] = function apply(...args: any[]) {\n const middleware = Reflect.apply(fn, this, args);\n\n return (req: any, res: any) => promisify(middleware)(req, res);\n };\n };\n\n makePromise(m, \"any\");\n makePromise(m, \"array\");\n makePromise(m, \"fields\");\n makePromise(m, \"none\");\n makePromise(m, \"single\");\n\n return m;\n }\n\n statics(endpoint: string, options: PlatformStaticsOptions) {\n const {root, ...props} = options;\n\n return staticsMiddleware(root, props);\n }\n\n bodyParser(type: \"json\" | \"raw\" | \"text\" | \"urlencoded\", additionalOptions: any = {}): any {\n const opts = this.injector.settings.get(`express.bodyParser.${type}`);\n let parser: any = Express[type];\n let options: OptionsJson & OptionsText & OptionsUrlencoded = {};\n\n if (isFunction(opts)) {\n parser = opts;\n options = {};\n }\n\n switch (type) {\n case \"urlencoded\":\n options.extended = true;\n break;\n case \"raw\":\n options.type = () => true;\n break;\n }\n\n return parser({...options, ...additionalOptions});\n }\n\n private getPlatformApplication() {\n return this.injector.get<PlatformApplication<Express.Application>>(PlatformApplication)!;\n }\n\n private async configureViewsEngine() {\n const injector = this.injector;\n const app = this.injector.get<PlatformApplication<Express.Application>>(PlatformApplication)!;\n\n try {\n const {exists, disabled} = this.injector.settings.get(\"views\") || {};\n\n if (exists && !disabled) {\n const {PlatformViews} = await import(\"@tsed/platform-views\");\n const platformViews = injector.get<PlatformViews>(PlatformViews)!;\n const express = app.getApp();\n\n platformViews.getEngines().forEach(({extension, engine}) => {\n express.engine(extension, engine.render);\n });\n\n platformViews.viewEngine && express.set(\"view engine\", platformViews.viewEngine);\n platformViews.root && express.set(\"views\", platformViews.root);\n }\n } catch (error) {\n // istanbul ignore next\n injector.logger.warn({\n event: \"PLATFORM_VIEWS_ERROR\",\n message: \"Unable to configure the PlatformViews service on your environment.\",\n error\n });\n }\n }\n}\n"]}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const common_1 = require("@tsed/common");
4
+ const PlatformExpress_1 = require("./components/PlatformExpress");
5
+ common_1.PlatformTest.adapter = PlatformExpress_1.PlatformExpress;
6
+ common_1.PlatformBuilder.adapter = PlatformExpress_1.PlatformExpress;
7
+ //# sourceMappingURL=exports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exports.js","sourceRoot":"","sources":["../../src/exports.ts"],"names":[],"mappings":";;AAAA,yCAA2D;AAC3D,kEAA6D;AAE7D,qBAAY,CAAC,OAAO,GAAG,iCAAsB,CAAC;AAC9C,wBAAe,CAAC,OAAO,GAAG,iCAAsB,CAAC","sourcesContent":["import {PlatformBuilder, PlatformTest} from \"@tsed/common\";\nimport {PlatformExpress} from \"./components/PlatformExpress\";\n\nPlatformTest.adapter = PlatformExpress as any;\nPlatformBuilder.adapter = PlatformExpress as any;\n"]}
package/lib/cjs/index.js CHANGED
@@ -1,16 +1,13 @@
1
1
  "use strict";
2
+ /**
3
+ * @file Automatically generated by barrelsby.
4
+ */
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  const tslib_1 = require("tslib");
4
- const common_1 = require("@tsed/common");
5
- const PlatformExpress_1 = require("./components/PlatformExpress");
6
- common_1.PlatformTest.adapter = PlatformExpress_1.PlatformExpress;
7
- common_1.PlatformBuilder.adapter = PlatformExpress_1.PlatformExpress;
8
- // interfaces
9
- (0, tslib_1.__exportStar)(require("./interfaces"), exports);
10
- // decorators
11
- (0, tslib_1.__exportStar)(require("./decorators"), exports);
12
- // services
13
- (0, tslib_1.__exportStar)(require("./services"), exports);
14
- // components
15
- (0, tslib_1.__exportStar)(require("./components/PlatformExpress"), exports);
7
+ tslib_1.__exportStar(require("./exports"), exports);
8
+ tslib_1.__exportStar(require("./components/PlatformExpress"), exports);
9
+ tslib_1.__exportStar(require("./interfaces/PlatformExpressSettings"), exports);
10
+ tslib_1.__exportStar(require("./interfaces/PlatformExpressStaticsOptions"), exports);
11
+ tslib_1.__exportStar(require("./interfaces/interfaces"), exports);
12
+ tslib_1.__exportStar(require("./middlewares/staticsMiddleware"), exports);
16
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,yCAA2D;AAE3D,kEAA6D;AAE7D,qBAAY,CAAC,OAAO,GAAG,iCAAsB,CAAC;AAC9C,wBAAe,CAAC,OAAO,GAAG,iCAAsB,CAAC;AAEjD,aAAa;AACb,4DAA6B;AAE7B,aAAa;AACb,4DAA6B;AAE7B,WAAW;AACX,0DAA2B;AAE3B,aAAa;AACb,4EAA6C","sourcesContent":["import {PlatformBuilder, PlatformTest} from \"@tsed/common\";\n\nimport {PlatformExpress} from \"./components/PlatformExpress\";\n\nPlatformTest.adapter = PlatformExpress as any;\nPlatformBuilder.adapter = PlatformExpress as any;\n\n// interfaces\nexport * from \"./interfaces\";\n\n// decorators\nexport * from \"./decorators\";\n\n// services\nexport * from \"./services\";\n\n// components\nexport * from \"./components/PlatformExpress\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,oDAA0B;AAC1B,uEAA6C;AAC7C,+EAAqD;AACrD,qFAA2D;AAC3D,kEAAwC;AACxC,0EAAgD","sourcesContent":["/**\n * @file Automatically generated by barrelsby.\n */\n\nexport * from \"./exports\";\nexport * from \"./components/PlatformExpress\";\nexport * from \"./interfaces/PlatformExpressSettings\";\nexport * from \"./interfaces/PlatformExpressStaticsOptions\";\nexport * from \"./interfaces/interfaces\";\nexport * from \"./middlewares/staticsMiddleware\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"PlatformExpressSettings.js","sourceRoot":"","sources":["../../../src/interfaces/PlatformExpressSettings.ts"],"names":[],"mappings":"","sourcesContent":["import {RouterOptions} from \"express\";\n\nexport interface PlatformExpressSettings {\n /**\n * Global configuration for the Express.Router. See express [documentation](http://expressjs.com/en/api.html#express.router).\n */\n router?: RouterOptions;\n\n app?: Express.Application;\n}\n"]}
1
+ {"version":3,"file":"PlatformExpressSettings.js","sourceRoot":"","sources":["../../../src/interfaces/PlatformExpressSettings.ts"],"names":[],"mappings":"","sourcesContent":["import type {RouterOptions} from \"express\";\nimport type {OptionsJson, OptionsText, Options, OptionsUrlencoded} from \"body-parser\";\nimport type {NextHandleFunction} from \"connect\";\n\nexport interface PlatformExpressSettings {\n /**\n * Global configuration for the Express.Router. See express [documentation](http://expressjs.com/en/api.html#express.router).\n */\n router?: RouterOptions;\n /**\n * Express application\n */\n app?: Express.Application;\n\n /**\n * body parser configuration\n */\n bodyParser?: {\n json?: ((opts?: OptionsJson) => NextHandleFunction) | OptionsJson;\n text?: ((opts?: OptionsText) => NextHandleFunction) | OptionsText;\n raw?: ((opts?: Options) => NextHandleFunction) | Options;\n urlencoded?: ((opts?: OptionsUrlencoded) => NextHandleFunction) | OptionsUrlencoded;\n };\n}\n"]}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../src/interfaces/interfaces.ts"],"names":[],"mappings":"","sourcesContent":["import {NextFunction as ENext, Request as EReq, Response as ERes} from \"express\";\nimport {PlatformExpressSettings} from \"./PlatformExpressSettings\";\n\ndeclare global {\n namespace TsED {\n export interface Configuration {\n /**\n * Configuration related to Express platform application.\n */\n express: PlatformExpressSettings;\n }\n\n export interface NextFunction extends ENext {}\n\n export interface Response extends ERes {}\n export interface Request extends EReq {}\n }\n}\n"]}
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.staticsMiddleware = void 0;
4
4
  const tslib_1 = require("tslib");
5
- const express_1 = (0, tslib_1.__importDefault)(require("express"));
5
+ const express_1 = tslib_1.__importDefault(require("express"));
6
6
  /**
7
7
  * @ignore
8
8
  */
@@ -1 +1 @@
1
- {"version":3,"file":"staticsMiddleware.js","sourceRoot":"","sources":["../../../src/middlewares/staticsMiddleware.ts"],"names":[],"mappings":";;;;AAAA,mEAA8B;AAE9B;;GAEG;AACH,SAAgB,iBAAiB,CAAC,SAAiB,EAAE,UAAe,EAAE;IACpE,MAAM,UAAU,GAAG,iBAAO,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAEtD,OAAO,CAAC,OAAY,EAAE,QAAa,EAAE,IAAS,EAAE,EAAE;QAChD,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;YACzB,UAAU,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;SACrC;aAAM;YACL,IAAI,EAAE,CAAC;SACR;IACH,CAAC,CAAC;AACJ,CAAC;AAVD,8CAUC","sourcesContent":["import Express from \"express\";\n\n/**\n * @ignore\n */\nexport function staticsMiddleware(directory: string, options: any = {}) {\n const middleware = Express.static(directory, options);\n\n return (request: any, response: any, next: any) => {\n if (!response.headersSent) {\n middleware(request, response, next);\n } else {\n next();\n }\n };\n}\n"]}
1
+ {"version":3,"file":"staticsMiddleware.js","sourceRoot":"","sources":["../../../src/middlewares/staticsMiddleware.ts"],"names":[],"mappings":";;;;AAAA,8DAA8B;AAE9B;;GAEG;AACH,SAAgB,iBAAiB,CAAC,SAAiB,EAAE,UAAe,EAAE;IACpE,MAAM,UAAU,GAAG,iBAAO,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAEtD,OAAO,CAAC,OAAY,EAAE,QAAa,EAAE,IAAS,EAAE,EAAE;QAChD,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;YACzB,UAAU,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;SACrC;aAAM;YACL,IAAI,EAAE,CAAC;SACR;IACH,CAAC,CAAC;AACJ,CAAC;AAVD,8CAUC","sourcesContent":["import Express from \"express\";\n\n/**\n * @ignore\n */\nexport function staticsMiddleware(directory: string, options: any = {}) {\n const middleware = Express.static(directory, options);\n\n return (request: any, response: any, next: any) => {\n if (!response.headersSent) {\n middleware(request, response, next);\n } else {\n next();\n }\n };\n}\n"]}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -1,36 +1,19 @@
1
- import { createContext, PlatformApplication, PlatformBuilder, PlatformExceptions, PlatformHandler, PlatformRequest, PlatformResponse, PlatformRouter } from "@tsed/common";
2
- import { Env } from "@tsed/core";
3
- import { rawBodyMiddleware } from "../middlewares/rawBodyMiddleware";
4
- import { PlatformExpressApplication, PlatformExpressHandler, PlatformExpressRequest, PlatformExpressResponse, PlatformExpressRouter } from "../services";
1
+ import { createContext, PlatformApplication, PlatformBuilder, PlatformExceptions, PlatformHandlerType, runInContext } from "@tsed/common";
2
+ import { Env, isFunction, nameOf } from "@tsed/core";
3
+ import Express from "express";
4
+ import { promisify } from "util";
5
+ import { staticsMiddleware } from "../middlewares/staticsMiddleware.js";
5
6
  /**
6
7
  * @platform
7
8
  * @express
8
9
  */
9
10
  export class PlatformExpress {
10
- constructor(platform) {
11
- this.platform = platform;
12
- this.providers = [
13
- {
14
- provide: PlatformApplication,
15
- useClass: PlatformExpressApplication
16
- },
17
- {
18
- provide: PlatformRouter,
19
- useClass: PlatformExpressRouter
20
- },
21
- {
22
- provide: PlatformHandler,
23
- useClass: PlatformExpressHandler
24
- },
25
- {
26
- provide: PlatformResponse,
27
- useClass: PlatformExpressResponse
28
- },
29
- {
30
- provide: PlatformRequest,
31
- useClass: PlatformExpressRequest
32
- }
33
- ];
11
+ injector;
12
+ providers = [];
13
+ #multer;
14
+ constructor(injector) {
15
+ this.injector = injector;
16
+ import("multer").then(({ default: multer }) => (this.#multer = multer));
34
17
  }
35
18
  /**
36
19
  * Create new serverless application. In this mode, the component scan are disabled.
@@ -54,46 +37,141 @@ export class PlatformExpress {
54
37
  adapter: PlatformExpress
55
38
  });
56
39
  }
57
- useRouter() {
58
- const { logger, app } = this.platform;
59
- logger.debug("Mount app router");
60
- app.getApp().use(rawBodyMiddleware);
61
- app.getApp().use(app.getRouter());
62
- return this;
40
+ onInit() {
41
+ const middlewares = this.injector.settings.get("middlewares", []);
42
+ this.injector.settings.set("middlewares", middlewares.filter((middleware) => {
43
+ const name = nameOf(middleware);
44
+ if (["textParser", "jsonParser", "rawParser", "urlencodedParser"].includes(name)) {
45
+ this.injector.settings.set(`express.bodyParser.${name.replace("Parser", "")}`, () => middleware);
46
+ return false;
47
+ }
48
+ return true;
49
+ }));
63
50
  }
64
51
  async beforeLoadRoutes() {
65
- const { injector, app } = this.platform;
52
+ const injector = this.injector;
53
+ const app = this.injector.get(PlatformApplication);
66
54
  // disable x-powered-by header
67
55
  injector.settings.get("env") === Env.PROD && app.getApp().disable("x-powered-by");
68
56
  await this.configureViewsEngine();
69
57
  }
70
58
  async afterLoadRoutes() {
71
- const { injector, app } = this.platform;
59
+ const app = this.injector.get(PlatformApplication);
60
+ const platformExceptions = this.injector.get(PlatformExceptions);
72
61
  // NOT FOUND
73
62
  app.use((req, res, next) => {
74
- var _a;
75
- !res.headersSent && ((_a = injector.get(PlatformExceptions)) === null || _a === void 0 ? void 0 : _a.resourceNotFound(req.$ctx));
63
+ const { $ctx } = req;
64
+ !$ctx.isDone() && platformExceptions?.resourceNotFound(req.$ctx);
76
65
  });
77
66
  // EXCEPTION FILTERS
78
67
  app.use((err, req, res, next) => {
79
- var _a;
80
- !res.headersSent && ((_a = injector.get(PlatformExceptions)) === null || _a === void 0 ? void 0 : _a.catch(err, req.$ctx));
68
+ const { $ctx } = req;
69
+ !$ctx.isDone() && platformExceptions?.catch(err, $ctx);
70
+ });
71
+ }
72
+ mapLayers(layers) {
73
+ const app = this.getPlatformApplication();
74
+ const rawApp = app.getApp();
75
+ layers.forEach((layer) => {
76
+ switch (layer.method) {
77
+ case "statics":
78
+ rawApp.use(layer.path, this.statics(layer.path, layer.opts));
79
+ return;
80
+ }
81
+ rawApp[layer.method](...layer.getArgs());
81
82
  });
82
83
  }
84
+ mapHandler(handler, metadata) {
85
+ switch (metadata.type) {
86
+ case PlatformHandlerType.RAW_FN:
87
+ case PlatformHandlerType.RAW_ERR_FN:
88
+ return handler;
89
+ case PlatformHandlerType.ERR_MIDDLEWARE:
90
+ return async (error, req, res, next) => {
91
+ return runInContext(req.$ctx, () => {
92
+ const { $ctx } = req;
93
+ $ctx.next = next;
94
+ $ctx.error = error;
95
+ return handler($ctx);
96
+ });
97
+ };
98
+ default:
99
+ return (req, res, next) => {
100
+ return runInContext(req.$ctx, () => {
101
+ req.$ctx.next = next;
102
+ handler(req.$ctx);
103
+ });
104
+ };
105
+ }
106
+ }
83
107
  useContext() {
84
- const { logger, app, injector } = this.platform;
85
- logger.debug("Mount app context");
86
- const invoke = createContext(injector);
87
- app.getApp().use(async (request, response, next) => {
88
- await invoke({ request, response });
89
- return next();
108
+ const app = this.getPlatformApplication();
109
+ const invoke = createContext(this.injector);
110
+ this.injector.logger.debug("Mount app context");
111
+ app.use(async (request, response, next) => {
112
+ const $ctx = await invoke({ request, response });
113
+ await $ctx.start();
114
+ $ctx.response.getRes().on("finish", () => $ctx.finish());
115
+ return runInContext($ctx, next);
90
116
  });
91
117
  return this;
92
118
  }
119
+ app() {
120
+ const app = this.injector.settings.get("express.app") || Express();
121
+ return {
122
+ app,
123
+ callback: () => app
124
+ };
125
+ }
126
+ multipart(options) {
127
+ const m = this.#multer(options);
128
+ const makePromise = (multer, name) => {
129
+ // istanbul ignore next
130
+ if (!multer[name])
131
+ return;
132
+ const fn = multer[name];
133
+ multer[name] = function apply(...args) {
134
+ const middleware = Reflect.apply(fn, this, args);
135
+ return (req, res) => promisify(middleware)(req, res);
136
+ };
137
+ };
138
+ makePromise(m, "any");
139
+ makePromise(m, "array");
140
+ makePromise(m, "fields");
141
+ makePromise(m, "none");
142
+ makePromise(m, "single");
143
+ return m;
144
+ }
145
+ statics(endpoint, options) {
146
+ const { root, ...props } = options;
147
+ return staticsMiddleware(root, props);
148
+ }
149
+ bodyParser(type, additionalOptions = {}) {
150
+ const opts = this.injector.settings.get(`express.bodyParser.${type}`);
151
+ let parser = Express[type];
152
+ let options = {};
153
+ if (isFunction(opts)) {
154
+ parser = opts;
155
+ options = {};
156
+ }
157
+ switch (type) {
158
+ case "urlencoded":
159
+ options.extended = true;
160
+ break;
161
+ case "raw":
162
+ options.type = () => true;
163
+ break;
164
+ }
165
+ return parser({ ...options, ...additionalOptions });
166
+ }
167
+ getPlatformApplication() {
168
+ return this.injector.get(PlatformApplication);
169
+ }
93
170
  async configureViewsEngine() {
94
- const { settings, injector, app } = this.platform;
171
+ const injector = this.injector;
172
+ const app = this.injector.get(PlatformApplication);
95
173
  try {
96
- const { exists, disabled } = settings.get("views") || {};
174
+ const { exists, disabled } = this.injector.settings.get("views") || {};
97
175
  if (exists && !disabled) {
98
176
  const { PlatformViews } = await import("@tsed/platform-views");
99
177
  const platformViews = injector.get(PlatformViews);